// Copyright 2013 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. #ifndef BASE_TEST_LAUNCHER_UNIT_TEST_LAUNCHER_H_ #define BASE_TEST_LAUNCHER_UNIT_TEST_LAUNCHER_H_ #include #include #include #include "base/callback.h" #include "base/files/file_path.h" #include "base/macros.h" #include "base/test/launcher/test_launcher.h" #include "build/build_config.h" namespace base { // Callback that runs a test suite and returns exit code. using RunTestSuiteCallback = OnceCallback; // Launches unit tests in given test suite. Returns exit code. int LaunchUnitTests(int argc, char** argv, RunTestSuiteCallback run_test_suite); // Same as above, but always runs tests serially. int LaunchUnitTestsSerially(int argc, char** argv, RunTestSuiteCallback run_test_suite); // Launches unit tests in given test suite. Returns exit code. // |parallel_jobs| is the number of parallel test jobs. // |default_batch_limit| is the default size of test batch // (use 0 to disable batching). // |use_job_objects| determines whether to use job objects. int LaunchUnitTestsWithOptions(int argc, char** argv, size_t parallel_jobs, int default_batch_limit, bool use_job_objects, RunTestSuiteCallback run_test_suite); #if defined(OS_WIN) // Launches unit tests in given test suite. Returns exit code. // |use_job_objects| determines whether to use job objects. int LaunchUnitTests(int argc, wchar_t** argv, bool use_job_objects, RunTestSuiteCallback run_test_suite); #endif // defined(OS_WIN) // Delegate to abstract away platform differences for unit tests. class UnitTestPlatformDelegate { public: // Called to get names of tests available for running. The delegate // must put the result in |output| and return true on success. virtual bool GetTests(std::vector* output) = 0; // Called to create a temporary for storing test results. The delegate // must put the resulting path in |path| and return true on success. virtual bool CreateResultsFile(base::FilePath* path) = 0; // Called to create a new temporary file. The delegate must put the resulting // path in |path| and return true on success. virtual bool CreateTemporaryFile(base::FilePath* path) = 0; // Returns command line for child GTest process based on the command line // of current process. |test_names| is a vector of test full names // (e.g. "A.B"), |output_file| is path to the GTest XML output file. virtual CommandLine GetCommandLineForChildGTestProcess( const std::vector& test_names, const base::FilePath& output_file, const base::FilePath& flag_file) = 0; // Returns wrapper to use for child GTest process. Empty string means // no wrapper. virtual std::string GetWrapperForChildGTestProcess() = 0; // Relaunch tests, e.g. after a crash. virtual void RelaunchTests(TestLauncher* test_launcher, const std::vector& test_names, int launch_flags) = 0; protected: ~UnitTestPlatformDelegate() = default; }; // Runs tests serially, each in its own process. void RunUnitTestsSerially(TestLauncher* test_launcher, UnitTestPlatformDelegate* platform_delegate, const std::vector& test_names, int launch_flags); // Runs tests in batches (each batch in its own process). void RunUnitTestsBatch(TestLauncher* test_launcher, UnitTestPlatformDelegate* platform_delegate, const std::vector& test_names, int launch_flags); // Test launcher delegate for unit tests (mostly to support batching). class UnitTestLauncherDelegate : public TestLauncherDelegate { public: UnitTestLauncherDelegate(UnitTestPlatformDelegate* delegate, size_t batch_limit, bool use_job_objects); ~UnitTestLauncherDelegate() override; private: // TestLauncherDelegate: bool GetTests(std::vector* output) override; bool ShouldRunTest(const std::string& test_case_name, const std::string& test_name) override; size_t RunTests(TestLauncher* test_launcher, const std::vector& test_names) override; size_t RetryTests(TestLauncher* test_launcher, const std::vector& test_names) override; ThreadChecker thread_checker_; UnitTestPlatformDelegate* platform_delegate_; // Maximum number of tests to run in a single batch. size_t batch_limit_; // Determines whether we use job objects on Windows. bool use_job_objects_; DISALLOW_COPY_AND_ASSIGN(UnitTestLauncherDelegate); }; } // namespace base #endif // BASE_TEST_LAUNCHER_UNIT_TEST_LAUNCHER_H_