Skip to content

Commit cb0a8c5

Browse files
Rachel Goldfingerkarenwuz
authored andcommitted
Create editions test_utils to fix existing brittle tests in command_line_interface_unittest and code_generator_unittest.
PiperOrigin-RevId: 836222700
1 parent 44e090c commit cb0a8c5

File tree

8 files changed

+217
-52
lines changed

8 files changed

+217
-52
lines changed

editions/BUILD

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,35 @@ cc_library(
125125
],
126126
)
127127

128+
cc_library(
129+
name = "edition_defaults_test_utils",
130+
testonly = True,
131+
srcs = ["edition_defaults_test_utils.cc"],
132+
hdrs = ["edition_defaults_test_utils.h"],
133+
visibility = [
134+
"//pkg:__subpackages__",
135+
"//src/google/protobuf/compiler:__subpackages__",
136+
],
137+
deps = [
138+
"//src/google/protobuf",
139+
"@abseil-cpp//absl/types:optional",
140+
],
141+
)
142+
143+
cc_test(
144+
name = "edition_defaults_test_utils_test",
145+
srcs = ["edition_defaults_test_utils_test.cc"],
146+
deps = [
147+
":edition_defaults_test_utils",
148+
"//src/google/protobuf",
149+
"//src/google/protobuf:test_textproto",
150+
"//src/google/protobuf:unittest_features_cc_proto",
151+
"@abseil-cpp//absl/types:optional",
152+
"@googletest//:gtest",
153+
"@googletest//:gtest_main",
154+
],
155+
)
156+
128157
cc_test(
129158
name = "defaults_test",
130159
srcs = ["defaults_test.cc"],
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#include "editions/edition_defaults_test_utils.h"
2+
3+
#include "google/protobuf/descriptor.pb.h"
4+
#include "absl/types/optional.h"
5+
6+
namespace google {
7+
namespace protobuf {
8+
namespace compiler {
9+
10+
absl::optional<FeatureSetDefaults::FeatureSetEditionDefault> FindEditionDefault(
11+
const FeatureSetDefaults& defaults, Edition edition) {
12+
for (const auto& edition_default : defaults.defaults()) {
13+
if (edition_default.edition() == edition) {
14+
return edition_default;
15+
}
16+
}
17+
return absl::nullopt;
18+
}
19+
20+
} // namespace compiler
21+
} // namespace protobuf
22+
} // namespace google
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#ifndef GOOGLE_PROTOBUF_EDITIONS_EDITION_DEFAULTS_TEST_UTILS_H__
2+
#define GOOGLE_PROTOBUF_EDITIONS_EDITION_DEFAULTS_TEST_UTILS_H__
3+
4+
// This file contains test-only helper methods for dealing with
5+
// edition defaults. Only helpers that are specific to
6+
// edition defaults tests should be added here.
7+
8+
#include "google/protobuf/descriptor.pb.h"
9+
#include "absl/types/optional.h"
10+
11+
namespace google {
12+
namespace protobuf {
13+
namespace compiler {
14+
15+
// Returns the FeatureSetEditionDefault for the given edition, or absl::nullopt
16+
// if edition is not found in defaults.
17+
absl::optional<FeatureSetDefaults::FeatureSetEditionDefault> FindEditionDefault(
18+
const FeatureSetDefaults& defaults, Edition edition);
19+
20+
} // namespace compiler
21+
} // namespace protobuf
22+
} // namespace google
23+
24+
#endif // GOOGLE_PROTOBUF_EDITIONS_EDITION_DEFAULTS_TEST_UTILS_H__
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
#include "editions/edition_defaults_test_utils.h"
2+
3+
#include "google/protobuf/descriptor.pb.h"
4+
#include <gtest/gtest.h>
5+
#include "absl/types/optional.h"
6+
#include "google/protobuf/test_textproto.h"
7+
#include "google/protobuf/unittest_features.pb.h"
8+
9+
namespace google {
10+
namespace protobuf {
11+
namespace compiler {
12+
namespace {
13+
14+
TEST(TestUtilsTest, FindEditionDefault) {
15+
FeatureSetDefaults defaults = ParseTextOrDie(R"pb(
16+
defaults {
17+
edition: EDITION_PROTO3
18+
overridable_features {
19+
[pb.test] { file_feature: VALUE2 }
20+
},
21+
fixed_features { field_presence: IMPLICIT enum_type: OPEN }
22+
}
23+
defaults {
24+
edition: EDITION_2023
25+
overridable_features {
26+
[pb.test] { file_feature: VALUE3 }
27+
},
28+
fixed_features { field_presence: EXPLICIT enum_type: OPEN }
29+
}
30+
)pb");
31+
32+
const auto edition_defaults = FindEditionDefault(defaults, EDITION_2023);
33+
ASSERT_TRUE(edition_defaults.has_value());
34+
EXPECT_EQ(edition_defaults->edition(), EDITION_2023);
35+
EXPECT_EQ(edition_defaults->overridable_features()
36+
.GetExtension(pb::test)
37+
.file_feature(),
38+
pb::EnumFeature::VALUE3);
39+
}
40+
41+
TEST(TestUtilsTest, FindEditionDefaultNull) {
42+
FeatureSetDefaults defaults = ParseTextOrDie(R"pb(
43+
defaults {
44+
edition: EDITION_PROTO3
45+
overridable_features {
46+
[pb.test] { file_feature: VALUE2 }
47+
},
48+
fixed_features { field_presence: IMPLICIT enum_type: OPEN }
49+
}
50+
defaults {
51+
edition: EDITION_2023
52+
overridable_features {
53+
[pb.test] { file_feature: VALUE3 }
54+
},
55+
fixed_features { field_presence: EXPLICIT enum_type: OPEN }
56+
}
57+
)pb");
58+
59+
EXPECT_EQ(FindEditionDefault(defaults, EDITION_99999_TEST_ONLY),
60+
absl::nullopt);
61+
}
62+
63+
TEST(TestUtilsTest, FindEditionDefaultEmptyDefaults) {
64+
FeatureSetDefaults defaults = ParseTextOrDie(R"pb()pb");
65+
66+
EXPECT_EQ(FindEditionDefault(defaults, EDITION_2023), absl::nullopt);
67+
}
68+
69+
TEST(TestUtilsTest, FindEditionDefaultDuplicateEditions) {
70+
FeatureSetDefaults defaults = ParseTextOrDie(R"pb(
71+
defaults {
72+
edition: EDITION_PROTO3
73+
overridable_features {
74+
[pb.test] { file_feature: VALUE2 }
75+
},
76+
fixed_features { field_presence: IMPLICIT enum_type: OPEN }
77+
}
78+
defaults {
79+
edition: EDITION_2023
80+
overridable_features {
81+
[pb.test] { file_feature: VALUE3 }
82+
},
83+
fixed_features { field_presence: EXPLICIT enum_type: OPEN }
84+
},
85+
defaults {
86+
edition: EDITION_2023
87+
overridable_features {
88+
[pb.test] { file_feature: VALUE3 }
89+
},
90+
fixed_features { field_presence: IMPLICIT enum_type: OPEN }
91+
},
92+
)pb");
93+
94+
const auto edition_defaults = FindEditionDefault(defaults, EDITION_2023);
95+
ASSERT_TRUE(edition_defaults.has_value());
96+
EXPECT_EQ(edition_defaults->edition(), EDITION_2023);
97+
EXPECT_EQ(edition_defaults->fixed_features().field_presence(),
98+
FeatureSet::EXPLICIT);
99+
}
100+
101+
} // namespace
102+
} // namespace compiler
103+
} // namespace protobuf
104+
} // namespace google

pkg/BUILD.bazel

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,8 @@ cc_dist_library(
343343
],
344344
tags = ["manual"],
345345
deps = [
346+
"//editions:edition_defaults_test_utils",
347+
"//src/google/protobuf:descriptor_test_utils",
346348
"//src/google/protobuf:lite_test_util",
347349
"//src/google/protobuf:test_util",
348350
"//src/google/protobuf:test_util2",

src/google/protobuf/compiler/BUILD.bazel

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,7 @@ cc_test(
410410
deps = [
411411
":code_generator",
412412
":importer",
413+
"//editions:edition_defaults_test_utils",
413414
"//src/google/protobuf",
414415
"//src/google/protobuf:cc_test_protos",
415416
"//src/google/protobuf:port",
@@ -459,6 +460,7 @@ cc_test(
459460
":mock_code_generator",
460461
":test_plugin_paths",
461462
"//:protobuf",
463+
"//editions:edition_defaults_test_utils",
462464
"//src/google/protobuf",
463465
"//src/google/protobuf:any_cc_proto",
464466
"//src/google/protobuf:cc_test_protos",

src/google/protobuf/compiler/code_generator_unittest.cc

Lines changed: 3 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "absl/strings/str_format.h"
2020
#include "absl/strings/string_view.h"
2121
#include "google/protobuf/compiler/parser.h"
22+
#include "editions/edition_defaults_test_utils.h"
2223
#include "google/protobuf/io/tokenizer.h"
2324
#include "google/protobuf/io/zero_copy_stream_impl_lite.h"
2425
#include "google/protobuf/test_textproto.h"
@@ -86,16 +87,6 @@ class SimpleErrorCollector : public io::ErrorCollector {
8687
}
8788
};
8889

89-
const FeatureSetDefaults::FeatureSetEditionDefault* FindEditionDefault(
90-
const FeatureSetDefaults& defaults, Edition edition) {
91-
for (const auto& edition_default : defaults.defaults()) {
92-
if (edition_default.edition() == edition) {
93-
return &edition_default;
94-
}
95-
}
96-
return nullptr;
97-
}
98-
9990
class CodeGeneratorTest : public ::testing::Test {
10091
protected:
10192
const FileDescriptor* BuildFile(absl::string_view schema) {
@@ -443,21 +434,6 @@ MATCHER_P(IsOkAndHolds, matcher, "") {
443434
return arg.ok() && ExplainMatchResult(matcher, *arg, result_listener);
444435
}
445436

446-
TEST_F(CodeGeneratorTest, FindEditionDefault) {
447-
TestGenerator generator;
448-
auto result = generator.BuildFeatureSetDefaults();
449-
ASSERT_TRUE(result.ok()) << result.status().message();
450-
const auto* edition_defaults = FindEditionDefault(*result, EDITION_2023);
451-
ASSERT_THAT(edition_defaults, NotNull());
452-
EXPECT_EQ(edition_defaults->edition(), EDITION_2023);
453-
EXPECT_EQ(edition_defaults->overridable_features()
454-
.GetExtension(pb::test)
455-
.file_feature(),
456-
pb::EnumFeature::VALUE3);
457-
EXPECT_NE(edition_defaults->edition(), EDITION_2024);
458-
EXPECT_EQ(FindEditionDefault(*result, EDITION_99999_TEST_ONLY), nullptr);
459-
}
460-
461437
TEST_F(CodeGeneratorTest, BuildFeatureSetDefaultsInvalidExtension) {
462438
TestGenerator generator;
463439
generator.set_feature_extensions({nullptr});
@@ -538,8 +514,8 @@ TEST_F(CodeGeneratorTest, BuildFeatureSetDefaultsWithUnstable) {
538514
TestGenerator generator;
539515
auto result = generator.BuildFeatureSetDefaults();
540516
ASSERT_TRUE(result.ok()) << result.status().message();
541-
const auto* unstable_defaults = FindEditionDefault(*result, EDITION_UNSTABLE);
542-
ASSERT_THAT(unstable_defaults, NotNull());
517+
const auto unstable_defaults = FindEditionDefault(*result, EDITION_UNSTABLE);
518+
ASSERT_TRUE(unstable_defaults.has_value());
543519
EXPECT_EQ(unstable_defaults->overridable_features()
544520
.GetExtension(pb::test)
545521
.new_unstable_feature(),

src/google/protobuf/compiler/command_line_interface_unittest.cc

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
#include "absl/strings/str_cat.h"
2424
#include "absl/types/span.h"
2525
#include "google/protobuf/compiler/command_line_interface_tester.h"
26+
#include "google/protobuf/cpp_features.pb.h"
27+
#include "editions/edition_defaults_test_utils.h"
2628
#include "google/protobuf/unittest_features.pb.h"
2729
#include "google/protobuf/unittest_invalid_features.pb.h"
2830

@@ -2339,15 +2341,14 @@ TEST_F(CommandLineInterfaceTest, EditionDefaultsWithUnstable) {
23392341
ExpectNoErrors();
23402342

23412343
FeatureSetDefaults defaults = ReadEditionDefaults("defaults");
2342-
EXPECT_EQ(defaults.defaults_size(), 5);
2343-
EXPECT_EQ(defaults.defaults(4).edition(), EDITION_UNSTABLE);
2344-
EXPECT_EQ(defaults.defaults(4)
2345-
.overridable_features()
2344+
const auto unstable_defaults = FindEditionDefault(defaults, EDITION_UNSTABLE);
2345+
ASSERT_TRUE(unstable_defaults.has_value());
2346+
EXPECT_EQ(unstable_defaults->edition(), EDITION_UNSTABLE);
2347+
EXPECT_EQ(unstable_defaults->overridable_features()
23462348
.GetExtension(pb::test)
23472349
.new_unstable_feature(),
23482350
pb::UnstableEnumFeature::UNSTABLE2);
2349-
EXPECT_EQ(defaults.defaults(4)
2350-
.overridable_features()
2351+
EXPECT_EQ(unstable_defaults->overridable_features()
23512352
.GetExtension(pb::test)
23522353
.unstable_existing_feature(),
23532354
pb::UnstableEnumFeature::UNSTABLE3);
@@ -2442,40 +2443,45 @@ TEST_F(CommandLineInterfaceTest, EditionDefaultsWithExtension) {
24422443
FeatureSetDefaults defaults = ReadEditionDefaults("defaults");
24432444
EXPECT_EQ(defaults.minimum_edition(), EDITION_PROTO2);
24442445
EXPECT_EQ(defaults.maximum_edition(), EDITION_99999_TEST_ONLY);
2445-
ASSERT_EQ(defaults.defaults_size(), 8);
2446-
EXPECT_EQ(defaults.defaults(0).edition(), EDITION_LEGACY);
2447-
EXPECT_EQ(defaults.defaults(2).edition(), EDITION_2023);
2448-
EXPECT_EQ(defaults.defaults(3).edition(), EDITION_2024);
2449-
EXPECT_EQ(defaults.defaults(4).edition(), EDITION_UNSTABLE);
2450-
EXPECT_EQ(defaults.defaults(5).edition(), EDITION_99997_TEST_ONLY);
2451-
EXPECT_EQ(defaults.defaults(6).edition(), EDITION_99998_TEST_ONLY);
2452-
EXPECT_EQ(defaults.defaults(0)
2453-
.fixed_features()
2446+
EXPECT_EQ(FindEditionDefault(defaults, EDITION_LEGACY)->edition(),
2447+
EDITION_LEGACY);
2448+
EXPECT_EQ(FindEditionDefault(defaults, EDITION_2023)->edition(),
2449+
EDITION_2023);
2450+
EXPECT_EQ(FindEditionDefault(defaults, EDITION_2024)->edition(),
2451+
EDITION_2024);
2452+
EXPECT_EQ(FindEditionDefault(defaults, EDITION_UNSTABLE)->edition(),
2453+
EDITION_UNSTABLE);
2454+
EXPECT_EQ(FindEditionDefault(defaults, EDITION_99997_TEST_ONLY)->edition(),
2455+
EDITION_99997_TEST_ONLY);
2456+
EXPECT_EQ(FindEditionDefault(defaults, EDITION_99998_TEST_ONLY)->edition(),
2457+
EDITION_99998_TEST_ONLY);
2458+
EXPECT_EQ(FindEditionDefault(defaults, EDITION_LEGACY)
2459+
->fixed_features()
24542460
.GetExtension(pb::test)
24552461
.file_feature(),
24562462
pb::EnumFeature::VALUE1);
2457-
EXPECT_EQ(defaults.defaults(2)
2458-
.overridable_features()
2463+
EXPECT_EQ(FindEditionDefault(defaults, EDITION_2023)
2464+
->overridable_features()
24592465
.GetExtension(pb::test)
24602466
.file_feature(),
24612467
pb::EnumFeature::VALUE3);
2462-
EXPECT_EQ(defaults.defaults(3)
2463-
.overridable_features()
2468+
EXPECT_EQ(FindEditionDefault(defaults, EDITION_2024)
2469+
->overridable_features()
24642470
.GetExtension(pb::test)
24652471
.file_feature(),
24662472
pb::EnumFeature::VALUE3);
2467-
EXPECT_EQ(defaults.defaults(4)
2468-
.overridable_features()
2473+
EXPECT_EQ(FindEditionDefault(defaults, EDITION_UNSTABLE)
2474+
->overridable_features()
24692475
.GetExtension(pb::test)
24702476
.new_unstable_feature(),
24712477
pb::UnstableEnumFeature::UNSTABLE2);
2472-
EXPECT_EQ(defaults.defaults(5)
2473-
.overridable_features()
2478+
EXPECT_EQ(FindEditionDefault(defaults, EDITION_99997_TEST_ONLY)
2479+
->overridable_features()
24742480
.GetExtension(pb::test)
24752481
.file_feature(),
24762482
pb::EnumFeature::VALUE4);
2477-
EXPECT_EQ(defaults.defaults(6)
2478-
.overridable_features()
2483+
EXPECT_EQ(FindEditionDefault(defaults, EDITION_99998_TEST_ONLY)
2484+
->overridable_features()
24792485
.GetExtension(pb::test)
24802486
.file_feature(),
24812487
pb::EnumFeature::VALUE5);

0 commit comments

Comments
 (0)