• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2008 Google Inc.  All rights reserved.
3 //
4 // Use of this source code is governed by a BSD-style
5 // license that can be found in the LICENSE file or at
6 // https://developers.google.com/open-source/licenses/bsd
7 
8 // Author: kenton@google.com (Kenton Varda)
9 //  Based on original Protocol Buffers design by
10 //  Sanjay Ghemawat, Jeff Dean, and others.
11 //
12 // This test is testing a lot more than just the UnknownFieldSet class.  It
13 // tests handling of unknown fields throughout the system.
14 
15 #include "google/protobuf/unknown_field_set.h"
16 
17 #include <cstddef>
18 #include <string>
19 #include <vector>
20 
21 #include "google/protobuf/stubs/callback.h"
22 #include "google/protobuf/stubs/common.h"
23 #include <gmock/gmock.h>
24 #include <gtest/gtest.h>
25 #include "absl/container/flat_hash_set.h"
26 #include "absl/functional/bind_front.h"
27 #include "absl/log/absl_check.h"
28 #include "absl/strings/cord.h"
29 #include "absl/synchronization/mutex.h"
30 #include "absl/time/clock.h"
31 #include "absl/time/time.h"
32 #include "google/protobuf/descriptor.h"
33 #include "google/protobuf/io/coded_stream.h"
34 #include "google/protobuf/io/zero_copy_stream_impl.h"
35 #include "google/protobuf/test_util.h"
36 #include "google/protobuf/text_format.h"
37 #include "google/protobuf/unittest.pb.h"
38 #include "google/protobuf/unittest_lite.pb.h"
39 #include "google/protobuf/wire_format.h"
40 
41 namespace google {
42 namespace protobuf {
43 namespace internal {
44 struct UnknownFieldSetTestPeer {
AddLengthDelimitedgoogle::protobuf::internal::UnknownFieldSetTestPeer45   static auto AddLengthDelimited(UnknownFieldSet& set, int number) {
46     return set.AddLengthDelimited(number);
47   }
48 };
49 }  // namespace internal
50 
51 using internal::WireFormat;
52 using ::testing::ElementsAre;
53 
54 template <typename T>
UnknownToProto(const UnknownFieldSet & set)55 T UnknownToProto(const UnknownFieldSet& set) {
56   T message;
57   std::string serialized_message;
58   ABSL_CHECK(set.SerializeToString(&serialized_message));
59   ABSL_CHECK(message.ParseFromString(serialized_message));
60   return message;
61 }
62 
63 class UnknownFieldSetTest : public testing::Test {
64  protected:
SetUp()65   void SetUp() override {
66     descriptor_ = unittest::TestAllTypes::descriptor();
67     TestUtil::SetAllFields(&all_fields_);
68     all_fields_.SerializeToString(&all_fields_data_);
69     ASSERT_TRUE(empty_message_.ParseFromString(all_fields_data_));
70     unknown_fields_ = empty_message_.mutable_unknown_fields();
71   }
72 
GetField(const std::string & name)73   const UnknownField* GetField(const std::string& name) {
74     const FieldDescriptor* field = descriptor_->FindFieldByName(name);
75     if (field == nullptr) return nullptr;
76     for (int i = 0; i < unknown_fields_->field_count(); i++) {
77       if (unknown_fields_->field(i).number() == field->number()) {
78         return &unknown_fields_->field(i);
79       }
80     }
81     return nullptr;
82   }
83 
84   // Constructs a protocol buffer which contains fields with all the same
85   // numbers as all_fields_data_ except that each field is some other wire
86   // type.
GetBizarroData()87   std::string GetBizarroData() {
88     unittest::TestEmptyMessage bizarro_message;
89     UnknownFieldSet* bizarro_unknown_fields =
90         bizarro_message.mutable_unknown_fields();
91     for (int i = 0; i < unknown_fields_->field_count(); i++) {
92       const UnknownField& unknown_field = unknown_fields_->field(i);
93       if (unknown_field.type() == UnknownField::TYPE_VARINT) {
94         bizarro_unknown_fields->AddFixed32(unknown_field.number(), 1);
95       } else {
96         bizarro_unknown_fields->AddVarint(unknown_field.number(), 1);
97       }
98     }
99 
100     std::string data;
101     EXPECT_TRUE(bizarro_message.SerializeToString(&data));
102     return data;
103   }
104 
105   const Descriptor* descriptor_;
106   unittest::TestAllTypes all_fields_;
107   std::string all_fields_data_;
108 
109   // An empty message that has been parsed from all_fields_data_.  So, it has
110   // unknown fields of every type.
111   unittest::TestEmptyMessage empty_message_;
112   UnknownFieldSet* unknown_fields_;
113 };
114 
115 namespace {
116 
TEST_F(UnknownFieldSetTest,AllFieldsPresent)117 TEST_F(UnknownFieldSetTest, AllFieldsPresent) {
118   // Verifies the following:
119   // --all unknown tags belong to TestAllTypes.
120   // --all fields in TestAllTypes is present in UnknownFieldSet except unset
121   //   oneof fields.
122   //
123   // Should handle repeated fields that may appear multiple times in
124   // UnknownFieldSet.
125 
126   int non_oneof_count = 0;
127   for (int i = 0; i < descriptor_->field_count(); i++) {
128     if (!descriptor_->field(i)->containing_oneof()) {
129       non_oneof_count++;
130     }
131   }
132 
133   absl::flat_hash_set<uint32_t> unknown_tags;
134   for (int i = 0; i < unknown_fields_->field_count(); i++) {
135     unknown_tags.insert(unknown_fields_->field(i).number());
136   }
137 
138   for (uint32_t t : unknown_tags) {
139     EXPECT_NE(descriptor_->FindFieldByNumber(t), nullptr);
140   }
141 
142   EXPECT_EQ(non_oneof_count + descriptor_->oneof_decl_count(),
143             unknown_tags.size());
144 }
145 
TEST_F(UnknownFieldSetTest,Varint)146 TEST_F(UnknownFieldSetTest, Varint) {
147   const UnknownField* field = GetField("optional_int32");
148   ASSERT_TRUE(field != nullptr);
149 
150   ASSERT_EQ(UnknownField::TYPE_VARINT, field->type());
151   EXPECT_EQ(all_fields_.optional_int32(), field->varint());
152 }
153 
TEST_F(UnknownFieldSetTest,Fixed32)154 TEST_F(UnknownFieldSetTest, Fixed32) {
155   const UnknownField* field = GetField("optional_fixed32");
156   ASSERT_TRUE(field != nullptr);
157 
158   ASSERT_EQ(UnknownField::TYPE_FIXED32, field->type());
159   EXPECT_EQ(all_fields_.optional_fixed32(), field->fixed32());
160 }
161 
TEST_F(UnknownFieldSetTest,Fixed64)162 TEST_F(UnknownFieldSetTest, Fixed64) {
163   const UnknownField* field = GetField("optional_fixed64");
164   ASSERT_TRUE(field != nullptr);
165 
166   ASSERT_EQ(UnknownField::TYPE_FIXED64, field->type());
167   EXPECT_EQ(all_fields_.optional_fixed64(), field->fixed64());
168 }
169 
TEST_F(UnknownFieldSetTest,LengthDelimited)170 TEST_F(UnknownFieldSetTest, LengthDelimited) {
171   const UnknownField* field = GetField("optional_string");
172   ASSERT_TRUE(field != nullptr);
173 
174   ASSERT_EQ(UnknownField::TYPE_LENGTH_DELIMITED, field->type());
175   EXPECT_EQ(all_fields_.optional_string(), field->length_delimited());
176 }
177 
TEST_F(UnknownFieldSetTest,Group)178 TEST_F(UnknownFieldSetTest, Group) {
179   const UnknownField* field = GetField("optionalgroup");
180   ASSERT_TRUE(field != nullptr);
181 
182   ASSERT_EQ(UnknownField::TYPE_GROUP, field->type());
183   ASSERT_EQ(1, field->group().field_count());
184 
185   const UnknownField& nested_field = field->group().field(0);
186   const FieldDescriptor* nested_field_descriptor =
187       unittest::TestAllTypes::OptionalGroup::descriptor()->FindFieldByName("a");
188   ASSERT_TRUE(nested_field_descriptor != nullptr);
189 
190   EXPECT_EQ(nested_field_descriptor->number(), nested_field.number());
191   ASSERT_EQ(UnknownField::TYPE_VARINT, nested_field.type());
192   EXPECT_EQ(all_fields_.optionalgroup().a(), nested_field.varint());
193 }
194 
PopulateUFS(UnknownFieldSet & set)195 static void PopulateUFS(UnknownFieldSet& set) {
196   UnknownFieldSet* node = &set;
197   for (int i = 0; i < 3; ++i) {
198     node->AddVarint(1, 100);
199     const char* long_str = "This is a very long string, not sso";
200     node->AddLengthDelimited(2, long_str);
201     node->AddLengthDelimited(2, std::string(long_str));
202     node->AddLengthDelimited(2, absl::Cord(long_str));
203     *internal::UnknownFieldSetTestPeer::AddLengthDelimited(*node, 3) = long_str;
204     // Test some recursion too.
205     node = node->AddGroup(4);
206   }
207 }
208 
TEST_F(UnknownFieldSetTest,ArenaSupportWorksWithMergeFrom)209 TEST_F(UnknownFieldSetTest, ArenaSupportWorksWithMergeFrom) {
210   Arena arena;
211 
212   for (bool lhs_arena : {false, true}) {
213     for (bool rhs_arena : {false, true}) {
214       UnknownFieldSet lhs_stack, rhs_stack;
215       auto& lhs =
216           lhs_arena ? *Arena::Create<UnknownFieldSet>(&arena) : lhs_stack;
217       auto& rhs =
218           rhs_arena ? *Arena::Create<UnknownFieldSet>(&arena) : rhs_stack;
219       PopulateUFS(rhs);
220       lhs.MergeFrom(rhs);
221     }
222   }
223 }
224 
TEST_F(UnknownFieldSetTest,ArenaSupportWorksWithMergeAndDestroy)225 TEST_F(UnknownFieldSetTest, ArenaSupportWorksWithMergeAndDestroy) {
226   Arena arena;
227 
228   for (bool lhs_arena : {false, true}) {
229     for (bool populate_lhs : {false, true}) {
230       for (bool rhs_arena : {false, true}) {
231         for (bool populate_rhs : {false, true}) {
232           UnknownFieldSet lhs_stack, rhs_stack;
233           auto& lhs =
234               lhs_arena ? *Arena::Create<UnknownFieldSet>(&arena) : lhs_stack;
235           auto& rhs =
236               rhs_arena ? *Arena::Create<UnknownFieldSet>(&arena) : rhs_stack;
237           if (populate_lhs) PopulateUFS(lhs);
238           if (populate_rhs) PopulateUFS(rhs);
239           lhs.MergeFromAndDestroy(&rhs);
240         }
241       }
242     }
243   }
244 }
245 
TEST_F(UnknownFieldSetTest,ArenaSupportWorksWithSwap)246 TEST_F(UnknownFieldSetTest, ArenaSupportWorksWithSwap) {
247   Arena arena;
248 
249   for (bool lhs_arena : {false, true}) {
250     for (bool rhs_arena : {false, true}) {
251       UnknownFieldSet lhs_stack, rhs_stack;
252       auto& lhs =
253           lhs_arena ? *Arena::Create<UnknownFieldSet>(&arena) : lhs_stack;
254       auto& rhs =
255           rhs_arena ? *Arena::Create<UnknownFieldSet>(&arena) : rhs_stack;
256       PopulateUFS(lhs);
257       lhs.Swap(&rhs);
258     }
259   }
260 }
261 
TEST_F(UnknownFieldSetTest,ArenaSupportWorksWithClear)262 TEST_F(UnknownFieldSetTest, ArenaSupportWorksWithClear) {
263   Arena arena;
264   auto* ufs = Arena::Create<UnknownFieldSet>(&arena);
265   PopulateUFS(*ufs);
266   // Clear should not try to delete memory from the arena.
267   ufs->Clear();
268 }
269 
TEST_F(UnknownFieldSetTest,ArenaSupportWorksDelete)270 TEST_F(UnknownFieldSetTest, ArenaSupportWorksDelete) {
271   Arena arena;
272 
273   auto* ufs = Arena::Create<UnknownFieldSet>(&arena);
274   PopulateUFS(*ufs);
275 
276   while (ufs->field_count() != 0) {
277     ufs->DeleteByNumber(ufs->field(0).number());
278   }
279 
280   ufs = Arena::Create<UnknownFieldSet>(&arena);
281   PopulateUFS(*ufs);
282   ufs->DeleteSubrange(0, ufs->field_count());
283 }
284 
TEST_F(UnknownFieldSetTest,SerializeFastAndSlowAreEquivalent)285 TEST_F(UnknownFieldSetTest, SerializeFastAndSlowAreEquivalent) {
286   int size =
287       WireFormat::ComputeUnknownFieldsSize(empty_message_.unknown_fields());
288   std::string slow_buffer;
289   std::string fast_buffer;
290   slow_buffer.resize(size);
291   fast_buffer.resize(size);
292 
293   uint8_t* target = reinterpret_cast<uint8_t*>(&fast_buffer[0]);
294   uint8_t* result = WireFormat::SerializeUnknownFieldsToArray(
295       empty_message_.unknown_fields(), target);
296   EXPECT_EQ(size, result - target);
297 
298   {
299     io::ArrayOutputStream raw_stream(&slow_buffer[0], size, 1);
300     io::CodedOutputStream output_stream(&raw_stream);
301     WireFormat::SerializeUnknownFields(empty_message_.unknown_fields(),
302                                        &output_stream);
303     ASSERT_FALSE(output_stream.HadError());
304   }
305   EXPECT_TRUE(fast_buffer == slow_buffer);
306 }
307 
TEST_F(UnknownFieldSetTest,Serialize)308 TEST_F(UnknownFieldSetTest, Serialize) {
309   // Check that serializing the UnknownFieldSet produces the original data
310   // again.
311 
312   std::string data;
313   empty_message_.SerializeToString(&data);
314 
315   // Don't use EXPECT_EQ because we don't want to dump raw binary data to
316   // stdout.
317   EXPECT_TRUE(data == all_fields_data_);
318 }
319 
TEST_F(UnknownFieldSetTest,ParseViaReflection)320 TEST_F(UnknownFieldSetTest, ParseViaReflection) {
321   // Make sure fields are properly parsed to the UnknownFieldSet when parsing
322   // via reflection.
323 
324   unittest::TestEmptyMessage message;
325   io::ArrayInputStream raw_input(all_fields_data_.data(),
326                                  all_fields_data_.size());
327   io::CodedInputStream input(&raw_input);
328   ASSERT_TRUE(WireFormat::ParseAndMergePartial(&input, &message));
329 
330   EXPECT_EQ(message.DebugString(), empty_message_.DebugString());
331 }
332 
TEST_F(UnknownFieldSetTest,SerializeViaReflection)333 TEST_F(UnknownFieldSetTest, SerializeViaReflection) {
334   // Make sure fields are properly written from the UnknownFieldSet when
335   // serializing via reflection.
336 
337   std::string data;
338 
339   {
340     io::StringOutputStream raw_output(&data);
341     io::CodedOutputStream output(&raw_output);
342     size_t size = WireFormat::ByteSize(empty_message_);
343     WireFormat::SerializeWithCachedSizes(empty_message_, size, &output);
344     ASSERT_FALSE(output.HadError());
345   }
346 
347   // Don't use EXPECT_EQ because we don't want to dump raw binary data to
348   // stdout.
349   EXPECT_TRUE(data == all_fields_data_);
350 }
351 
TEST_F(UnknownFieldSetTest,CopyFrom)352 TEST_F(UnknownFieldSetTest, CopyFrom) {
353   unittest::TestEmptyMessage message;
354 
355   message.CopyFrom(empty_message_);
356 
357   EXPECT_EQ(empty_message_.DebugString(), message.DebugString());
358 }
359 
TEST_F(UnknownFieldSetTest,Swap)360 TEST_F(UnknownFieldSetTest, Swap) {
361   unittest::TestEmptyMessage other_message;
362   ASSERT_TRUE(other_message.ParseFromString(GetBizarroData()));
363 
364   EXPECT_GT(empty_message_.unknown_fields().field_count(), 0);
365   EXPECT_GT(other_message.unknown_fields().field_count(), 0);
366   const std::string debug_string = empty_message_.DebugString();
367   const std::string other_debug_string = other_message.DebugString();
368   EXPECT_NE(debug_string, other_debug_string);
369 
370   empty_message_.Swap(&other_message);
371   EXPECT_EQ(debug_string, other_message.DebugString());
372   EXPECT_EQ(other_debug_string, empty_message_.DebugString());
373 }
374 
TEST_F(UnknownFieldSetTest,SwapWithSelf)375 TEST_F(UnknownFieldSetTest, SwapWithSelf) {
376   const std::string debug_string = empty_message_.DebugString();
377   EXPECT_GT(empty_message_.unknown_fields().field_count(), 0);
378 
379   empty_message_.Swap(&empty_message_);
380   EXPECT_GT(empty_message_.unknown_fields().field_count(), 0);
381   EXPECT_EQ(debug_string, empty_message_.DebugString());
382 }
383 
TEST_F(UnknownFieldSetTest,MergeFrom)384 TEST_F(UnknownFieldSetTest, MergeFrom) {
385   unittest::TestEmptyMessage source, destination;
386 
387   destination.mutable_unknown_fields()->AddVarint(1, 1);
388   destination.mutable_unknown_fields()->AddVarint(3, 2);
389   source.mutable_unknown_fields()->AddVarint(2, 3);
390   source.mutable_unknown_fields()->AddVarint(3, 4);
391 
392   destination.MergeFrom(source);
393 
394   std::string destination_text;
395   TextFormat::PrintToString(destination, &destination_text);
396   EXPECT_EQ(
397       // Note:  The ordering of fields here depends on the ordering of adds
398       //   and merging, above.
399       "1: 1\n"
400       "3: 2\n"
401       "2: 3\n"
402       "3: 4\n",
403       destination_text);
404 }
405 
TEST_F(UnknownFieldSetTest,MergeFromMessage)406 TEST_F(UnknownFieldSetTest, MergeFromMessage) {
407   unittest::TestEmptyMessage source, destination;
408 
409   destination.mutable_unknown_fields()->AddVarint(1, 1);
410   destination.mutable_unknown_fields()->AddVarint(3, 2);
411   source.mutable_unknown_fields()->AddVarint(2, 3);
412   source.mutable_unknown_fields()->AddVarint(3, 4);
413 
414   destination.mutable_unknown_fields()->MergeFromMessage(source);
415 
416   std::string destination_text;
417   TextFormat::PrintToString(destination, &destination_text);
418   EXPECT_EQ(
419       // Note:  The ordering of fields here depends on the ordering of adds
420       //   and merging, above.
421       "1: 1\n"
422       "3: 2\n"
423       "2: 3\n"
424       "3: 4\n",
425       destination_text);
426 }
427 
TEST_F(UnknownFieldSetTest,MergeFromMessageLite)428 TEST_F(UnknownFieldSetTest, MergeFromMessageLite) {
429   unittest::TestAllTypesLite source;
430   unittest::TestEmptyMessageLite destination;
431 
432   source.set_optional_fixed32(42);
433   destination.ParseFromString(source.SerializeAsString());
434 
435   UnknownFieldSet unknown_field_set;
436   EXPECT_TRUE(unknown_field_set.MergeFromMessage(destination));
437   EXPECT_EQ(unknown_field_set.field_count(), 1);
438 
439   const UnknownField& unknown_field = unknown_field_set.field(0);
440   EXPECT_EQ(unknown_field.number(), 7);
441   EXPECT_EQ(unknown_field.fixed32(), 42);
442 }
443 
TEST_F(UnknownFieldSetTest,Clear)444 TEST_F(UnknownFieldSetTest, Clear) {
445   // Clear the set.
446   empty_message_.Clear();
447   EXPECT_EQ(0, unknown_fields_->field_count());
448 }
449 
TEST_F(UnknownFieldSetTest,ClearAndFreeMemory)450 TEST_F(UnknownFieldSetTest, ClearAndFreeMemory) {
451   EXPECT_GT(unknown_fields_->field_count(), 0);
452   unknown_fields_->ClearAndFreeMemory();
453   EXPECT_EQ(0, unknown_fields_->field_count());
454   unknown_fields_->AddVarint(123456, 654321);
455   EXPECT_EQ(1, unknown_fields_->field_count());
456 }
457 
TEST_F(UnknownFieldSetTest,ParseKnownAndUnknown)458 TEST_F(UnknownFieldSetTest, ParseKnownAndUnknown) {
459   // Test mixing known and unknown fields when parsing.
460 
461   unittest::TestEmptyMessage source;
462   source.mutable_unknown_fields()->AddVarint(123456, 654321);
463   std::string data;
464   ASSERT_TRUE(source.SerializeToString(&data));
465 
466   unittest::TestAllTypes destination;
467   ASSERT_TRUE(destination.ParseFromString(all_fields_data_ + data));
468 
469   TestUtil::ExpectAllFieldsSet(destination);
470   ASSERT_EQ(1, destination.unknown_fields().field_count());
471   ASSERT_EQ(UnknownField::TYPE_VARINT,
472             destination.unknown_fields().field(0).type());
473   EXPECT_EQ(654321, destination.unknown_fields().field(0).varint());
474 }
475 
TEST_F(UnknownFieldSetTest,WrongTypeTreatedAsUnknown)476 TEST_F(UnknownFieldSetTest, WrongTypeTreatedAsUnknown) {
477   // Test that fields of the wrong wire type are treated like unknown fields
478   // when parsing.
479 
480   unittest::TestAllTypes all_types_message;
481   unittest::TestEmptyMessage empty_message;
482   std::string bizarro_data = GetBizarroData();
483   ASSERT_TRUE(all_types_message.ParseFromString(bizarro_data));
484   ASSERT_TRUE(empty_message.ParseFromString(bizarro_data));
485 
486   // All fields should have been interpreted as unknown, so the debug strings
487   // should be the same.
488   EXPECT_EQ(empty_message.DebugString(), all_types_message.DebugString());
489 }
490 
TEST_F(UnknownFieldSetTest,WrongTypeTreatedAsUnknownViaReflection)491 TEST_F(UnknownFieldSetTest, WrongTypeTreatedAsUnknownViaReflection) {
492   // Same as WrongTypeTreatedAsUnknown but via the reflection interface.
493 
494   unittest::TestAllTypes all_types_message;
495   unittest::TestEmptyMessage empty_message;
496   std::string bizarro_data = GetBizarroData();
497   io::ArrayInputStream raw_input(bizarro_data.data(), bizarro_data.size());
498   io::CodedInputStream input(&raw_input);
499   ASSERT_TRUE(WireFormat::ParseAndMergePartial(&input, &all_types_message));
500   ASSERT_TRUE(empty_message.ParseFromString(bizarro_data));
501 
502   EXPECT_EQ(empty_message.DebugString(), all_types_message.DebugString());
503 }
504 
TEST_F(UnknownFieldSetTest,UnknownExtensions)505 TEST_F(UnknownFieldSetTest, UnknownExtensions) {
506   // Make sure fields are properly parsed to the UnknownFieldSet even when
507   // they are declared as extension numbers.
508 
509   unittest::TestEmptyMessageWithExtensions message;
510   ASSERT_TRUE(message.ParseFromString(all_fields_data_));
511 
512   EXPECT_EQ(message.DebugString(), empty_message_.DebugString());
513 }
514 
TEST_F(UnknownFieldSetTest,UnknownExtensionsReflection)515 TEST_F(UnknownFieldSetTest, UnknownExtensionsReflection) {
516   // Same as UnknownExtensions except parsing via reflection.
517 
518   unittest::TestEmptyMessageWithExtensions message;
519   io::ArrayInputStream raw_input(all_fields_data_.data(),
520                                  all_fields_data_.size());
521   io::CodedInputStream input(&raw_input);
522   ASSERT_TRUE(WireFormat::ParseAndMergePartial(&input, &message));
523 
524   EXPECT_EQ(message.DebugString(), empty_message_.DebugString());
525 }
526 
TEST_F(UnknownFieldSetTest,WrongExtensionTypeTreatedAsUnknown)527 TEST_F(UnknownFieldSetTest, WrongExtensionTypeTreatedAsUnknown) {
528   // Test that fields of the wrong wire type are treated like unknown fields
529   // when parsing extensions.
530 
531   unittest::TestAllExtensions all_extensions_message;
532   unittest::TestEmptyMessage empty_message;
533   std::string bizarro_data = GetBizarroData();
534   ASSERT_TRUE(all_extensions_message.ParseFromString(bizarro_data));
535   ASSERT_TRUE(empty_message.ParseFromString(bizarro_data));
536 
537   // All fields should have been interpreted as unknown, so the debug strings
538   // should be the same.
539   EXPECT_EQ(empty_message.DebugString(), all_extensions_message.DebugString());
540 }
541 
TEST_F(UnknownFieldSetTest,UnknownEnumValue)542 TEST_F(UnknownFieldSetTest, UnknownEnumValue) {
543   using unittest::TestAllExtensions;
544   using unittest::TestAllTypes;
545   using unittest::TestEmptyMessage;
546 
547   const FieldDescriptor* singular_field =
548       TestAllTypes::descriptor()->FindFieldByName("optional_nested_enum");
549   const FieldDescriptor* repeated_field =
550       TestAllTypes::descriptor()->FindFieldByName("repeated_nested_enum");
551   ASSERT_TRUE(singular_field != nullptr);
552   ASSERT_TRUE(repeated_field != nullptr);
553 
554   std::string data;
555 
556   {
557     TestEmptyMessage empty_message;
558     UnknownFieldSet* unknown_fields = empty_message.mutable_unknown_fields();
559     unknown_fields->AddVarint(singular_field->number(), TestAllTypes::BAR);
560     unknown_fields->AddVarint(singular_field->number(), 5);  // not valid
561     unknown_fields->AddVarint(repeated_field->number(), TestAllTypes::FOO);
562     unknown_fields->AddVarint(repeated_field->number(), 4);  // not valid
563     unknown_fields->AddVarint(repeated_field->number(), TestAllTypes::BAZ);
564     unknown_fields->AddVarint(repeated_field->number(), 6);  // not valid
565     empty_message.SerializeToString(&data);
566   }
567 
568   {
569     TestAllTypes message;
570     ASSERT_TRUE(message.ParseFromString(data));
571     EXPECT_EQ(TestAllTypes::BAR, message.optional_nested_enum());
572     ASSERT_EQ(2, message.repeated_nested_enum_size());
573     EXPECT_EQ(TestAllTypes::FOO, message.repeated_nested_enum(0));
574     EXPECT_EQ(TestAllTypes::BAZ, message.repeated_nested_enum(1));
575 
576     const UnknownFieldSet& unknown_fields = message.unknown_fields();
577     ASSERT_EQ(3, unknown_fields.field_count());
578 
579     EXPECT_EQ(singular_field->number(), unknown_fields.field(0).number());
580     ASSERT_EQ(UnknownField::TYPE_VARINT, unknown_fields.field(0).type());
581     EXPECT_EQ(5, unknown_fields.field(0).varint());
582 
583     EXPECT_EQ(repeated_field->number(), unknown_fields.field(1).number());
584     ASSERT_EQ(UnknownField::TYPE_VARINT, unknown_fields.field(1).type());
585     EXPECT_EQ(4, unknown_fields.field(1).varint());
586 
587     EXPECT_EQ(repeated_field->number(), unknown_fields.field(2).number());
588     ASSERT_EQ(UnknownField::TYPE_VARINT, unknown_fields.field(2).type());
589     EXPECT_EQ(6, unknown_fields.field(2).varint());
590   }
591 
592   {
593     using unittest::optional_nested_enum_extension;
594     using unittest::repeated_nested_enum_extension;
595 
596     TestAllExtensions message;
597     ASSERT_TRUE(message.ParseFromString(data));
598     EXPECT_EQ(TestAllTypes::BAR,
599               message.GetExtension(optional_nested_enum_extension));
600     ASSERT_EQ(2, message.ExtensionSize(repeated_nested_enum_extension));
601     EXPECT_EQ(TestAllTypes::FOO,
602               message.GetExtension(repeated_nested_enum_extension, 0));
603     EXPECT_EQ(TestAllTypes::BAZ,
604               message.GetExtension(repeated_nested_enum_extension, 1));
605 
606     const UnknownFieldSet& unknown_fields = message.unknown_fields();
607     ASSERT_EQ(3, unknown_fields.field_count());
608 
609     EXPECT_EQ(singular_field->number(), unknown_fields.field(0).number());
610     ASSERT_EQ(UnknownField::TYPE_VARINT, unknown_fields.field(0).type());
611     EXPECT_EQ(5, unknown_fields.field(0).varint());
612 
613     EXPECT_EQ(repeated_field->number(), unknown_fields.field(1).number());
614     ASSERT_EQ(UnknownField::TYPE_VARINT, unknown_fields.field(1).type());
615     EXPECT_EQ(4, unknown_fields.field(1).varint());
616 
617     EXPECT_EQ(repeated_field->number(), unknown_fields.field(2).number());
618     ASSERT_EQ(UnknownField::TYPE_VARINT, unknown_fields.field(2).type());
619     EXPECT_EQ(6, unknown_fields.field(2).varint());
620   }
621 }
622 
TEST_F(UnknownFieldSetTest,SpaceUsedExcludingSelf)623 TEST_F(UnknownFieldSetTest, SpaceUsedExcludingSelf) {
624   UnknownFieldSet empty;
625   empty.AddVarint(1, 0);
626   RepeatedField<UnknownField> rep;
627   rep.Add();
628   EXPECT_EQ(rep.SpaceUsedExcludingSelf(), empty.SpaceUsedExcludingSelf());
629 }
630 
TEST_F(UnknownFieldSetTest,SpaceUsed)631 TEST_F(UnknownFieldSetTest, SpaceUsed) {
632   // Keep shadow vectors to avoid making assumptions about its capacity growth.
633   // We imitate the push back calls here to determine the expected capacity.
634   RepeatedField<UnknownField> shadow_vector, shadow_vector_group;
635   unittest::TestEmptyMessage empty_message;
636 
637   // Make sure an unknown field set has zero space used until a field is
638   // actually added.
639   const size_t base = empty_message.SpaceUsedLong();
640   std::string* str = nullptr;
641   UnknownFieldSet* group = nullptr;
642   const auto total = [&] {
643     size_t result = base;
644     result += shadow_vector.SpaceUsedExcludingSelfLong();
645     result += shadow_vector_group.SpaceUsedExcludingSelfLong();
646     if (str != nullptr) {
647       result += sizeof(std::string);
648       static const size_t sso_capacity = std::string().capacity();
649       if (str->capacity() > sso_capacity) result += str->capacity();
650     }
651     if (group != nullptr) {
652       result += sizeof(UnknownFieldSet);
653     }
654     return result;
655   };
656 
657   UnknownFieldSet* unknown_fields = empty_message.mutable_unknown_fields();
658   EXPECT_EQ(total(), empty_message.SpaceUsedLong());
659 
660   // Make sure each thing we add to the set increases the SpaceUsedLong().
661   unknown_fields->AddVarint(1, 0);
662   shadow_vector.Add();
663   EXPECT_EQ(total(), empty_message.SpaceUsedLong()) << "Var";
664 
665   str =
666       internal::UnknownFieldSetTestPeer::AddLengthDelimited(*unknown_fields, 1);
667   shadow_vector.Add();
668   EXPECT_EQ(total(), empty_message.SpaceUsedLong()) << "Str";
669 
670   str->assign(sizeof(std::string) + 1, 'x');
671   EXPECT_EQ(total(), empty_message.SpaceUsedLong()) << "Str2";
672 
673   group = unknown_fields->AddGroup(1);
674   shadow_vector.Add();
675   EXPECT_EQ(total(), empty_message.SpaceUsedLong()) << "Group";
676 
677   group->AddVarint(1, 0);
678   shadow_vector_group.Add();
679   EXPECT_EQ(total(), empty_message.SpaceUsedLong()) << "Group2";
680 
681   unknown_fields->AddVarint(1, 0);
682   shadow_vector.Add();
683   EXPECT_EQ(total(), empty_message.SpaceUsedLong()) << "Var2";
684 }
685 
TEST_F(UnknownFieldSetTest,Empty)686 TEST_F(UnknownFieldSetTest, Empty) {
687   UnknownFieldSet unknown_fields;
688   EXPECT_TRUE(unknown_fields.empty());
689   unknown_fields.AddVarint(6, 123);
690   EXPECT_FALSE(unknown_fields.empty());
691   unknown_fields.Clear();
692   EXPECT_TRUE(unknown_fields.empty());
693 }
694 
TEST_F(UnknownFieldSetTest,DeleteSubrange)695 TEST_F(UnknownFieldSetTest, DeleteSubrange) {
696   // Exhaustively test the deletion of every possible subrange in arrays of all
697   // sizes from 0 through 9.
698   for (int size = 0; size < 10; ++size) {
699     for (int num = 0; num <= size; ++num) {
700       for (int start = 0; start < size - num; ++start) {
701         // Create a set with "size" fields.
702         UnknownFieldSet unknown;
703         for (int i = 0; i < size; ++i) {
704           unknown.AddFixed32(i, i);
705         }
706         // Delete the specified subrange.
707         unknown.DeleteSubrange(start, num);
708         // Make sure the resulting field values are still correct.
709         EXPECT_EQ(size - num, unknown.field_count());
710         for (int i = 0; i < unknown.field_count(); ++i) {
711           if (i < start) {
712             EXPECT_EQ(i, unknown.field(i).fixed32());
713           } else {
714             EXPECT_EQ(i + num, unknown.field(i).fixed32());
715           }
716         }
717       }
718     }
719   }
720 }
721 
CheckDeleteByNumber(const std::vector<int> & field_numbers,int deleted_number,const std::vector<int> & expected_field_numbers)722 void CheckDeleteByNumber(const std::vector<int>& field_numbers,
723                          int deleted_number,
724                          const std::vector<int>& expected_field_numbers) {
725   UnknownFieldSet unknown_fields;
726   for (int i = 0; i < field_numbers.size(); ++i) {
727     unknown_fields.AddFixed32(field_numbers[i], i);
728   }
729   unknown_fields.DeleteByNumber(deleted_number);
730   ASSERT_EQ(expected_field_numbers.size(), unknown_fields.field_count());
731   for (int i = 0; i < expected_field_numbers.size(); ++i) {
732     EXPECT_EQ(expected_field_numbers[i], unknown_fields.field(i).number());
733   }
734 }
735 
736 #define MAKE_VECTOR(x) std::vector<int>(x, x + ABSL_ARRAYSIZE(x))
TEST_F(UnknownFieldSetTest,DeleteByNumber)737 TEST_F(UnknownFieldSetTest, DeleteByNumber) {
738   CheckDeleteByNumber(std::vector<int>(), 1, std::vector<int>());
739   static const int kTestFieldNumbers1[] = {1, 2, 3};
740   static const int kFieldNumberToDelete1 = 1;
741   static const int kExpectedFieldNumbers1[] = {2, 3};
742   CheckDeleteByNumber(MAKE_VECTOR(kTestFieldNumbers1), kFieldNumberToDelete1,
743                       MAKE_VECTOR(kExpectedFieldNumbers1));
744   static const int kTestFieldNumbers2[] = {1, 2, 3};
745   static const int kFieldNumberToDelete2 = 2;
746   static const int kExpectedFieldNumbers2[] = {1, 3};
747   CheckDeleteByNumber(MAKE_VECTOR(kTestFieldNumbers2), kFieldNumberToDelete2,
748                       MAKE_VECTOR(kExpectedFieldNumbers2));
749   static const int kTestFieldNumbers3[] = {1, 2, 3};
750   static const int kFieldNumberToDelete3 = 3;
751   static const int kExpectedFieldNumbers3[] = {1, 2};
752   CheckDeleteByNumber(MAKE_VECTOR(kTestFieldNumbers3), kFieldNumberToDelete3,
753                       MAKE_VECTOR(kExpectedFieldNumbers3));
754   static const int kTestFieldNumbers4[] = {1, 2, 1, 4, 1};
755   static const int kFieldNumberToDelete4 = 1;
756   static const int kExpectedFieldNumbers4[] = {2, 4};
757   CheckDeleteByNumber(MAKE_VECTOR(kTestFieldNumbers4), kFieldNumberToDelete4,
758                       MAKE_VECTOR(kExpectedFieldNumbers4));
759   static const int kTestFieldNumbers5[] = {1, 2, 3, 4, 5};
760   static const int kFieldNumberToDelete5 = 6;
761   static const int kExpectedFieldNumbers5[] = {1, 2, 3, 4, 5};
762   CheckDeleteByNumber(MAKE_VECTOR(kTestFieldNumbers5), kFieldNumberToDelete5,
763                       MAKE_VECTOR(kExpectedFieldNumbers5));
764 }
765 #undef MAKE_VECTOR
766 
TEST_F(UnknownFieldSetTest,SerializeToString)767 TEST_F(UnknownFieldSetTest, SerializeToString) {
768   UnknownFieldSet field_set;
769   field_set.AddVarint(3, 3);
770   field_set.AddVarint(4, 4);
771   field_set.AddVarint(1, -1);
772   field_set.AddVarint(2, -2);
773   field_set.AddLengthDelimited(44, "str");
774   field_set.AddLengthDelimited(44, std::string("byv"));
775   field_set.AddLengthDelimited(44,
776                                absl::Cord("this came from cord and is long"));
777   *internal::UnknownFieldSetTestPeer::AddLengthDelimited(field_set, 44) =
778       "0123456789";
779 
780   field_set.AddFixed32(7, 7);
781   field_set.AddFixed64(8, 8);
782 
783   UnknownFieldSet* group_field_set = field_set.AddGroup(46);
784   group_field_set->AddVarint(47, 1024);
785   group_field_set = field_set.AddGroup(46);
786   group_field_set->AddVarint(47, 2048);
787 
788   unittest::TestAllTypes message =
789       UnknownToProto<unittest::TestAllTypes>(field_set);
790 
791   EXPECT_EQ(message.optional_int32(), -1);
792   EXPECT_EQ(message.optional_int64(), -2);
793   EXPECT_EQ(message.optional_uint32(), 3);
794   EXPECT_EQ(message.optional_uint64(), 4);
795   EXPECT_EQ(message.optional_fixed32(), 7);
796   EXPECT_EQ(message.optional_fixed64(), 8);
797   EXPECT_THAT(message.repeated_string(),
798               ElementsAre("str", "byv", "this came from cord and is long",
799                           "0123456789"));
800   EXPECT_EQ(message.repeatedgroup(0).a(), 1024);
801   EXPECT_EQ(message.repeatedgroup(1).a(), 2048);
802 }
803 
TEST_F(UnknownFieldSetTest,SerializeToCodedStream_TestPackedTypes)804 TEST_F(UnknownFieldSetTest, SerializeToCodedStream_TestPackedTypes) {
805   UnknownFieldSet field_set;
806   field_set.AddVarint(90, -1);
807   field_set.AddVarint(90, -2);
808   field_set.AddVarint(90, -3);
809   field_set.AddVarint(90, -4);
810   field_set.AddVarint(93, 5);
811   field_set.AddVarint(93, 6);
812   field_set.AddVarint(93, 7);
813 
814   unittest::TestPackedTypes message;
815   std::string serialized_message;
816   {
817     io::StringOutputStream string_output(&serialized_message);
818     io::CodedOutputStream coded_output(&string_output);
819     ASSERT_TRUE(field_set.SerializeToCodedStream(&coded_output));
820   }
821   ASSERT_TRUE(message.ParseFromString(serialized_message));
822   EXPECT_THAT(message.packed_int32(), ElementsAre(-1, -2, -3, -4));
823   EXPECT_THAT(message.packed_uint64(), ElementsAre(5, 6, 7));
824 }
825 
TEST_F(UnknownFieldSetTest,SerializeToCord_TestPackedTypes)826 TEST_F(UnknownFieldSetTest, SerializeToCord_TestPackedTypes) {
827   UnknownFieldSet field_set;
828   field_set.AddVarint(90, -1);
829   field_set.AddVarint(90, -2);
830   field_set.AddVarint(90, -3);
831   field_set.AddVarint(90, -4);
832   field_set.AddVarint(93, 5);
833   field_set.AddVarint(93, 6);
834   field_set.AddVarint(93, 7);
835 
836   absl::Cord cord;
837   ASSERT_TRUE(field_set.SerializeToCord(&cord));
838 
839   unittest::TestPackedTypes message;
840   ASSERT_TRUE(message.ParseFromCord(cord));
841   EXPECT_THAT(message.packed_int32(), ElementsAre(-1, -2, -3, -4));
842   EXPECT_THAT(message.packed_uint64(), ElementsAre(5, 6, 7));
843 }
844 
TEST(UnknownFieldTest,SettersOverrideTheDataProperly)845 TEST(UnknownFieldTest, SettersOverrideTheDataProperly) {
846   using T = unittest::TestAllTypes;
847   UnknownFieldSet set;
848   set.AddVarint(T::kOptionalInt32FieldNumber, 2);
849   set.AddFixed32(T::kOptionalFixed32FieldNumber, 3);
850   set.AddFixed64(T::kOptionalFixed64FieldNumber, 4);
851   set.AddLengthDelimited(T::kOptionalStringFieldNumber, "5");
852 
853   T message = UnknownToProto<T>(set);
854 
855   EXPECT_EQ(message.optional_int32(), 2);
856   EXPECT_EQ(message.optional_fixed32(), 3);
857   EXPECT_EQ(message.optional_fixed64(), 4);
858   EXPECT_EQ(message.optional_string(), "5");
859 
860   set.mutable_field(0)->set_varint(22);
861   set.mutable_field(1)->set_fixed32(33);
862   set.mutable_field(2)->set_fixed64(44);
863   set.mutable_field(3)->set_length_delimited("55");
864 
865   message = UnknownToProto<T>(set);
866 
867   EXPECT_EQ(message.optional_int32(), 22);
868   EXPECT_EQ(message.optional_fixed32(), 33);
869   EXPECT_EQ(message.optional_fixed64(), 44);
870   EXPECT_EQ(message.optional_string(), "55");
871 
872   set.mutable_field(3)->set_length_delimited(std::string("555"));
873   message = UnknownToProto<T>(set);
874   EXPECT_EQ(message.optional_string(), "555");
875 
876   set.mutable_field(3)->set_length_delimited(absl::Cord("5555"));
877   message = UnknownToProto<T>(set);
878   EXPECT_EQ(message.optional_string(), "5555");
879 }
880 
881 }  // namespace
882 }  // namespace protobuf
883 }  // namespace google
884