diff options
author | Scott James Remnant <keybuk@google.com> | 2022-03-22 17:24:44 -0700 |
---|---|---|
committer | CQ Bot Account <pigweed-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2022-03-24 23:20:35 +0000 |
commit | 1425cfb38a13dc1e3a01adfffee2565bc5e9b83a (patch) | |
tree | 7e741c113c6fe38de9895a940ea994ac08ac3727 /pw_protobuf/stream_decoder_test.cc | |
parent | 0bae3eda13ccf79d977ceb1af5bb7e7aadde0181 (diff) | |
download | pigweed-1425cfb38a13dc1e3a01adfffee2565bc5e9b83a.tar.gz |
pw_protobuf: Refactor field parsing
Refactor the field parsing of individual and packed fixed and varint
fields to take the same basic approach, with a consistent internal API.
Internal ReadFixedField, ReadVarintField, ReadPackedFixedField, and
ReadPackedVarintField methods now consistently output into the passed
span of bytes. This provides a better foundation API for future decoding
extensions.
Change-Id: I8306677a8639acca7525dcaf75d786cf2edd3ed8
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/88860
Pigweed-Auto-Submit: Scott James Remnant <keybuk@google.com>
Reviewed-by: Keir Mierle <keir@google.com>
Reviewed-by: Armando Montanez <amontanez@google.com>
Commit-Queue: Auto-Submit <auto-submit@pigweed.google.com.iam.gserviceaccount.com>
Diffstat (limited to 'pw_protobuf/stream_decoder_test.cc')
-rw-r--r-- | pw_protobuf/stream_decoder_test.cc | 90 |
1 files changed, 86 insertions, 4 deletions
diff --git a/pw_protobuf/stream_decoder_test.cc b/pw_protobuf/stream_decoder_test.cc index 302d134b9..db90d3382 100644 --- a/pw_protobuf/stream_decoder_test.cc +++ b/pw_protobuf/stream_decoder_test.cc @@ -61,6 +61,12 @@ TEST(StreamDecoder, Decode) { 0x2d, 0xef, 0xbe, 0xad, 0xde, // type=string, k=6, v="Hello world" 0x32, 0x0b, 'H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', + // type=sfixed32, k=7, v=-50 + 0x3d, 0xce, 0xff, 0xff, 0xff, + // type=sfixed64, k=8, v=-1647993274 + 0x41, 0x46, 0x9e, 0xc5, 0x9d, 0xff, 0xff, 0xff, 0xff, + // type=float, k=9, v=2.718 + 0x4d, 0xb6, 0xf3, 0x2d, 0x40, }; // clang-format on @@ -105,6 +111,24 @@ TEST(StreamDecoder, Decode) { buffer[sws.size()] = '\0'; EXPECT_STREQ(buffer, "Hello world"); + EXPECT_EQ(decoder.Next(), OkStatus()); + ASSERT_EQ(decoder.FieldNumber().value(), 7u); + Result<int32_t> sfixed32 = decoder.ReadSfixed32(); + ASSERT_EQ(sfixed32.status(), OkStatus()); + EXPECT_EQ(sfixed32.value(), -50); + + EXPECT_EQ(decoder.Next(), OkStatus()); + ASSERT_EQ(decoder.FieldNumber().value(), 8u); + Result<int64_t> sfixed64 = decoder.ReadSfixed64(); + ASSERT_EQ(sfixed64.status(), OkStatus()); + EXPECT_EQ(sfixed64.value(), -1647993274); + + EXPECT_EQ(decoder.Next(), OkStatus()); + ASSERT_EQ(decoder.FieldNumber().value(), 9u); + Result<float> flt = decoder.ReadFloat(); + ASSERT_EQ(flt.status(), OkStatus()); + EXPECT_EQ(flt.value(), 2.718f); + EXPECT_EQ(decoder.Next(), Status::OutOfRange()); } @@ -917,7 +941,23 @@ TEST(StreamDecoder, PackedFixed) { 0xc8, 0x00, 0x00, 0x00, // type=fixed64[], v=2, v={0x0102030405060708} 0x12, 0x08, - 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01 + 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, + // type=sfixed32[], k=3, v={0, -50, 100, -150, 200} + 0x1a, 0x14, + 0x00, 0x00, 0x00, 0x00, + 0xce, 0xff, 0xff, 0xff, + 0x64, 0x00, 0x00, 0x00, + 0x6a, 0xff, 0xff, 0xff, + 0xc8, 0x00, 0x00, 0x00, + // type=sfixed64[], v=4, v={-1647993274} + 0x22, 0x08, + 0x46, 0x9e, 0xc5, 0x9d, 0xff, 0xff, 0xff, 0xff, + // type=double[], k=5, v=3.14159 + 0x2a, 0x08, + 0x6e, 0x86, 0x1b, 0xf0, 0xf9, 0x21, 0x09, 0x40, + // type=float[], k=6, v=2.718 + 0x32, 0x04, + 0xb6, 0xf3, 0x2d, 0x40, }; // clang-format on @@ -945,12 +985,54 @@ TEST(StreamDecoder, PackedFixed) { EXPECT_EQ(size.size(), 1u); EXPECT_EQ(fixed64[0], 0x0102030405060708u); + + EXPECT_EQ(decoder.Next(), OkStatus()); + ASSERT_EQ(decoder.FieldNumber().value(), 3u); + std::array<int32_t, 8> sfixed32{}; + size = decoder.ReadPackedSfixed32(sfixed32); + ASSERT_EQ(size.status(), OkStatus()); + EXPECT_EQ(size.size(), 5u); + + EXPECT_EQ(sfixed32[0], 0); + EXPECT_EQ(sfixed32[1], -50); + EXPECT_EQ(sfixed32[2], 100); + EXPECT_EQ(sfixed32[3], -150); + EXPECT_EQ(sfixed32[4], 200); + + EXPECT_EQ(decoder.Next(), OkStatus()); + ASSERT_EQ(decoder.FieldNumber().value(), 4u); + std::array<int64_t, 8> sfixed64{}; + size = decoder.ReadPackedSfixed64(sfixed64); + ASSERT_EQ(size.status(), OkStatus()); + EXPECT_EQ(size.size(), 1u); + + EXPECT_EQ(sfixed64[0], -1647993274); + + EXPECT_EQ(decoder.Next(), OkStatus()); + ASSERT_EQ(decoder.FieldNumber().value(), 5u); + std::array<double, 8> dbl{}; + size = decoder.ReadPackedDouble(dbl); + ASSERT_EQ(size.status(), OkStatus()); + EXPECT_EQ(size.size(), 1u); + + EXPECT_EQ(dbl[0], 3.14159); + + EXPECT_EQ(decoder.Next(), OkStatus()); + ASSERT_EQ(decoder.FieldNumber().value(), 6u); + std::array<float, 8> flt{}; + size = decoder.ReadPackedFloat(flt); + ASSERT_EQ(size.status(), OkStatus()); + EXPECT_EQ(size.size(), 1u); + + EXPECT_EQ(flt[0], 2.718f); + + EXPECT_EQ(decoder.Next(), Status::OutOfRange()); } TEST(StreamDecoder, PackedFixedInsufficientSpace) { // clang-format off constexpr uint8_t encoded_proto[] = { - // type=sfixed32[], k=1, v={0, 50, 100, 150, 200} + // type=fixed32[], k=1, v={0, 50, 100, 150, 200} 0x0a, 0x14, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, @@ -965,8 +1047,8 @@ TEST(StreamDecoder, PackedFixedInsufficientSpace) { EXPECT_EQ(decoder.Next(), OkStatus()); ASSERT_EQ(decoder.FieldNumber().value(), 1u); - std::array<uint32_t, 2> sfixed32{}; - StatusWithSize size = decoder.ReadPackedFixed32(sfixed32); + std::array<uint32_t, 2> fixed32{}; + StatusWithSize size = decoder.ReadPackedFixed32(fixed32); ASSERT_EQ(size.status(), Status::ResourceExhausted()); } |