Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(113)

Side by Side Diff: components/tracing/test/proto_zero_generation_unittest.cc

Issue 2240043004: Tracing V2: Fully-functional plugin. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix use after free in tests Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698