| /* |
| * 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 <poll.h> |
| #include <stdint.h> |
| #include <sys/types.h> |
| |
| #include <map> |
| #include <memory> |
| #include <stack> |
| #include <string> |
| #include <tuple> |
| #include <unordered_map> |
| #include <vector> |
| |
| #include "Color.h" |
| #include "Options.h" |
| #include "Test.h" |
| |
| namespace android { |
| namespace gtest_extras { |
| |
| class Isolate { |
| public: |
| Isolate(const Options& options, const std::vector<const char*>& 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<std::string, std::string>& 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<std::string, std::string>& test) { |
| return std::get<0>(test) + std::get<1>(test); |
| } |
| |
| const Options& options_; |
| const std::vector<const char*>& child_args_; |
| |
| size_t total_cases_ = 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 cur_test_index_ = 0; |
| |
| uint64_t slow_threshold_ns_; |
| uint64_t deadline_threshold_ns_; |
| std::vector<std::tuple<std::string, std::string>> tests_; |
| |
| std::vector<Test*> running_; |
| std::vector<pollfd> running_pollfds_; |
| std::vector<size_t> running_indices_; |
| std::unordered_map<pid_t, std::unique_ptr<Test>> running_by_pid_; |
| std::map<size_t, Test*> running_by_test_index_; |
| |
| std::map<size_t, std::unique_ptr<Test>> finished_; |
| |
| static constexpr useconds_t MIN_USECONDS_WAIT = 1000; |
| |
| static ResultsType SlowResults; |
| static ResultsType XpassFailResults; |
| static ResultsType FailResults; |
| static ResultsType TimeoutResults; |
| }; |
| |
| } // namespace gtest_extras |
| } // namespace android |