Skip to content

Commit 5ddd524

Browse files
tonyliaosscopybara-github
authored andcommitted
Add an enforce_proto_limits feature which will be implemented in Edition 2026.
PiperOrigin-RevId: 908404027
1 parent 4402590 commit 5ddd524

19 files changed

Lines changed: 1207 additions & 345 deletions

editions/BUILD

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ compile_edition_defaults(
2727
"//java/core:java_features_proto",
2828
"//src/google/protobuf:cpp_features_proto",
2929
],
30-
maximum_edition = "2024",
30+
maximum_edition = "2026",
3131
minimum_edition = "2023",
3232
# Test with HEAD protoc for any behavior change, other usages don't need this.
3333
protoc = "//src/google/protobuf/compiler:protoc_minimal",
@@ -53,6 +53,16 @@ compile_edition_defaults(
5353
protoc = "//src/google/protobuf/compiler:protoc_minimal",
5454
)
5555

56+
compile_edition_defaults(
57+
name = "test_defaults_2026",
58+
testonly = True,
59+
srcs = ["//src/google/protobuf:unittest_features_proto"],
60+
maximum_edition = "2026",
61+
minimum_edition = "2026",
62+
# Test with HEAD protoc for any behavior change, other usages don't need this.
63+
protoc = "//src/google/protobuf/compiler:protoc_minimal",
64+
)
65+
5666
compile_edition_defaults(
5767
name = "test_defaults_future",
5868
testonly = True,
@@ -177,6 +187,7 @@ cc_test(
177187
":protobuf_defaults",
178188
":test_defaults_2023",
179189
":test_defaults_2024",
190+
":test_defaults_2026",
180191
":test_defaults_far_future",
181192
":test_defaults_future",
182193
],

editions/defaults_test.cc

Lines changed: 83 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,37 @@ TEST(DefaultsTest, Check2024) {
9494
FeatureSet::VisibilityFeature::EXPORT_TOP_LEVEL);
9595
}
9696

