Brian Silverman | 9c614bc | 2016-02-15 20:20:02 -0500 | [diff] [blame^] | 1 | // Protocol Buffers - Google's data interchange format |
| 2 | // Copyright 2008 Google Inc. All rights reserved. |
| 3 | // https://developers.google.com/protocol-buffers/ |
| 4 | // |
| 5 | // Redistribution and use in source and binary forms, with or without |
| 6 | // modification, are permitted provided that the following conditions are |
| 7 | // met: |
| 8 | // |
| 9 | // * Redistributions of source code must retain the above copyright |
| 10 | // notice, this list of conditions and the following disclaimer. |
| 11 | // * Redistributions in binary form must reproduce the above |
| 12 | // copyright notice, this list of conditions and the following disclaimer |
| 13 | // in the documentation and/or other materials provided with the |
| 14 | // distribution. |
| 15 | // * Neither the name of Google Inc. nor the names of its |
| 16 | // contributors may be used to endorse or promote products derived from |
| 17 | // this software without specific prior written permission. |
| 18 | // |
| 19 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| 20 | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| 21 | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| 22 | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| 23 | // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| 24 | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| 25 | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| 26 | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 27 | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 28 | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 29 | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 30 | |
| 31 | // Author: kenton@google.com (Kenton Varda) |
| 32 | // Based on original Protocol Buffers design by |
| 33 | // Sanjay Ghemawat, Jeff Dean, and others. |
| 34 | |
| 35 | #include <google/protobuf/reflection_ops.h> |
| 36 | #include <google/protobuf/descriptor.h> |
| 37 | #include <google/protobuf/unittest.pb.h> |
| 38 | #include <google/protobuf/test_util.h> |
| 39 | |
| 40 | #include <google/protobuf/stubs/logging.h> |
| 41 | #include <google/protobuf/stubs/common.h> |
| 42 | #include <google/protobuf/testing/googletest.h> |
| 43 | #include <gtest/gtest.h> |
| 44 | #include <google/protobuf/stubs/strutil.h> |
| 45 | |
| 46 | namespace google { |
| 47 | namespace protobuf { |
| 48 | namespace internal { |
| 49 | namespace { |
| 50 | |
| 51 | TEST(ReflectionOpsTest, SanityCheck) { |
| 52 | unittest::TestAllTypes message; |
| 53 | |
| 54 | TestUtil::SetAllFields(&message); |
| 55 | TestUtil::ExpectAllFieldsSet(message); |
| 56 | } |
| 57 | |
| 58 | TEST(ReflectionOpsTest, Copy) { |
| 59 | unittest::TestAllTypes message, message2; |
| 60 | |
| 61 | TestUtil::SetAllFields(&message); |
| 62 | |
| 63 | ReflectionOps::Copy(message, &message2); |
| 64 | |
| 65 | TestUtil::ExpectAllFieldsSet(message2); |
| 66 | |
| 67 | // Copying from self should be a no-op. |
| 68 | ReflectionOps::Copy(message2, &message2); |
| 69 | TestUtil::ExpectAllFieldsSet(message2); |
| 70 | } |
| 71 | |
| 72 | TEST(ReflectionOpsTest, CopyExtensions) { |
| 73 | unittest::TestAllExtensions message, message2; |
| 74 | |
| 75 | TestUtil::SetAllExtensions(&message); |
| 76 | |
| 77 | ReflectionOps::Copy(message, &message2); |
| 78 | |
| 79 | TestUtil::ExpectAllExtensionsSet(message2); |
| 80 | } |
| 81 | |
| 82 | TEST(ReflectionOpsTest, CopyOneof) { |
| 83 | unittest::TestOneof2 message, message2; |
| 84 | TestUtil::SetOneof1(&message); |
| 85 | ReflectionOps::Copy(message, &message2); |
| 86 | TestUtil::ExpectOneofSet1(message2); |
| 87 | |
| 88 | TestUtil::SetOneof2(&message); |
| 89 | TestUtil::ExpectOneofSet2(message); |
| 90 | ReflectionOps::Copy(message, &message2); |
| 91 | TestUtil::ExpectOneofSet2(message2); |
| 92 | } |
| 93 | |
| 94 | TEST(ReflectionOpsTest, Merge) { |
| 95 | // Note: Copy is implemented in terms of Merge() so technically the Copy |
| 96 | // test already tested most of this. |
| 97 | |
| 98 | unittest::TestAllTypes message, message2; |
| 99 | |
| 100 | TestUtil::SetAllFields(&message); |
| 101 | |
| 102 | // This field will test merging into an empty spot. |
| 103 | message2.set_optional_int32(message.optional_int32()); |
| 104 | message.clear_optional_int32(); |
| 105 | |
| 106 | // This tests overwriting. |
| 107 | message2.set_optional_string(message.optional_string()); |
| 108 | message.set_optional_string("something else"); |
| 109 | |
| 110 | // This tests concatenating. |
| 111 | message2.add_repeated_int32(message.repeated_int32(1)); |
| 112 | int32 i = message.repeated_int32(0); |
| 113 | message.clear_repeated_int32(); |
| 114 | message.add_repeated_int32(i); |
| 115 | |
| 116 | ReflectionOps::Merge(message2, &message); |
| 117 | |
| 118 | TestUtil::ExpectAllFieldsSet(message); |
| 119 | } |
| 120 | |
| 121 | TEST(ReflectionOpsTest, MergeExtensions) { |
| 122 | // Note: Copy is implemented in terms of Merge() so technically the Copy |
| 123 | // test already tested most of this. |
| 124 | |
| 125 | unittest::TestAllExtensions message, message2; |
| 126 | |
| 127 | TestUtil::SetAllExtensions(&message); |
| 128 | |
| 129 | // This field will test merging into an empty spot. |
| 130 | message2.SetExtension(unittest::optional_int32_extension, |
| 131 | message.GetExtension(unittest::optional_int32_extension)); |
| 132 | message.ClearExtension(unittest::optional_int32_extension); |
| 133 | |
| 134 | // This tests overwriting. |
| 135 | message2.SetExtension(unittest::optional_string_extension, |
| 136 | message.GetExtension(unittest::optional_string_extension)); |
| 137 | message.SetExtension(unittest::optional_string_extension, "something else"); |
| 138 | |
| 139 | // This tests concatenating. |
| 140 | message2.AddExtension(unittest::repeated_int32_extension, |
| 141 | message.GetExtension(unittest::repeated_int32_extension, 1)); |
| 142 | int32 i = message.GetExtension(unittest::repeated_int32_extension, 0); |
| 143 | message.ClearExtension(unittest::repeated_int32_extension); |
| 144 | message.AddExtension(unittest::repeated_int32_extension, i); |
| 145 | |
| 146 | ReflectionOps::Merge(message2, &message); |
| 147 | |
| 148 | TestUtil::ExpectAllExtensionsSet(message); |
| 149 | } |
| 150 | |
| 151 | TEST(ReflectionOpsTest, MergeUnknown) { |
| 152 | // Test that the messages' UnknownFieldSets are correctly merged. |
| 153 | unittest::TestEmptyMessage message1, message2; |
| 154 | message1.mutable_unknown_fields()->AddVarint(1234, 1); |
| 155 | message2.mutable_unknown_fields()->AddVarint(1234, 2); |
| 156 | |
| 157 | ReflectionOps::Merge(message2, &message1); |
| 158 | |
| 159 | ASSERT_EQ(2, message1.unknown_fields().field_count()); |
| 160 | ASSERT_EQ(UnknownField::TYPE_VARINT, |
| 161 | message1.unknown_fields().field(0).type()); |
| 162 | EXPECT_EQ(1, message1.unknown_fields().field(0).varint()); |
| 163 | ASSERT_EQ(UnknownField::TYPE_VARINT, |
| 164 | message1.unknown_fields().field(1).type()); |
| 165 | EXPECT_EQ(2, message1.unknown_fields().field(1).varint()); |
| 166 | } |
| 167 | |
| 168 | TEST(ReflectionOpsTest, MergeOneof) { |
| 169 | unittest::TestOneof2 message1, message2; |
| 170 | TestUtil::SetOneof1(&message1); |
| 171 | |
| 172 | // Merge to empty message |
| 173 | ReflectionOps::Merge(message1, &message2); |
| 174 | TestUtil::ExpectOneofSet1(message2); |
| 175 | |
| 176 | // Merge with the same oneof fields |
| 177 | ReflectionOps::Merge(message1, &message2); |
| 178 | TestUtil::ExpectOneofSet1(message2); |
| 179 | |
| 180 | // Merge with different oneof fields |
| 181 | TestUtil::SetOneof2(&message1); |
| 182 | ReflectionOps::Merge(message1, &message2); |
| 183 | TestUtil::ExpectOneofSet2(message2); |
| 184 | } |
| 185 | |
| 186 | #ifdef PROTOBUF_HAS_DEATH_TEST |
| 187 | |
| 188 | TEST(ReflectionOpsTest, MergeFromSelf) { |
| 189 | // Note: Copy is implemented in terms of Merge() so technically the Copy |
| 190 | // test already tested most of this. |
| 191 | |
| 192 | unittest::TestAllTypes message; |
| 193 | |
| 194 | EXPECT_DEATH( |
| 195 | ReflectionOps::Merge(message, &message), |
| 196 | "&from"); |
| 197 | } |
| 198 | |
| 199 | #endif // PROTOBUF_HAS_DEATH_TEST |
| 200 | |
| 201 | TEST(ReflectionOpsTest, Clear) { |
| 202 | unittest::TestAllTypes message; |
| 203 | |
| 204 | TestUtil::SetAllFields(&message); |
| 205 | |
| 206 | ReflectionOps::Clear(&message); |
| 207 | |
| 208 | TestUtil::ExpectClear(message); |
| 209 | |
| 210 | // Check that getting embedded messages returns the objects created during |
| 211 | // SetAllFields() rather than default instances. |
| 212 | EXPECT_NE(&unittest::TestAllTypes::OptionalGroup::default_instance(), |
| 213 | &message.optionalgroup()); |
| 214 | EXPECT_NE(&unittest::TestAllTypes::NestedMessage::default_instance(), |
| 215 | &message.optional_nested_message()); |
| 216 | EXPECT_NE(&unittest::ForeignMessage::default_instance(), |
| 217 | &message.optional_foreign_message()); |
| 218 | EXPECT_NE(&unittest_import::ImportMessage::default_instance(), |
| 219 | &message.optional_import_message()); |
| 220 | } |
| 221 | |
| 222 | TEST(ReflectionOpsTest, ClearExtensions) { |
| 223 | unittest::TestAllExtensions message; |
| 224 | |
| 225 | TestUtil::SetAllExtensions(&message); |
| 226 | |
| 227 | ReflectionOps::Clear(&message); |
| 228 | |
| 229 | TestUtil::ExpectExtensionsClear(message); |
| 230 | |
| 231 | // Check that getting embedded messages returns the objects created during |
| 232 | // SetAllExtensions() rather than default instances. |
| 233 | EXPECT_NE(&unittest::OptionalGroup_extension::default_instance(), |
| 234 | &message.GetExtension(unittest::optionalgroup_extension)); |
| 235 | EXPECT_NE(&unittest::TestAllTypes::NestedMessage::default_instance(), |
| 236 | &message.GetExtension(unittest::optional_nested_message_extension)); |
| 237 | EXPECT_NE(&unittest::ForeignMessage::default_instance(), |
| 238 | &message.GetExtension( |
| 239 | unittest::optional_foreign_message_extension)); |
| 240 | EXPECT_NE(&unittest_import::ImportMessage::default_instance(), |
| 241 | &message.GetExtension(unittest::optional_import_message_extension)); |
| 242 | } |
| 243 | |
| 244 | TEST(ReflectionOpsTest, ClearUnknown) { |
| 245 | // Test that the message's UnknownFieldSet is correctly cleared. |
| 246 | unittest::TestEmptyMessage message; |
| 247 | message.mutable_unknown_fields()->AddVarint(1234, 1); |
| 248 | |
| 249 | ReflectionOps::Clear(&message); |
| 250 | |
| 251 | EXPECT_EQ(0, message.unknown_fields().field_count()); |
| 252 | } |
| 253 | |
| 254 | TEST(ReflectionOpsTest, ClearOneof) { |
| 255 | unittest::TestOneof2 message; |
| 256 | |
| 257 | TestUtil::ExpectOneofClear(message); |
| 258 | TestUtil::SetOneof1(&message); |
| 259 | TestUtil::ExpectOneofSet1(message); |
| 260 | ReflectionOps::Clear(&message); |
| 261 | TestUtil::ExpectOneofClear(message); |
| 262 | |
| 263 | TestUtil::SetOneof1(&message); |
| 264 | TestUtil::ExpectOneofSet1(message); |
| 265 | TestUtil::SetOneof2(&message); |
| 266 | TestUtil::ExpectOneofSet2(message); |
| 267 | ReflectionOps::Clear(&message); |
| 268 | TestUtil::ExpectOneofClear(message); |
| 269 | } |
| 270 | |
| 271 | TEST(ReflectionOpsTest, DiscardUnknownFields) { |
| 272 | unittest::TestAllTypes message; |
| 273 | TestUtil::SetAllFields(&message); |
| 274 | |
| 275 | // Set some unknown fields in message. |
| 276 | message.mutable_unknown_fields() |
| 277 | ->AddVarint(123456, 654321); |
| 278 | message.mutable_optional_nested_message() |
| 279 | ->mutable_unknown_fields() |
| 280 | ->AddVarint(123456, 654321); |
| 281 | message.mutable_repeated_nested_message(0) |
| 282 | ->mutable_unknown_fields() |
| 283 | ->AddVarint(123456, 654321); |
| 284 | |
| 285 | EXPECT_EQ(1, message.unknown_fields().field_count()); |
| 286 | EXPECT_EQ(1, message.optional_nested_message() |
| 287 | .unknown_fields().field_count()); |
| 288 | EXPECT_EQ(1, message.repeated_nested_message(0) |
| 289 | .unknown_fields().field_count()); |
| 290 | |
| 291 | // Discard them. |
| 292 | ReflectionOps::DiscardUnknownFields(&message); |
| 293 | TestUtil::ExpectAllFieldsSet(message); |
| 294 | |
| 295 | EXPECT_EQ(0, message.unknown_fields().field_count()); |
| 296 | EXPECT_EQ(0, message.optional_nested_message() |
| 297 | .unknown_fields().field_count()); |
| 298 | EXPECT_EQ(0, message.repeated_nested_message(0) |
| 299 | .unknown_fields().field_count()); |
| 300 | } |
| 301 | |
| 302 | TEST(ReflectionOpsTest, DiscardUnknownExtensions) { |
| 303 | unittest::TestAllExtensions message; |
| 304 | TestUtil::SetAllExtensions(&message); |
| 305 | |
| 306 | // Set some unknown fields. |
| 307 | message.mutable_unknown_fields() |
| 308 | ->AddVarint(123456, 654321); |
| 309 | message.MutableExtension(unittest::optional_nested_message_extension) |
| 310 | ->mutable_unknown_fields() |
| 311 | ->AddVarint(123456, 654321); |
| 312 | message.MutableExtension(unittest::repeated_nested_message_extension, 0) |
| 313 | ->mutable_unknown_fields() |
| 314 | ->AddVarint(123456, 654321); |
| 315 | |
| 316 | EXPECT_EQ(1, message.unknown_fields().field_count()); |
| 317 | EXPECT_EQ(1, |
| 318 | message.GetExtension(unittest::optional_nested_message_extension) |
| 319 | .unknown_fields().field_count()); |
| 320 | EXPECT_EQ(1, |
| 321 | message.GetExtension(unittest::repeated_nested_message_extension, 0) |
| 322 | .unknown_fields().field_count()); |
| 323 | |
| 324 | // Discard them. |
| 325 | ReflectionOps::DiscardUnknownFields(&message); |
| 326 | TestUtil::ExpectAllExtensionsSet(message); |
| 327 | |
| 328 | EXPECT_EQ(0, message.unknown_fields().field_count()); |
| 329 | EXPECT_EQ(0, |
| 330 | message.GetExtension(unittest::optional_nested_message_extension) |
| 331 | .unknown_fields().field_count()); |
| 332 | EXPECT_EQ(0, |
| 333 | message.GetExtension(unittest::repeated_nested_message_extension, 0) |
| 334 | .unknown_fields().field_count()); |
| 335 | } |
| 336 | |
| 337 | TEST(ReflectionOpsTest, IsInitialized) { |
| 338 | unittest::TestRequired message; |
| 339 | |
| 340 | EXPECT_FALSE(ReflectionOps::IsInitialized(message)); |
| 341 | message.set_a(1); |
| 342 | EXPECT_FALSE(ReflectionOps::IsInitialized(message)); |
| 343 | message.set_b(2); |
| 344 | EXPECT_FALSE(ReflectionOps::IsInitialized(message)); |
| 345 | message.set_c(3); |
| 346 | EXPECT_TRUE(ReflectionOps::IsInitialized(message)); |
| 347 | } |
| 348 | |
| 349 | TEST(ReflectionOpsTest, ForeignIsInitialized) { |
| 350 | unittest::TestRequiredForeign message; |
| 351 | |
| 352 | // Starts out initialized because the foreign message is itself an optional |
| 353 | // field. |
| 354 | EXPECT_TRUE(ReflectionOps::IsInitialized(message)); |
| 355 | |
| 356 | // Once we create that field, the message is no longer initialized. |
| 357 | message.mutable_optional_message(); |
| 358 | EXPECT_FALSE(ReflectionOps::IsInitialized(message)); |
| 359 | |
| 360 | // Initialize it. Now we're initialized. |
| 361 | message.mutable_optional_message()->set_a(1); |
| 362 | message.mutable_optional_message()->set_b(2); |
| 363 | message.mutable_optional_message()->set_c(3); |
| 364 | EXPECT_TRUE(ReflectionOps::IsInitialized(message)); |
| 365 | |
| 366 | // Add a repeated version of the message. No longer initialized. |
| 367 | unittest::TestRequired* sub_message = message.add_repeated_message(); |
| 368 | EXPECT_FALSE(ReflectionOps::IsInitialized(message)); |
| 369 | |
| 370 | // Initialize that repeated version. |
| 371 | sub_message->set_a(1); |
| 372 | sub_message->set_b(2); |
| 373 | sub_message->set_c(3); |
| 374 | EXPECT_TRUE(ReflectionOps::IsInitialized(message)); |
| 375 | } |
| 376 | |
| 377 | TEST(ReflectionOpsTest, ExtensionIsInitialized) { |
| 378 | unittest::TestAllExtensions message; |
| 379 | |
| 380 | // Starts out initialized because the foreign message is itself an optional |
| 381 | // field. |
| 382 | EXPECT_TRUE(ReflectionOps::IsInitialized(message)); |
| 383 | |
| 384 | // Once we create that field, the message is no longer initialized. |
| 385 | message.MutableExtension(unittest::TestRequired::single); |
| 386 | EXPECT_FALSE(ReflectionOps::IsInitialized(message)); |
| 387 | |
| 388 | // Initialize it. Now we're initialized. |
| 389 | message.MutableExtension(unittest::TestRequired::single)->set_a(1); |
| 390 | message.MutableExtension(unittest::TestRequired::single)->set_b(2); |
| 391 | message.MutableExtension(unittest::TestRequired::single)->set_c(3); |
| 392 | EXPECT_TRUE(ReflectionOps::IsInitialized(message)); |
| 393 | |
| 394 | // Add a repeated version of the message. No longer initialized. |
| 395 | message.AddExtension(unittest::TestRequired::multi); |
| 396 | EXPECT_FALSE(ReflectionOps::IsInitialized(message)); |
| 397 | |
| 398 | // Initialize that repeated version. |
| 399 | message.MutableExtension(unittest::TestRequired::multi, 0)->set_a(1); |
| 400 | message.MutableExtension(unittest::TestRequired::multi, 0)->set_b(2); |
| 401 | message.MutableExtension(unittest::TestRequired::multi, 0)->set_c(3); |
| 402 | EXPECT_TRUE(ReflectionOps::IsInitialized(message)); |
| 403 | } |
| 404 | |
| 405 | TEST(ReflectionOpsTest, OneofIsInitialized) { |
| 406 | unittest::TestRequiredOneof message; |
| 407 | EXPECT_TRUE(ReflectionOps::IsInitialized(message)); |
| 408 | |
| 409 | message.mutable_foo_message(); |
| 410 | EXPECT_FALSE(ReflectionOps::IsInitialized(message)); |
| 411 | |
| 412 | message.set_foo_int(1); |
| 413 | EXPECT_TRUE(ReflectionOps::IsInitialized(message)); |
| 414 | |
| 415 | message.mutable_foo_message(); |
| 416 | EXPECT_FALSE(ReflectionOps::IsInitialized(message)); |
| 417 | message.mutable_foo_message()->set_required_double(0.1); |
| 418 | EXPECT_TRUE(ReflectionOps::IsInitialized(message)); |
| 419 | } |
| 420 | |
| 421 | static string FindInitializationErrors(const Message& message) { |
| 422 | vector<string> errors; |
| 423 | ReflectionOps::FindInitializationErrors(message, "", &errors); |
| 424 | return Join(errors, ","); |
| 425 | } |
| 426 | |
| 427 | TEST(ReflectionOpsTest, FindInitializationErrors) { |
| 428 | unittest::TestRequired message; |
| 429 | EXPECT_EQ("a,b,c", FindInitializationErrors(message)); |
| 430 | } |
| 431 | |
| 432 | TEST(ReflectionOpsTest, FindForeignInitializationErrors) { |
| 433 | unittest::TestRequiredForeign message; |
| 434 | message.mutable_optional_message(); |
| 435 | message.add_repeated_message(); |
| 436 | message.add_repeated_message(); |
| 437 | EXPECT_EQ("optional_message.a," |
| 438 | "optional_message.b," |
| 439 | "optional_message.c," |
| 440 | "repeated_message[0].a," |
| 441 | "repeated_message[0].b," |
| 442 | "repeated_message[0].c," |
| 443 | "repeated_message[1].a," |
| 444 | "repeated_message[1].b," |
| 445 | "repeated_message[1].c", |
| 446 | FindInitializationErrors(message)); |
| 447 | } |
| 448 | |
| 449 | TEST(ReflectionOpsTest, FindExtensionInitializationErrors) { |
| 450 | unittest::TestAllExtensions message; |
| 451 | message.MutableExtension(unittest::TestRequired::single); |
| 452 | message.AddExtension(unittest::TestRequired::multi); |
| 453 | message.AddExtension(unittest::TestRequired::multi); |
| 454 | EXPECT_EQ("(protobuf_unittest.TestRequired.single).a," |
| 455 | "(protobuf_unittest.TestRequired.single).b," |
| 456 | "(protobuf_unittest.TestRequired.single).c," |
| 457 | "(protobuf_unittest.TestRequired.multi)[0].a," |
| 458 | "(protobuf_unittest.TestRequired.multi)[0].b," |
| 459 | "(protobuf_unittest.TestRequired.multi)[0].c," |
| 460 | "(protobuf_unittest.TestRequired.multi)[1].a," |
| 461 | "(protobuf_unittest.TestRequired.multi)[1].b," |
| 462 | "(protobuf_unittest.TestRequired.multi)[1].c", |
| 463 | FindInitializationErrors(message)); |
| 464 | } |
| 465 | |
| 466 | TEST(ReflectionOpsTest, FindOneofInitializationErrors) { |
| 467 | unittest::TestRequiredOneof message; |
| 468 | message.mutable_foo_message(); |
| 469 | EXPECT_EQ("foo_message.required_double", |
| 470 | FindInitializationErrors(message)); |
| 471 | } |
| 472 | |
| 473 | } // namespace |
| 474 | } // namespace internal |
| 475 | } // namespace protobuf |
| 476 | } // namespace google |