1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

Protobuf: Extract protobuf encoder.

This commit is contained in:
winlin 2022-08-26 18:46:26 +08:00
parent a54d371549
commit 8bc7342c3c
6 changed files with 611 additions and 221 deletions

View file

@ -17,6 +17,8 @@ using namespace std;
#include <srs_protocol_amf0.hpp>
#include <srs_protocol_rtmp_stack.hpp>
#include <srs_protocol_http_conn.hpp>
#include <srs_protocol_protobuf.hpp>
#include <srs_kernel_buffer.hpp>
MockEmptyIO::MockEmptyIO()
{
@ -6455,3 +6457,251 @@ VOID TEST(ProtocolKbpsTest, WriteLargeIOVs)
}
}
VOID TEST(ProtocolProtobufTest, VarintsSize)
{
EXPECT_EQ(1, SrsProtobufVarints::sizeof_varint( 0x00));
EXPECT_EQ(1, SrsProtobufVarints::sizeof_varint( 0x70));
EXPECT_EQ(1, SrsProtobufVarints::sizeof_varint( 0x7f));
EXPECT_EQ(2, SrsProtobufVarints::sizeof_varint( 0x80));
EXPECT_EQ(2, SrsProtobufVarints::sizeof_varint( 0x3ff0));
EXPECT_EQ(2, SrsProtobufVarints::sizeof_varint( 0x3fff));
EXPECT_EQ(3, SrsProtobufVarints::sizeof_varint( 0x4000));
EXPECT_EQ(3, SrsProtobufVarints::sizeof_varint( 0x1ffff0));
EXPECT_EQ(3, SrsProtobufVarints::sizeof_varint( 0x1fffff));
EXPECT_EQ(4, SrsProtobufVarints::sizeof_varint( 0x200000));
EXPECT_EQ(4, SrsProtobufVarints::sizeof_varint( 0x0ffffff0));
EXPECT_EQ(4, SrsProtobufVarints::sizeof_varint( 0x0fffffff));
EXPECT_EQ(5, SrsProtobufVarints::sizeof_varint( 0x10000000));
EXPECT_EQ(5, SrsProtobufVarints::sizeof_varint( 0x7fffffff0));
EXPECT_EQ(5, SrsProtobufVarints::sizeof_varint( 0x7ffffffff));
EXPECT_EQ(6, SrsProtobufVarints::sizeof_varint( 0x800000000));
EXPECT_EQ(6, SrsProtobufVarints::sizeof_varint( 0x3fffffffff0));
EXPECT_EQ(6, SrsProtobufVarints::sizeof_varint( 0x3ffffffffff));
EXPECT_EQ(7, SrsProtobufVarints::sizeof_varint( 0x40000000000));
EXPECT_EQ(7, SrsProtobufVarints::sizeof_varint( 0x1fffffffffff0));
EXPECT_EQ(7, SrsProtobufVarints::sizeof_varint( 0x1ffffffffffff));
EXPECT_EQ(8, SrsProtobufVarints::sizeof_varint( 0x2000000000000));
EXPECT_EQ(8, SrsProtobufVarints::sizeof_varint( 0x0fffffffffffff0));
EXPECT_EQ(8, SrsProtobufVarints::sizeof_varint( 0x0ffffffffffffff));
EXPECT_EQ(9, SrsProtobufVarints::sizeof_varint( 0x100000000000000));
EXPECT_EQ(9, SrsProtobufVarints::sizeof_varint( 0x7ffffffffffffff0));
EXPECT_EQ(9, SrsProtobufVarints::sizeof_varint( 0x7fffffffffffffff));
EXPECT_EQ(10, SrsProtobufVarints::sizeof_varint(0x8000000000000000));
EXPECT_EQ(10, SrsProtobufVarints::sizeof_varint(0xfffffffffffffff0));
EXPECT_EQ(10, SrsProtobufVarints::sizeof_varint(0xffffffffffffffff));
}
VOID TEST(ProtocolProtobufTest, VarintsEncode)
{
srs_error_t err = srs_success;
static char buf[128];
if (true) {
SrsBuffer b(buf, 1); uint8_t expect[] = {0x00};
HELPER_ASSERT_SUCCESS(SrsProtobufVarints::encode(&b, 0x0)); EXPECT_TRUE(srs_bytes_equals(buf, (char*)expect, sizeof(expect)));
}
if (true) {
SrsBuffer b(buf, 1); uint8_t expect[] = {0x70};
HELPER_ASSERT_SUCCESS(SrsProtobufVarints::encode(&b, 0x70)); EXPECT_TRUE(srs_bytes_equals(buf, (char*)expect, sizeof(expect)));
}
if (true) {
SrsBuffer b(buf, 1); uint8_t expect[] = {0x7f};
HELPER_ASSERT_SUCCESS(SrsProtobufVarints::encode(&b, 0x7f)); EXPECT_TRUE(srs_bytes_equals(buf, (char*)expect, sizeof(expect)));
}
if (true) {
SrsBuffer b(buf, 2); uint8_t expect[] = {0x80, 0x01};
HELPER_ASSERT_SUCCESS(SrsProtobufVarints::encode(&b, 0x80)); EXPECT_TRUE(srs_bytes_equals(buf, (char*)expect, sizeof(expect)));
}
if (true) {
SrsBuffer b(buf, 2); uint8_t expect[] = {0xf0, 0x7f};
HELPER_ASSERT_SUCCESS(SrsProtobufVarints::encode(&b, 0x3ff0)); EXPECT_TRUE(srs_bytes_equals(buf, (char*)expect, sizeof(expect)));
}
if (true) {
SrsBuffer b(buf, 2); uint8_t expect[] = {0xff, 0x7f};
HELPER_ASSERT_SUCCESS(SrsProtobufVarints::encode(&b, 0x3fff)); EXPECT_TRUE(srs_bytes_equals(buf, (char*)expect, sizeof(expect)));
}
if (true) {
SrsBuffer b(buf, 3); uint8_t expect[] = {0x80, 0x80, 0x01};
HELPER_ASSERT_SUCCESS(SrsProtobufVarints::encode(&b, 0x4000)); EXPECT_TRUE(srs_bytes_equals(buf, (char*)expect, sizeof(expect)));
}
if (true) {
SrsBuffer b(buf, 3); uint8_t expect[] = {0xf0, 0xff, 0x7f};
HELPER_ASSERT_SUCCESS(SrsProtobufVarints::encode(&b, 0x1ffff0)); EXPECT_TRUE(srs_bytes_equals(buf, (char*)expect, sizeof(expect)));
}
if (true) {
SrsBuffer b(buf, 3); uint8_t expect[] = {0xff, 0xff, 0x7f};
HELPER_ASSERT_SUCCESS(SrsProtobufVarints::encode(&b, 0x1fffff)); EXPECT_TRUE(srs_bytes_equals(buf, (char*)expect, sizeof(expect)));
}
if (true) {
SrsBuffer b(buf, 4); uint8_t expect[] = {0x80, 0x80, 0x80, 0x01};
HELPER_ASSERT_SUCCESS(SrsProtobufVarints::encode(&b, 0x200000)); EXPECT_TRUE(srs_bytes_equals(buf, (char*)expect, sizeof(expect)));
}
if (true) {
SrsBuffer b(buf, 4); uint8_t expect[] = {0xf0, 0xff, 0xff, 0x7f};
HELPER_ASSERT_SUCCESS(SrsProtobufVarints::encode(&b, 0xffffff0)); EXPECT_TRUE(srs_bytes_equals(buf, (char*)expect, sizeof(expect)));
}
if (true) {
SrsBuffer b(buf, 4); uint8_t expect[] = {0xff, 0xff, 0xff, 0x7f};
HELPER_ASSERT_SUCCESS(SrsProtobufVarints::encode(&b, 0xfffffff)); EXPECT_TRUE(srs_bytes_equals(buf, (char*)expect, sizeof(expect)));
}
if (true) {
SrsBuffer b(buf, 5); uint8_t expect[] = {0x80, 0x80, 0x80, 0x80, 0x01};
HELPER_ASSERT_SUCCESS(SrsProtobufVarints::encode(&b, 0x10000000)); EXPECT_TRUE(srs_bytes_equals(buf, (char*)expect, sizeof(expect)));
}
if (true) {
SrsBuffer b(buf, 5); uint8_t expect[] = {0xf0, 0xff, 0xff, 0xff, 0x7f};
HELPER_ASSERT_SUCCESS(SrsProtobufVarints::encode(&b, 0x7fffffff0)); EXPECT_TRUE(srs_bytes_equals(buf, (char*)expect, sizeof(expect)));
}
if (true) {
SrsBuffer b(buf, 5); uint8_t expect[] = {0xff, 0xff, 0xff, 0xff, 0x7f};
HELPER_ASSERT_SUCCESS(SrsProtobufVarints::encode(&b, 0x7ffffffff)); EXPECT_TRUE(srs_bytes_equals(buf, (char*)expect, sizeof(expect)));
}
if (true) {
SrsBuffer b(buf, 6); uint8_t expect[] = {0x80, 0x80, 0x80, 0x80, 0x80, 0x01};
HELPER_ASSERT_SUCCESS(SrsProtobufVarints::encode(&b, 0x800000000)); EXPECT_TRUE(srs_bytes_equals(buf, (char*)expect, sizeof(expect)));
}
if (true) {
SrsBuffer b(buf, 6); uint8_t expect[] = {0xf0, 0xff, 0xff, 0xff, 0xff, 0x7f};
HELPER_ASSERT_SUCCESS(SrsProtobufVarints::encode(&b, 0x3fffffffff0)); EXPECT_TRUE(srs_bytes_equals(buf, (char*)expect, sizeof(expect)));
}
if (true) {
SrsBuffer b(buf, 6); uint8_t expect[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0x7f};
HELPER_ASSERT_SUCCESS(SrsProtobufVarints::encode(&b, 0x3ffffffffff)); EXPECT_TRUE(srs_bytes_equals(buf, (char*)expect, sizeof(expect)));
}
if (true) {
SrsBuffer b(buf, 7); uint8_t expect[] = {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01};
HELPER_ASSERT_SUCCESS(SrsProtobufVarints::encode(&b, 0x40000000000)); EXPECT_TRUE(srs_bytes_equals(buf, (char*)expect, sizeof(expect)));
}
if (true) {
SrsBuffer b(buf, 7); uint8_t expect[] = {0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f};
HELPER_ASSERT_SUCCESS(SrsProtobufVarints::encode(&b, 0x1fffffffffff0)); EXPECT_TRUE(srs_bytes_equals(buf, (char*)expect, sizeof(expect)));
}
if (true) {
SrsBuffer b(buf, 7); uint8_t expect[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f};
HELPER_ASSERT_SUCCESS(SrsProtobufVarints::encode(&b, 0x1ffffffffffff)); EXPECT_TRUE(srs_bytes_equals(buf, (char*)expect, sizeof(expect)));
}
if (true) {
SrsBuffer b(buf, 8); uint8_t expect[] = {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01};
HELPER_ASSERT_SUCCESS(SrsProtobufVarints::encode(&b, 0x2000000000000)); EXPECT_TRUE(srs_bytes_equals(buf, (char*)expect, sizeof(expect)));
}
if (true) {
SrsBuffer b(buf, 8); uint8_t expect[] = {0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f};
HELPER_ASSERT_SUCCESS(SrsProtobufVarints::encode(&b, 0xfffffffffffff0)); EXPECT_TRUE(srs_bytes_equals(buf, (char*)expect, sizeof(expect)));
}
if (true) {
SrsBuffer b(buf, 8); uint8_t expect[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f};
HELPER_ASSERT_SUCCESS(SrsProtobufVarints::encode(&b, 0xffffffffffffff)); EXPECT_TRUE(srs_bytes_equals(buf, (char*)expect, sizeof(expect)));
}
if (true) {
SrsBuffer b(buf, 9); uint8_t expect[] = {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01};
HELPER_ASSERT_SUCCESS(SrsProtobufVarints::encode(&b, 0x100000000000000)); EXPECT_TRUE(srs_bytes_equals(buf, (char*)expect, sizeof(expect)));
}
if (true) {
SrsBuffer b(buf, 9); uint8_t expect[] = {0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f};
HELPER_ASSERT_SUCCESS(SrsProtobufVarints::encode(&b, 0x7ffffffffffffff0)); EXPECT_TRUE(srs_bytes_equals(buf, (char*)expect, sizeof(expect)));
}
if (true) {
SrsBuffer b(buf, 9); uint8_t expect[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f};
HELPER_ASSERT_SUCCESS(SrsProtobufVarints::encode(&b, 0x7fffffffffffffff)); EXPECT_TRUE(srs_bytes_equals(buf, (char*)expect, sizeof(expect)));
}
if (true) {
SrsBuffer b(buf, 10); uint8_t expect[] = {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01};
HELPER_ASSERT_SUCCESS(SrsProtobufVarints::encode(&b, 0x8000000000000000)); EXPECT_TRUE(srs_bytes_equals(buf, (char*)expect, sizeof(expect)));
}
if (true) {
SrsBuffer b(buf, 10); uint8_t expect[] = {0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01};
HELPER_ASSERT_SUCCESS(SrsProtobufVarints::encode(&b, 0xfffffffffffffff0)); EXPECT_TRUE(srs_bytes_equals(buf, (char*)expect, sizeof(expect)));
}
if (true) {
SrsBuffer b(buf, 10); uint8_t expect[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01};
HELPER_ASSERT_SUCCESS(SrsProtobufVarints::encode(&b, 0xffffffffffffffff)); EXPECT_TRUE(srs_bytes_equals(buf, (char*)expect, sizeof(expect)));
}
}
VOID TEST(ProtocolProtobufTest, String)
{
srs_error_t err = srs_success;
static char buf[128];
if (true) {
EXPECT_EQ(1 + 10, SrsProtobufString::sizeof_string("HelloWorld"));
SrsBuffer b(buf, 1 + 10);
HELPER_ASSERT_SUCCESS(SrsProtobufString::encode(&b, "HelloWorld"));
uint8_t expect[] = {0x0a, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x57, 0x6f, 0x72, 0x6c, 0x64};
EXPECT_TRUE(srs_bytes_equals(buf, (char *) expect, sizeof(expect)));
}
if (true) {
EXPECT_EQ(1, SrsProtobufString::sizeof_string(""));
SrsBuffer b(buf, 1);
HELPER_ASSERT_SUCCESS(SrsProtobufString::encode(&b, ""));
uint8_t expect[] = {0x00};
EXPECT_TRUE(srs_bytes_equals(buf, (char *) expect, sizeof(expect)));
}
}
class MockProtobufObject : public ISrsEncoder
{
public:
uint64_t nb_bytes() {
return 1;
}
srs_error_t encode(SrsBuffer* b) {
b->write_1bytes(0x0f);
return srs_success;
}
};
VOID TEST(ProtocolProtobufTest, FieldKey)
{
srs_error_t err = srs_success;
static char buf[128];
EXPECT_EQ(2, SrsProtobufFieldString);
EXPECT_EQ(2, SrsProtobufFieldBytes);
EXPECT_EQ(2, SrsProtobufFieldObject);
EXPECT_EQ(2, SrsProtobufFieldLengthDelimited);
EXPECT_EQ(1, SrsProtobufKey::sizeof_key());
MockProtobufObject obj;
EXPECT_EQ(2, SrsProtobufObject::sizeof_object(&obj));
if (true) {
SrsBuffer b(buf, 2);
HELPER_ASSERT_SUCCESS(SrsProtobufObject::encode(&b, &obj));
EXPECT_EQ(0x01, buf[0]); EXPECT_EQ(0x0f, buf[1]);
}
// Encode the field key as [ID=1, TYPE=2(Length delimited)]
if (true) {
SrsBuffer b(buf, 1);
HELPER_ASSERT_SUCCESS(SrsProtobufKey::encode(&b, 1, SrsProtobufFieldLengthDelimited));
EXPECT_EQ(0x0a, buf[0]);
}
// Encode the field value as [ID=2, TYPE=2(Length delimited)]
if (true) {
SrsBuffer b(buf, 1);
HELPER_ASSERT_SUCCESS(SrsProtobufKey::encode(&b, 2, SrsProtobufFieldLengthDelimited));
EXPECT_EQ(0x12, buf[0]);
}
// Encode the field time as [ID=1, TYPE=0(Varint)]
if (true) {
SrsBuffer b(buf, 1);
HELPER_ASSERT_SUCCESS(SrsProtobufKey::encode(&b, 1, SrsProtobufFieldVarint));
EXPECT_EQ(0x08, buf[0]);
}
// Encode the field source as [ID=4, TYPE=2(Length delimited)]
if (true) {
SrsBuffer b(buf, 1);
HELPER_ASSERT_SUCCESS(SrsProtobufKey::encode(&b, 4, SrsProtobufFieldLengthDelimited));
EXPECT_EQ(0x22, buf[0]);
}
}