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