97+
TEST(DefaultsTest, Check2026) {
98+
auto defaults = ReadDefaults("test_defaults_2026");
99+
ASSERT_OK(defaults);
100+
ASSERT_EQ(defaults->defaults().size(), 6);
101+
ASSERT_EQ(defaults->minimum_edition(), EDITION_2026);
102+
ASSERT_EQ(defaults->maximum_edition(), EDITION_2026);
103+
104+
EXPECT_EQ(defaults->defaults()[0].edition(), EDITION_LEGACY);
105+
EXPECT_EQ(defaults->defaults()[1].edition(), EDITION_PROTO3);
106+
EXPECT_EQ(defaults->defaults()[2].edition(), EDITION_2023);
107+
EXPECT_EQ(defaults->defaults()[2].overridable_features().field_presence(),
108+
FeatureSet::EXPLICIT);
109+
EXPECT_EQ(defaults->defaults()[2]
110+
.overridable_features()
111+
.GetExtension(pb::test)
112+
.file_feature(),
113+
pb::VALUE3);
114+
EXPECT_EQ(defaults->defaults()[3].edition(), EDITION_2024);
115+
EXPECT_EQ(
116+
defaults->defaults()[3].overridable_features().enforce_naming_style(),
117+
FeatureSet::STYLE2024);
118+
EXPECT_EQ(defaults->defaults()[3]
119+
.overridable_features()
120+
.default_symbol_visibility(),
121+
FeatureSet::VisibilityFeature::EXPORT_TOP_LEVEL);
122+
EXPECT_EQ(defaults->defaults()[4].edition(), EDITION_2026);
123+
EXPECT_EQ(
124+
defaults->defaults()[4].overridable_features().enforce_proto_limits(),
125+
FeatureSet::ProtoLimitsFeature::PROTO_LIMITS2026);
126+
}
127+
97128
TEST(DefaultsTest, CheckFuture) {
98129
auto defaults = ReadDefaults("test_defaults_future");
99130
ASSERT_OK(defaults);
@@ -119,6 +150,14 @@ TEST(DefaultsTest, CheckFuture) {
119150
.GetExtension(pb::test)
120151
.file_feature(),
121152
pb::VALUE3);
153+
EXPECT_EQ(defaults->defaults()[4].edition(), EDITION_2026);
154+
EXPECT_EQ(defaults->defaults()[4].overridable_features().field_presence(),
155+
FeatureSet::EXPLICIT);
156+
EXPECT_EQ(defaults->defaults()[4]
157+
.overridable_features()
158+
.GetExtension(pb::test)
159+
.file_feature(),
160+
pb::VALUE3);
122161
EXPECT_EQ(defaults->defaults()[5].edition(), EDITION_UNSTABLE);
123162
EXPECT_EQ(defaults->defaults()[5]
124163
.overridable_features()
@@ -160,6 +199,14 @@ TEST(DefaultsTest, CheckFarFuture) {
160199
.GetExtension(pb::test)
161200
.file_feature(),
162201
pb::VALUE3);
202+
EXPECT_EQ(defaults->defaults()[4].edition(), EDITION_2026);
203+
EXPECT_EQ(defaults->defaults()[4].overridable_features().field_presence(),
204+
FeatureSet::EXPLICIT);
205+
EXPECT_EQ(defaults->defaults()[4]
206+
.overridable_features()
207+
.GetExtension(pb::test)
208+
.file_feature(),
209+
pb::VALUE3);
163210
EXPECT_EQ(defaults->defaults()[5].edition(), EDITION_UNSTABLE);
164211
EXPECT_EQ(defaults->defaults()[5]
165212
.overridable_features()
@@ -314,7 +361,7 @@ TEST_F(OverridableDefaultsTest, Proto3) {
314361
TEST_F(OverridableDefaultsTest, Edition2023) {
315362
auto feature_defaults = ReadDefaults("protobuf_defaults");
316363
ASSERT_OK(feature_defaults);
317-
ASSERT_GE(feature_defaults->defaults().size(), 4);
364+
ASSERT_GE(feature_defaults->defaults().size(), 5);
318365
auto defaults = feature_defaults->defaults(2);
319366
ASSERT_EQ(defaults.edition(), EDITION_2023);
320367

@@ -336,7 +383,7 @@ TEST_F(OverridableDefaultsTest, Edition2023) {
336383
TEST_F(OverridableDefaultsTest, Edition2024) {
337384
auto feature_defaults = ReadDefaults("protobuf_defaults");
338385
ASSERT_OK(feature_defaults);
339-
ASSERT_GE(feature_defaults->defaults().size(), 4);
386+
ASSERT_GE(feature_defaults->defaults().size(), 5);
340387
auto defaults = feature_defaults->defaults(3);
341388
ASSERT_EQ(defaults.edition(), EDITION_2024);
342389

@@ -364,6 +411,40 @@ TEST_F(OverridableDefaultsTest, Edition2024) {
364411
)pb"));
365412
}
366413

414+
// Lock down that 2026 overridable defaults never change. Once Edition 2026 has
415+
// been released this test should never need to be touched.
416+
TEST_F(OverridableDefaultsTest, Edition2026) {
417+
auto feature_defaults = ReadDefaults("protobuf_defaults");
418+
ASSERT_OK(feature_defaults);
419+
ASSERT_GE(feature_defaults->defaults().size(), 5);
420+
auto defaults = feature_defaults->defaults(4);
421+
ASSERT_EQ(defaults.edition(), EDITION_2026);
422+
423+
424+
EXPECT_THAT(defaults.overridable_features(), EqualsProto(R"pb(
425+
field_presence: EXPLICIT
426+
enum_type: OPEN
427+
repeated_field_encoding: PACKED
428+
utf8_validation: VERIFY
429+
message_encoding: LENGTH_PREFIXED
430+
json_format: ALLOW
431+
enforce_naming_style: STYLE2026
432+
default_symbol_visibility: EXPORT_TOP_LEVEL
433+
enforce_proto_limits: PROTO_LIMITS2026
434+
[pb.cpp] {
435+
legacy_closed_enum: false
436+
string_type: VIEW
437+
enum_name_uses_string_view: true
438+
}
439+
[pb.java] {
440+
legacy_closed_enum: false
441+
utf8_validation: DEFAULT
442+
large_enum: false
443+
nest_in_file_class: NO
444+
}
445+
)pb"));
446+
}
447+
367448
} // namespace
368449
} // namespace protobuf
369450
} // namespace google

editions/generated_files_test.cc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "google/protobuf/internal_feature_helper.h"
1717
#include "google/protobuf/test_textproto.h"
1818

19+
1920
// These tests provide some basic minimal coverage that protos work as expected.
2021
// Full coverage will come as we migrate test protos to editions.
2122

@@ -30,6 +31,7 @@ using ::protobuf_test_messages::editions::proto2::TestAllTypesProto2;
3031
using ::protobuf_test_messages::editions::proto3::TestAllTypesProto3;
3132
using ::testing::NotNull;
3233

34+
3335
TEST(Generated, Parsing) {
3436
TestAllTypesProto2 message = ParseTextOrDie(R"pb(
3537
Data { group_int32: 9 }
@@ -150,6 +152,7 @@ TEST(Generated, EditionDefaults2023InternalFeatures) {
150152
json_format: ALLOW
151153
enforce_naming_style: STYLE_LEGACY
152154
default_symbol_visibility: EXPORT_ALL
155+
enforce_proto_limits: LEGACY_NO_EXPLICIT_LIMITS
153156
[pb.cpp] {
154157
legacy_closed_enum: false
155158
string_type: STRING
@@ -184,6 +187,7 @@ TEST(Generated, EditionDefaults2024InternalFeatures) {
184187
json_format: ALLOW
185188
enforce_naming_style: STYLE2024
186189
default_symbol_visibility: EXPORT_TOP_LEVEL
190+
enforce_proto_limits: LEGACY_NO_EXPLICIT_LIMITS
187191
[pb.cpp] {
188192
legacy_closed_enum: false
189193
string_type: VIEW
@@ -193,6 +197,7 @@ TEST(Generated, EditionDefaults2024InternalFeatures) {
193197
)pb"));
194198
}
195199

200+
196201
} // namespace
197202
} // namespace protobuf
198203
} // namespace google
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
edition = "2026";
2+
3+
package protobuf_editions_test;
4+
5+
// This file tests the default Edition2024 features in the absence of any
6+
// dependencies.
7+
8+
enum Editions2026DefaultEnum {
9+
EDITIONS2026_DEFAULT_ENUM_UNKNOWN = 0;
10+
EDITIONS2026_DEFAULT_ENUM_VALUE1 = 1;
11+
}
12+
13+
message Editions2026DefaultMessage {
14+
int32 int32_field = 1;
15+
string string_field = 2;
16+
Editions2026DefaultEnum enum_field = 3;
17+
18+
repeated int32 repeated_int32_field = 4;
19+
20+
message SubMessage {
21+
int32 nested_int32_field = 1;
22+
}
23+
SubMessage sub_message_field = 6;
24+
}

php/internal_generated_files.bzl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ DESCRIPTOR_GENERATED_FILES = [
6363
"src/Google/Protobuf/Internal/FeatureSet/FieldPresence.php",
6464
"src/Google/Protobuf/Internal/FeatureSet/JsonFormat.php",
6565
"src/Google/Protobuf/Internal/FeatureSet/MessageEncoding.php",
66+
"src/Google/Protobuf/Internal/FeatureSet/ProtoLimitsFeature.php",
67+
"src/Google/Protobuf/Internal/FeatureSet/ProtoLimitsFeature/EnforceProtoLimits.php",
6668
"src/Google/Protobuf/Internal/FeatureSet/RepeatedFieldEncoding.php",
6769
"src/Google/Protobuf/Internal/FeatureSet/Utf8Validation.php",
6870
"src/Google/Protobuf/Internal/FeatureSet/VisibilityFeature.php",

0 commit comments

Comments
 (0)