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