| Index: third_party/protobuf/src/google/protobuf/extension_set_unittest.cc
|
| ===================================================================
|
| --- third_party/protobuf/src/google/protobuf/extension_set_unittest.cc (revision 216642)
|
| +++ third_party/protobuf/src/google/protobuf/extension_set_unittest.cc (working copy)
|
| @@ -34,6 +34,7 @@
|
|
|
| #include <google/protobuf/extension_set.h>
|
| #include <google/protobuf/unittest.pb.h>
|
| +#include <google/protobuf/unittest_mset.pb.h>
|
| #include <google/protobuf/test_util.h>
|
| #include <google/protobuf/descriptor.pb.h>
|
| #include <google/protobuf/descriptor.h>
|
| @@ -46,9 +47,10 @@
|
| #include <google/protobuf/stubs/strutil.h>
|
| #include <google/protobuf/testing/googletest.h>
|
| #include <gtest/gtest.h>
|
| -#include <google/protobuf/stubs/stl_util-inl.h>
|
| +#include <google/protobuf/stubs/stl_util.h>
|
|
|
| namespace google {
|
| +
|
| namespace protobuf {
|
| namespace internal {
|
| namespace {
|
| @@ -140,23 +142,98 @@
|
| TestUtil::ExpectAllExtensionsSet(message);
|
| }
|
|
|
| +TEST(ExtensionSetTest, SetAllocatedExtensin) {
|
| + unittest::TestAllExtensions message;
|
| + EXPECT_FALSE(message.HasExtension(
|
| + unittest::optional_foreign_message_extension));
|
| + // Add a extension using SetAllocatedExtension
|
| + unittest::ForeignMessage* foreign_message = new unittest::ForeignMessage();
|
| + message.SetAllocatedExtension(unittest::optional_foreign_message_extension,
|
| + foreign_message);
|
| + EXPECT_TRUE(message.HasExtension(
|
| + unittest::optional_foreign_message_extension));
|
| + EXPECT_EQ(foreign_message,
|
| + message.MutableExtension(
|
| + unittest::optional_foreign_message_extension));
|
| + EXPECT_EQ(foreign_message,
|
| + &message.GetExtension(
|
| + unittest::optional_foreign_message_extension));
|
| +
|
| + // SetAllocatedExtension should delete the previously existing extension.
|
| + // (We reply on unittest to check memory leaks for this case)
|
| + message.SetAllocatedExtension(unittest::optional_foreign_message_extension,
|
| + new unittest::ForeignMessage());
|
| +
|
| + // SetAllocatedExtension with a NULL parameter is equivalent to ClearExtenion.
|
| + message.SetAllocatedExtension(unittest::optional_foreign_message_extension,
|
| + NULL);
|
| + EXPECT_FALSE(message.HasExtension(
|
| + unittest::optional_foreign_message_extension));
|
| +}
|
| +
|
| +TEST(ExtensionSetTest, ReleaseExtension) {
|
| + unittest::TestMessageSet message;
|
| + EXPECT_FALSE(message.HasExtension(
|
| + unittest::TestMessageSetExtension1::message_set_extension));
|
| + // Add a extension using SetAllocatedExtension
|
| + unittest::TestMessageSetExtension1* extension =
|
| + new unittest::TestMessageSetExtension1();
|
| + message.SetAllocatedExtension(
|
| + unittest::TestMessageSetExtension1::message_set_extension,
|
| + extension);
|
| + EXPECT_TRUE(message.HasExtension(
|
| + unittest::TestMessageSetExtension1::message_set_extension));
|
| + // Release the extension using ReleaseExtension
|
| + unittest::TestMessageSetExtension1* released_extension =
|
| + message.ReleaseExtension(
|
| + unittest::TestMessageSetExtension1::message_set_extension);
|
| + EXPECT_EQ(extension, released_extension);
|
| + EXPECT_FALSE(message.HasExtension(
|
| + unittest::TestMessageSetExtension1::message_set_extension));
|
| + // ReleaseExtension will return the underlying object even after
|
| + // ClearExtension is called.
|
| + message.SetAllocatedExtension(
|
| + unittest::TestMessageSetExtension1::message_set_extension,
|
| + extension);
|
| + message.ClearExtension(
|
| + unittest::TestMessageSetExtension1::message_set_extension);
|
| + released_extension = message.ReleaseExtension(
|
| + unittest::TestMessageSetExtension1::message_set_extension);
|
| + EXPECT_TRUE(released_extension != NULL);
|
| + delete released_extension;
|
| +}
|
| +
|
| +
|
| TEST(ExtensionSetTest, CopyFrom) {
|
| unittest::TestAllExtensions message1, message2;
|
| - string data;
|
|
|
| TestUtil::SetAllExtensions(&message1);
|
| message2.CopyFrom(message1);
|
| TestUtil::ExpectAllExtensionsSet(message2);
|
| + message2.CopyFrom(message1); // exercise copy when fields already exist
|
| + TestUtil::ExpectAllExtensionsSet(message2);
|
| }
|
|
|
| +TEST(ExtensioSetTest, CopyFromPacked) {
|
| + unittest::TestPackedExtensions message1, message2;
|
| +
|
| + TestUtil::SetPackedExtensions(&message1);
|
| + message2.CopyFrom(message1);
|
| + TestUtil::ExpectPackedExtensionsSet(message2);
|
| + message2.CopyFrom(message1); // exercise copy when fields already exist
|
| + TestUtil::ExpectPackedExtensionsSet(message2);
|
| +}
|
| +
|
| TEST(ExtensionSetTest, CopyFromUpcasted) {
|
| unittest::TestAllExtensions message1, message2;
|
| - string data;
|
| const Message& upcasted_message = message1;
|
|
|
| TestUtil::SetAllExtensions(&message1);
|
| message2.CopyFrom(upcasted_message);
|
| TestUtil::ExpectAllExtensionsSet(message2);
|
| + // exercise copy when fields already exist
|
| + message2.CopyFrom(upcasted_message);
|
| + TestUtil::ExpectAllExtensionsSet(message2);
|
| }
|
|
|
| TEST(ExtensionSetTest, SwapWithEmpty) {
|
| @@ -418,7 +495,8 @@
|
| for (int i = 0; i < 16; ++i) { \
|
| message.AddExtension(unittest::repeated_##type##_extension, value); \
|
| } \
|
| - int expected_size = sizeof(cpptype) * 16 + empty_repeated_field_size; \
|
| + int expected_size = sizeof(cpptype) * (16 - \
|
| + kMinRepeatedFieldAllocationSize) + empty_repeated_field_size; \
|
| EXPECT_EQ(expected_size, message.SpaceUsed()) << #type; \
|
| } while (0)
|
|
|
| @@ -450,7 +528,8 @@
|
| for (int i = 0; i < 16; ++i) {
|
| message.AddExtension(unittest::repeated_string_extension, value);
|
| }
|
| - min_expected_size += (sizeof(value) + value.size()) * 16;
|
| + min_expected_size += (sizeof(value) + value.size()) *
|
| + (16 - kMinRepeatedFieldAllocationSize);
|
| EXPECT_LE(min_expected_size, message.SpaceUsed());
|
| }
|
| // Repeated messages
|
| @@ -465,7 +544,8 @@
|
| message.AddExtension(unittest::repeated_foreign_message_extension)->
|
| CopyFrom(prototype);
|
| }
|
| - min_expected_size += 16 * prototype.SpaceUsed();
|
| + min_expected_size +=
|
| + (16 - kMinRepeatedFieldAllocationSize) * prototype.SpaceUsed();
|
| EXPECT_LE(min_expected_size, message.SpaceUsed());
|
| }
|
| }
|
|
|