diff options
author | Joe Onorato <joeo@google.com> | 2019-05-19 17:35:08 -0700 |
---|---|---|
committer | Joe Onorato <joeo@google.com> | 2019-05-21 13:29:23 -0700 |
commit | dcd64522f4386d3e791c6242cff4c274ecc17326 (patch) | |
tree | 38dfdf28846c9f47a5c30c5f3f8174985d6270c6 /libs/protoutil | |
parent | b6c55dfa54e611fdbc59c5fdc23c0bcf460b5d50 (diff) |
Add ProtoOutputStream.serializeToVector
Bug: 132890298
Test: bit libprotoutil_test:*
Change-Id: I44bbeea9c487e0142bcd5f18562f5a092e8b6306
Diffstat (limited to 'libs/protoutil')
-rw-r--r-- | libs/protoutil/include/android/util/ProtoOutputStream.h | 2 | ||||
-rw-r--r-- | libs/protoutil/src/ProtoOutputStream.cpp | 18 | ||||
-rw-r--r-- | libs/protoutil/tests/ProtoOutputStream_test.cpp | 47 |
3 files changed, 66 insertions, 1 deletions
diff --git a/libs/protoutil/include/android/util/ProtoOutputStream.h b/libs/protoutil/include/android/util/ProtoOutputStream.h index 60d03180c09d..a6af4757a140 100644 --- a/libs/protoutil/include/android/util/ProtoOutputStream.h +++ b/libs/protoutil/include/android/util/ProtoOutputStream.h @@ -19,6 +19,7 @@ #include <cstdint> #include <string> +#include <vector> #include <android/util/EncodedBuffer.h> @@ -124,6 +125,7 @@ public: sp<ProtoReader> data(); // Get the reader apis of the data. bool flush(int fd); // Flush data directly to a file descriptor. bool serializeToString(std::string* out); // Serializes the proto to a string. + bool serializeToVector(std::vector<uint8_t>* out); // Serializes the proto to a vector<uint8_t>. /** * Clears the ProtoOutputStream so the buffer can be reused instead of deallocation/allocation again. diff --git a/libs/protoutil/src/ProtoOutputStream.cpp b/libs/protoutil/src/ProtoOutputStream.cpp index 98a68c6482b5..6cfa357b580b 100644 --- a/libs/protoutil/src/ProtoOutputStream.cpp +++ b/libs/protoutil/src/ProtoOutputStream.cpp @@ -454,7 +454,6 @@ ProtoOutputStream::serializeToString(std::string* out) if (out == nullptr) return false; if (!compact()) return false; - sp<ProtoReader> reader = mBuffer->read(); out->reserve(reader->size()); while (reader->hasNext()) { @@ -465,6 +464,23 @@ ProtoOutputStream::serializeToString(std::string* out) return true; } +bool +ProtoOutputStream::serializeToVector(std::vector<uint8_t>* out) +{ + if (out == nullptr) return false; + if (!compact()) return false; + + sp<ProtoReader> reader = mBuffer->read(); + out->reserve(reader->size()); + while (reader->hasNext()) { + const uint8_t* buf = reader->readBuffer(); + size_t size = reader->currentToRead(); + out->insert(out->end(), buf, buf + size); + reader->move(size); + } + return true; +} + sp<ProtoReader> ProtoOutputStream::data() { diff --git a/libs/protoutil/tests/ProtoOutputStream_test.cpp b/libs/protoutil/tests/ProtoOutputStream_test.cpp index 6282fd553eae..9b768b73d22b 100644 --- a/libs/protoutil/tests/ProtoOutputStream_test.cpp +++ b/libs/protoutil/tests/ProtoOutputStream_test.cpp @@ -132,6 +132,53 @@ TEST(ProtoOutputStreamTest, SerializeToStringPrimitives) { EXPECT_EQ(primitives.val_enum(), PrimitiveProto_Count_TWO); } +TEST(ProtoOutputStreamTest, SerializeToVectorPrimitives) { + std::string s = "hello"; + const char b[5] = { 'a', 'p', 'p', 'l', 'e' }; + + ProtoOutputStream proto; + EXPECT_TRUE(proto.write(FIELD_TYPE_INT32 | PrimitiveProto::kValInt32FieldNumber, 123)); + EXPECT_TRUE(proto.write(FIELD_TYPE_INT64 | PrimitiveProto::kValInt64FieldNumber, -1LL)); + EXPECT_TRUE(proto.write(FIELD_TYPE_FLOAT | PrimitiveProto::kValFloatFieldNumber, -23.5f)); + EXPECT_TRUE(proto.write(FIELD_TYPE_DOUBLE | PrimitiveProto::kValDoubleFieldNumber, 324.5)); + EXPECT_TRUE(proto.write(FIELD_TYPE_UINT32 | PrimitiveProto::kValUint32FieldNumber, 3424)); + EXPECT_TRUE(proto.write(FIELD_TYPE_UINT64 | PrimitiveProto::kValUint64FieldNumber, 57LL)); + EXPECT_TRUE(proto.write(FIELD_TYPE_FIXED32 | PrimitiveProto::kValFixed32FieldNumber, -20)); + EXPECT_TRUE(proto.write(FIELD_TYPE_FIXED64 | PrimitiveProto::kValFixed64FieldNumber, -37LL)); + EXPECT_TRUE(proto.write(FIELD_TYPE_BOOL | PrimitiveProto::kValBoolFieldNumber, true)); + EXPECT_TRUE(proto.write(FIELD_TYPE_STRING | PrimitiveProto::kValStringFieldNumber, s)); + EXPECT_TRUE(proto.write(FIELD_TYPE_BYTES | PrimitiveProto::kValBytesFieldNumber, b, 5)); + EXPECT_TRUE(proto.write(FIELD_TYPE_SFIXED32 | PrimitiveProto::kValSfixed32FieldNumber, 63)); + EXPECT_TRUE(proto.write(FIELD_TYPE_SFIXED64 | PrimitiveProto::kValSfixed64FieldNumber, -54)); + EXPECT_TRUE(proto.write(FIELD_TYPE_SINT32 | PrimitiveProto::kValSint32FieldNumber, -533)); + EXPECT_TRUE(proto.write(FIELD_TYPE_SINT64 | PrimitiveProto::kValSint64FieldNumber, -61224762453LL)); + EXPECT_TRUE(proto.write(FIELD_TYPE_ENUM | PrimitiveProto::kValEnumFieldNumber, 2)); + + PrimitiveProto primitives; + std::vector<uint8_t> vec; + ASSERT_TRUE(proto.serializeToVector(&vec)); + + std::string serialized(vec.data(), vec.data() + vec.size()); + ASSERT_TRUE(primitives.ParseFromString(serialized)); + + EXPECT_EQ(primitives.val_int32(), 123); + EXPECT_EQ(primitives.val_int64(), -1); + EXPECT_EQ(primitives.val_float(), -23.5f); + EXPECT_EQ(primitives.val_double(), 324.5f); + EXPECT_EQ(primitives.val_uint32(), 3424); + EXPECT_EQ(primitives.val_uint64(), 57); + EXPECT_EQ(primitives.val_fixed32(), -20); + EXPECT_EQ(primitives.val_fixed64(), -37); + EXPECT_EQ(primitives.val_bool(), true); + EXPECT_THAT(primitives.val_string(), StrEq(s.c_str())); + EXPECT_THAT(primitives.val_bytes(), StrEq("apple")); + EXPECT_EQ(primitives.val_sfixed32(), 63); + EXPECT_EQ(primitives.val_sfixed64(), -54); + EXPECT_EQ(primitives.val_sint32(), -533); + EXPECT_EQ(primitives.val_sint64(), -61224762453LL); + EXPECT_EQ(primitives.val_enum(), PrimitiveProto_Count_TWO); +} + TEST(ProtoOutputStreamTest, Complex) { std::string name1 = "cat"; std::string name2 = "dog"; |