| Index: third_party/protobuf/src/google/protobuf/generated_message_reflection_unittest.cc
|
| diff --git a/third_party/protobuf/src/google/protobuf/generated_message_reflection_unittest.cc b/third_party/protobuf/src/google/protobuf/generated_message_reflection_unittest.cc
|
| index 39aa55fb4a598d9e351d670be81d7902f995e08a..85ebdef1fc926aa08db91817c90f0981fd614ccc 100644
|
| --- a/third_party/protobuf/src/google/protobuf/generated_message_reflection_unittest.cc
|
| +++ b/third_party/protobuf/src/google/protobuf/generated_message_reflection_unittest.cc
|
| @@ -1,6 +1,6 @@
|
| // Protocol Buffers - Google's data interchange format
|
| // Copyright 2008 Google Inc. All rights reserved.
|
| -// http://code.google.com/p/protobuf/
|
| +// https://developers.google.com/protocol-buffers/
|
| //
|
| // Redistribution and use in source and binary forms, with or without
|
| // modification, are permitted provided that the following conditions are
|
| @@ -43,10 +43,16 @@
|
| // rather than generated accessors.
|
|
|
| #include <google/protobuf/generated_message_reflection.h>
|
| +#include <memory>
|
| +#ifndef _SHARED_PTR_H
|
| +#include <google/protobuf/stubs/shared_ptr.h>
|
| +#endif
|
| +
|
| #include <google/protobuf/descriptor.h>
|
| #include <google/protobuf/test_util.h>
|
| #include <google/protobuf/unittest.pb.h>
|
|
|
| +#include <google/protobuf/stubs/logging.h>
|
| #include <google/protobuf/stubs/common.h>
|
| #include <google/protobuf/testing/googletest.h>
|
| #include <gtest/gtest.h>
|
| @@ -207,6 +213,111 @@ TEST(GeneratedMessageReflectionTest, SwapUnknown) {
|
| EXPECT_EQ(1, message2.unknown_fields().field_count());
|
| }
|
|
|
| +TEST(GeneratedMessageReflectionTest, SwapFields) {
|
| + unittest::TestAllTypes message1, message2;
|
| + message1.set_optional_double(12.3);
|
| + message1.mutable_repeated_int32()->Add(10);
|
| + message1.mutable_repeated_int32()->Add(20);
|
| +
|
| + message2.set_optional_string("hello");
|
| + message2.mutable_repeated_int64()->Add(30);
|
| +
|
| + vector<const FieldDescriptor*> fields;
|
| + const Descriptor* descriptor = message1.GetDescriptor();
|
| + fields.push_back(descriptor->FindFieldByName("optional_double"));
|
| + fields.push_back(descriptor->FindFieldByName("repeated_int32"));
|
| + fields.push_back(descriptor->FindFieldByName("optional_string"));
|
| + fields.push_back(descriptor->FindFieldByName("optional_uint64"));
|
| +
|
| + const Reflection* reflection = message1.GetReflection();
|
| + reflection->SwapFields(&message1, &message2, fields);
|
| +
|
| + EXPECT_FALSE(message1.has_optional_double());
|
| + EXPECT_EQ(0, message1.repeated_int32_size());
|
| + EXPECT_TRUE(message1.has_optional_string());
|
| + EXPECT_EQ("hello", message1.optional_string());
|
| + EXPECT_EQ(0, message1.repeated_int64_size());
|
| + EXPECT_FALSE(message1.has_optional_uint64());
|
| +
|
| + EXPECT_TRUE(message2.has_optional_double());
|
| + EXPECT_EQ(12.3, message2.optional_double());
|
| + EXPECT_EQ(2, message2.repeated_int32_size());
|
| + EXPECT_EQ(10, message2.repeated_int32(0));
|
| + EXPECT_EQ(20, message2.repeated_int32(1));
|
| + EXPECT_FALSE(message2.has_optional_string());
|
| + EXPECT_EQ(1, message2.repeated_int64_size());
|
| + EXPECT_FALSE(message2.has_optional_uint64());
|
| +}
|
| +
|
| +TEST(GeneratedMessageReflectionTest, SwapFieldsAll) {
|
| + unittest::TestAllTypes message1;
|
| + unittest::TestAllTypes message2;
|
| +
|
| + TestUtil::SetAllFields(&message2);
|
| +
|
| + vector<const FieldDescriptor*> fields;
|
| + const Reflection* reflection = message1.GetReflection();
|
| + reflection->ListFields(message2, &fields);
|
| + reflection->SwapFields(&message1, &message2, fields);
|
| +
|
| + TestUtil::ExpectAllFieldsSet(message1);
|
| + TestUtil::ExpectClear(message2);
|
| +}
|
| +
|
| +TEST(GeneratedMessageReflectionTest, SwapFieldsAllExtension) {
|
| + unittest::TestAllExtensions message1;
|
| + unittest::TestAllExtensions message2;
|
| +
|
| + TestUtil::SetAllExtensions(&message1);
|
| +
|
| + vector<const FieldDescriptor*> fields;
|
| + const Reflection* reflection = message1.GetReflection();
|
| + reflection->ListFields(message1, &fields);
|
| + reflection->SwapFields(&message1, &message2, fields);
|
| +
|
| + TestUtil::ExpectExtensionsClear(message1);
|
| + TestUtil::ExpectAllExtensionsSet(message2);
|
| +}
|
| +
|
| +TEST(GeneratedMessageReflectionTest, SwapOneof) {
|
| + unittest::TestOneof2 message1, message2;
|
| + TestUtil::SetOneof1(&message1);
|
| +
|
| + const Reflection* reflection = message1.GetReflection();
|
| + reflection->Swap(&message1, &message2);
|
| +
|
| + TestUtil::ExpectOneofClear(message1);
|
| + TestUtil::ExpectOneofSet1(message2);
|
| +}
|
| +
|
| +TEST(GeneratedMessageReflectionTest, SwapOneofBothSet) {
|
| + unittest::TestOneof2 message1, message2;
|
| + TestUtil::SetOneof1(&message1);
|
| + TestUtil::SetOneof2(&message2);
|
| +
|
| + const Reflection* reflection = message1.GetReflection();
|
| + reflection->Swap(&message1, &message2);
|
| +
|
| + TestUtil::ExpectOneofSet2(message1);
|
| + TestUtil::ExpectOneofSet1(message2);
|
| +}
|
| +
|
| +TEST(GeneratedMessageReflectionTest, SwapFieldsOneof) {
|
| + unittest::TestOneof2 message1, message2;
|
| + TestUtil::SetOneof1(&message1);
|
| +
|
| + vector<const FieldDescriptor*> fields;
|
| + const Descriptor* descriptor = message1.GetDescriptor();
|
| + for (int i = 0; i < descriptor->field_count(); i++) {
|
| + fields.push_back(descriptor->field(i));
|
| + }
|
| + const Reflection* reflection = message1.GetReflection();
|
| + reflection->SwapFields(&message1, &message2, fields);
|
| +
|
| + TestUtil::ExpectOneofClear(message1);
|
| + TestUtil::ExpectOneofSet1(message2);
|
| +}
|
| +
|
| TEST(GeneratedMessageReflectionTest, RemoveLast) {
|
| unittest::TestAllTypes message;
|
| TestUtil::ReflectionTester reflection_tester(
|
| @@ -248,7 +359,7 @@ TEST(GeneratedMessageReflectionTest, ReleaseLast) {
|
| ASSERT_EQ(2, message.repeated_foreign_message_size());
|
| const protobuf_unittest::ForeignMessage* expected =
|
| message.mutable_repeated_foreign_message(1);
|
| - scoped_ptr<Message> released(message.GetReflection()->ReleaseLast(
|
| + google::protobuf::scoped_ptr<Message> released(message.GetReflection()->ReleaseLast(
|
| &message, descriptor->FindFieldByName("repeated_foreign_message")));
|
| EXPECT_EQ(expected, released.get());
|
| }
|
| @@ -271,9 +382,9 @@ TEST(GeneratedMessageReflectionTest, ReleaseLastExtensions) {
|
| unittest::repeated_foreign_message_extension));
|
| const protobuf_unittest::ForeignMessage* expected = message.MutableExtension(
|
| unittest::repeated_foreign_message_extension, 1);
|
| - scoped_ptr<Message> released(message.GetReflection()->ReleaseLast(
|
| + google::protobuf::scoped_ptr<Message> released(message.GetReflection()->ReleaseLast(
|
| &message, descriptor->file()->FindExtensionByName(
|
| - "repeated_foreign_message_extension")));
|
| + "repeated_foreign_message_extension")));
|
| EXPECT_EQ(expected, released.get());
|
|
|
| }
|
| @@ -375,6 +486,243 @@ TEST(GeneratedMessageReflectionTest, FindKnownExtensionByName) {
|
| FindKnownExtensionByName(extension1->full_name()) == NULL);
|
| }
|
|
|
| +TEST(GeneratedMessageReflectionTest, SetAllocatedMessageTest) {
|
| + unittest::TestAllTypes from_message1;
|
| + unittest::TestAllTypes from_message2;
|
| + unittest::TestAllTypes to_message;
|
| + TestUtil::ReflectionTester reflection_tester(
|
| + unittest::TestAllTypes::descriptor());
|
| + reflection_tester.SetAllFieldsViaReflection(&from_message1);
|
| + reflection_tester.SetAllFieldsViaReflection(&from_message2);
|
| +
|
| + // Before moving fields, we expect the nested messages to be NULL.
|
| + reflection_tester.ExpectMessagesReleasedViaReflection(
|
| + &to_message, TestUtil::ReflectionTester::IS_NULL);
|
| +
|
| + // After fields are moved we should get non-NULL releases.
|
| + reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection(
|
| + &from_message1, &to_message);
|
| + reflection_tester.ExpectMessagesReleasedViaReflection(
|
| + &to_message, TestUtil::ReflectionTester::NOT_NULL);
|
| +
|
| + // Another move to make sure that we can SetAllocated several times.
|
| + reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection(
|
| + &from_message2, &to_message);
|
| + reflection_tester.ExpectMessagesReleasedViaReflection(
|
| + &to_message, TestUtil::ReflectionTester::NOT_NULL);
|
| +
|
| + // After SetAllocatedOptionalMessageFieldsToNullViaReflection() we expect the
|
| + // releases to be NULL again.
|
| + reflection_tester.SetAllocatedOptionalMessageFieldsToNullViaReflection(
|
| + &to_message);
|
| + reflection_tester.ExpectMessagesReleasedViaReflection(
|
| + &to_message, TestUtil::ReflectionTester::IS_NULL);
|
| +}
|
| +
|
| +TEST(GeneratedMessageReflectionTest, SetAllocatedExtensionMessageTest) {
|
| + unittest::TestAllExtensions from_message1;
|
| + unittest::TestAllExtensions from_message2;
|
| + unittest::TestAllExtensions to_message;
|
| + TestUtil::ReflectionTester reflection_tester(
|
| + unittest::TestAllExtensions::descriptor());
|
| + reflection_tester.SetAllFieldsViaReflection(&from_message1);
|
| + reflection_tester.SetAllFieldsViaReflection(&from_message2);
|
| +
|
| + // Before moving fields, we expect the nested messages to be NULL.
|
| + reflection_tester.ExpectMessagesReleasedViaReflection(
|
| + &to_message, TestUtil::ReflectionTester::IS_NULL);
|
| +
|
| + // After fields are moved we should get non-NULL releases.
|
| + reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection(
|
| + &from_message1, &to_message);
|
| + reflection_tester.ExpectMessagesReleasedViaReflection(
|
| + &to_message, TestUtil::ReflectionTester::NOT_NULL);
|
| +
|
| + // Another move to make sure that we can SetAllocated several times.
|
| + reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection(
|
| + &from_message2, &to_message);
|
| + reflection_tester.ExpectMessagesReleasedViaReflection(
|
| + &to_message, TestUtil::ReflectionTester::NOT_NULL);
|
| +
|
| + // After SetAllocatedOptionalMessageFieldsToNullViaReflection() we expect the
|
| + // releases to be NULL again.
|
| + reflection_tester.SetAllocatedOptionalMessageFieldsToNullViaReflection(
|
| + &to_message);
|
| + reflection_tester.ExpectMessagesReleasedViaReflection(
|
| + &to_message, TestUtil::ReflectionTester::IS_NULL);
|
| +}
|
| +
|
| +TEST(GeneratedMessageReflectionTest, AddRepeatedMessage) {
|
| + unittest::TestAllTypes message;
|
| +
|
| + const Reflection* reflection = message.GetReflection();
|
| + const Reflection* nested_reflection =
|
| + unittest::TestAllTypes::NestedMessage::default_instance().GetReflection();
|
| +
|
| + const FieldDescriptor* nested_bb =
|
| + unittest::TestAllTypes::NestedMessage::descriptor()->FindFieldByName(
|
| + "bb");
|
| +
|
| + Message* nested = reflection->AddMessage(
|
| + &message, F("repeated_nested_message"));
|
| + nested_reflection->SetInt32(nested, nested_bb, 11);
|
| +
|
| + EXPECT_EQ(11, message.repeated_nested_message(0).bb());
|
| +}
|
| +
|
| +TEST(GeneratedMessageReflectionTest, MutableRepeatedMessage) {
|
| + unittest::TestAllTypes message;
|
| +
|
| + const Reflection* reflection = message.GetReflection();
|
| + const Reflection* nested_reflection =
|
| + unittest::TestAllTypes::NestedMessage::default_instance().GetReflection();
|
| +
|
| + const FieldDescriptor* nested_bb =
|
| + unittest::TestAllTypes::NestedMessage::descriptor()->FindFieldByName(
|
| + "bb");
|
| +
|
| + message.add_repeated_nested_message()->set_bb(12);
|
| +
|
| + Message* nested = reflection->MutableRepeatedMessage(
|
| + &message, F("repeated_nested_message"), 0);
|
| + EXPECT_EQ(12, nested_reflection->GetInt32(*nested, nested_bb));
|
| + nested_reflection->SetInt32(nested, nested_bb, 13);
|
| + EXPECT_EQ(13, message.repeated_nested_message(0).bb());
|
| +}
|
| +
|
| +TEST(GeneratedMessageReflectionTest, AddAllocatedMessage) {
|
| + unittest::TestAllTypes message;
|
| +
|
| + const Reflection* reflection = message.GetReflection();
|
| +
|
| + unittest::TestAllTypes::NestedMessage* nested =
|
| + new unittest::TestAllTypes::NestedMessage();
|
| + nested->set_bb(11);
|
| + reflection->AddAllocatedMessage(&message, F("repeated_nested_message"), nested);
|
| + EXPECT_EQ(1, message.repeated_nested_message_size());
|
| + EXPECT_EQ(11, message.repeated_nested_message(0).bb());
|
| +}
|
| +
|
| +TEST(GeneratedMessageReflectionTest, ListFieldsOneOf) {
|
| + unittest::TestOneof2 message;
|
| + TestUtil::SetOneof1(&message);
|
| +
|
| + const Reflection* reflection = message.GetReflection();
|
| + vector<const FieldDescriptor*> fields;
|
| + reflection->ListFields(message, &fields);
|
| + EXPECT_EQ(4, fields.size());
|
| +}
|
| +
|
| +TEST(GeneratedMessageReflectionTest, Oneof) {
|
| + unittest::TestOneof2 message;
|
| + const Descriptor* descriptor = message.GetDescriptor();
|
| + const Reflection* reflection = message.GetReflection();
|
| +
|
| + // Check default values.
|
| + EXPECT_EQ(0, reflection->GetInt32(
|
| + message, descriptor->FindFieldByName("foo_int")));
|
| + EXPECT_EQ("", reflection->GetString(
|
| + message, descriptor->FindFieldByName("foo_string")));
|
| + EXPECT_EQ("", reflection->GetString(
|
| + message, descriptor->FindFieldByName("foo_cord")));
|
| + EXPECT_EQ("", reflection->GetString(
|
| + message, descriptor->FindFieldByName("foo_string_piece")));
|
| + EXPECT_EQ("", reflection->GetString(
|
| + message, descriptor->FindFieldByName("foo_bytes")));
|
| + EXPECT_EQ(unittest::TestOneof2::FOO, reflection->GetEnum(
|
| + message, descriptor->FindFieldByName("foo_enum"))->number());
|
| + EXPECT_EQ(&unittest::TestOneof2::NestedMessage::default_instance(),
|
| + &reflection->GetMessage(
|
| + message, descriptor->FindFieldByName("foo_message")));
|
| + EXPECT_EQ(&unittest::TestOneof2::FooGroup::default_instance(),
|
| + &reflection->GetMessage(
|
| + message, descriptor->FindFieldByName("foogroup")));
|
| + EXPECT_NE(&unittest::TestOneof2::FooGroup::default_instance(),
|
| + &reflection->GetMessage(
|
| + message, descriptor->FindFieldByName("foo_lazy_message")));
|
| + EXPECT_EQ(5, reflection->GetInt32(
|
| + message, descriptor->FindFieldByName("bar_int")));
|
| + EXPECT_EQ("STRING", reflection->GetString(
|
| + message, descriptor->FindFieldByName("bar_string")));
|
| + EXPECT_EQ("CORD", reflection->GetString(
|
| + message, descriptor->FindFieldByName("bar_cord")));
|
| + EXPECT_EQ("SPIECE", reflection->GetString(
|
| + message, descriptor->FindFieldByName("bar_string_piece")));
|
| + EXPECT_EQ("BYTES", reflection->GetString(
|
| + message, descriptor->FindFieldByName("bar_bytes")));
|
| + EXPECT_EQ(unittest::TestOneof2::BAR, reflection->GetEnum(
|
| + message, descriptor->FindFieldByName("bar_enum"))->number());
|
| +
|
| + // Check Set functions.
|
| + reflection->SetInt32(
|
| + &message, descriptor->FindFieldByName("foo_int"), 123);
|
| + EXPECT_EQ(123, reflection->GetInt32(
|
| + message, descriptor->FindFieldByName("foo_int")));
|
| + reflection->SetString(
|
| + &message, descriptor->FindFieldByName("foo_string"), "abc");
|
| + EXPECT_EQ("abc", reflection->GetString(
|
| + message, descriptor->FindFieldByName("foo_string")));
|
| + reflection->SetString(
|
| + &message, descriptor->FindFieldByName("foo_bytes"), "bytes");
|
| + EXPECT_EQ("bytes", reflection->GetString(
|
| + message, descriptor->FindFieldByName("foo_bytes")));
|
| + reflection->SetString(
|
| + &message, descriptor->FindFieldByName("bar_cord"), "change_cord");
|
| + EXPECT_EQ("change_cord", reflection->GetString(
|
| + message, descriptor->FindFieldByName("bar_cord")));
|
| + reflection->SetString(
|
| + &message, descriptor->FindFieldByName("bar_string_piece"),
|
| + "change_spiece");
|
| + EXPECT_EQ("change_spiece", reflection->GetString(
|
| + message, descriptor->FindFieldByName("bar_string_piece")));
|
| +}
|
| +
|
| +TEST(GeneratedMessageReflectionTest, SetAllocatedOneofMessageTest) {
|
| + unittest::TestOneof2 from_message1;
|
| + unittest::TestOneof2 from_message2;
|
| + unittest::TestOneof2 to_message;
|
| + const Descriptor* descriptor = unittest::TestOneof2::descriptor();
|
| + const Reflection* reflection = to_message.GetReflection();
|
| +
|
| + Message* released = reflection->ReleaseMessage(
|
| + &to_message, descriptor->FindFieldByName("foo_lazy_message"));
|
| + EXPECT_TRUE(released == NULL);
|
| + released = reflection->ReleaseMessage(
|
| + &to_message, descriptor->FindFieldByName("foo_message"));
|
| + EXPECT_TRUE(released == NULL);
|
| +
|
| + TestUtil::ReflectionTester::SetOneofViaReflection(&from_message1);
|
| + TestUtil::ReflectionTester::ExpectOneofSetViaReflection(from_message1);
|
| +
|
| + TestUtil::ReflectionTester::
|
| + SetAllocatedOptionalMessageFieldsToMessageViaReflection(
|
| + &from_message1, &to_message);
|
| + const Message& sub_message = reflection->GetMessage(
|
| + to_message, descriptor->FindFieldByName("foo_lazy_message"));
|
| + released = reflection->ReleaseMessage(
|
| + &to_message, descriptor->FindFieldByName("foo_lazy_message"));
|
| + EXPECT_TRUE(released != NULL);
|
| + EXPECT_EQ(&sub_message, released);
|
| + delete released;
|
| +
|
| + TestUtil::ReflectionTester::SetOneofViaReflection(&from_message2);
|
| +
|
| + reflection->MutableMessage(
|
| + &from_message2, descriptor->FindFieldByName("foo_message"));
|
| +
|
| + TestUtil::ReflectionTester::
|
| + SetAllocatedOptionalMessageFieldsToMessageViaReflection(
|
| + &from_message2, &to_message);
|
| +
|
| + const Message& sub_message2 = reflection->GetMessage(
|
| + to_message, descriptor->FindFieldByName("foo_message"));
|
| + released = reflection->ReleaseMessage(
|
| + &to_message, descriptor->FindFieldByName("foo_message"));
|
| + EXPECT_TRUE(released != NULL);
|
| + EXPECT_EQ(&sub_message2, released);
|
| + delete released;
|
| +}
|
| +
|
| TEST(GeneratedMessageReflectionTest, ReleaseMessageTest) {
|
| unittest::TestAllTypes message;
|
| TestUtil::ReflectionTester reflection_tester(
|
| @@ -427,6 +775,26 @@ TEST(GeneratedMessageReflectionTest, ReleaseExtensionMessageTest) {
|
| TestUtil::ExpectAllExtensionsSet(message);
|
| }
|
|
|
| +TEST(GeneratedMessageReflectionTest, ReleaseOneofMessageTest) {
|
| + unittest::TestOneof2 message;
|
| + TestUtil::ReflectionTester::SetOneofViaReflection(&message);
|
| +
|
| + const Descriptor* descriptor = unittest::TestOneof2::descriptor();
|
| + const Reflection* reflection = message.GetReflection();
|
| + const Message& sub_message = reflection->GetMessage(
|
| + message, descriptor->FindFieldByName("foo_lazy_message"));
|
| + Message* released = reflection->ReleaseMessage(
|
| + &message, descriptor->FindFieldByName("foo_lazy_message"));
|
| +
|
| + EXPECT_TRUE(released != NULL);
|
| + EXPECT_EQ(&sub_message, released);
|
| + delete released;
|
| +
|
| + released = reflection->ReleaseMessage(
|
| + &message, descriptor->FindFieldByName("foo_lazy_message"));
|
| + EXPECT_TRUE(released == NULL);
|
| +}
|
| +
|
| #ifdef PROTOBUF_HAS_DEATH_TEST
|
|
|
| TEST(GeneratedMessageReflectionTest, UsageErrors) {
|
|
|