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