• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <string>
2 
3 #include "tools/cpp/runfiles/runfiles.h"
4 #include "google/protobuf/testing/file.h"
5 #include "google/protobuf/testing/file.h"
6 #include "google/protobuf/descriptor.pb.h"
7 #include <gmock/gmock.h>
8 #include <gtest/gtest.h>
9 #include "absl/memory/memory.h"
10 #include "absl/status/status.h"
11 #include "absl/status/statusor.h"
12 #include "absl/strings/escaping.h"
13 #include "absl/strings/str_cat.h"
14 #include "absl/strings/string_view.h"
15 #include "google/protobuf/java_features.pb.h"
16 #include "google/protobuf/cpp_features.pb.h"
17 #include "editions/defaults_test_embedded.h"
18 #include "editions/defaults_test_embedded_base64.h"
19 #include "google/protobuf/extension_set.h"
20 #include "google/protobuf/message.h"
21 #include "google/protobuf/test_textproto.h"
22 #include "google/protobuf/unittest_features.pb.h"
23 #include "google/protobuf/stubs/status_macros.h"
24 
25 
26 // Must be included last.
27 #include "google/protobuf/port_def.inc"
28 
29 #define ASSERT_OK(x) ASSERT_TRUE(x.ok()) << x.status().message();
30 
31 namespace google {
32 namespace protobuf {
33 namespace {
34 
ReadDefaults(absl::string_view name)35 absl::StatusOr<FeatureSetDefaults> ReadDefaults(absl::string_view name) {
36   auto runfiles = absl::WrapUnique(bazel::tools::cpp::runfiles::Runfiles::CreateForTest());
37   std::string file = runfiles->Rlocation(absl::StrCat(
38       "com_google_protobuf/editions/",
39       name, ".binpb"));
40   std::string data;
41   RETURN_IF_ERROR(File::GetContents(file, &data, true));
42   FeatureSetDefaults defaults;
43   if (!defaults.ParseFromString(data)) {
44     return absl::InternalError("Could not parse edition defaults!");
45   }
46   return defaults;
47 }
48 
TEST(DefaultsTest,Check2023)49 TEST(DefaultsTest, Check2023) {
50   auto defaults = ReadDefaults("test_defaults_2023");
51   ASSERT_OK(defaults);
52   ASSERT_EQ(defaults->defaults().size(), 3);
53   ASSERT_EQ(defaults->minimum_edition(), EDITION_2023);
54   ASSERT_EQ(defaults->maximum_edition(), EDITION_2023);
55 
56   EXPECT_EQ(defaults->defaults()[0].edition(), EDITION_LEGACY);
57   EXPECT_EQ(defaults->defaults()[1].edition(), EDITION_PROTO3);
58   EXPECT_EQ(defaults->defaults()[2].edition(), EDITION_2023);
59   EXPECT_EQ(defaults->defaults()[2].overridable_features().field_presence(),
60             FeatureSet::EXPLICIT);
61   EXPECT_EQ(defaults->defaults()[2]
62                 .overridable_features()
63                 .GetExtension(pb::test)
64                 .file_feature(),
65             pb::VALUE3);
66 }
67 
TEST(DefaultsTest,CheckFuture)68 TEST(DefaultsTest, CheckFuture) {
69   auto defaults = ReadDefaults("test_defaults_future");
70   ASSERT_OK(defaults);
71   ASSERT_EQ(defaults->defaults().size(), 5);
72   ASSERT_EQ(defaults->minimum_edition(), EDITION_2023);
73   ASSERT_EQ(defaults->maximum_edition(), EDITION_99997_TEST_ONLY);
74 
75   EXPECT_EQ(defaults->defaults()[0].edition(), EDITION_LEGACY);
76   EXPECT_EQ(defaults->defaults()[1].edition(), EDITION_PROTO3);
77   EXPECT_EQ(defaults->defaults()[2].edition(), EDITION_2023);
78   EXPECT_EQ(defaults->defaults()[2].overridable_features().field_presence(),
79             FeatureSet::EXPLICIT);
80   EXPECT_EQ(defaults->defaults()[2]
81                 .overridable_features()
82                 .GetExtension(pb::test)
83                 .file_feature(),
84             pb::VALUE3);
85   EXPECT_EQ(defaults->defaults()[3].edition(), EDITION_2024);
86   EXPECT_EQ(defaults->defaults()[3].overridable_features().field_presence(),
87             FeatureSet::EXPLICIT);
88   EXPECT_EQ(defaults->defaults()[3]
89                 .overridable_features()
90                 .GetExtension(pb::test)
91                 .file_feature(),
92             pb::VALUE3);
93   EXPECT_EQ(defaults->defaults()[4].edition(), EDITION_99997_TEST_ONLY);
94   EXPECT_EQ(defaults->defaults()[4].overridable_features().field_presence(),
95             FeatureSet::EXPLICIT);
96   EXPECT_EQ(defaults->defaults()[4]
97                 .overridable_features()
98                 .GetExtension(pb::test)
99                 .file_feature(),
100             pb::VALUE4);
101 }
102 
TEST(DefaultsTest,CheckFarFuture)103 TEST(DefaultsTest, CheckFarFuture) {
104   auto defaults = ReadDefaults("test_defaults_far_future");
105   ASSERT_OK(defaults);
106   ASSERT_EQ(defaults->defaults().size(), 7);
107   ASSERT_EQ(defaults->minimum_edition(), EDITION_99997_TEST_ONLY);
108   ASSERT_EQ(defaults->maximum_edition(), EDITION_99999_TEST_ONLY);
109 
110   EXPECT_EQ(defaults->defaults()[0].edition(), EDITION_LEGACY);
111   EXPECT_EQ(defaults->defaults()[1].edition(), EDITION_PROTO3);
112   EXPECT_EQ(defaults->defaults()[2].edition(), EDITION_2023);
113   EXPECT_EQ(defaults->defaults()[2].overridable_features().field_presence(),
114             FeatureSet::EXPLICIT);
115   EXPECT_EQ(defaults->defaults()[2]
116                 .overridable_features()
117                 .GetExtension(pb::test)
118                 .file_feature(),
119             pb::VALUE3);
120   EXPECT_EQ(defaults->defaults()[3].edition(), EDITION_2024);
121   EXPECT_EQ(defaults->defaults()[3].overridable_features().field_presence(),
122             FeatureSet::EXPLICIT);
123   EXPECT_EQ(defaults->defaults()[3]
124                 .overridable_features()
125                 .GetExtension(pb::test)
126                 .file_feature(),
127             pb::VALUE3);
128   EXPECT_EQ(defaults->defaults()[4].edition(), EDITION_99997_TEST_ONLY);
129   EXPECT_EQ(defaults->defaults()[4].overridable_features().field_presence(),
130             FeatureSet::EXPLICIT);
131   EXPECT_EQ(defaults->defaults()[4]
132                 .overridable_features()
133                 .GetExtension(pb::test)
134                 .file_feature(),
135             pb::VALUE4);
136   EXPECT_EQ(defaults->defaults()[5].edition(), EDITION_99998_TEST_ONLY);
137   EXPECT_EQ(defaults->defaults()[5].overridable_features().field_presence(),
138             FeatureSet::EXPLICIT);
139   EXPECT_EQ(defaults->defaults()[5]
140                 .overridable_features()
141                 .GetExtension(pb::test)
142                 .file_feature(),
143             pb::VALUE5);
144 }
145 
TEST(DefaultsTest,Embedded)146 TEST(DefaultsTest, Embedded) {
147   FeatureSetDefaults defaults;
148   ASSERT_TRUE(defaults.ParseFromArray(DEFAULTS_TEST_EMBEDDED,
149                                       sizeof(DEFAULTS_TEST_EMBEDDED) - 1))
150       << "Could not parse embedded data";
151   ASSERT_EQ(defaults.defaults().size(), 3);
152   ASSERT_EQ(defaults.minimum_edition(), EDITION_2023);
153   ASSERT_EQ(defaults.maximum_edition(), EDITION_2023);
154 
155   EXPECT_EQ(defaults.defaults()[0].edition(), EDITION_LEGACY);
156   EXPECT_EQ(defaults.defaults()[1].edition(), EDITION_PROTO3);
157   EXPECT_EQ(defaults.defaults()[2].edition(), EDITION_2023);
158   EXPECT_EQ(defaults.defaults()[2].overridable_features().field_presence(),
159             FeatureSet::EXPLICIT);
160   EXPECT_EQ(defaults.defaults()[2]
161                 .overridable_features()
162                 .GetExtension(pb::test)
163                 .file_feature(),
164             pb::VALUE3);
165 }
166 
TEST(DefaultsTest,EmbeddedBase64)167 TEST(DefaultsTest, EmbeddedBase64) {
168   FeatureSetDefaults defaults;
169   std::string data;
170   ASSERT_TRUE(absl::Base64Unescape(
171       absl::string_view{DEFAULTS_TEST_EMBEDDED_BASE64,
172                         sizeof(DEFAULTS_TEST_EMBEDDED_BASE64) - 1},
173       &data));
174   ASSERT_TRUE(defaults.ParseFromString(data));
175   ASSERT_EQ(defaults.defaults().size(), 3);
176   ASSERT_EQ(defaults.minimum_edition(), EDITION_2023);
177   ASSERT_EQ(defaults.maximum_edition(), EDITION_2023);
178 
179   EXPECT_EQ(defaults.defaults()[0].edition(), EDITION_LEGACY);
180   EXPECT_EQ(defaults.defaults()[1].edition(), EDITION_PROTO3);
181   EXPECT_EQ(defaults.defaults()[2].edition(), EDITION_2023);
182   EXPECT_EQ(defaults.defaults()[2].overridable_features().field_presence(),
183             FeatureSet::EXPLICIT);
184   EXPECT_EQ(defaults.defaults()[2]
185                 .overridable_features()
186                 .GetExtension(pb::test)
187                 .file_feature(),
188             pb::VALUE3);
189 }
190 
191 // Lock down that overridable defaults never change in released editions.  After
192 // an edition has been released these tests should never need to be touched.
193 class OverridableDefaultsTest : public ::testing::Test {
194  public:
195   OverridableDefaultsTest() = default;
SetUpTestSuite()196   static void SetUpTestSuite() {
197     google::protobuf::LinkExtensionReflection(pb::cpp);
198     google::protobuf::LinkExtensionReflection(pb::java);
199     DescriptorPool::generated_pool();
200   }
201 };
202 
203 
TEST_F(OverridableDefaultsTest,Proto2)204 TEST_F(OverridableDefaultsTest, Proto2) {
205   auto feature_defaults = ReadDefaults("protobuf_defaults");
206   ASSERT_OK(feature_defaults);
207   ASSERT_GE(feature_defaults->defaults().size(), 1);
208   auto defaults = feature_defaults->defaults(0);
209   ASSERT_EQ(defaults.edition(), EDITION_LEGACY);
210 
211 
212   EXPECT_THAT(defaults.overridable_features(), EqualsProto(R"pb([pb.cpp] {}
213                                                                 [pb.java] {}
214               )pb"));
215 }
TEST_F(OverridableDefaultsTest,Proto3)216 TEST_F(OverridableDefaultsTest, Proto3) {
217   auto feature_defaults = ReadDefaults("protobuf_defaults");
218   ASSERT_OK(feature_defaults);
219   ASSERT_GE(feature_defaults->defaults().size(), 2);
220   auto defaults = feature_defaults->defaults(1);
221   ASSERT_EQ(defaults.edition(), EDITION_PROTO3);
222 
223 
224   EXPECT_THAT(defaults.overridable_features(), EqualsProto(R"pb([pb.cpp] {}
225                                                                 [pb.java] {}
226               )pb"));
227 }
228 
229 // Lock down that 2023 overridable defaults never change.  Once Edition 2023 has
230 // been released this test should never need to be touched.
TEST_F(OverridableDefaultsTest,Edition2023)231 TEST_F(OverridableDefaultsTest, Edition2023) {
232   auto feature_defaults = ReadDefaults("protobuf_defaults");
233   ASSERT_OK(feature_defaults);
234   ASSERT_GE(feature_defaults->defaults().size(), 3);
235   auto defaults = feature_defaults->defaults(2);
236   ASSERT_EQ(defaults.edition(), EDITION_2023);
237 
238 
239   EXPECT_THAT(defaults.overridable_features(), EqualsProto(R"pb(
240                 field_presence: EXPLICIT
241                 enum_type: OPEN
242                 repeated_field_encoding: PACKED
243                 utf8_validation: VERIFY
244                 message_encoding: LENGTH_PREFIXED
245                 json_format: ALLOW
246                 [pb.cpp] { legacy_closed_enum: false string_type: STRING }
247                 [pb.java] { legacy_closed_enum: false utf8_validation: DEFAULT }
248               )pb"));
249 }
250 
251 }  // namespace
252 }  // namespace protobuf
253 }  // namespace google
254 
255 #include "google/protobuf/port_undef.inc"
256