• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// -*- c++ -*-
2// Protocol Buffers - Google's data interchange format
3// Copyright 2008 Google Inc.  All rights reserved.
4//
5// Use of this source code is governed by a BSD-style
6// license that can be found in the LICENSE file or at
7// https://developers.google.com/open-source/licenses/bsd
8
9// Author: kenton@google.com (Kenton Varda)
10//  Based on original Protocol Buffers design by
11//  Sanjay Ghemawat, Jeff Dean, and others.
12
13#include <cstdint>
14#include <memory>
15#include <string>
16#include <vector>
17
18#include "google/protobuf/descriptor.pb.h"
19#include <gmock/gmock.h>
20#include "google/protobuf/testing/googletest.h"
21#include <gtest/gtest.h>
22#include "absl/base/casts.h"
23#include "absl/log/absl_check.h"
24#include "absl/log/scoped_mock_log.h"
25#include "absl/strings/cord.h"
26#include "absl/strings/match.h"
27#include "google/protobuf/descriptor.h"
28#include "google/protobuf/dynamic_message.h"
29#include "google/protobuf/generated_message_tctable_impl.h"
30#include "google/protobuf/io/coded_stream.h"
31#include "google/protobuf/io/zero_copy_stream_impl.h"
32#include "google/protobuf/io/zero_copy_stream_impl_lite.h"
33#include "google/protobuf/test_util2.h"
34#include "google/protobuf/wire_format.h"
35#include "google/protobuf/wire_format_lite.h"
36
37// clang-format off
38#include "google/protobuf/port_def.inc"
39// clang-format on
40
41namespace google {
42namespace protobuf {
43namespace internal {
44namespace {
45
46inline bool IsOptimizeForCodeSize(const Descriptor* descriptor) {
47  return descriptor->file()->options().optimize_for() == FileOptions::CODE_SIZE;
48}
49
50TEST(WireFormatTest, EnumsInSync) {
51  // Verify that WireFormatLite::FieldType and WireFormatLite::CppType match
52  // FieldDescriptor::Type and FieldDescriptor::CppType.
53
54  EXPECT_EQ(absl::implicit_cast<int>(FieldDescriptor::MAX_TYPE),
55            absl::implicit_cast<int>(WireFormatLite::MAX_FIELD_TYPE));
56  EXPECT_EQ(absl::implicit_cast<int>(FieldDescriptor::MAX_CPPTYPE),
57            absl::implicit_cast<int>(WireFormatLite::MAX_CPPTYPE));
58
59  for (int i = 1; i <= WireFormatLite::MAX_FIELD_TYPE; i++) {
60    EXPECT_EQ(absl::implicit_cast<int>(FieldDescriptor::TypeToCppType(
61                  static_cast<FieldDescriptor::Type>(i))),
62              absl::implicit_cast<int>(WireFormatLite::FieldTypeToCppType(
63                  static_cast<WireFormatLite::FieldType>(i))));
64  }
65}
66
67TEST(WireFormatTest, MaxFieldNumber) {
68  // Make sure the max field number constant is accurate.
69  EXPECT_EQ((1 << (32 - WireFormatLite::kTagTypeBits)) - 1,
70            FieldDescriptor::kMaxNumber);
71}
72
73TEST(WireFormatTest, Parse) {
74  UNITTEST::TestAllTypes source, dest;
75  std::string data;
76
77  // Serialize using the generated code.
78  TestUtil::SetAllFields(&source);
79  source.SerializeToString(&data);
80
81  // Parse using WireFormat.
82  io::ArrayInputStream raw_input(data.data(), data.size());
83  io::CodedInputStream input(&raw_input);
84  WireFormat::ParseAndMergePartial(&input, &dest);
85
86  // Check.
87  TestUtil::ExpectAllFieldsSet(dest);
88}
89
90TEST(WireFormatTest, ParseExtensions) {
91  UNITTEST::TestAllExtensions source, dest;
92  std::string data;
93
94  // Serialize using the generated code.
95  TestUtil::SetAllExtensions(&source);
96  source.SerializeToString(&data);
97
98  // Parse using WireFormat.
99  io::ArrayInputStream raw_input(data.data(), data.size());
100  io::CodedInputStream input(&raw_input);
101  WireFormat::ParseAndMergePartial(&input, &dest);
102
103  // Check.
104  TestUtil::ExpectAllExtensionsSet(dest);
105}
106
107TEST(WireFormatTest, ParsePacked) {
108  UNITTEST::TestPackedTypes source, dest;
109  std::string data;
110
111  // Serialize using the generated code.
112  TestUtil::SetPackedFields(&source);
113  source.SerializeToString(&data);
114
115  // Parse using WireFormat.
116  io::ArrayInputStream raw_input(data.data(), data.size());
117  io::CodedInputStream input(&raw_input);
118  WireFormat::ParseAndMergePartial(&input, &dest);
119
120  // Check.
121  TestUtil::ExpectPackedFieldsSet(dest);
122}
123
124TEST(WireFormatTest, ParsePackedFromUnpacked) {
125  // Serialize using the generated code.
126  UNITTEST::TestUnpackedTypes source;
127  TestUtil::SetUnpackedFields(&source);
128  std::string data = source.SerializeAsString();
129
130  // Parse using WireFormat.
131  UNITTEST::TestPackedTypes dest;
132  io::ArrayInputStream raw_input(data.data(), data.size());
133  io::CodedInputStream input(&raw_input);
134  WireFormat::ParseAndMergePartial(&input, &dest);
135
136  // Check.
137  TestUtil::ExpectPackedFieldsSet(dest);
138}
139
140TEST(WireFormatTest, ParseUnpackedFromPacked) {
141  // Serialize using the generated code.
142  UNITTEST::TestPackedTypes source;
143  TestUtil::SetPackedFields(&source);
144  std::string data = source.SerializeAsString();
145
146  // Parse using WireFormat.
147  UNITTEST::TestUnpackedTypes dest;
148  io::ArrayInputStream raw_input(data.data(), data.size());
149  io::CodedInputStream input(&raw_input);
150  WireFormat::ParseAndMergePartial(&input, &dest);
151
152  // Check.
153  TestUtil::ExpectUnpackedFieldsSet(dest);
154}
155
156TEST(WireFormatTest, ParsePackedExtensions) {
157  UNITTEST::TestPackedExtensions source, dest;
158  std::string data;
159
160  // Serialize using the generated code.
161  TestUtil::SetPackedExtensions(&source);
162  source.SerializeToString(&data);
163
164  // Parse using WireFormat.
165  io::ArrayInputStream raw_input(data.data(), data.size());
166  io::CodedInputStream input(&raw_input);
167  WireFormat::ParseAndMergePartial(&input, &dest);
168
169  // Check.
170  TestUtil::ExpectPackedExtensionsSet(dest);
171}
172
173TEST(WireFormatTest, ParseOneof) {
174  UNITTEST::TestOneof2 source, dest;
175  std::string data;
176
177  // Serialize using the generated code.
178  TestUtil::SetOneof1(&source);
179  source.SerializeToString(&data);
180
181  // Parse using WireFormat.
182  io::ArrayInputStream raw_input(data.data(), data.size());
183  io::CodedInputStream input(&raw_input);
184  WireFormat::ParseAndMergePartial(&input, &dest);
185
186  // Check.
187  TestUtil::ExpectOneofSet1(dest);
188}
189
190TEST(WireFormatTest, OneofOnlySetLast) {
191  UNITTEST::TestOneofBackwardsCompatible source;
192  UNITTEST::TestOneof oneof_dest;
193  std::string data;
194
195  // Set two fields
196  source.set_foo_int(100);
197  source.set_foo_string("101");
198
199  // Serialize and parse to oneof message. Generated serializer may not order
200  // fields in tag order. Use WireFormat::SerializeWithCachedSizes instead as
201  // it sorts fields beforehand.
202  {
203    io::StringOutputStream raw_output(&data);
204    io::CodedOutputStream output(&raw_output);
205    WireFormat::SerializeWithCachedSizes(source, source.ByteSizeLong(),
206                                         &output);
207    ASSERT_FALSE(output.HadError());
208  }
209  io::ArrayInputStream raw_input(data.data(), data.size());
210  io::CodedInputStream input(&raw_input);
211  WireFormat::ParseAndMergePartial(&input, &oneof_dest);
212
213  // Only the last field is set.
214  EXPECT_FALSE(oneof_dest.has_foo_int());
215  EXPECT_TRUE(oneof_dest.has_foo_string());
216}
217
218TEST(WireFormatTest, ByteSize) {
219  UNITTEST::TestAllTypes message;
220  TestUtil::SetAllFields(&message);
221
222  EXPECT_EQ(message.ByteSizeLong(), WireFormat::ByteSize(message));
223  message.Clear();
224  EXPECT_EQ(0, message.ByteSizeLong());
225  EXPECT_EQ(0, WireFormat::ByteSize(message));
226}
227
228TEST(WireFormatTest, ByteSizeExtensions) {
229  UNITTEST::TestAllExtensions message;
230  TestUtil::SetAllExtensions(&message);
231
232  EXPECT_EQ(message.ByteSizeLong(), WireFormat::ByteSize(message));
233  message.Clear();
234  EXPECT_EQ(0, message.ByteSizeLong());
235  EXPECT_EQ(0, WireFormat::ByteSize(message));
236}
237
238TEST(WireFormatTest, ByteSizePacked) {
239  UNITTEST::TestPackedTypes message;
240  TestUtil::SetPackedFields(&message);
241
242  EXPECT_EQ(message.ByteSizeLong(), WireFormat::ByteSize(message));
243  message.Clear();
244  EXPECT_EQ(0, message.ByteSizeLong());
245  EXPECT_EQ(0, WireFormat::ByteSize(message));
246}
247
248TEST(WireFormatTest, ByteSizePackedExtensions) {
249  UNITTEST::TestPackedExtensions message;
250  TestUtil::SetPackedExtensions(&message);
251
252  EXPECT_EQ(message.ByteSizeLong(), WireFormat::ByteSize(message));
253  message.Clear();
254  EXPECT_EQ(0, message.ByteSizeLong());
255  EXPECT_EQ(0, WireFormat::ByteSize(message));
256}
257
258TEST(WireFormatTest, ByteSizeOneof) {
259  UNITTEST::TestOneof2 message;
260  TestUtil::SetOneof1(&message);
261
262  EXPECT_EQ(message.ByteSizeLong(), WireFormat::ByteSize(message));
263  message.Clear();
264
265  EXPECT_EQ(0, message.ByteSizeLong());
266  EXPECT_EQ(0, WireFormat::ByteSize(message));
267}
268
269TEST(WireFormatTest, Serialize) {
270  UNITTEST::TestAllTypes message;
271  std::string generated_data;
272  std::string dynamic_data;
273
274  TestUtil::SetAllFields(&message);
275  size_t size = message.ByteSizeLong();
276
277  // Serialize using the generated code.
278  {
279    io::StringOutputStream raw_output(&generated_data);
280    io::CodedOutputStream output(&raw_output);
281    message.SerializeWithCachedSizes(&output);
282    ASSERT_FALSE(output.HadError());
283  }
284
285  // Serialize using WireFormat.
286  {
287    io::StringOutputStream raw_output(&dynamic_data);
288    io::CodedOutputStream output(&raw_output);
289    WireFormat::SerializeWithCachedSizes(message, size, &output);
290    ASSERT_FALSE(output.HadError());
291  }
292
293  // Should parse to the same message.
294  EXPECT_TRUE(TestUtil::EqualsToSerialized(message, generated_data));
295  EXPECT_TRUE(TestUtil::EqualsToSerialized(message, dynamic_data));
296}
297
298TEST(WireFormatTest, SerializeExtensions) {
299  UNITTEST::TestAllExtensions message;
300  std::string generated_data;
301  std::string dynamic_data;
302
303  TestUtil::SetAllExtensions(&message);
304  size_t size = message.ByteSizeLong();
305
306  // Serialize using the generated code.
307  {
308    io::StringOutputStream raw_output(&generated_data);
309    io::CodedOutputStream output(&raw_output);
310    message.SerializeWithCachedSizes(&output);
311    ASSERT_FALSE(output.HadError());
312  }
313
314  // Serialize using WireFormat.
315  {
316    io::StringOutputStream raw_output(&dynamic_data);
317    io::CodedOutputStream output(&raw_output);
318    WireFormat::SerializeWithCachedSizes(message, size, &output);
319    ASSERT_FALSE(output.HadError());
320  }
321
322  // Should parse to the same message.
323  EXPECT_TRUE(TestUtil::EqualsToSerialized(message, generated_data));
324  EXPECT_TRUE(TestUtil::EqualsToSerialized(message, dynamic_data));
325}
326
327TEST(WireFormatTest, SerializeFieldsAndExtensions) {
328  UNITTEST::TestFieldOrderings message;
329  std::string generated_data;
330  std::string dynamic_data;
331
332  TestUtil::SetAllFieldsAndExtensions(&message);
333  size_t size = message.ByteSizeLong();
334
335  // Serialize using the generated code.
336  {
337    io::StringOutputStream raw_output(&generated_data);
338    io::CodedOutputStream output(&raw_output);
339    message.SerializeWithCachedSizes(&output);
340    ASSERT_FALSE(output.HadError());
341  }
342
343  // Serialize using WireFormat.
344  {
345    io::StringOutputStream raw_output(&dynamic_data);
346    io::CodedOutputStream output(&raw_output);
347    WireFormat::SerializeWithCachedSizes(message, size, &output);
348    ASSERT_FALSE(output.HadError());
349  }
350
351  // Should parse to the same message.
352  EXPECT_TRUE(TestUtil::EqualsToSerialized(message, generated_data));
353  EXPECT_TRUE(TestUtil::EqualsToSerialized(message, dynamic_data));
354}
355
356TEST(WireFormatTest, SerializeOneof) {
357  UNITTEST::TestOneof2 message;
358  std::string generated_data;
359  std::string dynamic_data;
360
361  TestUtil::SetOneof1(&message);
362  size_t size = message.ByteSizeLong();
363
364  // Serialize using the generated code.
365  {
366    io::StringOutputStream raw_output(&generated_data);
367    io::CodedOutputStream output(&raw_output);
368    message.SerializeWithCachedSizes(&output);
369    ASSERT_FALSE(output.HadError());
370  }
371
372  // Serialize using WireFormat.
373  {
374    io::StringOutputStream raw_output(&dynamic_data);
375    io::CodedOutputStream output(&raw_output);
376    WireFormat::SerializeWithCachedSizes(message, size, &output);
377    ASSERT_FALSE(output.HadError());
378  }
379
380  // Should parse to the same message.
381  EXPECT_TRUE(TestUtil::EqualsToSerialized(message, generated_data));
382  EXPECT_TRUE(TestUtil::EqualsToSerialized(message, dynamic_data));
383}
384
385TEST(WireFormatTest, ParseMultipleExtensionRanges) {
386  // Make sure we can parse a message that contains multiple extensions ranges.
387  UNITTEST::TestFieldOrderings source;
388  std::string data;
389
390  TestUtil::SetAllFieldsAndExtensions(&source);
391  source.SerializeToString(&data);
392
393  {
394    UNITTEST::TestFieldOrderings dest;
395    EXPECT_TRUE(dest.ParseFromString(data));
396    EXPECT_EQ(source.DebugString(), dest.DebugString());
397  }
398
399  // Also test using reflection-based parsing.
400  {
401    UNITTEST::TestFieldOrderings dest;
402    io::ArrayInputStream raw_input(data.data(), data.size());
403    io::CodedInputStream coded_input(&raw_input);
404    EXPECT_TRUE(WireFormat::ParseAndMergePartial(&coded_input, &dest));
405    EXPECT_EQ(source.DebugString(), dest.DebugString());
406  }
407}
408
409const int kUnknownTypeId = 1550055;
410
411TEST(WireFormatTest, SerializeMessageSet) {
412  // Set up a TestMessageSet with two known messages and an unknown one.
413  PROTO2_WIREFORMAT_UNITTEST::TestMessageSet message_set;
414  message_set
415      .MutableExtension(
416          UNITTEST::TestMessageSetExtension1::message_set_extension)
417      ->set_i(123);
418  message_set
419      .MutableExtension(
420          UNITTEST::TestMessageSetExtension2::message_set_extension)
421      ->set_str("foo");
422  message_set.mutable_unknown_fields()->AddLengthDelimited(kUnknownTypeId,
423                                                           "bar");
424
425  std::string data;
426  ASSERT_TRUE(message_set.SerializeToString(&data));
427
428  // Parse back using RawMessageSet and check the contents.
429  UNITTEST::RawMessageSet raw;
430  ASSERT_TRUE(raw.ParseFromString(data));
431
432  EXPECT_EQ(0, raw.unknown_fields().field_count());
433
434  ASSERT_EQ(3, raw.item_size());
435  EXPECT_EQ(
436      UNITTEST::TestMessageSetExtension1::descriptor()->extension(0)->number(),
437      raw.item(0).type_id());
438  EXPECT_EQ(
439      UNITTEST::TestMessageSetExtension2::descriptor()->extension(0)->number(),
440      raw.item(1).type_id());
441  EXPECT_EQ(kUnknownTypeId, raw.item(2).type_id());
442
443  UNITTEST::TestMessageSetExtension1 message1;
444  EXPECT_TRUE(message1.ParseFromString(raw.item(0).message()));
445  EXPECT_EQ(123, message1.i());
446
447  UNITTEST::TestMessageSetExtension2 message2;
448  EXPECT_TRUE(message2.ParseFromString(raw.item(1).message()));
449  EXPECT_EQ("foo", message2.str());
450
451  EXPECT_EQ("bar", raw.item(2).message());
452}
453
454TEST(WireFormatTest, SerializeMessageSetVariousWaysAreEqual) {
455  // Serialize a MessageSet to a stream and to a flat array using generated
456  // code, and also using WireFormat, and check that the results are equal.
457  // Set up a TestMessageSet with two known messages and an unknown one, as
458  // above.
459
460  PROTO2_WIREFORMAT_UNITTEST::TestMessageSet message_set;
461  message_set
462      .MutableExtension(
463          UNITTEST::TestMessageSetExtension1::message_set_extension)
464      ->set_i(123);
465  message_set
466      .MutableExtension(
467          UNITTEST::TestMessageSetExtension2::message_set_extension)
468      ->set_str("foo");
469  message_set.mutable_unknown_fields()->AddLengthDelimited(kUnknownTypeId,
470                                                           "bar");
471
472  size_t size = message_set.ByteSizeLong();
473  EXPECT_EQ(size, message_set.GetCachedSize());
474  ASSERT_EQ(size, WireFormat::ByteSize(message_set));
475
476  std::string flat_data;
477  std::string stream_data;
478  std::string dynamic_data;
479  flat_data.resize(size);
480  stream_data.resize(size);
481
482  // Serialize to flat array
483  {
484    uint8_t* target = reinterpret_cast<uint8_t*>(&flat_data[0]);
485    uint8_t* end = message_set.SerializeWithCachedSizesToArray(target);
486    EXPECT_EQ(size, end - target);
487  }
488
489  // Serialize to buffer
490  {
491    io::ArrayOutputStream array_stream(&stream_data[0], size, 1);
492    io::CodedOutputStream output_stream(&array_stream);
493    message_set.SerializeWithCachedSizes(&output_stream);
494    ASSERT_FALSE(output_stream.HadError());
495  }
496
497  // Serialize to buffer with WireFormat.
498  {
499    io::StringOutputStream string_stream(&dynamic_data);
500    io::CodedOutputStream output_stream(&string_stream);
501    WireFormat::SerializeWithCachedSizes(message_set, size, &output_stream);
502    ASSERT_FALSE(output_stream.HadError());
503  }
504
505  EXPECT_TRUE(flat_data == stream_data);
506  EXPECT_TRUE(flat_data == dynamic_data);
507}
508
509TEST(WireFormatTest, ParseMessageSet) {
510  // Set up a RawMessageSet with two known messages and an unknown one.
511  UNITTEST::RawMessageSet raw;
512
513  {
514    UNITTEST::RawMessageSet::Item* item = raw.add_item();
515    item->set_type_id(UNITTEST::TestMessageSetExtension1::descriptor()
516                          ->extension(0)
517                          ->number());
518    UNITTEST::TestMessageSetExtension1 message;
519    message.set_i(123);
520    message.SerializeToString(item->mutable_message());
521  }
522
523  {
524    UNITTEST::RawMessageSet::Item* item = raw.add_item();
525    item->set_type_id(UNITTEST::TestMessageSetExtension2::descriptor()
526                          ->extension(0)
527                          ->number());
528    UNITTEST::TestMessageSetExtension2 message;
529    message.set_str("foo");
530    message.SerializeToString(item->mutable_message());
531  }
532
533  {
534    UNITTEST::RawMessageSet::Item* item = raw.add_item();
535    item->set_type_id(kUnknownTypeId);
536    item->set_message("bar");
537  }
538
539  std::string data;
540  ASSERT_TRUE(raw.SerializeToString(&data));
541
542  // Parse as a TestMessageSet and check the contents.
543  PROTO2_WIREFORMAT_UNITTEST::TestMessageSet message_set;
544  ASSERT_TRUE(message_set.ParseFromString(data));
545
546  EXPECT_EQ(123,
547            message_set
548                .GetExtension(
549                    UNITTEST::TestMessageSetExtension1::message_set_extension)
550                .i());
551  EXPECT_EQ("foo",
552            message_set
553                .GetExtension(
554                    UNITTEST::TestMessageSetExtension2::message_set_extension)
555                .str());
556
557  ASSERT_EQ(1, message_set.unknown_fields().field_count());
558  ASSERT_EQ(UnknownField::TYPE_LENGTH_DELIMITED,
559            message_set.unknown_fields().field(0).type());
560  EXPECT_EQ("bar", message_set.unknown_fields().field(0).length_delimited());
561
562  // Also parse using WireFormat.
563  PROTO2_WIREFORMAT_UNITTEST::TestMessageSet dynamic_message_set;
564  io::CodedInputStream input(reinterpret_cast<const uint8_t*>(data.data()),
565                             data.size());
566  ASSERT_TRUE(WireFormat::ParseAndMergePartial(&input, &dynamic_message_set));
567  EXPECT_EQ(message_set.DebugString(), dynamic_message_set.DebugString());
568}
569
570TEST(WireFormatTest, MessageSetUnknownButValidTypeId) {
571  const char encoded[] = {
572      013,     // 1: SGROUP
573      032, 2,  // 3:LEN 2
574      010, 0,  // 1:0
575      020, 4,  // 2:4
576      014      // 1: EGROUP
577  };
578  PROTO2_WIREFORMAT_UNITTEST::TestMessageSet message;
579  EXPECT_TRUE(message.ParseFromArray(encoded, sizeof(encoded)));
580}
581
582TEST(WireFormatTest, MessageSetInvalidTypeId) {
583  // "type_id" is 0 and should fail to parse.
584  const char encoded[] = {
585      013,     // 1: SGROUP
586      032, 2,  // 3:LEN 2
587      010, 0,  // 1:0
588      020, 0,  // 2:0
589      014      // 1: EGROUP
590  };
591  PROTO2_WIREFORMAT_UNITTEST::TestMessageSet message;
592  EXPECT_FALSE(message.ParseFromArray(encoded, sizeof(encoded)));
593}
594
595TEST(WireFormatTest, MessageSetNonCanonInvalidTypeId) {
596  // "type_id" is 0 and should fail to parse. uint8_t is used to silence
597  // complaints about narrowing conversion.
598  const uint8_t encoded[] = {
599      013,                               // 1: SGROUP
600      032, 0,                            // 3:LEN 0
601      020, 0x80, 0x80, 0x80, 0x80, 020,  // 2: long-form:2 0
602      014                                // 1: EGROUP
603  };
604  PROTO2_WIREFORMAT_UNITTEST::TestMessageSet message;
605  EXPECT_FALSE(message.ParseFromArray(encoded, sizeof(encoded)));
606}
607
608namespace {
609std::string BuildMessageSetItemStart() {
610  std::string data;
611  {
612    io::StringOutputStream output_stream(&data);
613    io::CodedOutputStream coded_output(&output_stream);
614    coded_output.WriteTag(WireFormatLite::kMessageSetItemStartTag);
615  }
616  return data;
617}
618std::string BuildMessageSetItemEnd() {
619  std::string data;
620  {
621    io::StringOutputStream output_stream(&data);
622    io::CodedOutputStream coded_output(&output_stream);
623    coded_output.WriteTag(WireFormatLite::kMessageSetItemEndTag);
624  }
625  return data;
626}
627std::string BuildMessageSetTestExtension1(int value = 123) {
628  std::string data;
629  {
630    UNITTEST::TestMessageSetExtension1 message;
631    message.set_i(value);
632    io::StringOutputStream output_stream(&data);
633    io::CodedOutputStream coded_output(&output_stream);
634    // Write the message content first.
635    WireFormatLite::WriteTag(WireFormatLite::kMessageSetMessageNumber,
636                             WireFormatLite::WIRETYPE_LENGTH_DELIMITED,
637                             &coded_output);
638    coded_output.WriteVarint32(message.ByteSizeLong());
639    message.SerializeWithCachedSizes(&coded_output);
640  }
641  return data;
642}
643std::string BuildMessageSetItemTypeId(int extension_number) {
644  std::string data;
645  {
646    io::StringOutputStream output_stream(&data);
647    io::CodedOutputStream coded_output(&output_stream);
648    WireFormatLite::WriteUInt32(WireFormatLite::kMessageSetTypeIdNumber,
649                                extension_number, &coded_output);
650  }
651  return data;
652}
653void ValidateTestMessageSet(const std::string& test_case,
654                            const std::string& data) {
655  SCOPED_TRACE(test_case);
656  {
657    PROTO2_WIREFORMAT_UNITTEST::TestMessageSet message_set;
658    ASSERT_TRUE(message_set.ParseFromString(data));
659
660    EXPECT_EQ(123,
661              message_set
662                  .GetExtension(
663                      UNITTEST::TestMessageSetExtension1::message_set_extension)
664                  .i());
665
666    // Make sure it does not contain anything else.
667    message_set.ClearExtension(
668        UNITTEST::TestMessageSetExtension1::message_set_extension);
669    EXPECT_EQ(message_set.SerializeAsString(), "");
670  }
671  {
672    // Test parse the message via Reflection.
673    PROTO2_WIREFORMAT_UNITTEST::TestMessageSet message_set;
674    io::CodedInputStream input(reinterpret_cast<const uint8_t*>(data.data()),
675                               data.size());
676    EXPECT_TRUE(WireFormat::ParseAndMergePartial(&input, &message_set));
677    EXPECT_TRUE(input.ConsumedEntireMessage());
678
679    EXPECT_EQ(123,
680              message_set
681                  .GetExtension(
682                      UNITTEST::TestMessageSetExtension1::message_set_extension)
683                  .i());
684  }
685  {
686    // Test parse the message via DynamicMessage.
687    DynamicMessageFactory factory;
688    std::unique_ptr<Message> msg(
689        factory
690            .GetPrototype(
691                PROTO2_WIREFORMAT_UNITTEST::TestMessageSet::descriptor())
692            ->New());
693    msg->ParseFromString(data);
694    auto* reflection = msg->GetReflection();
695    std::vector<const FieldDescriptor*> fields;
696    reflection->ListFields(*msg, &fields);
697    ASSERT_EQ(fields.size(), 1);
698    const auto& sub = reflection->GetMessage(*msg, fields[0]);
699    reflection = sub.GetReflection();
700    EXPECT_EQ(123, reflection->GetInt32(
701                       sub, sub.GetDescriptor()->FindFieldByName("i")));
702  }
703}
704}  // namespace
705
706TEST(WireFormatTest, ParseMessageSetWithAnyTagOrder) {
707  std::string start = BuildMessageSetItemStart();
708  std::string end = BuildMessageSetItemEnd();
709  std::string id = BuildMessageSetItemTypeId(
710      UNITTEST::TestMessageSetExtension1::descriptor()->extension(0)->number());
711  std::string message = BuildMessageSetTestExtension1();
712
713  ValidateTestMessageSet("id + message", start + id + message + end);
714  ValidateTestMessageSet("message + id", start + message + id + end);
715}
716
717TEST(WireFormatTest, ParseMessageSetWithDuplicateTags) {
718  std::string start = BuildMessageSetItemStart();
719  std::string end = BuildMessageSetItemEnd();
720  std::string id = BuildMessageSetItemTypeId(
721      UNITTEST::TestMessageSetExtension1::descriptor()->extension(0)->number());
722  std::string other_id = BuildMessageSetItemTypeId(123456);
723  std::string message = BuildMessageSetTestExtension1();
724  std::string other_message = BuildMessageSetTestExtension1(321);
725
726  // Double id
727  ValidateTestMessageSet("id + other_id + message",
728                         start + id + other_id + message + end);
729  ValidateTestMessageSet("id + message + other_id",
730                         start + id + message + other_id + end);
731  ValidateTestMessageSet("message + id + other_id",
732                         start + message + id + other_id + end);
733  // Double message
734  ValidateTestMessageSet("id + message + other_message",
735                         start + id + message + other_message + end);
736  ValidateTestMessageSet("message + id + other_message",
737                         start + message + id + other_message + end);
738  ValidateTestMessageSet("message + other_message + id",
739                         start + message + other_message + id + end);
740}
741
742void SerializeReverseOrder(
743    const PROTO2_WIREFORMAT_UNITTEST::TestMessageSet& mset,
744    io::CodedOutputStream* coded_output);
745
746void SerializeReverseOrder(const UNITTEST::TestMessageSetExtension1& message,
747                           io::CodedOutputStream* coded_output) {
748  WireFormatLite::WriteTag(15,  // i
749                           WireFormatLite::WIRETYPE_VARINT, coded_output);
750  coded_output->WriteVarint64(message.i());
751  WireFormatLite::WriteTag(16,  // recursive
752                           WireFormatLite::WIRETYPE_LENGTH_DELIMITED,
753                           coded_output);
754  coded_output->WriteVarint32(message.recursive().GetCachedSize());
755  SerializeReverseOrder(message.recursive(), coded_output);
756}
757
758void SerializeReverseOrder(
759    const PROTO2_WIREFORMAT_UNITTEST::TestMessageSet& mset,
760    io::CodedOutputStream* coded_output) {
761  if (!mset.HasExtension(
762          UNITTEST::TestMessageSetExtension1::message_set_extension))
763    return;
764  coded_output->WriteTag(WireFormatLite::kMessageSetItemStartTag);
765  // Write the message content first.
766  WireFormatLite::WriteTag(WireFormatLite::kMessageSetMessageNumber,
767                           WireFormatLite::WIRETYPE_LENGTH_DELIMITED,
768                           coded_output);
769  auto& message = mset.GetExtension(
770      UNITTEST::TestMessageSetExtension1::message_set_extension);
771  coded_output->WriteVarint32(message.GetCachedSize());
772  SerializeReverseOrder(message, coded_output);
773  // Write the type id.
774  uint32_t type_id = message.GetDescriptor()->extension(0)->number();
775  WireFormatLite::WriteUInt32(WireFormatLite::kMessageSetTypeIdNumber, type_id,
776                              coded_output);
777  coded_output->WriteTag(WireFormatLite::kMessageSetItemEndTag);
778}
779
780TEST(WireFormatTest, ParseMessageSetWithDeepRecReverseOrder) {
781  std::string data;
782  {
783    PROTO2_WIREFORMAT_UNITTEST::TestMessageSet message_set;
784    PROTO2_WIREFORMAT_UNITTEST::TestMessageSet* mset = &message_set;
785    for (int i = 0; i < 200; i++) {
786      auto m = mset->MutableExtension(
787          UNITTEST::TestMessageSetExtension1::message_set_extension);
788      m->set_i(i);
789      mset = m->mutable_recursive();
790    }
791    message_set.ByteSizeLong();
792    // Serialize with reverse payload tag order
793    io::StringOutputStream output_stream(&data);
794    io::CodedOutputStream coded_output(&output_stream);
795    SerializeReverseOrder(message_set, &coded_output);
796  }
797  PROTO2_WIREFORMAT_UNITTEST::TestMessageSet message_set;
798  EXPECT_FALSE(message_set.ParseFromString(data));
799}
800
801TEST(WireFormatTest, ParseFailMalformedMessageSet) {
802  constexpr int kDepth = 5;
803  std::string data;
804  {
805    PROTO2_WIREFORMAT_UNITTEST::TestMessageSet message_set;
806    PROTO2_WIREFORMAT_UNITTEST::TestMessageSet* mset = &message_set;
807    for (int i = 0; i < kDepth; i++) {
808      auto m = mset->MutableExtension(
809          UNITTEST::TestMessageSetExtension1::message_set_extension);
810      m->set_i(i);
811      mset = m->mutable_recursive();
812    }
813    auto m = mset->MutableExtension(
814        UNITTEST::TestMessageSetExtension1::message_set_extension);
815    // -1 becomes \xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x1
816    m->set_i(-1);
817
818    EXPECT_TRUE(message_set.SerializeToString(&data));
819    // Make the proto mal-formed.
820    data[data.size() - 2 - kDepth] = 0xFF;
821  }
822
823  PROTO2_WIREFORMAT_UNITTEST::TestMessageSet message_set;
824  EXPECT_FALSE(message_set.ParseFromString(data));
825}
826
827TEST(WireFormatTest, ParseFailMalformedMessageSetReverseOrder) {
828  constexpr int kDepth = 5;
829  std::string data;
830  {
831    PROTO2_WIREFORMAT_UNITTEST::TestMessageSet message_set;
832    PROTO2_WIREFORMAT_UNITTEST::TestMessageSet* mset = &message_set;
833    for (int i = 0; i < kDepth; i++) {
834      auto m = mset->MutableExtension(
835          UNITTEST::TestMessageSetExtension1::message_set_extension);
836      m->set_i(i);
837      mset = m->mutable_recursive();
838    }
839    auto m = mset->MutableExtension(
840        UNITTEST::TestMessageSetExtension1::message_set_extension);
841    // -1 becomes \xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x1
842    m->set_i(-1);
843    // SerializeReverseOrder() assumes "recursive" is always present.
844    m->mutable_recursive();
845
846    message_set.ByteSizeLong();
847
848    // Serialize with reverse payload tag order
849    io::StringOutputStream output_stream(&data);
850    io::CodedOutputStream coded_output(&output_stream);
851    SerializeReverseOrder(message_set, &coded_output);
852  }
853
854  // Make varint for -1 malformed.
855  data[data.size() - 5 * (kDepth + 1) - 4] = 0xFF;
856
857  PROTO2_WIREFORMAT_UNITTEST::TestMessageSet message_set;
858  EXPECT_FALSE(message_set.ParseFromString(data));
859}
860
861TEST(WireFormatTest, ParseBrokenMessageSet) {
862  PROTO2_WIREFORMAT_UNITTEST::TestMessageSet message_set;
863  std::string input("goodbye");  // Invalid wire format data.
864  EXPECT_FALSE(message_set.ParseFromString(input));
865}
866
867TEST(WireFormatTest, RecursionLimit) {
868  UNITTEST::TestRecursiveMessage message;
869  message.mutable_a()->mutable_a()->mutable_a()->mutable_a()->set_i(1);
870  std::string data;
871  message.SerializeToString(&data);
872
873  {
874    io::ArrayInputStream raw_input(data.data(), data.size());
875    io::CodedInputStream input(&raw_input);
876    input.SetRecursionLimit(4);
877    UNITTEST::TestRecursiveMessage message2;
878    EXPECT_TRUE(message2.ParseFromCodedStream(&input));
879  }
880
881  {
882    io::ArrayInputStream raw_input(data.data(), data.size());
883    io::CodedInputStream input(&raw_input);
884    input.SetRecursionLimit(3);
885    UNITTEST::TestRecursiveMessage message2;
886    EXPECT_FALSE(message2.ParseFromCodedStream(&input));
887  }
888}
889
890TEST(WireFormatTest, LargeRecursionLimit) {
891  const int kLargeLimit = io::CodedInputStream::GetDefaultRecursionLimit() + 50;
892  UNITTEST::TestRecursiveMessage src, dst, *a;
893  a = src.mutable_a();
894  for (int i = 0; i < kLargeLimit - 1; i++) {
895    a = a->mutable_a();
896  }
897  a->set_i(1);
898
899  std::string data = src.SerializeAsString();
900  {
901    // Parse with default recursion limit. Should fail.
902    io::ArrayInputStream raw_input(data.data(), data.size());
903    io::CodedInputStream input(&raw_input);
904    ASSERT_FALSE(dst.ParseFromCodedStream(&input));
905  }
906
907  {
908    // Parse with custom recursion limit. Should pass.
909    io::ArrayInputStream raw_input(data.data(), data.size());
910    io::CodedInputStream input(&raw_input);
911    input.SetRecursionLimit(kLargeLimit);
912    ASSERT_TRUE(dst.ParseFromCodedStream(&input));
913  }
914
915  // Verifies the recursion depth.
916  int depth = 1;
917  a = dst.mutable_a();
918  while (a->has_a()) {
919    a = a->mutable_a();
920    depth++;
921  }
922
923  EXPECT_EQ(a->i(), 1);
924  EXPECT_EQ(depth, kLargeLimit);
925}
926
927TEST(WireFormatTest, UnknownFieldRecursionLimit) {
928  UNITTEST::TestEmptyMessage message;
929  message.mutable_unknown_fields()
930      ->AddGroup(1234)
931      ->AddGroup(1234)
932      ->AddGroup(1234)
933      ->AddGroup(1234)
934      ->AddVarint(1234, 123);
935  std::string data;
936  message.SerializeToString(&data);
937
938  {
939    io::ArrayInputStream raw_input(data.data(), data.size());
940    io::CodedInputStream input(&raw_input);
941    input.SetRecursionLimit(4);
942    UNITTEST::TestEmptyMessage message2;
943    EXPECT_TRUE(message2.ParseFromCodedStream(&input));
944  }
945
946  {
947    io::ArrayInputStream raw_input(data.data(), data.size());
948    io::CodedInputStream input(&raw_input);
949    input.SetRecursionLimit(3);
950    UNITTEST::TestEmptyMessage message2;
951    EXPECT_FALSE(message2.ParseFromCodedStream(&input));
952  }
953}
954
955TEST(WireFormatTest, ZigZag) {
956  // shorthands to avoid excessive line-wrapping
957  auto ZigZagEncode32 = [](int32_t x) {
958    return WireFormatLite::ZigZagEncode32(x);
959  };
960  auto ZigZagDecode32 = [](uint32_t x) {
961    return WireFormatLite::ZigZagDecode32(x);
962  };
963  auto ZigZagEncode64 = [](int64_t x) {
964    return WireFormatLite::ZigZagEncode64(x);
965  };
966  auto ZigZagDecode64 = [](uint64_t x) {
967    return WireFormatLite::ZigZagDecode64(x);
968  };
969
970  EXPECT_EQ(0u, ZigZagEncode32(0));
971  EXPECT_EQ(1u, ZigZagEncode32(-1));
972  EXPECT_EQ(2u, ZigZagEncode32(1));
973  EXPECT_EQ(3u, ZigZagEncode32(-2));
974  EXPECT_EQ(0x7FFFFFFEu, ZigZagEncode32(0x3FFFFFFF));
975  EXPECT_EQ(0x7FFFFFFFu, ZigZagEncode32(0xC0000000));
976  EXPECT_EQ(0xFFFFFFFEu, ZigZagEncode32(0x7FFFFFFF));
977  EXPECT_EQ(0xFFFFFFFFu, ZigZagEncode32(0x80000000));
978
979  EXPECT_EQ(0, ZigZagDecode32(0u));
980  EXPECT_EQ(-1, ZigZagDecode32(1u));
981  EXPECT_EQ(1, ZigZagDecode32(2u));
982  EXPECT_EQ(-2, ZigZagDecode32(3u));
983  EXPECT_EQ(0x3FFFFFFF, ZigZagDecode32(0x7FFFFFFEu));
984  EXPECT_EQ(0xC0000000, ZigZagDecode32(0x7FFFFFFFu));
985  EXPECT_EQ(0x7FFFFFFF, ZigZagDecode32(0xFFFFFFFEu));
986  EXPECT_EQ(0x80000000, ZigZagDecode32(0xFFFFFFFFu));
987
988  EXPECT_EQ(0u, ZigZagEncode64(0));
989  EXPECT_EQ(1u, ZigZagEncode64(-1));
990  EXPECT_EQ(2u, ZigZagEncode64(1));
991  EXPECT_EQ(3u, ZigZagEncode64(-2));
992  EXPECT_EQ(0x000000007FFFFFFEu, ZigZagEncode64(0x000000003FFFFFFF));
993  EXPECT_EQ(0x000000007FFFFFFFu,
994            ZigZagEncode64(absl::bit_cast<int64_t>(0xFFFFFFFFC0000000)));
995  EXPECT_EQ(0x00000000FFFFFFFEu, ZigZagEncode64(0x000000007FFFFFFF));
996  EXPECT_EQ(0x00000000FFFFFFFFu,
997            ZigZagEncode64(absl::bit_cast<int64_t>(0xFFFFFFFF80000000)));
998  EXPECT_EQ(0xFFFFFFFFFFFFFFFEu, ZigZagEncode64(0x7FFFFFFFFFFFFFFF));
999  EXPECT_EQ(0xFFFFFFFFFFFFFFFFu,
1000            ZigZagEncode64(absl::bit_cast<int64_t>(0x8000000000000000)));
1001
1002  EXPECT_EQ(0, ZigZagDecode64(0u));
1003  EXPECT_EQ(-1, ZigZagDecode64(1u));
1004  EXPECT_EQ(1, ZigZagDecode64(2u));
1005  EXPECT_EQ(-2, ZigZagDecode64(3u));
1006  EXPECT_EQ(0x000000003FFFFFFF, ZigZagDecode64(0x000000007FFFFFFEu));
1007  EXPECT_EQ(absl::bit_cast<int64_t>(0xFFFFFFFFC0000000),
1008            ZigZagDecode64(0x000000007FFFFFFFu));
1009  EXPECT_EQ(0x000000007FFFFFFF, ZigZagDecode64(0x00000000FFFFFFFEu));
1010  EXPECT_EQ(absl::bit_cast<int64_t>(0xFFFFFFFF80000000),
1011            ZigZagDecode64(0x00000000FFFFFFFFu));
1012  EXPECT_EQ(0x7FFFFFFFFFFFFFFF, ZigZagDecode64(0xFFFFFFFFFFFFFFFEu));
1013  EXPECT_EQ(absl::bit_cast<int64_t>(0x8000000000000000),
1014            ZigZagDecode64(0xFFFFFFFFFFFFFFFFu));
1015
1016  // Some easier-to-verify round-trip tests.  The inputs (other than 0, 1, -1)
1017  // were chosen semi-randomly via keyboard bashing.
1018  EXPECT_EQ(0, ZigZagDecode32(ZigZagEncode32(0)));
1019  EXPECT_EQ(1, ZigZagDecode32(ZigZagEncode32(1)));
1020  EXPECT_EQ(-1, ZigZagDecode32(ZigZagEncode32(-1)));
1021  EXPECT_EQ(14927, ZigZagDecode32(ZigZagEncode32(14927)));
1022  EXPECT_EQ(-3612, ZigZagDecode32(ZigZagEncode32(-3612)));
1023
1024  EXPECT_EQ(0, ZigZagDecode64(ZigZagEncode64(0)));
1025  EXPECT_EQ(1, ZigZagDecode64(ZigZagEncode64(1)));
1026  EXPECT_EQ(-1, ZigZagDecode64(ZigZagEncode64(-1)));
1027  EXPECT_EQ(14927, ZigZagDecode64(ZigZagEncode64(14927)));
1028  EXPECT_EQ(-3612, ZigZagDecode64(ZigZagEncode64(-3612)));
1029
1030  EXPECT_EQ(856912304801416, ZigZagDecode64(ZigZagEncode64(856912304801416)));
1031  EXPECT_EQ(-75123905439571256,
1032            ZigZagDecode64(ZigZagEncode64(-75123905439571256)));
1033}
1034
1035TEST(WireFormatTest, RepeatedScalarsDifferentTagSizes) {
1036  // At one point checks would trigger when parsing repeated fixed scalar
1037  // fields.
1038  UNITTEST::TestRepeatedScalarDifferentTagSizes msg1, msg2;
1039  for (int i = 0; i < 100; ++i) {
1040    msg1.add_repeated_fixed32(i);
1041    msg1.add_repeated_int32(i);
1042    msg1.add_repeated_fixed64(i);
1043    msg1.add_repeated_int64(i);
1044    msg1.add_repeated_float(i);
1045    msg1.add_repeated_uint64(i);
1046  }
1047
1048  // Make sure that we have a variety of tag sizes.
1049  const Descriptor* desc = msg1.GetDescriptor();
1050  const FieldDescriptor* field;
1051  field = desc->FindFieldByName("repeated_fixed32");
1052  ASSERT_TRUE(field != nullptr);
1053  ASSERT_EQ(1, WireFormat::TagSize(field->number(), field->type()));
1054  field = desc->FindFieldByName("repeated_int32");
1055  ASSERT_TRUE(field != nullptr);
1056  ASSERT_EQ(1, WireFormat::TagSize(field->number(), field->type()));
1057  field = desc->FindFieldByName("repeated_fixed64");
1058  ASSERT_TRUE(field != nullptr);
1059  ASSERT_EQ(2, WireFormat::TagSize(field->number(), field->type()));
1060  field = desc->FindFieldByName("repeated_int64");
1061  ASSERT_TRUE(field != nullptr);
1062  ASSERT_EQ(2, WireFormat::TagSize(field->number(), field->type()));
1063  field = desc->FindFieldByName("repeated_float");
1064  ASSERT_TRUE(field != nullptr);
1065  ASSERT_EQ(3, WireFormat::TagSize(field->number(), field->type()));
1066  field = desc->FindFieldByName("repeated_uint64");
1067  ASSERT_TRUE(field != nullptr);
1068  ASSERT_EQ(3, WireFormat::TagSize(field->number(), field->type()));
1069
1070  EXPECT_TRUE(msg2.ParseFromString(msg1.SerializeAsString()));
1071  EXPECT_EQ(msg1.DebugString(), msg2.DebugString());
1072}
1073
1074TEST(WireFormatTest, CompatibleTypes) {
1075  const int64_t data = 0x100000000LL;
1076  UNITTEST::Int64Message msg1;
1077  msg1.set_data(data);
1078  std::string serialized;
1079  msg1.SerializeToString(&serialized);
1080
1081  // Test int64 is compatible with bool
1082  UNITTEST::BoolMessage msg2;
1083  ASSERT_TRUE(msg2.ParseFromString(serialized));
1084  ASSERT_EQ(static_cast<bool>(data), msg2.data());
1085
1086  // Test int64 is compatible with uint64
1087  UNITTEST::Uint64Message msg3;
1088  ASSERT_TRUE(msg3.ParseFromString(serialized));
1089  ASSERT_EQ(static_cast<uint64_t>(data), msg3.data());
1090
1091  // Test int64 is compatible with int32
1092  UNITTEST::Int32Message msg4;
1093  ASSERT_TRUE(msg4.ParseFromString(serialized));
1094  ASSERT_EQ(static_cast<int32_t>(data), msg4.data());
1095
1096  // Test int64 is compatible with uint32
1097  UNITTEST::Uint32Message msg5;
1098  ASSERT_TRUE(msg5.ParseFromString(serialized));
1099  ASSERT_EQ(static_cast<uint32_t>(data), msg5.data());
1100}
1101
1102class Proto3PrimitiveRepeatedWireFormatTest : public ::testing::Test {
1103 protected:
1104  Proto3PrimitiveRepeatedWireFormatTest()
1105      : packedTestAllTypes_(
1106            "\xFA\x01\x01\x01"
1107            "\x82\x02\x01\x01"
1108            "\x8A\x02\x01\x01"
1109            "\x92\x02\x01\x01"
1110            "\x9A\x02\x01\x02"
1111            "\xA2\x02\x01\x02"
1112            "\xAA\x02\x04\x01\x00\x00\x00"
1113            "\xB2\x02\x08\x01\x00\x00\x00\x00\x00\x00\x00"
1114            "\xBA\x02\x04\x01\x00\x00\x00"
1115            "\xC2\x02\x08\x01\x00\x00\x00\x00\x00\x00\x00"
1116            "\xCA\x02\x04\x00\x00\x80\x3f"
1117            "\xD2\x02\x08\x00\x00\x00\x00\x00\x00\xf0\x3f"
1118            "\xDA\x02\x01\x01"
1119            "\x9A\x03\x01\x01",
1120            86),
1121        packedTestUnpackedTypes_(
1122            "\x0A\x01\x01"
1123            "\x12\x01\x01"
1124            "\x1A\x01\x01"
1125            "\x22\x01\x01"
1126            "\x2A\x01\x02"
1127            "\x32\x01\x02"
1128            "\x3A\x04\x01\x00\x00\x00"
1129            "\x42\x08\x01\x00\x00\x00\x00\x00\x00\x00"
1130            "\x4A\x04\x01\x00\x00\x00"
1131            "\x52\x08\x01\x00\x00\x00\x00\x00\x00\x00"
1132            "\x5A\x04\x00\x00\x80\x3f"
1133            "\x62\x08\x00\x00\x00\x00\x00\x00\xf0\x3f"
1134            "\x6A\x01\x01"
1135            "\x72\x01\x01",
1136            72),
1137        unpackedTestAllTypes_(
1138            "\xF8\x01\x01"
1139            "\x80\x02\x01"
1140            "\x88\x02\x01"
1141            "\x90\x02\x01"
1142            "\x98\x02\x02"
1143            "\xA0\x02\x02"
1144            "\xAD\x02\x01\x00\x00\x00"
1145            "\xB1\x02\x01\x00\x00\x00\x00\x00\x00\x00"
1146            "\xBD\x02\x01\x00\x00\x00"
1147            "\xC1\x02\x01\x00\x00\x00\x00\x00\x00\x00"
1148            "\xCD\x02\x00\x00\x80\x3f"
1149            "\xD1\x02\x00\x00\x00\x00\x00\x00\xf0\x3f"
1150            "\xD8\x02\x01"
1151            "\x98\x03\x01",
1152            72),
1153        unpackedTestUnpackedTypes_(
1154            "\x08\x01"
1155            "\x10\x01"
1156            "\x18\x01"
1157            "\x20\x01"
1158            "\x28\x02"
1159            "\x30\x02"
1160            "\x3D\x01\x00\x00\x00"
1161            "\x41\x01\x00\x00\x00\x00\x00\x00\x00"
1162            "\x4D\x01\x00\x00\x00"
1163            "\x51\x01\x00\x00\x00\x00\x00\x00\x00"
1164            "\x5D\x00\x00\x80\x3f"
1165            "\x61\x00\x00\x00\x00\x00\x00\xf0\x3f"
1166            "\x68\x01"
1167            "\x70\x01",
1168            58) {}
1169  template <class Proto>
1170  void SetProto3PrimitiveRepeatedFields(Proto* message) {
1171    message->add_repeated_int32(1);
1172    message->add_repeated_int64(1);
1173    message->add_repeated_uint32(1);
1174    message->add_repeated_uint64(1);
1175    message->add_repeated_sint32(1);
1176    message->add_repeated_sint64(1);
1177    message->add_repeated_fixed32(1);
1178    message->add_repeated_fixed64(1);
1179    message->add_repeated_sfixed32(1);
1180    message->add_repeated_sfixed64(1);
1181    message->add_repeated_float(1.0);
1182    message->add_repeated_double(1.0);
1183    message->add_repeated_bool(true);
1184    message->add_repeated_nested_enum(PROTO3_ARENA_UNITTEST::TestAllTypes::FOO);
1185  }
1186
1187  template <class Proto>
1188  void ExpectProto3PrimitiveRepeatedFieldsSet(const Proto& message) {
1189    EXPECT_EQ(1, message.repeated_int32(0));
1190    EXPECT_EQ(1, message.repeated_int64(0));
1191    EXPECT_EQ(1, message.repeated_uint32(0));
1192    EXPECT_EQ(1, message.repeated_uint64(0));
1193    EXPECT_EQ(1, message.repeated_sint32(0));
1194    EXPECT_EQ(1, message.repeated_sint64(0));
1195    EXPECT_EQ(1, message.repeated_fixed32(0));
1196    EXPECT_EQ(1, message.repeated_fixed64(0));
1197    EXPECT_EQ(1, message.repeated_sfixed32(0));
1198    EXPECT_EQ(1, message.repeated_sfixed64(0));
1199    EXPECT_EQ(1.0, message.repeated_float(0));
1200    EXPECT_EQ(1.0, message.repeated_double(0));
1201    EXPECT_EQ(true, message.repeated_bool(0));
1202    EXPECT_EQ(PROTO3_ARENA_UNITTEST::TestAllTypes::FOO,
1203              message.repeated_nested_enum(0));
1204  }
1205
1206  template <class Proto>
1207  void TestSerialization(Proto* message, const std::string& expected) {
1208    SetProto3PrimitiveRepeatedFields(message);
1209
1210    size_t size = message->ByteSizeLong();
1211
1212    // Serialize using the generated code.
1213    std::string generated_data;
1214    {
1215      io::StringOutputStream raw_output(&generated_data);
1216      io::CodedOutputStream output(&raw_output);
1217      message->SerializeWithCachedSizes(&output);
1218      ASSERT_FALSE(output.HadError());
1219    }
1220    EXPECT_TRUE(TestUtil::EqualsToSerialized(*message, generated_data));
1221
1222    // Serialize using the dynamic code.
1223    std::string dynamic_data;
1224    {
1225      io::StringOutputStream raw_output(&dynamic_data);
1226      io::CodedOutputStream output(&raw_output);
1227      WireFormat::SerializeWithCachedSizes(*message, size, &output);
1228      ASSERT_FALSE(output.HadError());
1229    }
1230    EXPECT_TRUE(expected == dynamic_data);
1231  }
1232
1233  template <class Proto>
1234  void TestParsing(Proto* message, const std::string& compatible_data) {
1235    message->Clear();
1236    message->ParseFromString(compatible_data);
1237    ExpectProto3PrimitiveRepeatedFieldsSet(*message);
1238
1239    message->Clear();
1240    io::CodedInputStream input(
1241        reinterpret_cast<const uint8_t*>(compatible_data.data()),
1242        compatible_data.size());
1243    WireFormat::ParseAndMergePartial(&input, message);
1244    ExpectProto3PrimitiveRepeatedFieldsSet(*message);
1245  }
1246
1247  const std::string packedTestAllTypes_;
1248  const std::string packedTestUnpackedTypes_;
1249  const std::string unpackedTestAllTypes_;
1250  const std::string unpackedTestUnpackedTypes_;
1251};
1252
1253TEST_F(Proto3PrimitiveRepeatedWireFormatTest, Proto3PrimitiveRepeated) {
1254  PROTO3_ARENA_UNITTEST::TestAllTypes packed_message;
1255  PROTO3_ARENA_UNITTEST::TestUnpackedTypes unpacked_message;
1256  TestSerialization(&packed_message, packedTestAllTypes_);
1257  TestParsing(&packed_message, packedTestAllTypes_);
1258  TestParsing(&packed_message, unpackedTestAllTypes_);
1259  TestSerialization(&unpacked_message, unpackedTestUnpackedTypes_);
1260  TestParsing(&unpacked_message, packedTestUnpackedTypes_);
1261  TestParsing(&unpacked_message, unpackedTestUnpackedTypes_);
1262}
1263
1264class WireFormatInvalidInputTest : public testing::Test {
1265 protected:
1266  // Make a serialized TestAllTypes in which the field optional_nested_message
1267  // contains exactly the given bytes, which may be invalid.
1268  std::string MakeInvalidEmbeddedMessage(const char* bytes, int size) {
1269    const FieldDescriptor* field =
1270        UNITTEST::TestAllTypes::descriptor()->FindFieldByName(
1271            "optional_nested_message");
1272    ABSL_CHECK(field != nullptr);
1273
1274    std::string result;
1275
1276    {
1277      io::StringOutputStream raw_output(&result);
1278      io::CodedOutputStream output(&raw_output);
1279
1280      WireFormatLite::WriteBytes(field->number(), std::string(bytes, size),
1281                                 &output);
1282    }
1283
1284    return result;
1285  }
1286
1287  // Make a serialized TestAllTypes in which the field optionalgroup
1288  // contains exactly the given bytes -- which may be invalid -- and
1289  // possibly no end tag.
1290  std::string MakeInvalidGroup(const char* bytes, int size,
1291                               bool include_end_tag) {
1292    const FieldDescriptor* field =
1293        UNITTEST::TestAllTypes::descriptor()->FindFieldByName("optionalgroup");
1294    ABSL_CHECK(field != nullptr);
1295
1296    std::string result;
1297
1298    {
1299      io::StringOutputStream raw_output(&result);
1300      io::CodedOutputStream output(&raw_output);
1301
1302      output.WriteVarint32(WireFormat::MakeTag(field));
1303      output.WriteString(std::string(bytes, size));
1304      if (include_end_tag) {
1305        output.WriteVarint32(WireFormatLite::MakeTag(
1306            field->number(), WireFormatLite::WIRETYPE_END_GROUP));
1307      }
1308    }
1309
1310    return result;
1311  }
1312};
1313
1314TEST_F(WireFormatInvalidInputTest, InvalidSubMessage) {
1315  UNITTEST::TestAllTypes message;
1316
1317  // Control case.
1318  EXPECT_TRUE(message.ParseFromString(MakeInvalidEmbeddedMessage("", 0)));
1319
1320  // The byte is a valid varint, but not a valid tag (zero).
1321  EXPECT_FALSE(message.ParseFromString(MakeInvalidEmbeddedMessage("\0", 1)));
1322
1323  // The byte is a malformed varint.
1324  EXPECT_FALSE(message.ParseFromString(MakeInvalidEmbeddedMessage("\200", 1)));
1325
1326  // The byte is an endgroup tag, but we aren't parsing a group.
1327  EXPECT_FALSE(message.ParseFromString(MakeInvalidEmbeddedMessage("\014", 1)));
1328
1329  // The byte is a valid varint but not a valid tag (bad wire type).
1330  EXPECT_FALSE(message.ParseFromString(MakeInvalidEmbeddedMessage("\017", 1)));
1331}
1332
1333TEST_F(WireFormatInvalidInputTest, InvalidMessageWithExtraZero) {
1334  std::string data;
1335  {
1336    // Serialize a valid proto
1337    UNITTEST::TestAllTypes message;
1338    message.set_optional_int32(1);
1339    message.SerializeToString(&data);
1340    data.push_back(0);  // Append invalid zero tag
1341  }
1342
1343  // Control case.
1344  {
1345    io::ArrayInputStream ais(data.data(), data.size());
1346    io::CodedInputStream is(&ais);
1347    UNITTEST::TestAllTypes message;
1348    // It should fail but currently passes.
1349    EXPECT_TRUE(message.MergePartialFromCodedStream(&is));
1350    // Parsing from the string should fail.
1351    EXPECT_FALSE(message.ParseFromString(data));
1352  }
1353}
1354
1355TEST_F(WireFormatInvalidInputTest, InvalidGroup) {
1356  UNITTEST::TestAllTypes message;
1357
1358  // Control case.
1359  EXPECT_TRUE(message.ParseFromString(MakeInvalidGroup("", 0, true)));
1360
1361  // Missing end tag.  Groups cannot end at EOF.
1362  EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("", 0, false)));
1363
1364  // The byte is a valid varint, but not a valid tag (zero).
1365  EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\0", 1, false)));
1366
1367  // The byte is a malformed varint.
1368  EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\200", 1, false)));
1369
1370  // The byte is an endgroup tag, but not the right one for this group.
1371  EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\014", 1, false)));
1372
1373  // The byte is a valid varint but not a valid tag (bad wire type).
1374  EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\017", 1, true)));
1375}
1376
1377TEST_F(WireFormatInvalidInputTest, InvalidUnknownGroup) {
1378  // Use TestEmptyMessage so that the group made by MakeInvalidGroup will not
1379  // be a known tag number.
1380  UNITTEST::TestEmptyMessage message;
1381
1382  // Control case.
1383  EXPECT_TRUE(message.ParseFromString(MakeInvalidGroup("", 0, true)));
1384
1385  // Missing end tag.  Groups cannot end at EOF.
1386  EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("", 0, false)));
1387
1388  // The byte is a valid varint, but not a valid tag (zero).
1389  EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\0", 1, false)));
1390
1391  // The byte is a malformed varint.
1392  EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\200", 1, false)));
1393
1394  // The byte is an endgroup tag, but not the right one for this group.
1395  EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\014", 1, false)));
1396
1397  // The byte is a valid varint but not a valid tag (bad wire type).
1398  EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\017", 1, true)));
1399}
1400
1401TEST_F(WireFormatInvalidInputTest, InvalidStringInUnknownGroup) {
1402  // Test a bug fix:  SkipMessage should fail if the message contains a
1403  // string whose length would extend beyond the message end.
1404
1405  UNITTEST::TestAllTypes message;
1406  message.set_optional_string("foo foo foo foo");
1407  std::string data;
1408  message.SerializeToString(&data);
1409
1410  // Chop some bytes off the end.
1411  data.resize(data.size() - 4);
1412
1413  // Try to skip it.  Note that the bug was only present when parsing to an
1414  // UnknownFieldSet.
1415  io::ArrayInputStream raw_input(data.data(), data.size());
1416  io::CodedInputStream coded_input(&raw_input);
1417  UnknownFieldSet unknown_fields;
1418  EXPECT_FALSE(WireFormat::SkipMessage(&coded_input, &unknown_fields));
1419}
1420
1421// Test differences between string and bytes.
1422// Value of a string type must be valid UTF-8 string.  When UTF-8
1423// validation is enabled (GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED):
1424// WriteInvalidUTF8String:  see error message.
1425// ReadInvalidUTF8String:  see error message.
1426// WriteValidUTF8String: fine.
1427// ReadValidUTF8String:  fine.
1428// WriteAnyBytes: fine.
1429// ReadAnyBytes: fine.
1430const char* kInvalidUTF8String = "Invalid UTF-8: \xA0\xB0\xC0\xD0";
1431// This used to be "Valid UTF-8: \x01\x02\u8C37\u6B4C", but MSVC seems to
1432// interpret \u differently from GCC.
1433const char* kValidUTF8String = "Valid UTF-8: \x01\x02\350\260\267\346\255\214";
1434
1435template <typename T>
1436bool WriteMessage(const char* value, T* message, std::string* wire_buffer) {
1437  message->set_data(value);
1438  wire_buffer->clear();
1439  message->AppendToString(wire_buffer);
1440  return (wire_buffer->size() > 0);
1441}
1442
1443template <typename T>
1444bool ReadMessage(const std::string& wire_buffer, T* message) {
1445  return message->ParseFromArray(wire_buffer.data(), wire_buffer.size());
1446}
1447
1448class Utf8ValidationTest : public ::testing::Test {
1449 protected:
1450  Utf8ValidationTest() {}
1451  ~Utf8ValidationTest() override {}
1452  void SetUp() override {
1453  }
1454
1455};
1456
1457TEST_F(Utf8ValidationTest, WriteInvalidUTF8String) {
1458  std::string wire_buffer;
1459  UNITTEST::OneString input;
1460  std::vector<std::string> errors;
1461  {
1462    absl::ScopedMockLog log(absl::MockLogDefault::kDisallowUnexpected);
1463#ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
1464    EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_, absl::StrCat(
1465                          "String field '", UNITTEST_PACKAGE_NAME,
1466                          ".OneString.data' "
1467                          "contains invalid UTF-8 data when "
1468                          "serializing a protocol buffer. Use the "
1469                          "'bytes' type if you intend to send raw bytes. ")));
1470#else
1471    EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_, testing::_)).Times(0);
1472#endif  // GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
1473    log.StartCapturingLogs();
1474    WriteMessage(kInvalidUTF8String, &input, &wire_buffer);
1475  }
1476}
1477
1478
1479TEST_F(Utf8ValidationTest, ReadInvalidUTF8String) {
1480  std::string wire_buffer;
1481  UNITTEST::OneString input;
1482  WriteMessage(kInvalidUTF8String, &input, &wire_buffer);
1483  UNITTEST::OneString output;
1484  std::vector<std::string> errors;
1485  {
1486    absl::ScopedMockLog log(absl::MockLogDefault::kDisallowUnexpected);
1487#ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
1488    EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_, absl::StrCat(
1489                          "String field '", UNITTEST_PACKAGE_NAME,
1490                          ".OneString.data' "
1491                          "contains invalid UTF-8 data when "
1492                          "parsing a protocol buffer. Use the "
1493                          "'bytes' type if you intend to send raw bytes. ")));
1494#else
1495    EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_, testing::_)).Times(0);
1496#endif  // GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
1497    log.StartCapturingLogs();
1498    ReadMessage(wire_buffer, &output);
1499  }
1500}
1501
1502
1503TEST_F(Utf8ValidationTest, WriteValidUTF8String) {
1504  std::string wire_buffer;
1505  UNITTEST::OneString input;
1506  {
1507    absl::ScopedMockLog log(absl::MockLogDefault::kDisallowUnexpected);
1508    EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_, testing::_)).Times(0);
1509    log.StartCapturingLogs();
1510    WriteMessage(kValidUTF8String, &input, &wire_buffer);
1511  }
1512}
1513
1514TEST_F(Utf8ValidationTest, ReadValidUTF8String) {
1515  std::string wire_buffer;
1516  UNITTEST::OneString input;
1517  WriteMessage(kValidUTF8String, &input, &wire_buffer);
1518  UNITTEST::OneString output;
1519  {
1520    absl::ScopedMockLog log(absl::MockLogDefault::kDisallowUnexpected);
1521    EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_, testing::_)).Times(0);
1522    log.StartCapturingLogs();
1523    ReadMessage(wire_buffer, &output);
1524  }
1525  EXPECT_EQ(input.data(), output.data());
1526}
1527
1528// Bytes: anything can pass as bytes, use invalid UTF-8 string to test
1529TEST_F(Utf8ValidationTest, WriteArbitraryBytes) {
1530  std::string wire_buffer;
1531  UNITTEST::OneBytes input;
1532  {
1533    absl::ScopedMockLog log(absl::MockLogDefault::kDisallowUnexpected);
1534    EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_, testing::_)).Times(0);
1535    log.StartCapturingLogs();
1536    WriteMessage(kInvalidUTF8String, &input, &wire_buffer);
1537  }
1538}
1539
1540TEST_F(Utf8ValidationTest, ReadArbitraryBytes) {
1541  std::string wire_buffer;
1542  UNITTEST::OneBytes input;
1543  WriteMessage(kInvalidUTF8String, &input, &wire_buffer);
1544  UNITTEST::OneBytes output;
1545  {
1546    absl::ScopedMockLog log(absl::MockLogDefault::kDisallowUnexpected);
1547    EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_, testing::_)).Times(0);
1548    log.StartCapturingLogs();
1549    ReadMessage(wire_buffer, &output);
1550  }
1551  EXPECT_EQ(input.data(), output.data());
1552}
1553
1554TEST_F(Utf8ValidationTest, ParseRepeatedString) {
1555  UNITTEST::MoreBytes input;
1556  input.add_data(kValidUTF8String);
1557  input.add_data(kInvalidUTF8String);
1558  input.add_data(kInvalidUTF8String);
1559  std::string wire_buffer = input.SerializeAsString();
1560
1561  UNITTEST::MoreString output;
1562  {
1563    absl::ScopedMockLog log(absl::MockLogDefault::kDisallowUnexpected);
1564#ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
1565    EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_, testing::_)).Times(2);
1566#else
1567    EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_, testing::_)).Times(0);
1568#endif  // GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
1569    log.StartCapturingLogs();
1570    ReadMessage(wire_buffer, &output);
1571  }
1572  EXPECT_EQ(wire_buffer, output.SerializeAsString());
1573}
1574
1575// Test the old VerifyUTF8String() function, which may still be called by old
1576// generated code.
1577TEST_F(Utf8ValidationTest, OldVerifyUTF8String) {
1578  std::string data(kInvalidUTF8String);
1579
1580  {
1581    absl::ScopedMockLog log(absl::MockLogDefault::kDisallowUnexpected);
1582#ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
1583    EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_, testing::StartsWith(
1584                       "String field contains invalid UTF-8 data when "
1585                       "serializing a protocol buffer. Use the "
1586                       "'bytes' type if you intend to send raw bytes.")));
1587#else
1588    EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_, testing::_)).Times(0);
1589#endif  // GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
1590    log.StartCapturingLogs();
1591    WireFormat::VerifyUTF8String(data.data(), data.size(),
1592                                 WireFormat::SERIALIZE);
1593  }
1594}
1595
1596
1597TEST(RepeatedVarint, Int32) {
1598  RepeatedField<int32_t> v;
1599
1600  // Insert -2^n, 2^n and 2^n-1.
1601  for (int n = 0; n < 10; n++) {
1602    v.Add(-(1 << n));
1603    v.Add(1 << n);
1604    v.Add((1 << n) - 1);
1605  }
1606
1607  // Check consistency with the scalar Int32Size.
1608  size_t expected = 0;
1609  for (int i = 0; i < v.size(); i++) {
1610    expected += WireFormatLite::Int32Size(v[i]);
1611  }
1612
1613  EXPECT_EQ(expected, WireFormatLite::Int32Size(v));
1614}
1615
1616TEST(RepeatedVarint, Int64) {
1617  RepeatedField<int64_t> v;
1618
1619  // Insert -2^n, 2^n and 2^n-1.
1620  for (int n = 0; n < 10; n++) {
1621    v.Add(-(1 << n));
1622    v.Add(1 << n);
1623    v.Add((1 << n) - 1);
1624  }
1625
1626  // Check consistency with the scalar Int64Size.
1627  size_t expected = 0;
1628  for (int i = 0; i < v.size(); i++) {
1629    expected += WireFormatLite::Int64Size(v[i]);
1630  }
1631
1632  EXPECT_EQ(expected, WireFormatLite::Int64Size(v));
1633}
1634
1635TEST(RepeatedVarint, SInt32) {
1636  RepeatedField<int32_t> v;
1637
1638  // Insert -2^n, 2^n and 2^n-1.
1639  for (int n = 0; n < 10; n++) {
1640    v.Add(-(1 << n));
1641    v.Add(1 << n);
1642    v.Add((1 << n) - 1);
1643  }
1644
1645  // Check consistency with the scalar SInt32Size.
1646  size_t expected = 0;
1647  for (int i = 0; i < v.size(); i++) {
1648    expected += WireFormatLite::SInt32Size(v[i]);
1649  }
1650
1651  EXPECT_EQ(expected, WireFormatLite::SInt32Size(v));
1652}
1653
1654TEST(RepeatedVarint, SInt64) {
1655  RepeatedField<int64_t> v;
1656
1657  // Insert -2^n, 2^n and 2^n-1.
1658  for (int n = 0; n < 10; n++) {
1659    v.Add(-(1 << n));
1660    v.Add(1 << n);
1661    v.Add((1 << n) - 1);
1662  }
1663
1664  // Check consistency with the scalar SInt64Size.
1665  size_t expected = 0;
1666  for (int i = 0; i < v.size(); i++) {
1667    expected += WireFormatLite::SInt64Size(v[i]);
1668  }
1669
1670  EXPECT_EQ(expected, WireFormatLite::SInt64Size(v));
1671}
1672
1673TEST(RepeatedVarint, UInt32) {
1674  RepeatedField<uint32_t> v;
1675
1676  // Insert 2^n and 2^n-1.
1677  for (int n = 0; n < 10; n++) {
1678    v.Add(1 << n);
1679    v.Add((1 << n) - 1);
1680  }
1681
1682  // Check consistency with the scalar UInt32Size.
1683  size_t expected = 0;
1684  for (int i = 0; i < v.size(); i++) {
1685    expected += WireFormatLite::UInt32Size(v[i]);
1686  }
1687
1688  EXPECT_EQ(expected, WireFormatLite::UInt32Size(v));
1689}
1690
1691TEST(RepeatedVarint, UInt64) {
1692  RepeatedField<uint64_t> v;
1693
1694  // Insert 2^n and 2^n-1.
1695  for (int n = 0; n < 10; n++) {
1696    v.Add(1 << n);
1697    v.Add((1 << n) - 1);
1698  }
1699
1700  // Check consistency with the scalar UInt64Size.
1701  size_t expected = 0;
1702  for (int i = 0; i < v.size(); i++) {
1703    expected += WireFormatLite::UInt64Size(v[i]);
1704  }
1705
1706  EXPECT_EQ(expected, WireFormatLite::UInt64Size(v));
1707}
1708
1709TEST(RepeatedVarint, Enum) {
1710  RepeatedField<int> v;
1711
1712  // Insert 2^n and 2^n-1.
1713  for (int n = 0; n < 10; n++) {
1714    v.Add(1 << n);
1715    v.Add((1 << n) - 1);
1716  }
1717
1718  // Check consistency with the scalar EnumSize.
1719  size_t expected = 0;
1720  for (int i = 0; i < v.size(); i++) {
1721    expected += WireFormatLite::EnumSize(v[i]);
1722  }
1723
1724  EXPECT_EQ(expected, WireFormatLite::EnumSize(v));
1725}
1726
1727
1728}  // namespace
1729}  // namespace internal
1730}  // namespace protobuf
1731}  // namespace google
1732
1733#include "google/protobuf/port_undef.inc"
1734