// Copyright 2020 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include #include #include #include "gtest/gtest.h" // The test main must toggle logging and trace logging features because // tests will be run in environments that support them (in which case we // want as much debugging information as possible), and environments that // don't, so they must be disabled. If ENABLE_PLATFORM_IMPL and // ENABLE_TRACE_LOGGING are both false, then we should no Open Screen // dependencies. #ifdef ENABLE_PLATFORM_IMPL #include "platform/impl/logging.h" #endif #ifdef ENABLE_TRACE_LOGGING #include "platform/impl/text_trace_logging_platform.h" #endif namespace { void LogUsage(const char* argv0) { std::cerr << R"( usage: )" << argv0 << R"( options: -t, --tracing: Enable performance tracing logging. -v, --verbose: Enable verbose logging. -h, --help: Show this help message. )"; } struct GlobalTestState { #ifdef ENABLE_TRACE_LOGGING std::unique_ptr trace_logger; #endif bool args_are_valid = false; }; GlobalTestState InitFromArgs(int argc, char** argv) { // A note about modifying command line arguments: consider uniformity // between all Open Screen executables. If it is a platform feature // being exposed, consider if it applies to the standalone receiver, // standalone sender, osp demo, and test_main argument options. const struct option kArgumentOptions[] = { {"tracing", no_argument, nullptr, 't'}, {"verbose", no_argument, nullptr, 'v'}, {"help", no_argument, nullptr, 'h'}, {nullptr, 0, nullptr, 0}}; GlobalTestState state; int ch = -1; while ((ch = getopt_long(argc, argv, "tvh", kArgumentOptions, nullptr)) != -1) { switch (ch) { #ifdef ENABLE_TRACE_LOGGING case 't': state.trace_logger = std::make_unique(); break; #endif // When not built with Chrome, log level default is warning. When we are built // with Chrome, we have no way of knowing or setting log level. #ifdef ENABLE_PLATFORM_IMPL case 'v': openscreen::SetLogLevel(openscreen::LogLevel::kVerbose); break; #endif case 'h': LogUsage(argv[0]); return state; } } state.args_are_valid = true; return state; } } // namespace // Googletest strongly recommends that we roll our own main // function if we want to do global test environment setup. // See the below link for more info; // https://github.com/google/googletest/blob/master/docs/advanced.md#sharing-resources-between-tests-in-the-same-test-suite // TODO(issuetracker.google.com/172242670): rename reference to "main" // once googletest has a "main" branch. // This main method is a drop-in replacement for anywhere that currently // depends on gtest_main, meaning it can be linked into any test-only binary // to provide a main implementation that supports setting flags and other // state that we want shared between all tests. int main(int argc, char** argv) { auto state = InitFromArgs(argc, argv); if (!state.args_are_valid) { return 1; } testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }