1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #pragma once
18 
19 #include <poll.h>
20 #include <stdint.h>
21 #include <sys/types.h>
22 
23 #include <map>
24 #include <memory>
25 #include <stack>
26 #include <string>
27 #include <tuple>
28 #include <unordered_map>
29 #include <vector>
30 
31 #include "Color.h"
32 #include "Options.h"
33 #include "Test.h"
34 
35 namespace android {
36 namespace gtest_extras {
37 
38 class Isolate {
39  public:
40   Isolate(const Options& options, const std::vector<char*>& child_args)
41       : options_(options), child_args_(child_args) {}
42 
43   void EnumerateTests();
44 
45   int Run();
46 
47  private:
48   struct ResultsType {
49     const char* color;
50     const char* prefix;
51     const char* list_desc;
52     const char* title;
53     bool (*match_func)(const Test&);
54     void (*print_func)(const Options&, const Test&);
55   };
56 
57   size_t CheckTestsFinished();
58 
59   void CheckTestsTimeout();
60 
61   int ChildProcessFn(const std::tuple<std::string, std::string>& test);
62 
63   void HandleSignals();
64 
65   void LaunchTests();
66 
67   void ReadTestsOutput();
68 
69   void RunAllTests();
70 
71   void PrintFooter(uint64_t elapsed_time_ns);
72 
73   void PrintResults(size_t total, const ResultsType& results, std::string* footer);
74 
75   void WriteXmlResults(uint64_t elapsed_time_ns, time_t start_time);
76 
77   static std::string GetTestName(const std::tuple<std::string, std::string>& test) {
78     return std::get<0>(test) + std::get<1>(test);
79   }
80 
81   const Options& options_;
82   const std::vector<char*>& child_args_;
83 
84   size_t total_suites_ = 0;
85   size_t total_tests_ = 0;
86   size_t total_disable_tests_ = 0;
87   size_t total_pass_tests_;
88   size_t total_xpass_tests_;
89   size_t total_fail_tests_;
90   size_t total_xfail_tests_;
91   size_t total_timeout_tests_;
92   size_t total_slow_tests_;
93   size_t total_skipped_tests_;
94   size_t cur_test_index_ = 0;
95 
96   uint64_t slow_threshold_ns_;
97   uint64_t deadline_threshold_ns_;
98   std::vector<std::tuple<std::string, std::string>> tests_;
99 
100   std::vector<Test*> running_;
101   std::vector<pollfd> running_pollfds_;
102   std::vector<size_t> running_indices_;
103   std::unordered_map<pid_t, std::unique_ptr<Test>> running_by_pid_;
104   std::map<size_t, Test*> running_by_test_index_;
105 
106   std::map<size_t, std::unique_ptr<Test>> finished_;
107 
108   static constexpr useconds_t MIN_USECONDS_WAIT = 1000;
109 
110   static ResultsType SlowResults;
111   static ResultsType XpassFailResults;
112   static ResultsType FailResults;
113   static ResultsType TimeoutResults;
114   static ResultsType SkippedResults;
115 };
116 
117 }  // namespace gtest_extras
118 }  // namespace android
119