blob: 443278c78a57f29a9c13b7e09bda7ddbb8002e12 [file] [log] [blame]
// 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 <getopt.h>
#include <iostream>
#include <string>
#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>
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<openscreen::TextTraceLoggingPlatform> 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<openscreen::TextTraceLoggingPlatform>();
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/googletest/docs/advanced.md#sharing-resources-between-tests-in-the-same-test-case
//
// 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();
}