/* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include #include #include #include #include #include #include #include #include #include #include "Color.h" #include "Options.h" #include "Test.h" namespace android { namespace gtest_extras { class Isolate { public: Isolate(const Options& options, const std::vector& child_args) : options_(options), child_args_(child_args) {} void EnumerateTests(); int Run(); private: struct ResultsType { const char* color; const char* prefix; const char* list_desc; const char* title; bool (*match_func)(const Test&); void (*print_func)(const Options&, const Test&); }; size_t CheckTestsFinished(); void CheckTestsTimeout(); int ChildProcessFn(const std::tuple& test); void HandleSignals(); void LaunchTests(); void ReadTestsOutput(); void RunAllTests(); void PrintFooter(uint64_t elapsed_time_ns); void PrintResults(size_t total, const ResultsType& results, std::string* footer); void WriteXmlResults(uint64_t elapsed_time_ns, time_t start_time); static std::string GetTestName(const std::tuple& test) { return std::get<0>(test) + std::get<1>(test); } const Options& options_; const std::vector& child_args_; size_t total_suites_ = 0; size_t total_tests_ = 0; size_t total_disable_tests_ = 0; size_t total_pass_tests_; size_t total_xpass_tests_; size_t total_fail_tests_; size_t total_xfail_tests_; size_t total_timeout_tests_; size_t total_slow_tests_; size_t total_skipped_tests_; size_t cur_test_index_ = 0; uint64_t slow_threshold_ns_; uint64_t deadline_threshold_ns_; std::vector> tests_; std::vector running_; std::vector running_pollfds_; std::vector running_indices_; std::unordered_map> running_by_pid_; std::map running_by_test_index_; std::map> finished_; static constexpr useconds_t MIN_USECONDS_WAIT = 1000; static ResultsType SlowResults; static ResultsType XpassFailResults; static ResultsType FailResults; static ResultsType TimeoutResults; static ResultsType SkippedResults; }; } // namespace gtest_extras } // namespace android