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; |
Primiano Tucci (use gerrit)
2016/08/25 10:31:51
probably a bit more readable if you wrap this into
| |
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 void CreateMessage(T** message_ptr) { | |
Primiano Tucci (use gerrit)
2016/08/25 10:31:51
This signature is a bit odd. Why don't you return
| |
47 *message_ptr = new T(); | |
48 root_messages_.push_back(std::unique_ptr<T>(*message_ptr)); | |
49 (*message_ptr)->Reset(stream_writer_.get()); | |
50 } | |
51 | |
52 size_t GetNumSerializedBytes() { | |
53 return buffer_->chunks().size() * kChunkSize - | |
54 stream_writer_->bytes_available(); | |
55 } | |
56 | |
57 void GetSerializedBytes(size_t start, size_t length, uint8_t* buffer) { | |
58 return buffer_->GetBytes(start, length, buffer); | |
59 } | |
60 | |
61 private: | |
62 std::unique_ptr<FakeScatteredBuffer> buffer_; | |
63 std::unique_ptr<ScatteredStreamWriter> stream_writer_; | |
64 std::vector<std::unique_ptr<ProtoZeroMessage>> root_messages_; | |
65 }; | |
66 | |
67 TEST_F(ProtoZeroConformanceTest, SimpleFieldsNoNesting) { | |
68 EveryField* msg; | |
69 CreateMessage(&msg); | |
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(SmallEnum::TO_BE); | |
85 msg->set_signed_enum(SignedEnum::NEGATIVE); | |
86 msg->set_big_enum(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; | |
Primiano Tucci (use gerrit)
2016/08/25 10:31:51
maybe s/gold/gold_msg/ to make it clear this is an
| |
101 gold.ParseFromArray(msg_binary.get(), msg_size); | |
102 EXPECT_EQ(-1, gold.field_int32()); | |
103 EXPECT_EQ(-333123456789ll, gold.field_int64()); | |
104 EXPECT_EQ(600u, gold.field_uint32()); | |
105 EXPECT_EQ(333123456789ull, gold.field_uint64()); | |
106 EXPECT_EQ(-5, gold.field_sint32()); | |
107 EXPECT_EQ(-9000, gold.field_sint64()); | |
108 EXPECT_EQ(12345u, gold.field_fixed32()); | |
109 EXPECT_EQ(444123450000ull, gold.field_fixed64()); | |
110 EXPECT_EQ(-69999, gold.field_sfixed32()); | |
111 EXPECT_EQ(-200, gold.field_sfixed64()); | |
112 EXPECT_EQ(3.14f, gold.field_float()); | |
113 EXPECT_EQ(0.5555, gold.field_double()); | |
114 EXPECT_EQ(true, gold.field_bool()); | |
115 EXPECT_EQ(pbgold::SmallEnum::TO_BE, gold.small_enum()); | |
116 EXPECT_EQ(pbgold::SignedEnum::NEGATIVE, gold.signed_enum()); | |
117 EXPECT_EQ(pbgold::BigEnum::BEGIN, gold.big_enum()); | |
118 EXPECT_EQ("FizzBuzz", gold.field_string()); | |
119 EXPECT_EQ(std::string("\x11\x00\xBE\xEF", 4), gold.field_bytes()); | |
120 EXPECT_EQ(4, gold.repeated_int32_size()); | |
121 EXPECT_EQ(1, gold.repeated_int32(0)); | |
122 EXPECT_EQ(-1, gold.repeated_int32(1)); | |
123 EXPECT_EQ(100, gold.repeated_int32(2)); | |
124 EXPECT_EQ(2000000, gold.repeated_int32(3)); | |
125 } | |
126 | |
127 TEST_F(ProtoZeroConformanceTest, NestedMessages) { | |
128 NestedA* msg_a; | |
129 CreateMessage(&msg_a); | |
130 | |
131 NestedA::NestedB* msg_b = msg_a->add_repeated_a(); | |
132 NestedA::NestedB::NestedC* msg_c = msg_b->set_value_b(); | |
133 msg_c->set_value_c(321); | |
134 msg_b = msg_a->add_repeated_a(); | |
135 msg_c = msg_a->set_super_nested(); | |
136 msg_c->set_value_c(1000); | |
137 msg_a->Finalize(); | |
138 | |
139 size_t msg_size = GetNumSerializedBytes(); | |
140 EXPECT_EQ(26u, msg_size); | |
141 | |
142 std::unique_ptr<uint8_t[]> msg_binary(new uint8_t[msg_size]); | |
143 GetSerializedBytes(0, msg_size, msg_binary.get()); | |
144 | |
145 pbgold::NestedA gold_a; | |
146 gold_a.ParseFromArray(msg_binary.get(), msg_size); | |
147 EXPECT_EQ(2, gold_a.repeated_a_size()); | |
148 EXPECT_EQ(321, gold_a.repeated_a(0).value_b().value_c()); | |
149 EXPECT_FALSE(gold_a.repeated_a(1).has_value_b()); | |
150 EXPECT_EQ(1000, gold_a.super_nested().value_c()); | |
151 } | |
13 | 152 |
14 TEST(ProtoZeroTest, Simple) { | 153 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 -> | 154 // Test the includes for indirect public import: library.pbzero.h -> |
18 // library_internals/galaxies.pbzero.h -> upper_import.pbzero.h . | 155 // library_internals/galaxies.pbzero.h -> upper_import.pbzero.h . |
19 EXPECT_LE(0u, sizeof(foo::bar::TrickyPublicImport)); | 156 EXPECT_LE(0u, sizeof(TrickyPublicImport)); |
20 } | 157 } |
21 | 158 |
22 TEST(ProtoZeroTest, FieldNumbers) { | 159 TEST(ProtoZeroTest, FieldNumbers) { |
23 // Tests camel case conversion as well. | 160 // Tests camel case conversion as well. |
24 EXPECT_EQ(1, CamelCaseFields::kFooBarBazFieldNumber); | 161 EXPECT_EQ(1, CamelCaseFields::kFooBarBazFieldNumber); |
25 EXPECT_EQ(2, CamelCaseFields::kBarBazFieldNumber); | 162 EXPECT_EQ(2, CamelCaseFields::kBarBazFieldNumber); |
26 EXPECT_EQ(3, CamelCaseFields::kMooMooFieldNumber); | 163 EXPECT_EQ(3, CamelCaseFields::kMooMooFieldNumber); |
27 EXPECT_EQ(4, CamelCaseFields::kURLEncoderFieldNumber); | 164 EXPECT_EQ(4, CamelCaseFields::kURLEncoderFieldNumber); |
28 EXPECT_EQ(5, CamelCaseFields::kXMapFieldNumber); | 165 EXPECT_EQ(5, CamelCaseFields::kXMapFieldNumber); |
29 EXPECT_EQ(6, CamelCaseFields::kUrLENcoDerFieldNumber); | 166 EXPECT_EQ(6, CamelCaseFields::kUrLENcoDerFieldNumber); |
30 EXPECT_EQ(7, CamelCaseFields::kBigBangFieldNumber); | 167 EXPECT_EQ(7, CamelCaseFields::kBigBangFieldNumber); |
31 EXPECT_EQ(8, CamelCaseFields::kU2FieldNumber); | 168 EXPECT_EQ(8, CamelCaseFields::kU2FieldNumber); |
32 EXPECT_EQ(9, CamelCaseFields::kBangBigFieldNumber); | 169 EXPECT_EQ(9, CamelCaseFields::kBangBigFieldNumber); |
33 } | 170 } |
34 | 171 |
35 } // namespace proto | 172 } // namespace proto |
36 } // namespace tracing | 173 } // namespace tracing |
OLD | NEW |