• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2008 Google Inc.  All rights reserved.
3 //
4 // Use of this source code is governed by a BSD-style
5 // license that can be found in the LICENSE file or at
6 // https://developers.google.com/open-source/licenses/bsd
7 
8 #include "google/protobuf/compiler/cpp/file.h"
9 
10 #include <algorithm>
11 #include <cstddef>
12 #include <vector>
13 
14 #include <gtest/gtest.h>
15 #include "absl/strings/match.h"
16 #include "absl/strings/string_view.h"
17 #include "google/protobuf/descriptor.h"
18 #include "google/protobuf/unittest.pb.h"
19 
20 // Must be included last.
21 #include "google/protobuf/port_def.inc"
22 
23 namespace google {
24 namespace protobuf {
25 namespace compiler {
26 namespace cpp {
27 
28 class FileGeneratorFriendForTesting {
29  public:
MessagesInTopologicalOrder(const FileGenerator & fgen)30   static std::vector<const Descriptor*> MessagesInTopologicalOrder(
31       const FileGenerator& fgen) {
32     return fgen.MessagesInTopologicalOrder();
33   }
34 };
35 
36 namespace {
37 // Test that the descriptors are ordered in a topological order.
TEST(FileTest,TopologicallyOrderedDescriptors)38 TEST(FileTest, TopologicallyOrderedDescriptors) {
39   const FileDescriptor* fdesc =
40       protobuf_unittest::TestAllTypes::descriptor()->file();
41   FileGenerator fgen(fdesc, /*options=*/{});
42   static constexpr absl::string_view kExpectedDescriptorOrder[] = {
43       "Uint64Message",
44       "Uint32Message",
45       "TestVerifyUint32Simple",
46       "TestVerifyInt32Simple",
47       "TestVerifyBigFieldNumberUint32.Nested",
48       "TestUnpackedTypes",
49       "TestUnpackedExtensions",
50       "TestReservedFields",
51       "TestRequiredOpenEnum",
52       "TestRequiredOneof.NestedMessage",
53       "TestRequiredNoMaskMulti",
54       "TestRequiredEnumNoMask",
55       "TestRequiredEnumMulti",
56       "TestRequiredEnum",
57       "TestRepeatedString",
58       "TestRepeatedScalarDifferentTagSizes",
59       "TestRecursiveMessage",
60       "TestReallyLargeTagNumber",
61       "TestPickleNestedMessage.NestedMessage.NestedNestedMessage",
62       "TestPickleNestedMessage.NestedMessage",
63       "TestPickleNestedMessage",
64       "TestPackedTypes",
65       "TestPackedExtensions",
66       "TestPackedEnumSmallRange",
67       "TestOneofBackwardsCompatible.FooGroup",
68       "TestOneof2.NestedMessage",
69       "TestOneof2.FooGroup",
70       "TestOneof.FooGroup",
71       "TestNestedMessageRedaction",
72       "TestNestedGroupExtensionOuter.Layer1OptionalGroup.Layer2RepeatedGroup",
73       "TestNestedGroupExtensionOuter.Layer1OptionalGroup."
74       "Layer2AnotherOptionalRepeatedGroup",
75       "TestNestedGroupExtensionInnerExtension",
76       "TestNestedExtension.OptionalGroup_extension",
77       "TestNestedExtension",
78       "TestMultipleExtensionRanges",
79       "TestMixedFieldsAndExtensions",
80       "TestMessageWithManyRepeatedPtrFields",
81       "TestMessageSize",
82       "TestJsonName",
83       "TestIsInitialized.SubMessage.SubGroup",
84       "TestHugeFieldNumbers.StringStringMapEntry",
85       "TestHugeFieldNumbers.OptionalGroup",
86       "TestGroupExtension",
87       "TestGroup.OptionalGroup",
88       "TestFieldOrderings.NestedMessage",
89       "TestExtremeDefaultValues",
90       "TestExtensionRangeSerialize",
91       "TestExtensionOrderings2.TestExtensionOrderings3",
92       "TestExtensionOrderings2",
93       "TestExtensionOrderings1",
94       "TestExtensionInsideTable",
95       "TestEmptyMessageWithExtensions",
96       "TestEmptyMessage",
97       "TestDynamicExtensions.DynamicMessageType",
98       "TestDupFieldNumber.Foo",
99       "TestDupFieldNumber.Bar",
100       "TestDeprecatedMessage",
101       "TestCord",
102       "TestCommentInjectionMessage",
103       "TestChildExtensionData.NestedTestAllExtensionsData."
104       "NestedDynamicExtensions",
105       "TestAllTypes.RepeatedGroup",
106       "TestAllTypes.OptionalGroup",
107       "TestAllTypes.NestedMessage",
108       "TestAllExtensions",
109       "StringParseTester",
110       "SparseEnumMessage",
111       "RepeatedGroup_extension",
112       "RedactedFields.MapUnredactedStringEntry",
113       "RedactedFields.MapRedactedStringEntry",
114       "OptionalGroup_extension",
115       "OpenEnumMessage",
116       "OneString",
117       "OneBytes",
118       "MoreString",
119       "MoreBytes",
120       "MessageCreatorZeroInit",
121       "MessageCreatorMemcpy.M2Entry",
122       "MessageCreatorFunc",
123       "ManyOptionalString",
124       "Int64ParseTester",
125       "Int64Message",
126       "Int32ParseTester",
127       "Int32Message",
128       "InlinedStringIdxRegressionProto",
129       "ForeignMessage",
130       "FooServerMessage",
131       "FooResponse",
132       "FooRequest",
133       "FooClientMessage",
134       "EnumsForBenchmark",
135       "EnumParseTester",
136       "BoolParseTester",
137       "BoolMessage",
138       "BarResponse",
139       "BarRequest",
140       "BadFieldNames",
141       "TestVerifyBigFieldNumberUint32",
142       "TestRequiredOneof",
143       "TestRequired",
144       "TestOneof2",
145       "TestNestedMessageHasBits.NestedMessage",
146       "TestNestedGroupExtensionOuter.Layer1OptionalGroup",
147       "TestMergeException",
148       "TestIsInitialized.SubMessage",
149       "TestGroup",
150       "TestForeignNested",
151       "TestFieldOrderings",
152       "TestEagerMaybeLazy.NestedMessage",
153       "TestDynamicExtensions",
154       "TestDupFieldNumber",
155       "TestDeprecatedFields",
156       "TestChildExtensionData.NestedTestAllExtensionsData",
157       "TestChildExtension",
158       "TestCamelCaseFieldNames",
159       "TestAllTypes",
160       "RedactedFields",
161       "MessageCreatorMemcpy",
162       "TestVerifyUint32BigFieldNumber",
163       "TestVerifyUint32",
164       "TestVerifyOneUint32",
165       "TestVerifyOneInt32BigFieldNumber",
166       "TestVerifyMostlyInt32BigFieldNumber",
167       "TestVerifyMostlyInt32",
168       "TestVerifyInt32BigFieldNumber",
169       "TestVerifyInt32",
170       "TestRequiredMessage",
171       "TestParsingMerge.RepeatedGroup",
172       "TestParsingMerge.RepeatedFieldsGenerator.Group2",
173       "TestParsingMerge.RepeatedFieldsGenerator.Group1",
174       "TestParsingMerge.OptionalGroup",
175       "TestOneofBackwardsCompatible",
176       "TestOneof",
177       "TestNestedMessageHasBits",
178       "TestNestedGroupExtensionOuter",
179       "TestNestedChildExtension",
180       "TestMutualRecursionA.SubGroupR",
181       "TestLazyMessage",
182       "TestIsInitialized",
183       "TestHugeFieldNumbers",
184       "TestEagerMessage",
185       "TestEagerMaybeLazy",
186       "TestChildExtensionData",
187       "NestedTestAllTypes",
188       "TestRequiredForeign",
189       "TestParsingMerge.RepeatedFieldsGenerator",
190       "TestParsingMerge",
191       "TestNestedChildExtensionData",
192       "TestMutualRecursionA",
193       "TestMutualRecursionA.SubGroup",
194       "TestMutualRecursionA.SubMessage",
195       "TestMutualRecursionB",
196       "TestLazyMessageRepeated",
197       "TestNestedRequiredForeign",
198   };
199   static constexpr size_t kExpectedDescriptorCount =
200       std::end(kExpectedDescriptorOrder) - std::begin(kExpectedDescriptorOrder);
201   std::vector<const Descriptor*> actual_descriptor_order =
202       FileGeneratorFriendForTesting::MessagesInTopologicalOrder(fgen);
203   EXPECT_TRUE(kExpectedDescriptorCount == actual_descriptor_order.size())
204       << "Expected: " << kExpectedDescriptorCount
205       << ", got: " << actual_descriptor_order.size();
206 
207   auto limit =
208       std::min(kExpectedDescriptorCount, actual_descriptor_order.size());
209   for (auto i = 0u; i < limit; ++i) {
210     const Descriptor* desc = actual_descriptor_order[i];
211     bool match = absl::EndsWith(desc->full_name(), kExpectedDescriptorOrder[i]);
212     EXPECT_TRUE(match) << "failed to match; expected "
213                        << kExpectedDescriptorOrder[i] << ", got "
214                        << desc->full_name();
215   }
216 }
217 
218 }  // namespace
219 }  // namespace cpp
220 }  // namespace compiler
221 }  // namespace protobuf
222 }  // namespace google
223 
224 #include "google/protobuf/port_undef.inc"
225