1*3f982cf4SFabien Sanglard // Copyright 2020 The Chromium Authors. All rights reserved.
2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be
3*3f982cf4SFabien Sanglard // found in the LICENSE file.
4*3f982cf4SFabien Sanglard
5*3f982cf4SFabien Sanglard #include <getopt.h>
6*3f982cf4SFabien Sanglard
7*3f982cf4SFabien Sanglard #include <iostream>
8*3f982cf4SFabien Sanglard #include <string>
9*3f982cf4SFabien Sanglard
10*3f982cf4SFabien Sanglard #include "gtest/gtest.h"
11*3f982cf4SFabien Sanglard
12*3f982cf4SFabien Sanglard // The test main must toggle logging and trace logging features because
13*3f982cf4SFabien Sanglard // tests will be run in environments that support them (in which case we
14*3f982cf4SFabien Sanglard // want as much debugging information as possible), and environments that
15*3f982cf4SFabien Sanglard // don't, so they must be disabled. If ENABLE_PLATFORM_IMPL and
16*3f982cf4SFabien Sanglard // ENABLE_TRACE_LOGGING are both false, then we should no Open Screen
17*3f982cf4SFabien Sanglard // dependencies.
18*3f982cf4SFabien Sanglard #ifdef ENABLE_PLATFORM_IMPL
19*3f982cf4SFabien Sanglard #include "platform/impl/logging.h"
20*3f982cf4SFabien Sanglard #endif
21*3f982cf4SFabien Sanglard #ifdef ENABLE_TRACE_LOGGING
22*3f982cf4SFabien Sanglard #include "platform/impl/text_trace_logging_platform.h"
23*3f982cf4SFabien Sanglard #endif
24*3f982cf4SFabien Sanglard
25*3f982cf4SFabien Sanglard namespace {
LogUsage(const char * argv0)26*3f982cf4SFabien Sanglard void LogUsage(const char* argv0) {
27*3f982cf4SFabien Sanglard std::cerr << R"(
28*3f982cf4SFabien Sanglard usage: )" << argv0
29*3f982cf4SFabien Sanglard << R"( <options>
30*3f982cf4SFabien Sanglard
31*3f982cf4SFabien Sanglard options:
32*3f982cf4SFabien Sanglard -t, --tracing: Enable performance tracing logging.
33*3f982cf4SFabien Sanglard
34*3f982cf4SFabien Sanglard -v, --verbose: Enable verbose logging.
35*3f982cf4SFabien Sanglard
36*3f982cf4SFabien Sanglard -h, --help: Show this help message.
37*3f982cf4SFabien Sanglard )";
38*3f982cf4SFabien Sanglard }
39*3f982cf4SFabien Sanglard
40*3f982cf4SFabien Sanglard struct GlobalTestState {
41*3f982cf4SFabien Sanglard #ifdef ENABLE_TRACE_LOGGING
42*3f982cf4SFabien Sanglard std::unique_ptr<openscreen::TextTraceLoggingPlatform> trace_logger;
43*3f982cf4SFabien Sanglard #endif
44*3f982cf4SFabien Sanglard bool args_are_valid = false;
45*3f982cf4SFabien Sanglard };
46*3f982cf4SFabien Sanglard
InitFromArgs(int argc,char ** argv)47*3f982cf4SFabien Sanglard GlobalTestState InitFromArgs(int argc, char** argv) {
48*3f982cf4SFabien Sanglard // A note about modifying command line arguments: consider uniformity
49*3f982cf4SFabien Sanglard // between all Open Screen executables. If it is a platform feature
50*3f982cf4SFabien Sanglard // being exposed, consider if it applies to the standalone receiver,
51*3f982cf4SFabien Sanglard // standalone sender, osp demo, and test_main argument options.
52*3f982cf4SFabien Sanglard const struct option kArgumentOptions[] = {
53*3f982cf4SFabien Sanglard {"tracing", no_argument, nullptr, 't'},
54*3f982cf4SFabien Sanglard {"verbose", no_argument, nullptr, 'v'},
55*3f982cf4SFabien Sanglard {"help", no_argument, nullptr, 'h'},
56*3f982cf4SFabien Sanglard {nullptr, 0, nullptr, 0}};
57*3f982cf4SFabien Sanglard
58*3f982cf4SFabien Sanglard GlobalTestState state;
59*3f982cf4SFabien Sanglard int ch = -1;
60*3f982cf4SFabien Sanglard while ((ch = getopt_long(argc, argv, "tvh", kArgumentOptions, nullptr)) !=
61*3f982cf4SFabien Sanglard -1) {
62*3f982cf4SFabien Sanglard switch (ch) {
63*3f982cf4SFabien Sanglard #ifdef ENABLE_TRACE_LOGGING
64*3f982cf4SFabien Sanglard case 't':
65*3f982cf4SFabien Sanglard state.trace_logger =
66*3f982cf4SFabien Sanglard std::make_unique<openscreen::TextTraceLoggingPlatform>();
67*3f982cf4SFabien Sanglard break;
68*3f982cf4SFabien Sanglard #endif
69*3f982cf4SFabien Sanglard // When not built with Chrome, log level default is warning. When we are built
70*3f982cf4SFabien Sanglard // with Chrome, we have no way of knowing or setting log level.
71*3f982cf4SFabien Sanglard #ifdef ENABLE_PLATFORM_IMPL
72*3f982cf4SFabien Sanglard case 'v':
73*3f982cf4SFabien Sanglard openscreen::SetLogLevel(openscreen::LogLevel::kVerbose);
74*3f982cf4SFabien Sanglard break;
75*3f982cf4SFabien Sanglard #endif
76*3f982cf4SFabien Sanglard case 'h':
77*3f982cf4SFabien Sanglard LogUsage(argv[0]);
78*3f982cf4SFabien Sanglard return state;
79*3f982cf4SFabien Sanglard }
80*3f982cf4SFabien Sanglard }
81*3f982cf4SFabien Sanglard
82*3f982cf4SFabien Sanglard state.args_are_valid = true;
83*3f982cf4SFabien Sanglard return state;
84*3f982cf4SFabien Sanglard }
85*3f982cf4SFabien Sanglard } // namespace
86*3f982cf4SFabien Sanglard
87*3f982cf4SFabien Sanglard // Googletest strongly recommends that we roll our own main
88*3f982cf4SFabien Sanglard // function if we want to do global test environment setup.
89*3f982cf4SFabien Sanglard // See the below link for more info;
90*3f982cf4SFabien Sanglard // https://github.com/google/googletest/blob/master/docs/advanced.md#sharing-resources-between-tests-in-the-same-test-suite
91*3f982cf4SFabien Sanglard // TODO(issuetracker.google.com/172242670): rename reference to "main"
92*3f982cf4SFabien Sanglard // once googletest has a "main" branch.
93*3f982cf4SFabien Sanglard // This main method is a drop-in replacement for anywhere that currently
94*3f982cf4SFabien Sanglard // depends on gtest_main, meaning it can be linked into any test-only binary
95*3f982cf4SFabien Sanglard // to provide a main implementation that supports setting flags and other
96*3f982cf4SFabien Sanglard // state that we want shared between all tests.
main(int argc,char ** argv)97*3f982cf4SFabien Sanglard int main(int argc, char** argv) {
98*3f982cf4SFabien Sanglard auto state = InitFromArgs(argc, argv);
99*3f982cf4SFabien Sanglard if (!state.args_are_valid) {
100*3f982cf4SFabien Sanglard return 1;
101*3f982cf4SFabien Sanglard }
102*3f982cf4SFabien Sanglard
103*3f982cf4SFabien Sanglard testing::InitGoogleTest(&argc, argv);
104*3f982cf4SFabien Sanglard return RUN_ALL_TESTS();
105*3f982cf4SFabien Sanglard }
106