35 #include <google/protobuf/test_util.h>
36 #include <google/protobuf/unittest.pb.h>
37 #include <google/protobuf/unittest_proto3_arena.pb.h>
38 #include <google/protobuf/unittest_proto3_optional.pb.h>
39 #include <google/protobuf/arena.h>
40 #include <google/protobuf/text_format.h>
41 #include <google/protobuf/testing/googletest.h>
42 #include <gtest/gtest.h>
43 #include <google/protobuf/stubs/strutil.h>
46 #include <google/protobuf/port_def.inc>
48 using proto3_arena_unittest::ForeignMessage;
49 using proto3_arena_unittest::TestAllTypes;
60 return msg.GetOwningArena();
70 m->set_optional_int32(100);
71 m->set_optional_string(
"asdf");
72 m->set_optional_bytes(
"jkl;");
73 m->mutable_optional_nested_message()->set_bb(42);
74 m->mutable_optional_foreign_message()->set_c(43);
75 m->set_optional_nested_enum(proto3_arena_unittest::TestAllTypes::BAZ);
76 m->set_optional_foreign_enum(proto3_arena_unittest::FOREIGN_BAZ);
77 m->mutable_optional_lazy_message()->set_bb(45);
78 m->add_repeated_int32(100);
79 m->add_repeated_string(
"asdf");
80 m->add_repeated_bytes(
"jkl;");
81 m->add_repeated_nested_message()->set_bb(46);
82 m->add_repeated_foreign_message()->set_c(47);
83 m->add_repeated_nested_enum(proto3_arena_unittest::TestAllTypes::BAZ);
84 m->add_repeated_foreign_enum(proto3_arena_unittest::FOREIGN_BAZ);
85 m->add_repeated_lazy_message()->set_bb(49);
87 m->set_oneof_uint32(1);
88 m->mutable_oneof_nested_message()->set_bb(50);
89 m->set_oneof_string(
"test");
96 EXPECT_EQ(
true,
m.has_optional_nested_message());
97 EXPECT_EQ(42,
m.optional_nested_message().bb());
98 EXPECT_EQ(
true,
m.has_optional_foreign_message());
99 EXPECT_EQ(43,
m.optional_foreign_message().c());
100 EXPECT_EQ(proto3_arena_unittest::TestAllTypes::BAZ,
m.optional_nested_enum());
101 EXPECT_EQ(proto3_arena_unittest::FOREIGN_BAZ,
m.optional_foreign_enum());
102 EXPECT_EQ(
true,
m.has_optional_lazy_message());
103 EXPECT_EQ(45,
m.optional_lazy_message().bb());
111 EXPECT_EQ(1,
m.repeated_nested_message_size());
112 EXPECT_EQ(46,
m.repeated_nested_message(0).bb());
113 EXPECT_EQ(1,
m.repeated_foreign_message_size());
114 EXPECT_EQ(47,
m.repeated_foreign_message(0).c());
116 EXPECT_EQ(proto3_arena_unittest::TestAllTypes::BAZ,
117 m.repeated_nested_enum(0));
119 EXPECT_EQ(proto3_arena_unittest::FOREIGN_BAZ,
m.repeated_foreign_enum(0));
121 EXPECT_EQ(49,
m.repeated_lazy_message(0).bb());
123 EXPECT_EQ(proto3_arena_unittest::TestAllTypes::kOneofString,
124 m.oneof_field_case());
132 TEST(Proto3ArenaTest, Parsing) {
133 TestAllTypes original;
137 TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&
arena);
138 arena_message->ParseFromString(original.SerializeAsString());
143 TestAllTypes original;
147 TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&
arena);
148 arena_message->ParseFromString(original.SerializeAsString());
154 arena_message->GetReflection()->MutableUnknownFields(arena_message);
156 unknown_fields->AddVarint(1, 2);
158 ASSERT_NE(original.ByteSizeLong(), arena_message->ByteSizeLong());
160 arena_message->GetReflection()->GetUnknownFields(*arena_message).empty());
167 auto* arena_message1 = Arena::CreateMessage<TestAllTypes>(&
arena);
168 auto* arena_submessage1 = arena_message1->mutable_optional_foreign_message();
169 auto* arena_repeated_submessage1 =
170 arena_message1->add_repeated_foreign_message();
176 auto* arena_message2 = Arena::CreateMessage<TestAllTypes>(&
arena);
177 arena_message2->set_allocated_optional_foreign_message(
new ForeignMessage());
178 arena_message2->mutable_repeated_foreign_message()->AddAllocated(
179 new ForeignMessage());
180 const auto& submessage2 = arena_message2->optional_foreign_message();
181 const auto& repeated_submessage2 =
182 arena_message2->repeated_foreign_message(0);
183 EXPECT_EQ(
nullptr, submessage2.GetArena());
184 EXPECT_EQ(
nullptr, repeated_submessage2.GetArena());
187 auto* arena_message3 = Arena::Create<TestAllTypes>(&
arena);
188 EXPECT_EQ(
nullptr, arena_message3->GetArena());
191 TEST(Proto3ArenaTest, GetArenaWithUnknown) {
195 auto* arena_message1 = Arena::CreateMessage<TestAllTypes>(&
arena);
196 arena_message1->GetReflection()->MutableUnknownFields(arena_message1);
197 auto* arena_submessage1 = arena_message1->mutable_optional_foreign_message();
198 arena_submessage1->GetReflection()->MutableUnknownFields(arena_submessage1);
199 auto* arena_repeated_submessage1 =
200 arena_message1->add_repeated_foreign_message();
201 arena_repeated_submessage1->GetReflection()->MutableUnknownFields(
202 arena_repeated_submessage1);
208 auto* arena_message2 = Arena::CreateMessage<TestAllTypes>(&
arena);
209 arena_message2->set_allocated_optional_foreign_message(
new ForeignMessage());
210 arena_message2->mutable_repeated_foreign_message()->AddAllocated(
211 new ForeignMessage());
212 auto* submessage2 = arena_message2->mutable_optional_foreign_message();
213 submessage2->GetReflection()->MutableUnknownFields(submessage2);
214 auto* repeated_submessage2 =
215 arena_message2->mutable_repeated_foreign_message(0);
216 repeated_submessage2->GetReflection()->MutableUnknownFields(
217 repeated_submessage2);
218 EXPECT_EQ(
nullptr, submessage2->GetArena());
219 EXPECT_EQ(
nullptr, repeated_submessage2->GetArena());
227 TestAllTypes* arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
228 TestAllTypes* arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
229 arena1_message->Swap(arena2_message);
230 EXPECT_EQ(&arena1, arena1_message->GetArena());
231 EXPECT_EQ(&arena2, arena2_message->GetArena());
234 TEST(Proto3ArenaTest, SetAllocatedMessage) {
236 TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&
arena);
237 TestAllTypes::NestedMessage*
nested =
new TestAllTypes::NestedMessage;
239 arena_message->set_allocated_optional_nested_message(
nested);
240 EXPECT_EQ(118, arena_message->optional_nested_message().bb());
243 TEST(Proto3ArenaTest, ReleaseMessage) {
245 TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&
arena);
246 arena_message->mutable_optional_nested_message()->set_bb(118);
247 std::unique_ptr<TestAllTypes::NestedMessage>
nested(
248 arena_message->release_optional_nested_message());
252 TEST(Proto3ArenaTest, MessageFieldClear) {
255 TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&
arena);
256 arena_message->mutable_optional_nested_message()->set_bb(118);
259 arena_message->Clear();
262 TEST(Proto3ArenaTest, MessageFieldClearViaReflection) {
264 TestAllTypes*
message = Arena::CreateMessage<TestAllTypes>(&
arena);
265 const Reflection*
r =
message->GetReflection();
268 d->FindFieldByName(
"optional_nested_message");
270 message->mutable_optional_nested_message()->set_bb(1);
276 TEST(Proto3OptionalTest, OptionalFields) {
277 protobuf_unittest::TestProto3Optional
msg;
279 msg.set_optional_int32(0);
283 msg.SerializeToString(&serialized);
286 msg.clear_optional_int32();
288 msg.SerializeToString(&serialized);
292 TEST(Proto3OptionalTest, OptionalFieldDescriptor) {
295 for (
int i = 0;
i <
d->field_count();
i++) {
312 "protobuf_unittest.Proto3OptionalExtensions.ext_no_optional");
314 "protobuf_unittest.Proto3OptionalExtensions.ext_with_optional");
318 EXPECT_TRUE(with_optional->has_optional_keyword());
322 protobuf_unittest::Proto3OptionalExtensions::ext_no_optional));
324 protobuf_unittest::Proto3OptionalExtensions::ext_with_optional));
326 protobuf_unittest::Proto3OptionalExtensions::ext_no_optional));
328 d->options().GetExtension(
329 protobuf_unittest::Proto3OptionalExtensions::ext_with_optional));
333 protobuf_unittest::Proto3OptionalExtensions::ext_no_optional));
335 protobuf_unittest::Proto3OptionalExtensions::ext_with_optional));
338 TEST(Proto3OptionalTest, OptionalField) {
339 protobuf_unittest::TestProto3Optional
msg;
341 msg.set_optional_int32(0);
345 msg.SerializeToString(&serialized);
348 msg.clear_optional_int32();
350 msg.SerializeToString(&serialized);
354 TEST(Proto3OptionalTest, OptionalFieldReflection) {
359 protobuf_unittest::TestProto3Optional
msg;
372 r->SetInt32(&
msg, f, 123);
379 std::vector<const FieldDescriptor*>
fields;
384 r->ClearOneof(&
msg, o);
389 msg.set_optional_int32(123);
395 r->ClearOneof(&
msg, o);
402 TEST(Proto3OptionalTest, ClearNonOptionalMessageField) {
403 protobuf_unittest::TestProto3OptionalMessage
msg;
404 msg.mutable_nested_message();
408 r->ClearField(&
msg, f);
411 TEST(Proto3OptionalTest, ClearOptionalMessageField) {
412 protobuf_unittest::TestProto3OptionalMessage
msg;
413 msg.mutable_optional_nested_message();
417 d->FindFieldByName(
"optional_nested_message");
418 r->ClearField(&
msg, f);
421 TEST(Proto3OptionalTest, SwapNonOptionalMessageField) {
422 protobuf_unittest::TestProto3OptionalMessage msg1;
423 protobuf_unittest::TestProto3OptionalMessage msg2;
424 msg1.mutable_nested_message();
428 r->SwapFields(&msg1, &msg2, {
f});
431 TEST(Proto3OptionalTest, SwapOptionalMessageField) {
432 protobuf_unittest::TestProto3OptionalMessage msg1;
433 protobuf_unittest::TestProto3OptionalMessage msg2;
434 msg1.mutable_optional_nested_message();
438 d->FindFieldByName(
"optional_nested_message");
439 r->SwapFields(&msg1, &msg2, {
f});
442 void SetAllFieldsZero(protobuf_unittest::TestProto3Optional*
msg) {
443 msg->set_optional_int32(0);
444 msg->set_optional_int64(0);
445 msg->set_optional_uint32(0);
446 msg->set_optional_uint64(0);
447 msg->set_optional_sint32(0);
448 msg->set_optional_sint64(0);
449 msg->set_optional_fixed32(0);
450 msg->set_optional_fixed64(0);
451 msg->set_optional_sfixed32(0);
452 msg->set_optional_sfixed64(0);
453 msg->set_optional_float(0);
454 msg->set_optional_double(0);
455 msg->set_optional_bool(
false);
456 msg->set_optional_string(
"");
457 msg->set_optional_bytes(
"");
458 msg->mutable_optional_nested_message();
459 msg->mutable_lazy_nested_message();
460 msg->set_optional_nested_enum(
461 protobuf_unittest::TestProto3Optional::UNSPECIFIED);
464 void SetAllFieldsNonZero(protobuf_unittest::TestProto3Optional*
msg) {
465 msg->set_optional_int32(101);
466 msg->set_optional_int64(102);
467 msg->set_optional_uint32(103);
468 msg->set_optional_uint64(104);
469 msg->set_optional_sint32(105);
470 msg->set_optional_sint64(106);
471 msg->set_optional_fixed32(107);
472 msg->set_optional_fixed64(108);
473 msg->set_optional_sfixed32(109);
474 msg->set_optional_sfixed64(110);
475 msg->set_optional_float(111);
476 msg->set_optional_double(112);
477 msg->set_optional_bool(
true);
478 msg->set_optional_string(
"abc");
479 msg->set_optional_bytes(
"def");
480 msg->mutable_optional_nested_message();
481 msg->mutable_lazy_nested_message();
482 msg->set_optional_nested_enum(protobuf_unittest::TestProto3Optional::BAZ);
485 void TestAllFieldsZero(
const protobuf_unittest::TestProto3Optional&
msg) {
501 EXPECT_EQ(protobuf_unittest::TestProto3Optional::UNSPECIFIED,
502 msg.optional_nested_enum());
504 const Reflection*
r =
msg.GetReflection();
506 EXPECT_EQ(
"",
r->GetString(
msg,
d->FindFieldByName(
"optional_string")));
509 void TestAllFieldsNonZero(
const protobuf_unittest::TestProto3Optional&
msg) {
525 EXPECT_EQ(protobuf_unittest::TestProto3Optional::BAZ,
526 msg.optional_nested_enum());
529 void TestAllFieldsSet(
const protobuf_unittest::TestProto3Optional&
msg,
551 TEST(Proto3OptionalTest, BinaryRoundTrip) {
552 protobuf_unittest::TestProto3Optional
msg;
553 TestAllFieldsSet(
msg,
false);
554 SetAllFieldsZero(&
msg);
555 TestAllFieldsZero(
msg);
556 TestAllFieldsSet(
msg,
true);
558 protobuf_unittest::TestProto3Optional msg2;
560 msg.SerializeToString(&serialized);
562 TestAllFieldsZero(msg2);
563 TestAllFieldsSet(msg2,
true);
566 TEST(Proto3OptionalTest, TextFormatRoundTripZeros) {
567 protobuf_unittest::TestProto3Optional
msg;
568 SetAllFieldsZero(&
msg);
570 protobuf_unittest::TestProto3Optional msg2;
574 TestAllFieldsSet(msg2,
true);
575 TestAllFieldsZero(msg2);
578 TEST(Proto3OptionalTest, TextFormatRoundTripNonZeros) {
579 protobuf_unittest::TestProto3Optional
msg;
580 SetAllFieldsNonZero(&
msg);
582 protobuf_unittest::TestProto3Optional msg2;
586 TestAllFieldsSet(msg2,
true);
587 TestAllFieldsNonZero(msg2);
590 TEST(Proto3OptionalTest, SwapRoundTripZero) {
591 protobuf_unittest::TestProto3Optional
msg;
592 SetAllFieldsZero(&
msg);
593 TestAllFieldsSet(
msg,
true);
595 protobuf_unittest::TestProto3Optional msg2;
597 TestAllFieldsSet(msg2,
true);
598 TestAllFieldsZero(msg2);
601 TEST(Proto3OptionalTest, SwapRoundTripNonZero) {
602 protobuf_unittest::TestProto3Optional
msg;
603 SetAllFieldsNonZero(&
msg);
604 TestAllFieldsSet(
msg,
true);
606 protobuf_unittest::TestProto3Optional msg2;
608 TestAllFieldsSet(msg2,
true);
609 TestAllFieldsNonZero(msg2);
612 TEST(Proto3OptionalTest, ReflectiveSwapRoundTrip) {
613 protobuf_unittest::TestProto3Optional
msg;
614 SetAllFieldsZero(&
msg);
615 TestAllFieldsSet(
msg,
true);
617 protobuf_unittest::TestProto3Optional msg2;
618 msg2.GetReflection()->Swap(&
msg, &msg2);
619 TestAllFieldsSet(msg2,
true);
620 TestAllFieldsZero(msg2);
623 TEST(Proto3OptionalTest, PlainFields) {
626 EXPECT_FALSE(
d->FindFieldByName(
"optional_int32")->has_presence());
627 EXPECT_TRUE(
d->FindFieldByName(
"oneof_nested_message")->has_presence());