| // 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 |
| |
| // A gtest main for conformance test binaries. It configures a |
| // ConformanceEnvironment from the command-line flags declared in |
| // test_environment_flags.h and installs it before running all tests. |
| // Conformance suites should depend on the test_environment_main library |
| // instead of a generic gtest main. |
| // |
| // Any positional arguments left after flag parsing are appended to |
| // --testee_args, so `conformance_test --testee_binary=foo -- --bar` passes |
| // `--bar` to the testee. |
| |
| #include <utility> |
| #include <vector> |
| |
| #include <gtest/gtest.h> |
| #include "absl/log/absl_check.h" |
| #include "absl/types/span.h" |
| #include "conformance/test_environment.h" |
| #include "conformance/test_environment_flags.h" |
| |
| #include "absl/flags/parse.h" |
| #include "absl/log/initialize.h" |
| |
| // TODO: A custom main only because the stock gtest main parses |
| // absl flags only when gtest is built with Abseil (GTEST_HAS_ABSL), which |
| // open-source protobuf doesn't require yet. Once it can be required, install |
| // the environment from a static initializer and use the stock main instead. |
| int main(int argc, char* argv[]) { |
| // In Google's internal build, InitGoogleTest() also runs InitGoogle(), which |
| // parses absl flags, leaves only positional arguments in argv and |
| // initializes logging. In open source we do that ourselves, after gtest has |
| // removed its own flags from argv. |
| testing::InitGoogleTest(&argc, argv); |
| std::vector<char*> positional_args(argv, argv + argc); |
| positional_args = absl::ParseCommandLine(argc, argv); |
| absl::InitializeLog(); |
| |
| // Listing tests doesn't need a testee, and shouldn't require any flags. |
| if (!GTEST_FLAG_GET(list_tests)) { |
| google::protobuf::conformance::internal::ConformanceEnvironmentOptions options = |
| google::protobuf::conformance::internal::OptionsFromFlags( |
| absl::MakeConstSpan(positional_args).subspan(1)); |
| ABSL_QCHECK(!options.testee_binary.empty()) |
| << "--testee_binary is required."; |
| google::protobuf::conformance::internal::ConformanceEnvironment::Install( |
| std::move(options)); |
| } |
| return RUN_ALL_TESTS(); |
| } |