Chromium Code Reviews| 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 |