| // Protocol Buffers - Google's data interchange format | |
| // Copyright 2026 Google LLC. All rights reserved. | |
| // | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file or at | |
| // https://developers.google.com/open-source/licenses/bsd | |
| #include "conformance/test_environment_flags.h" | |
| #include <string> | |
| #include <vector> | |
| #include "google/protobuf/descriptor.pb.h" | |
| #include <gmock/gmock.h> | |
| #include <gtest/gtest.h> | |
| #include "absl/flags/flag.h" | |
| #include "absl/flags/reflection.h" | |
| #include "absl/strings/string_view.h" | |
| #include "conformance/test_environment.h" | |
| #include "conformance/testee.h" | |
| namespace google { | |
| namespace protobuf { | |
| namespace conformance { | |
| namespace { | |
| using ::google::protobuf::conformance::internal::ConformanceEnvironmentOptions; | |
| using ::google::protobuf::conformance::internal::OptionsFromFlags; | |
| using ::testing::ElementsAre; | |
| using ::testing::HasSubstr; | |
| using ::testing::IsEmpty; | |
| TEST(OptionsFromFlagsTest, Defaults) { | |
| absl::FlagSaver saver; | |
| ConformanceEnvironmentOptions options = OptionsFromFlags(); | |
| EXPECT_THAT(options.testee_binary, IsEmpty()); | |
| EXPECT_THAT(options.testee_args, IsEmpty()); | |
| EXPECT_THAT(options.failure_list_files, IsEmpty()); | |
| EXPECT_EQ(options.enforcement_level, kLowestPriority); | |
| EXPECT_EQ(options.maximum_edition, EDITION_PROTO3); | |
| EXPECT_FALSE(options.performance); | |
| EXPECT_FALSE(options.fix); | |
| EXPECT_THAT(options.fix_output_file, IsEmpty()); | |
| EXPECT_TRUE(options.check_unseen_expected_failures); | |
| } | |
| TEST(OptionsFromFlagsTest, ForwardsEveryFlag) { | |
| absl::FlagSaver saver; | |
| absl::SetFlag(&FLAGS_testee_binary, "testee"); | |
| absl::SetFlag(&FLAGS_testee_args, {"--a", "--b"}); | |
| absl::SetFlag(&FLAGS_failure_list, {"x.txt", "y.txt"}); | |
| absl::SetFlag(&FLAGS_enforcement_level, kP0); | |
| absl::SetFlag(&FLAGS_maximum_edition, EDITION_2023); | |
| absl::SetFlag(&FLAGS_performance, true); | |
| absl::SetFlag(&FLAGS_fix, true); | |
| absl::SetFlag(&FLAGS_fix_output_file, "out.txt"); | |
| std::vector<std::string> positional = {"--c", "d"}; | |
| std::vector<char*> positional_args; | |
| for (std::string& arg : positional) positional_args.push_back(arg.data()); | |
| ConformanceEnvironmentOptions options = OptionsFromFlags(positional_args); | |
| EXPECT_EQ(options.testee_binary, "testee"); | |
| EXPECT_THAT(options.testee_args, ElementsAre("--a", "--b", "--c", "d")); | |
| EXPECT_THAT(options.failure_list_files, ElementsAre("x.txt", "y.txt")); | |
| EXPECT_EQ(options.enforcement_level, kP0); | |
| EXPECT_EQ(options.maximum_edition, EDITION_2023); | |
| EXPECT_TRUE(options.performance); | |
| EXPECT_TRUE(options.fix); | |
| EXPECT_EQ(options.fix_output_file, "out.txt"); | |
| } | |
| TEST(EnforcementLevelFlagTest, ParsesThePriorityNumber) { | |
| TestPriority priority = kLowestPriority; | |
| std::string error; | |
| EXPECT_TRUE(AbslParseFlag("0", &priority, &error)); | |
| EXPECT_EQ(priority, kP0); | |
| EXPECT_TRUE(AbslParseFlag("1", &priority, &error)); | |
| EXPECT_EQ(priority, kP1); | |
| EXPECT_EQ(AbslUnparseFlag(kP1), "1"); | |
| for (absl::string_view bad : {"-1", "2", "P1", ""}) { | |
| EXPECT_FALSE(AbslParseFlag(bad, &priority, &error)) << bad; | |
| EXPECT_THAT(error, HasSubstr("from 0 to 1")) << bad; | |
| } | |
| } | |
| } // namespace | |
| } // namespace conformance | |
| } // namespace protobuf | |
| } // namespace google |