blob: f59f292dcd67e8631261f6f4120b57ba28a83dc9 [file] [log] [blame]
// Copyright 2019 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMMON_MK_TESTRUNNER_H_
#define COMMON_MK_TESTRUNNER_H_
#include <memory>
#include <base/at_exit.h>
#include <base/command_line.h>
#include <base/logging.h>
#include <base/test/test_timeouts.h>
#include <brillo/syslog_logging.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
namespace platform2 {
// The TestRunner class allows platform2 components to override the default
// testrunner behavior if they have special requirements.
//
// For example, if your test already instantiates a base::AtExitManager, you
// can tell TestRunner not to instantiate another one (multiple instances
// will result in an assert):
//
// // your_testrunner.cc
// #include "common-mk/testrunner.h"
// int main(int argc, char** argv) {
// platform2::TestRunner::Options opts;
// opts.instantiate_exit_manager = false;
// auto runner = platform2::TestRunner(argc, argv, opts);
// return runner.Run();
// }
class TestRunner {
public:
struct Options {
// Should be "= default". Using an empty constructor instead to work around
// a clang bug: https://github.com/llvm/llvm-project/issues/36032
Options() {} // = default;
bool instantiate_exit_manager = true;
bool instantiate_test_timeouts = true;
// If true, initializes brillo logging so tests would be able to test logs
// by calling
// brillo::LogToString(true);
// brillo::ClearLog();
// // Code that produces logs...
// // Checks that examine logs from brillo::GetLog()...
bool initialize_brillo_logging = true;
};
TestRunner(int argc, char** argv, const Options& opts = Options()) {
base::CommandLine::Init(argc, argv);
if (opts.initialize_brillo_logging) {
brillo::InitLog(brillo::kLogToStderr);
} else {
logging::InitLogging(logging::LoggingSettings());
}
if (opts.instantiate_exit_manager) {
exit_manager_ = std::make_unique<base::AtExitManager>();
}
if (opts.instantiate_test_timeouts) {
TestTimeouts::Initialize();
}
testing::InitGoogleTest(&argc, argv);
testing::InitGoogleMock(&argc, argv);
}
int Run() { return RUN_ALL_TESTS(); }
private:
std::unique_ptr<base::AtExitManager> exit_manager_;
};
} // namespace platform2
#endif // COMMON_MK_TESTRUNNER_H_