Have MSVC use the preexisting __builtin_offsetof() case for GCC.
[google-protobuf.git] / editions / defaults_test.cc
blob3e4861cd0b640548e939ebcdd0a76390c074a4ae
1 #include <string>
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"
26 // Must be included last.
27 #include "google/protobuf/port_def.inc"
29 #define ASSERT_OK(x) ASSERT_TRUE(x.ok()) << x.status().message();
31 namespace google {
32 namespace protobuf {
33 namespace {
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!");
46 return defaults;
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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;
196 static void SetUpTestSuite() {
197 google::protobuf::LinkExtensionReflection(pb::cpp);
198 google::protobuf::LinkExtensionReflection(pb::java);
199 DescriptorPool::generated_pool();
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);
212 EXPECT_THAT(defaults.overridable_features(), EqualsProto(R"pb([pb.cpp] {}
213 [pb.java] {}
214 )pb"));
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);
224 EXPECT_THAT(defaults.overridable_features(), EqualsProto(R"pb([pb.cpp] {}
225 [pb.java] {}
226 )pb"));
229 // Lock down that 2023 overridable defaults never change. Once Edition 2023 has
230 // been released this test should never need to be touched.
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);
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"));
251 } // namespace
252 } // namespace protobuf
253 } // namespace google
255 #include "google/protobuf/port_undef.inc"