OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
| 5 #include <limits> |
| 6 #include <memory> |
| 7 #include <vector> |
| 8 |
| 9 #include "components/tracing/core/proto_zero_message_handle.h" |
5 #include "components/tracing/test/example_proto/library.pbzero.h" | 10 #include "components/tracing/test/example_proto/library.pbzero.h" |
| 11 #include "components/tracing/test/example_proto/test_messages.pb.h" |
6 #include "components/tracing/test/example_proto/test_messages.pbzero.h" | 12 #include "components/tracing/test/example_proto/test_messages.pbzero.h" |
| 13 #include "components/tracing/test/fake_scattered_buffer.h" |
7 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
8 | 15 |
9 namespace tracing { | 16 namespace tracing { |
10 namespace proto { | 17 namespace proto { |
11 | 18 |
12 using foo::bar::CamelCaseFields; | 19 namespace pbtest = pbzero::foo::bar; |
| 20 namespace pbgold = foo::bar; // Official C++ protobuf compiler. |
| 21 |
| 22 using tracing::v2::FakeScatteredBuffer; |
| 23 using tracing::v2::ProtoZeroMessage; |
| 24 using tracing::v2::ScatteredStreamWriter; |
| 25 using tracing::v2::ProtoZeroMessageHandle; |
| 26 using tracing::v2::ProtoZeroMessageHandleBase; |
| 27 |
| 28 constexpr size_t kChunkSize = 42; |
| 29 |
| 30 class ProtoZeroConformanceTest : public ::testing::Test { |
| 31 public: |
| 32 void SetUp() override { |
| 33 buffer_.reset(new FakeScatteredBuffer(kChunkSize)); |
| 34 stream_writer_.reset(new ScatteredStreamWriter(buffer_.get())); |
| 35 } |
| 36 |
| 37 void TearDown() override { |
| 38 root_messages_.clear(); |
| 39 stream_writer_.reset(); |
| 40 buffer_.reset(); |
| 41 google::protobuf::ShutdownProtobufLibrary(); |
| 42 } |
| 43 |
| 44 protected: |
| 45 template <class T> |
| 46 T* CreateMessage() { |
| 47 T* message = new T(); |
| 48 root_messages_.push_back(std::unique_ptr<T>(message)); |
| 49 message->Reset(stream_writer_.get()); |
| 50 return message; |
| 51 } |
| 52 |
| 53 size_t GetNumSerializedBytes() { |
| 54 return buffer_->chunks().size() * kChunkSize - |
| 55 stream_writer_->bytes_available(); |
| 56 } |
| 57 |
| 58 void GetSerializedBytes(size_t start, size_t length, uint8_t* buffer) { |
| 59 return buffer_->GetBytes(start, length, buffer); |
| 60 } |
| 61 |
| 62 private: |
| 63 std::unique_ptr<FakeScatteredBuffer> buffer_; |
| 64 std::unique_ptr<ScatteredStreamWriter> stream_writer_; |
| 65 std::vector<std::unique_ptr<ProtoZeroMessage>> root_messages_; |
| 66 }; |
| 67 |
| 68 TEST_F(ProtoZeroConformanceTest, SimpleFieldsNoNesting) { |
| 69 auto msg = CreateMessage<pbtest::EveryField>(); |
| 70 |
| 71 msg->set_field_int32(-1); |
| 72 msg->set_field_int64(-333123456789ll); |
| 73 msg->set_field_uint32(600); |
| 74 msg->set_field_uint64(333123456789ll); |
| 75 msg->set_field_sint32(-5); |
| 76 msg->set_field_sint64(-9000); |
| 77 msg->set_field_fixed32(12345); |
| 78 msg->set_field_fixed64(444123450000ll); |
| 79 msg->set_field_sfixed32(-69999); |
| 80 msg->set_field_sfixed64(-200); |
| 81 msg->set_field_float(3.14f); |
| 82 msg->set_field_double(0.5555); |
| 83 msg->set_field_bool(true); |
| 84 msg->set_small_enum(pbtest::SmallEnum::TO_BE); |
| 85 msg->set_signed_enum(pbtest::SignedEnum::NEGATIVE); |
| 86 msg->set_big_enum(pbtest::BigEnum::BEGIN); |
| 87 msg->set_field_string("FizzBuzz"); |
| 88 msg->set_field_bytes(reinterpret_cast<const uint8_t*>("\x11\x00\xBE\xEF"), 4); |
| 89 msg->add_repeated_int32(1); |
| 90 msg->add_repeated_int32(-1); |
| 91 msg->add_repeated_int32(100); |
| 92 msg->add_repeated_int32(2000000); |
| 93 |
| 94 size_t msg_size = GetNumSerializedBytes(); |
| 95 EXPECT_EQ(126u, msg_size); |
| 96 |
| 97 std::unique_ptr<uint8_t[]> msg_binary(new uint8_t[msg_size]); |
| 98 GetSerializedBytes(0, msg_size, msg_binary.get()); |
| 99 |
| 100 pbgold::EveryField gold_msg; |
| 101 gold_msg.ParseFromArray(msg_binary.get(), msg_size); |
| 102 EXPECT_EQ(-1, gold_msg.field_int32()); |
| 103 EXPECT_EQ(-333123456789ll, gold_msg.field_int64()); |
| 104 EXPECT_EQ(600u, gold_msg.field_uint32()); |
| 105 EXPECT_EQ(333123456789ull, gold_msg.field_uint64()); |
| 106 EXPECT_EQ(-5, gold_msg.field_sint32()); |
| 107 EXPECT_EQ(-9000, gold_msg.field_sint64()); |
| 108 EXPECT_EQ(12345u, gold_msg.field_fixed32()); |
| 109 EXPECT_EQ(444123450000ull, gold_msg.field_fixed64()); |
| 110 EXPECT_EQ(-69999, gold_msg.field_sfixed32()); |
| 111 EXPECT_EQ(-200, gold_msg.field_sfixed64()); |
| 112 EXPECT_EQ(3.14f, gold_msg.field_float()); |
| 113 EXPECT_EQ(0.5555, gold_msg.field_double()); |
| 114 EXPECT_EQ(true, gold_msg.field_bool()); |
| 115 EXPECT_EQ(pbgold::SmallEnum::TO_BE, gold_msg.small_enum()); |
| 116 EXPECT_EQ(pbgold::SignedEnum::NEGATIVE, gold_msg.signed_enum()); |
| 117 EXPECT_EQ(pbgold::BigEnum::BEGIN, gold_msg.big_enum()); |
| 118 EXPECT_EQ("FizzBuzz", gold_msg.field_string()); |
| 119 EXPECT_EQ(std::string("\x11\x00\xBE\xEF", 4), gold_msg.field_bytes()); |
| 120 EXPECT_EQ(4, gold_msg.repeated_int32_size()); |
| 121 EXPECT_EQ(1, gold_msg.repeated_int32(0)); |
| 122 EXPECT_EQ(-1, gold_msg.repeated_int32(1)); |
| 123 EXPECT_EQ(100, gold_msg.repeated_int32(2)); |
| 124 EXPECT_EQ(2000000, gold_msg.repeated_int32(3)); |
| 125 } |
| 126 |
| 127 TEST_F(ProtoZeroConformanceTest, NestedMessages) { |
| 128 auto msg_a = CreateMessage<pbtest::NestedA>(); |
| 129 |
| 130 pbtest::NestedA::NestedB* msg_b = msg_a->add_repeated_a(); |
| 131 pbtest::NestedA::NestedB::NestedC* msg_c = msg_b->set_value_b(); |
| 132 msg_c->set_value_c(321); |
| 133 msg_b = msg_a->add_repeated_a(); |
| 134 msg_c = msg_a->set_super_nested(); |
| 135 msg_c->set_value_c(1000); |
| 136 msg_a->Finalize(); |
| 137 |
| 138 size_t msg_size = GetNumSerializedBytes(); |
| 139 EXPECT_EQ(26u, msg_size); |
| 140 |
| 141 std::unique_ptr<uint8_t[]> msg_binary(new uint8_t[msg_size]); |
| 142 GetSerializedBytes(0, msg_size, msg_binary.get()); |
| 143 |
| 144 pbgold::NestedA gold_msg_a; |
| 145 gold_msg_a.ParseFromArray(msg_binary.get(), msg_size); |
| 146 EXPECT_EQ(2, gold_msg_a.repeated_a_size()); |
| 147 EXPECT_EQ(321, gold_msg_a.repeated_a(0).value_b().value_c()); |
| 148 EXPECT_FALSE(gold_msg_a.repeated_a(1).has_value_b()); |
| 149 EXPECT_EQ(1000, gold_msg_a.super_nested().value_c()); |
| 150 } |
13 | 151 |
14 TEST(ProtoZeroTest, Simple) { | 152 TEST(ProtoZeroTest, Simple) { |
15 // TODO(kraynov) Put tests in the next CL (crbug.com/608721). | |
16 | |
17 // Test the includes for indirect public import: library.pbzero.h -> | 153 // Test the includes for indirect public import: library.pbzero.h -> |
18 // library_internals/galaxies.pbzero.h -> upper_import.pbzero.h . | 154 // library_internals/galaxies.pbzero.h -> upper_import.pbzero.h . |
19 EXPECT_LE(0u, sizeof(foo::bar::TrickyPublicImport)); | 155 EXPECT_LE(0u, sizeof(pbtest::TrickyPublicImport)); |
20 } | 156 } |
21 | 157 |
22 TEST(ProtoZeroTest, FieldNumbers) { | 158 TEST(ProtoZeroTest, FieldNumbers) { |
23 // Tests camel case conversion as well. | 159 // Tests camel case conversion as well. |
24 EXPECT_EQ(1, CamelCaseFields::kFooBarBazFieldNumber); | 160 EXPECT_EQ(1, pbtest::CamelCaseFields::kFooBarBazFieldNumber); |
25 EXPECT_EQ(2, CamelCaseFields::kBarBazFieldNumber); | 161 EXPECT_EQ(2, pbtest::CamelCaseFields::kBarBazFieldNumber); |
26 EXPECT_EQ(3, CamelCaseFields::kMooMooFieldNumber); | 162 EXPECT_EQ(3, pbtest::CamelCaseFields::kMooMooFieldNumber); |
27 EXPECT_EQ(4, CamelCaseFields::kURLEncoderFieldNumber); | 163 EXPECT_EQ(4, pbtest::CamelCaseFields::kURLEncoderFieldNumber); |
28 EXPECT_EQ(5, CamelCaseFields::kXMapFieldNumber); | 164 EXPECT_EQ(5, pbtest::CamelCaseFields::kXMapFieldNumber); |
29 EXPECT_EQ(6, CamelCaseFields::kUrLENcoDerFieldNumber); | 165 EXPECT_EQ(6, pbtest::CamelCaseFields::kUrLENcoDerFieldNumber); |
30 EXPECT_EQ(7, CamelCaseFields::kBigBangFieldNumber); | 166 EXPECT_EQ(7, pbtest::CamelCaseFields::kBigBangFieldNumber); |
31 EXPECT_EQ(8, CamelCaseFields::kU2FieldNumber); | 167 EXPECT_EQ(8, pbtest::CamelCaseFields::kU2FieldNumber); |
32 EXPECT_EQ(9, CamelCaseFields::kBangBigFieldNumber); | 168 EXPECT_EQ(9, pbtest::CamelCaseFields::kBangBigFieldNumber); |
33 } | 169 } |
34 | 170 |
35 } // namespace proto | 171 } // namespace proto |
36 } // namespace tracing | 172 } // namespace tracing |
OLD | NEW |