xref: /aosp_15_r20/external/fmtlib/test/gtest/gmock-gtest-all.cc (revision 5c90c05cd622c0a81b57953a4d343e0e489f2e08)
1*5c90c05cSAndroid Build Coastguard Worker // Copyright 2008, Google Inc.
2*5c90c05cSAndroid Build Coastguard Worker // All rights reserved.
3*5c90c05cSAndroid Build Coastguard Worker //
4*5c90c05cSAndroid Build Coastguard Worker // Redistribution and use in source and binary forms, with or without
5*5c90c05cSAndroid Build Coastguard Worker // modification, are permitted provided that the following conditions are
6*5c90c05cSAndroid Build Coastguard Worker // met:
7*5c90c05cSAndroid Build Coastguard Worker //
8*5c90c05cSAndroid Build Coastguard Worker //     * Redistributions of source code must retain the above copyright
9*5c90c05cSAndroid Build Coastguard Worker // notice, this list of conditions and the following disclaimer.
10*5c90c05cSAndroid Build Coastguard Worker //     * Redistributions in binary form must reproduce the above
11*5c90c05cSAndroid Build Coastguard Worker // copyright notice, this list of conditions and the following disclaimer
12*5c90c05cSAndroid Build Coastguard Worker // in the documentation and/or other materials provided with the
13*5c90c05cSAndroid Build Coastguard Worker // distribution.
14*5c90c05cSAndroid Build Coastguard Worker //     * Neither the name of Google Inc. nor the names of its
15*5c90c05cSAndroid Build Coastguard Worker // contributors may be used to endorse or promote products derived from
16*5c90c05cSAndroid Build Coastguard Worker // this software without specific prior written permission.
17*5c90c05cSAndroid Build Coastguard Worker //
18*5c90c05cSAndroid Build Coastguard Worker // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19*5c90c05cSAndroid Build Coastguard Worker // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20*5c90c05cSAndroid Build Coastguard Worker // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21*5c90c05cSAndroid Build Coastguard Worker // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22*5c90c05cSAndroid Build Coastguard Worker // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23*5c90c05cSAndroid Build Coastguard Worker // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24*5c90c05cSAndroid Build Coastguard Worker // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25*5c90c05cSAndroid Build Coastguard Worker // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26*5c90c05cSAndroid Build Coastguard Worker // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27*5c90c05cSAndroid Build Coastguard Worker // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28*5c90c05cSAndroid Build Coastguard Worker // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29*5c90c05cSAndroid Build Coastguard Worker 
30*5c90c05cSAndroid Build Coastguard Worker //
31*5c90c05cSAndroid Build Coastguard Worker // Google C++ Testing and Mocking Framework (Google Test)
32*5c90c05cSAndroid Build Coastguard Worker //
33*5c90c05cSAndroid Build Coastguard Worker // Sometimes it's desirable to build Google Test by compiling a single file.
34*5c90c05cSAndroid Build Coastguard Worker // This file serves this purpose.
35*5c90c05cSAndroid Build Coastguard Worker 
36*5c90c05cSAndroid Build Coastguard Worker // This line ensures that gtest.h can be compiled on its own, even
37*5c90c05cSAndroid Build Coastguard Worker // when it's fused.
38*5c90c05cSAndroid Build Coastguard Worker #include "gtest/gtest.h"
39*5c90c05cSAndroid Build Coastguard Worker 
40*5c90c05cSAndroid Build Coastguard Worker // The following lines pull in the real gtest *.cc files.
41*5c90c05cSAndroid Build Coastguard Worker // Copyright 2005, Google Inc.
42*5c90c05cSAndroid Build Coastguard Worker // All rights reserved.
43*5c90c05cSAndroid Build Coastguard Worker //
44*5c90c05cSAndroid Build Coastguard Worker // Redistribution and use in source and binary forms, with or without
45*5c90c05cSAndroid Build Coastguard Worker // modification, are permitted provided that the following conditions are
46*5c90c05cSAndroid Build Coastguard Worker // met:
47*5c90c05cSAndroid Build Coastguard Worker //
48*5c90c05cSAndroid Build Coastguard Worker //     * Redistributions of source code must retain the above copyright
49*5c90c05cSAndroid Build Coastguard Worker // notice, this list of conditions and the following disclaimer.
50*5c90c05cSAndroid Build Coastguard Worker //     * Redistributions in binary form must reproduce the above
51*5c90c05cSAndroid Build Coastguard Worker // copyright notice, this list of conditions and the following disclaimer
52*5c90c05cSAndroid Build Coastguard Worker // in the documentation and/or other materials provided with the
53*5c90c05cSAndroid Build Coastguard Worker // distribution.
54*5c90c05cSAndroid Build Coastguard Worker //     * Neither the name of Google Inc. nor the names of its
55*5c90c05cSAndroid Build Coastguard Worker // contributors may be used to endorse or promote products derived from
56*5c90c05cSAndroid Build Coastguard Worker // this software without specific prior written permission.
57*5c90c05cSAndroid Build Coastguard Worker //
58*5c90c05cSAndroid Build Coastguard Worker // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
59*5c90c05cSAndroid Build Coastguard Worker // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
60*5c90c05cSAndroid Build Coastguard Worker // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
61*5c90c05cSAndroid Build Coastguard Worker // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
62*5c90c05cSAndroid Build Coastguard Worker // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
63*5c90c05cSAndroid Build Coastguard Worker // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
64*5c90c05cSAndroid Build Coastguard Worker // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
65*5c90c05cSAndroid Build Coastguard Worker // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
66*5c90c05cSAndroid Build Coastguard Worker // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
67*5c90c05cSAndroid Build Coastguard Worker // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
68*5c90c05cSAndroid Build Coastguard Worker // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
69*5c90c05cSAndroid Build Coastguard Worker 
70*5c90c05cSAndroid Build Coastguard Worker //
71*5c90c05cSAndroid Build Coastguard Worker // The Google C++ Testing and Mocking Framework (Google Test)
72*5c90c05cSAndroid Build Coastguard Worker 
73*5c90c05cSAndroid Build Coastguard Worker // Copyright 2007, Google Inc.
74*5c90c05cSAndroid Build Coastguard Worker // All rights reserved.
75*5c90c05cSAndroid Build Coastguard Worker //
76*5c90c05cSAndroid Build Coastguard Worker // Redistribution and use in source and binary forms, with or without
77*5c90c05cSAndroid Build Coastguard Worker // modification, are permitted provided that the following conditions are
78*5c90c05cSAndroid Build Coastguard Worker // met:
79*5c90c05cSAndroid Build Coastguard Worker //
80*5c90c05cSAndroid Build Coastguard Worker //     * Redistributions of source code must retain the above copyright
81*5c90c05cSAndroid Build Coastguard Worker // notice, this list of conditions and the following disclaimer.
82*5c90c05cSAndroid Build Coastguard Worker //     * Redistributions in binary form must reproduce the above
83*5c90c05cSAndroid Build Coastguard Worker // copyright notice, this list of conditions and the following disclaimer
84*5c90c05cSAndroid Build Coastguard Worker // in the documentation and/or other materials provided with the
85*5c90c05cSAndroid Build Coastguard Worker // distribution.
86*5c90c05cSAndroid Build Coastguard Worker //     * Neither the name of Google Inc. nor the names of its
87*5c90c05cSAndroid Build Coastguard Worker // contributors may be used to endorse or promote products derived from
88*5c90c05cSAndroid Build Coastguard Worker // this software without specific prior written permission.
89*5c90c05cSAndroid Build Coastguard Worker //
90*5c90c05cSAndroid Build Coastguard Worker // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
91*5c90c05cSAndroid Build Coastguard Worker // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
92*5c90c05cSAndroid Build Coastguard Worker // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
93*5c90c05cSAndroid Build Coastguard Worker // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
94*5c90c05cSAndroid Build Coastguard Worker // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
95*5c90c05cSAndroid Build Coastguard Worker // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
96*5c90c05cSAndroid Build Coastguard Worker // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
97*5c90c05cSAndroid Build Coastguard Worker // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
98*5c90c05cSAndroid Build Coastguard Worker // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
99*5c90c05cSAndroid Build Coastguard Worker // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
100*5c90c05cSAndroid Build Coastguard Worker // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
101*5c90c05cSAndroid Build Coastguard Worker 
102*5c90c05cSAndroid Build Coastguard Worker //
103*5c90c05cSAndroid Build Coastguard Worker // Utilities for testing Google Test itself and code that uses Google Test
104*5c90c05cSAndroid Build Coastguard Worker // (e.g. frameworks built on top of Google Test).
105*5c90c05cSAndroid Build Coastguard Worker 
106*5c90c05cSAndroid Build Coastguard Worker // GOOGLETEST_CM0004 DO NOT DELETE
107*5c90c05cSAndroid Build Coastguard Worker 
108*5c90c05cSAndroid Build Coastguard Worker #ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_SPI_H_
109*5c90c05cSAndroid Build Coastguard Worker #define GOOGLETEST_INCLUDE_GTEST_GTEST_SPI_H_
110*5c90c05cSAndroid Build Coastguard Worker 
111*5c90c05cSAndroid Build Coastguard Worker 
112*5c90c05cSAndroid Build Coastguard Worker GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \
113*5c90c05cSAndroid Build Coastguard Worker /* class A needs to have dll-interface to be used by clients of class B */)
114*5c90c05cSAndroid Build Coastguard Worker 
115*5c90c05cSAndroid Build Coastguard Worker namespace testing {
116*5c90c05cSAndroid Build Coastguard Worker 
117*5c90c05cSAndroid Build Coastguard Worker // This helper class can be used to mock out Google Test failure reporting
118*5c90c05cSAndroid Build Coastguard Worker // so that we can test Google Test or code that builds on Google Test.
119*5c90c05cSAndroid Build Coastguard Worker //
120*5c90c05cSAndroid Build Coastguard Worker // An object of this class appends a TestPartResult object to the
121*5c90c05cSAndroid Build Coastguard Worker // TestPartResultArray object given in the constructor whenever a Google Test
122*5c90c05cSAndroid Build Coastguard Worker // failure is reported. It can either intercept only failures that are
123*5c90c05cSAndroid Build Coastguard Worker // generated in the same thread that created this object or it can intercept
124*5c90c05cSAndroid Build Coastguard Worker // all generated failures. The scope of this mock object can be controlled with
125*5c90c05cSAndroid Build Coastguard Worker // the second argument to the two arguments constructor.
126*5c90c05cSAndroid Build Coastguard Worker class GTEST_API_ ScopedFakeTestPartResultReporter
127*5c90c05cSAndroid Build Coastguard Worker     : public TestPartResultReporterInterface {
128*5c90c05cSAndroid Build Coastguard Worker  public:
129*5c90c05cSAndroid Build Coastguard Worker   // The two possible mocking modes of this object.
130*5c90c05cSAndroid Build Coastguard Worker   enum InterceptMode {
131*5c90c05cSAndroid Build Coastguard Worker     INTERCEPT_ONLY_CURRENT_THREAD,  // Intercepts only thread local failures.
132*5c90c05cSAndroid Build Coastguard Worker     INTERCEPT_ALL_THREADS           // Intercepts all failures.
133*5c90c05cSAndroid Build Coastguard Worker   };
134*5c90c05cSAndroid Build Coastguard Worker 
135*5c90c05cSAndroid Build Coastguard Worker   // The c'tor sets this object as the test part result reporter used
136*5c90c05cSAndroid Build Coastguard Worker   // by Google Test.  The 'result' parameter specifies where to report the
137*5c90c05cSAndroid Build Coastguard Worker   // results. This reporter will only catch failures generated in the current
138*5c90c05cSAndroid Build Coastguard Worker   // thread. DEPRECATED
139*5c90c05cSAndroid Build Coastguard Worker   explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result);
140*5c90c05cSAndroid Build Coastguard Worker 
141*5c90c05cSAndroid Build Coastguard Worker   // Same as above, but you can choose the interception scope of this object.
142*5c90c05cSAndroid Build Coastguard Worker   ScopedFakeTestPartResultReporter(InterceptMode intercept_mode,
143*5c90c05cSAndroid Build Coastguard Worker                                    TestPartResultArray* result);
144*5c90c05cSAndroid Build Coastguard Worker 
145*5c90c05cSAndroid Build Coastguard Worker   // The d'tor restores the previous test part result reporter.
146*5c90c05cSAndroid Build Coastguard Worker   ~ScopedFakeTestPartResultReporter() override;
147*5c90c05cSAndroid Build Coastguard Worker 
148*5c90c05cSAndroid Build Coastguard Worker   // Appends the TestPartResult object to the TestPartResultArray
149*5c90c05cSAndroid Build Coastguard Worker   // received in the constructor.
150*5c90c05cSAndroid Build Coastguard Worker   //
151*5c90c05cSAndroid Build Coastguard Worker   // This method is from the TestPartResultReporterInterface
152*5c90c05cSAndroid Build Coastguard Worker   // interface.
153*5c90c05cSAndroid Build Coastguard Worker   void ReportTestPartResult(const TestPartResult& result) override;
154*5c90c05cSAndroid Build Coastguard Worker 
155*5c90c05cSAndroid Build Coastguard Worker  private:
156*5c90c05cSAndroid Build Coastguard Worker   void Init();
157*5c90c05cSAndroid Build Coastguard Worker 
158*5c90c05cSAndroid Build Coastguard Worker   const InterceptMode intercept_mode_;
159*5c90c05cSAndroid Build Coastguard Worker   TestPartResultReporterInterface* old_reporter_;
160*5c90c05cSAndroid Build Coastguard Worker   TestPartResultArray* const result_;
161*5c90c05cSAndroid Build Coastguard Worker 
162*5c90c05cSAndroid Build Coastguard Worker   GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter);
163*5c90c05cSAndroid Build Coastguard Worker };
164*5c90c05cSAndroid Build Coastguard Worker 
165*5c90c05cSAndroid Build Coastguard Worker namespace internal {
166*5c90c05cSAndroid Build Coastguard Worker 
167*5c90c05cSAndroid Build Coastguard Worker // A helper class for implementing EXPECT_FATAL_FAILURE() and
168*5c90c05cSAndroid Build Coastguard Worker // EXPECT_NONFATAL_FAILURE().  Its destructor verifies that the given
169*5c90c05cSAndroid Build Coastguard Worker // TestPartResultArray contains exactly one failure that has the given
170*5c90c05cSAndroid Build Coastguard Worker // type and contains the given substring.  If that's not the case, a
171*5c90c05cSAndroid Build Coastguard Worker // non-fatal failure will be generated.
172*5c90c05cSAndroid Build Coastguard Worker class GTEST_API_ SingleFailureChecker {
173*5c90c05cSAndroid Build Coastguard Worker  public:
174*5c90c05cSAndroid Build Coastguard Worker   // The constructor remembers the arguments.
175*5c90c05cSAndroid Build Coastguard Worker   SingleFailureChecker(const TestPartResultArray* results,
176*5c90c05cSAndroid Build Coastguard Worker                        TestPartResult::Type type, const std::string& substr);
177*5c90c05cSAndroid Build Coastguard Worker   ~SingleFailureChecker();
178*5c90c05cSAndroid Build Coastguard Worker  private:
179*5c90c05cSAndroid Build Coastguard Worker   const TestPartResultArray* const results_;
180*5c90c05cSAndroid Build Coastguard Worker   const TestPartResult::Type type_;
181*5c90c05cSAndroid Build Coastguard Worker   const std::string substr_;
182*5c90c05cSAndroid Build Coastguard Worker 
183*5c90c05cSAndroid Build Coastguard Worker   GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker);
184*5c90c05cSAndroid Build Coastguard Worker };
185*5c90c05cSAndroid Build Coastguard Worker 
186*5c90c05cSAndroid Build Coastguard Worker }  // namespace internal
187*5c90c05cSAndroid Build Coastguard Worker 
188*5c90c05cSAndroid Build Coastguard Worker }  // namespace testing
189*5c90c05cSAndroid Build Coastguard Worker 
190*5c90c05cSAndroid Build Coastguard Worker GTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251
191*5c90c05cSAndroid Build Coastguard Worker 
192*5c90c05cSAndroid Build Coastguard Worker // A set of macros for testing Google Test assertions or code that's expected
193*5c90c05cSAndroid Build Coastguard Worker // to generate Google Test fatal failures.  It verifies that the given
194*5c90c05cSAndroid Build Coastguard Worker // statement will cause exactly one fatal Google Test failure with 'substr'
195*5c90c05cSAndroid Build Coastguard Worker // being part of the failure message.
196*5c90c05cSAndroid Build Coastguard Worker //
197*5c90c05cSAndroid Build Coastguard Worker // There are two different versions of this macro. EXPECT_FATAL_FAILURE only
198*5c90c05cSAndroid Build Coastguard Worker // affects and considers failures generated in the current thread and
199*5c90c05cSAndroid Build Coastguard Worker // EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
200*5c90c05cSAndroid Build Coastguard Worker //
201*5c90c05cSAndroid Build Coastguard Worker // The verification of the assertion is done correctly even when the statement
202*5c90c05cSAndroid Build Coastguard Worker // throws an exception or aborts the current function.
203*5c90c05cSAndroid Build Coastguard Worker //
204*5c90c05cSAndroid Build Coastguard Worker // Known restrictions:
205*5c90c05cSAndroid Build Coastguard Worker //   - 'statement' cannot reference local non-static variables or
206*5c90c05cSAndroid Build Coastguard Worker //     non-static members of the current object.
207*5c90c05cSAndroid Build Coastguard Worker //   - 'statement' cannot return a value.
208*5c90c05cSAndroid Build Coastguard Worker //   - You cannot stream a failure message to this macro.
209*5c90c05cSAndroid Build Coastguard Worker //
210*5c90c05cSAndroid Build Coastguard Worker // Note that even though the implementations of the following two
211*5c90c05cSAndroid Build Coastguard Worker // macros are much alike, we cannot refactor them to use a common
212*5c90c05cSAndroid Build Coastguard Worker // helper macro, due to some peculiarity in how the preprocessor
213*5c90c05cSAndroid Build Coastguard Worker // works.  The AcceptsMacroThatExpandsToUnprotectedComma test in
214*5c90c05cSAndroid Build Coastguard Worker // gtest_unittest.cc will fail to compile if we do that.
215*5c90c05cSAndroid Build Coastguard Worker #define EXPECT_FATAL_FAILURE(statement, substr) \
216*5c90c05cSAndroid Build Coastguard Worker   do { \
217*5c90c05cSAndroid Build Coastguard Worker     class GTestExpectFatalFailureHelper {\
218*5c90c05cSAndroid Build Coastguard Worker      public:\
219*5c90c05cSAndroid Build Coastguard Worker       static void Execute() { statement; }\
220*5c90c05cSAndroid Build Coastguard Worker     };\
221*5c90c05cSAndroid Build Coastguard Worker     ::testing::TestPartResultArray gtest_failures;\
222*5c90c05cSAndroid Build Coastguard Worker     ::testing::internal::SingleFailureChecker gtest_checker(\
223*5c90c05cSAndroid Build Coastguard Worker         &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
224*5c90c05cSAndroid Build Coastguard Worker     {\
225*5c90c05cSAndroid Build Coastguard Worker       ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
226*5c90c05cSAndroid Build Coastguard Worker           ::testing::ScopedFakeTestPartResultReporter:: \
227*5c90c05cSAndroid Build Coastguard Worker           INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\
228*5c90c05cSAndroid Build Coastguard Worker       GTestExpectFatalFailureHelper::Execute();\
229*5c90c05cSAndroid Build Coastguard Worker     }\
230*5c90c05cSAndroid Build Coastguard Worker   } while (::testing::internal::AlwaysFalse())
231*5c90c05cSAndroid Build Coastguard Worker 
232*5c90c05cSAndroid Build Coastguard Worker #define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
233*5c90c05cSAndroid Build Coastguard Worker   do { \
234*5c90c05cSAndroid Build Coastguard Worker     class GTestExpectFatalFailureHelper {\
235*5c90c05cSAndroid Build Coastguard Worker      public:\
236*5c90c05cSAndroid Build Coastguard Worker       static void Execute() { statement; }\
237*5c90c05cSAndroid Build Coastguard Worker     };\
238*5c90c05cSAndroid Build Coastguard Worker     ::testing::TestPartResultArray gtest_failures;\
239*5c90c05cSAndroid Build Coastguard Worker     ::testing::internal::SingleFailureChecker gtest_checker(\
240*5c90c05cSAndroid Build Coastguard Worker         &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
241*5c90c05cSAndroid Build Coastguard Worker     {\
242*5c90c05cSAndroid Build Coastguard Worker       ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
243*5c90c05cSAndroid Build Coastguard Worker           ::testing::ScopedFakeTestPartResultReporter:: \
244*5c90c05cSAndroid Build Coastguard Worker           INTERCEPT_ALL_THREADS, &gtest_failures);\
245*5c90c05cSAndroid Build Coastguard Worker       GTestExpectFatalFailureHelper::Execute();\
246*5c90c05cSAndroid Build Coastguard Worker     }\
247*5c90c05cSAndroid Build Coastguard Worker   } while (::testing::internal::AlwaysFalse())
248*5c90c05cSAndroid Build Coastguard Worker 
249*5c90c05cSAndroid Build Coastguard Worker // A macro for testing Google Test assertions or code that's expected to
250*5c90c05cSAndroid Build Coastguard Worker // generate Google Test non-fatal failures.  It asserts that the given
251*5c90c05cSAndroid Build Coastguard Worker // statement will cause exactly one non-fatal Google Test failure with 'substr'
252*5c90c05cSAndroid Build Coastguard Worker // being part of the failure message.
253*5c90c05cSAndroid Build Coastguard Worker //
254*5c90c05cSAndroid Build Coastguard Worker // There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only
255*5c90c05cSAndroid Build Coastguard Worker // affects and considers failures generated in the current thread and
256*5c90c05cSAndroid Build Coastguard Worker // EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
257*5c90c05cSAndroid Build Coastguard Worker //
258*5c90c05cSAndroid Build Coastguard Worker // 'statement' is allowed to reference local variables and members of
259*5c90c05cSAndroid Build Coastguard Worker // the current object.
260*5c90c05cSAndroid Build Coastguard Worker //
261*5c90c05cSAndroid Build Coastguard Worker // The verification of the assertion is done correctly even when the statement
262*5c90c05cSAndroid Build Coastguard Worker // throws an exception or aborts the current function.
263*5c90c05cSAndroid Build Coastguard Worker //
264*5c90c05cSAndroid Build Coastguard Worker // Known restrictions:
265*5c90c05cSAndroid Build Coastguard Worker //   - You cannot stream a failure message to this macro.
266*5c90c05cSAndroid Build Coastguard Worker //
267*5c90c05cSAndroid Build Coastguard Worker // Note that even though the implementations of the following two
268*5c90c05cSAndroid Build Coastguard Worker // macros are much alike, we cannot refactor them to use a common
269*5c90c05cSAndroid Build Coastguard Worker // helper macro, due to some peculiarity in how the preprocessor
270*5c90c05cSAndroid Build Coastguard Worker // works.  If we do that, the code won't compile when the user gives
271*5c90c05cSAndroid Build Coastguard Worker // EXPECT_NONFATAL_FAILURE() a statement that contains a macro that
272*5c90c05cSAndroid Build Coastguard Worker // expands to code containing an unprotected comma.  The
273*5c90c05cSAndroid Build Coastguard Worker // AcceptsMacroThatExpandsToUnprotectedComma test in gtest_unittest.cc
274*5c90c05cSAndroid Build Coastguard Worker // catches that.
275*5c90c05cSAndroid Build Coastguard Worker //
276*5c90c05cSAndroid Build Coastguard Worker // For the same reason, we have to write
277*5c90c05cSAndroid Build Coastguard Worker //   if (::testing::internal::AlwaysTrue()) { statement; }
278*5c90c05cSAndroid Build Coastguard Worker // instead of
279*5c90c05cSAndroid Build Coastguard Worker //   GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
280*5c90c05cSAndroid Build Coastguard Worker // to avoid an MSVC warning on unreachable code.
281*5c90c05cSAndroid Build Coastguard Worker #define EXPECT_NONFATAL_FAILURE(statement, substr) \
282*5c90c05cSAndroid Build Coastguard Worker   do {\
283*5c90c05cSAndroid Build Coastguard Worker     ::testing::TestPartResultArray gtest_failures;\
284*5c90c05cSAndroid Build Coastguard Worker     ::testing::internal::SingleFailureChecker gtest_checker(\
285*5c90c05cSAndroid Build Coastguard Worker         &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \
286*5c90c05cSAndroid Build Coastguard Worker         (substr));\
287*5c90c05cSAndroid Build Coastguard Worker     {\
288*5c90c05cSAndroid Build Coastguard Worker       ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
289*5c90c05cSAndroid Build Coastguard Worker           ::testing::ScopedFakeTestPartResultReporter:: \
290*5c90c05cSAndroid Build Coastguard Worker           INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\
291*5c90c05cSAndroid Build Coastguard Worker       if (::testing::internal::AlwaysTrue()) { statement; }\
292*5c90c05cSAndroid Build Coastguard Worker     }\
293*5c90c05cSAndroid Build Coastguard Worker   } while (::testing::internal::AlwaysFalse())
294*5c90c05cSAndroid Build Coastguard Worker 
295*5c90c05cSAndroid Build Coastguard Worker #define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
296*5c90c05cSAndroid Build Coastguard Worker   do {\
297*5c90c05cSAndroid Build Coastguard Worker     ::testing::TestPartResultArray gtest_failures;\
298*5c90c05cSAndroid Build Coastguard Worker     ::testing::internal::SingleFailureChecker gtest_checker(\
299*5c90c05cSAndroid Build Coastguard Worker         &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \
300*5c90c05cSAndroid Build Coastguard Worker         (substr));\
301*5c90c05cSAndroid Build Coastguard Worker     {\
302*5c90c05cSAndroid Build Coastguard Worker       ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
303*5c90c05cSAndroid Build Coastguard Worker           ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS, \
304*5c90c05cSAndroid Build Coastguard Worker           &gtest_failures);\
305*5c90c05cSAndroid Build Coastguard Worker       if (::testing::internal::AlwaysTrue()) { statement; }\
306*5c90c05cSAndroid Build Coastguard Worker     }\
307*5c90c05cSAndroid Build Coastguard Worker   } while (::testing::internal::AlwaysFalse())
308*5c90c05cSAndroid Build Coastguard Worker 
309*5c90c05cSAndroid Build Coastguard Worker #endif  // GOOGLETEST_INCLUDE_GTEST_GTEST_SPI_H_
310*5c90c05cSAndroid Build Coastguard Worker 
311*5c90c05cSAndroid Build Coastguard Worker #include <ctype.h>
312*5c90c05cSAndroid Build Coastguard Worker #include <stdarg.h>
313*5c90c05cSAndroid Build Coastguard Worker #include <stdio.h>
314*5c90c05cSAndroid Build Coastguard Worker #include <stdlib.h>
315*5c90c05cSAndroid Build Coastguard Worker #include <time.h>
316*5c90c05cSAndroid Build Coastguard Worker #include <wchar.h>
317*5c90c05cSAndroid Build Coastguard Worker #include <wctype.h>
318*5c90c05cSAndroid Build Coastguard Worker 
319*5c90c05cSAndroid Build Coastguard Worker #include <algorithm>
320*5c90c05cSAndroid Build Coastguard Worker #include <chrono>  // NOLINT
321*5c90c05cSAndroid Build Coastguard Worker #include <cmath>
322*5c90c05cSAndroid Build Coastguard Worker #include <cstdint>
323*5c90c05cSAndroid Build Coastguard Worker #include <iomanip>
324*5c90c05cSAndroid Build Coastguard Worker #include <limits>
325*5c90c05cSAndroid Build Coastguard Worker #include <list>
326*5c90c05cSAndroid Build Coastguard Worker #include <map>
327*5c90c05cSAndroid Build Coastguard Worker #include <ostream>  // NOLINT
328*5c90c05cSAndroid Build Coastguard Worker #include <sstream>
329*5c90c05cSAndroid Build Coastguard Worker #include <vector>
330*5c90c05cSAndroid Build Coastguard Worker 
331*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_LINUX
332*5c90c05cSAndroid Build Coastguard Worker 
333*5c90c05cSAndroid Build Coastguard Worker # include <fcntl.h>  // NOLINT
334*5c90c05cSAndroid Build Coastguard Worker # include <limits.h>  // NOLINT
335*5c90c05cSAndroid Build Coastguard Worker # include <sched.h>  // NOLINT
336*5c90c05cSAndroid Build Coastguard Worker // Declares vsnprintf().  This header is not available on Windows.
337*5c90c05cSAndroid Build Coastguard Worker # include <strings.h>  // NOLINT
338*5c90c05cSAndroid Build Coastguard Worker # include <sys/mman.h>  // NOLINT
339*5c90c05cSAndroid Build Coastguard Worker # include <sys/time.h>  // NOLINT
340*5c90c05cSAndroid Build Coastguard Worker # include <unistd.h>  // NOLINT
341*5c90c05cSAndroid Build Coastguard Worker # include <string>
342*5c90c05cSAndroid Build Coastguard Worker 
343*5c90c05cSAndroid Build Coastguard Worker #elif GTEST_OS_ZOS
344*5c90c05cSAndroid Build Coastguard Worker # include <sys/time.h>  // NOLINT
345*5c90c05cSAndroid Build Coastguard Worker 
346*5c90c05cSAndroid Build Coastguard Worker // On z/OS we additionally need strings.h for strcasecmp.
347*5c90c05cSAndroid Build Coastguard Worker # include <strings.h>  // NOLINT
348*5c90c05cSAndroid Build Coastguard Worker 
349*5c90c05cSAndroid Build Coastguard Worker #elif GTEST_OS_WINDOWS_MOBILE  // We are on Windows CE.
350*5c90c05cSAndroid Build Coastguard Worker 
351*5c90c05cSAndroid Build Coastguard Worker # include <windows.h>  // NOLINT
352*5c90c05cSAndroid Build Coastguard Worker # undef min
353*5c90c05cSAndroid Build Coastguard Worker 
354*5c90c05cSAndroid Build Coastguard Worker #elif GTEST_OS_WINDOWS  // We are on Windows proper.
355*5c90c05cSAndroid Build Coastguard Worker 
356*5c90c05cSAndroid Build Coastguard Worker # include <windows.h>  // NOLINT
357*5c90c05cSAndroid Build Coastguard Worker # undef min
358*5c90c05cSAndroid Build Coastguard Worker 
359*5c90c05cSAndroid Build Coastguard Worker #ifdef _MSC_VER
360*5c90c05cSAndroid Build Coastguard Worker # include <crtdbg.h>  // NOLINT
361*5c90c05cSAndroid Build Coastguard Worker #endif
362*5c90c05cSAndroid Build Coastguard Worker 
363*5c90c05cSAndroid Build Coastguard Worker # include <io.h>  // NOLINT
364*5c90c05cSAndroid Build Coastguard Worker # include <sys/timeb.h>  // NOLINT
365*5c90c05cSAndroid Build Coastguard Worker # include <sys/types.h>  // NOLINT
366*5c90c05cSAndroid Build Coastguard Worker # include <sys/stat.h>  // NOLINT
367*5c90c05cSAndroid Build Coastguard Worker 
368*5c90c05cSAndroid Build Coastguard Worker # if GTEST_OS_WINDOWS_MINGW
369*5c90c05cSAndroid Build Coastguard Worker #  include <sys/time.h>  // NOLINT
370*5c90c05cSAndroid Build Coastguard Worker # endif  // GTEST_OS_WINDOWS_MINGW
371*5c90c05cSAndroid Build Coastguard Worker 
372*5c90c05cSAndroid Build Coastguard Worker #else
373*5c90c05cSAndroid Build Coastguard Worker 
374*5c90c05cSAndroid Build Coastguard Worker // cpplint thinks that the header is already included, so we want to
375*5c90c05cSAndroid Build Coastguard Worker // silence it.
376*5c90c05cSAndroid Build Coastguard Worker # include <sys/time.h>  // NOLINT
377*5c90c05cSAndroid Build Coastguard Worker # include <unistd.h>  // NOLINT
378*5c90c05cSAndroid Build Coastguard Worker 
379*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_OS_LINUX
380*5c90c05cSAndroid Build Coastguard Worker 
381*5c90c05cSAndroid Build Coastguard Worker #if GTEST_HAS_EXCEPTIONS
382*5c90c05cSAndroid Build Coastguard Worker # include <stdexcept>
383*5c90c05cSAndroid Build Coastguard Worker #endif
384*5c90c05cSAndroid Build Coastguard Worker 
385*5c90c05cSAndroid Build Coastguard Worker #if GTEST_CAN_STREAM_RESULTS_
386*5c90c05cSAndroid Build Coastguard Worker # include <arpa/inet.h>  // NOLINT
387*5c90c05cSAndroid Build Coastguard Worker # include <netdb.h>  // NOLINT
388*5c90c05cSAndroid Build Coastguard Worker # include <sys/socket.h>  // NOLINT
389*5c90c05cSAndroid Build Coastguard Worker # include <sys/types.h>  // NOLINT
390*5c90c05cSAndroid Build Coastguard Worker #endif
391*5c90c05cSAndroid Build Coastguard Worker 
392*5c90c05cSAndroid Build Coastguard Worker // Copyright 2005, Google Inc.
393*5c90c05cSAndroid Build Coastguard Worker // All rights reserved.
394*5c90c05cSAndroid Build Coastguard Worker //
395*5c90c05cSAndroid Build Coastguard Worker // Redistribution and use in source and binary forms, with or without
396*5c90c05cSAndroid Build Coastguard Worker // modification, are permitted provided that the following conditions are
397*5c90c05cSAndroid Build Coastguard Worker // met:
398*5c90c05cSAndroid Build Coastguard Worker //
399*5c90c05cSAndroid Build Coastguard Worker //     * Redistributions of source code must retain the above copyright
400*5c90c05cSAndroid Build Coastguard Worker // notice, this list of conditions and the following disclaimer.
401*5c90c05cSAndroid Build Coastguard Worker //     * Redistributions in binary form must reproduce the above
402*5c90c05cSAndroid Build Coastguard Worker // copyright notice, this list of conditions and the following disclaimer
403*5c90c05cSAndroid Build Coastguard Worker // in the documentation and/or other materials provided with the
404*5c90c05cSAndroid Build Coastguard Worker // distribution.
405*5c90c05cSAndroid Build Coastguard Worker //     * Neither the name of Google Inc. nor the names of its
406*5c90c05cSAndroid Build Coastguard Worker // contributors may be used to endorse or promote products derived from
407*5c90c05cSAndroid Build Coastguard Worker // this software without specific prior written permission.
408*5c90c05cSAndroid Build Coastguard Worker //
409*5c90c05cSAndroid Build Coastguard Worker // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
410*5c90c05cSAndroid Build Coastguard Worker // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
411*5c90c05cSAndroid Build Coastguard Worker // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
412*5c90c05cSAndroid Build Coastguard Worker // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
413*5c90c05cSAndroid Build Coastguard Worker // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
414*5c90c05cSAndroid Build Coastguard Worker // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
415*5c90c05cSAndroid Build Coastguard Worker // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
416*5c90c05cSAndroid Build Coastguard Worker // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
417*5c90c05cSAndroid Build Coastguard Worker // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
418*5c90c05cSAndroid Build Coastguard Worker // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
419*5c90c05cSAndroid Build Coastguard Worker // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
420*5c90c05cSAndroid Build Coastguard Worker 
421*5c90c05cSAndroid Build Coastguard Worker // Utility functions and classes used by the Google C++ testing framework.//
422*5c90c05cSAndroid Build Coastguard Worker // This file contains purely Google Test's internal implementation.  Please
423*5c90c05cSAndroid Build Coastguard Worker // DO NOT #INCLUDE IT IN A USER PROGRAM.
424*5c90c05cSAndroid Build Coastguard Worker 
425*5c90c05cSAndroid Build Coastguard Worker #ifndef GOOGLETEST_SRC_GTEST_INTERNAL_INL_H_
426*5c90c05cSAndroid Build Coastguard Worker #define GOOGLETEST_SRC_GTEST_INTERNAL_INL_H_
427*5c90c05cSAndroid Build Coastguard Worker 
428*5c90c05cSAndroid Build Coastguard Worker #ifndef _WIN32_WCE
429*5c90c05cSAndroid Build Coastguard Worker # include <errno.h>
430*5c90c05cSAndroid Build Coastguard Worker #endif  // !_WIN32_WCE
431*5c90c05cSAndroid Build Coastguard Worker #include <stddef.h>
432*5c90c05cSAndroid Build Coastguard Worker #include <stdlib.h>  // For strtoll/_strtoul64/malloc/free.
433*5c90c05cSAndroid Build Coastguard Worker #include <string.h>  // For memmove.
434*5c90c05cSAndroid Build Coastguard Worker 
435*5c90c05cSAndroid Build Coastguard Worker #include <algorithm>
436*5c90c05cSAndroid Build Coastguard Worker #include <cstdint>
437*5c90c05cSAndroid Build Coastguard Worker #include <memory>
438*5c90c05cSAndroid Build Coastguard Worker #include <string>
439*5c90c05cSAndroid Build Coastguard Worker #include <vector>
440*5c90c05cSAndroid Build Coastguard Worker 
441*5c90c05cSAndroid Build Coastguard Worker 
442*5c90c05cSAndroid Build Coastguard Worker #if GTEST_CAN_STREAM_RESULTS_
443*5c90c05cSAndroid Build Coastguard Worker # include <arpa/inet.h>  // NOLINT
444*5c90c05cSAndroid Build Coastguard Worker # include <netdb.h>  // NOLINT
445*5c90c05cSAndroid Build Coastguard Worker #endif
446*5c90c05cSAndroid Build Coastguard Worker 
447*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_WINDOWS
448*5c90c05cSAndroid Build Coastguard Worker # include <windows.h>  // NOLINT
449*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_OS_WINDOWS
450*5c90c05cSAndroid Build Coastguard Worker 
451*5c90c05cSAndroid Build Coastguard Worker 
452*5c90c05cSAndroid Build Coastguard Worker GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \
453*5c90c05cSAndroid Build Coastguard Worker /* class A needs to have dll-interface to be used by clients of class B */)
454*5c90c05cSAndroid Build Coastguard Worker 
455*5c90c05cSAndroid Build Coastguard Worker namespace testing {
456*5c90c05cSAndroid Build Coastguard Worker 
457*5c90c05cSAndroid Build Coastguard Worker // Declares the flags.
458*5c90c05cSAndroid Build Coastguard Worker //
459*5c90c05cSAndroid Build Coastguard Worker // We don't want the users to modify this flag in the code, but want
460*5c90c05cSAndroid Build Coastguard Worker // Google Test's own unit tests to be able to access it. Therefore we
461*5c90c05cSAndroid Build Coastguard Worker // declare it here as opposed to in gtest.h.
462*5c90c05cSAndroid Build Coastguard Worker GTEST_DECLARE_bool_(death_test_use_fork);
463*5c90c05cSAndroid Build Coastguard Worker 
464*5c90c05cSAndroid Build Coastguard Worker namespace internal {
465*5c90c05cSAndroid Build Coastguard Worker 
466*5c90c05cSAndroid Build Coastguard Worker // The value of GetTestTypeId() as seen from within the Google Test
467*5c90c05cSAndroid Build Coastguard Worker // library.  This is solely for testing GetTestTypeId().
468*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ extern const TypeId kTestTypeIdInGoogleTest;
469*5c90c05cSAndroid Build Coastguard Worker 
470*5c90c05cSAndroid Build Coastguard Worker // Names of the flags (needed for parsing Google Test flags).
471*5c90c05cSAndroid Build Coastguard Worker const char kAlsoRunDisabledTestsFlag[] = "also_run_disabled_tests";
472*5c90c05cSAndroid Build Coastguard Worker const char kBreakOnFailureFlag[] = "break_on_failure";
473*5c90c05cSAndroid Build Coastguard Worker const char kCatchExceptionsFlag[] = "catch_exceptions";
474*5c90c05cSAndroid Build Coastguard Worker const char kColorFlag[] = "color";
475*5c90c05cSAndroid Build Coastguard Worker const char kFailFast[] = "fail_fast";
476*5c90c05cSAndroid Build Coastguard Worker const char kFilterFlag[] = "filter";
477*5c90c05cSAndroid Build Coastguard Worker const char kListTestsFlag[] = "list_tests";
478*5c90c05cSAndroid Build Coastguard Worker const char kOutputFlag[] = "output";
479*5c90c05cSAndroid Build Coastguard Worker const char kBriefFlag[] = "brief";
480*5c90c05cSAndroid Build Coastguard Worker const char kPrintTimeFlag[] = "print_time";
481*5c90c05cSAndroid Build Coastguard Worker const char kPrintUTF8Flag[] = "print_utf8";
482*5c90c05cSAndroid Build Coastguard Worker const char kRandomSeedFlag[] = "random_seed";
483*5c90c05cSAndroid Build Coastguard Worker const char kRepeatFlag[] = "repeat";
484*5c90c05cSAndroid Build Coastguard Worker const char kShuffleFlag[] = "shuffle";
485*5c90c05cSAndroid Build Coastguard Worker const char kStackTraceDepthFlag[] = "stack_trace_depth";
486*5c90c05cSAndroid Build Coastguard Worker const char kStreamResultToFlag[] = "stream_result_to";
487*5c90c05cSAndroid Build Coastguard Worker const char kThrowOnFailureFlag[] = "throw_on_failure";
488*5c90c05cSAndroid Build Coastguard Worker const char kFlagfileFlag[] = "flagfile";
489*5c90c05cSAndroid Build Coastguard Worker 
490*5c90c05cSAndroid Build Coastguard Worker // A valid random seed must be in [1, kMaxRandomSeed].
491*5c90c05cSAndroid Build Coastguard Worker const int kMaxRandomSeed = 99999;
492*5c90c05cSAndroid Build Coastguard Worker 
493*5c90c05cSAndroid Build Coastguard Worker // g_help_flag is true if and only if the --help flag or an equivalent form
494*5c90c05cSAndroid Build Coastguard Worker // is specified on the command line.
495*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ extern bool g_help_flag;
496*5c90c05cSAndroid Build Coastguard Worker 
497*5c90c05cSAndroid Build Coastguard Worker // Returns the current time in milliseconds.
498*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ TimeInMillis GetTimeInMillis();
499*5c90c05cSAndroid Build Coastguard Worker 
500*5c90c05cSAndroid Build Coastguard Worker // Returns true if and only if Google Test should use colors in the output.
501*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ bool ShouldUseColor(bool stdout_is_tty);
502*5c90c05cSAndroid Build Coastguard Worker 
503*5c90c05cSAndroid Build Coastguard Worker // Formats the given time in milliseconds as seconds.
504*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms);
505*5c90c05cSAndroid Build Coastguard Worker 
506*5c90c05cSAndroid Build Coastguard Worker // Converts the given time in milliseconds to a date string in the ISO 8601
507*5c90c05cSAndroid Build Coastguard Worker // format, without the timezone information.  N.B.: due to the use the
508*5c90c05cSAndroid Build Coastguard Worker // non-reentrant localtime() function, this function is not thread safe.  Do
509*5c90c05cSAndroid Build Coastguard Worker // not use it in any code that can be called from multiple threads.
510*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms);
511*5c90c05cSAndroid Build Coastguard Worker 
512*5c90c05cSAndroid Build Coastguard Worker // Parses a string for an Int32 flag, in the form of "--flag=value".
513*5c90c05cSAndroid Build Coastguard Worker //
514*5c90c05cSAndroid Build Coastguard Worker // On success, stores the value of the flag in *value, and returns
515*5c90c05cSAndroid Build Coastguard Worker // true.  On failure, returns false without changing *value.
516*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ bool ParseInt32Flag(
517*5c90c05cSAndroid Build Coastguard Worker     const char* str, const char* flag, int32_t* value);
518*5c90c05cSAndroid Build Coastguard Worker 
519*5c90c05cSAndroid Build Coastguard Worker // Returns a random seed in range [1, kMaxRandomSeed] based on the
520*5c90c05cSAndroid Build Coastguard Worker // given --gtest_random_seed flag value.
GetRandomSeedFromFlag(int32_t random_seed_flag)521*5c90c05cSAndroid Build Coastguard Worker inline int GetRandomSeedFromFlag(int32_t random_seed_flag) {
522*5c90c05cSAndroid Build Coastguard Worker   const unsigned int raw_seed = (random_seed_flag == 0) ?
523*5c90c05cSAndroid Build Coastguard Worker       static_cast<unsigned int>(GetTimeInMillis()) :
524*5c90c05cSAndroid Build Coastguard Worker       static_cast<unsigned int>(random_seed_flag);
525*5c90c05cSAndroid Build Coastguard Worker 
526*5c90c05cSAndroid Build Coastguard Worker   // Normalizes the actual seed to range [1, kMaxRandomSeed] such that
527*5c90c05cSAndroid Build Coastguard Worker   // it's easy to type.
528*5c90c05cSAndroid Build Coastguard Worker   const int normalized_seed =
529*5c90c05cSAndroid Build Coastguard Worker       static_cast<int>((raw_seed - 1U) %
530*5c90c05cSAndroid Build Coastguard Worker                        static_cast<unsigned int>(kMaxRandomSeed)) + 1;
531*5c90c05cSAndroid Build Coastguard Worker   return normalized_seed;
532*5c90c05cSAndroid Build Coastguard Worker }
533*5c90c05cSAndroid Build Coastguard Worker 
534*5c90c05cSAndroid Build Coastguard Worker // Returns the first valid random seed after 'seed'.  The behavior is
535*5c90c05cSAndroid Build Coastguard Worker // undefined if 'seed' is invalid.  The seed after kMaxRandomSeed is
536*5c90c05cSAndroid Build Coastguard Worker // considered to be 1.
GetNextRandomSeed(int seed)537*5c90c05cSAndroid Build Coastguard Worker inline int GetNextRandomSeed(int seed) {
538*5c90c05cSAndroid Build Coastguard Worker   GTEST_CHECK_(1 <= seed && seed <= kMaxRandomSeed)
539*5c90c05cSAndroid Build Coastguard Worker       << "Invalid random seed " << seed << " - must be in [1, "
540*5c90c05cSAndroid Build Coastguard Worker       << kMaxRandomSeed << "].";
541*5c90c05cSAndroid Build Coastguard Worker   const int next_seed = seed + 1;
542*5c90c05cSAndroid Build Coastguard Worker   return (next_seed > kMaxRandomSeed) ? 1 : next_seed;
543*5c90c05cSAndroid Build Coastguard Worker }
544*5c90c05cSAndroid Build Coastguard Worker 
545*5c90c05cSAndroid Build Coastguard Worker // This class saves the values of all Google Test flags in its c'tor, and
546*5c90c05cSAndroid Build Coastguard Worker // restores them in its d'tor.
547*5c90c05cSAndroid Build Coastguard Worker class GTestFlagSaver {
548*5c90c05cSAndroid Build Coastguard Worker  public:
549*5c90c05cSAndroid Build Coastguard Worker   // The c'tor.
GTestFlagSaver()550*5c90c05cSAndroid Build Coastguard Worker   GTestFlagSaver() {
551*5c90c05cSAndroid Build Coastguard Worker     also_run_disabled_tests_ = GTEST_FLAG(also_run_disabled_tests);
552*5c90c05cSAndroid Build Coastguard Worker     break_on_failure_ = GTEST_FLAG(break_on_failure);
553*5c90c05cSAndroid Build Coastguard Worker     catch_exceptions_ = GTEST_FLAG(catch_exceptions);
554*5c90c05cSAndroid Build Coastguard Worker     color_ = GTEST_FLAG(color);
555*5c90c05cSAndroid Build Coastguard Worker     death_test_style_ = GTEST_FLAG(death_test_style);
556*5c90c05cSAndroid Build Coastguard Worker     death_test_use_fork_ = GTEST_FLAG(death_test_use_fork);
557*5c90c05cSAndroid Build Coastguard Worker     fail_fast_ = GTEST_FLAG(fail_fast);
558*5c90c05cSAndroid Build Coastguard Worker     filter_ = GTEST_FLAG(filter);
559*5c90c05cSAndroid Build Coastguard Worker     internal_run_death_test_ = GTEST_FLAG(internal_run_death_test);
560*5c90c05cSAndroid Build Coastguard Worker     list_tests_ = GTEST_FLAG(list_tests);
561*5c90c05cSAndroid Build Coastguard Worker     output_ = GTEST_FLAG(output);
562*5c90c05cSAndroid Build Coastguard Worker     brief_ = GTEST_FLAG(brief);
563*5c90c05cSAndroid Build Coastguard Worker     print_time_ = GTEST_FLAG(print_time);
564*5c90c05cSAndroid Build Coastguard Worker     print_utf8_ = GTEST_FLAG(print_utf8);
565*5c90c05cSAndroid Build Coastguard Worker     random_seed_ = GTEST_FLAG(random_seed);
566*5c90c05cSAndroid Build Coastguard Worker     repeat_ = GTEST_FLAG(repeat);
567*5c90c05cSAndroid Build Coastguard Worker     shuffle_ = GTEST_FLAG(shuffle);
568*5c90c05cSAndroid Build Coastguard Worker     stack_trace_depth_ = GTEST_FLAG(stack_trace_depth);
569*5c90c05cSAndroid Build Coastguard Worker     stream_result_to_ = GTEST_FLAG(stream_result_to);
570*5c90c05cSAndroid Build Coastguard Worker     throw_on_failure_ = GTEST_FLAG(throw_on_failure);
571*5c90c05cSAndroid Build Coastguard Worker   }
572*5c90c05cSAndroid Build Coastguard Worker 
573*5c90c05cSAndroid Build Coastguard Worker   // The d'tor is not virtual.  DO NOT INHERIT FROM THIS CLASS.
~GTestFlagSaver()574*5c90c05cSAndroid Build Coastguard Worker   ~GTestFlagSaver() {
575*5c90c05cSAndroid Build Coastguard Worker     GTEST_FLAG(also_run_disabled_tests) = also_run_disabled_tests_;
576*5c90c05cSAndroid Build Coastguard Worker     GTEST_FLAG(break_on_failure) = break_on_failure_;
577*5c90c05cSAndroid Build Coastguard Worker     GTEST_FLAG(catch_exceptions) = catch_exceptions_;
578*5c90c05cSAndroid Build Coastguard Worker     GTEST_FLAG(color) = color_;
579*5c90c05cSAndroid Build Coastguard Worker     GTEST_FLAG(death_test_style) = death_test_style_;
580*5c90c05cSAndroid Build Coastguard Worker     GTEST_FLAG(death_test_use_fork) = death_test_use_fork_;
581*5c90c05cSAndroid Build Coastguard Worker     GTEST_FLAG(filter) = filter_;
582*5c90c05cSAndroid Build Coastguard Worker     GTEST_FLAG(fail_fast) = fail_fast_;
583*5c90c05cSAndroid Build Coastguard Worker     GTEST_FLAG(internal_run_death_test) = internal_run_death_test_;
584*5c90c05cSAndroid Build Coastguard Worker     GTEST_FLAG(list_tests) = list_tests_;
585*5c90c05cSAndroid Build Coastguard Worker     GTEST_FLAG(output) = output_;
586*5c90c05cSAndroid Build Coastguard Worker     GTEST_FLAG(brief) = brief_;
587*5c90c05cSAndroid Build Coastguard Worker     GTEST_FLAG(print_time) = print_time_;
588*5c90c05cSAndroid Build Coastguard Worker     GTEST_FLAG(print_utf8) = print_utf8_;
589*5c90c05cSAndroid Build Coastguard Worker     GTEST_FLAG(random_seed) = random_seed_;
590*5c90c05cSAndroid Build Coastguard Worker     GTEST_FLAG(repeat) = repeat_;
591*5c90c05cSAndroid Build Coastguard Worker     GTEST_FLAG(shuffle) = shuffle_;
592*5c90c05cSAndroid Build Coastguard Worker     GTEST_FLAG(stack_trace_depth) = stack_trace_depth_;
593*5c90c05cSAndroid Build Coastguard Worker     GTEST_FLAG(stream_result_to) = stream_result_to_;
594*5c90c05cSAndroid Build Coastguard Worker     GTEST_FLAG(throw_on_failure) = throw_on_failure_;
595*5c90c05cSAndroid Build Coastguard Worker   }
596*5c90c05cSAndroid Build Coastguard Worker 
597*5c90c05cSAndroid Build Coastguard Worker  private:
598*5c90c05cSAndroid Build Coastguard Worker   // Fields for saving the original values of flags.
599*5c90c05cSAndroid Build Coastguard Worker   bool also_run_disabled_tests_;
600*5c90c05cSAndroid Build Coastguard Worker   bool break_on_failure_;
601*5c90c05cSAndroid Build Coastguard Worker   bool catch_exceptions_;
602*5c90c05cSAndroid Build Coastguard Worker   std::string color_;
603*5c90c05cSAndroid Build Coastguard Worker   std::string death_test_style_;
604*5c90c05cSAndroid Build Coastguard Worker   bool death_test_use_fork_;
605*5c90c05cSAndroid Build Coastguard Worker   bool fail_fast_;
606*5c90c05cSAndroid Build Coastguard Worker   std::string filter_;
607*5c90c05cSAndroid Build Coastguard Worker   std::string internal_run_death_test_;
608*5c90c05cSAndroid Build Coastguard Worker   bool list_tests_;
609*5c90c05cSAndroid Build Coastguard Worker   std::string output_;
610*5c90c05cSAndroid Build Coastguard Worker   bool brief_;
611*5c90c05cSAndroid Build Coastguard Worker   bool print_time_;
612*5c90c05cSAndroid Build Coastguard Worker   bool print_utf8_;
613*5c90c05cSAndroid Build Coastguard Worker   int32_t random_seed_;
614*5c90c05cSAndroid Build Coastguard Worker   int32_t repeat_;
615*5c90c05cSAndroid Build Coastguard Worker   bool shuffle_;
616*5c90c05cSAndroid Build Coastguard Worker   int32_t stack_trace_depth_;
617*5c90c05cSAndroid Build Coastguard Worker   std::string stream_result_to_;
618*5c90c05cSAndroid Build Coastguard Worker   bool throw_on_failure_;
619*5c90c05cSAndroid Build Coastguard Worker } GTEST_ATTRIBUTE_UNUSED_;
620*5c90c05cSAndroid Build Coastguard Worker 
621*5c90c05cSAndroid Build Coastguard Worker // Converts a Unicode code point to a narrow string in UTF-8 encoding.
622*5c90c05cSAndroid Build Coastguard Worker // code_point parameter is of type UInt32 because wchar_t may not be
623*5c90c05cSAndroid Build Coastguard Worker // wide enough to contain a code point.
624*5c90c05cSAndroid Build Coastguard Worker // If the code_point is not a valid Unicode code point
625*5c90c05cSAndroid Build Coastguard Worker // (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted
626*5c90c05cSAndroid Build Coastguard Worker // to "(Invalid Unicode 0xXXXXXXXX)".
627*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ std::string CodePointToUtf8(uint32_t code_point);
628*5c90c05cSAndroid Build Coastguard Worker 
629*5c90c05cSAndroid Build Coastguard Worker // Converts a wide string to a narrow string in UTF-8 encoding.
630*5c90c05cSAndroid Build Coastguard Worker // The wide string is assumed to have the following encoding:
631*5c90c05cSAndroid Build Coastguard Worker //   UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin)
632*5c90c05cSAndroid Build Coastguard Worker //   UTF-32 if sizeof(wchar_t) == 4 (on Linux)
633*5c90c05cSAndroid Build Coastguard Worker // Parameter str points to a null-terminated wide string.
634*5c90c05cSAndroid Build Coastguard Worker // Parameter num_chars may additionally limit the number
635*5c90c05cSAndroid Build Coastguard Worker // of wchar_t characters processed. -1 is used when the entire string
636*5c90c05cSAndroid Build Coastguard Worker // should be processed.
637*5c90c05cSAndroid Build Coastguard Worker // If the string contains code points that are not valid Unicode code points
638*5c90c05cSAndroid Build Coastguard Worker // (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output
639*5c90c05cSAndroid Build Coastguard Worker // as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding
640*5c90c05cSAndroid Build Coastguard Worker // and contains invalid UTF-16 surrogate pairs, values in those pairs
641*5c90c05cSAndroid Build Coastguard Worker // will be encoded as individual Unicode characters from Basic Normal Plane.
642*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ std::string WideStringToUtf8(const wchar_t* str, int num_chars);
643*5c90c05cSAndroid Build Coastguard Worker 
644*5c90c05cSAndroid Build Coastguard Worker // Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file
645*5c90c05cSAndroid Build Coastguard Worker // if the variable is present. If a file already exists at this location, this
646*5c90c05cSAndroid Build Coastguard Worker // function will write over it. If the variable is present, but the file cannot
647*5c90c05cSAndroid Build Coastguard Worker // be created, prints an error and exits.
648*5c90c05cSAndroid Build Coastguard Worker void WriteToShardStatusFileIfNeeded();
649*5c90c05cSAndroid Build Coastguard Worker 
650*5c90c05cSAndroid Build Coastguard Worker // Checks whether sharding is enabled by examining the relevant
651*5c90c05cSAndroid Build Coastguard Worker // environment variable values. If the variables are present,
652*5c90c05cSAndroid Build Coastguard Worker // but inconsistent (e.g., shard_index >= total_shards), prints
653*5c90c05cSAndroid Build Coastguard Worker // an error and exits. If in_subprocess_for_death_test, sharding is
654*5c90c05cSAndroid Build Coastguard Worker // disabled because it must only be applied to the original test
655*5c90c05cSAndroid Build Coastguard Worker // process. Otherwise, we could filter out death tests we intended to execute.
656*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ bool ShouldShard(const char* total_shards_str,
657*5c90c05cSAndroid Build Coastguard Worker                             const char* shard_index_str,
658*5c90c05cSAndroid Build Coastguard Worker                             bool in_subprocess_for_death_test);
659*5c90c05cSAndroid Build Coastguard Worker 
660*5c90c05cSAndroid Build Coastguard Worker // Parses the environment variable var as a 32-bit integer. If it is unset,
661*5c90c05cSAndroid Build Coastguard Worker // returns default_val. If it is not a 32-bit integer, prints an error and
662*5c90c05cSAndroid Build Coastguard Worker // and aborts.
663*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ int32_t Int32FromEnvOrDie(const char* env_var, int32_t default_val);
664*5c90c05cSAndroid Build Coastguard Worker 
665*5c90c05cSAndroid Build Coastguard Worker // Given the total number of shards, the shard index, and the test id,
666*5c90c05cSAndroid Build Coastguard Worker // returns true if and only if the test should be run on this shard. The test id
667*5c90c05cSAndroid Build Coastguard Worker // is some arbitrary but unique non-negative integer assigned to each test
668*5c90c05cSAndroid Build Coastguard Worker // method. Assumes that 0 <= shard_index < total_shards.
669*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ bool ShouldRunTestOnShard(
670*5c90c05cSAndroid Build Coastguard Worker     int total_shards, int shard_index, int test_id);
671*5c90c05cSAndroid Build Coastguard Worker 
672*5c90c05cSAndroid Build Coastguard Worker // STL container utilities.
673*5c90c05cSAndroid Build Coastguard Worker 
674*5c90c05cSAndroid Build Coastguard Worker // Returns the number of elements in the given container that satisfy
675*5c90c05cSAndroid Build Coastguard Worker // the given predicate.
676*5c90c05cSAndroid Build Coastguard Worker template <class Container, typename Predicate>
CountIf(const Container & c,Predicate predicate)677*5c90c05cSAndroid Build Coastguard Worker inline int CountIf(const Container& c, Predicate predicate) {
678*5c90c05cSAndroid Build Coastguard Worker   // Implemented as an explicit loop since std::count_if() in libCstd on
679*5c90c05cSAndroid Build Coastguard Worker   // Solaris has a non-standard signature.
680*5c90c05cSAndroid Build Coastguard Worker   int count = 0;
681*5c90c05cSAndroid Build Coastguard Worker   for (typename Container::const_iterator it = c.begin(); it != c.end(); ++it) {
682*5c90c05cSAndroid Build Coastguard Worker     if (predicate(*it))
683*5c90c05cSAndroid Build Coastguard Worker       ++count;
684*5c90c05cSAndroid Build Coastguard Worker   }
685*5c90c05cSAndroid Build Coastguard Worker   return count;
686*5c90c05cSAndroid Build Coastguard Worker }
687*5c90c05cSAndroid Build Coastguard Worker 
688*5c90c05cSAndroid Build Coastguard Worker // Applies a function/functor to each element in the container.
689*5c90c05cSAndroid Build Coastguard Worker template <class Container, typename Functor>
ForEach(const Container & c,Functor functor)690*5c90c05cSAndroid Build Coastguard Worker void ForEach(const Container& c, Functor functor) {
691*5c90c05cSAndroid Build Coastguard Worker   std::for_each(c.begin(), c.end(), functor);
692*5c90c05cSAndroid Build Coastguard Worker }
693*5c90c05cSAndroid Build Coastguard Worker 
694*5c90c05cSAndroid Build Coastguard Worker // Returns the i-th element of the vector, or default_value if i is not
695*5c90c05cSAndroid Build Coastguard Worker // in range [0, v.size()).
696*5c90c05cSAndroid Build Coastguard Worker template <typename E>
GetElementOr(const std::vector<E> & v,int i,E default_value)697*5c90c05cSAndroid Build Coastguard Worker inline E GetElementOr(const std::vector<E>& v, int i, E default_value) {
698*5c90c05cSAndroid Build Coastguard Worker   return (i < 0 || i >= static_cast<int>(v.size())) ? default_value
699*5c90c05cSAndroid Build Coastguard Worker                                                     : v[static_cast<size_t>(i)];
700*5c90c05cSAndroid Build Coastguard Worker }
701*5c90c05cSAndroid Build Coastguard Worker 
702*5c90c05cSAndroid Build Coastguard Worker // Performs an in-place shuffle of a range of the vector's elements.
703*5c90c05cSAndroid Build Coastguard Worker // 'begin' and 'end' are element indices as an STL-style range;
704*5c90c05cSAndroid Build Coastguard Worker // i.e. [begin, end) are shuffled, where 'end' == size() means to
705*5c90c05cSAndroid Build Coastguard Worker // shuffle to the end of the vector.
706*5c90c05cSAndroid Build Coastguard Worker template <typename E>
ShuffleRange(internal::Random * random,int begin,int end,std::vector<E> * v)707*5c90c05cSAndroid Build Coastguard Worker void ShuffleRange(internal::Random* random, int begin, int end,
708*5c90c05cSAndroid Build Coastguard Worker                   std::vector<E>* v) {
709*5c90c05cSAndroid Build Coastguard Worker   const int size = static_cast<int>(v->size());
710*5c90c05cSAndroid Build Coastguard Worker   GTEST_CHECK_(0 <= begin && begin <= size)
711*5c90c05cSAndroid Build Coastguard Worker       << "Invalid shuffle range start " << begin << ": must be in range [0, "
712*5c90c05cSAndroid Build Coastguard Worker       << size << "].";
713*5c90c05cSAndroid Build Coastguard Worker   GTEST_CHECK_(begin <= end && end <= size)
714*5c90c05cSAndroid Build Coastguard Worker       << "Invalid shuffle range finish " << end << ": must be in range ["
715*5c90c05cSAndroid Build Coastguard Worker       << begin << ", " << size << "].";
716*5c90c05cSAndroid Build Coastguard Worker 
717*5c90c05cSAndroid Build Coastguard Worker   // Fisher-Yates shuffle, from
718*5c90c05cSAndroid Build Coastguard Worker   // http://en.wikipedia.org/wiki/Fisher-Yates_shuffle
719*5c90c05cSAndroid Build Coastguard Worker   for (int range_width = end - begin; range_width >= 2; range_width--) {
720*5c90c05cSAndroid Build Coastguard Worker     const int last_in_range = begin + range_width - 1;
721*5c90c05cSAndroid Build Coastguard Worker     const int selected =
722*5c90c05cSAndroid Build Coastguard Worker         begin +
723*5c90c05cSAndroid Build Coastguard Worker         static_cast<int>(random->Generate(static_cast<uint32_t>(range_width)));
724*5c90c05cSAndroid Build Coastguard Worker     std::swap((*v)[static_cast<size_t>(selected)],
725*5c90c05cSAndroid Build Coastguard Worker               (*v)[static_cast<size_t>(last_in_range)]);
726*5c90c05cSAndroid Build Coastguard Worker   }
727*5c90c05cSAndroid Build Coastguard Worker }
728*5c90c05cSAndroid Build Coastguard Worker 
729*5c90c05cSAndroid Build Coastguard Worker // Performs an in-place shuffle of the vector's elements.
730*5c90c05cSAndroid Build Coastguard Worker template <typename E>
Shuffle(internal::Random * random,std::vector<E> * v)731*5c90c05cSAndroid Build Coastguard Worker inline void Shuffle(internal::Random* random, std::vector<E>* v) {
732*5c90c05cSAndroid Build Coastguard Worker   ShuffleRange(random, 0, static_cast<int>(v->size()), v);
733*5c90c05cSAndroid Build Coastguard Worker }
734*5c90c05cSAndroid Build Coastguard Worker 
735*5c90c05cSAndroid Build Coastguard Worker // A function for deleting an object.  Handy for being used as a
736*5c90c05cSAndroid Build Coastguard Worker // functor.
737*5c90c05cSAndroid Build Coastguard Worker template <typename T>
Delete(T * x)738*5c90c05cSAndroid Build Coastguard Worker static void Delete(T* x) {
739*5c90c05cSAndroid Build Coastguard Worker   delete x;
740*5c90c05cSAndroid Build Coastguard Worker }
741*5c90c05cSAndroid Build Coastguard Worker 
742*5c90c05cSAndroid Build Coastguard Worker // A predicate that checks the key of a TestProperty against a known key.
743*5c90c05cSAndroid Build Coastguard Worker //
744*5c90c05cSAndroid Build Coastguard Worker // TestPropertyKeyIs is copyable.
745*5c90c05cSAndroid Build Coastguard Worker class TestPropertyKeyIs {
746*5c90c05cSAndroid Build Coastguard Worker  public:
747*5c90c05cSAndroid Build Coastguard Worker   // Constructor.
748*5c90c05cSAndroid Build Coastguard Worker   //
749*5c90c05cSAndroid Build Coastguard Worker   // TestPropertyKeyIs has NO default constructor.
TestPropertyKeyIs(const std::string & key)750*5c90c05cSAndroid Build Coastguard Worker   explicit TestPropertyKeyIs(const std::string& key) : key_(key) {}
751*5c90c05cSAndroid Build Coastguard Worker 
752*5c90c05cSAndroid Build Coastguard Worker   // Returns true if and only if the test name of test property matches on key_.
operator ()(const TestProperty & test_property) const753*5c90c05cSAndroid Build Coastguard Worker   bool operator()(const TestProperty& test_property) const {
754*5c90c05cSAndroid Build Coastguard Worker     return test_property.key() == key_;
755*5c90c05cSAndroid Build Coastguard Worker   }
756*5c90c05cSAndroid Build Coastguard Worker 
757*5c90c05cSAndroid Build Coastguard Worker  private:
758*5c90c05cSAndroid Build Coastguard Worker   std::string key_;
759*5c90c05cSAndroid Build Coastguard Worker };
760*5c90c05cSAndroid Build Coastguard Worker 
761*5c90c05cSAndroid Build Coastguard Worker // Class UnitTestOptions.
762*5c90c05cSAndroid Build Coastguard Worker //
763*5c90c05cSAndroid Build Coastguard Worker // This class contains functions for processing options the user
764*5c90c05cSAndroid Build Coastguard Worker // specifies when running the tests.  It has only static members.
765*5c90c05cSAndroid Build Coastguard Worker //
766*5c90c05cSAndroid Build Coastguard Worker // In most cases, the user can specify an option using either an
767*5c90c05cSAndroid Build Coastguard Worker // environment variable or a command line flag.  E.g. you can set the
768*5c90c05cSAndroid Build Coastguard Worker // test filter using either GTEST_FILTER or --gtest_filter.  If both
769*5c90c05cSAndroid Build Coastguard Worker // the variable and the flag are present, the latter overrides the
770*5c90c05cSAndroid Build Coastguard Worker // former.
771*5c90c05cSAndroid Build Coastguard Worker class GTEST_API_ UnitTestOptions {
772*5c90c05cSAndroid Build Coastguard Worker  public:
773*5c90c05cSAndroid Build Coastguard Worker   // Functions for processing the gtest_output flag.
774*5c90c05cSAndroid Build Coastguard Worker 
775*5c90c05cSAndroid Build Coastguard Worker   // Returns the output format, or "" for normal printed output.
776*5c90c05cSAndroid Build Coastguard Worker   static std::string GetOutputFormat();
777*5c90c05cSAndroid Build Coastguard Worker 
778*5c90c05cSAndroid Build Coastguard Worker   // Returns the absolute path of the requested output file, or the
779*5c90c05cSAndroid Build Coastguard Worker   // default (test_detail.xml in the original working directory) if
780*5c90c05cSAndroid Build Coastguard Worker   // none was explicitly specified.
781*5c90c05cSAndroid Build Coastguard Worker   static std::string GetAbsolutePathToOutputFile();
782*5c90c05cSAndroid Build Coastguard Worker 
783*5c90c05cSAndroid Build Coastguard Worker   // Functions for processing the gtest_filter flag.
784*5c90c05cSAndroid Build Coastguard Worker 
785*5c90c05cSAndroid Build Coastguard Worker   // Returns true if and only if the user-specified filter matches the test
786*5c90c05cSAndroid Build Coastguard Worker   // suite name and the test name.
787*5c90c05cSAndroid Build Coastguard Worker   static bool FilterMatchesTest(const std::string& test_suite_name,
788*5c90c05cSAndroid Build Coastguard Worker                                 const std::string& test_name);
789*5c90c05cSAndroid Build Coastguard Worker 
790*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_WINDOWS
791*5c90c05cSAndroid Build Coastguard Worker   // Function for supporting the gtest_catch_exception flag.
792*5c90c05cSAndroid Build Coastguard Worker 
793*5c90c05cSAndroid Build Coastguard Worker   // Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
794*5c90c05cSAndroid Build Coastguard Worker   // given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.
795*5c90c05cSAndroid Build Coastguard Worker   // This function is useful as an __except condition.
796*5c90c05cSAndroid Build Coastguard Worker   static int GTestShouldProcessSEH(DWORD exception_code);
797*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_OS_WINDOWS
798*5c90c05cSAndroid Build Coastguard Worker 
799*5c90c05cSAndroid Build Coastguard Worker   // Returns true if "name" matches the ':' separated list of glob-style
800*5c90c05cSAndroid Build Coastguard Worker   // filters in "filter".
801*5c90c05cSAndroid Build Coastguard Worker   static bool MatchesFilter(const std::string& name, const char* filter);
802*5c90c05cSAndroid Build Coastguard Worker };
803*5c90c05cSAndroid Build Coastguard Worker 
804*5c90c05cSAndroid Build Coastguard Worker // Returns the current application's name, removing directory path if that
805*5c90c05cSAndroid Build Coastguard Worker // is present.  Used by UnitTestOptions::GetOutputFile.
806*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ FilePath GetCurrentExecutableName();
807*5c90c05cSAndroid Build Coastguard Worker 
808*5c90c05cSAndroid Build Coastguard Worker // The role interface for getting the OS stack trace as a string.
809*5c90c05cSAndroid Build Coastguard Worker class OsStackTraceGetterInterface {
810*5c90c05cSAndroid Build Coastguard Worker  public:
OsStackTraceGetterInterface()811*5c90c05cSAndroid Build Coastguard Worker   OsStackTraceGetterInterface() {}
~OsStackTraceGetterInterface()812*5c90c05cSAndroid Build Coastguard Worker   virtual ~OsStackTraceGetterInterface() {}
813*5c90c05cSAndroid Build Coastguard Worker 
814*5c90c05cSAndroid Build Coastguard Worker   // Returns the current OS stack trace as an std::string.  Parameters:
815*5c90c05cSAndroid Build Coastguard Worker   //
816*5c90c05cSAndroid Build Coastguard Worker   //   max_depth  - the maximum number of stack frames to be included
817*5c90c05cSAndroid Build Coastguard Worker   //                in the trace.
818*5c90c05cSAndroid Build Coastguard Worker   //   skip_count - the number of top frames to be skipped; doesn't count
819*5c90c05cSAndroid Build Coastguard Worker   //                against max_depth.
820*5c90c05cSAndroid Build Coastguard Worker   virtual std::string CurrentStackTrace(int max_depth, int skip_count) = 0;
821*5c90c05cSAndroid Build Coastguard Worker 
822*5c90c05cSAndroid Build Coastguard Worker   // UponLeavingGTest() should be called immediately before Google Test calls
823*5c90c05cSAndroid Build Coastguard Worker   // user code. It saves some information about the current stack that
824*5c90c05cSAndroid Build Coastguard Worker   // CurrentStackTrace() will use to find and hide Google Test stack frames.
825*5c90c05cSAndroid Build Coastguard Worker   virtual void UponLeavingGTest() = 0;
826*5c90c05cSAndroid Build Coastguard Worker 
827*5c90c05cSAndroid Build Coastguard Worker   // This string is inserted in place of stack frames that are part of
828*5c90c05cSAndroid Build Coastguard Worker   // Google Test's implementation.
829*5c90c05cSAndroid Build Coastguard Worker   static const char* const kElidedFramesMarker;
830*5c90c05cSAndroid Build Coastguard Worker 
831*5c90c05cSAndroid Build Coastguard Worker  private:
832*5c90c05cSAndroid Build Coastguard Worker   GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetterInterface);
833*5c90c05cSAndroid Build Coastguard Worker };
834*5c90c05cSAndroid Build Coastguard Worker 
835*5c90c05cSAndroid Build Coastguard Worker // A working implementation of the OsStackTraceGetterInterface interface.
836*5c90c05cSAndroid Build Coastguard Worker class OsStackTraceGetter : public OsStackTraceGetterInterface {
837*5c90c05cSAndroid Build Coastguard Worker  public:
OsStackTraceGetter()838*5c90c05cSAndroid Build Coastguard Worker   OsStackTraceGetter() {}
839*5c90c05cSAndroid Build Coastguard Worker 
840*5c90c05cSAndroid Build Coastguard Worker   std::string CurrentStackTrace(int max_depth, int skip_count) override;
841*5c90c05cSAndroid Build Coastguard Worker   void UponLeavingGTest() override;
842*5c90c05cSAndroid Build Coastguard Worker 
843*5c90c05cSAndroid Build Coastguard Worker  private:
844*5c90c05cSAndroid Build Coastguard Worker #if GTEST_HAS_ABSL
845*5c90c05cSAndroid Build Coastguard Worker   Mutex mutex_;  // Protects all internal state.
846*5c90c05cSAndroid Build Coastguard Worker 
847*5c90c05cSAndroid Build Coastguard Worker   // We save the stack frame below the frame that calls user code.
848*5c90c05cSAndroid Build Coastguard Worker   // We do this because the address of the frame immediately below
849*5c90c05cSAndroid Build Coastguard Worker   // the user code changes between the call to UponLeavingGTest()
850*5c90c05cSAndroid Build Coastguard Worker   // and any calls to the stack trace code from within the user code.
851*5c90c05cSAndroid Build Coastguard Worker   void* caller_frame_ = nullptr;
852*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_HAS_ABSL
853*5c90c05cSAndroid Build Coastguard Worker 
854*5c90c05cSAndroid Build Coastguard Worker   GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetter);
855*5c90c05cSAndroid Build Coastguard Worker };
856*5c90c05cSAndroid Build Coastguard Worker 
857*5c90c05cSAndroid Build Coastguard Worker // Information about a Google Test trace point.
858*5c90c05cSAndroid Build Coastguard Worker struct TraceInfo {
859*5c90c05cSAndroid Build Coastguard Worker   const char* file;
860*5c90c05cSAndroid Build Coastguard Worker   int line;
861*5c90c05cSAndroid Build Coastguard Worker   std::string message;
862*5c90c05cSAndroid Build Coastguard Worker };
863*5c90c05cSAndroid Build Coastguard Worker 
864*5c90c05cSAndroid Build Coastguard Worker // This is the default global test part result reporter used in UnitTestImpl.
865*5c90c05cSAndroid Build Coastguard Worker // This class should only be used by UnitTestImpl.
866*5c90c05cSAndroid Build Coastguard Worker class DefaultGlobalTestPartResultReporter
867*5c90c05cSAndroid Build Coastguard Worker   : public TestPartResultReporterInterface {
868*5c90c05cSAndroid Build Coastguard Worker  public:
869*5c90c05cSAndroid Build Coastguard Worker   explicit DefaultGlobalTestPartResultReporter(UnitTestImpl* unit_test);
870*5c90c05cSAndroid Build Coastguard Worker   // Implements the TestPartResultReporterInterface. Reports the test part
871*5c90c05cSAndroid Build Coastguard Worker   // result in the current test.
872*5c90c05cSAndroid Build Coastguard Worker   void ReportTestPartResult(const TestPartResult& result) override;
873*5c90c05cSAndroid Build Coastguard Worker 
874*5c90c05cSAndroid Build Coastguard Worker  private:
875*5c90c05cSAndroid Build Coastguard Worker   UnitTestImpl* const unit_test_;
876*5c90c05cSAndroid Build Coastguard Worker 
877*5c90c05cSAndroid Build Coastguard Worker   GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultGlobalTestPartResultReporter);
878*5c90c05cSAndroid Build Coastguard Worker };
879*5c90c05cSAndroid Build Coastguard Worker 
880*5c90c05cSAndroid Build Coastguard Worker // This is the default per thread test part result reporter used in
881*5c90c05cSAndroid Build Coastguard Worker // UnitTestImpl. This class should only be used by UnitTestImpl.
882*5c90c05cSAndroid Build Coastguard Worker class DefaultPerThreadTestPartResultReporter
883*5c90c05cSAndroid Build Coastguard Worker     : public TestPartResultReporterInterface {
884*5c90c05cSAndroid Build Coastguard Worker  public:
885*5c90c05cSAndroid Build Coastguard Worker   explicit DefaultPerThreadTestPartResultReporter(UnitTestImpl* unit_test);
886*5c90c05cSAndroid Build Coastguard Worker   // Implements the TestPartResultReporterInterface. The implementation just
887*5c90c05cSAndroid Build Coastguard Worker   // delegates to the current global test part result reporter of *unit_test_.
888*5c90c05cSAndroid Build Coastguard Worker   void ReportTestPartResult(const TestPartResult& result) override;
889*5c90c05cSAndroid Build Coastguard Worker 
890*5c90c05cSAndroid Build Coastguard Worker  private:
891*5c90c05cSAndroid Build Coastguard Worker   UnitTestImpl* const unit_test_;
892*5c90c05cSAndroid Build Coastguard Worker 
893*5c90c05cSAndroid Build Coastguard Worker   GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultPerThreadTestPartResultReporter);
894*5c90c05cSAndroid Build Coastguard Worker };
895*5c90c05cSAndroid Build Coastguard Worker 
896*5c90c05cSAndroid Build Coastguard Worker // The private implementation of the UnitTest class.  We don't protect
897*5c90c05cSAndroid Build Coastguard Worker // the methods under a mutex, as this class is not accessible by a
898*5c90c05cSAndroid Build Coastguard Worker // user and the UnitTest class that delegates work to this class does
899*5c90c05cSAndroid Build Coastguard Worker // proper locking.
900*5c90c05cSAndroid Build Coastguard Worker class GTEST_API_ UnitTestImpl {
901*5c90c05cSAndroid Build Coastguard Worker  public:
902*5c90c05cSAndroid Build Coastguard Worker   explicit UnitTestImpl(UnitTest* parent);
903*5c90c05cSAndroid Build Coastguard Worker   virtual ~UnitTestImpl();
904*5c90c05cSAndroid Build Coastguard Worker 
905*5c90c05cSAndroid Build Coastguard Worker   // There are two different ways to register your own TestPartResultReporter.
906*5c90c05cSAndroid Build Coastguard Worker   // You can register your own repoter to listen either only for test results
907*5c90c05cSAndroid Build Coastguard Worker   // from the current thread or for results from all threads.
908*5c90c05cSAndroid Build Coastguard Worker   // By default, each per-thread test result repoter just passes a new
909*5c90c05cSAndroid Build Coastguard Worker   // TestPartResult to the global test result reporter, which registers the
910*5c90c05cSAndroid Build Coastguard Worker   // test part result for the currently running test.
911*5c90c05cSAndroid Build Coastguard Worker 
912*5c90c05cSAndroid Build Coastguard Worker   // Returns the global test part result reporter.
913*5c90c05cSAndroid Build Coastguard Worker   TestPartResultReporterInterface* GetGlobalTestPartResultReporter();
914*5c90c05cSAndroid Build Coastguard Worker 
915*5c90c05cSAndroid Build Coastguard Worker   // Sets the global test part result reporter.
916*5c90c05cSAndroid Build Coastguard Worker   void SetGlobalTestPartResultReporter(
917*5c90c05cSAndroid Build Coastguard Worker       TestPartResultReporterInterface* reporter);
918*5c90c05cSAndroid Build Coastguard Worker 
919*5c90c05cSAndroid Build Coastguard Worker   // Returns the test part result reporter for the current thread.
920*5c90c05cSAndroid Build Coastguard Worker   TestPartResultReporterInterface* GetTestPartResultReporterForCurrentThread();
921*5c90c05cSAndroid Build Coastguard Worker 
922*5c90c05cSAndroid Build Coastguard Worker   // Sets the test part result reporter for the current thread.
923*5c90c05cSAndroid Build Coastguard Worker   void SetTestPartResultReporterForCurrentThread(
924*5c90c05cSAndroid Build Coastguard Worker       TestPartResultReporterInterface* reporter);
925*5c90c05cSAndroid Build Coastguard Worker 
926*5c90c05cSAndroid Build Coastguard Worker   // Gets the number of successful test suites.
927*5c90c05cSAndroid Build Coastguard Worker   int successful_test_suite_count() const;
928*5c90c05cSAndroid Build Coastguard Worker 
929*5c90c05cSAndroid Build Coastguard Worker   // Gets the number of failed test suites.
930*5c90c05cSAndroid Build Coastguard Worker   int failed_test_suite_count() const;
931*5c90c05cSAndroid Build Coastguard Worker 
932*5c90c05cSAndroid Build Coastguard Worker   // Gets the number of all test suites.
933*5c90c05cSAndroid Build Coastguard Worker   int total_test_suite_count() const;
934*5c90c05cSAndroid Build Coastguard Worker 
935*5c90c05cSAndroid Build Coastguard Worker   // Gets the number of all test suites that contain at least one test
936*5c90c05cSAndroid Build Coastguard Worker   // that should run.
937*5c90c05cSAndroid Build Coastguard Worker   int test_suite_to_run_count() const;
938*5c90c05cSAndroid Build Coastguard Worker 
939*5c90c05cSAndroid Build Coastguard Worker   // Gets the number of successful tests.
940*5c90c05cSAndroid Build Coastguard Worker   int successful_test_count() const;
941*5c90c05cSAndroid Build Coastguard Worker 
942*5c90c05cSAndroid Build Coastguard Worker   // Gets the number of skipped tests.
943*5c90c05cSAndroid Build Coastguard Worker   int skipped_test_count() const;
944*5c90c05cSAndroid Build Coastguard Worker 
945*5c90c05cSAndroid Build Coastguard Worker   // Gets the number of failed tests.
946*5c90c05cSAndroid Build Coastguard Worker   int failed_test_count() const;
947*5c90c05cSAndroid Build Coastguard Worker 
948*5c90c05cSAndroid Build Coastguard Worker   // Gets the number of disabled tests that will be reported in the XML report.
949*5c90c05cSAndroid Build Coastguard Worker   int reportable_disabled_test_count() const;
950*5c90c05cSAndroid Build Coastguard Worker 
951*5c90c05cSAndroid Build Coastguard Worker   // Gets the number of disabled tests.
952*5c90c05cSAndroid Build Coastguard Worker   int disabled_test_count() const;
953*5c90c05cSAndroid Build Coastguard Worker 
954*5c90c05cSAndroid Build Coastguard Worker   // Gets the number of tests to be printed in the XML report.
955*5c90c05cSAndroid Build Coastguard Worker   int reportable_test_count() const;
956*5c90c05cSAndroid Build Coastguard Worker 
957*5c90c05cSAndroid Build Coastguard Worker   // Gets the number of all tests.
958*5c90c05cSAndroid Build Coastguard Worker   int total_test_count() const;
959*5c90c05cSAndroid Build Coastguard Worker 
960*5c90c05cSAndroid Build Coastguard Worker   // Gets the number of tests that should run.
961*5c90c05cSAndroid Build Coastguard Worker   int test_to_run_count() const;
962*5c90c05cSAndroid Build Coastguard Worker 
963*5c90c05cSAndroid Build Coastguard Worker   // Gets the time of the test program start, in ms from the start of the
964*5c90c05cSAndroid Build Coastguard Worker   // UNIX epoch.
start_timestamp() const965*5c90c05cSAndroid Build Coastguard Worker   TimeInMillis start_timestamp() const { return start_timestamp_; }
966*5c90c05cSAndroid Build Coastguard Worker 
967*5c90c05cSAndroid Build Coastguard Worker   // Gets the elapsed time, in milliseconds.
elapsed_time() const968*5c90c05cSAndroid Build Coastguard Worker   TimeInMillis elapsed_time() const { return elapsed_time_; }
969*5c90c05cSAndroid Build Coastguard Worker 
970*5c90c05cSAndroid Build Coastguard Worker   // Returns true if and only if the unit test passed (i.e. all test suites
971*5c90c05cSAndroid Build Coastguard Worker   // passed).
Passed() const972*5c90c05cSAndroid Build Coastguard Worker   bool Passed() const { return !Failed(); }
973*5c90c05cSAndroid Build Coastguard Worker 
974*5c90c05cSAndroid Build Coastguard Worker   // Returns true if and only if the unit test failed (i.e. some test suite
975*5c90c05cSAndroid Build Coastguard Worker   // failed or something outside of all tests failed).
Failed() const976*5c90c05cSAndroid Build Coastguard Worker   bool Failed() const {
977*5c90c05cSAndroid Build Coastguard Worker     return failed_test_suite_count() > 0 || ad_hoc_test_result()->Failed();
978*5c90c05cSAndroid Build Coastguard Worker   }
979*5c90c05cSAndroid Build Coastguard Worker 
980*5c90c05cSAndroid Build Coastguard Worker   // Gets the i-th test suite among all the test suites. i can range from 0 to
981*5c90c05cSAndroid Build Coastguard Worker   // total_test_suite_count() - 1. If i is not in that range, returns NULL.
GetTestSuite(int i) const982*5c90c05cSAndroid Build Coastguard Worker   const TestSuite* GetTestSuite(int i) const {
983*5c90c05cSAndroid Build Coastguard Worker     const int index = GetElementOr(test_suite_indices_, i, -1);
984*5c90c05cSAndroid Build Coastguard Worker     return index < 0 ? nullptr : test_suites_[static_cast<size_t>(i)];
985*5c90c05cSAndroid Build Coastguard Worker   }
986*5c90c05cSAndroid Build Coastguard Worker 
987*5c90c05cSAndroid Build Coastguard Worker   //  Legacy API is deprecated but still available
988*5c90c05cSAndroid Build Coastguard Worker #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
GetTestCase(int i) const989*5c90c05cSAndroid Build Coastguard Worker   const TestCase* GetTestCase(int i) const { return GetTestSuite(i); }
990*5c90c05cSAndroid Build Coastguard Worker #endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_
991*5c90c05cSAndroid Build Coastguard Worker 
992*5c90c05cSAndroid Build Coastguard Worker   // Gets the i-th test suite among all the test suites. i can range from 0 to
993*5c90c05cSAndroid Build Coastguard Worker   // total_test_suite_count() - 1. If i is not in that range, returns NULL.
GetMutableSuiteCase(int i)994*5c90c05cSAndroid Build Coastguard Worker   TestSuite* GetMutableSuiteCase(int i) {
995*5c90c05cSAndroid Build Coastguard Worker     const int index = GetElementOr(test_suite_indices_, i, -1);
996*5c90c05cSAndroid Build Coastguard Worker     return index < 0 ? nullptr : test_suites_[static_cast<size_t>(index)];
997*5c90c05cSAndroid Build Coastguard Worker   }
998*5c90c05cSAndroid Build Coastguard Worker 
999*5c90c05cSAndroid Build Coastguard Worker   // Provides access to the event listener list.
listeners()1000*5c90c05cSAndroid Build Coastguard Worker   TestEventListeners* listeners() { return &listeners_; }
1001*5c90c05cSAndroid Build Coastguard Worker 
1002*5c90c05cSAndroid Build Coastguard Worker   // Returns the TestResult for the test that's currently running, or
1003*5c90c05cSAndroid Build Coastguard Worker   // the TestResult for the ad hoc test if no test is running.
1004*5c90c05cSAndroid Build Coastguard Worker   TestResult* current_test_result();
1005*5c90c05cSAndroid Build Coastguard Worker 
1006*5c90c05cSAndroid Build Coastguard Worker   // Returns the TestResult for the ad hoc test.
ad_hoc_test_result() const1007*5c90c05cSAndroid Build Coastguard Worker   const TestResult* ad_hoc_test_result() const { return &ad_hoc_test_result_; }
1008*5c90c05cSAndroid Build Coastguard Worker 
1009*5c90c05cSAndroid Build Coastguard Worker   // Sets the OS stack trace getter.
1010*5c90c05cSAndroid Build Coastguard Worker   //
1011*5c90c05cSAndroid Build Coastguard Worker   // Does nothing if the input and the current OS stack trace getter
1012*5c90c05cSAndroid Build Coastguard Worker   // are the same; otherwise, deletes the old getter and makes the
1013*5c90c05cSAndroid Build Coastguard Worker   // input the current getter.
1014*5c90c05cSAndroid Build Coastguard Worker   void set_os_stack_trace_getter(OsStackTraceGetterInterface* getter);
1015*5c90c05cSAndroid Build Coastguard Worker 
1016*5c90c05cSAndroid Build Coastguard Worker   // Returns the current OS stack trace getter if it is not NULL;
1017*5c90c05cSAndroid Build Coastguard Worker   // otherwise, creates an OsStackTraceGetter, makes it the current
1018*5c90c05cSAndroid Build Coastguard Worker   // getter, and returns it.
1019*5c90c05cSAndroid Build Coastguard Worker   OsStackTraceGetterInterface* os_stack_trace_getter();
1020*5c90c05cSAndroid Build Coastguard Worker 
1021*5c90c05cSAndroid Build Coastguard Worker   // Returns the current OS stack trace as an std::string.
1022*5c90c05cSAndroid Build Coastguard Worker   //
1023*5c90c05cSAndroid Build Coastguard Worker   // The maximum number of stack frames to be included is specified by
1024*5c90c05cSAndroid Build Coastguard Worker   // the gtest_stack_trace_depth flag.  The skip_count parameter
1025*5c90c05cSAndroid Build Coastguard Worker   // specifies the number of top frames to be skipped, which doesn't
1026*5c90c05cSAndroid Build Coastguard Worker   // count against the number of frames to be included.
1027*5c90c05cSAndroid Build Coastguard Worker   //
1028*5c90c05cSAndroid Build Coastguard Worker   // For example, if Foo() calls Bar(), which in turn calls
1029*5c90c05cSAndroid Build Coastguard Worker   // CurrentOsStackTraceExceptTop(1), Foo() will be included in the
1030*5c90c05cSAndroid Build Coastguard Worker   // trace but Bar() and CurrentOsStackTraceExceptTop() won't.
1031*5c90c05cSAndroid Build Coastguard Worker   std::string CurrentOsStackTraceExceptTop(int skip_count) GTEST_NO_INLINE_;
1032*5c90c05cSAndroid Build Coastguard Worker 
1033*5c90c05cSAndroid Build Coastguard Worker   // Finds and returns a TestSuite with the given name.  If one doesn't
1034*5c90c05cSAndroid Build Coastguard Worker   // exist, creates one and returns it.
1035*5c90c05cSAndroid Build Coastguard Worker   //
1036*5c90c05cSAndroid Build Coastguard Worker   // Arguments:
1037*5c90c05cSAndroid Build Coastguard Worker   //
1038*5c90c05cSAndroid Build Coastguard Worker   //   test_suite_name: name of the test suite
1039*5c90c05cSAndroid Build Coastguard Worker   //   type_param:      the name of the test's type parameter, or NULL if
1040*5c90c05cSAndroid Build Coastguard Worker   //                    this is not a typed or a type-parameterized test.
1041*5c90c05cSAndroid Build Coastguard Worker   //   set_up_tc:       pointer to the function that sets up the test suite
1042*5c90c05cSAndroid Build Coastguard Worker   //   tear_down_tc:    pointer to the function that tears down the test suite
1043*5c90c05cSAndroid Build Coastguard Worker   TestSuite* GetTestSuite(const char* test_suite_name, const char* type_param,
1044*5c90c05cSAndroid Build Coastguard Worker                           internal::SetUpTestSuiteFunc set_up_tc,
1045*5c90c05cSAndroid Build Coastguard Worker                           internal::TearDownTestSuiteFunc tear_down_tc);
1046*5c90c05cSAndroid Build Coastguard Worker 
1047*5c90c05cSAndroid Build Coastguard Worker //  Legacy API is deprecated but still available
1048*5c90c05cSAndroid Build Coastguard Worker #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
GetTestCase(const char * test_case_name,const char * type_param,internal::SetUpTestSuiteFunc set_up_tc,internal::TearDownTestSuiteFunc tear_down_tc)1049*5c90c05cSAndroid Build Coastguard Worker   TestCase* GetTestCase(const char* test_case_name, const char* type_param,
1050*5c90c05cSAndroid Build Coastguard Worker                         internal::SetUpTestSuiteFunc set_up_tc,
1051*5c90c05cSAndroid Build Coastguard Worker                         internal::TearDownTestSuiteFunc tear_down_tc) {
1052*5c90c05cSAndroid Build Coastguard Worker     return GetTestSuite(test_case_name, type_param, set_up_tc, tear_down_tc);
1053*5c90c05cSAndroid Build Coastguard Worker   }
1054*5c90c05cSAndroid Build Coastguard Worker #endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_
1055*5c90c05cSAndroid Build Coastguard Worker 
1056*5c90c05cSAndroid Build Coastguard Worker   // Adds a TestInfo to the unit test.
1057*5c90c05cSAndroid Build Coastguard Worker   //
1058*5c90c05cSAndroid Build Coastguard Worker   // Arguments:
1059*5c90c05cSAndroid Build Coastguard Worker   //
1060*5c90c05cSAndroid Build Coastguard Worker   //   set_up_tc:    pointer to the function that sets up the test suite
1061*5c90c05cSAndroid Build Coastguard Worker   //   tear_down_tc: pointer to the function that tears down the test suite
1062*5c90c05cSAndroid Build Coastguard Worker   //   test_info:    the TestInfo object
AddTestInfo(internal::SetUpTestSuiteFunc set_up_tc,internal::TearDownTestSuiteFunc tear_down_tc,TestInfo * test_info)1063*5c90c05cSAndroid Build Coastguard Worker   void AddTestInfo(internal::SetUpTestSuiteFunc set_up_tc,
1064*5c90c05cSAndroid Build Coastguard Worker                    internal::TearDownTestSuiteFunc tear_down_tc,
1065*5c90c05cSAndroid Build Coastguard Worker                    TestInfo* test_info) {
1066*5c90c05cSAndroid Build Coastguard Worker #if GTEST_HAS_DEATH_TEST
1067*5c90c05cSAndroid Build Coastguard Worker     // In order to support thread-safe death tests, we need to
1068*5c90c05cSAndroid Build Coastguard Worker     // remember the original working directory when the test program
1069*5c90c05cSAndroid Build Coastguard Worker     // was first invoked.  We cannot do this in RUN_ALL_TESTS(), as
1070*5c90c05cSAndroid Build Coastguard Worker     // the user may have changed the current directory before calling
1071*5c90c05cSAndroid Build Coastguard Worker     // RUN_ALL_TESTS().  Therefore we capture the current directory in
1072*5c90c05cSAndroid Build Coastguard Worker     // AddTestInfo(), which is called to register a TEST or TEST_F
1073*5c90c05cSAndroid Build Coastguard Worker     // before main() is reached.
1074*5c90c05cSAndroid Build Coastguard Worker     if (original_working_dir_.IsEmpty()) {
1075*5c90c05cSAndroid Build Coastguard Worker       original_working_dir_.Set(FilePath::GetCurrentDir());
1076*5c90c05cSAndroid Build Coastguard Worker       GTEST_CHECK_(!original_working_dir_.IsEmpty())
1077*5c90c05cSAndroid Build Coastguard Worker           << "Failed to get the current working directory.";
1078*5c90c05cSAndroid Build Coastguard Worker     }
1079*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_HAS_DEATH_TEST
1080*5c90c05cSAndroid Build Coastguard Worker 
1081*5c90c05cSAndroid Build Coastguard Worker     GetTestSuite(test_info->test_suite_name(), test_info->type_param(),
1082*5c90c05cSAndroid Build Coastguard Worker                  set_up_tc, tear_down_tc)
1083*5c90c05cSAndroid Build Coastguard Worker         ->AddTestInfo(test_info);
1084*5c90c05cSAndroid Build Coastguard Worker   }
1085*5c90c05cSAndroid Build Coastguard Worker 
1086*5c90c05cSAndroid Build Coastguard Worker   // Returns ParameterizedTestSuiteRegistry object used to keep track of
1087*5c90c05cSAndroid Build Coastguard Worker   // value-parameterized tests and instantiate and register them.
parameterized_test_registry()1088*5c90c05cSAndroid Build Coastguard Worker   internal::ParameterizedTestSuiteRegistry& parameterized_test_registry() {
1089*5c90c05cSAndroid Build Coastguard Worker     return parameterized_test_registry_;
1090*5c90c05cSAndroid Build Coastguard Worker   }
1091*5c90c05cSAndroid Build Coastguard Worker 
ignored_parameterized_test_suites()1092*5c90c05cSAndroid Build Coastguard Worker   std::set<std::string>* ignored_parameterized_test_suites() {
1093*5c90c05cSAndroid Build Coastguard Worker     return &ignored_parameterized_test_suites_;
1094*5c90c05cSAndroid Build Coastguard Worker   }
1095*5c90c05cSAndroid Build Coastguard Worker 
1096*5c90c05cSAndroid Build Coastguard Worker   // Returns TypeParameterizedTestSuiteRegistry object used to keep track of
1097*5c90c05cSAndroid Build Coastguard Worker   // type-parameterized tests and instantiations of them.
1098*5c90c05cSAndroid Build Coastguard Worker   internal::TypeParameterizedTestSuiteRegistry&
type_parameterized_test_registry()1099*5c90c05cSAndroid Build Coastguard Worker   type_parameterized_test_registry() {
1100*5c90c05cSAndroid Build Coastguard Worker     return type_parameterized_test_registry_;
1101*5c90c05cSAndroid Build Coastguard Worker   }
1102*5c90c05cSAndroid Build Coastguard Worker 
1103*5c90c05cSAndroid Build Coastguard Worker   // Sets the TestSuite object for the test that's currently running.
set_current_test_suite(TestSuite * a_current_test_suite)1104*5c90c05cSAndroid Build Coastguard Worker   void set_current_test_suite(TestSuite* a_current_test_suite) {
1105*5c90c05cSAndroid Build Coastguard Worker     current_test_suite_ = a_current_test_suite;
1106*5c90c05cSAndroid Build Coastguard Worker   }
1107*5c90c05cSAndroid Build Coastguard Worker 
1108*5c90c05cSAndroid Build Coastguard Worker   // Sets the TestInfo object for the test that's currently running.  If
1109*5c90c05cSAndroid Build Coastguard Worker   // current_test_info is NULL, the assertion results will be stored in
1110*5c90c05cSAndroid Build Coastguard Worker   // ad_hoc_test_result_.
set_current_test_info(TestInfo * a_current_test_info)1111*5c90c05cSAndroid Build Coastguard Worker   void set_current_test_info(TestInfo* a_current_test_info) {
1112*5c90c05cSAndroid Build Coastguard Worker     current_test_info_ = a_current_test_info;
1113*5c90c05cSAndroid Build Coastguard Worker   }
1114*5c90c05cSAndroid Build Coastguard Worker 
1115*5c90c05cSAndroid Build Coastguard Worker   // Registers all parameterized tests defined using TEST_P and
1116*5c90c05cSAndroid Build Coastguard Worker   // INSTANTIATE_TEST_SUITE_P, creating regular tests for each test/parameter
1117*5c90c05cSAndroid Build Coastguard Worker   // combination. This method can be called more then once; it has guards
1118*5c90c05cSAndroid Build Coastguard Worker   // protecting from registering the tests more then once.  If
1119*5c90c05cSAndroid Build Coastguard Worker   // value-parameterized tests are disabled, RegisterParameterizedTests is
1120*5c90c05cSAndroid Build Coastguard Worker   // present but does nothing.
1121*5c90c05cSAndroid Build Coastguard Worker   void RegisterParameterizedTests();
1122*5c90c05cSAndroid Build Coastguard Worker 
1123*5c90c05cSAndroid Build Coastguard Worker   // Runs all tests in this UnitTest object, prints the result, and
1124*5c90c05cSAndroid Build Coastguard Worker   // returns true if all tests are successful.  If any exception is
1125*5c90c05cSAndroid Build Coastguard Worker   // thrown during a test, this test is considered to be failed, but
1126*5c90c05cSAndroid Build Coastguard Worker   // the rest of the tests will still be run.
1127*5c90c05cSAndroid Build Coastguard Worker   bool RunAllTests();
1128*5c90c05cSAndroid Build Coastguard Worker 
1129*5c90c05cSAndroid Build Coastguard Worker   // Clears the results of all tests, except the ad hoc tests.
ClearNonAdHocTestResult()1130*5c90c05cSAndroid Build Coastguard Worker   void ClearNonAdHocTestResult() {
1131*5c90c05cSAndroid Build Coastguard Worker     ForEach(test_suites_, TestSuite::ClearTestSuiteResult);
1132*5c90c05cSAndroid Build Coastguard Worker   }
1133*5c90c05cSAndroid Build Coastguard Worker 
1134*5c90c05cSAndroid Build Coastguard Worker   // Clears the results of ad-hoc test assertions.
ClearAdHocTestResult()1135*5c90c05cSAndroid Build Coastguard Worker   void ClearAdHocTestResult() {
1136*5c90c05cSAndroid Build Coastguard Worker     ad_hoc_test_result_.Clear();
1137*5c90c05cSAndroid Build Coastguard Worker   }
1138*5c90c05cSAndroid Build Coastguard Worker 
1139*5c90c05cSAndroid Build Coastguard Worker   // Adds a TestProperty to the current TestResult object when invoked in a
1140*5c90c05cSAndroid Build Coastguard Worker   // context of a test or a test suite, or to the global property set. If the
1141*5c90c05cSAndroid Build Coastguard Worker   // result already contains a property with the same key, the value will be
1142*5c90c05cSAndroid Build Coastguard Worker   // updated.
1143*5c90c05cSAndroid Build Coastguard Worker   void RecordProperty(const TestProperty& test_property);
1144*5c90c05cSAndroid Build Coastguard Worker 
1145*5c90c05cSAndroid Build Coastguard Worker   enum ReactionToSharding {
1146*5c90c05cSAndroid Build Coastguard Worker     HONOR_SHARDING_PROTOCOL,
1147*5c90c05cSAndroid Build Coastguard Worker     IGNORE_SHARDING_PROTOCOL
1148*5c90c05cSAndroid Build Coastguard Worker   };
1149*5c90c05cSAndroid Build Coastguard Worker 
1150*5c90c05cSAndroid Build Coastguard Worker   // Matches the full name of each test against the user-specified
1151*5c90c05cSAndroid Build Coastguard Worker   // filter to decide whether the test should run, then records the
1152*5c90c05cSAndroid Build Coastguard Worker   // result in each TestSuite and TestInfo object.
1153*5c90c05cSAndroid Build Coastguard Worker   // If shard_tests == HONOR_SHARDING_PROTOCOL, further filters tests
1154*5c90c05cSAndroid Build Coastguard Worker   // based on sharding variables in the environment.
1155*5c90c05cSAndroid Build Coastguard Worker   // Returns the number of tests that should run.
1156*5c90c05cSAndroid Build Coastguard Worker   int FilterTests(ReactionToSharding shard_tests);
1157*5c90c05cSAndroid Build Coastguard Worker 
1158*5c90c05cSAndroid Build Coastguard Worker   // Prints the names of the tests matching the user-specified filter flag.
1159*5c90c05cSAndroid Build Coastguard Worker   void ListTestsMatchingFilter();
1160*5c90c05cSAndroid Build Coastguard Worker 
current_test_suite() const1161*5c90c05cSAndroid Build Coastguard Worker   const TestSuite* current_test_suite() const { return current_test_suite_; }
current_test_info()1162*5c90c05cSAndroid Build Coastguard Worker   TestInfo* current_test_info() { return current_test_info_; }
current_test_info() const1163*5c90c05cSAndroid Build Coastguard Worker   const TestInfo* current_test_info() const { return current_test_info_; }
1164*5c90c05cSAndroid Build Coastguard Worker 
1165*5c90c05cSAndroid Build Coastguard Worker   // Returns the vector of environments that need to be set-up/torn-down
1166*5c90c05cSAndroid Build Coastguard Worker   // before/after the tests are run.
environments()1167*5c90c05cSAndroid Build Coastguard Worker   std::vector<Environment*>& environments() { return environments_; }
1168*5c90c05cSAndroid Build Coastguard Worker 
1169*5c90c05cSAndroid Build Coastguard Worker   // Getters for the per-thread Google Test trace stack.
gtest_trace_stack()1170*5c90c05cSAndroid Build Coastguard Worker   std::vector<TraceInfo>& gtest_trace_stack() {
1171*5c90c05cSAndroid Build Coastguard Worker     return *(gtest_trace_stack_.pointer());
1172*5c90c05cSAndroid Build Coastguard Worker   }
gtest_trace_stack() const1173*5c90c05cSAndroid Build Coastguard Worker   const std::vector<TraceInfo>& gtest_trace_stack() const {
1174*5c90c05cSAndroid Build Coastguard Worker     return gtest_trace_stack_.get();
1175*5c90c05cSAndroid Build Coastguard Worker   }
1176*5c90c05cSAndroid Build Coastguard Worker 
1177*5c90c05cSAndroid Build Coastguard Worker #if GTEST_HAS_DEATH_TEST
InitDeathTestSubprocessControlInfo()1178*5c90c05cSAndroid Build Coastguard Worker   void InitDeathTestSubprocessControlInfo() {
1179*5c90c05cSAndroid Build Coastguard Worker     internal_run_death_test_flag_.reset(ParseInternalRunDeathTestFlag());
1180*5c90c05cSAndroid Build Coastguard Worker   }
1181*5c90c05cSAndroid Build Coastguard Worker   // Returns a pointer to the parsed --gtest_internal_run_death_test
1182*5c90c05cSAndroid Build Coastguard Worker   // flag, or NULL if that flag was not specified.
1183*5c90c05cSAndroid Build Coastguard Worker   // This information is useful only in a death test child process.
1184*5c90c05cSAndroid Build Coastguard Worker   // Must not be called before a call to InitGoogleTest.
internal_run_death_test_flag() const1185*5c90c05cSAndroid Build Coastguard Worker   const InternalRunDeathTestFlag* internal_run_death_test_flag() const {
1186*5c90c05cSAndroid Build Coastguard Worker     return internal_run_death_test_flag_.get();
1187*5c90c05cSAndroid Build Coastguard Worker   }
1188*5c90c05cSAndroid Build Coastguard Worker 
1189*5c90c05cSAndroid Build Coastguard Worker   // Returns a pointer to the current death test factory.
death_test_factory()1190*5c90c05cSAndroid Build Coastguard Worker   internal::DeathTestFactory* death_test_factory() {
1191*5c90c05cSAndroid Build Coastguard Worker     return death_test_factory_.get();
1192*5c90c05cSAndroid Build Coastguard Worker   }
1193*5c90c05cSAndroid Build Coastguard Worker 
1194*5c90c05cSAndroid Build Coastguard Worker   void SuppressTestEventsIfInSubprocess();
1195*5c90c05cSAndroid Build Coastguard Worker 
1196*5c90c05cSAndroid Build Coastguard Worker   friend class ReplaceDeathTestFactory;
1197*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_HAS_DEATH_TEST
1198*5c90c05cSAndroid Build Coastguard Worker 
1199*5c90c05cSAndroid Build Coastguard Worker   // Initializes the event listener performing XML output as specified by
1200*5c90c05cSAndroid Build Coastguard Worker   // UnitTestOptions. Must not be called before InitGoogleTest.
1201*5c90c05cSAndroid Build Coastguard Worker   void ConfigureXmlOutput();
1202*5c90c05cSAndroid Build Coastguard Worker 
1203*5c90c05cSAndroid Build Coastguard Worker #if GTEST_CAN_STREAM_RESULTS_
1204*5c90c05cSAndroid Build Coastguard Worker   // Initializes the event listener for streaming test results to a socket.
1205*5c90c05cSAndroid Build Coastguard Worker   // Must not be called before InitGoogleTest.
1206*5c90c05cSAndroid Build Coastguard Worker   void ConfigureStreamingOutput();
1207*5c90c05cSAndroid Build Coastguard Worker #endif
1208*5c90c05cSAndroid Build Coastguard Worker 
1209*5c90c05cSAndroid Build Coastguard Worker   // Performs initialization dependent upon flag values obtained in
1210*5c90c05cSAndroid Build Coastguard Worker   // ParseGoogleTestFlagsOnly.  Is called from InitGoogleTest after the call to
1211*5c90c05cSAndroid Build Coastguard Worker   // ParseGoogleTestFlagsOnly.  In case a user neglects to call InitGoogleTest
1212*5c90c05cSAndroid Build Coastguard Worker   // this function is also called from RunAllTests.  Since this function can be
1213*5c90c05cSAndroid Build Coastguard Worker   // called more than once, it has to be idempotent.
1214*5c90c05cSAndroid Build Coastguard Worker   void PostFlagParsingInit();
1215*5c90c05cSAndroid Build Coastguard Worker 
1216*5c90c05cSAndroid Build Coastguard Worker   // Gets the random seed used at the start of the current test iteration.
random_seed() const1217*5c90c05cSAndroid Build Coastguard Worker   int random_seed() const { return random_seed_; }
1218*5c90c05cSAndroid Build Coastguard Worker 
1219*5c90c05cSAndroid Build Coastguard Worker   // Gets the random number generator.
random()1220*5c90c05cSAndroid Build Coastguard Worker   internal::Random* random() { return &random_; }
1221*5c90c05cSAndroid Build Coastguard Worker 
1222*5c90c05cSAndroid Build Coastguard Worker   // Shuffles all test suites, and the tests within each test suite,
1223*5c90c05cSAndroid Build Coastguard Worker   // making sure that death tests are still run first.
1224*5c90c05cSAndroid Build Coastguard Worker   void ShuffleTests();
1225*5c90c05cSAndroid Build Coastguard Worker 
1226*5c90c05cSAndroid Build Coastguard Worker   // Restores the test suites and tests to their order before the first shuffle.
1227*5c90c05cSAndroid Build Coastguard Worker   void UnshuffleTests();
1228*5c90c05cSAndroid Build Coastguard Worker 
1229*5c90c05cSAndroid Build Coastguard Worker   // Returns the value of GTEST_FLAG(catch_exceptions) at the moment
1230*5c90c05cSAndroid Build Coastguard Worker   // UnitTest::Run() starts.
catch_exceptions() const1231*5c90c05cSAndroid Build Coastguard Worker   bool catch_exceptions() const { return catch_exceptions_; }
1232*5c90c05cSAndroid Build Coastguard Worker 
1233*5c90c05cSAndroid Build Coastguard Worker  private:
1234*5c90c05cSAndroid Build Coastguard Worker   friend class ::testing::UnitTest;
1235*5c90c05cSAndroid Build Coastguard Worker 
1236*5c90c05cSAndroid Build Coastguard Worker   // Used by UnitTest::Run() to capture the state of
1237*5c90c05cSAndroid Build Coastguard Worker   // GTEST_FLAG(catch_exceptions) at the moment it starts.
set_catch_exceptions(bool value)1238*5c90c05cSAndroid Build Coastguard Worker   void set_catch_exceptions(bool value) { catch_exceptions_ = value; }
1239*5c90c05cSAndroid Build Coastguard Worker 
1240*5c90c05cSAndroid Build Coastguard Worker   // The UnitTest object that owns this implementation object.
1241*5c90c05cSAndroid Build Coastguard Worker   UnitTest* const parent_;
1242*5c90c05cSAndroid Build Coastguard Worker 
1243*5c90c05cSAndroid Build Coastguard Worker   // The working directory when the first TEST() or TEST_F() was
1244*5c90c05cSAndroid Build Coastguard Worker   // executed.
1245*5c90c05cSAndroid Build Coastguard Worker   internal::FilePath original_working_dir_;
1246*5c90c05cSAndroid Build Coastguard Worker 
1247*5c90c05cSAndroid Build Coastguard Worker   // The default test part result reporters.
1248*5c90c05cSAndroid Build Coastguard Worker   DefaultGlobalTestPartResultReporter default_global_test_part_result_reporter_;
1249*5c90c05cSAndroid Build Coastguard Worker   DefaultPerThreadTestPartResultReporter
1250*5c90c05cSAndroid Build Coastguard Worker       default_per_thread_test_part_result_reporter_;
1251*5c90c05cSAndroid Build Coastguard Worker 
1252*5c90c05cSAndroid Build Coastguard Worker   // Points to (but doesn't own) the global test part result reporter.
1253*5c90c05cSAndroid Build Coastguard Worker   TestPartResultReporterInterface* global_test_part_result_repoter_;
1254*5c90c05cSAndroid Build Coastguard Worker 
1255*5c90c05cSAndroid Build Coastguard Worker   // Protects read and write access to global_test_part_result_reporter_.
1256*5c90c05cSAndroid Build Coastguard Worker   internal::Mutex global_test_part_result_reporter_mutex_;
1257*5c90c05cSAndroid Build Coastguard Worker 
1258*5c90c05cSAndroid Build Coastguard Worker   // Points to (but doesn't own) the per-thread test part result reporter.
1259*5c90c05cSAndroid Build Coastguard Worker   internal::ThreadLocal<TestPartResultReporterInterface*>
1260*5c90c05cSAndroid Build Coastguard Worker       per_thread_test_part_result_reporter_;
1261*5c90c05cSAndroid Build Coastguard Worker 
1262*5c90c05cSAndroid Build Coastguard Worker   // The vector of environments that need to be set-up/torn-down
1263*5c90c05cSAndroid Build Coastguard Worker   // before/after the tests are run.
1264*5c90c05cSAndroid Build Coastguard Worker   std::vector<Environment*> environments_;
1265*5c90c05cSAndroid Build Coastguard Worker 
1266*5c90c05cSAndroid Build Coastguard Worker   // The vector of TestSuites in their original order.  It owns the
1267*5c90c05cSAndroid Build Coastguard Worker   // elements in the vector.
1268*5c90c05cSAndroid Build Coastguard Worker   std::vector<TestSuite*> test_suites_;
1269*5c90c05cSAndroid Build Coastguard Worker 
1270*5c90c05cSAndroid Build Coastguard Worker   // Provides a level of indirection for the test suite list to allow
1271*5c90c05cSAndroid Build Coastguard Worker   // easy shuffling and restoring the test suite order.  The i-th
1272*5c90c05cSAndroid Build Coastguard Worker   // element of this vector is the index of the i-th test suite in the
1273*5c90c05cSAndroid Build Coastguard Worker   // shuffled order.
1274*5c90c05cSAndroid Build Coastguard Worker   std::vector<int> test_suite_indices_;
1275*5c90c05cSAndroid Build Coastguard Worker 
1276*5c90c05cSAndroid Build Coastguard Worker   // ParameterizedTestRegistry object used to register value-parameterized
1277*5c90c05cSAndroid Build Coastguard Worker   // tests.
1278*5c90c05cSAndroid Build Coastguard Worker   internal::ParameterizedTestSuiteRegistry parameterized_test_registry_;
1279*5c90c05cSAndroid Build Coastguard Worker   internal::TypeParameterizedTestSuiteRegistry
1280*5c90c05cSAndroid Build Coastguard Worker       type_parameterized_test_registry_;
1281*5c90c05cSAndroid Build Coastguard Worker 
1282*5c90c05cSAndroid Build Coastguard Worker   // The set holding the name of parameterized
1283*5c90c05cSAndroid Build Coastguard Worker   // test suites that may go uninstantiated.
1284*5c90c05cSAndroid Build Coastguard Worker   std::set<std::string> ignored_parameterized_test_suites_;
1285*5c90c05cSAndroid Build Coastguard Worker 
1286*5c90c05cSAndroid Build Coastguard Worker   // Indicates whether RegisterParameterizedTests() has been called already.
1287*5c90c05cSAndroid Build Coastguard Worker   bool parameterized_tests_registered_;
1288*5c90c05cSAndroid Build Coastguard Worker 
1289*5c90c05cSAndroid Build Coastguard Worker   // Index of the last death test suite registered.  Initially -1.
1290*5c90c05cSAndroid Build Coastguard Worker   int last_death_test_suite_;
1291*5c90c05cSAndroid Build Coastguard Worker 
1292*5c90c05cSAndroid Build Coastguard Worker   // This points to the TestSuite for the currently running test.  It
1293*5c90c05cSAndroid Build Coastguard Worker   // changes as Google Test goes through one test suite after another.
1294*5c90c05cSAndroid Build Coastguard Worker   // When no test is running, this is set to NULL and Google Test
1295*5c90c05cSAndroid Build Coastguard Worker   // stores assertion results in ad_hoc_test_result_.  Initially NULL.
1296*5c90c05cSAndroid Build Coastguard Worker   TestSuite* current_test_suite_;
1297*5c90c05cSAndroid Build Coastguard Worker 
1298*5c90c05cSAndroid Build Coastguard Worker   // This points to the TestInfo for the currently running test.  It
1299*5c90c05cSAndroid Build Coastguard Worker   // changes as Google Test goes through one test after another.  When
1300*5c90c05cSAndroid Build Coastguard Worker   // no test is running, this is set to NULL and Google Test stores
1301*5c90c05cSAndroid Build Coastguard Worker   // assertion results in ad_hoc_test_result_.  Initially NULL.
1302*5c90c05cSAndroid Build Coastguard Worker   TestInfo* current_test_info_;
1303*5c90c05cSAndroid Build Coastguard Worker 
1304*5c90c05cSAndroid Build Coastguard Worker   // Normally, a user only writes assertions inside a TEST or TEST_F,
1305*5c90c05cSAndroid Build Coastguard Worker   // or inside a function called by a TEST or TEST_F.  Since Google
1306*5c90c05cSAndroid Build Coastguard Worker   // Test keeps track of which test is current running, it can
1307*5c90c05cSAndroid Build Coastguard Worker   // associate such an assertion with the test it belongs to.
1308*5c90c05cSAndroid Build Coastguard Worker   //
1309*5c90c05cSAndroid Build Coastguard Worker   // If an assertion is encountered when no TEST or TEST_F is running,
1310*5c90c05cSAndroid Build Coastguard Worker   // Google Test attributes the assertion result to an imaginary "ad hoc"
1311*5c90c05cSAndroid Build Coastguard Worker   // test, and records the result in ad_hoc_test_result_.
1312*5c90c05cSAndroid Build Coastguard Worker   TestResult ad_hoc_test_result_;
1313*5c90c05cSAndroid Build Coastguard Worker 
1314*5c90c05cSAndroid Build Coastguard Worker   // The list of event listeners that can be used to track events inside
1315*5c90c05cSAndroid Build Coastguard Worker   // Google Test.
1316*5c90c05cSAndroid Build Coastguard Worker   TestEventListeners listeners_;
1317*5c90c05cSAndroid Build Coastguard Worker 
1318*5c90c05cSAndroid Build Coastguard Worker   // The OS stack trace getter.  Will be deleted when the UnitTest
1319*5c90c05cSAndroid Build Coastguard Worker   // object is destructed.  By default, an OsStackTraceGetter is used,
1320*5c90c05cSAndroid Build Coastguard Worker   // but the user can set this field to use a custom getter if that is
1321*5c90c05cSAndroid Build Coastguard Worker   // desired.
1322*5c90c05cSAndroid Build Coastguard Worker   OsStackTraceGetterInterface* os_stack_trace_getter_;
1323*5c90c05cSAndroid Build Coastguard Worker 
1324*5c90c05cSAndroid Build Coastguard Worker   // True if and only if PostFlagParsingInit() has been called.
1325*5c90c05cSAndroid Build Coastguard Worker   bool post_flag_parse_init_performed_;
1326*5c90c05cSAndroid Build Coastguard Worker 
1327*5c90c05cSAndroid Build Coastguard Worker   // The random number seed used at the beginning of the test run.
1328*5c90c05cSAndroid Build Coastguard Worker   int random_seed_;
1329*5c90c05cSAndroid Build Coastguard Worker 
1330*5c90c05cSAndroid Build Coastguard Worker   // Our random number generator.
1331*5c90c05cSAndroid Build Coastguard Worker   internal::Random random_;
1332*5c90c05cSAndroid Build Coastguard Worker 
1333*5c90c05cSAndroid Build Coastguard Worker   // The time of the test program start, in ms from the start of the
1334*5c90c05cSAndroid Build Coastguard Worker   // UNIX epoch.
1335*5c90c05cSAndroid Build Coastguard Worker   TimeInMillis start_timestamp_;
1336*5c90c05cSAndroid Build Coastguard Worker 
1337*5c90c05cSAndroid Build Coastguard Worker   // How long the test took to run, in milliseconds.
1338*5c90c05cSAndroid Build Coastguard Worker   TimeInMillis elapsed_time_;
1339*5c90c05cSAndroid Build Coastguard Worker 
1340*5c90c05cSAndroid Build Coastguard Worker #if GTEST_HAS_DEATH_TEST
1341*5c90c05cSAndroid Build Coastguard Worker   // The decomposed components of the gtest_internal_run_death_test flag,
1342*5c90c05cSAndroid Build Coastguard Worker   // parsed when RUN_ALL_TESTS is called.
1343*5c90c05cSAndroid Build Coastguard Worker   std::unique_ptr<InternalRunDeathTestFlag> internal_run_death_test_flag_;
1344*5c90c05cSAndroid Build Coastguard Worker   std::unique_ptr<internal::DeathTestFactory> death_test_factory_;
1345*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_HAS_DEATH_TEST
1346*5c90c05cSAndroid Build Coastguard Worker 
1347*5c90c05cSAndroid Build Coastguard Worker   // A per-thread stack of traces created by the SCOPED_TRACE() macro.
1348*5c90c05cSAndroid Build Coastguard Worker   internal::ThreadLocal<std::vector<TraceInfo> > gtest_trace_stack_;
1349*5c90c05cSAndroid Build Coastguard Worker 
1350*5c90c05cSAndroid Build Coastguard Worker   // The value of GTEST_FLAG(catch_exceptions) at the moment RunAllTests()
1351*5c90c05cSAndroid Build Coastguard Worker   // starts.
1352*5c90c05cSAndroid Build Coastguard Worker   bool catch_exceptions_;
1353*5c90c05cSAndroid Build Coastguard Worker 
1354*5c90c05cSAndroid Build Coastguard Worker   GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTestImpl);
1355*5c90c05cSAndroid Build Coastguard Worker };  // class UnitTestImpl
1356*5c90c05cSAndroid Build Coastguard Worker 
1357*5c90c05cSAndroid Build Coastguard Worker // Convenience function for accessing the global UnitTest
1358*5c90c05cSAndroid Build Coastguard Worker // implementation object.
GetUnitTestImpl()1359*5c90c05cSAndroid Build Coastguard Worker inline UnitTestImpl* GetUnitTestImpl() {
1360*5c90c05cSAndroid Build Coastguard Worker   return UnitTest::GetInstance()->impl();
1361*5c90c05cSAndroid Build Coastguard Worker }
1362*5c90c05cSAndroid Build Coastguard Worker 
1363*5c90c05cSAndroid Build Coastguard Worker #if GTEST_USES_SIMPLE_RE
1364*5c90c05cSAndroid Build Coastguard Worker 
1365*5c90c05cSAndroid Build Coastguard Worker // Internal helper functions for implementing the simple regular
1366*5c90c05cSAndroid Build Coastguard Worker // expression matcher.
1367*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ bool IsInSet(char ch, const char* str);
1368*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ bool IsAsciiDigit(char ch);
1369*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ bool IsAsciiPunct(char ch);
1370*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ bool IsRepeat(char ch);
1371*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ bool IsAsciiWhiteSpace(char ch);
1372*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ bool IsAsciiWordChar(char ch);
1373*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ bool IsValidEscape(char ch);
1374*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ bool AtomMatchesChar(bool escaped, char pattern, char ch);
1375*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ bool ValidateRegex(const char* regex);
1376*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ bool MatchRegexAtHead(const char* regex, const char* str);
1377*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ bool MatchRepetitionAndRegexAtHead(
1378*5c90c05cSAndroid Build Coastguard Worker     bool escaped, char ch, char repeat, const char* regex, const char* str);
1379*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ bool MatchRegexAnywhere(const char* regex, const char* str);
1380*5c90c05cSAndroid Build Coastguard Worker 
1381*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_USES_SIMPLE_RE
1382*5c90c05cSAndroid Build Coastguard Worker 
1383*5c90c05cSAndroid Build Coastguard Worker // Parses the command line for Google Test flags, without initializing
1384*5c90c05cSAndroid Build Coastguard Worker // other parts of Google Test.
1385*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, char** argv);
1386*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv);
1387*5c90c05cSAndroid Build Coastguard Worker 
1388*5c90c05cSAndroid Build Coastguard Worker #if GTEST_HAS_DEATH_TEST
1389*5c90c05cSAndroid Build Coastguard Worker 
1390*5c90c05cSAndroid Build Coastguard Worker // Returns the message describing the last system error, regardless of the
1391*5c90c05cSAndroid Build Coastguard Worker // platform.
1392*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ std::string GetLastErrnoDescription();
1393*5c90c05cSAndroid Build Coastguard Worker 
1394*5c90c05cSAndroid Build Coastguard Worker // Attempts to parse a string into a positive integer pointed to by the
1395*5c90c05cSAndroid Build Coastguard Worker // number parameter.  Returns true if that is possible.
1396*5c90c05cSAndroid Build Coastguard Worker // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we can use
1397*5c90c05cSAndroid Build Coastguard Worker // it here.
1398*5c90c05cSAndroid Build Coastguard Worker template <typename Integer>
ParseNaturalNumber(const::std::string & str,Integer * number)1399*5c90c05cSAndroid Build Coastguard Worker bool ParseNaturalNumber(const ::std::string& str, Integer* number) {
1400*5c90c05cSAndroid Build Coastguard Worker   // Fail fast if the given string does not begin with a digit;
1401*5c90c05cSAndroid Build Coastguard Worker   // this bypasses strtoXXX's "optional leading whitespace and plus
1402*5c90c05cSAndroid Build Coastguard Worker   // or minus sign" semantics, which are undesirable here.
1403*5c90c05cSAndroid Build Coastguard Worker   if (str.empty() || !IsDigit(str[0])) {
1404*5c90c05cSAndroid Build Coastguard Worker     return false;
1405*5c90c05cSAndroid Build Coastguard Worker   }
1406*5c90c05cSAndroid Build Coastguard Worker   errno = 0;
1407*5c90c05cSAndroid Build Coastguard Worker 
1408*5c90c05cSAndroid Build Coastguard Worker   char* end;
1409*5c90c05cSAndroid Build Coastguard Worker   // BiggestConvertible is the largest integer type that system-provided
1410*5c90c05cSAndroid Build Coastguard Worker   // string-to-number conversion routines can return.
1411*5c90c05cSAndroid Build Coastguard Worker   using BiggestConvertible = unsigned long long;  // NOLINT
1412*5c90c05cSAndroid Build Coastguard Worker 
1413*5c90c05cSAndroid Build Coastguard Worker   const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10);  // NOLINT
1414*5c90c05cSAndroid Build Coastguard Worker   const bool parse_success = *end == '\0' && errno == 0;
1415*5c90c05cSAndroid Build Coastguard Worker 
1416*5c90c05cSAndroid Build Coastguard Worker   GTEST_CHECK_(sizeof(Integer) <= sizeof(parsed));
1417*5c90c05cSAndroid Build Coastguard Worker 
1418*5c90c05cSAndroid Build Coastguard Worker   const Integer result = static_cast<Integer>(parsed);
1419*5c90c05cSAndroid Build Coastguard Worker   if (parse_success && static_cast<BiggestConvertible>(result) == parsed) {
1420*5c90c05cSAndroid Build Coastguard Worker     *number = result;
1421*5c90c05cSAndroid Build Coastguard Worker     return true;
1422*5c90c05cSAndroid Build Coastguard Worker   }
1423*5c90c05cSAndroid Build Coastguard Worker   return false;
1424*5c90c05cSAndroid Build Coastguard Worker }
1425*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_HAS_DEATH_TEST
1426*5c90c05cSAndroid Build Coastguard Worker 
1427*5c90c05cSAndroid Build Coastguard Worker // TestResult contains some private methods that should be hidden from
1428*5c90c05cSAndroid Build Coastguard Worker // Google Test user but are required for testing. This class allow our tests
1429*5c90c05cSAndroid Build Coastguard Worker // to access them.
1430*5c90c05cSAndroid Build Coastguard Worker //
1431*5c90c05cSAndroid Build Coastguard Worker // This class is supplied only for the purpose of testing Google Test's own
1432*5c90c05cSAndroid Build Coastguard Worker // constructs. Do not use it in user tests, either directly or indirectly.
1433*5c90c05cSAndroid Build Coastguard Worker class TestResultAccessor {
1434*5c90c05cSAndroid Build Coastguard Worker  public:
RecordProperty(TestResult * test_result,const std::string & xml_element,const TestProperty & property)1435*5c90c05cSAndroid Build Coastguard Worker   static void RecordProperty(TestResult* test_result,
1436*5c90c05cSAndroid Build Coastguard Worker                              const std::string& xml_element,
1437*5c90c05cSAndroid Build Coastguard Worker                              const TestProperty& property) {
1438*5c90c05cSAndroid Build Coastguard Worker     test_result->RecordProperty(xml_element, property);
1439*5c90c05cSAndroid Build Coastguard Worker   }
1440*5c90c05cSAndroid Build Coastguard Worker 
ClearTestPartResults(TestResult * test_result)1441*5c90c05cSAndroid Build Coastguard Worker   static void ClearTestPartResults(TestResult* test_result) {
1442*5c90c05cSAndroid Build Coastguard Worker     test_result->ClearTestPartResults();
1443*5c90c05cSAndroid Build Coastguard Worker   }
1444*5c90c05cSAndroid Build Coastguard Worker 
test_part_results(const TestResult & test_result)1445*5c90c05cSAndroid Build Coastguard Worker   static const std::vector<testing::TestPartResult>& test_part_results(
1446*5c90c05cSAndroid Build Coastguard Worker       const TestResult& test_result) {
1447*5c90c05cSAndroid Build Coastguard Worker     return test_result.test_part_results();
1448*5c90c05cSAndroid Build Coastguard Worker   }
1449*5c90c05cSAndroid Build Coastguard Worker };
1450*5c90c05cSAndroid Build Coastguard Worker 
1451*5c90c05cSAndroid Build Coastguard Worker #if GTEST_CAN_STREAM_RESULTS_
1452*5c90c05cSAndroid Build Coastguard Worker 
1453*5c90c05cSAndroid Build Coastguard Worker // Streams test results to the given port on the given host machine.
1454*5c90c05cSAndroid Build Coastguard Worker class StreamingListener : public EmptyTestEventListener {
1455*5c90c05cSAndroid Build Coastguard Worker  public:
1456*5c90c05cSAndroid Build Coastguard Worker   // Abstract base class for writing strings to a socket.
1457*5c90c05cSAndroid Build Coastguard Worker   class AbstractSocketWriter {
1458*5c90c05cSAndroid Build Coastguard Worker    public:
~AbstractSocketWriter()1459*5c90c05cSAndroid Build Coastguard Worker     virtual ~AbstractSocketWriter() {}
1460*5c90c05cSAndroid Build Coastguard Worker 
1461*5c90c05cSAndroid Build Coastguard Worker     // Sends a string to the socket.
1462*5c90c05cSAndroid Build Coastguard Worker     virtual void Send(const std::string& message) = 0;
1463*5c90c05cSAndroid Build Coastguard Worker 
1464*5c90c05cSAndroid Build Coastguard Worker     // Closes the socket.
CloseConnection()1465*5c90c05cSAndroid Build Coastguard Worker     virtual void CloseConnection() {}
1466*5c90c05cSAndroid Build Coastguard Worker 
1467*5c90c05cSAndroid Build Coastguard Worker     // Sends a string and a newline to the socket.
SendLn(const std::string & message)1468*5c90c05cSAndroid Build Coastguard Worker     void SendLn(const std::string& message) { Send(message + "\n"); }
1469*5c90c05cSAndroid Build Coastguard Worker   };
1470*5c90c05cSAndroid Build Coastguard Worker 
1471*5c90c05cSAndroid Build Coastguard Worker   // Concrete class for actually writing strings to a socket.
1472*5c90c05cSAndroid Build Coastguard Worker   class SocketWriter : public AbstractSocketWriter {
1473*5c90c05cSAndroid Build Coastguard Worker    public:
SocketWriter(const std::string & host,const std::string & port)1474*5c90c05cSAndroid Build Coastguard Worker     SocketWriter(const std::string& host, const std::string& port)
1475*5c90c05cSAndroid Build Coastguard Worker         : sockfd_(-1), host_name_(host), port_num_(port) {
1476*5c90c05cSAndroid Build Coastguard Worker       MakeConnection();
1477*5c90c05cSAndroid Build Coastguard Worker     }
1478*5c90c05cSAndroid Build Coastguard Worker 
~SocketWriter()1479*5c90c05cSAndroid Build Coastguard Worker     ~SocketWriter() override {
1480*5c90c05cSAndroid Build Coastguard Worker       if (sockfd_ != -1)
1481*5c90c05cSAndroid Build Coastguard Worker         CloseConnection();
1482*5c90c05cSAndroid Build Coastguard Worker     }
1483*5c90c05cSAndroid Build Coastguard Worker 
1484*5c90c05cSAndroid Build Coastguard Worker     // Sends a string to the socket.
Send(const std::string & message)1485*5c90c05cSAndroid Build Coastguard Worker     void Send(const std::string& message) override {
1486*5c90c05cSAndroid Build Coastguard Worker       GTEST_CHECK_(sockfd_ != -1)
1487*5c90c05cSAndroid Build Coastguard Worker           << "Send() can be called only when there is a connection.";
1488*5c90c05cSAndroid Build Coastguard Worker 
1489*5c90c05cSAndroid Build Coastguard Worker       const auto len = static_cast<size_t>(message.length());
1490*5c90c05cSAndroid Build Coastguard Worker       if (write(sockfd_, message.c_str(), len) != static_cast<ssize_t>(len)) {
1491*5c90c05cSAndroid Build Coastguard Worker         GTEST_LOG_(WARNING)
1492*5c90c05cSAndroid Build Coastguard Worker             << "stream_result_to: failed to stream to "
1493*5c90c05cSAndroid Build Coastguard Worker             << host_name_ << ":" << port_num_;
1494*5c90c05cSAndroid Build Coastguard Worker       }
1495*5c90c05cSAndroid Build Coastguard Worker     }
1496*5c90c05cSAndroid Build Coastguard Worker 
1497*5c90c05cSAndroid Build Coastguard Worker    private:
1498*5c90c05cSAndroid Build Coastguard Worker     // Creates a client socket and connects to the server.
1499*5c90c05cSAndroid Build Coastguard Worker     void MakeConnection();
1500*5c90c05cSAndroid Build Coastguard Worker 
1501*5c90c05cSAndroid Build Coastguard Worker     // Closes the socket.
CloseConnection()1502*5c90c05cSAndroid Build Coastguard Worker     void CloseConnection() override {
1503*5c90c05cSAndroid Build Coastguard Worker       GTEST_CHECK_(sockfd_ != -1)
1504*5c90c05cSAndroid Build Coastguard Worker           << "CloseConnection() can be called only when there is a connection.";
1505*5c90c05cSAndroid Build Coastguard Worker 
1506*5c90c05cSAndroid Build Coastguard Worker       close(sockfd_);
1507*5c90c05cSAndroid Build Coastguard Worker       sockfd_ = -1;
1508*5c90c05cSAndroid Build Coastguard Worker     }
1509*5c90c05cSAndroid Build Coastguard Worker 
1510*5c90c05cSAndroid Build Coastguard Worker     int sockfd_;  // socket file descriptor
1511*5c90c05cSAndroid Build Coastguard Worker     const std::string host_name_;
1512*5c90c05cSAndroid Build Coastguard Worker     const std::string port_num_;
1513*5c90c05cSAndroid Build Coastguard Worker 
1514*5c90c05cSAndroid Build Coastguard Worker     GTEST_DISALLOW_COPY_AND_ASSIGN_(SocketWriter);
1515*5c90c05cSAndroid Build Coastguard Worker   };  // class SocketWriter
1516*5c90c05cSAndroid Build Coastguard Worker 
1517*5c90c05cSAndroid Build Coastguard Worker   // Escapes '=', '&', '%', and '\n' characters in str as "%xx".
1518*5c90c05cSAndroid Build Coastguard Worker   static std::string UrlEncode(const char* str);
1519*5c90c05cSAndroid Build Coastguard Worker 
StreamingListener(const std::string & host,const std::string & port)1520*5c90c05cSAndroid Build Coastguard Worker   StreamingListener(const std::string& host, const std::string& port)
1521*5c90c05cSAndroid Build Coastguard Worker       : socket_writer_(new SocketWriter(host, port)) {
1522*5c90c05cSAndroid Build Coastguard Worker     Start();
1523*5c90c05cSAndroid Build Coastguard Worker   }
1524*5c90c05cSAndroid Build Coastguard Worker 
StreamingListener(AbstractSocketWriter * socket_writer)1525*5c90c05cSAndroid Build Coastguard Worker   explicit StreamingListener(AbstractSocketWriter* socket_writer)
1526*5c90c05cSAndroid Build Coastguard Worker       : socket_writer_(socket_writer) { Start(); }
1527*5c90c05cSAndroid Build Coastguard Worker 
OnTestProgramStart(const UnitTest &)1528*5c90c05cSAndroid Build Coastguard Worker   void OnTestProgramStart(const UnitTest& /* unit_test */) override {
1529*5c90c05cSAndroid Build Coastguard Worker     SendLn("event=TestProgramStart");
1530*5c90c05cSAndroid Build Coastguard Worker   }
1531*5c90c05cSAndroid Build Coastguard Worker 
OnTestProgramEnd(const UnitTest & unit_test)1532*5c90c05cSAndroid Build Coastguard Worker   void OnTestProgramEnd(const UnitTest& unit_test) override {
1533*5c90c05cSAndroid Build Coastguard Worker     // Note that Google Test current only report elapsed time for each
1534*5c90c05cSAndroid Build Coastguard Worker     // test iteration, not for the entire test program.
1535*5c90c05cSAndroid Build Coastguard Worker     SendLn("event=TestProgramEnd&passed=" + FormatBool(unit_test.Passed()));
1536*5c90c05cSAndroid Build Coastguard Worker 
1537*5c90c05cSAndroid Build Coastguard Worker     // Notify the streaming server to stop.
1538*5c90c05cSAndroid Build Coastguard Worker     socket_writer_->CloseConnection();
1539*5c90c05cSAndroid Build Coastguard Worker   }
1540*5c90c05cSAndroid Build Coastguard Worker 
OnTestIterationStart(const UnitTest &,int iteration)1541*5c90c05cSAndroid Build Coastguard Worker   void OnTestIterationStart(const UnitTest& /* unit_test */,
1542*5c90c05cSAndroid Build Coastguard Worker                             int iteration) override {
1543*5c90c05cSAndroid Build Coastguard Worker     SendLn("event=TestIterationStart&iteration=" +
1544*5c90c05cSAndroid Build Coastguard Worker            StreamableToString(iteration));
1545*5c90c05cSAndroid Build Coastguard Worker   }
1546*5c90c05cSAndroid Build Coastguard Worker 
OnTestIterationEnd(const UnitTest & unit_test,int)1547*5c90c05cSAndroid Build Coastguard Worker   void OnTestIterationEnd(const UnitTest& unit_test,
1548*5c90c05cSAndroid Build Coastguard Worker                           int /* iteration */) override {
1549*5c90c05cSAndroid Build Coastguard Worker     SendLn("event=TestIterationEnd&passed=" +
1550*5c90c05cSAndroid Build Coastguard Worker            FormatBool(unit_test.Passed()) + "&elapsed_time=" +
1551*5c90c05cSAndroid Build Coastguard Worker            StreamableToString(unit_test.elapsed_time()) + "ms");
1552*5c90c05cSAndroid Build Coastguard Worker   }
1553*5c90c05cSAndroid Build Coastguard Worker 
1554*5c90c05cSAndroid Build Coastguard Worker   // Note that "event=TestCaseStart" is a wire format and has to remain
1555*5c90c05cSAndroid Build Coastguard Worker   // "case" for compatibility
OnTestCaseStart(const TestCase & test_case)1556*5c90c05cSAndroid Build Coastguard Worker   void OnTestCaseStart(const TestCase& test_case) override {
1557*5c90c05cSAndroid Build Coastguard Worker     SendLn(std::string("event=TestCaseStart&name=") + test_case.name());
1558*5c90c05cSAndroid Build Coastguard Worker   }
1559*5c90c05cSAndroid Build Coastguard Worker 
1560*5c90c05cSAndroid Build Coastguard Worker   // Note that "event=TestCaseEnd" is a wire format and has to remain
1561*5c90c05cSAndroid Build Coastguard Worker   // "case" for compatibility
OnTestCaseEnd(const TestCase & test_case)1562*5c90c05cSAndroid Build Coastguard Worker   void OnTestCaseEnd(const TestCase& test_case) override {
1563*5c90c05cSAndroid Build Coastguard Worker     SendLn("event=TestCaseEnd&passed=" + FormatBool(test_case.Passed()) +
1564*5c90c05cSAndroid Build Coastguard Worker            "&elapsed_time=" + StreamableToString(test_case.elapsed_time()) +
1565*5c90c05cSAndroid Build Coastguard Worker            "ms");
1566*5c90c05cSAndroid Build Coastguard Worker   }
1567*5c90c05cSAndroid Build Coastguard Worker 
OnTestStart(const TestInfo & test_info)1568*5c90c05cSAndroid Build Coastguard Worker   void OnTestStart(const TestInfo& test_info) override {
1569*5c90c05cSAndroid Build Coastguard Worker     SendLn(std::string("event=TestStart&name=") + test_info.name());
1570*5c90c05cSAndroid Build Coastguard Worker   }
1571*5c90c05cSAndroid Build Coastguard Worker 
OnTestEnd(const TestInfo & test_info)1572*5c90c05cSAndroid Build Coastguard Worker   void OnTestEnd(const TestInfo& test_info) override {
1573*5c90c05cSAndroid Build Coastguard Worker     SendLn("event=TestEnd&passed=" +
1574*5c90c05cSAndroid Build Coastguard Worker            FormatBool((test_info.result())->Passed()) +
1575*5c90c05cSAndroid Build Coastguard Worker            "&elapsed_time=" +
1576*5c90c05cSAndroid Build Coastguard Worker            StreamableToString((test_info.result())->elapsed_time()) + "ms");
1577*5c90c05cSAndroid Build Coastguard Worker   }
1578*5c90c05cSAndroid Build Coastguard Worker 
OnTestPartResult(const TestPartResult & test_part_result)1579*5c90c05cSAndroid Build Coastguard Worker   void OnTestPartResult(const TestPartResult& test_part_result) override {
1580*5c90c05cSAndroid Build Coastguard Worker     const char* file_name = test_part_result.file_name();
1581*5c90c05cSAndroid Build Coastguard Worker     if (file_name == nullptr) file_name = "";
1582*5c90c05cSAndroid Build Coastguard Worker     SendLn("event=TestPartResult&file=" + UrlEncode(file_name) +
1583*5c90c05cSAndroid Build Coastguard Worker            "&line=" + StreamableToString(test_part_result.line_number()) +
1584*5c90c05cSAndroid Build Coastguard Worker            "&message=" + UrlEncode(test_part_result.message()));
1585*5c90c05cSAndroid Build Coastguard Worker   }
1586*5c90c05cSAndroid Build Coastguard Worker 
1587*5c90c05cSAndroid Build Coastguard Worker  private:
1588*5c90c05cSAndroid Build Coastguard Worker   // Sends the given message and a newline to the socket.
SendLn(const std::string & message)1589*5c90c05cSAndroid Build Coastguard Worker   void SendLn(const std::string& message) { socket_writer_->SendLn(message); }
1590*5c90c05cSAndroid Build Coastguard Worker 
1591*5c90c05cSAndroid Build Coastguard Worker   // Called at the start of streaming to notify the receiver what
1592*5c90c05cSAndroid Build Coastguard Worker   // protocol we are using.
Start()1593*5c90c05cSAndroid Build Coastguard Worker   void Start() { SendLn("gtest_streaming_protocol_version=1.0"); }
1594*5c90c05cSAndroid Build Coastguard Worker 
FormatBool(bool value)1595*5c90c05cSAndroid Build Coastguard Worker   std::string FormatBool(bool value) { return value ? "1" : "0"; }
1596*5c90c05cSAndroid Build Coastguard Worker 
1597*5c90c05cSAndroid Build Coastguard Worker   const std::unique_ptr<AbstractSocketWriter> socket_writer_;
1598*5c90c05cSAndroid Build Coastguard Worker 
1599*5c90c05cSAndroid Build Coastguard Worker   GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamingListener);
1600*5c90c05cSAndroid Build Coastguard Worker };  // class StreamingListener
1601*5c90c05cSAndroid Build Coastguard Worker 
1602*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_CAN_STREAM_RESULTS_
1603*5c90c05cSAndroid Build Coastguard Worker 
1604*5c90c05cSAndroid Build Coastguard Worker }  // namespace internal
1605*5c90c05cSAndroid Build Coastguard Worker }  // namespace testing
1606*5c90c05cSAndroid Build Coastguard Worker 
1607*5c90c05cSAndroid Build Coastguard Worker GTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251
1608*5c90c05cSAndroid Build Coastguard Worker 
1609*5c90c05cSAndroid Build Coastguard Worker #endif  // GOOGLETEST_SRC_GTEST_INTERNAL_INL_H_
1610*5c90c05cSAndroid Build Coastguard Worker 
1611*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_WINDOWS
1612*5c90c05cSAndroid Build Coastguard Worker # define vsnprintf _vsnprintf
1613*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_OS_WINDOWS
1614*5c90c05cSAndroid Build Coastguard Worker 
1615*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_MAC
1616*5c90c05cSAndroid Build Coastguard Worker #ifndef GTEST_OS_IOS
1617*5c90c05cSAndroid Build Coastguard Worker #include <crt_externs.h>
1618*5c90c05cSAndroid Build Coastguard Worker #endif
1619*5c90c05cSAndroid Build Coastguard Worker #endif
1620*5c90c05cSAndroid Build Coastguard Worker 
1621*5c90c05cSAndroid Build Coastguard Worker #if GTEST_HAS_ABSL
1622*5c90c05cSAndroid Build Coastguard Worker #include "absl/debugging/failure_signal_handler.h"
1623*5c90c05cSAndroid Build Coastguard Worker #include "absl/debugging/stacktrace.h"
1624*5c90c05cSAndroid Build Coastguard Worker #include "absl/debugging/symbolize.h"
1625*5c90c05cSAndroid Build Coastguard Worker #include "absl/strings/str_cat.h"
1626*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_HAS_ABSL
1627*5c90c05cSAndroid Build Coastguard Worker 
1628*5c90c05cSAndroid Build Coastguard Worker namespace testing {
1629*5c90c05cSAndroid Build Coastguard Worker 
1630*5c90c05cSAndroid Build Coastguard Worker using internal::CountIf;
1631*5c90c05cSAndroid Build Coastguard Worker using internal::ForEach;
1632*5c90c05cSAndroid Build Coastguard Worker using internal::GetElementOr;
1633*5c90c05cSAndroid Build Coastguard Worker using internal::Shuffle;
1634*5c90c05cSAndroid Build Coastguard Worker 
1635*5c90c05cSAndroid Build Coastguard Worker // Constants.
1636*5c90c05cSAndroid Build Coastguard Worker 
1637*5c90c05cSAndroid Build Coastguard Worker // A test whose test suite name or test name matches this filter is
1638*5c90c05cSAndroid Build Coastguard Worker // disabled and not run.
1639*5c90c05cSAndroid Build Coastguard Worker static const char kDisableTestFilter[] = "DISABLED_*:*/DISABLED_*";
1640*5c90c05cSAndroid Build Coastguard Worker 
1641*5c90c05cSAndroid Build Coastguard Worker // A test suite whose name matches this filter is considered a death
1642*5c90c05cSAndroid Build Coastguard Worker // test suite and will be run before test suites whose name doesn't
1643*5c90c05cSAndroid Build Coastguard Worker // match this filter.
1644*5c90c05cSAndroid Build Coastguard Worker static const char kDeathTestSuiteFilter[] = "*DeathTest:*DeathTest/*";
1645*5c90c05cSAndroid Build Coastguard Worker 
1646*5c90c05cSAndroid Build Coastguard Worker // A test filter that matches everything.
1647*5c90c05cSAndroid Build Coastguard Worker static const char kUniversalFilter[] = "*";
1648*5c90c05cSAndroid Build Coastguard Worker 
1649*5c90c05cSAndroid Build Coastguard Worker // The default output format.
1650*5c90c05cSAndroid Build Coastguard Worker static const char kDefaultOutputFormat[] = "xml";
1651*5c90c05cSAndroid Build Coastguard Worker // The default output file.
1652*5c90c05cSAndroid Build Coastguard Worker static const char kDefaultOutputFile[] = "test_detail";
1653*5c90c05cSAndroid Build Coastguard Worker 
1654*5c90c05cSAndroid Build Coastguard Worker // The environment variable name for the test shard index.
1655*5c90c05cSAndroid Build Coastguard Worker static const char kTestShardIndex[] = "GTEST_SHARD_INDEX";
1656*5c90c05cSAndroid Build Coastguard Worker // The environment variable name for the total number of test shards.
1657*5c90c05cSAndroid Build Coastguard Worker static const char kTestTotalShards[] = "GTEST_TOTAL_SHARDS";
1658*5c90c05cSAndroid Build Coastguard Worker // The environment variable name for the test shard status file.
1659*5c90c05cSAndroid Build Coastguard Worker static const char kTestShardStatusFile[] = "GTEST_SHARD_STATUS_FILE";
1660*5c90c05cSAndroid Build Coastguard Worker 
1661*5c90c05cSAndroid Build Coastguard Worker namespace internal {
1662*5c90c05cSAndroid Build Coastguard Worker 
1663*5c90c05cSAndroid Build Coastguard Worker // The text used in failure messages to indicate the start of the
1664*5c90c05cSAndroid Build Coastguard Worker // stack trace.
1665*5c90c05cSAndroid Build Coastguard Worker const char kStackTraceMarker[] = "\nStack trace:\n";
1666*5c90c05cSAndroid Build Coastguard Worker 
1667*5c90c05cSAndroid Build Coastguard Worker // g_help_flag is true if and only if the --help flag or an equivalent form
1668*5c90c05cSAndroid Build Coastguard Worker // is specified on the command line.
1669*5c90c05cSAndroid Build Coastguard Worker bool g_help_flag = false;
1670*5c90c05cSAndroid Build Coastguard Worker 
1671*5c90c05cSAndroid Build Coastguard Worker // Utilty function to Open File for Writing
OpenFileForWriting(const std::string & output_file)1672*5c90c05cSAndroid Build Coastguard Worker static FILE* OpenFileForWriting(const std::string& output_file) {
1673*5c90c05cSAndroid Build Coastguard Worker   FILE* fileout = nullptr;
1674*5c90c05cSAndroid Build Coastguard Worker   FilePath output_file_path(output_file);
1675*5c90c05cSAndroid Build Coastguard Worker   FilePath output_dir(output_file_path.RemoveFileName());
1676*5c90c05cSAndroid Build Coastguard Worker 
1677*5c90c05cSAndroid Build Coastguard Worker   if (output_dir.CreateDirectoriesRecursively()) {
1678*5c90c05cSAndroid Build Coastguard Worker     fileout = posix::FOpen(output_file.c_str(), "w");
1679*5c90c05cSAndroid Build Coastguard Worker   }
1680*5c90c05cSAndroid Build Coastguard Worker   if (fileout == nullptr) {
1681*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOG_(FATAL) << "Unable to open file \"" << output_file << "\"";
1682*5c90c05cSAndroid Build Coastguard Worker   }
1683*5c90c05cSAndroid Build Coastguard Worker   return fileout;
1684*5c90c05cSAndroid Build Coastguard Worker }
1685*5c90c05cSAndroid Build Coastguard Worker 
1686*5c90c05cSAndroid Build Coastguard Worker }  // namespace internal
1687*5c90c05cSAndroid Build Coastguard Worker 
1688*5c90c05cSAndroid Build Coastguard Worker // Bazel passes in the argument to '--test_filter' via the TESTBRIDGE_TEST_ONLY
1689*5c90c05cSAndroid Build Coastguard Worker // environment variable.
GetDefaultFilter()1690*5c90c05cSAndroid Build Coastguard Worker static const char* GetDefaultFilter() {
1691*5c90c05cSAndroid Build Coastguard Worker   const char* const testbridge_test_only =
1692*5c90c05cSAndroid Build Coastguard Worker       internal::posix::GetEnv("TESTBRIDGE_TEST_ONLY");
1693*5c90c05cSAndroid Build Coastguard Worker   if (testbridge_test_only != nullptr) {
1694*5c90c05cSAndroid Build Coastguard Worker     return testbridge_test_only;
1695*5c90c05cSAndroid Build Coastguard Worker   }
1696*5c90c05cSAndroid Build Coastguard Worker   return kUniversalFilter;
1697*5c90c05cSAndroid Build Coastguard Worker }
1698*5c90c05cSAndroid Build Coastguard Worker 
1699*5c90c05cSAndroid Build Coastguard Worker // Bazel passes in the argument to '--test_runner_fail_fast' via the
1700*5c90c05cSAndroid Build Coastguard Worker // TESTBRIDGE_TEST_RUNNER_FAIL_FAST environment variable.
GetDefaultFailFast()1701*5c90c05cSAndroid Build Coastguard Worker static bool GetDefaultFailFast() {
1702*5c90c05cSAndroid Build Coastguard Worker   const char* const testbridge_test_runner_fail_fast =
1703*5c90c05cSAndroid Build Coastguard Worker       internal::posix::GetEnv("TESTBRIDGE_TEST_RUNNER_FAIL_FAST");
1704*5c90c05cSAndroid Build Coastguard Worker   if (testbridge_test_runner_fail_fast != nullptr) {
1705*5c90c05cSAndroid Build Coastguard Worker     return strcmp(testbridge_test_runner_fail_fast, "1") == 0;
1706*5c90c05cSAndroid Build Coastguard Worker   }
1707*5c90c05cSAndroid Build Coastguard Worker   return false;
1708*5c90c05cSAndroid Build Coastguard Worker }
1709*5c90c05cSAndroid Build Coastguard Worker 
1710*5c90c05cSAndroid Build Coastguard Worker GTEST_DEFINE_bool_(
1711*5c90c05cSAndroid Build Coastguard Worker     fail_fast, internal::BoolFromGTestEnv("fail_fast", GetDefaultFailFast()),
1712*5c90c05cSAndroid Build Coastguard Worker     "True if and only if a test failure should stop further test execution.");
1713*5c90c05cSAndroid Build Coastguard Worker 
1714*5c90c05cSAndroid Build Coastguard Worker GTEST_DEFINE_bool_(
1715*5c90c05cSAndroid Build Coastguard Worker     also_run_disabled_tests,
1716*5c90c05cSAndroid Build Coastguard Worker     internal::BoolFromGTestEnv("also_run_disabled_tests", false),
1717*5c90c05cSAndroid Build Coastguard Worker     "Run disabled tests too, in addition to the tests normally being run.");
1718*5c90c05cSAndroid Build Coastguard Worker 
1719*5c90c05cSAndroid Build Coastguard Worker GTEST_DEFINE_bool_(
1720*5c90c05cSAndroid Build Coastguard Worker     break_on_failure, internal::BoolFromGTestEnv("break_on_failure", false),
1721*5c90c05cSAndroid Build Coastguard Worker     "True if and only if a failed assertion should be a debugger "
1722*5c90c05cSAndroid Build Coastguard Worker     "break-point.");
1723*5c90c05cSAndroid Build Coastguard Worker 
1724*5c90c05cSAndroid Build Coastguard Worker GTEST_DEFINE_bool_(catch_exceptions,
1725*5c90c05cSAndroid Build Coastguard Worker                    internal::BoolFromGTestEnv("catch_exceptions", true),
1726*5c90c05cSAndroid Build Coastguard Worker                    "True if and only if " GTEST_NAME_
1727*5c90c05cSAndroid Build Coastguard Worker                    " should catch exceptions and treat them as test failures.");
1728*5c90c05cSAndroid Build Coastguard Worker 
1729*5c90c05cSAndroid Build Coastguard Worker GTEST_DEFINE_string_(
1730*5c90c05cSAndroid Build Coastguard Worker     color,
1731*5c90c05cSAndroid Build Coastguard Worker     internal::StringFromGTestEnv("color", "auto"),
1732*5c90c05cSAndroid Build Coastguard Worker     "Whether to use colors in the output.  Valid values: yes, no, "
1733*5c90c05cSAndroid Build Coastguard Worker     "and auto.  'auto' means to use colors if the output is "
1734*5c90c05cSAndroid Build Coastguard Worker     "being sent to a terminal and the TERM environment variable "
1735*5c90c05cSAndroid Build Coastguard Worker     "is set to a terminal type that supports colors.");
1736*5c90c05cSAndroid Build Coastguard Worker 
1737*5c90c05cSAndroid Build Coastguard Worker GTEST_DEFINE_string_(
1738*5c90c05cSAndroid Build Coastguard Worker     filter,
1739*5c90c05cSAndroid Build Coastguard Worker     internal::StringFromGTestEnv("filter", GetDefaultFilter()),
1740*5c90c05cSAndroid Build Coastguard Worker     "A colon-separated list of glob (not regex) patterns "
1741*5c90c05cSAndroid Build Coastguard Worker     "for filtering the tests to run, optionally followed by a "
1742*5c90c05cSAndroid Build Coastguard Worker     "'-' and a : separated list of negative patterns (tests to "
1743*5c90c05cSAndroid Build Coastguard Worker     "exclude).  A test is run if it matches one of the positive "
1744*5c90c05cSAndroid Build Coastguard Worker     "patterns and does not match any of the negative patterns.");
1745*5c90c05cSAndroid Build Coastguard Worker 
1746*5c90c05cSAndroid Build Coastguard Worker GTEST_DEFINE_bool_(
1747*5c90c05cSAndroid Build Coastguard Worker     install_failure_signal_handler,
1748*5c90c05cSAndroid Build Coastguard Worker     internal::BoolFromGTestEnv("install_failure_signal_handler", false),
1749*5c90c05cSAndroid Build Coastguard Worker     "If true and supported on the current platform, " GTEST_NAME_ " should "
1750*5c90c05cSAndroid Build Coastguard Worker     "install a signal handler that dumps debugging information when fatal "
1751*5c90c05cSAndroid Build Coastguard Worker     "signals are raised.");
1752*5c90c05cSAndroid Build Coastguard Worker 
1753*5c90c05cSAndroid Build Coastguard Worker GTEST_DEFINE_bool_(list_tests, false,
1754*5c90c05cSAndroid Build Coastguard Worker                    "List all tests without running them.");
1755*5c90c05cSAndroid Build Coastguard Worker 
1756*5c90c05cSAndroid Build Coastguard Worker // The net priority order after flag processing is thus:
1757*5c90c05cSAndroid Build Coastguard Worker //   --gtest_output command line flag
1758*5c90c05cSAndroid Build Coastguard Worker //   GTEST_OUTPUT environment variable
1759*5c90c05cSAndroid Build Coastguard Worker //   XML_OUTPUT_FILE environment variable
1760*5c90c05cSAndroid Build Coastguard Worker //   ''
1761*5c90c05cSAndroid Build Coastguard Worker GTEST_DEFINE_string_(
1762*5c90c05cSAndroid Build Coastguard Worker     output,
1763*5c90c05cSAndroid Build Coastguard Worker     internal::StringFromGTestEnv("output",
1764*5c90c05cSAndroid Build Coastguard Worker       internal::OutputFlagAlsoCheckEnvVar().c_str()),
1765*5c90c05cSAndroid Build Coastguard Worker     "A format (defaults to \"xml\" but can be specified to be \"json\"), "
1766*5c90c05cSAndroid Build Coastguard Worker     "optionally followed by a colon and an output file name or directory. "
1767*5c90c05cSAndroid Build Coastguard Worker     "A directory is indicated by a trailing pathname separator. "
1768*5c90c05cSAndroid Build Coastguard Worker     "Examples: \"xml:filename.xml\", \"xml::directoryname/\". "
1769*5c90c05cSAndroid Build Coastguard Worker     "If a directory is specified, output files will be created "
1770*5c90c05cSAndroid Build Coastguard Worker     "within that directory, with file-names based on the test "
1771*5c90c05cSAndroid Build Coastguard Worker     "executable's name and, if necessary, made unique by adding "
1772*5c90c05cSAndroid Build Coastguard Worker     "digits.");
1773*5c90c05cSAndroid Build Coastguard Worker 
1774*5c90c05cSAndroid Build Coastguard Worker GTEST_DEFINE_bool_(
1775*5c90c05cSAndroid Build Coastguard Worker     brief, internal::BoolFromGTestEnv("brief", false),
1776*5c90c05cSAndroid Build Coastguard Worker     "True if only test failures should be displayed in text output.");
1777*5c90c05cSAndroid Build Coastguard Worker 
1778*5c90c05cSAndroid Build Coastguard Worker GTEST_DEFINE_bool_(print_time, internal::BoolFromGTestEnv("print_time", true),
1779*5c90c05cSAndroid Build Coastguard Worker                    "True if and only if " GTEST_NAME_
1780*5c90c05cSAndroid Build Coastguard Worker                    " should display elapsed time in text output.");
1781*5c90c05cSAndroid Build Coastguard Worker 
1782*5c90c05cSAndroid Build Coastguard Worker GTEST_DEFINE_bool_(print_utf8, internal::BoolFromGTestEnv("print_utf8", true),
1783*5c90c05cSAndroid Build Coastguard Worker                    "True if and only if " GTEST_NAME_
1784*5c90c05cSAndroid Build Coastguard Worker                    " prints UTF8 characters as text.");
1785*5c90c05cSAndroid Build Coastguard Worker 
1786*5c90c05cSAndroid Build Coastguard Worker GTEST_DEFINE_int32_(
1787*5c90c05cSAndroid Build Coastguard Worker     random_seed,
1788*5c90c05cSAndroid Build Coastguard Worker     internal::Int32FromGTestEnv("random_seed", 0),
1789*5c90c05cSAndroid Build Coastguard Worker     "Random number seed to use when shuffling test orders.  Must be in range "
1790*5c90c05cSAndroid Build Coastguard Worker     "[1, 99999], or 0 to use a seed based on the current time.");
1791*5c90c05cSAndroid Build Coastguard Worker 
1792*5c90c05cSAndroid Build Coastguard Worker GTEST_DEFINE_int32_(
1793*5c90c05cSAndroid Build Coastguard Worker     repeat,
1794*5c90c05cSAndroid Build Coastguard Worker     internal::Int32FromGTestEnv("repeat", 1),
1795*5c90c05cSAndroid Build Coastguard Worker     "How many times to repeat each test.  Specify a negative number "
1796*5c90c05cSAndroid Build Coastguard Worker     "for repeating forever.  Useful for shaking out flaky tests.");
1797*5c90c05cSAndroid Build Coastguard Worker 
1798*5c90c05cSAndroid Build Coastguard Worker GTEST_DEFINE_bool_(show_internal_stack_frames, false,
1799*5c90c05cSAndroid Build Coastguard Worker                    "True if and only if " GTEST_NAME_
1800*5c90c05cSAndroid Build Coastguard Worker                    " should include internal stack frames when "
1801*5c90c05cSAndroid Build Coastguard Worker                    "printing test failure stack traces.");
1802*5c90c05cSAndroid Build Coastguard Worker 
1803*5c90c05cSAndroid Build Coastguard Worker GTEST_DEFINE_bool_(shuffle, internal::BoolFromGTestEnv("shuffle", false),
1804*5c90c05cSAndroid Build Coastguard Worker                    "True if and only if " GTEST_NAME_
1805*5c90c05cSAndroid Build Coastguard Worker                    " should randomize tests' order on every run.");
1806*5c90c05cSAndroid Build Coastguard Worker 
1807*5c90c05cSAndroid Build Coastguard Worker GTEST_DEFINE_int32_(
1808*5c90c05cSAndroid Build Coastguard Worker     stack_trace_depth,
1809*5c90c05cSAndroid Build Coastguard Worker     internal::Int32FromGTestEnv("stack_trace_depth", kMaxStackTraceDepth),
1810*5c90c05cSAndroid Build Coastguard Worker     "The maximum number of stack frames to print when an "
1811*5c90c05cSAndroid Build Coastguard Worker     "assertion fails.  The valid range is 0 through 100, inclusive.");
1812*5c90c05cSAndroid Build Coastguard Worker 
1813*5c90c05cSAndroid Build Coastguard Worker GTEST_DEFINE_string_(
1814*5c90c05cSAndroid Build Coastguard Worker     stream_result_to,
1815*5c90c05cSAndroid Build Coastguard Worker     internal::StringFromGTestEnv("stream_result_to", ""),
1816*5c90c05cSAndroid Build Coastguard Worker     "This flag specifies the host name and the port number on which to stream "
1817*5c90c05cSAndroid Build Coastguard Worker     "test results. Example: \"localhost:555\". The flag is effective only on "
1818*5c90c05cSAndroid Build Coastguard Worker     "Linux.");
1819*5c90c05cSAndroid Build Coastguard Worker 
1820*5c90c05cSAndroid Build Coastguard Worker GTEST_DEFINE_bool_(
1821*5c90c05cSAndroid Build Coastguard Worker     throw_on_failure,
1822*5c90c05cSAndroid Build Coastguard Worker     internal::BoolFromGTestEnv("throw_on_failure", false),
1823*5c90c05cSAndroid Build Coastguard Worker     "When this flag is specified, a failed assertion will throw an exception "
1824*5c90c05cSAndroid Build Coastguard Worker     "if exceptions are enabled or exit the program with a non-zero code "
1825*5c90c05cSAndroid Build Coastguard Worker     "otherwise. For use with an external test framework.");
1826*5c90c05cSAndroid Build Coastguard Worker 
1827*5c90c05cSAndroid Build Coastguard Worker #if GTEST_USE_OWN_FLAGFILE_FLAG_
1828*5c90c05cSAndroid Build Coastguard Worker GTEST_DEFINE_string_(
1829*5c90c05cSAndroid Build Coastguard Worker     flagfile,
1830*5c90c05cSAndroid Build Coastguard Worker     internal::StringFromGTestEnv("flagfile", ""),
1831*5c90c05cSAndroid Build Coastguard Worker     "This flag specifies the flagfile to read command-line flags from.");
1832*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_USE_OWN_FLAGFILE_FLAG_
1833*5c90c05cSAndroid Build Coastguard Worker 
1834*5c90c05cSAndroid Build Coastguard Worker namespace internal {
1835*5c90c05cSAndroid Build Coastguard Worker 
1836*5c90c05cSAndroid Build Coastguard Worker // Generates a random number from [0, range), using a Linear
1837*5c90c05cSAndroid Build Coastguard Worker // Congruential Generator (LCG).  Crashes if 'range' is 0 or greater
1838*5c90c05cSAndroid Build Coastguard Worker // than kMaxRange.
Generate(uint32_t range)1839*5c90c05cSAndroid Build Coastguard Worker uint32_t Random::Generate(uint32_t range) {
1840*5c90c05cSAndroid Build Coastguard Worker   // These constants are the same as are used in glibc's rand(3).
1841*5c90c05cSAndroid Build Coastguard Worker   // Use wider types than necessary to prevent unsigned overflow diagnostics.
1842*5c90c05cSAndroid Build Coastguard Worker   state_ = static_cast<uint32_t>(1103515245ULL*state_ + 12345U) % kMaxRange;
1843*5c90c05cSAndroid Build Coastguard Worker 
1844*5c90c05cSAndroid Build Coastguard Worker   GTEST_CHECK_(range > 0)
1845*5c90c05cSAndroid Build Coastguard Worker       << "Cannot generate a number in the range [0, 0).";
1846*5c90c05cSAndroid Build Coastguard Worker   GTEST_CHECK_(range <= kMaxRange)
1847*5c90c05cSAndroid Build Coastguard Worker       << "Generation of a number in [0, " << range << ") was requested, "
1848*5c90c05cSAndroid Build Coastguard Worker       << "but this can only generate numbers in [0, " << kMaxRange << ").";
1849*5c90c05cSAndroid Build Coastguard Worker 
1850*5c90c05cSAndroid Build Coastguard Worker   // Converting via modulus introduces a bit of downward bias, but
1851*5c90c05cSAndroid Build Coastguard Worker   // it's simple, and a linear congruential generator isn't too good
1852*5c90c05cSAndroid Build Coastguard Worker   // to begin with.
1853*5c90c05cSAndroid Build Coastguard Worker   return state_ % range;
1854*5c90c05cSAndroid Build Coastguard Worker }
1855*5c90c05cSAndroid Build Coastguard Worker 
1856*5c90c05cSAndroid Build Coastguard Worker // GTestIsInitialized() returns true if and only if the user has initialized
1857*5c90c05cSAndroid Build Coastguard Worker // Google Test.  Useful for catching the user mistake of not initializing
1858*5c90c05cSAndroid Build Coastguard Worker // Google Test before calling RUN_ALL_TESTS().
GTestIsInitialized()1859*5c90c05cSAndroid Build Coastguard Worker static bool GTestIsInitialized() { return GetArgvs().size() > 0; }
1860*5c90c05cSAndroid Build Coastguard Worker 
1861*5c90c05cSAndroid Build Coastguard Worker // Iterates over a vector of TestSuites, keeping a running sum of the
1862*5c90c05cSAndroid Build Coastguard Worker // results of calling a given int-returning method on each.
1863*5c90c05cSAndroid Build Coastguard Worker // Returns the sum.
SumOverTestSuiteList(const std::vector<TestSuite * > & case_list,int (TestSuite::* method)()const)1864*5c90c05cSAndroid Build Coastguard Worker static int SumOverTestSuiteList(const std::vector<TestSuite*>& case_list,
1865*5c90c05cSAndroid Build Coastguard Worker                                 int (TestSuite::*method)() const) {
1866*5c90c05cSAndroid Build Coastguard Worker   int sum = 0;
1867*5c90c05cSAndroid Build Coastguard Worker   for (size_t i = 0; i < case_list.size(); i++) {
1868*5c90c05cSAndroid Build Coastguard Worker     sum += (case_list[i]->*method)();
1869*5c90c05cSAndroid Build Coastguard Worker   }
1870*5c90c05cSAndroid Build Coastguard Worker   return sum;
1871*5c90c05cSAndroid Build Coastguard Worker }
1872*5c90c05cSAndroid Build Coastguard Worker 
1873*5c90c05cSAndroid Build Coastguard Worker // Returns true if and only if the test suite passed.
TestSuitePassed(const TestSuite * test_suite)1874*5c90c05cSAndroid Build Coastguard Worker static bool TestSuitePassed(const TestSuite* test_suite) {
1875*5c90c05cSAndroid Build Coastguard Worker   return test_suite->should_run() && test_suite->Passed();
1876*5c90c05cSAndroid Build Coastguard Worker }
1877*5c90c05cSAndroid Build Coastguard Worker 
1878*5c90c05cSAndroid Build Coastguard Worker // Returns true if and only if the test suite failed.
TestSuiteFailed(const TestSuite * test_suite)1879*5c90c05cSAndroid Build Coastguard Worker static bool TestSuiteFailed(const TestSuite* test_suite) {
1880*5c90c05cSAndroid Build Coastguard Worker   return test_suite->should_run() && test_suite->Failed();
1881*5c90c05cSAndroid Build Coastguard Worker }
1882*5c90c05cSAndroid Build Coastguard Worker 
1883*5c90c05cSAndroid Build Coastguard Worker // Returns true if and only if test_suite contains at least one test that
1884*5c90c05cSAndroid Build Coastguard Worker // should run.
ShouldRunTestSuite(const TestSuite * test_suite)1885*5c90c05cSAndroid Build Coastguard Worker static bool ShouldRunTestSuite(const TestSuite* test_suite) {
1886*5c90c05cSAndroid Build Coastguard Worker   return test_suite->should_run();
1887*5c90c05cSAndroid Build Coastguard Worker }
1888*5c90c05cSAndroid Build Coastguard Worker 
1889*5c90c05cSAndroid Build Coastguard Worker // AssertHelper constructor.
AssertHelper(TestPartResult::Type type,const char * file,int line,const char * message)1890*5c90c05cSAndroid Build Coastguard Worker AssertHelper::AssertHelper(TestPartResult::Type type,
1891*5c90c05cSAndroid Build Coastguard Worker                            const char* file,
1892*5c90c05cSAndroid Build Coastguard Worker                            int line,
1893*5c90c05cSAndroid Build Coastguard Worker                            const char* message)
1894*5c90c05cSAndroid Build Coastguard Worker     : data_(new AssertHelperData(type, file, line, message)) {
1895*5c90c05cSAndroid Build Coastguard Worker }
1896*5c90c05cSAndroid Build Coastguard Worker 
~AssertHelper()1897*5c90c05cSAndroid Build Coastguard Worker AssertHelper::~AssertHelper() {
1898*5c90c05cSAndroid Build Coastguard Worker   delete data_;
1899*5c90c05cSAndroid Build Coastguard Worker }
1900*5c90c05cSAndroid Build Coastguard Worker 
1901*5c90c05cSAndroid Build Coastguard Worker // Message assignment, for assertion streaming support.
operator =(const Message & message) const1902*5c90c05cSAndroid Build Coastguard Worker void AssertHelper::operator=(const Message& message) const {
1903*5c90c05cSAndroid Build Coastguard Worker   UnitTest::GetInstance()->
1904*5c90c05cSAndroid Build Coastguard Worker     AddTestPartResult(data_->type, data_->file, data_->line,
1905*5c90c05cSAndroid Build Coastguard Worker                       AppendUserMessage(data_->message, message),
1906*5c90c05cSAndroid Build Coastguard Worker                       UnitTest::GetInstance()->impl()
1907*5c90c05cSAndroid Build Coastguard Worker                       ->CurrentOsStackTraceExceptTop(1)
1908*5c90c05cSAndroid Build Coastguard Worker                       // Skips the stack frame for this function itself.
1909*5c90c05cSAndroid Build Coastguard Worker                       );  // NOLINT
1910*5c90c05cSAndroid Build Coastguard Worker }
1911*5c90c05cSAndroid Build Coastguard Worker 
1912*5c90c05cSAndroid Build Coastguard Worker namespace {
1913*5c90c05cSAndroid Build Coastguard Worker 
1914*5c90c05cSAndroid Build Coastguard Worker // When TEST_P is found without a matching INSTANTIATE_TEST_SUITE_P
1915*5c90c05cSAndroid Build Coastguard Worker // to creates test cases for it, a synthetic test case is
1916*5c90c05cSAndroid Build Coastguard Worker // inserted to report ether an error or a log message.
1917*5c90c05cSAndroid Build Coastguard Worker //
1918*5c90c05cSAndroid Build Coastguard Worker // This configuration bit will likely be removed at some point.
1919*5c90c05cSAndroid Build Coastguard Worker constexpr bool kErrorOnUninstantiatedParameterizedTest = true;
1920*5c90c05cSAndroid Build Coastguard Worker constexpr bool kErrorOnUninstantiatedTypeParameterizedTest = true;
1921*5c90c05cSAndroid Build Coastguard Worker 
1922*5c90c05cSAndroid Build Coastguard Worker // A test that fails at a given file/line location with a given message.
1923*5c90c05cSAndroid Build Coastguard Worker class FailureTest : public Test {
1924*5c90c05cSAndroid Build Coastguard Worker  public:
FailureTest(const CodeLocation & loc,std::string error_message,bool as_error)1925*5c90c05cSAndroid Build Coastguard Worker   explicit FailureTest(const CodeLocation& loc, std::string error_message,
1926*5c90c05cSAndroid Build Coastguard Worker                        bool as_error)
1927*5c90c05cSAndroid Build Coastguard Worker       : loc_(loc),
1928*5c90c05cSAndroid Build Coastguard Worker         error_message_(std::move(error_message)),
1929*5c90c05cSAndroid Build Coastguard Worker         as_error_(as_error) {}
1930*5c90c05cSAndroid Build Coastguard Worker 
TestBody()1931*5c90c05cSAndroid Build Coastguard Worker   void TestBody() override {
1932*5c90c05cSAndroid Build Coastguard Worker     if (as_error_) {
1933*5c90c05cSAndroid Build Coastguard Worker       AssertHelper(TestPartResult::kNonFatalFailure, loc_.file.c_str(),
1934*5c90c05cSAndroid Build Coastguard Worker                    loc_.line, "") = Message() << error_message_;
1935*5c90c05cSAndroid Build Coastguard Worker     } else {
1936*5c90c05cSAndroid Build Coastguard Worker       std::cout << error_message_ << std::endl;
1937*5c90c05cSAndroid Build Coastguard Worker     }
1938*5c90c05cSAndroid Build Coastguard Worker   }
1939*5c90c05cSAndroid Build Coastguard Worker 
1940*5c90c05cSAndroid Build Coastguard Worker  private:
1941*5c90c05cSAndroid Build Coastguard Worker   const CodeLocation loc_;
1942*5c90c05cSAndroid Build Coastguard Worker   const std::string error_message_;
1943*5c90c05cSAndroid Build Coastguard Worker   const bool as_error_;
1944*5c90c05cSAndroid Build Coastguard Worker };
1945*5c90c05cSAndroid Build Coastguard Worker 
1946*5c90c05cSAndroid Build Coastguard Worker 
1947*5c90c05cSAndroid Build Coastguard Worker }  // namespace
1948*5c90c05cSAndroid Build Coastguard Worker 
GetIgnoredParameterizedTestSuites()1949*5c90c05cSAndroid Build Coastguard Worker std::set<std::string>* GetIgnoredParameterizedTestSuites() {
1950*5c90c05cSAndroid Build Coastguard Worker   return UnitTest::GetInstance()->impl()->ignored_parameterized_test_suites();
1951*5c90c05cSAndroid Build Coastguard Worker }
1952*5c90c05cSAndroid Build Coastguard Worker 
1953*5c90c05cSAndroid Build Coastguard Worker // Add a given test_suit to the list of them allow to go un-instantiated.
MarkAsIgnored(const char * test_suite)1954*5c90c05cSAndroid Build Coastguard Worker MarkAsIgnored::MarkAsIgnored(const char* test_suite) {
1955*5c90c05cSAndroid Build Coastguard Worker   GetIgnoredParameterizedTestSuites()->insert(test_suite);
1956*5c90c05cSAndroid Build Coastguard Worker }
1957*5c90c05cSAndroid Build Coastguard Worker 
1958*5c90c05cSAndroid Build Coastguard Worker // If this parameterized test suite has no instantiations (and that
1959*5c90c05cSAndroid Build Coastguard Worker // has not been marked as okay), emit a test case reporting that.
InsertSyntheticTestCase(const std::string & name,CodeLocation location,bool has_test_p)1960*5c90c05cSAndroid Build Coastguard Worker void InsertSyntheticTestCase(const std::string& name, CodeLocation location,
1961*5c90c05cSAndroid Build Coastguard Worker                              bool has_test_p) {
1962*5c90c05cSAndroid Build Coastguard Worker   const auto& ignored = *GetIgnoredParameterizedTestSuites();
1963*5c90c05cSAndroid Build Coastguard Worker   if (ignored.find(name) != ignored.end()) return;
1964*5c90c05cSAndroid Build Coastguard Worker 
1965*5c90c05cSAndroid Build Coastguard Worker   const char kMissingInstantiation[] =  //
1966*5c90c05cSAndroid Build Coastguard Worker       " is defined via TEST_P, but never instantiated. None of the test cases "
1967*5c90c05cSAndroid Build Coastguard Worker       "will run. Either no INSTANTIATE_TEST_SUITE_P is provided or the only "
1968*5c90c05cSAndroid Build Coastguard Worker       "ones provided expand to nothing."
1969*5c90c05cSAndroid Build Coastguard Worker       "\n\n"
1970*5c90c05cSAndroid Build Coastguard Worker       "Ideally, TEST_P definitions should only ever be included as part of "
1971*5c90c05cSAndroid Build Coastguard Worker       "binaries that intend to use them. (As opposed to, for example, being "
1972*5c90c05cSAndroid Build Coastguard Worker       "placed in a library that may be linked in to get other utilities.)";
1973*5c90c05cSAndroid Build Coastguard Worker 
1974*5c90c05cSAndroid Build Coastguard Worker   const char kMissingTestCase[] =  //
1975*5c90c05cSAndroid Build Coastguard Worker       " is instantiated via INSTANTIATE_TEST_SUITE_P, but no tests are "
1976*5c90c05cSAndroid Build Coastguard Worker       "defined via TEST_P . No test cases will run."
1977*5c90c05cSAndroid Build Coastguard Worker       "\n\n"
1978*5c90c05cSAndroid Build Coastguard Worker       "Ideally, INSTANTIATE_TEST_SUITE_P should only ever be invoked from "
1979*5c90c05cSAndroid Build Coastguard Worker       "code that always depend on code that provides TEST_P. Failing to do "
1980*5c90c05cSAndroid Build Coastguard Worker       "so is often an indication of dead code, e.g. the last TEST_P was "
1981*5c90c05cSAndroid Build Coastguard Worker       "removed but the rest got left behind.";
1982*5c90c05cSAndroid Build Coastguard Worker 
1983*5c90c05cSAndroid Build Coastguard Worker   std::string message =
1984*5c90c05cSAndroid Build Coastguard Worker       "Parameterized test suite " + name +
1985*5c90c05cSAndroid Build Coastguard Worker       (has_test_p ? kMissingInstantiation : kMissingTestCase) +
1986*5c90c05cSAndroid Build Coastguard Worker       "\n\n"
1987*5c90c05cSAndroid Build Coastguard Worker       "To suppress this error for this test suite, insert the following line "
1988*5c90c05cSAndroid Build Coastguard Worker       "(in a non-header) in the namespace it is defined in:"
1989*5c90c05cSAndroid Build Coastguard Worker       "\n\n"
1990*5c90c05cSAndroid Build Coastguard Worker       "GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(" + name + ");";
1991*5c90c05cSAndroid Build Coastguard Worker 
1992*5c90c05cSAndroid Build Coastguard Worker   std::string full_name = "UninstantiatedParameterizedTestSuite<" + name + ">";
1993*5c90c05cSAndroid Build Coastguard Worker   RegisterTest(  //
1994*5c90c05cSAndroid Build Coastguard Worker       "GoogleTestVerification", full_name.c_str(),
1995*5c90c05cSAndroid Build Coastguard Worker       nullptr,  // No type parameter.
1996*5c90c05cSAndroid Build Coastguard Worker       nullptr,  // No value parameter.
1997*5c90c05cSAndroid Build Coastguard Worker       location.file.c_str(), location.line, [message, location] {
1998*5c90c05cSAndroid Build Coastguard Worker         return new FailureTest(location, message,
1999*5c90c05cSAndroid Build Coastguard Worker                                kErrorOnUninstantiatedParameterizedTest);
2000*5c90c05cSAndroid Build Coastguard Worker       });
2001*5c90c05cSAndroid Build Coastguard Worker }
2002*5c90c05cSAndroid Build Coastguard Worker 
RegisterTypeParameterizedTestSuite(const char * test_suite_name,CodeLocation code_location)2003*5c90c05cSAndroid Build Coastguard Worker void RegisterTypeParameterizedTestSuite(const char* test_suite_name,
2004*5c90c05cSAndroid Build Coastguard Worker                                         CodeLocation code_location) {
2005*5c90c05cSAndroid Build Coastguard Worker   GetUnitTestImpl()->type_parameterized_test_registry().RegisterTestSuite(
2006*5c90c05cSAndroid Build Coastguard Worker       test_suite_name, code_location);
2007*5c90c05cSAndroid Build Coastguard Worker }
2008*5c90c05cSAndroid Build Coastguard Worker 
RegisterTypeParameterizedTestSuiteInstantiation(const char * case_name)2009*5c90c05cSAndroid Build Coastguard Worker void RegisterTypeParameterizedTestSuiteInstantiation(const char* case_name) {
2010*5c90c05cSAndroid Build Coastguard Worker   GetUnitTestImpl()
2011*5c90c05cSAndroid Build Coastguard Worker       ->type_parameterized_test_registry()
2012*5c90c05cSAndroid Build Coastguard Worker       .RegisterInstantiation(case_name);
2013*5c90c05cSAndroid Build Coastguard Worker }
2014*5c90c05cSAndroid Build Coastguard Worker 
RegisterTestSuite(const char * test_suite_name,CodeLocation code_location)2015*5c90c05cSAndroid Build Coastguard Worker void TypeParameterizedTestSuiteRegistry::RegisterTestSuite(
2016*5c90c05cSAndroid Build Coastguard Worker     const char* test_suite_name, CodeLocation code_location) {
2017*5c90c05cSAndroid Build Coastguard Worker   suites_.emplace(std::string(test_suite_name),
2018*5c90c05cSAndroid Build Coastguard Worker                  TypeParameterizedTestSuiteInfo(code_location));
2019*5c90c05cSAndroid Build Coastguard Worker }
2020*5c90c05cSAndroid Build Coastguard Worker 
RegisterInstantiation(const char * test_suite_name)2021*5c90c05cSAndroid Build Coastguard Worker void TypeParameterizedTestSuiteRegistry::RegisterInstantiation(
2022*5c90c05cSAndroid Build Coastguard Worker         const char* test_suite_name) {
2023*5c90c05cSAndroid Build Coastguard Worker   auto it = suites_.find(std::string(test_suite_name));
2024*5c90c05cSAndroid Build Coastguard Worker   if (it != suites_.end()) {
2025*5c90c05cSAndroid Build Coastguard Worker     it->second.instantiated = true;
2026*5c90c05cSAndroid Build Coastguard Worker   } else {
2027*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOG_(ERROR) << "Unknown type parameterized test suit '"
2028*5c90c05cSAndroid Build Coastguard Worker                       << test_suite_name << "'";
2029*5c90c05cSAndroid Build Coastguard Worker   }
2030*5c90c05cSAndroid Build Coastguard Worker }
2031*5c90c05cSAndroid Build Coastguard Worker 
CheckForInstantiations()2032*5c90c05cSAndroid Build Coastguard Worker void TypeParameterizedTestSuiteRegistry::CheckForInstantiations() {
2033*5c90c05cSAndroid Build Coastguard Worker   const auto& ignored = *GetIgnoredParameterizedTestSuites();
2034*5c90c05cSAndroid Build Coastguard Worker   for (const auto& testcase : suites_) {
2035*5c90c05cSAndroid Build Coastguard Worker     if (testcase.second.instantiated) continue;
2036*5c90c05cSAndroid Build Coastguard Worker     if (ignored.find(testcase.first) != ignored.end()) continue;
2037*5c90c05cSAndroid Build Coastguard Worker 
2038*5c90c05cSAndroid Build Coastguard Worker     std::string message =
2039*5c90c05cSAndroid Build Coastguard Worker         "Type parameterized test suite " + testcase.first +
2040*5c90c05cSAndroid Build Coastguard Worker         " is defined via REGISTER_TYPED_TEST_SUITE_P, but never instantiated "
2041*5c90c05cSAndroid Build Coastguard Worker         "via INSTANTIATE_TYPED_TEST_SUITE_P. None of the test cases will run."
2042*5c90c05cSAndroid Build Coastguard Worker         "\n\n"
2043*5c90c05cSAndroid Build Coastguard Worker         "Ideally, TYPED_TEST_P definitions should only ever be included as "
2044*5c90c05cSAndroid Build Coastguard Worker         "part of binaries that intend to use them. (As opposed to, for "
2045*5c90c05cSAndroid Build Coastguard Worker         "example, being placed in a library that may be linked in to get other "
2046*5c90c05cSAndroid Build Coastguard Worker         "utilities.)"
2047*5c90c05cSAndroid Build Coastguard Worker         "\n\n"
2048*5c90c05cSAndroid Build Coastguard Worker         "To suppress this error for this test suite, insert the following line "
2049*5c90c05cSAndroid Build Coastguard Worker         "(in a non-header) in the namespace it is defined in:"
2050*5c90c05cSAndroid Build Coastguard Worker         "\n\n"
2051*5c90c05cSAndroid Build Coastguard Worker         "GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(" +
2052*5c90c05cSAndroid Build Coastguard Worker         testcase.first + ");";
2053*5c90c05cSAndroid Build Coastguard Worker 
2054*5c90c05cSAndroid Build Coastguard Worker     std::string full_name =
2055*5c90c05cSAndroid Build Coastguard Worker         "UninstantiatedTypeParameterizedTestSuite<" + testcase.first + ">";
2056*5c90c05cSAndroid Build Coastguard Worker     RegisterTest(  //
2057*5c90c05cSAndroid Build Coastguard Worker         "GoogleTestVerification", full_name.c_str(),
2058*5c90c05cSAndroid Build Coastguard Worker         nullptr,  // No type parameter.
2059*5c90c05cSAndroid Build Coastguard Worker         nullptr,  // No value parameter.
2060*5c90c05cSAndroid Build Coastguard Worker         testcase.second.code_location.file.c_str(),
2061*5c90c05cSAndroid Build Coastguard Worker         testcase.second.code_location.line, [message, testcase] {
2062*5c90c05cSAndroid Build Coastguard Worker           return new FailureTest(testcase.second.code_location, message,
2063*5c90c05cSAndroid Build Coastguard Worker                                  kErrorOnUninstantiatedTypeParameterizedTest);
2064*5c90c05cSAndroid Build Coastguard Worker         });
2065*5c90c05cSAndroid Build Coastguard Worker   }
2066*5c90c05cSAndroid Build Coastguard Worker }
2067*5c90c05cSAndroid Build Coastguard Worker 
2068*5c90c05cSAndroid Build Coastguard Worker // A copy of all command line arguments.  Set by InitGoogleTest().
2069*5c90c05cSAndroid Build Coastguard Worker static ::std::vector<std::string> g_argvs;
2070*5c90c05cSAndroid Build Coastguard Worker 
GetArgvs()2071*5c90c05cSAndroid Build Coastguard Worker ::std::vector<std::string> GetArgvs() {
2072*5c90c05cSAndroid Build Coastguard Worker #if defined(GTEST_CUSTOM_GET_ARGVS_)
2073*5c90c05cSAndroid Build Coastguard Worker   // GTEST_CUSTOM_GET_ARGVS_() may return a container of std::string or
2074*5c90c05cSAndroid Build Coastguard Worker   // ::string. This code converts it to the appropriate type.
2075*5c90c05cSAndroid Build Coastguard Worker   const auto& custom = GTEST_CUSTOM_GET_ARGVS_();
2076*5c90c05cSAndroid Build Coastguard Worker   return ::std::vector<std::string>(custom.begin(), custom.end());
2077*5c90c05cSAndroid Build Coastguard Worker #else   // defined(GTEST_CUSTOM_GET_ARGVS_)
2078*5c90c05cSAndroid Build Coastguard Worker   return g_argvs;
2079*5c90c05cSAndroid Build Coastguard Worker #endif  // defined(GTEST_CUSTOM_GET_ARGVS_)
2080*5c90c05cSAndroid Build Coastguard Worker }
2081*5c90c05cSAndroid Build Coastguard Worker 
2082*5c90c05cSAndroid Build Coastguard Worker // Returns the current application's name, removing directory path if that
2083*5c90c05cSAndroid Build Coastguard Worker // is present.
GetCurrentExecutableName()2084*5c90c05cSAndroid Build Coastguard Worker FilePath GetCurrentExecutableName() {
2085*5c90c05cSAndroid Build Coastguard Worker   FilePath result;
2086*5c90c05cSAndroid Build Coastguard Worker 
2087*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_WINDOWS || GTEST_OS_OS2
2088*5c90c05cSAndroid Build Coastguard Worker   result.Set(FilePath(GetArgvs()[0]).RemoveExtension("exe"));
2089*5c90c05cSAndroid Build Coastguard Worker #else
2090*5c90c05cSAndroid Build Coastguard Worker   result.Set(FilePath(GetArgvs()[0]));
2091*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_OS_WINDOWS
2092*5c90c05cSAndroid Build Coastguard Worker 
2093*5c90c05cSAndroid Build Coastguard Worker   return result.RemoveDirectoryName();
2094*5c90c05cSAndroid Build Coastguard Worker }
2095*5c90c05cSAndroid Build Coastguard Worker 
2096*5c90c05cSAndroid Build Coastguard Worker // Functions for processing the gtest_output flag.
2097*5c90c05cSAndroid Build Coastguard Worker 
2098*5c90c05cSAndroid Build Coastguard Worker // Returns the output format, or "" for normal printed output.
GetOutputFormat()2099*5c90c05cSAndroid Build Coastguard Worker std::string UnitTestOptions::GetOutputFormat() {
2100*5c90c05cSAndroid Build Coastguard Worker   const char* const gtest_output_flag = GTEST_FLAG(output).c_str();
2101*5c90c05cSAndroid Build Coastguard Worker   const char* const colon = strchr(gtest_output_flag, ':');
2102*5c90c05cSAndroid Build Coastguard Worker   return (colon == nullptr)
2103*5c90c05cSAndroid Build Coastguard Worker              ? std::string(gtest_output_flag)
2104*5c90c05cSAndroid Build Coastguard Worker              : std::string(gtest_output_flag,
2105*5c90c05cSAndroid Build Coastguard Worker                            static_cast<size_t>(colon - gtest_output_flag));
2106*5c90c05cSAndroid Build Coastguard Worker }
2107*5c90c05cSAndroid Build Coastguard Worker 
2108*5c90c05cSAndroid Build Coastguard Worker // Returns the name of the requested output file, or the default if none
2109*5c90c05cSAndroid Build Coastguard Worker // was explicitly specified.
GetAbsolutePathToOutputFile()2110*5c90c05cSAndroid Build Coastguard Worker std::string UnitTestOptions::GetAbsolutePathToOutputFile() {
2111*5c90c05cSAndroid Build Coastguard Worker   const char* const gtest_output_flag = GTEST_FLAG(output).c_str();
2112*5c90c05cSAndroid Build Coastguard Worker 
2113*5c90c05cSAndroid Build Coastguard Worker   std::string format = GetOutputFormat();
2114*5c90c05cSAndroid Build Coastguard Worker   if (format.empty())
2115*5c90c05cSAndroid Build Coastguard Worker     format = std::string(kDefaultOutputFormat);
2116*5c90c05cSAndroid Build Coastguard Worker 
2117*5c90c05cSAndroid Build Coastguard Worker   const char* const colon = strchr(gtest_output_flag, ':');
2118*5c90c05cSAndroid Build Coastguard Worker   if (colon == nullptr)
2119*5c90c05cSAndroid Build Coastguard Worker     return internal::FilePath::MakeFileName(
2120*5c90c05cSAndroid Build Coastguard Worker         internal::FilePath(
2121*5c90c05cSAndroid Build Coastguard Worker             UnitTest::GetInstance()->original_working_dir()),
2122*5c90c05cSAndroid Build Coastguard Worker         internal::FilePath(kDefaultOutputFile), 0,
2123*5c90c05cSAndroid Build Coastguard Worker         format.c_str()).string();
2124*5c90c05cSAndroid Build Coastguard Worker 
2125*5c90c05cSAndroid Build Coastguard Worker   internal::FilePath output_name(colon + 1);
2126*5c90c05cSAndroid Build Coastguard Worker   if (!output_name.IsAbsolutePath())
2127*5c90c05cSAndroid Build Coastguard Worker     output_name = internal::FilePath::ConcatPaths(
2128*5c90c05cSAndroid Build Coastguard Worker         internal::FilePath(UnitTest::GetInstance()->original_working_dir()),
2129*5c90c05cSAndroid Build Coastguard Worker         internal::FilePath(colon + 1));
2130*5c90c05cSAndroid Build Coastguard Worker 
2131*5c90c05cSAndroid Build Coastguard Worker   if (!output_name.IsDirectory())
2132*5c90c05cSAndroid Build Coastguard Worker     return output_name.string();
2133*5c90c05cSAndroid Build Coastguard Worker 
2134*5c90c05cSAndroid Build Coastguard Worker   internal::FilePath result(internal::FilePath::GenerateUniqueFileName(
2135*5c90c05cSAndroid Build Coastguard Worker       output_name, internal::GetCurrentExecutableName(),
2136*5c90c05cSAndroid Build Coastguard Worker       GetOutputFormat().c_str()));
2137*5c90c05cSAndroid Build Coastguard Worker   return result.string();
2138*5c90c05cSAndroid Build Coastguard Worker }
2139*5c90c05cSAndroid Build Coastguard Worker 
2140*5c90c05cSAndroid Build Coastguard Worker // Returns true if and only if the wildcard pattern matches the string. Each
2141*5c90c05cSAndroid Build Coastguard Worker // pattern consists of regular characters, single-character wildcards (?), and
2142*5c90c05cSAndroid Build Coastguard Worker // multi-character wildcards (*).
2143*5c90c05cSAndroid Build Coastguard Worker //
2144*5c90c05cSAndroid Build Coastguard Worker // This function implements a linear-time string globbing algorithm based on
2145*5c90c05cSAndroid Build Coastguard Worker // https://research.swtch.com/glob.
PatternMatchesString(const std::string & name_str,const char * pattern,const char * pattern_end)2146*5c90c05cSAndroid Build Coastguard Worker static bool PatternMatchesString(const std::string& name_str,
2147*5c90c05cSAndroid Build Coastguard Worker                                  const char* pattern, const char* pattern_end) {
2148*5c90c05cSAndroid Build Coastguard Worker   const char* name = name_str.c_str();
2149*5c90c05cSAndroid Build Coastguard Worker   const char* const name_begin = name;
2150*5c90c05cSAndroid Build Coastguard Worker   const char* const name_end = name + name_str.size();
2151*5c90c05cSAndroid Build Coastguard Worker 
2152*5c90c05cSAndroid Build Coastguard Worker   const char* pattern_next = pattern;
2153*5c90c05cSAndroid Build Coastguard Worker   const char* name_next = name;
2154*5c90c05cSAndroid Build Coastguard Worker 
2155*5c90c05cSAndroid Build Coastguard Worker   while (pattern < pattern_end || name < name_end) {
2156*5c90c05cSAndroid Build Coastguard Worker     if (pattern < pattern_end) {
2157*5c90c05cSAndroid Build Coastguard Worker       switch (*pattern) {
2158*5c90c05cSAndroid Build Coastguard Worker         default:  // Match an ordinary character.
2159*5c90c05cSAndroid Build Coastguard Worker           if (name < name_end && *name == *pattern) {
2160*5c90c05cSAndroid Build Coastguard Worker             ++pattern;
2161*5c90c05cSAndroid Build Coastguard Worker             ++name;
2162*5c90c05cSAndroid Build Coastguard Worker             continue;
2163*5c90c05cSAndroid Build Coastguard Worker           }
2164*5c90c05cSAndroid Build Coastguard Worker           break;
2165*5c90c05cSAndroid Build Coastguard Worker         case '?':  // Match any single character.
2166*5c90c05cSAndroid Build Coastguard Worker           if (name < name_end) {
2167*5c90c05cSAndroid Build Coastguard Worker             ++pattern;
2168*5c90c05cSAndroid Build Coastguard Worker             ++name;
2169*5c90c05cSAndroid Build Coastguard Worker             continue;
2170*5c90c05cSAndroid Build Coastguard Worker           }
2171*5c90c05cSAndroid Build Coastguard Worker           break;
2172*5c90c05cSAndroid Build Coastguard Worker         case '*':
2173*5c90c05cSAndroid Build Coastguard Worker           // Match zero or more characters. Start by skipping over the wildcard
2174*5c90c05cSAndroid Build Coastguard Worker           // and matching zero characters from name. If that fails, restart and
2175*5c90c05cSAndroid Build Coastguard Worker           // match one more character than the last attempt.
2176*5c90c05cSAndroid Build Coastguard Worker           pattern_next = pattern;
2177*5c90c05cSAndroid Build Coastguard Worker           name_next = name + 1;
2178*5c90c05cSAndroid Build Coastguard Worker           ++pattern;
2179*5c90c05cSAndroid Build Coastguard Worker           continue;
2180*5c90c05cSAndroid Build Coastguard Worker       }
2181*5c90c05cSAndroid Build Coastguard Worker     }
2182*5c90c05cSAndroid Build Coastguard Worker     // Failed to match a character. Restart if possible.
2183*5c90c05cSAndroid Build Coastguard Worker     if (name_begin < name_next && name_next <= name_end) {
2184*5c90c05cSAndroid Build Coastguard Worker       pattern = pattern_next;
2185*5c90c05cSAndroid Build Coastguard Worker       name = name_next;
2186*5c90c05cSAndroid Build Coastguard Worker       continue;
2187*5c90c05cSAndroid Build Coastguard Worker     }
2188*5c90c05cSAndroid Build Coastguard Worker     return false;
2189*5c90c05cSAndroid Build Coastguard Worker   }
2190*5c90c05cSAndroid Build Coastguard Worker   return true;
2191*5c90c05cSAndroid Build Coastguard Worker }
2192*5c90c05cSAndroid Build Coastguard Worker 
MatchesFilter(const std::string & name_str,const char * filter)2193*5c90c05cSAndroid Build Coastguard Worker bool UnitTestOptions::MatchesFilter(const std::string& name_str,
2194*5c90c05cSAndroid Build Coastguard Worker                                     const char* filter) {
2195*5c90c05cSAndroid Build Coastguard Worker   // The filter is a list of patterns separated by colons (:).
2196*5c90c05cSAndroid Build Coastguard Worker   const char* pattern = filter;
2197*5c90c05cSAndroid Build Coastguard Worker   while (true) {
2198*5c90c05cSAndroid Build Coastguard Worker     // Find the bounds of this pattern.
2199*5c90c05cSAndroid Build Coastguard Worker     const char* const next_sep = strchr(pattern, ':');
2200*5c90c05cSAndroid Build Coastguard Worker     const char* const pattern_end =
2201*5c90c05cSAndroid Build Coastguard Worker         next_sep != nullptr ? next_sep : pattern + strlen(pattern);
2202*5c90c05cSAndroid Build Coastguard Worker 
2203*5c90c05cSAndroid Build Coastguard Worker     // Check if this pattern matches name_str.
2204*5c90c05cSAndroid Build Coastguard Worker     if (PatternMatchesString(name_str, pattern, pattern_end)) {
2205*5c90c05cSAndroid Build Coastguard Worker       break;
2206*5c90c05cSAndroid Build Coastguard Worker     }
2207*5c90c05cSAndroid Build Coastguard Worker 
2208*5c90c05cSAndroid Build Coastguard Worker     // Give up on this pattern. However, if we found a pattern separator (:),
2209*5c90c05cSAndroid Build Coastguard Worker     // advance to the next pattern (skipping over the separator) and restart.
2210*5c90c05cSAndroid Build Coastguard Worker     if (next_sep == nullptr) {
2211*5c90c05cSAndroid Build Coastguard Worker       return false;
2212*5c90c05cSAndroid Build Coastguard Worker     }
2213*5c90c05cSAndroid Build Coastguard Worker     pattern = next_sep + 1;
2214*5c90c05cSAndroid Build Coastguard Worker   }
2215*5c90c05cSAndroid Build Coastguard Worker   return true;
2216*5c90c05cSAndroid Build Coastguard Worker }
2217*5c90c05cSAndroid Build Coastguard Worker 
2218*5c90c05cSAndroid Build Coastguard Worker // Returns true if and only if the user-specified filter matches the test
2219*5c90c05cSAndroid Build Coastguard Worker // suite name and the test name.
FilterMatchesTest(const std::string & test_suite_name,const std::string & test_name)2220*5c90c05cSAndroid Build Coastguard Worker bool UnitTestOptions::FilterMatchesTest(const std::string& test_suite_name,
2221*5c90c05cSAndroid Build Coastguard Worker                                         const std::string& test_name) {
2222*5c90c05cSAndroid Build Coastguard Worker   const std::string& full_name = test_suite_name + "." + test_name.c_str();
2223*5c90c05cSAndroid Build Coastguard Worker 
2224*5c90c05cSAndroid Build Coastguard Worker   // Split --gtest_filter at '-', if there is one, to separate into
2225*5c90c05cSAndroid Build Coastguard Worker   // positive filter and negative filter portions
2226*5c90c05cSAndroid Build Coastguard Worker   const char* const p = GTEST_FLAG(filter).c_str();
2227*5c90c05cSAndroid Build Coastguard Worker   const char* const dash = strchr(p, '-');
2228*5c90c05cSAndroid Build Coastguard Worker   std::string positive;
2229*5c90c05cSAndroid Build Coastguard Worker   std::string negative;
2230*5c90c05cSAndroid Build Coastguard Worker   if (dash == nullptr) {
2231*5c90c05cSAndroid Build Coastguard Worker     positive = GTEST_FLAG(filter).c_str();  // Whole string is a positive filter
2232*5c90c05cSAndroid Build Coastguard Worker     negative = "";
2233*5c90c05cSAndroid Build Coastguard Worker   } else {
2234*5c90c05cSAndroid Build Coastguard Worker     positive = std::string(p, dash);   // Everything up to the dash
2235*5c90c05cSAndroid Build Coastguard Worker     negative = std::string(dash + 1);  // Everything after the dash
2236*5c90c05cSAndroid Build Coastguard Worker     if (positive.empty()) {
2237*5c90c05cSAndroid Build Coastguard Worker       // Treat '-test1' as the same as '*-test1'
2238*5c90c05cSAndroid Build Coastguard Worker       positive = kUniversalFilter;
2239*5c90c05cSAndroid Build Coastguard Worker     }
2240*5c90c05cSAndroid Build Coastguard Worker   }
2241*5c90c05cSAndroid Build Coastguard Worker 
2242*5c90c05cSAndroid Build Coastguard Worker   // A filter is a colon-separated list of patterns.  It matches a
2243*5c90c05cSAndroid Build Coastguard Worker   // test if any pattern in it matches the test.
2244*5c90c05cSAndroid Build Coastguard Worker   return (MatchesFilter(full_name, positive.c_str()) &&
2245*5c90c05cSAndroid Build Coastguard Worker           !MatchesFilter(full_name, negative.c_str()));
2246*5c90c05cSAndroid Build Coastguard Worker }
2247*5c90c05cSAndroid Build Coastguard Worker 
2248*5c90c05cSAndroid Build Coastguard Worker #if GTEST_HAS_SEH
2249*5c90c05cSAndroid Build Coastguard Worker // Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
2250*5c90c05cSAndroid Build Coastguard Worker // given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.
2251*5c90c05cSAndroid Build Coastguard Worker // This function is useful as an __except condition.
GTestShouldProcessSEH(DWORD exception_code)2252*5c90c05cSAndroid Build Coastguard Worker int UnitTestOptions::GTestShouldProcessSEH(DWORD exception_code) {
2253*5c90c05cSAndroid Build Coastguard Worker   // Google Test should handle a SEH exception if:
2254*5c90c05cSAndroid Build Coastguard Worker   //   1. the user wants it to, AND
2255*5c90c05cSAndroid Build Coastguard Worker   //   2. this is not a breakpoint exception, AND
2256*5c90c05cSAndroid Build Coastguard Worker   //   3. this is not a C++ exception (VC++ implements them via SEH,
2257*5c90c05cSAndroid Build Coastguard Worker   //      apparently).
2258*5c90c05cSAndroid Build Coastguard Worker   //
2259*5c90c05cSAndroid Build Coastguard Worker   // SEH exception code for C++ exceptions.
2260*5c90c05cSAndroid Build Coastguard Worker   // (see http://support.microsoft.com/kb/185294 for more information).
2261*5c90c05cSAndroid Build Coastguard Worker   const DWORD kCxxExceptionCode = 0xe06d7363;
2262*5c90c05cSAndroid Build Coastguard Worker 
2263*5c90c05cSAndroid Build Coastguard Worker   bool should_handle = true;
2264*5c90c05cSAndroid Build Coastguard Worker 
2265*5c90c05cSAndroid Build Coastguard Worker   if (!GTEST_FLAG(catch_exceptions))
2266*5c90c05cSAndroid Build Coastguard Worker     should_handle = false;
2267*5c90c05cSAndroid Build Coastguard Worker   else if (exception_code == EXCEPTION_BREAKPOINT)
2268*5c90c05cSAndroid Build Coastguard Worker     should_handle = false;
2269*5c90c05cSAndroid Build Coastguard Worker   else if (exception_code == kCxxExceptionCode)
2270*5c90c05cSAndroid Build Coastguard Worker     should_handle = false;
2271*5c90c05cSAndroid Build Coastguard Worker 
2272*5c90c05cSAndroid Build Coastguard Worker   return should_handle ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH;
2273*5c90c05cSAndroid Build Coastguard Worker }
2274*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_HAS_SEH
2275*5c90c05cSAndroid Build Coastguard Worker 
2276*5c90c05cSAndroid Build Coastguard Worker }  // namespace internal
2277*5c90c05cSAndroid Build Coastguard Worker 
2278*5c90c05cSAndroid Build Coastguard Worker // The c'tor sets this object as the test part result reporter used by
2279*5c90c05cSAndroid Build Coastguard Worker // Google Test.  The 'result' parameter specifies where to report the
2280*5c90c05cSAndroid Build Coastguard Worker // results. Intercepts only failures from the current thread.
ScopedFakeTestPartResultReporter(TestPartResultArray * result)2281*5c90c05cSAndroid Build Coastguard Worker ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(
2282*5c90c05cSAndroid Build Coastguard Worker     TestPartResultArray* result)
2283*5c90c05cSAndroid Build Coastguard Worker     : intercept_mode_(INTERCEPT_ONLY_CURRENT_THREAD),
2284*5c90c05cSAndroid Build Coastguard Worker       result_(result) {
2285*5c90c05cSAndroid Build Coastguard Worker   Init();
2286*5c90c05cSAndroid Build Coastguard Worker }
2287*5c90c05cSAndroid Build Coastguard Worker 
2288*5c90c05cSAndroid Build Coastguard Worker // The c'tor sets this object as the test part result reporter used by
2289*5c90c05cSAndroid Build Coastguard Worker // Google Test.  The 'result' parameter specifies where to report the
2290*5c90c05cSAndroid Build Coastguard Worker // results.
ScopedFakeTestPartResultReporter(InterceptMode intercept_mode,TestPartResultArray * result)2291*5c90c05cSAndroid Build Coastguard Worker ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(
2292*5c90c05cSAndroid Build Coastguard Worker     InterceptMode intercept_mode, TestPartResultArray* result)
2293*5c90c05cSAndroid Build Coastguard Worker     : intercept_mode_(intercept_mode),
2294*5c90c05cSAndroid Build Coastguard Worker       result_(result) {
2295*5c90c05cSAndroid Build Coastguard Worker   Init();
2296*5c90c05cSAndroid Build Coastguard Worker }
2297*5c90c05cSAndroid Build Coastguard Worker 
Init()2298*5c90c05cSAndroid Build Coastguard Worker void ScopedFakeTestPartResultReporter::Init() {
2299*5c90c05cSAndroid Build Coastguard Worker   internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
2300*5c90c05cSAndroid Build Coastguard Worker   if (intercept_mode_ == INTERCEPT_ALL_THREADS) {
2301*5c90c05cSAndroid Build Coastguard Worker     old_reporter_ = impl->GetGlobalTestPartResultReporter();
2302*5c90c05cSAndroid Build Coastguard Worker     impl->SetGlobalTestPartResultReporter(this);
2303*5c90c05cSAndroid Build Coastguard Worker   } else {
2304*5c90c05cSAndroid Build Coastguard Worker     old_reporter_ = impl->GetTestPartResultReporterForCurrentThread();
2305*5c90c05cSAndroid Build Coastguard Worker     impl->SetTestPartResultReporterForCurrentThread(this);
2306*5c90c05cSAndroid Build Coastguard Worker   }
2307*5c90c05cSAndroid Build Coastguard Worker }
2308*5c90c05cSAndroid Build Coastguard Worker 
2309*5c90c05cSAndroid Build Coastguard Worker // The d'tor restores the test part result reporter used by Google Test
2310*5c90c05cSAndroid Build Coastguard Worker // before.
~ScopedFakeTestPartResultReporter()2311*5c90c05cSAndroid Build Coastguard Worker ScopedFakeTestPartResultReporter::~ScopedFakeTestPartResultReporter() {
2312*5c90c05cSAndroid Build Coastguard Worker   internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
2313*5c90c05cSAndroid Build Coastguard Worker   if (intercept_mode_ == INTERCEPT_ALL_THREADS) {
2314*5c90c05cSAndroid Build Coastguard Worker     impl->SetGlobalTestPartResultReporter(old_reporter_);
2315*5c90c05cSAndroid Build Coastguard Worker   } else {
2316*5c90c05cSAndroid Build Coastguard Worker     impl->SetTestPartResultReporterForCurrentThread(old_reporter_);
2317*5c90c05cSAndroid Build Coastguard Worker   }
2318*5c90c05cSAndroid Build Coastguard Worker }
2319*5c90c05cSAndroid Build Coastguard Worker 
2320*5c90c05cSAndroid Build Coastguard Worker // Increments the test part result count and remembers the result.
2321*5c90c05cSAndroid Build Coastguard Worker // This method is from the TestPartResultReporterInterface interface.
ReportTestPartResult(const TestPartResult & result)2322*5c90c05cSAndroid Build Coastguard Worker void ScopedFakeTestPartResultReporter::ReportTestPartResult(
2323*5c90c05cSAndroid Build Coastguard Worker     const TestPartResult& result) {
2324*5c90c05cSAndroid Build Coastguard Worker   result_->Append(result);
2325*5c90c05cSAndroid Build Coastguard Worker }
2326*5c90c05cSAndroid Build Coastguard Worker 
2327*5c90c05cSAndroid Build Coastguard Worker namespace internal {
2328*5c90c05cSAndroid Build Coastguard Worker 
2329*5c90c05cSAndroid Build Coastguard Worker // Returns the type ID of ::testing::Test.  We should always call this
2330*5c90c05cSAndroid Build Coastguard Worker // instead of GetTypeId< ::testing::Test>() to get the type ID of
2331*5c90c05cSAndroid Build Coastguard Worker // testing::Test.  This is to work around a suspected linker bug when
2332*5c90c05cSAndroid Build Coastguard Worker // using Google Test as a framework on Mac OS X.  The bug causes
2333*5c90c05cSAndroid Build Coastguard Worker // GetTypeId< ::testing::Test>() to return different values depending
2334*5c90c05cSAndroid Build Coastguard Worker // on whether the call is from the Google Test framework itself or
2335*5c90c05cSAndroid Build Coastguard Worker // from user test code.  GetTestTypeId() is guaranteed to always
2336*5c90c05cSAndroid Build Coastguard Worker // return the same value, as it always calls GetTypeId<>() from the
2337*5c90c05cSAndroid Build Coastguard Worker // gtest.cc, which is within the Google Test framework.
GetTestTypeId()2338*5c90c05cSAndroid Build Coastguard Worker TypeId GetTestTypeId() {
2339*5c90c05cSAndroid Build Coastguard Worker   return GetTypeId<Test>();
2340*5c90c05cSAndroid Build Coastguard Worker }
2341*5c90c05cSAndroid Build Coastguard Worker 
2342*5c90c05cSAndroid Build Coastguard Worker // The value of GetTestTypeId() as seen from within the Google Test
2343*5c90c05cSAndroid Build Coastguard Worker // library.  This is solely for testing GetTestTypeId().
2344*5c90c05cSAndroid Build Coastguard Worker extern const TypeId kTestTypeIdInGoogleTest = GetTestTypeId();
2345*5c90c05cSAndroid Build Coastguard Worker 
2346*5c90c05cSAndroid Build Coastguard Worker // This predicate-formatter checks that 'results' contains a test part
2347*5c90c05cSAndroid Build Coastguard Worker // failure of the given type and that the failure message contains the
2348*5c90c05cSAndroid Build Coastguard Worker // given substring.
HasOneFailure(const char *,const char *,const char *,const TestPartResultArray & results,TestPartResult::Type type,const std::string & substr)2349*5c90c05cSAndroid Build Coastguard Worker static AssertionResult HasOneFailure(const char* /* results_expr */,
2350*5c90c05cSAndroid Build Coastguard Worker                                      const char* /* type_expr */,
2351*5c90c05cSAndroid Build Coastguard Worker                                      const char* /* substr_expr */,
2352*5c90c05cSAndroid Build Coastguard Worker                                      const TestPartResultArray& results,
2353*5c90c05cSAndroid Build Coastguard Worker                                      TestPartResult::Type type,
2354*5c90c05cSAndroid Build Coastguard Worker                                      const std::string& substr) {
2355*5c90c05cSAndroid Build Coastguard Worker   const std::string expected(type == TestPartResult::kFatalFailure ?
2356*5c90c05cSAndroid Build Coastguard Worker                         "1 fatal failure" :
2357*5c90c05cSAndroid Build Coastguard Worker                         "1 non-fatal failure");
2358*5c90c05cSAndroid Build Coastguard Worker   Message msg;
2359*5c90c05cSAndroid Build Coastguard Worker   if (results.size() != 1) {
2360*5c90c05cSAndroid Build Coastguard Worker     msg << "Expected: " << expected << "\n"
2361*5c90c05cSAndroid Build Coastguard Worker         << "  Actual: " << results.size() << " failures";
2362*5c90c05cSAndroid Build Coastguard Worker     for (int i = 0; i < results.size(); i++) {
2363*5c90c05cSAndroid Build Coastguard Worker       msg << "\n" << results.GetTestPartResult(i);
2364*5c90c05cSAndroid Build Coastguard Worker     }
2365*5c90c05cSAndroid Build Coastguard Worker     return AssertionFailure() << msg;
2366*5c90c05cSAndroid Build Coastguard Worker   }
2367*5c90c05cSAndroid Build Coastguard Worker 
2368*5c90c05cSAndroid Build Coastguard Worker   const TestPartResult& r = results.GetTestPartResult(0);
2369*5c90c05cSAndroid Build Coastguard Worker   if (r.type() != type) {
2370*5c90c05cSAndroid Build Coastguard Worker     return AssertionFailure() << "Expected: " << expected << "\n"
2371*5c90c05cSAndroid Build Coastguard Worker                               << "  Actual:\n"
2372*5c90c05cSAndroid Build Coastguard Worker                               << r;
2373*5c90c05cSAndroid Build Coastguard Worker   }
2374*5c90c05cSAndroid Build Coastguard Worker 
2375*5c90c05cSAndroid Build Coastguard Worker   if (strstr(r.message(), substr.c_str()) == nullptr) {
2376*5c90c05cSAndroid Build Coastguard Worker     return AssertionFailure() << "Expected: " << expected << " containing \""
2377*5c90c05cSAndroid Build Coastguard Worker                               << substr << "\"\n"
2378*5c90c05cSAndroid Build Coastguard Worker                               << "  Actual:\n"
2379*5c90c05cSAndroid Build Coastguard Worker                               << r;
2380*5c90c05cSAndroid Build Coastguard Worker   }
2381*5c90c05cSAndroid Build Coastguard Worker 
2382*5c90c05cSAndroid Build Coastguard Worker   return AssertionSuccess();
2383*5c90c05cSAndroid Build Coastguard Worker }
2384*5c90c05cSAndroid Build Coastguard Worker 
2385*5c90c05cSAndroid Build Coastguard Worker // The constructor of SingleFailureChecker remembers where to look up
2386*5c90c05cSAndroid Build Coastguard Worker // test part results, what type of failure we expect, and what
2387*5c90c05cSAndroid Build Coastguard Worker // substring the failure message should contain.
SingleFailureChecker(const TestPartResultArray * results,TestPartResult::Type type,const std::string & substr)2388*5c90c05cSAndroid Build Coastguard Worker SingleFailureChecker::SingleFailureChecker(const TestPartResultArray* results,
2389*5c90c05cSAndroid Build Coastguard Worker                                            TestPartResult::Type type,
2390*5c90c05cSAndroid Build Coastguard Worker                                            const std::string& substr)
2391*5c90c05cSAndroid Build Coastguard Worker     : results_(results), type_(type), substr_(substr) {}
2392*5c90c05cSAndroid Build Coastguard Worker 
2393*5c90c05cSAndroid Build Coastguard Worker // The destructor of SingleFailureChecker verifies that the given
2394*5c90c05cSAndroid Build Coastguard Worker // TestPartResultArray contains exactly one failure that has the given
2395*5c90c05cSAndroid Build Coastguard Worker // type and contains the given substring.  If that's not the case, a
2396*5c90c05cSAndroid Build Coastguard Worker // non-fatal failure will be generated.
~SingleFailureChecker()2397*5c90c05cSAndroid Build Coastguard Worker SingleFailureChecker::~SingleFailureChecker() {
2398*5c90c05cSAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT3(HasOneFailure, *results_, type_, substr_);
2399*5c90c05cSAndroid Build Coastguard Worker }
2400*5c90c05cSAndroid Build Coastguard Worker 
DefaultGlobalTestPartResultReporter(UnitTestImpl * unit_test)2401*5c90c05cSAndroid Build Coastguard Worker DefaultGlobalTestPartResultReporter::DefaultGlobalTestPartResultReporter(
2402*5c90c05cSAndroid Build Coastguard Worker     UnitTestImpl* unit_test) : unit_test_(unit_test) {}
2403*5c90c05cSAndroid Build Coastguard Worker 
ReportTestPartResult(const TestPartResult & result)2404*5c90c05cSAndroid Build Coastguard Worker void DefaultGlobalTestPartResultReporter::ReportTestPartResult(
2405*5c90c05cSAndroid Build Coastguard Worker     const TestPartResult& result) {
2406*5c90c05cSAndroid Build Coastguard Worker   unit_test_->current_test_result()->AddTestPartResult(result);
2407*5c90c05cSAndroid Build Coastguard Worker   unit_test_->listeners()->repeater()->OnTestPartResult(result);
2408*5c90c05cSAndroid Build Coastguard Worker }
2409*5c90c05cSAndroid Build Coastguard Worker 
DefaultPerThreadTestPartResultReporter(UnitTestImpl * unit_test)2410*5c90c05cSAndroid Build Coastguard Worker DefaultPerThreadTestPartResultReporter::DefaultPerThreadTestPartResultReporter(
2411*5c90c05cSAndroid Build Coastguard Worker     UnitTestImpl* unit_test) : unit_test_(unit_test) {}
2412*5c90c05cSAndroid Build Coastguard Worker 
ReportTestPartResult(const TestPartResult & result)2413*5c90c05cSAndroid Build Coastguard Worker void DefaultPerThreadTestPartResultReporter::ReportTestPartResult(
2414*5c90c05cSAndroid Build Coastguard Worker     const TestPartResult& result) {
2415*5c90c05cSAndroid Build Coastguard Worker   unit_test_->GetGlobalTestPartResultReporter()->ReportTestPartResult(result);
2416*5c90c05cSAndroid Build Coastguard Worker }
2417*5c90c05cSAndroid Build Coastguard Worker 
2418*5c90c05cSAndroid Build Coastguard Worker // Returns the global test part result reporter.
2419*5c90c05cSAndroid Build Coastguard Worker TestPartResultReporterInterface*
GetGlobalTestPartResultReporter()2420*5c90c05cSAndroid Build Coastguard Worker UnitTestImpl::GetGlobalTestPartResultReporter() {
2421*5c90c05cSAndroid Build Coastguard Worker   internal::MutexLock lock(&global_test_part_result_reporter_mutex_);
2422*5c90c05cSAndroid Build Coastguard Worker   return global_test_part_result_repoter_;
2423*5c90c05cSAndroid Build Coastguard Worker }
2424*5c90c05cSAndroid Build Coastguard Worker 
2425*5c90c05cSAndroid Build Coastguard Worker // Sets the global test part result reporter.
SetGlobalTestPartResultReporter(TestPartResultReporterInterface * reporter)2426*5c90c05cSAndroid Build Coastguard Worker void UnitTestImpl::SetGlobalTestPartResultReporter(
2427*5c90c05cSAndroid Build Coastguard Worker     TestPartResultReporterInterface* reporter) {
2428*5c90c05cSAndroid Build Coastguard Worker   internal::MutexLock lock(&global_test_part_result_reporter_mutex_);
2429*5c90c05cSAndroid Build Coastguard Worker   global_test_part_result_repoter_ = reporter;
2430*5c90c05cSAndroid Build Coastguard Worker }
2431*5c90c05cSAndroid Build Coastguard Worker 
2432*5c90c05cSAndroid Build Coastguard Worker // Returns the test part result reporter for the current thread.
2433*5c90c05cSAndroid Build Coastguard Worker TestPartResultReporterInterface*
GetTestPartResultReporterForCurrentThread()2434*5c90c05cSAndroid Build Coastguard Worker UnitTestImpl::GetTestPartResultReporterForCurrentThread() {
2435*5c90c05cSAndroid Build Coastguard Worker   return per_thread_test_part_result_reporter_.get();
2436*5c90c05cSAndroid Build Coastguard Worker }
2437*5c90c05cSAndroid Build Coastguard Worker 
2438*5c90c05cSAndroid Build Coastguard Worker // Sets the test part result reporter for the current thread.
SetTestPartResultReporterForCurrentThread(TestPartResultReporterInterface * reporter)2439*5c90c05cSAndroid Build Coastguard Worker void UnitTestImpl::SetTestPartResultReporterForCurrentThread(
2440*5c90c05cSAndroid Build Coastguard Worker     TestPartResultReporterInterface* reporter) {
2441*5c90c05cSAndroid Build Coastguard Worker   per_thread_test_part_result_reporter_.set(reporter);
2442*5c90c05cSAndroid Build Coastguard Worker }
2443*5c90c05cSAndroid Build Coastguard Worker 
2444*5c90c05cSAndroid Build Coastguard Worker // Gets the number of successful test suites.
successful_test_suite_count() const2445*5c90c05cSAndroid Build Coastguard Worker int UnitTestImpl::successful_test_suite_count() const {
2446*5c90c05cSAndroid Build Coastguard Worker   return CountIf(test_suites_, TestSuitePassed);
2447*5c90c05cSAndroid Build Coastguard Worker }
2448*5c90c05cSAndroid Build Coastguard Worker 
2449*5c90c05cSAndroid Build Coastguard Worker // Gets the number of failed test suites.
failed_test_suite_count() const2450*5c90c05cSAndroid Build Coastguard Worker int UnitTestImpl::failed_test_suite_count() const {
2451*5c90c05cSAndroid Build Coastguard Worker   return CountIf(test_suites_, TestSuiteFailed);
2452*5c90c05cSAndroid Build Coastguard Worker }
2453*5c90c05cSAndroid Build Coastguard Worker 
2454*5c90c05cSAndroid Build Coastguard Worker // Gets the number of all test suites.
total_test_suite_count() const2455*5c90c05cSAndroid Build Coastguard Worker int UnitTestImpl::total_test_suite_count() const {
2456*5c90c05cSAndroid Build Coastguard Worker   return static_cast<int>(test_suites_.size());
2457*5c90c05cSAndroid Build Coastguard Worker }
2458*5c90c05cSAndroid Build Coastguard Worker 
2459*5c90c05cSAndroid Build Coastguard Worker // Gets the number of all test suites that contain at least one test
2460*5c90c05cSAndroid Build Coastguard Worker // that should run.
test_suite_to_run_count() const2461*5c90c05cSAndroid Build Coastguard Worker int UnitTestImpl::test_suite_to_run_count() const {
2462*5c90c05cSAndroid Build Coastguard Worker   return CountIf(test_suites_, ShouldRunTestSuite);
2463*5c90c05cSAndroid Build Coastguard Worker }
2464*5c90c05cSAndroid Build Coastguard Worker 
2465*5c90c05cSAndroid Build Coastguard Worker // Gets the number of successful tests.
successful_test_count() const2466*5c90c05cSAndroid Build Coastguard Worker int UnitTestImpl::successful_test_count() const {
2467*5c90c05cSAndroid Build Coastguard Worker   return SumOverTestSuiteList(test_suites_, &TestSuite::successful_test_count);
2468*5c90c05cSAndroid Build Coastguard Worker }
2469*5c90c05cSAndroid Build Coastguard Worker 
2470*5c90c05cSAndroid Build Coastguard Worker // Gets the number of skipped tests.
skipped_test_count() const2471*5c90c05cSAndroid Build Coastguard Worker int UnitTestImpl::skipped_test_count() const {
2472*5c90c05cSAndroid Build Coastguard Worker   return SumOverTestSuiteList(test_suites_, &TestSuite::skipped_test_count);
2473*5c90c05cSAndroid Build Coastguard Worker }
2474*5c90c05cSAndroid Build Coastguard Worker 
2475*5c90c05cSAndroid Build Coastguard Worker // Gets the number of failed tests.
failed_test_count() const2476*5c90c05cSAndroid Build Coastguard Worker int UnitTestImpl::failed_test_count() const {
2477*5c90c05cSAndroid Build Coastguard Worker   return SumOverTestSuiteList(test_suites_, &TestSuite::failed_test_count);
2478*5c90c05cSAndroid Build Coastguard Worker }
2479*5c90c05cSAndroid Build Coastguard Worker 
2480*5c90c05cSAndroid Build Coastguard Worker // Gets the number of disabled tests that will be reported in the XML report.
reportable_disabled_test_count() const2481*5c90c05cSAndroid Build Coastguard Worker int UnitTestImpl::reportable_disabled_test_count() const {
2482*5c90c05cSAndroid Build Coastguard Worker   return SumOverTestSuiteList(test_suites_,
2483*5c90c05cSAndroid Build Coastguard Worker                               &TestSuite::reportable_disabled_test_count);
2484*5c90c05cSAndroid Build Coastguard Worker }
2485*5c90c05cSAndroid Build Coastguard Worker 
2486*5c90c05cSAndroid Build Coastguard Worker // Gets the number of disabled tests.
disabled_test_count() const2487*5c90c05cSAndroid Build Coastguard Worker int UnitTestImpl::disabled_test_count() const {
2488*5c90c05cSAndroid Build Coastguard Worker   return SumOverTestSuiteList(test_suites_, &TestSuite::disabled_test_count);
2489*5c90c05cSAndroid Build Coastguard Worker }
2490*5c90c05cSAndroid Build Coastguard Worker 
2491*5c90c05cSAndroid Build Coastguard Worker // Gets the number of tests to be printed in the XML report.
reportable_test_count() const2492*5c90c05cSAndroid Build Coastguard Worker int UnitTestImpl::reportable_test_count() const {
2493*5c90c05cSAndroid Build Coastguard Worker   return SumOverTestSuiteList(test_suites_, &TestSuite::reportable_test_count);
2494*5c90c05cSAndroid Build Coastguard Worker }
2495*5c90c05cSAndroid Build Coastguard Worker 
2496*5c90c05cSAndroid Build Coastguard Worker // Gets the number of all tests.
total_test_count() const2497*5c90c05cSAndroid Build Coastguard Worker int UnitTestImpl::total_test_count() const {
2498*5c90c05cSAndroid Build Coastguard Worker   return SumOverTestSuiteList(test_suites_, &TestSuite::total_test_count);
2499*5c90c05cSAndroid Build Coastguard Worker }
2500*5c90c05cSAndroid Build Coastguard Worker 
2501*5c90c05cSAndroid Build Coastguard Worker // Gets the number of tests that should run.
test_to_run_count() const2502*5c90c05cSAndroid Build Coastguard Worker int UnitTestImpl::test_to_run_count() const {
2503*5c90c05cSAndroid Build Coastguard Worker   return SumOverTestSuiteList(test_suites_, &TestSuite::test_to_run_count);
2504*5c90c05cSAndroid Build Coastguard Worker }
2505*5c90c05cSAndroid Build Coastguard Worker 
2506*5c90c05cSAndroid Build Coastguard Worker // Returns the current OS stack trace as an std::string.
2507*5c90c05cSAndroid Build Coastguard Worker //
2508*5c90c05cSAndroid Build Coastguard Worker // The maximum number of stack frames to be included is specified by
2509*5c90c05cSAndroid Build Coastguard Worker // the gtest_stack_trace_depth flag.  The skip_count parameter
2510*5c90c05cSAndroid Build Coastguard Worker // specifies the number of top frames to be skipped, which doesn't
2511*5c90c05cSAndroid Build Coastguard Worker // count against the number of frames to be included.
2512*5c90c05cSAndroid Build Coastguard Worker //
2513*5c90c05cSAndroid Build Coastguard Worker // For example, if Foo() calls Bar(), which in turn calls
2514*5c90c05cSAndroid Build Coastguard Worker // CurrentOsStackTraceExceptTop(1), Foo() will be included in the
2515*5c90c05cSAndroid Build Coastguard Worker // trace but Bar() and CurrentOsStackTraceExceptTop() won't.
CurrentOsStackTraceExceptTop(int skip_count)2516*5c90c05cSAndroid Build Coastguard Worker std::string UnitTestImpl::CurrentOsStackTraceExceptTop(int skip_count) {
2517*5c90c05cSAndroid Build Coastguard Worker   return os_stack_trace_getter()->CurrentStackTrace(
2518*5c90c05cSAndroid Build Coastguard Worker       static_cast<int>(GTEST_FLAG(stack_trace_depth)),
2519*5c90c05cSAndroid Build Coastguard Worker       skip_count + 1
2520*5c90c05cSAndroid Build Coastguard Worker       // Skips the user-specified number of frames plus this function
2521*5c90c05cSAndroid Build Coastguard Worker       // itself.
2522*5c90c05cSAndroid Build Coastguard Worker       );  // NOLINT
2523*5c90c05cSAndroid Build Coastguard Worker }
2524*5c90c05cSAndroid Build Coastguard Worker 
2525*5c90c05cSAndroid Build Coastguard Worker // A helper class for measuring elapsed times.
2526*5c90c05cSAndroid Build Coastguard Worker class Timer {
2527*5c90c05cSAndroid Build Coastguard Worker  public:
Timer()2528*5c90c05cSAndroid Build Coastguard Worker   Timer() : start_(std::chrono::steady_clock::now()) {}
2529*5c90c05cSAndroid Build Coastguard Worker 
2530*5c90c05cSAndroid Build Coastguard Worker   // Return time elapsed in milliseconds since the timer was created.
Elapsed()2531*5c90c05cSAndroid Build Coastguard Worker   TimeInMillis Elapsed() {
2532*5c90c05cSAndroid Build Coastguard Worker     return std::chrono::duration_cast<std::chrono::milliseconds>(
2533*5c90c05cSAndroid Build Coastguard Worker                std::chrono::steady_clock::now() - start_)
2534*5c90c05cSAndroid Build Coastguard Worker         .count();
2535*5c90c05cSAndroid Build Coastguard Worker   }
2536*5c90c05cSAndroid Build Coastguard Worker 
2537*5c90c05cSAndroid Build Coastguard Worker  private:
2538*5c90c05cSAndroid Build Coastguard Worker   std::chrono::steady_clock::time_point start_;
2539*5c90c05cSAndroid Build Coastguard Worker };
2540*5c90c05cSAndroid Build Coastguard Worker 
2541*5c90c05cSAndroid Build Coastguard Worker // Returns a timestamp as milliseconds since the epoch. Note this time may jump
2542*5c90c05cSAndroid Build Coastguard Worker // around subject to adjustments by the system, to measure elapsed time use
2543*5c90c05cSAndroid Build Coastguard Worker // Timer instead.
GetTimeInMillis()2544*5c90c05cSAndroid Build Coastguard Worker TimeInMillis GetTimeInMillis() {
2545*5c90c05cSAndroid Build Coastguard Worker   return std::chrono::duration_cast<std::chrono::milliseconds>(
2546*5c90c05cSAndroid Build Coastguard Worker              std::chrono::system_clock::now() -
2547*5c90c05cSAndroid Build Coastguard Worker              std::chrono::system_clock::from_time_t(0))
2548*5c90c05cSAndroid Build Coastguard Worker       .count();
2549*5c90c05cSAndroid Build Coastguard Worker }
2550*5c90c05cSAndroid Build Coastguard Worker 
2551*5c90c05cSAndroid Build Coastguard Worker // Utilities
2552*5c90c05cSAndroid Build Coastguard Worker 
2553*5c90c05cSAndroid Build Coastguard Worker // class String.
2554*5c90c05cSAndroid Build Coastguard Worker 
2555*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_WINDOWS_MOBILE
2556*5c90c05cSAndroid Build Coastguard Worker // Creates a UTF-16 wide string from the given ANSI string, allocating
2557*5c90c05cSAndroid Build Coastguard Worker // memory using new. The caller is responsible for deleting the return
2558*5c90c05cSAndroid Build Coastguard Worker // value using delete[]. Returns the wide string, or NULL if the
2559*5c90c05cSAndroid Build Coastguard Worker // input is NULL.
AnsiToUtf16(const char * ansi)2560*5c90c05cSAndroid Build Coastguard Worker LPCWSTR String::AnsiToUtf16(const char* ansi) {
2561*5c90c05cSAndroid Build Coastguard Worker   if (!ansi) return nullptr;
2562*5c90c05cSAndroid Build Coastguard Worker   const int length = strlen(ansi);
2563*5c90c05cSAndroid Build Coastguard Worker   const int unicode_length =
2564*5c90c05cSAndroid Build Coastguard Worker       MultiByteToWideChar(CP_ACP, 0, ansi, length, nullptr, 0);
2565*5c90c05cSAndroid Build Coastguard Worker   WCHAR* unicode = new WCHAR[unicode_length + 1];
2566*5c90c05cSAndroid Build Coastguard Worker   MultiByteToWideChar(CP_ACP, 0, ansi, length,
2567*5c90c05cSAndroid Build Coastguard Worker                       unicode, unicode_length);
2568*5c90c05cSAndroid Build Coastguard Worker   unicode[unicode_length] = 0;
2569*5c90c05cSAndroid Build Coastguard Worker   return unicode;
2570*5c90c05cSAndroid Build Coastguard Worker }
2571*5c90c05cSAndroid Build Coastguard Worker 
2572*5c90c05cSAndroid Build Coastguard Worker // Creates an ANSI string from the given wide string, allocating
2573*5c90c05cSAndroid Build Coastguard Worker // memory using new. The caller is responsible for deleting the return
2574*5c90c05cSAndroid Build Coastguard Worker // value using delete[]. Returns the ANSI string, or NULL if the
2575*5c90c05cSAndroid Build Coastguard Worker // input is NULL.
Utf16ToAnsi(LPCWSTR utf16_str)2576*5c90c05cSAndroid Build Coastguard Worker const char* String::Utf16ToAnsi(LPCWSTR utf16_str)  {
2577*5c90c05cSAndroid Build Coastguard Worker   if (!utf16_str) return nullptr;
2578*5c90c05cSAndroid Build Coastguard Worker   const int ansi_length = WideCharToMultiByte(CP_ACP, 0, utf16_str, -1, nullptr,
2579*5c90c05cSAndroid Build Coastguard Worker                                               0, nullptr, nullptr);
2580*5c90c05cSAndroid Build Coastguard Worker   char* ansi = new char[ansi_length + 1];
2581*5c90c05cSAndroid Build Coastguard Worker   WideCharToMultiByte(CP_ACP, 0, utf16_str, -1, ansi, ansi_length, nullptr,
2582*5c90c05cSAndroid Build Coastguard Worker                       nullptr);
2583*5c90c05cSAndroid Build Coastguard Worker   ansi[ansi_length] = 0;
2584*5c90c05cSAndroid Build Coastguard Worker   return ansi;
2585*5c90c05cSAndroid Build Coastguard Worker }
2586*5c90c05cSAndroid Build Coastguard Worker 
2587*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_OS_WINDOWS_MOBILE
2588*5c90c05cSAndroid Build Coastguard Worker 
2589*5c90c05cSAndroid Build Coastguard Worker // Compares two C strings.  Returns true if and only if they have the same
2590*5c90c05cSAndroid Build Coastguard Worker // content.
2591*5c90c05cSAndroid Build Coastguard Worker //
2592*5c90c05cSAndroid Build Coastguard Worker // Unlike strcmp(), this function can handle NULL argument(s).  A NULL
2593*5c90c05cSAndroid Build Coastguard Worker // C string is considered different to any non-NULL C string,
2594*5c90c05cSAndroid Build Coastguard Worker // including the empty string.
CStringEquals(const char * lhs,const char * rhs)2595*5c90c05cSAndroid Build Coastguard Worker bool String::CStringEquals(const char * lhs, const char * rhs) {
2596*5c90c05cSAndroid Build Coastguard Worker   if (lhs == nullptr) return rhs == nullptr;
2597*5c90c05cSAndroid Build Coastguard Worker 
2598*5c90c05cSAndroid Build Coastguard Worker   if (rhs == nullptr) return false;
2599*5c90c05cSAndroid Build Coastguard Worker 
2600*5c90c05cSAndroid Build Coastguard Worker   return strcmp(lhs, rhs) == 0;
2601*5c90c05cSAndroid Build Coastguard Worker }
2602*5c90c05cSAndroid Build Coastguard Worker 
2603*5c90c05cSAndroid Build Coastguard Worker #if GTEST_HAS_STD_WSTRING
2604*5c90c05cSAndroid Build Coastguard Worker 
2605*5c90c05cSAndroid Build Coastguard Worker // Converts an array of wide chars to a narrow string using the UTF-8
2606*5c90c05cSAndroid Build Coastguard Worker // encoding, and streams the result to the given Message object.
StreamWideCharsToMessage(const wchar_t * wstr,size_t length,Message * msg)2607*5c90c05cSAndroid Build Coastguard Worker static void StreamWideCharsToMessage(const wchar_t* wstr, size_t length,
2608*5c90c05cSAndroid Build Coastguard Worker                                      Message* msg) {
2609*5c90c05cSAndroid Build Coastguard Worker   for (size_t i = 0; i != length; ) {  // NOLINT
2610*5c90c05cSAndroid Build Coastguard Worker     if (wstr[i] != L'\0') {
2611*5c90c05cSAndroid Build Coastguard Worker       *msg << WideStringToUtf8(wstr + i, static_cast<int>(length - i));
2612*5c90c05cSAndroid Build Coastguard Worker       while (i != length && wstr[i] != L'\0')
2613*5c90c05cSAndroid Build Coastguard Worker         i++;
2614*5c90c05cSAndroid Build Coastguard Worker     } else {
2615*5c90c05cSAndroid Build Coastguard Worker       *msg << '\0';
2616*5c90c05cSAndroid Build Coastguard Worker       i++;
2617*5c90c05cSAndroid Build Coastguard Worker     }
2618*5c90c05cSAndroid Build Coastguard Worker   }
2619*5c90c05cSAndroid Build Coastguard Worker }
2620*5c90c05cSAndroid Build Coastguard Worker 
2621*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_HAS_STD_WSTRING
2622*5c90c05cSAndroid Build Coastguard Worker 
SplitString(const::std::string & str,char delimiter,::std::vector<::std::string> * dest)2623*5c90c05cSAndroid Build Coastguard Worker void SplitString(const ::std::string& str, char delimiter,
2624*5c90c05cSAndroid Build Coastguard Worker                  ::std::vector< ::std::string>* dest) {
2625*5c90c05cSAndroid Build Coastguard Worker   ::std::vector< ::std::string> parsed;
2626*5c90c05cSAndroid Build Coastguard Worker   ::std::string::size_type pos = 0;
2627*5c90c05cSAndroid Build Coastguard Worker   while (::testing::internal::AlwaysTrue()) {
2628*5c90c05cSAndroid Build Coastguard Worker     const ::std::string::size_type colon = str.find(delimiter, pos);
2629*5c90c05cSAndroid Build Coastguard Worker     if (colon == ::std::string::npos) {
2630*5c90c05cSAndroid Build Coastguard Worker       parsed.push_back(str.substr(pos));
2631*5c90c05cSAndroid Build Coastguard Worker       break;
2632*5c90c05cSAndroid Build Coastguard Worker     } else {
2633*5c90c05cSAndroid Build Coastguard Worker       parsed.push_back(str.substr(pos, colon - pos));
2634*5c90c05cSAndroid Build Coastguard Worker       pos = colon + 1;
2635*5c90c05cSAndroid Build Coastguard Worker     }
2636*5c90c05cSAndroid Build Coastguard Worker   }
2637*5c90c05cSAndroid Build Coastguard Worker   dest->swap(parsed);
2638*5c90c05cSAndroid Build Coastguard Worker }
2639*5c90c05cSAndroid Build Coastguard Worker 
2640*5c90c05cSAndroid Build Coastguard Worker }  // namespace internal
2641*5c90c05cSAndroid Build Coastguard Worker 
2642*5c90c05cSAndroid Build Coastguard Worker // Constructs an empty Message.
2643*5c90c05cSAndroid Build Coastguard Worker // We allocate the stringstream separately because otherwise each use of
2644*5c90c05cSAndroid Build Coastguard Worker // ASSERT/EXPECT in a procedure adds over 200 bytes to the procedure's
2645*5c90c05cSAndroid Build Coastguard Worker // stack frame leading to huge stack frames in some cases; gcc does not reuse
2646*5c90c05cSAndroid Build Coastguard Worker // the stack space.
Message()2647*5c90c05cSAndroid Build Coastguard Worker Message::Message() : ss_(new ::std::stringstream) {
2648*5c90c05cSAndroid Build Coastguard Worker   // By default, we want there to be enough precision when printing
2649*5c90c05cSAndroid Build Coastguard Worker   // a double to a Message.
2650*5c90c05cSAndroid Build Coastguard Worker   *ss_ << std::setprecision(std::numeric_limits<double>::digits10 + 2);
2651*5c90c05cSAndroid Build Coastguard Worker }
2652*5c90c05cSAndroid Build Coastguard Worker 
2653*5c90c05cSAndroid Build Coastguard Worker // These two overloads allow streaming a wide C string to a Message
2654*5c90c05cSAndroid Build Coastguard Worker // using the UTF-8 encoding.
operator <<(const wchar_t * wide_c_str)2655*5c90c05cSAndroid Build Coastguard Worker Message& Message::operator <<(const wchar_t* wide_c_str) {
2656*5c90c05cSAndroid Build Coastguard Worker   return *this << internal::String::ShowWideCString(wide_c_str);
2657*5c90c05cSAndroid Build Coastguard Worker }
operator <<(wchar_t * wide_c_str)2658*5c90c05cSAndroid Build Coastguard Worker Message& Message::operator <<(wchar_t* wide_c_str) {
2659*5c90c05cSAndroid Build Coastguard Worker   return *this << internal::String::ShowWideCString(wide_c_str);
2660*5c90c05cSAndroid Build Coastguard Worker }
2661*5c90c05cSAndroid Build Coastguard Worker 
2662*5c90c05cSAndroid Build Coastguard Worker #if GTEST_HAS_STD_WSTRING
2663*5c90c05cSAndroid Build Coastguard Worker // Converts the given wide string to a narrow string using the UTF-8
2664*5c90c05cSAndroid Build Coastguard Worker // encoding, and streams the result to this Message object.
operator <<(const::std::wstring & wstr)2665*5c90c05cSAndroid Build Coastguard Worker Message& Message::operator <<(const ::std::wstring& wstr) {
2666*5c90c05cSAndroid Build Coastguard Worker   internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);
2667*5c90c05cSAndroid Build Coastguard Worker   return *this;
2668*5c90c05cSAndroid Build Coastguard Worker }
2669*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_HAS_STD_WSTRING
2670*5c90c05cSAndroid Build Coastguard Worker 
2671*5c90c05cSAndroid Build Coastguard Worker // Gets the text streamed to this object so far as an std::string.
2672*5c90c05cSAndroid Build Coastguard Worker // Each '\0' character in the buffer is replaced with "\\0".
GetString() const2673*5c90c05cSAndroid Build Coastguard Worker std::string Message::GetString() const {
2674*5c90c05cSAndroid Build Coastguard Worker   return internal::StringStreamToString(ss_.get());
2675*5c90c05cSAndroid Build Coastguard Worker }
2676*5c90c05cSAndroid Build Coastguard Worker 
2677*5c90c05cSAndroid Build Coastguard Worker // AssertionResult constructors.
2678*5c90c05cSAndroid Build Coastguard Worker // Used in EXPECT_TRUE/FALSE(assertion_result).
AssertionResult(const AssertionResult & other)2679*5c90c05cSAndroid Build Coastguard Worker AssertionResult::AssertionResult(const AssertionResult& other)
2680*5c90c05cSAndroid Build Coastguard Worker     : success_(other.success_),
2681*5c90c05cSAndroid Build Coastguard Worker       message_(other.message_.get() != nullptr
2682*5c90c05cSAndroid Build Coastguard Worker                    ? new ::std::string(*other.message_)
2683*5c90c05cSAndroid Build Coastguard Worker                    : static_cast< ::std::string*>(nullptr)) {}
2684*5c90c05cSAndroid Build Coastguard Worker 
2685*5c90c05cSAndroid Build Coastguard Worker // Swaps two AssertionResults.
swap(AssertionResult & other)2686*5c90c05cSAndroid Build Coastguard Worker void AssertionResult::swap(AssertionResult& other) {
2687*5c90c05cSAndroid Build Coastguard Worker   using std::swap;
2688*5c90c05cSAndroid Build Coastguard Worker   swap(success_, other.success_);
2689*5c90c05cSAndroid Build Coastguard Worker   swap(message_, other.message_);
2690*5c90c05cSAndroid Build Coastguard Worker }
2691*5c90c05cSAndroid Build Coastguard Worker 
2692*5c90c05cSAndroid Build Coastguard Worker // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
operator !() const2693*5c90c05cSAndroid Build Coastguard Worker AssertionResult AssertionResult::operator!() const {
2694*5c90c05cSAndroid Build Coastguard Worker   AssertionResult negation(!success_);
2695*5c90c05cSAndroid Build Coastguard Worker   if (message_.get() != nullptr) negation << *message_;
2696*5c90c05cSAndroid Build Coastguard Worker   return negation;
2697*5c90c05cSAndroid Build Coastguard Worker }
2698*5c90c05cSAndroid Build Coastguard Worker 
2699*5c90c05cSAndroid Build Coastguard Worker // Makes a successful assertion result.
AssertionSuccess()2700*5c90c05cSAndroid Build Coastguard Worker AssertionResult AssertionSuccess() {
2701*5c90c05cSAndroid Build Coastguard Worker   return AssertionResult(true);
2702*5c90c05cSAndroid Build Coastguard Worker }
2703*5c90c05cSAndroid Build Coastguard Worker 
2704*5c90c05cSAndroid Build Coastguard Worker // Makes a failed assertion result.
AssertionFailure()2705*5c90c05cSAndroid Build Coastguard Worker AssertionResult AssertionFailure() {
2706*5c90c05cSAndroid Build Coastguard Worker   return AssertionResult(false);
2707*5c90c05cSAndroid Build Coastguard Worker }
2708*5c90c05cSAndroid Build Coastguard Worker 
2709*5c90c05cSAndroid Build Coastguard Worker // Makes a failed assertion result with the given failure message.
2710*5c90c05cSAndroid Build Coastguard Worker // Deprecated; use AssertionFailure() << message.
AssertionFailure(const Message & message)2711*5c90c05cSAndroid Build Coastguard Worker AssertionResult AssertionFailure(const Message& message) {
2712*5c90c05cSAndroid Build Coastguard Worker   return AssertionFailure() << message;
2713*5c90c05cSAndroid Build Coastguard Worker }
2714*5c90c05cSAndroid Build Coastguard Worker 
2715*5c90c05cSAndroid Build Coastguard Worker namespace internal {
2716*5c90c05cSAndroid Build Coastguard Worker 
2717*5c90c05cSAndroid Build Coastguard Worker namespace edit_distance {
CalculateOptimalEdits(const std::vector<size_t> & left,const std::vector<size_t> & right)2718*5c90c05cSAndroid Build Coastguard Worker std::vector<EditType> CalculateOptimalEdits(const std::vector<size_t>& left,
2719*5c90c05cSAndroid Build Coastguard Worker                                             const std::vector<size_t>& right) {
2720*5c90c05cSAndroid Build Coastguard Worker   std::vector<std::vector<double> > costs(
2721*5c90c05cSAndroid Build Coastguard Worker       left.size() + 1, std::vector<double>(right.size() + 1));
2722*5c90c05cSAndroid Build Coastguard Worker   std::vector<std::vector<EditType> > best_move(
2723*5c90c05cSAndroid Build Coastguard Worker       left.size() + 1, std::vector<EditType>(right.size() + 1));
2724*5c90c05cSAndroid Build Coastguard Worker 
2725*5c90c05cSAndroid Build Coastguard Worker   // Populate for empty right.
2726*5c90c05cSAndroid Build Coastguard Worker   for (size_t l_i = 0; l_i < costs.size(); ++l_i) {
2727*5c90c05cSAndroid Build Coastguard Worker     costs[l_i][0] = static_cast<double>(l_i);
2728*5c90c05cSAndroid Build Coastguard Worker     best_move[l_i][0] = kRemove;
2729*5c90c05cSAndroid Build Coastguard Worker   }
2730*5c90c05cSAndroid Build Coastguard Worker   // Populate for empty left.
2731*5c90c05cSAndroid Build Coastguard Worker   for (size_t r_i = 1; r_i < costs[0].size(); ++r_i) {
2732*5c90c05cSAndroid Build Coastguard Worker     costs[0][r_i] = static_cast<double>(r_i);
2733*5c90c05cSAndroid Build Coastguard Worker     best_move[0][r_i] = kAdd;
2734*5c90c05cSAndroid Build Coastguard Worker   }
2735*5c90c05cSAndroid Build Coastguard Worker 
2736*5c90c05cSAndroid Build Coastguard Worker   for (size_t l_i = 0; l_i < left.size(); ++l_i) {
2737*5c90c05cSAndroid Build Coastguard Worker     for (size_t r_i = 0; r_i < right.size(); ++r_i) {
2738*5c90c05cSAndroid Build Coastguard Worker       if (left[l_i] == right[r_i]) {
2739*5c90c05cSAndroid Build Coastguard Worker         // Found a match. Consume it.
2740*5c90c05cSAndroid Build Coastguard Worker         costs[l_i + 1][r_i + 1] = costs[l_i][r_i];
2741*5c90c05cSAndroid Build Coastguard Worker         best_move[l_i + 1][r_i + 1] = kMatch;
2742*5c90c05cSAndroid Build Coastguard Worker         continue;
2743*5c90c05cSAndroid Build Coastguard Worker       }
2744*5c90c05cSAndroid Build Coastguard Worker 
2745*5c90c05cSAndroid Build Coastguard Worker       const double add = costs[l_i + 1][r_i];
2746*5c90c05cSAndroid Build Coastguard Worker       const double remove = costs[l_i][r_i + 1];
2747*5c90c05cSAndroid Build Coastguard Worker       const double replace = costs[l_i][r_i];
2748*5c90c05cSAndroid Build Coastguard Worker       if (add < remove && add < replace) {
2749*5c90c05cSAndroid Build Coastguard Worker         costs[l_i + 1][r_i + 1] = add + 1;
2750*5c90c05cSAndroid Build Coastguard Worker         best_move[l_i + 1][r_i + 1] = kAdd;
2751*5c90c05cSAndroid Build Coastguard Worker       } else if (remove < add && remove < replace) {
2752*5c90c05cSAndroid Build Coastguard Worker         costs[l_i + 1][r_i + 1] = remove + 1;
2753*5c90c05cSAndroid Build Coastguard Worker         best_move[l_i + 1][r_i + 1] = kRemove;
2754*5c90c05cSAndroid Build Coastguard Worker       } else {
2755*5c90c05cSAndroid Build Coastguard Worker         // We make replace a little more expensive than add/remove to lower
2756*5c90c05cSAndroid Build Coastguard Worker         // their priority.
2757*5c90c05cSAndroid Build Coastguard Worker         costs[l_i + 1][r_i + 1] = replace + 1.00001;
2758*5c90c05cSAndroid Build Coastguard Worker         best_move[l_i + 1][r_i + 1] = kReplace;
2759*5c90c05cSAndroid Build Coastguard Worker       }
2760*5c90c05cSAndroid Build Coastguard Worker     }
2761*5c90c05cSAndroid Build Coastguard Worker   }
2762*5c90c05cSAndroid Build Coastguard Worker 
2763*5c90c05cSAndroid Build Coastguard Worker   // Reconstruct the best path. We do it in reverse order.
2764*5c90c05cSAndroid Build Coastguard Worker   std::vector<EditType> best_path;
2765*5c90c05cSAndroid Build Coastguard Worker   for (size_t l_i = left.size(), r_i = right.size(); l_i > 0 || r_i > 0;) {
2766*5c90c05cSAndroid Build Coastguard Worker     EditType move = best_move[l_i][r_i];
2767*5c90c05cSAndroid Build Coastguard Worker     best_path.push_back(move);
2768*5c90c05cSAndroid Build Coastguard Worker     l_i -= move != kAdd;
2769*5c90c05cSAndroid Build Coastguard Worker     r_i -= move != kRemove;
2770*5c90c05cSAndroid Build Coastguard Worker   }
2771*5c90c05cSAndroid Build Coastguard Worker   std::reverse(best_path.begin(), best_path.end());
2772*5c90c05cSAndroid Build Coastguard Worker   return best_path;
2773*5c90c05cSAndroid Build Coastguard Worker }
2774*5c90c05cSAndroid Build Coastguard Worker 
2775*5c90c05cSAndroid Build Coastguard Worker namespace {
2776*5c90c05cSAndroid Build Coastguard Worker 
2777*5c90c05cSAndroid Build Coastguard Worker // Helper class to convert string into ids with deduplication.
2778*5c90c05cSAndroid Build Coastguard Worker class InternalStrings {
2779*5c90c05cSAndroid Build Coastguard Worker  public:
GetId(const std::string & str)2780*5c90c05cSAndroid Build Coastguard Worker   size_t GetId(const std::string& str) {
2781*5c90c05cSAndroid Build Coastguard Worker     IdMap::iterator it = ids_.find(str);
2782*5c90c05cSAndroid Build Coastguard Worker     if (it != ids_.end()) return it->second;
2783*5c90c05cSAndroid Build Coastguard Worker     size_t id = ids_.size();
2784*5c90c05cSAndroid Build Coastguard Worker     return ids_[str] = id;
2785*5c90c05cSAndroid Build Coastguard Worker   }
2786*5c90c05cSAndroid Build Coastguard Worker 
2787*5c90c05cSAndroid Build Coastguard Worker  private:
2788*5c90c05cSAndroid Build Coastguard Worker   typedef std::map<std::string, size_t> IdMap;
2789*5c90c05cSAndroid Build Coastguard Worker   IdMap ids_;
2790*5c90c05cSAndroid Build Coastguard Worker };
2791*5c90c05cSAndroid Build Coastguard Worker 
2792*5c90c05cSAndroid Build Coastguard Worker }  // namespace
2793*5c90c05cSAndroid Build Coastguard Worker 
CalculateOptimalEdits(const std::vector<std::string> & left,const std::vector<std::string> & right)2794*5c90c05cSAndroid Build Coastguard Worker std::vector<EditType> CalculateOptimalEdits(
2795*5c90c05cSAndroid Build Coastguard Worker     const std::vector<std::string>& left,
2796*5c90c05cSAndroid Build Coastguard Worker     const std::vector<std::string>& right) {
2797*5c90c05cSAndroid Build Coastguard Worker   std::vector<size_t> left_ids, right_ids;
2798*5c90c05cSAndroid Build Coastguard Worker   {
2799*5c90c05cSAndroid Build Coastguard Worker     InternalStrings intern_table;
2800*5c90c05cSAndroid Build Coastguard Worker     for (size_t i = 0; i < left.size(); ++i) {
2801*5c90c05cSAndroid Build Coastguard Worker       left_ids.push_back(intern_table.GetId(left[i]));
2802*5c90c05cSAndroid Build Coastguard Worker     }
2803*5c90c05cSAndroid Build Coastguard Worker     for (size_t i = 0; i < right.size(); ++i) {
2804*5c90c05cSAndroid Build Coastguard Worker       right_ids.push_back(intern_table.GetId(right[i]));
2805*5c90c05cSAndroid Build Coastguard Worker     }
2806*5c90c05cSAndroid Build Coastguard Worker   }
2807*5c90c05cSAndroid Build Coastguard Worker   return CalculateOptimalEdits(left_ids, right_ids);
2808*5c90c05cSAndroid Build Coastguard Worker }
2809*5c90c05cSAndroid Build Coastguard Worker 
2810*5c90c05cSAndroid Build Coastguard Worker namespace {
2811*5c90c05cSAndroid Build Coastguard Worker 
2812*5c90c05cSAndroid Build Coastguard Worker // Helper class that holds the state for one hunk and prints it out to the
2813*5c90c05cSAndroid Build Coastguard Worker // stream.
2814*5c90c05cSAndroid Build Coastguard Worker // It reorders adds/removes when possible to group all removes before all
2815*5c90c05cSAndroid Build Coastguard Worker // adds. It also adds the hunk header before printint into the stream.
2816*5c90c05cSAndroid Build Coastguard Worker class Hunk {
2817*5c90c05cSAndroid Build Coastguard Worker  public:
Hunk(size_t left_start,size_t right_start)2818*5c90c05cSAndroid Build Coastguard Worker   Hunk(size_t left_start, size_t right_start)
2819*5c90c05cSAndroid Build Coastguard Worker       : left_start_(left_start),
2820*5c90c05cSAndroid Build Coastguard Worker         right_start_(right_start),
2821*5c90c05cSAndroid Build Coastguard Worker         adds_(),
2822*5c90c05cSAndroid Build Coastguard Worker         removes_(),
2823*5c90c05cSAndroid Build Coastguard Worker         common_() {}
2824*5c90c05cSAndroid Build Coastguard Worker 
PushLine(char edit,const char * line)2825*5c90c05cSAndroid Build Coastguard Worker   void PushLine(char edit, const char* line) {
2826*5c90c05cSAndroid Build Coastguard Worker     switch (edit) {
2827*5c90c05cSAndroid Build Coastguard Worker       case ' ':
2828*5c90c05cSAndroid Build Coastguard Worker         ++common_;
2829*5c90c05cSAndroid Build Coastguard Worker         FlushEdits();
2830*5c90c05cSAndroid Build Coastguard Worker         hunk_.push_back(std::make_pair(' ', line));
2831*5c90c05cSAndroid Build Coastguard Worker         break;
2832*5c90c05cSAndroid Build Coastguard Worker       case '-':
2833*5c90c05cSAndroid Build Coastguard Worker         ++removes_;
2834*5c90c05cSAndroid Build Coastguard Worker         hunk_removes_.push_back(std::make_pair('-', line));
2835*5c90c05cSAndroid Build Coastguard Worker         break;
2836*5c90c05cSAndroid Build Coastguard Worker       case '+':
2837*5c90c05cSAndroid Build Coastguard Worker         ++adds_;
2838*5c90c05cSAndroid Build Coastguard Worker         hunk_adds_.push_back(std::make_pair('+', line));
2839*5c90c05cSAndroid Build Coastguard Worker         break;
2840*5c90c05cSAndroid Build Coastguard Worker     }
2841*5c90c05cSAndroid Build Coastguard Worker   }
2842*5c90c05cSAndroid Build Coastguard Worker 
PrintTo(std::ostream * os)2843*5c90c05cSAndroid Build Coastguard Worker   void PrintTo(std::ostream* os) {
2844*5c90c05cSAndroid Build Coastguard Worker     PrintHeader(os);
2845*5c90c05cSAndroid Build Coastguard Worker     FlushEdits();
2846*5c90c05cSAndroid Build Coastguard Worker     for (std::list<std::pair<char, const char*> >::const_iterator it =
2847*5c90c05cSAndroid Build Coastguard Worker              hunk_.begin();
2848*5c90c05cSAndroid Build Coastguard Worker          it != hunk_.end(); ++it) {
2849*5c90c05cSAndroid Build Coastguard Worker       *os << it->first << it->second << "\n";
2850*5c90c05cSAndroid Build Coastguard Worker     }
2851*5c90c05cSAndroid Build Coastguard Worker   }
2852*5c90c05cSAndroid Build Coastguard Worker 
has_edits() const2853*5c90c05cSAndroid Build Coastguard Worker   bool has_edits() const { return adds_ || removes_; }
2854*5c90c05cSAndroid Build Coastguard Worker 
2855*5c90c05cSAndroid Build Coastguard Worker  private:
FlushEdits()2856*5c90c05cSAndroid Build Coastguard Worker   void FlushEdits() {
2857*5c90c05cSAndroid Build Coastguard Worker     hunk_.splice(hunk_.end(), hunk_removes_);
2858*5c90c05cSAndroid Build Coastguard Worker     hunk_.splice(hunk_.end(), hunk_adds_);
2859*5c90c05cSAndroid Build Coastguard Worker   }
2860*5c90c05cSAndroid Build Coastguard Worker 
2861*5c90c05cSAndroid Build Coastguard Worker   // Print a unified diff header for one hunk.
2862*5c90c05cSAndroid Build Coastguard Worker   // The format is
2863*5c90c05cSAndroid Build Coastguard Worker   //   "@@ -<left_start>,<left_length> +<right_start>,<right_length> @@"
2864*5c90c05cSAndroid Build Coastguard Worker   // where the left/right parts are omitted if unnecessary.
PrintHeader(std::ostream * ss) const2865*5c90c05cSAndroid Build Coastguard Worker   void PrintHeader(std::ostream* ss) const {
2866*5c90c05cSAndroid Build Coastguard Worker     *ss << "@@ ";
2867*5c90c05cSAndroid Build Coastguard Worker     if (removes_) {
2868*5c90c05cSAndroid Build Coastguard Worker       *ss << "-" << left_start_ << "," << (removes_ + common_);
2869*5c90c05cSAndroid Build Coastguard Worker     }
2870*5c90c05cSAndroid Build Coastguard Worker     if (removes_ && adds_) {
2871*5c90c05cSAndroid Build Coastguard Worker       *ss << " ";
2872*5c90c05cSAndroid Build Coastguard Worker     }
2873*5c90c05cSAndroid Build Coastguard Worker     if (adds_) {
2874*5c90c05cSAndroid Build Coastguard Worker       *ss << "+" << right_start_ << "," << (adds_ + common_);
2875*5c90c05cSAndroid Build Coastguard Worker     }
2876*5c90c05cSAndroid Build Coastguard Worker     *ss << " @@\n";
2877*5c90c05cSAndroid Build Coastguard Worker   }
2878*5c90c05cSAndroid Build Coastguard Worker 
2879*5c90c05cSAndroid Build Coastguard Worker   size_t left_start_, right_start_;
2880*5c90c05cSAndroid Build Coastguard Worker   size_t adds_, removes_, common_;
2881*5c90c05cSAndroid Build Coastguard Worker   std::list<std::pair<char, const char*> > hunk_, hunk_adds_, hunk_removes_;
2882*5c90c05cSAndroid Build Coastguard Worker };
2883*5c90c05cSAndroid Build Coastguard Worker 
2884*5c90c05cSAndroid Build Coastguard Worker }  // namespace
2885*5c90c05cSAndroid Build Coastguard Worker 
2886*5c90c05cSAndroid Build Coastguard Worker // Create a list of diff hunks in Unified diff format.
2887*5c90c05cSAndroid Build Coastguard Worker // Each hunk has a header generated by PrintHeader above plus a body with
2888*5c90c05cSAndroid Build Coastguard Worker // lines prefixed with ' ' for no change, '-' for deletion and '+' for
2889*5c90c05cSAndroid Build Coastguard Worker // addition.
2890*5c90c05cSAndroid Build Coastguard Worker // 'context' represents the desired unchanged prefix/suffix around the diff.
2891*5c90c05cSAndroid Build Coastguard Worker // If two hunks are close enough that their contexts overlap, then they are
2892*5c90c05cSAndroid Build Coastguard Worker // joined into one hunk.
CreateUnifiedDiff(const std::vector<std::string> & left,const std::vector<std::string> & right,size_t context)2893*5c90c05cSAndroid Build Coastguard Worker std::string CreateUnifiedDiff(const std::vector<std::string>& left,
2894*5c90c05cSAndroid Build Coastguard Worker                               const std::vector<std::string>& right,
2895*5c90c05cSAndroid Build Coastguard Worker                               size_t context) {
2896*5c90c05cSAndroid Build Coastguard Worker   const std::vector<EditType> edits = CalculateOptimalEdits(left, right);
2897*5c90c05cSAndroid Build Coastguard Worker 
2898*5c90c05cSAndroid Build Coastguard Worker   size_t l_i = 0, r_i = 0, edit_i = 0;
2899*5c90c05cSAndroid Build Coastguard Worker   std::stringstream ss;
2900*5c90c05cSAndroid Build Coastguard Worker   while (edit_i < edits.size()) {
2901*5c90c05cSAndroid Build Coastguard Worker     // Find first edit.
2902*5c90c05cSAndroid Build Coastguard Worker     while (edit_i < edits.size() && edits[edit_i] == kMatch) {
2903*5c90c05cSAndroid Build Coastguard Worker       ++l_i;
2904*5c90c05cSAndroid Build Coastguard Worker       ++r_i;
2905*5c90c05cSAndroid Build Coastguard Worker       ++edit_i;
2906*5c90c05cSAndroid Build Coastguard Worker     }
2907*5c90c05cSAndroid Build Coastguard Worker 
2908*5c90c05cSAndroid Build Coastguard Worker     // Find the first line to include in the hunk.
2909*5c90c05cSAndroid Build Coastguard Worker     const size_t prefix_context = std::min(l_i, context);
2910*5c90c05cSAndroid Build Coastguard Worker     Hunk hunk(l_i - prefix_context + 1, r_i - prefix_context + 1);
2911*5c90c05cSAndroid Build Coastguard Worker     for (size_t i = prefix_context; i > 0; --i) {
2912*5c90c05cSAndroid Build Coastguard Worker       hunk.PushLine(' ', left[l_i - i].c_str());
2913*5c90c05cSAndroid Build Coastguard Worker     }
2914*5c90c05cSAndroid Build Coastguard Worker 
2915*5c90c05cSAndroid Build Coastguard Worker     // Iterate the edits until we found enough suffix for the hunk or the input
2916*5c90c05cSAndroid Build Coastguard Worker     // is over.
2917*5c90c05cSAndroid Build Coastguard Worker     size_t n_suffix = 0;
2918*5c90c05cSAndroid Build Coastguard Worker     for (; edit_i < edits.size(); ++edit_i) {
2919*5c90c05cSAndroid Build Coastguard Worker       if (n_suffix >= context) {
2920*5c90c05cSAndroid Build Coastguard Worker         // Continue only if the next hunk is very close.
2921*5c90c05cSAndroid Build Coastguard Worker         auto it = edits.begin() + static_cast<int>(edit_i);
2922*5c90c05cSAndroid Build Coastguard Worker         while (it != edits.end() && *it == kMatch) ++it;
2923*5c90c05cSAndroid Build Coastguard Worker         if (it == edits.end() ||
2924*5c90c05cSAndroid Build Coastguard Worker             static_cast<size_t>(it - edits.begin()) - edit_i >= context) {
2925*5c90c05cSAndroid Build Coastguard Worker           // There is no next edit or it is too far away.
2926*5c90c05cSAndroid Build Coastguard Worker           break;
2927*5c90c05cSAndroid Build Coastguard Worker         }
2928*5c90c05cSAndroid Build Coastguard Worker       }
2929*5c90c05cSAndroid Build Coastguard Worker 
2930*5c90c05cSAndroid Build Coastguard Worker       EditType edit = edits[edit_i];
2931*5c90c05cSAndroid Build Coastguard Worker       // Reset count when a non match is found.
2932*5c90c05cSAndroid Build Coastguard Worker       n_suffix = edit == kMatch ? n_suffix + 1 : 0;
2933*5c90c05cSAndroid Build Coastguard Worker 
2934*5c90c05cSAndroid Build Coastguard Worker       if (edit == kMatch || edit == kRemove || edit == kReplace) {
2935*5c90c05cSAndroid Build Coastguard Worker         hunk.PushLine(edit == kMatch ? ' ' : '-', left[l_i].c_str());
2936*5c90c05cSAndroid Build Coastguard Worker       }
2937*5c90c05cSAndroid Build Coastguard Worker       if (edit == kAdd || edit == kReplace) {
2938*5c90c05cSAndroid Build Coastguard Worker         hunk.PushLine('+', right[r_i].c_str());
2939*5c90c05cSAndroid Build Coastguard Worker       }
2940*5c90c05cSAndroid Build Coastguard Worker 
2941*5c90c05cSAndroid Build Coastguard Worker       // Advance indices, depending on edit type.
2942*5c90c05cSAndroid Build Coastguard Worker       l_i += edit != kAdd;
2943*5c90c05cSAndroid Build Coastguard Worker       r_i += edit != kRemove;
2944*5c90c05cSAndroid Build Coastguard Worker     }
2945*5c90c05cSAndroid Build Coastguard Worker 
2946*5c90c05cSAndroid Build Coastguard Worker     if (!hunk.has_edits()) {
2947*5c90c05cSAndroid Build Coastguard Worker       // We are done. We don't want this hunk.
2948*5c90c05cSAndroid Build Coastguard Worker       break;
2949*5c90c05cSAndroid Build Coastguard Worker     }
2950*5c90c05cSAndroid Build Coastguard Worker 
2951*5c90c05cSAndroid Build Coastguard Worker     hunk.PrintTo(&ss);
2952*5c90c05cSAndroid Build Coastguard Worker   }
2953*5c90c05cSAndroid Build Coastguard Worker   return ss.str();
2954*5c90c05cSAndroid Build Coastguard Worker }
2955*5c90c05cSAndroid Build Coastguard Worker 
2956*5c90c05cSAndroid Build Coastguard Worker }  // namespace edit_distance
2957*5c90c05cSAndroid Build Coastguard Worker 
2958*5c90c05cSAndroid Build Coastguard Worker namespace {
2959*5c90c05cSAndroid Build Coastguard Worker 
2960*5c90c05cSAndroid Build Coastguard Worker // The string representation of the values received in EqFailure() are already
2961*5c90c05cSAndroid Build Coastguard Worker // escaped. Split them on escaped '\n' boundaries. Leave all other escaped
2962*5c90c05cSAndroid Build Coastguard Worker // characters the same.
SplitEscapedString(const std::string & str)2963*5c90c05cSAndroid Build Coastguard Worker std::vector<std::string> SplitEscapedString(const std::string& str) {
2964*5c90c05cSAndroid Build Coastguard Worker   std::vector<std::string> lines;
2965*5c90c05cSAndroid Build Coastguard Worker   size_t start = 0, end = str.size();
2966*5c90c05cSAndroid Build Coastguard Worker   if (end > 2 && str[0] == '"' && str[end - 1] == '"') {
2967*5c90c05cSAndroid Build Coastguard Worker     ++start;
2968*5c90c05cSAndroid Build Coastguard Worker     --end;
2969*5c90c05cSAndroid Build Coastguard Worker   }
2970*5c90c05cSAndroid Build Coastguard Worker   bool escaped = false;
2971*5c90c05cSAndroid Build Coastguard Worker   for (size_t i = start; i + 1 < end; ++i) {
2972*5c90c05cSAndroid Build Coastguard Worker     if (escaped) {
2973*5c90c05cSAndroid Build Coastguard Worker       escaped = false;
2974*5c90c05cSAndroid Build Coastguard Worker       if (str[i] == 'n') {
2975*5c90c05cSAndroid Build Coastguard Worker         lines.push_back(str.substr(start, i - start - 1));
2976*5c90c05cSAndroid Build Coastguard Worker         start = i + 1;
2977*5c90c05cSAndroid Build Coastguard Worker       }
2978*5c90c05cSAndroid Build Coastguard Worker     } else {
2979*5c90c05cSAndroid Build Coastguard Worker       escaped = str[i] == '\\';
2980*5c90c05cSAndroid Build Coastguard Worker     }
2981*5c90c05cSAndroid Build Coastguard Worker   }
2982*5c90c05cSAndroid Build Coastguard Worker   lines.push_back(str.substr(start, end - start));
2983*5c90c05cSAndroid Build Coastguard Worker   return lines;
2984*5c90c05cSAndroid Build Coastguard Worker }
2985*5c90c05cSAndroid Build Coastguard Worker 
2986*5c90c05cSAndroid Build Coastguard Worker }  // namespace
2987*5c90c05cSAndroid Build Coastguard Worker 
2988*5c90c05cSAndroid Build Coastguard Worker // Constructs and returns the message for an equality assertion
2989*5c90c05cSAndroid Build Coastguard Worker // (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
2990*5c90c05cSAndroid Build Coastguard Worker //
2991*5c90c05cSAndroid Build Coastguard Worker // The first four parameters are the expressions used in the assertion
2992*5c90c05cSAndroid Build Coastguard Worker // and their values, as strings.  For example, for ASSERT_EQ(foo, bar)
2993*5c90c05cSAndroid Build Coastguard Worker // where foo is 5 and bar is 6, we have:
2994*5c90c05cSAndroid Build Coastguard Worker //
2995*5c90c05cSAndroid Build Coastguard Worker //   lhs_expression: "foo"
2996*5c90c05cSAndroid Build Coastguard Worker //   rhs_expression: "bar"
2997*5c90c05cSAndroid Build Coastguard Worker //   lhs_value:      "5"
2998*5c90c05cSAndroid Build Coastguard Worker //   rhs_value:      "6"
2999*5c90c05cSAndroid Build Coastguard Worker //
3000*5c90c05cSAndroid Build Coastguard Worker // The ignoring_case parameter is true if and only if the assertion is a
3001*5c90c05cSAndroid Build Coastguard Worker // *_STRCASEEQ*.  When it's true, the string "Ignoring case" will
3002*5c90c05cSAndroid Build Coastguard Worker // be inserted into the message.
EqFailure(const char * lhs_expression,const char * rhs_expression,const std::string & lhs_value,const std::string & rhs_value,bool ignoring_case)3003*5c90c05cSAndroid Build Coastguard Worker AssertionResult EqFailure(const char* lhs_expression,
3004*5c90c05cSAndroid Build Coastguard Worker                           const char* rhs_expression,
3005*5c90c05cSAndroid Build Coastguard Worker                           const std::string& lhs_value,
3006*5c90c05cSAndroid Build Coastguard Worker                           const std::string& rhs_value,
3007*5c90c05cSAndroid Build Coastguard Worker                           bool ignoring_case) {
3008*5c90c05cSAndroid Build Coastguard Worker   Message msg;
3009*5c90c05cSAndroid Build Coastguard Worker   msg << "Expected equality of these values:";
3010*5c90c05cSAndroid Build Coastguard Worker   msg << "\n  " << lhs_expression;
3011*5c90c05cSAndroid Build Coastguard Worker   if (lhs_value != lhs_expression) {
3012*5c90c05cSAndroid Build Coastguard Worker     msg << "\n    Which is: " << lhs_value;
3013*5c90c05cSAndroid Build Coastguard Worker   }
3014*5c90c05cSAndroid Build Coastguard Worker   msg << "\n  " << rhs_expression;
3015*5c90c05cSAndroid Build Coastguard Worker   if (rhs_value != rhs_expression) {
3016*5c90c05cSAndroid Build Coastguard Worker     msg << "\n    Which is: " << rhs_value;
3017*5c90c05cSAndroid Build Coastguard Worker   }
3018*5c90c05cSAndroid Build Coastguard Worker 
3019*5c90c05cSAndroid Build Coastguard Worker   if (ignoring_case) {
3020*5c90c05cSAndroid Build Coastguard Worker     msg << "\nIgnoring case";
3021*5c90c05cSAndroid Build Coastguard Worker   }
3022*5c90c05cSAndroid Build Coastguard Worker 
3023*5c90c05cSAndroid Build Coastguard Worker   if (!lhs_value.empty() && !rhs_value.empty()) {
3024*5c90c05cSAndroid Build Coastguard Worker     const std::vector<std::string> lhs_lines =
3025*5c90c05cSAndroid Build Coastguard Worker         SplitEscapedString(lhs_value);
3026*5c90c05cSAndroid Build Coastguard Worker     const std::vector<std::string> rhs_lines =
3027*5c90c05cSAndroid Build Coastguard Worker         SplitEscapedString(rhs_value);
3028*5c90c05cSAndroid Build Coastguard Worker     if (lhs_lines.size() > 1 || rhs_lines.size() > 1) {
3029*5c90c05cSAndroid Build Coastguard Worker       msg << "\nWith diff:\n"
3030*5c90c05cSAndroid Build Coastguard Worker           << edit_distance::CreateUnifiedDiff(lhs_lines, rhs_lines);
3031*5c90c05cSAndroid Build Coastguard Worker     }
3032*5c90c05cSAndroid Build Coastguard Worker   }
3033*5c90c05cSAndroid Build Coastguard Worker 
3034*5c90c05cSAndroid Build Coastguard Worker   return AssertionFailure() << msg;
3035*5c90c05cSAndroid Build Coastguard Worker }
3036*5c90c05cSAndroid Build Coastguard Worker 
3037*5c90c05cSAndroid Build Coastguard Worker // Constructs a failure message for Boolean assertions such as EXPECT_TRUE.
GetBoolAssertionFailureMessage(const AssertionResult & assertion_result,const char * expression_text,const char * actual_predicate_value,const char * expected_predicate_value)3038*5c90c05cSAndroid Build Coastguard Worker std::string GetBoolAssertionFailureMessage(
3039*5c90c05cSAndroid Build Coastguard Worker     const AssertionResult& assertion_result,
3040*5c90c05cSAndroid Build Coastguard Worker     const char* expression_text,
3041*5c90c05cSAndroid Build Coastguard Worker     const char* actual_predicate_value,
3042*5c90c05cSAndroid Build Coastguard Worker     const char* expected_predicate_value) {
3043*5c90c05cSAndroid Build Coastguard Worker   const char* actual_message = assertion_result.message();
3044*5c90c05cSAndroid Build Coastguard Worker   Message msg;
3045*5c90c05cSAndroid Build Coastguard Worker   msg << "Value of: " << expression_text
3046*5c90c05cSAndroid Build Coastguard Worker       << "\n  Actual: " << actual_predicate_value;
3047*5c90c05cSAndroid Build Coastguard Worker   if (actual_message[0] != '\0')
3048*5c90c05cSAndroid Build Coastguard Worker     msg << " (" << actual_message << ")";
3049*5c90c05cSAndroid Build Coastguard Worker   msg << "\nExpected: " << expected_predicate_value;
3050*5c90c05cSAndroid Build Coastguard Worker   return msg.GetString();
3051*5c90c05cSAndroid Build Coastguard Worker }
3052*5c90c05cSAndroid Build Coastguard Worker 
3053*5c90c05cSAndroid Build Coastguard Worker // Helper function for implementing ASSERT_NEAR.
DoubleNearPredFormat(const char * expr1,const char * expr2,const char * abs_error_expr,double val1,double val2,double abs_error)3054*5c90c05cSAndroid Build Coastguard Worker AssertionResult DoubleNearPredFormat(const char* expr1,
3055*5c90c05cSAndroid Build Coastguard Worker                                      const char* expr2,
3056*5c90c05cSAndroid Build Coastguard Worker                                      const char* abs_error_expr,
3057*5c90c05cSAndroid Build Coastguard Worker                                      double val1,
3058*5c90c05cSAndroid Build Coastguard Worker                                      double val2,
3059*5c90c05cSAndroid Build Coastguard Worker                                      double abs_error) {
3060*5c90c05cSAndroid Build Coastguard Worker   const double diff = fabs(val1 - val2);
3061*5c90c05cSAndroid Build Coastguard Worker   if (diff <= abs_error) return AssertionSuccess();
3062*5c90c05cSAndroid Build Coastguard Worker 
3063*5c90c05cSAndroid Build Coastguard Worker   // Find the value which is closest to zero.
3064*5c90c05cSAndroid Build Coastguard Worker   const double min_abs = std::min(fabs(val1), fabs(val2));
3065*5c90c05cSAndroid Build Coastguard Worker   // Find the distance to the next double from that value.
3066*5c90c05cSAndroid Build Coastguard Worker   const double epsilon =
3067*5c90c05cSAndroid Build Coastguard Worker       nextafter(min_abs, std::numeric_limits<double>::infinity()) - min_abs;
3068*5c90c05cSAndroid Build Coastguard Worker   // Detect the case where abs_error is so small that EXPECT_NEAR is
3069*5c90c05cSAndroid Build Coastguard Worker   // effectively the same as EXPECT_EQUAL, and give an informative error
3070*5c90c05cSAndroid Build Coastguard Worker   // message so that the situation can be more easily understood without
3071*5c90c05cSAndroid Build Coastguard Worker   // requiring exotic floating-point knowledge.
3072*5c90c05cSAndroid Build Coastguard Worker   // Don't do an epsilon check if abs_error is zero because that implies
3073*5c90c05cSAndroid Build Coastguard Worker   // that an equality check was actually intended.
3074*5c90c05cSAndroid Build Coastguard Worker   if (!(std::isnan)(val1) && !(std::isnan)(val2) && abs_error > 0 &&
3075*5c90c05cSAndroid Build Coastguard Worker       abs_error < epsilon) {
3076*5c90c05cSAndroid Build Coastguard Worker     return AssertionFailure()
3077*5c90c05cSAndroid Build Coastguard Worker            << "The difference between " << expr1 << " and " << expr2 << " is "
3078*5c90c05cSAndroid Build Coastguard Worker            << diff << ", where\n"
3079*5c90c05cSAndroid Build Coastguard Worker            << expr1 << " evaluates to " << val1 << ",\n"
3080*5c90c05cSAndroid Build Coastguard Worker            << expr2 << " evaluates to " << val2 << ".\nThe abs_error parameter "
3081*5c90c05cSAndroid Build Coastguard Worker            << abs_error_expr << " evaluates to " << abs_error
3082*5c90c05cSAndroid Build Coastguard Worker            << " which is smaller than the minimum distance between doubles for "
3083*5c90c05cSAndroid Build Coastguard Worker               "numbers of this magnitude which is "
3084*5c90c05cSAndroid Build Coastguard Worker            << epsilon
3085*5c90c05cSAndroid Build Coastguard Worker            << ", thus making this EXPECT_NEAR check equivalent to "
3086*5c90c05cSAndroid Build Coastguard Worker               "EXPECT_EQUAL. Consider using EXPECT_DOUBLE_EQ instead.";
3087*5c90c05cSAndroid Build Coastguard Worker   }
3088*5c90c05cSAndroid Build Coastguard Worker   return AssertionFailure()
3089*5c90c05cSAndroid Build Coastguard Worker       << "The difference between " << expr1 << " and " << expr2
3090*5c90c05cSAndroid Build Coastguard Worker       << " is " << diff << ", which exceeds " << abs_error_expr << ", where\n"
3091*5c90c05cSAndroid Build Coastguard Worker       << expr1 << " evaluates to " << val1 << ",\n"
3092*5c90c05cSAndroid Build Coastguard Worker       << expr2 << " evaluates to " << val2 << ", and\n"
3093*5c90c05cSAndroid Build Coastguard Worker       << abs_error_expr << " evaluates to " << abs_error << ".";
3094*5c90c05cSAndroid Build Coastguard Worker }
3095*5c90c05cSAndroid Build Coastguard Worker 
3096*5c90c05cSAndroid Build Coastguard Worker 
3097*5c90c05cSAndroid Build Coastguard Worker // Helper template for implementing FloatLE() and DoubleLE().
3098*5c90c05cSAndroid Build Coastguard Worker template <typename RawType>
FloatingPointLE(const char * expr1,const char * expr2,RawType val1,RawType val2)3099*5c90c05cSAndroid Build Coastguard Worker AssertionResult FloatingPointLE(const char* expr1,
3100*5c90c05cSAndroid Build Coastguard Worker                                 const char* expr2,
3101*5c90c05cSAndroid Build Coastguard Worker                                 RawType val1,
3102*5c90c05cSAndroid Build Coastguard Worker                                 RawType val2) {
3103*5c90c05cSAndroid Build Coastguard Worker   // Returns success if val1 is less than val2,
3104*5c90c05cSAndroid Build Coastguard Worker   if (val1 < val2) {
3105*5c90c05cSAndroid Build Coastguard Worker     return AssertionSuccess();
3106*5c90c05cSAndroid Build Coastguard Worker   }
3107*5c90c05cSAndroid Build Coastguard Worker 
3108*5c90c05cSAndroid Build Coastguard Worker   // or if val1 is almost equal to val2.
3109*5c90c05cSAndroid Build Coastguard Worker   const FloatingPoint<RawType> lhs(val1), rhs(val2);
3110*5c90c05cSAndroid Build Coastguard Worker   if (lhs.AlmostEquals(rhs)) {
3111*5c90c05cSAndroid Build Coastguard Worker     return AssertionSuccess();
3112*5c90c05cSAndroid Build Coastguard Worker   }
3113*5c90c05cSAndroid Build Coastguard Worker 
3114*5c90c05cSAndroid Build Coastguard Worker   // Note that the above two checks will both fail if either val1 or
3115*5c90c05cSAndroid Build Coastguard Worker   // val2 is NaN, as the IEEE floating-point standard requires that
3116*5c90c05cSAndroid Build Coastguard Worker   // any predicate involving a NaN must return false.
3117*5c90c05cSAndroid Build Coastguard Worker 
3118*5c90c05cSAndroid Build Coastguard Worker   ::std::stringstream val1_ss;
3119*5c90c05cSAndroid Build Coastguard Worker   val1_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
3120*5c90c05cSAndroid Build Coastguard Worker           << val1;
3121*5c90c05cSAndroid Build Coastguard Worker 
3122*5c90c05cSAndroid Build Coastguard Worker   ::std::stringstream val2_ss;
3123*5c90c05cSAndroid Build Coastguard Worker   val2_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
3124*5c90c05cSAndroid Build Coastguard Worker           << val2;
3125*5c90c05cSAndroid Build Coastguard Worker 
3126*5c90c05cSAndroid Build Coastguard Worker   return AssertionFailure()
3127*5c90c05cSAndroid Build Coastguard Worker       << "Expected: (" << expr1 << ") <= (" << expr2 << ")\n"
3128*5c90c05cSAndroid Build Coastguard Worker       << "  Actual: " << StringStreamToString(&val1_ss) << " vs "
3129*5c90c05cSAndroid Build Coastguard Worker       << StringStreamToString(&val2_ss);
3130*5c90c05cSAndroid Build Coastguard Worker }
3131*5c90c05cSAndroid Build Coastguard Worker 
3132*5c90c05cSAndroid Build Coastguard Worker }  // namespace internal
3133*5c90c05cSAndroid Build Coastguard Worker 
3134*5c90c05cSAndroid Build Coastguard Worker // Asserts that val1 is less than, or almost equal to, val2.  Fails
3135*5c90c05cSAndroid Build Coastguard Worker // otherwise.  In particular, it fails if either val1 or val2 is NaN.
FloatLE(const char * expr1,const char * expr2,float val1,float val2)3136*5c90c05cSAndroid Build Coastguard Worker AssertionResult FloatLE(const char* expr1, const char* expr2,
3137*5c90c05cSAndroid Build Coastguard Worker                         float val1, float val2) {
3138*5c90c05cSAndroid Build Coastguard Worker   return internal::FloatingPointLE<float>(expr1, expr2, val1, val2);
3139*5c90c05cSAndroid Build Coastguard Worker }
3140*5c90c05cSAndroid Build Coastguard Worker 
3141*5c90c05cSAndroid Build Coastguard Worker // Asserts that val1 is less than, or almost equal to, val2.  Fails
3142*5c90c05cSAndroid Build Coastguard Worker // otherwise.  In particular, it fails if either val1 or val2 is NaN.
DoubleLE(const char * expr1,const char * expr2,double val1,double val2)3143*5c90c05cSAndroid Build Coastguard Worker AssertionResult DoubleLE(const char* expr1, const char* expr2,
3144*5c90c05cSAndroid Build Coastguard Worker                          double val1, double val2) {
3145*5c90c05cSAndroid Build Coastguard Worker   return internal::FloatingPointLE<double>(expr1, expr2, val1, val2);
3146*5c90c05cSAndroid Build Coastguard Worker }
3147*5c90c05cSAndroid Build Coastguard Worker 
3148*5c90c05cSAndroid Build Coastguard Worker namespace internal {
3149*5c90c05cSAndroid Build Coastguard Worker 
3150*5c90c05cSAndroid Build Coastguard Worker // The helper function for {ASSERT|EXPECT}_STREQ.
CmpHelperSTREQ(const char * lhs_expression,const char * rhs_expression,const char * lhs,const char * rhs)3151*5c90c05cSAndroid Build Coastguard Worker AssertionResult CmpHelperSTREQ(const char* lhs_expression,
3152*5c90c05cSAndroid Build Coastguard Worker                                const char* rhs_expression,
3153*5c90c05cSAndroid Build Coastguard Worker                                const char* lhs,
3154*5c90c05cSAndroid Build Coastguard Worker                                const char* rhs) {
3155*5c90c05cSAndroid Build Coastguard Worker   if (String::CStringEquals(lhs, rhs)) {
3156*5c90c05cSAndroid Build Coastguard Worker     return AssertionSuccess();
3157*5c90c05cSAndroid Build Coastguard Worker   }
3158*5c90c05cSAndroid Build Coastguard Worker 
3159*5c90c05cSAndroid Build Coastguard Worker   return EqFailure(lhs_expression,
3160*5c90c05cSAndroid Build Coastguard Worker                    rhs_expression,
3161*5c90c05cSAndroid Build Coastguard Worker                    PrintToString(lhs),
3162*5c90c05cSAndroid Build Coastguard Worker                    PrintToString(rhs),
3163*5c90c05cSAndroid Build Coastguard Worker                    false);
3164*5c90c05cSAndroid Build Coastguard Worker }
3165*5c90c05cSAndroid Build Coastguard Worker 
3166*5c90c05cSAndroid Build Coastguard Worker // The helper function for {ASSERT|EXPECT}_STRCASEEQ.
CmpHelperSTRCASEEQ(const char * lhs_expression,const char * rhs_expression,const char * lhs,const char * rhs)3167*5c90c05cSAndroid Build Coastguard Worker AssertionResult CmpHelperSTRCASEEQ(const char* lhs_expression,
3168*5c90c05cSAndroid Build Coastguard Worker                                    const char* rhs_expression,
3169*5c90c05cSAndroid Build Coastguard Worker                                    const char* lhs,
3170*5c90c05cSAndroid Build Coastguard Worker                                    const char* rhs) {
3171*5c90c05cSAndroid Build Coastguard Worker   if (String::CaseInsensitiveCStringEquals(lhs, rhs)) {
3172*5c90c05cSAndroid Build Coastguard Worker     return AssertionSuccess();
3173*5c90c05cSAndroid Build Coastguard Worker   }
3174*5c90c05cSAndroid Build Coastguard Worker 
3175*5c90c05cSAndroid Build Coastguard Worker   return EqFailure(lhs_expression,
3176*5c90c05cSAndroid Build Coastguard Worker                    rhs_expression,
3177*5c90c05cSAndroid Build Coastguard Worker                    PrintToString(lhs),
3178*5c90c05cSAndroid Build Coastguard Worker                    PrintToString(rhs),
3179*5c90c05cSAndroid Build Coastguard Worker                    true);
3180*5c90c05cSAndroid Build Coastguard Worker }
3181*5c90c05cSAndroid Build Coastguard Worker 
3182*5c90c05cSAndroid Build Coastguard Worker // The helper function for {ASSERT|EXPECT}_STRNE.
CmpHelperSTRNE(const char * s1_expression,const char * s2_expression,const char * s1,const char * s2)3183*5c90c05cSAndroid Build Coastguard Worker AssertionResult CmpHelperSTRNE(const char* s1_expression,
3184*5c90c05cSAndroid Build Coastguard Worker                                const char* s2_expression,
3185*5c90c05cSAndroid Build Coastguard Worker                                const char* s1,
3186*5c90c05cSAndroid Build Coastguard Worker                                const char* s2) {
3187*5c90c05cSAndroid Build Coastguard Worker   if (!String::CStringEquals(s1, s2)) {
3188*5c90c05cSAndroid Build Coastguard Worker     return AssertionSuccess();
3189*5c90c05cSAndroid Build Coastguard Worker   } else {
3190*5c90c05cSAndroid Build Coastguard Worker     return AssertionFailure() << "Expected: (" << s1_expression << ") != ("
3191*5c90c05cSAndroid Build Coastguard Worker                               << s2_expression << "), actual: \""
3192*5c90c05cSAndroid Build Coastguard Worker                               << s1 << "\" vs \"" << s2 << "\"";
3193*5c90c05cSAndroid Build Coastguard Worker   }
3194*5c90c05cSAndroid Build Coastguard Worker }
3195*5c90c05cSAndroid Build Coastguard Worker 
3196*5c90c05cSAndroid Build Coastguard Worker // The helper function for {ASSERT|EXPECT}_STRCASENE.
CmpHelperSTRCASENE(const char * s1_expression,const char * s2_expression,const char * s1,const char * s2)3197*5c90c05cSAndroid Build Coastguard Worker AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
3198*5c90c05cSAndroid Build Coastguard Worker                                    const char* s2_expression,
3199*5c90c05cSAndroid Build Coastguard Worker                                    const char* s1,
3200*5c90c05cSAndroid Build Coastguard Worker                                    const char* s2) {
3201*5c90c05cSAndroid Build Coastguard Worker   if (!String::CaseInsensitiveCStringEquals(s1, s2)) {
3202*5c90c05cSAndroid Build Coastguard Worker     return AssertionSuccess();
3203*5c90c05cSAndroid Build Coastguard Worker   } else {
3204*5c90c05cSAndroid Build Coastguard Worker     return AssertionFailure()
3205*5c90c05cSAndroid Build Coastguard Worker         << "Expected: (" << s1_expression << ") != ("
3206*5c90c05cSAndroid Build Coastguard Worker         << s2_expression << ") (ignoring case), actual: \""
3207*5c90c05cSAndroid Build Coastguard Worker         << s1 << "\" vs \"" << s2 << "\"";
3208*5c90c05cSAndroid Build Coastguard Worker   }
3209*5c90c05cSAndroid Build Coastguard Worker }
3210*5c90c05cSAndroid Build Coastguard Worker 
3211*5c90c05cSAndroid Build Coastguard Worker }  // namespace internal
3212*5c90c05cSAndroid Build Coastguard Worker 
3213*5c90c05cSAndroid Build Coastguard Worker namespace {
3214*5c90c05cSAndroid Build Coastguard Worker 
3215*5c90c05cSAndroid Build Coastguard Worker // Helper functions for implementing IsSubString() and IsNotSubstring().
3216*5c90c05cSAndroid Build Coastguard Worker 
3217*5c90c05cSAndroid Build Coastguard Worker // This group of overloaded functions return true if and only if needle
3218*5c90c05cSAndroid Build Coastguard Worker // is a substring of haystack.  NULL is considered a substring of
3219*5c90c05cSAndroid Build Coastguard Worker // itself only.
3220*5c90c05cSAndroid Build Coastguard Worker 
IsSubstringPred(const char * needle,const char * haystack)3221*5c90c05cSAndroid Build Coastguard Worker bool IsSubstringPred(const char* needle, const char* haystack) {
3222*5c90c05cSAndroid Build Coastguard Worker   if (needle == nullptr || haystack == nullptr) return needle == haystack;
3223*5c90c05cSAndroid Build Coastguard Worker 
3224*5c90c05cSAndroid Build Coastguard Worker   return strstr(haystack, needle) != nullptr;
3225*5c90c05cSAndroid Build Coastguard Worker }
3226*5c90c05cSAndroid Build Coastguard Worker 
IsSubstringPred(const wchar_t * needle,const wchar_t * haystack)3227*5c90c05cSAndroid Build Coastguard Worker bool IsSubstringPred(const wchar_t* needle, const wchar_t* haystack) {
3228*5c90c05cSAndroid Build Coastguard Worker   if (needle == nullptr || haystack == nullptr) return needle == haystack;
3229*5c90c05cSAndroid Build Coastguard Worker 
3230*5c90c05cSAndroid Build Coastguard Worker   return wcsstr(haystack, needle) != nullptr;
3231*5c90c05cSAndroid Build Coastguard Worker }
3232*5c90c05cSAndroid Build Coastguard Worker 
3233*5c90c05cSAndroid Build Coastguard Worker // StringType here can be either ::std::string or ::std::wstring.
3234*5c90c05cSAndroid Build Coastguard Worker template <typename StringType>
IsSubstringPred(const StringType & needle,const StringType & haystack)3235*5c90c05cSAndroid Build Coastguard Worker bool IsSubstringPred(const StringType& needle,
3236*5c90c05cSAndroid Build Coastguard Worker                      const StringType& haystack) {
3237*5c90c05cSAndroid Build Coastguard Worker   return haystack.find(needle) != StringType::npos;
3238*5c90c05cSAndroid Build Coastguard Worker }
3239*5c90c05cSAndroid Build Coastguard Worker 
3240*5c90c05cSAndroid Build Coastguard Worker // This function implements either IsSubstring() or IsNotSubstring(),
3241*5c90c05cSAndroid Build Coastguard Worker // depending on the value of the expected_to_be_substring parameter.
3242*5c90c05cSAndroid Build Coastguard Worker // StringType here can be const char*, const wchar_t*, ::std::string,
3243*5c90c05cSAndroid Build Coastguard Worker // or ::std::wstring.
3244*5c90c05cSAndroid Build Coastguard Worker template <typename StringType>
IsSubstringImpl(bool expected_to_be_substring,const char * needle_expr,const char * haystack_expr,const StringType & needle,const StringType & haystack)3245*5c90c05cSAndroid Build Coastguard Worker AssertionResult IsSubstringImpl(
3246*5c90c05cSAndroid Build Coastguard Worker     bool expected_to_be_substring,
3247*5c90c05cSAndroid Build Coastguard Worker     const char* needle_expr, const char* haystack_expr,
3248*5c90c05cSAndroid Build Coastguard Worker     const StringType& needle, const StringType& haystack) {
3249*5c90c05cSAndroid Build Coastguard Worker   if (IsSubstringPred(needle, haystack) == expected_to_be_substring)
3250*5c90c05cSAndroid Build Coastguard Worker     return AssertionSuccess();
3251*5c90c05cSAndroid Build Coastguard Worker 
3252*5c90c05cSAndroid Build Coastguard Worker   const bool is_wide_string = sizeof(needle[0]) > 1;
3253*5c90c05cSAndroid Build Coastguard Worker   const char* const begin_string_quote = is_wide_string ? "L\"" : "\"";
3254*5c90c05cSAndroid Build Coastguard Worker   return AssertionFailure()
3255*5c90c05cSAndroid Build Coastguard Worker       << "Value of: " << needle_expr << "\n"
3256*5c90c05cSAndroid Build Coastguard Worker       << "  Actual: " << begin_string_quote << needle << "\"\n"
3257*5c90c05cSAndroid Build Coastguard Worker       << "Expected: " << (expected_to_be_substring ? "" : "not ")
3258*5c90c05cSAndroid Build Coastguard Worker       << "a substring of " << haystack_expr << "\n"
3259*5c90c05cSAndroid Build Coastguard Worker       << "Which is: " << begin_string_quote << haystack << "\"";
3260*5c90c05cSAndroid Build Coastguard Worker }
3261*5c90c05cSAndroid Build Coastguard Worker 
3262*5c90c05cSAndroid Build Coastguard Worker }  // namespace
3263*5c90c05cSAndroid Build Coastguard Worker 
3264*5c90c05cSAndroid Build Coastguard Worker // IsSubstring() and IsNotSubstring() check whether needle is a
3265*5c90c05cSAndroid Build Coastguard Worker // substring of haystack (NULL is considered a substring of itself
3266*5c90c05cSAndroid Build Coastguard Worker // only), and return an appropriate error message when they fail.
3267*5c90c05cSAndroid Build Coastguard Worker 
IsSubstring(const char * needle_expr,const char * haystack_expr,const char * needle,const char * haystack)3268*5c90c05cSAndroid Build Coastguard Worker AssertionResult IsSubstring(
3269*5c90c05cSAndroid Build Coastguard Worker     const char* needle_expr, const char* haystack_expr,
3270*5c90c05cSAndroid Build Coastguard Worker     const char* needle, const char* haystack) {
3271*5c90c05cSAndroid Build Coastguard Worker   return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
3272*5c90c05cSAndroid Build Coastguard Worker }
3273*5c90c05cSAndroid Build Coastguard Worker 
IsSubstring(const char * needle_expr,const char * haystack_expr,const wchar_t * needle,const wchar_t * haystack)3274*5c90c05cSAndroid Build Coastguard Worker AssertionResult IsSubstring(
3275*5c90c05cSAndroid Build Coastguard Worker     const char* needle_expr, const char* haystack_expr,
3276*5c90c05cSAndroid Build Coastguard Worker     const wchar_t* needle, const wchar_t* haystack) {
3277*5c90c05cSAndroid Build Coastguard Worker   return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
3278*5c90c05cSAndroid Build Coastguard Worker }
3279*5c90c05cSAndroid Build Coastguard Worker 
IsNotSubstring(const char * needle_expr,const char * haystack_expr,const char * needle,const char * haystack)3280*5c90c05cSAndroid Build Coastguard Worker AssertionResult IsNotSubstring(
3281*5c90c05cSAndroid Build Coastguard Worker     const char* needle_expr, const char* haystack_expr,
3282*5c90c05cSAndroid Build Coastguard Worker     const char* needle, const char* haystack) {
3283*5c90c05cSAndroid Build Coastguard Worker   return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
3284*5c90c05cSAndroid Build Coastguard Worker }
3285*5c90c05cSAndroid Build Coastguard Worker 
IsNotSubstring(const char * needle_expr,const char * haystack_expr,const wchar_t * needle,const wchar_t * haystack)3286*5c90c05cSAndroid Build Coastguard Worker AssertionResult IsNotSubstring(
3287*5c90c05cSAndroid Build Coastguard Worker     const char* needle_expr, const char* haystack_expr,
3288*5c90c05cSAndroid Build Coastguard Worker     const wchar_t* needle, const wchar_t* haystack) {
3289*5c90c05cSAndroid Build Coastguard Worker   return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
3290*5c90c05cSAndroid Build Coastguard Worker }
3291*5c90c05cSAndroid Build Coastguard Worker 
IsSubstring(const char * needle_expr,const char * haystack_expr,const::std::string & needle,const::std::string & haystack)3292*5c90c05cSAndroid Build Coastguard Worker AssertionResult IsSubstring(
3293*5c90c05cSAndroid Build Coastguard Worker     const char* needle_expr, const char* haystack_expr,
3294*5c90c05cSAndroid Build Coastguard Worker     const ::std::string& needle, const ::std::string& haystack) {
3295*5c90c05cSAndroid Build Coastguard Worker   return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
3296*5c90c05cSAndroid Build Coastguard Worker }
3297*5c90c05cSAndroid Build Coastguard Worker 
IsNotSubstring(const char * needle_expr,const char * haystack_expr,const::std::string & needle,const::std::string & haystack)3298*5c90c05cSAndroid Build Coastguard Worker AssertionResult IsNotSubstring(
3299*5c90c05cSAndroid Build Coastguard Worker     const char* needle_expr, const char* haystack_expr,
3300*5c90c05cSAndroid Build Coastguard Worker     const ::std::string& needle, const ::std::string& haystack) {
3301*5c90c05cSAndroid Build Coastguard Worker   return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
3302*5c90c05cSAndroid Build Coastguard Worker }
3303*5c90c05cSAndroid Build Coastguard Worker 
3304*5c90c05cSAndroid Build Coastguard Worker #if GTEST_HAS_STD_WSTRING
IsSubstring(const char * needle_expr,const char * haystack_expr,const::std::wstring & needle,const::std::wstring & haystack)3305*5c90c05cSAndroid Build Coastguard Worker AssertionResult IsSubstring(
3306*5c90c05cSAndroid Build Coastguard Worker     const char* needle_expr, const char* haystack_expr,
3307*5c90c05cSAndroid Build Coastguard Worker     const ::std::wstring& needle, const ::std::wstring& haystack) {
3308*5c90c05cSAndroid Build Coastguard Worker   return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
3309*5c90c05cSAndroid Build Coastguard Worker }
3310*5c90c05cSAndroid Build Coastguard Worker 
IsNotSubstring(const char * needle_expr,const char * haystack_expr,const::std::wstring & needle,const::std::wstring & haystack)3311*5c90c05cSAndroid Build Coastguard Worker AssertionResult IsNotSubstring(
3312*5c90c05cSAndroid Build Coastguard Worker     const char* needle_expr, const char* haystack_expr,
3313*5c90c05cSAndroid Build Coastguard Worker     const ::std::wstring& needle, const ::std::wstring& haystack) {
3314*5c90c05cSAndroid Build Coastguard Worker   return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
3315*5c90c05cSAndroid Build Coastguard Worker }
3316*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_HAS_STD_WSTRING
3317*5c90c05cSAndroid Build Coastguard Worker 
3318*5c90c05cSAndroid Build Coastguard Worker namespace internal {
3319*5c90c05cSAndroid Build Coastguard Worker 
3320*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_WINDOWS
3321*5c90c05cSAndroid Build Coastguard Worker 
3322*5c90c05cSAndroid Build Coastguard Worker namespace {
3323*5c90c05cSAndroid Build Coastguard Worker 
3324*5c90c05cSAndroid Build Coastguard Worker // Helper function for IsHRESULT{SuccessFailure} predicates
HRESULTFailureHelper(const char * expr,const char * expected,long hr)3325*5c90c05cSAndroid Build Coastguard Worker AssertionResult HRESULTFailureHelper(const char* expr,
3326*5c90c05cSAndroid Build Coastguard Worker                                      const char* expected,
3327*5c90c05cSAndroid Build Coastguard Worker                                      long hr) {  // NOLINT
3328*5c90c05cSAndroid Build Coastguard Worker # if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_TV_TITLE
3329*5c90c05cSAndroid Build Coastguard Worker 
3330*5c90c05cSAndroid Build Coastguard Worker   // Windows CE doesn't support FormatMessage.
3331*5c90c05cSAndroid Build Coastguard Worker   const char error_text[] = "";
3332*5c90c05cSAndroid Build Coastguard Worker 
3333*5c90c05cSAndroid Build Coastguard Worker # else
3334*5c90c05cSAndroid Build Coastguard Worker 
3335*5c90c05cSAndroid Build Coastguard Worker   // Looks up the human-readable system message for the HRESULT code
3336*5c90c05cSAndroid Build Coastguard Worker   // and since we're not passing any params to FormatMessage, we don't
3337*5c90c05cSAndroid Build Coastguard Worker   // want inserts expanded.
3338*5c90c05cSAndroid Build Coastguard Worker   const DWORD kFlags = FORMAT_MESSAGE_FROM_SYSTEM |
3339*5c90c05cSAndroid Build Coastguard Worker                        FORMAT_MESSAGE_IGNORE_INSERTS;
3340*5c90c05cSAndroid Build Coastguard Worker   const DWORD kBufSize = 4096;
3341*5c90c05cSAndroid Build Coastguard Worker   // Gets the system's human readable message string for this HRESULT.
3342*5c90c05cSAndroid Build Coastguard Worker   char error_text[kBufSize] = { '\0' };
3343*5c90c05cSAndroid Build Coastguard Worker   DWORD message_length = ::FormatMessageA(kFlags,
3344*5c90c05cSAndroid Build Coastguard Worker                                           0,   // no source, we're asking system
3345*5c90c05cSAndroid Build Coastguard Worker                                           static_cast<DWORD>(hr),  // the error
3346*5c90c05cSAndroid Build Coastguard Worker                                           0,   // no line width restrictions
3347*5c90c05cSAndroid Build Coastguard Worker                                           error_text,  // output buffer
3348*5c90c05cSAndroid Build Coastguard Worker                                           kBufSize,    // buf size
3349*5c90c05cSAndroid Build Coastguard Worker                                           nullptr);  // no arguments for inserts
3350*5c90c05cSAndroid Build Coastguard Worker   // Trims tailing white space (FormatMessage leaves a trailing CR-LF)
3351*5c90c05cSAndroid Build Coastguard Worker   for (; message_length && IsSpace(error_text[message_length - 1]);
3352*5c90c05cSAndroid Build Coastguard Worker           --message_length) {
3353*5c90c05cSAndroid Build Coastguard Worker     error_text[message_length - 1] = '\0';
3354*5c90c05cSAndroid Build Coastguard Worker   }
3355*5c90c05cSAndroid Build Coastguard Worker 
3356*5c90c05cSAndroid Build Coastguard Worker # endif  // GTEST_OS_WINDOWS_MOBILE
3357*5c90c05cSAndroid Build Coastguard Worker 
3358*5c90c05cSAndroid Build Coastguard Worker   const std::string error_hex("0x" + String::FormatHexInt(hr));
3359*5c90c05cSAndroid Build Coastguard Worker   return ::testing::AssertionFailure()
3360*5c90c05cSAndroid Build Coastguard Worker       << "Expected: " << expr << " " << expected << ".\n"
3361*5c90c05cSAndroid Build Coastguard Worker       << "  Actual: " << error_hex << " " << error_text << "\n";
3362*5c90c05cSAndroid Build Coastguard Worker }
3363*5c90c05cSAndroid Build Coastguard Worker 
3364*5c90c05cSAndroid Build Coastguard Worker }  // namespace
3365*5c90c05cSAndroid Build Coastguard Worker 
IsHRESULTSuccess(const char * expr,long hr)3366*5c90c05cSAndroid Build Coastguard Worker AssertionResult IsHRESULTSuccess(const char* expr, long hr) {  // NOLINT
3367*5c90c05cSAndroid Build Coastguard Worker   if (SUCCEEDED(hr)) {
3368*5c90c05cSAndroid Build Coastguard Worker     return AssertionSuccess();
3369*5c90c05cSAndroid Build Coastguard Worker   }
3370*5c90c05cSAndroid Build Coastguard Worker   return HRESULTFailureHelper(expr, "succeeds", hr);
3371*5c90c05cSAndroid Build Coastguard Worker }
3372*5c90c05cSAndroid Build Coastguard Worker 
IsHRESULTFailure(const char * expr,long hr)3373*5c90c05cSAndroid Build Coastguard Worker AssertionResult IsHRESULTFailure(const char* expr, long hr) {  // NOLINT
3374*5c90c05cSAndroid Build Coastguard Worker   if (FAILED(hr)) {
3375*5c90c05cSAndroid Build Coastguard Worker     return AssertionSuccess();
3376*5c90c05cSAndroid Build Coastguard Worker   }
3377*5c90c05cSAndroid Build Coastguard Worker   return HRESULTFailureHelper(expr, "fails", hr);
3378*5c90c05cSAndroid Build Coastguard Worker }
3379*5c90c05cSAndroid Build Coastguard Worker 
3380*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_OS_WINDOWS
3381*5c90c05cSAndroid Build Coastguard Worker 
3382*5c90c05cSAndroid Build Coastguard Worker // Utility functions for encoding Unicode text (wide strings) in
3383*5c90c05cSAndroid Build Coastguard Worker // UTF-8.
3384*5c90c05cSAndroid Build Coastguard Worker 
3385*5c90c05cSAndroid Build Coastguard Worker // A Unicode code-point can have up to 21 bits, and is encoded in UTF-8
3386*5c90c05cSAndroid Build Coastguard Worker // like this:
3387*5c90c05cSAndroid Build Coastguard Worker //
3388*5c90c05cSAndroid Build Coastguard Worker // Code-point length   Encoding
3389*5c90c05cSAndroid Build Coastguard Worker //   0 -  7 bits       0xxxxxxx
3390*5c90c05cSAndroid Build Coastguard Worker //   8 - 11 bits       110xxxxx 10xxxxxx
3391*5c90c05cSAndroid Build Coastguard Worker //  12 - 16 bits       1110xxxx 10xxxxxx 10xxxxxx
3392*5c90c05cSAndroid Build Coastguard Worker //  17 - 21 bits       11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
3393*5c90c05cSAndroid Build Coastguard Worker 
3394*5c90c05cSAndroid Build Coastguard Worker // The maximum code-point a one-byte UTF-8 sequence can represent.
3395*5c90c05cSAndroid Build Coastguard Worker constexpr uint32_t kMaxCodePoint1 = (static_cast<uint32_t>(1) <<  7) - 1;
3396*5c90c05cSAndroid Build Coastguard Worker 
3397*5c90c05cSAndroid Build Coastguard Worker // The maximum code-point a two-byte UTF-8 sequence can represent.
3398*5c90c05cSAndroid Build Coastguard Worker constexpr uint32_t kMaxCodePoint2 = (static_cast<uint32_t>(1) << (5 + 6)) - 1;
3399*5c90c05cSAndroid Build Coastguard Worker 
3400*5c90c05cSAndroid Build Coastguard Worker // The maximum code-point a three-byte UTF-8 sequence can represent.
3401*5c90c05cSAndroid Build Coastguard Worker constexpr uint32_t kMaxCodePoint3 = (static_cast<uint32_t>(1) << (4 + 2*6)) - 1;
3402*5c90c05cSAndroid Build Coastguard Worker 
3403*5c90c05cSAndroid Build Coastguard Worker // The maximum code-point a four-byte UTF-8 sequence can represent.
3404*5c90c05cSAndroid Build Coastguard Worker constexpr uint32_t kMaxCodePoint4 = (static_cast<uint32_t>(1) << (3 + 3*6)) - 1;
3405*5c90c05cSAndroid Build Coastguard Worker 
3406*5c90c05cSAndroid Build Coastguard Worker // Chops off the n lowest bits from a bit pattern.  Returns the n
3407*5c90c05cSAndroid Build Coastguard Worker // lowest bits.  As a side effect, the original bit pattern will be
3408*5c90c05cSAndroid Build Coastguard Worker // shifted to the right by n bits.
ChopLowBits(uint32_t * bits,int n)3409*5c90c05cSAndroid Build Coastguard Worker inline uint32_t ChopLowBits(uint32_t* bits, int n) {
3410*5c90c05cSAndroid Build Coastguard Worker   const uint32_t low_bits = *bits & ((static_cast<uint32_t>(1) << n) - 1);
3411*5c90c05cSAndroid Build Coastguard Worker   *bits >>= n;
3412*5c90c05cSAndroid Build Coastguard Worker   return low_bits;
3413*5c90c05cSAndroid Build Coastguard Worker }
3414*5c90c05cSAndroid Build Coastguard Worker 
3415*5c90c05cSAndroid Build Coastguard Worker // Converts a Unicode code point to a narrow string in UTF-8 encoding.
3416*5c90c05cSAndroid Build Coastguard Worker // code_point parameter is of type uint32_t because wchar_t may not be
3417*5c90c05cSAndroid Build Coastguard Worker // wide enough to contain a code point.
3418*5c90c05cSAndroid Build Coastguard Worker // If the code_point is not a valid Unicode code point
3419*5c90c05cSAndroid Build Coastguard Worker // (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted
3420*5c90c05cSAndroid Build Coastguard Worker // to "(Invalid Unicode 0xXXXXXXXX)".
CodePointToUtf8(uint32_t code_point)3421*5c90c05cSAndroid Build Coastguard Worker std::string CodePointToUtf8(uint32_t code_point) {
3422*5c90c05cSAndroid Build Coastguard Worker   if (code_point > kMaxCodePoint4) {
3423*5c90c05cSAndroid Build Coastguard Worker     return "(Invalid Unicode 0x" + String::FormatHexUInt32(code_point) + ")";
3424*5c90c05cSAndroid Build Coastguard Worker   }
3425*5c90c05cSAndroid Build Coastguard Worker 
3426*5c90c05cSAndroid Build Coastguard Worker   char str[5];  // Big enough for the largest valid code point.
3427*5c90c05cSAndroid Build Coastguard Worker   if (code_point <= kMaxCodePoint1) {
3428*5c90c05cSAndroid Build Coastguard Worker     str[1] = '\0';
3429*5c90c05cSAndroid Build Coastguard Worker     str[0] = static_cast<char>(code_point);                          // 0xxxxxxx
3430*5c90c05cSAndroid Build Coastguard Worker   } else if (code_point <= kMaxCodePoint2) {
3431*5c90c05cSAndroid Build Coastguard Worker     str[2] = '\0';
3432*5c90c05cSAndroid Build Coastguard Worker     str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
3433*5c90c05cSAndroid Build Coastguard Worker     str[0] = static_cast<char>(0xC0 | code_point);                   // 110xxxxx
3434*5c90c05cSAndroid Build Coastguard Worker   } else if (code_point <= kMaxCodePoint3) {
3435*5c90c05cSAndroid Build Coastguard Worker     str[3] = '\0';
3436*5c90c05cSAndroid Build Coastguard Worker     str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
3437*5c90c05cSAndroid Build Coastguard Worker     str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
3438*5c90c05cSAndroid Build Coastguard Worker     str[0] = static_cast<char>(0xE0 | code_point);                   // 1110xxxx
3439*5c90c05cSAndroid Build Coastguard Worker   } else {  // code_point <= kMaxCodePoint4
3440*5c90c05cSAndroid Build Coastguard Worker     str[4] = '\0';
3441*5c90c05cSAndroid Build Coastguard Worker     str[3] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
3442*5c90c05cSAndroid Build Coastguard Worker     str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
3443*5c90c05cSAndroid Build Coastguard Worker     str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
3444*5c90c05cSAndroid Build Coastguard Worker     str[0] = static_cast<char>(0xF0 | code_point);                   // 11110xxx
3445*5c90c05cSAndroid Build Coastguard Worker   }
3446*5c90c05cSAndroid Build Coastguard Worker   return str;
3447*5c90c05cSAndroid Build Coastguard Worker }
3448*5c90c05cSAndroid Build Coastguard Worker 
3449*5c90c05cSAndroid Build Coastguard Worker // The following two functions only make sense if the system
3450*5c90c05cSAndroid Build Coastguard Worker // uses UTF-16 for wide string encoding. All supported systems
3451*5c90c05cSAndroid Build Coastguard Worker // with 16 bit wchar_t (Windows, Cygwin) do use UTF-16.
3452*5c90c05cSAndroid Build Coastguard Worker 
3453*5c90c05cSAndroid Build Coastguard Worker // Determines if the arguments constitute UTF-16 surrogate pair
3454*5c90c05cSAndroid Build Coastguard Worker // and thus should be combined into a single Unicode code point
3455*5c90c05cSAndroid Build Coastguard Worker // using CreateCodePointFromUtf16SurrogatePair.
IsUtf16SurrogatePair(wchar_t first,wchar_t second)3456*5c90c05cSAndroid Build Coastguard Worker inline bool IsUtf16SurrogatePair(wchar_t first, wchar_t second) {
3457*5c90c05cSAndroid Build Coastguard Worker   return sizeof(wchar_t) == 2 &&
3458*5c90c05cSAndroid Build Coastguard Worker       (first & 0xFC00) == 0xD800 && (second & 0xFC00) == 0xDC00;
3459*5c90c05cSAndroid Build Coastguard Worker }
3460*5c90c05cSAndroid Build Coastguard Worker 
3461*5c90c05cSAndroid Build Coastguard Worker // Creates a Unicode code point from UTF16 surrogate pair.
CreateCodePointFromUtf16SurrogatePair(wchar_t first,wchar_t second)3462*5c90c05cSAndroid Build Coastguard Worker inline uint32_t CreateCodePointFromUtf16SurrogatePair(wchar_t first,
3463*5c90c05cSAndroid Build Coastguard Worker                                                       wchar_t second) {
3464*5c90c05cSAndroid Build Coastguard Worker   const auto first_u = static_cast<uint32_t>(first);
3465*5c90c05cSAndroid Build Coastguard Worker   const auto second_u = static_cast<uint32_t>(second);
3466*5c90c05cSAndroid Build Coastguard Worker   const uint32_t mask = (1 << 10) - 1;
3467*5c90c05cSAndroid Build Coastguard Worker   return (sizeof(wchar_t) == 2)
3468*5c90c05cSAndroid Build Coastguard Worker              ? (((first_u & mask) << 10) | (second_u & mask)) + 0x10000
3469*5c90c05cSAndroid Build Coastguard Worker              :
3470*5c90c05cSAndroid Build Coastguard Worker              // This function should not be called when the condition is
3471*5c90c05cSAndroid Build Coastguard Worker              // false, but we provide a sensible default in case it is.
3472*5c90c05cSAndroid Build Coastguard Worker              first_u;
3473*5c90c05cSAndroid Build Coastguard Worker }
3474*5c90c05cSAndroid Build Coastguard Worker 
3475*5c90c05cSAndroid Build Coastguard Worker // Converts a wide string to a narrow string in UTF-8 encoding.
3476*5c90c05cSAndroid Build Coastguard Worker // The wide string is assumed to have the following encoding:
3477*5c90c05cSAndroid Build Coastguard Worker //   UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin)
3478*5c90c05cSAndroid Build Coastguard Worker //   UTF-32 if sizeof(wchar_t) == 4 (on Linux)
3479*5c90c05cSAndroid Build Coastguard Worker // Parameter str points to a null-terminated wide string.
3480*5c90c05cSAndroid Build Coastguard Worker // Parameter num_chars may additionally limit the number
3481*5c90c05cSAndroid Build Coastguard Worker // of wchar_t characters processed. -1 is used when the entire string
3482*5c90c05cSAndroid Build Coastguard Worker // should be processed.
3483*5c90c05cSAndroid Build Coastguard Worker // If the string contains code points that are not valid Unicode code points
3484*5c90c05cSAndroid Build Coastguard Worker // (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output
3485*5c90c05cSAndroid Build Coastguard Worker // as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding
3486*5c90c05cSAndroid Build Coastguard Worker // and contains invalid UTF-16 surrogate pairs, values in those pairs
3487*5c90c05cSAndroid Build Coastguard Worker // will be encoded as individual Unicode characters from Basic Normal Plane.
WideStringToUtf8(const wchar_t * str,int num_chars)3488*5c90c05cSAndroid Build Coastguard Worker std::string WideStringToUtf8(const wchar_t* str, int num_chars) {
3489*5c90c05cSAndroid Build Coastguard Worker   if (num_chars == -1)
3490*5c90c05cSAndroid Build Coastguard Worker     num_chars = static_cast<int>(wcslen(str));
3491*5c90c05cSAndroid Build Coastguard Worker 
3492*5c90c05cSAndroid Build Coastguard Worker   ::std::stringstream stream;
3493*5c90c05cSAndroid Build Coastguard Worker   for (int i = 0; i < num_chars; ++i) {
3494*5c90c05cSAndroid Build Coastguard Worker     uint32_t unicode_code_point;
3495*5c90c05cSAndroid Build Coastguard Worker 
3496*5c90c05cSAndroid Build Coastguard Worker     if (str[i] == L'\0') {
3497*5c90c05cSAndroid Build Coastguard Worker       break;
3498*5c90c05cSAndroid Build Coastguard Worker     } else if (i + 1 < num_chars && IsUtf16SurrogatePair(str[i], str[i + 1])) {
3499*5c90c05cSAndroid Build Coastguard Worker       unicode_code_point = CreateCodePointFromUtf16SurrogatePair(str[i],
3500*5c90c05cSAndroid Build Coastguard Worker                                                                  str[i + 1]);
3501*5c90c05cSAndroid Build Coastguard Worker       i++;
3502*5c90c05cSAndroid Build Coastguard Worker     } else {
3503*5c90c05cSAndroid Build Coastguard Worker       unicode_code_point = static_cast<uint32_t>(str[i]);
3504*5c90c05cSAndroid Build Coastguard Worker     }
3505*5c90c05cSAndroid Build Coastguard Worker 
3506*5c90c05cSAndroid Build Coastguard Worker     stream << CodePointToUtf8(unicode_code_point);
3507*5c90c05cSAndroid Build Coastguard Worker   }
3508*5c90c05cSAndroid Build Coastguard Worker   return StringStreamToString(&stream);
3509*5c90c05cSAndroid Build Coastguard Worker }
3510*5c90c05cSAndroid Build Coastguard Worker 
3511*5c90c05cSAndroid Build Coastguard Worker // Converts a wide C string to an std::string using the UTF-8 encoding.
3512*5c90c05cSAndroid Build Coastguard Worker // NULL will be converted to "(null)".
ShowWideCString(const wchar_t * wide_c_str)3513*5c90c05cSAndroid Build Coastguard Worker std::string String::ShowWideCString(const wchar_t * wide_c_str) {
3514*5c90c05cSAndroid Build Coastguard Worker   if (wide_c_str == nullptr) return "(null)";
3515*5c90c05cSAndroid Build Coastguard Worker 
3516*5c90c05cSAndroid Build Coastguard Worker   return internal::WideStringToUtf8(wide_c_str, -1);
3517*5c90c05cSAndroid Build Coastguard Worker }
3518*5c90c05cSAndroid Build Coastguard Worker 
3519*5c90c05cSAndroid Build Coastguard Worker // Compares two wide C strings.  Returns true if and only if they have the
3520*5c90c05cSAndroid Build Coastguard Worker // same content.
3521*5c90c05cSAndroid Build Coastguard Worker //
3522*5c90c05cSAndroid Build Coastguard Worker // Unlike wcscmp(), this function can handle NULL argument(s).  A NULL
3523*5c90c05cSAndroid Build Coastguard Worker // C string is considered different to any non-NULL C string,
3524*5c90c05cSAndroid Build Coastguard Worker // including the empty string.
WideCStringEquals(const wchar_t * lhs,const wchar_t * rhs)3525*5c90c05cSAndroid Build Coastguard Worker bool String::WideCStringEquals(const wchar_t * lhs, const wchar_t * rhs) {
3526*5c90c05cSAndroid Build Coastguard Worker   if (lhs == nullptr) return rhs == nullptr;
3527*5c90c05cSAndroid Build Coastguard Worker 
3528*5c90c05cSAndroid Build Coastguard Worker   if (rhs == nullptr) return false;
3529*5c90c05cSAndroid Build Coastguard Worker 
3530*5c90c05cSAndroid Build Coastguard Worker   return wcscmp(lhs, rhs) == 0;
3531*5c90c05cSAndroid Build Coastguard Worker }
3532*5c90c05cSAndroid Build Coastguard Worker 
3533*5c90c05cSAndroid Build Coastguard Worker // Helper function for *_STREQ on wide strings.
CmpHelperSTREQ(const char * lhs_expression,const char * rhs_expression,const wchar_t * lhs,const wchar_t * rhs)3534*5c90c05cSAndroid Build Coastguard Worker AssertionResult CmpHelperSTREQ(const char* lhs_expression,
3535*5c90c05cSAndroid Build Coastguard Worker                                const char* rhs_expression,
3536*5c90c05cSAndroid Build Coastguard Worker                                const wchar_t* lhs,
3537*5c90c05cSAndroid Build Coastguard Worker                                const wchar_t* rhs) {
3538*5c90c05cSAndroid Build Coastguard Worker   if (String::WideCStringEquals(lhs, rhs)) {
3539*5c90c05cSAndroid Build Coastguard Worker     return AssertionSuccess();
3540*5c90c05cSAndroid Build Coastguard Worker   }
3541*5c90c05cSAndroid Build Coastguard Worker 
3542*5c90c05cSAndroid Build Coastguard Worker   return EqFailure(lhs_expression,
3543*5c90c05cSAndroid Build Coastguard Worker                    rhs_expression,
3544*5c90c05cSAndroid Build Coastguard Worker                    PrintToString(lhs),
3545*5c90c05cSAndroid Build Coastguard Worker                    PrintToString(rhs),
3546*5c90c05cSAndroid Build Coastguard Worker                    false);
3547*5c90c05cSAndroid Build Coastguard Worker }
3548*5c90c05cSAndroid Build Coastguard Worker 
3549*5c90c05cSAndroid Build Coastguard Worker // Helper function for *_STRNE on wide strings.
CmpHelperSTRNE(const char * s1_expression,const char * s2_expression,const wchar_t * s1,const wchar_t * s2)3550*5c90c05cSAndroid Build Coastguard Worker AssertionResult CmpHelperSTRNE(const char* s1_expression,
3551*5c90c05cSAndroid Build Coastguard Worker                                const char* s2_expression,
3552*5c90c05cSAndroid Build Coastguard Worker                                const wchar_t* s1,
3553*5c90c05cSAndroid Build Coastguard Worker                                const wchar_t* s2) {
3554*5c90c05cSAndroid Build Coastguard Worker   if (!String::WideCStringEquals(s1, s2)) {
3555*5c90c05cSAndroid Build Coastguard Worker     return AssertionSuccess();
3556*5c90c05cSAndroid Build Coastguard Worker   }
3557*5c90c05cSAndroid Build Coastguard Worker 
3558*5c90c05cSAndroid Build Coastguard Worker   return AssertionFailure() << "Expected: (" << s1_expression << ") != ("
3559*5c90c05cSAndroid Build Coastguard Worker                             << s2_expression << "), actual: "
3560*5c90c05cSAndroid Build Coastguard Worker                             << PrintToString(s1)
3561*5c90c05cSAndroid Build Coastguard Worker                             << " vs " << PrintToString(s2);
3562*5c90c05cSAndroid Build Coastguard Worker }
3563*5c90c05cSAndroid Build Coastguard Worker 
3564*5c90c05cSAndroid Build Coastguard Worker // Compares two C strings, ignoring case.  Returns true if and only if they have
3565*5c90c05cSAndroid Build Coastguard Worker // the same content.
3566*5c90c05cSAndroid Build Coastguard Worker //
3567*5c90c05cSAndroid Build Coastguard Worker // Unlike strcasecmp(), this function can handle NULL argument(s).  A
3568*5c90c05cSAndroid Build Coastguard Worker // NULL C string is considered different to any non-NULL C string,
3569*5c90c05cSAndroid Build Coastguard Worker // including the empty string.
CaseInsensitiveCStringEquals(const char * lhs,const char * rhs)3570*5c90c05cSAndroid Build Coastguard Worker bool String::CaseInsensitiveCStringEquals(const char * lhs, const char * rhs) {
3571*5c90c05cSAndroid Build Coastguard Worker   if (lhs == nullptr) return rhs == nullptr;
3572*5c90c05cSAndroid Build Coastguard Worker   if (rhs == nullptr) return false;
3573*5c90c05cSAndroid Build Coastguard Worker   return posix::StrCaseCmp(lhs, rhs) == 0;
3574*5c90c05cSAndroid Build Coastguard Worker }
3575*5c90c05cSAndroid Build Coastguard Worker 
3576*5c90c05cSAndroid Build Coastguard Worker // Compares two wide C strings, ignoring case.  Returns true if and only if they
3577*5c90c05cSAndroid Build Coastguard Worker // have the same content.
3578*5c90c05cSAndroid Build Coastguard Worker //
3579*5c90c05cSAndroid Build Coastguard Worker // Unlike wcscasecmp(), this function can handle NULL argument(s).
3580*5c90c05cSAndroid Build Coastguard Worker // A NULL C string is considered different to any non-NULL wide C string,
3581*5c90c05cSAndroid Build Coastguard Worker // including the empty string.
3582*5c90c05cSAndroid Build Coastguard Worker // NB: The implementations on different platforms slightly differ.
3583*5c90c05cSAndroid Build Coastguard Worker // On windows, this method uses _wcsicmp which compares according to LC_CTYPE
3584*5c90c05cSAndroid Build Coastguard Worker // environment variable. On GNU platform this method uses wcscasecmp
3585*5c90c05cSAndroid Build Coastguard Worker // which compares according to LC_CTYPE category of the current locale.
3586*5c90c05cSAndroid Build Coastguard Worker // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
3587*5c90c05cSAndroid Build Coastguard Worker // current locale.
CaseInsensitiveWideCStringEquals(const wchar_t * lhs,const wchar_t * rhs)3588*5c90c05cSAndroid Build Coastguard Worker bool String::CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
3589*5c90c05cSAndroid Build Coastguard Worker                                               const wchar_t* rhs) {
3590*5c90c05cSAndroid Build Coastguard Worker   if (lhs == nullptr) return rhs == nullptr;
3591*5c90c05cSAndroid Build Coastguard Worker 
3592*5c90c05cSAndroid Build Coastguard Worker   if (rhs == nullptr) return false;
3593*5c90c05cSAndroid Build Coastguard Worker 
3594*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_WINDOWS
3595*5c90c05cSAndroid Build Coastguard Worker   return _wcsicmp(lhs, rhs) == 0;
3596*5c90c05cSAndroid Build Coastguard Worker #elif GTEST_OS_LINUX && !GTEST_OS_LINUX_ANDROID
3597*5c90c05cSAndroid Build Coastguard Worker   return wcscasecmp(lhs, rhs) == 0;
3598*5c90c05cSAndroid Build Coastguard Worker #else
3599*5c90c05cSAndroid Build Coastguard Worker   // Android, Mac OS X and Cygwin don't define wcscasecmp.
3600*5c90c05cSAndroid Build Coastguard Worker   // Other unknown OSes may not define it either.
3601*5c90c05cSAndroid Build Coastguard Worker   wint_t left, right;
3602*5c90c05cSAndroid Build Coastguard Worker   do {
3603*5c90c05cSAndroid Build Coastguard Worker     left = towlower(static_cast<wint_t>(*lhs++));
3604*5c90c05cSAndroid Build Coastguard Worker     right = towlower(static_cast<wint_t>(*rhs++));
3605*5c90c05cSAndroid Build Coastguard Worker   } while (left && left == right);
3606*5c90c05cSAndroid Build Coastguard Worker   return left == right;
3607*5c90c05cSAndroid Build Coastguard Worker #endif  // OS selector
3608*5c90c05cSAndroid Build Coastguard Worker }
3609*5c90c05cSAndroid Build Coastguard Worker 
3610*5c90c05cSAndroid Build Coastguard Worker // Returns true if and only if str ends with the given suffix, ignoring case.
3611*5c90c05cSAndroid Build Coastguard Worker // Any string is considered to end with an empty suffix.
EndsWithCaseInsensitive(const std::string & str,const std::string & suffix)3612*5c90c05cSAndroid Build Coastguard Worker bool String::EndsWithCaseInsensitive(
3613*5c90c05cSAndroid Build Coastguard Worker     const std::string& str, const std::string& suffix) {
3614*5c90c05cSAndroid Build Coastguard Worker   const size_t str_len = str.length();
3615*5c90c05cSAndroid Build Coastguard Worker   const size_t suffix_len = suffix.length();
3616*5c90c05cSAndroid Build Coastguard Worker   return (str_len >= suffix_len) &&
3617*5c90c05cSAndroid Build Coastguard Worker          CaseInsensitiveCStringEquals(str.c_str() + str_len - suffix_len,
3618*5c90c05cSAndroid Build Coastguard Worker                                       suffix.c_str());
3619*5c90c05cSAndroid Build Coastguard Worker }
3620*5c90c05cSAndroid Build Coastguard Worker 
3621*5c90c05cSAndroid Build Coastguard Worker // Formats an int value as "%02d".
FormatIntWidth2(int value)3622*5c90c05cSAndroid Build Coastguard Worker std::string String::FormatIntWidth2(int value) {
3623*5c90c05cSAndroid Build Coastguard Worker   return FormatIntWidthN(value, 2);
3624*5c90c05cSAndroid Build Coastguard Worker }
3625*5c90c05cSAndroid Build Coastguard Worker 
3626*5c90c05cSAndroid Build Coastguard Worker // Formats an int value to given width with leading zeros.
FormatIntWidthN(int value,int width)3627*5c90c05cSAndroid Build Coastguard Worker std::string String::FormatIntWidthN(int value, int width) {
3628*5c90c05cSAndroid Build Coastguard Worker   std::stringstream ss;
3629*5c90c05cSAndroid Build Coastguard Worker   ss << std::setfill('0') << std::setw(width) << value;
3630*5c90c05cSAndroid Build Coastguard Worker   return ss.str();
3631*5c90c05cSAndroid Build Coastguard Worker }
3632*5c90c05cSAndroid Build Coastguard Worker 
3633*5c90c05cSAndroid Build Coastguard Worker // Formats an int value as "%X".
FormatHexUInt32(uint32_t value)3634*5c90c05cSAndroid Build Coastguard Worker std::string String::FormatHexUInt32(uint32_t value) {
3635*5c90c05cSAndroid Build Coastguard Worker   std::stringstream ss;
3636*5c90c05cSAndroid Build Coastguard Worker   ss << std::hex << std::uppercase << value;
3637*5c90c05cSAndroid Build Coastguard Worker   return ss.str();
3638*5c90c05cSAndroid Build Coastguard Worker }
3639*5c90c05cSAndroid Build Coastguard Worker 
3640*5c90c05cSAndroid Build Coastguard Worker // Formats an int value as "%X".
FormatHexInt(int value)3641*5c90c05cSAndroid Build Coastguard Worker std::string String::FormatHexInt(int value) {
3642*5c90c05cSAndroid Build Coastguard Worker   return FormatHexUInt32(static_cast<uint32_t>(value));
3643*5c90c05cSAndroid Build Coastguard Worker }
3644*5c90c05cSAndroid Build Coastguard Worker 
3645*5c90c05cSAndroid Build Coastguard Worker // Formats a byte as "%02X".
FormatByte(unsigned char value)3646*5c90c05cSAndroid Build Coastguard Worker std::string String::FormatByte(unsigned char value) {
3647*5c90c05cSAndroid Build Coastguard Worker   std::stringstream ss;
3648*5c90c05cSAndroid Build Coastguard Worker   ss << std::setfill('0') << std::setw(2) << std::hex << std::uppercase
3649*5c90c05cSAndroid Build Coastguard Worker      << static_cast<unsigned int>(value);
3650*5c90c05cSAndroid Build Coastguard Worker   return ss.str();
3651*5c90c05cSAndroid Build Coastguard Worker }
3652*5c90c05cSAndroid Build Coastguard Worker 
3653*5c90c05cSAndroid Build Coastguard Worker // Converts the buffer in a stringstream to an std::string, converting NUL
3654*5c90c05cSAndroid Build Coastguard Worker // bytes to "\\0" along the way.
StringStreamToString(::std::stringstream * ss)3655*5c90c05cSAndroid Build Coastguard Worker std::string StringStreamToString(::std::stringstream* ss) {
3656*5c90c05cSAndroid Build Coastguard Worker   const ::std::string& str = ss->str();
3657*5c90c05cSAndroid Build Coastguard Worker   const char* const start = str.c_str();
3658*5c90c05cSAndroid Build Coastguard Worker   const char* const end = start + str.length();
3659*5c90c05cSAndroid Build Coastguard Worker 
3660*5c90c05cSAndroid Build Coastguard Worker   std::string result;
3661*5c90c05cSAndroid Build Coastguard Worker   result.reserve(static_cast<size_t>(2 * (end - start)));
3662*5c90c05cSAndroid Build Coastguard Worker   for (const char* ch = start; ch != end; ++ch) {
3663*5c90c05cSAndroid Build Coastguard Worker     if (*ch == '\0') {
3664*5c90c05cSAndroid Build Coastguard Worker       result += "\\0";  // Replaces NUL with "\\0";
3665*5c90c05cSAndroid Build Coastguard Worker     } else {
3666*5c90c05cSAndroid Build Coastguard Worker       result += *ch;
3667*5c90c05cSAndroid Build Coastguard Worker     }
3668*5c90c05cSAndroid Build Coastguard Worker   }
3669*5c90c05cSAndroid Build Coastguard Worker 
3670*5c90c05cSAndroid Build Coastguard Worker   return result;
3671*5c90c05cSAndroid Build Coastguard Worker }
3672*5c90c05cSAndroid Build Coastguard Worker 
3673*5c90c05cSAndroid Build Coastguard Worker // Appends the user-supplied message to the Google-Test-generated message.
AppendUserMessage(const std::string & gtest_msg,const Message & user_msg)3674*5c90c05cSAndroid Build Coastguard Worker std::string AppendUserMessage(const std::string& gtest_msg,
3675*5c90c05cSAndroid Build Coastguard Worker                               const Message& user_msg) {
3676*5c90c05cSAndroid Build Coastguard Worker   // Appends the user message if it's non-empty.
3677*5c90c05cSAndroid Build Coastguard Worker   const std::string user_msg_string = user_msg.GetString();
3678*5c90c05cSAndroid Build Coastguard Worker   if (user_msg_string.empty()) {
3679*5c90c05cSAndroid Build Coastguard Worker     return gtest_msg;
3680*5c90c05cSAndroid Build Coastguard Worker   }
3681*5c90c05cSAndroid Build Coastguard Worker   if (gtest_msg.empty()) {
3682*5c90c05cSAndroid Build Coastguard Worker     return user_msg_string;
3683*5c90c05cSAndroid Build Coastguard Worker   }
3684*5c90c05cSAndroid Build Coastguard Worker   return gtest_msg + "\n" + user_msg_string;
3685*5c90c05cSAndroid Build Coastguard Worker }
3686*5c90c05cSAndroid Build Coastguard Worker 
3687*5c90c05cSAndroid Build Coastguard Worker }  // namespace internal
3688*5c90c05cSAndroid Build Coastguard Worker 
3689*5c90c05cSAndroid Build Coastguard Worker // class TestResult
3690*5c90c05cSAndroid Build Coastguard Worker 
3691*5c90c05cSAndroid Build Coastguard Worker // Creates an empty TestResult.
TestResult()3692*5c90c05cSAndroid Build Coastguard Worker TestResult::TestResult()
3693*5c90c05cSAndroid Build Coastguard Worker     : death_test_count_(0), start_timestamp_(0), elapsed_time_(0) {}
3694*5c90c05cSAndroid Build Coastguard Worker 
3695*5c90c05cSAndroid Build Coastguard Worker // D'tor.
~TestResult()3696*5c90c05cSAndroid Build Coastguard Worker TestResult::~TestResult() {
3697*5c90c05cSAndroid Build Coastguard Worker }
3698*5c90c05cSAndroid Build Coastguard Worker 
3699*5c90c05cSAndroid Build Coastguard Worker // Returns the i-th test part result among all the results. i can
3700*5c90c05cSAndroid Build Coastguard Worker // range from 0 to total_part_count() - 1. If i is not in that range,
3701*5c90c05cSAndroid Build Coastguard Worker // aborts the program.
GetTestPartResult(int i) const3702*5c90c05cSAndroid Build Coastguard Worker const TestPartResult& TestResult::GetTestPartResult(int i) const {
3703*5c90c05cSAndroid Build Coastguard Worker   if (i < 0 || i >= total_part_count())
3704*5c90c05cSAndroid Build Coastguard Worker     internal::posix::Abort();
3705*5c90c05cSAndroid Build Coastguard Worker   return test_part_results_.at(static_cast<size_t>(i));
3706*5c90c05cSAndroid Build Coastguard Worker }
3707*5c90c05cSAndroid Build Coastguard Worker 
3708*5c90c05cSAndroid Build Coastguard Worker // Returns the i-th test property. i can range from 0 to
3709*5c90c05cSAndroid Build Coastguard Worker // test_property_count() - 1. If i is not in that range, aborts the
3710*5c90c05cSAndroid Build Coastguard Worker // program.
GetTestProperty(int i) const3711*5c90c05cSAndroid Build Coastguard Worker const TestProperty& TestResult::GetTestProperty(int i) const {
3712*5c90c05cSAndroid Build Coastguard Worker   if (i < 0 || i >= test_property_count())
3713*5c90c05cSAndroid Build Coastguard Worker     internal::posix::Abort();
3714*5c90c05cSAndroid Build Coastguard Worker   return test_properties_.at(static_cast<size_t>(i));
3715*5c90c05cSAndroid Build Coastguard Worker }
3716*5c90c05cSAndroid Build Coastguard Worker 
3717*5c90c05cSAndroid Build Coastguard Worker // Clears the test part results.
ClearTestPartResults()3718*5c90c05cSAndroid Build Coastguard Worker void TestResult::ClearTestPartResults() {
3719*5c90c05cSAndroid Build Coastguard Worker   test_part_results_.clear();
3720*5c90c05cSAndroid Build Coastguard Worker }
3721*5c90c05cSAndroid Build Coastguard Worker 
3722*5c90c05cSAndroid Build Coastguard Worker // Adds a test part result to the list.
AddTestPartResult(const TestPartResult & test_part_result)3723*5c90c05cSAndroid Build Coastguard Worker void TestResult::AddTestPartResult(const TestPartResult& test_part_result) {
3724*5c90c05cSAndroid Build Coastguard Worker   test_part_results_.push_back(test_part_result);
3725*5c90c05cSAndroid Build Coastguard Worker }
3726*5c90c05cSAndroid Build Coastguard Worker 
3727*5c90c05cSAndroid Build Coastguard Worker // Adds a test property to the list. If a property with the same key as the
3728*5c90c05cSAndroid Build Coastguard Worker // supplied property is already represented, the value of this test_property
3729*5c90c05cSAndroid Build Coastguard Worker // replaces the old value for that key.
RecordProperty(const std::string & xml_element,const TestProperty & test_property)3730*5c90c05cSAndroid Build Coastguard Worker void TestResult::RecordProperty(const std::string& xml_element,
3731*5c90c05cSAndroid Build Coastguard Worker                                 const TestProperty& test_property) {
3732*5c90c05cSAndroid Build Coastguard Worker   if (!ValidateTestProperty(xml_element, test_property)) {
3733*5c90c05cSAndroid Build Coastguard Worker     return;
3734*5c90c05cSAndroid Build Coastguard Worker   }
3735*5c90c05cSAndroid Build Coastguard Worker   internal::MutexLock lock(&test_properties_mutex_);
3736*5c90c05cSAndroid Build Coastguard Worker   const std::vector<TestProperty>::iterator property_with_matching_key =
3737*5c90c05cSAndroid Build Coastguard Worker       std::find_if(test_properties_.begin(), test_properties_.end(),
3738*5c90c05cSAndroid Build Coastguard Worker                    internal::TestPropertyKeyIs(test_property.key()));
3739*5c90c05cSAndroid Build Coastguard Worker   if (property_with_matching_key == test_properties_.end()) {
3740*5c90c05cSAndroid Build Coastguard Worker     test_properties_.push_back(test_property);
3741*5c90c05cSAndroid Build Coastguard Worker     return;
3742*5c90c05cSAndroid Build Coastguard Worker   }
3743*5c90c05cSAndroid Build Coastguard Worker   property_with_matching_key->SetValue(test_property.value());
3744*5c90c05cSAndroid Build Coastguard Worker }
3745*5c90c05cSAndroid Build Coastguard Worker 
3746*5c90c05cSAndroid Build Coastguard Worker // The list of reserved attributes used in the <testsuites> element of XML
3747*5c90c05cSAndroid Build Coastguard Worker // output.
3748*5c90c05cSAndroid Build Coastguard Worker static const char* const kReservedTestSuitesAttributes[] = {
3749*5c90c05cSAndroid Build Coastguard Worker   "disabled",
3750*5c90c05cSAndroid Build Coastguard Worker   "errors",
3751*5c90c05cSAndroid Build Coastguard Worker   "failures",
3752*5c90c05cSAndroid Build Coastguard Worker   "name",
3753*5c90c05cSAndroid Build Coastguard Worker   "random_seed",
3754*5c90c05cSAndroid Build Coastguard Worker   "tests",
3755*5c90c05cSAndroid Build Coastguard Worker   "time",
3756*5c90c05cSAndroid Build Coastguard Worker   "timestamp"
3757*5c90c05cSAndroid Build Coastguard Worker };
3758*5c90c05cSAndroid Build Coastguard Worker 
3759*5c90c05cSAndroid Build Coastguard Worker // The list of reserved attributes used in the <testsuite> element of XML
3760*5c90c05cSAndroid Build Coastguard Worker // output.
3761*5c90c05cSAndroid Build Coastguard Worker static const char* const kReservedTestSuiteAttributes[] = {
3762*5c90c05cSAndroid Build Coastguard Worker     "disabled", "errors", "failures",  "name",
3763*5c90c05cSAndroid Build Coastguard Worker     "tests",    "time",   "timestamp", "skipped"};
3764*5c90c05cSAndroid Build Coastguard Worker 
3765*5c90c05cSAndroid Build Coastguard Worker // The list of reserved attributes used in the <testcase> element of XML output.
3766*5c90c05cSAndroid Build Coastguard Worker static const char* const kReservedTestCaseAttributes[] = {
3767*5c90c05cSAndroid Build Coastguard Worker     "classname",   "name", "status", "time",  "type_param",
3768*5c90c05cSAndroid Build Coastguard Worker     "value_param", "file", "line"};
3769*5c90c05cSAndroid Build Coastguard Worker 
3770*5c90c05cSAndroid Build Coastguard Worker // Use a slightly different set for allowed output to ensure existing tests can
3771*5c90c05cSAndroid Build Coastguard Worker // still RecordProperty("result") or "RecordProperty(timestamp")
3772*5c90c05cSAndroid Build Coastguard Worker static const char* const kReservedOutputTestCaseAttributes[] = {
3773*5c90c05cSAndroid Build Coastguard Worker     "classname",   "name", "status", "time",   "type_param",
3774*5c90c05cSAndroid Build Coastguard Worker     "value_param", "file", "line",   "result", "timestamp"};
3775*5c90c05cSAndroid Build Coastguard Worker 
3776*5c90c05cSAndroid Build Coastguard Worker template <size_t kSize>
ArrayAsVector(const char * const (& array)[kSize])3777*5c90c05cSAndroid Build Coastguard Worker std::vector<std::string> ArrayAsVector(const char* const (&array)[kSize]) {
3778*5c90c05cSAndroid Build Coastguard Worker   return std::vector<std::string>(array, array + kSize);
3779*5c90c05cSAndroid Build Coastguard Worker }
3780*5c90c05cSAndroid Build Coastguard Worker 
GetReservedAttributesForElement(const std::string & xml_element)3781*5c90c05cSAndroid Build Coastguard Worker static std::vector<std::string> GetReservedAttributesForElement(
3782*5c90c05cSAndroid Build Coastguard Worker     const std::string& xml_element) {
3783*5c90c05cSAndroid Build Coastguard Worker   if (xml_element == "testsuites") {
3784*5c90c05cSAndroid Build Coastguard Worker     return ArrayAsVector(kReservedTestSuitesAttributes);
3785*5c90c05cSAndroid Build Coastguard Worker   } else if (xml_element == "testsuite") {
3786*5c90c05cSAndroid Build Coastguard Worker     return ArrayAsVector(kReservedTestSuiteAttributes);
3787*5c90c05cSAndroid Build Coastguard Worker   } else if (xml_element == "testcase") {
3788*5c90c05cSAndroid Build Coastguard Worker     return ArrayAsVector(kReservedTestCaseAttributes);
3789*5c90c05cSAndroid Build Coastguard Worker   } else {
3790*5c90c05cSAndroid Build Coastguard Worker     GTEST_CHECK_(false) << "Unrecognized xml_element provided: " << xml_element;
3791*5c90c05cSAndroid Build Coastguard Worker   }
3792*5c90c05cSAndroid Build Coastguard Worker   // This code is unreachable but some compilers may not realizes that.
3793*5c90c05cSAndroid Build Coastguard Worker   return std::vector<std::string>();
3794*5c90c05cSAndroid Build Coastguard Worker }
3795*5c90c05cSAndroid Build Coastguard Worker 
3796*5c90c05cSAndroid Build Coastguard Worker // TODO(jdesprez): Merge the two getReserved attributes once skip is improved
GetReservedOutputAttributesForElement(const std::string & xml_element)3797*5c90c05cSAndroid Build Coastguard Worker static std::vector<std::string> GetReservedOutputAttributesForElement(
3798*5c90c05cSAndroid Build Coastguard Worker     const std::string& xml_element) {
3799*5c90c05cSAndroid Build Coastguard Worker   if (xml_element == "testsuites") {
3800*5c90c05cSAndroid Build Coastguard Worker     return ArrayAsVector(kReservedTestSuitesAttributes);
3801*5c90c05cSAndroid Build Coastguard Worker   } else if (xml_element == "testsuite") {
3802*5c90c05cSAndroid Build Coastguard Worker     return ArrayAsVector(kReservedTestSuiteAttributes);
3803*5c90c05cSAndroid Build Coastguard Worker   } else if (xml_element == "testcase") {
3804*5c90c05cSAndroid Build Coastguard Worker     return ArrayAsVector(kReservedOutputTestCaseAttributes);
3805*5c90c05cSAndroid Build Coastguard Worker   } else {
3806*5c90c05cSAndroid Build Coastguard Worker     GTEST_CHECK_(false) << "Unrecognized xml_element provided: " << xml_element;
3807*5c90c05cSAndroid Build Coastguard Worker   }
3808*5c90c05cSAndroid Build Coastguard Worker   // This code is unreachable but some compilers may not realizes that.
3809*5c90c05cSAndroid Build Coastguard Worker   return std::vector<std::string>();
3810*5c90c05cSAndroid Build Coastguard Worker }
3811*5c90c05cSAndroid Build Coastguard Worker 
FormatWordList(const std::vector<std::string> & words)3812*5c90c05cSAndroid Build Coastguard Worker static std::string FormatWordList(const std::vector<std::string>& words) {
3813*5c90c05cSAndroid Build Coastguard Worker   Message word_list;
3814*5c90c05cSAndroid Build Coastguard Worker   for (size_t i = 0; i < words.size(); ++i) {
3815*5c90c05cSAndroid Build Coastguard Worker     if (i > 0 && words.size() > 2) {
3816*5c90c05cSAndroid Build Coastguard Worker       word_list << ", ";
3817*5c90c05cSAndroid Build Coastguard Worker     }
3818*5c90c05cSAndroid Build Coastguard Worker     if (i == words.size() - 1) {
3819*5c90c05cSAndroid Build Coastguard Worker       word_list << "and ";
3820*5c90c05cSAndroid Build Coastguard Worker     }
3821*5c90c05cSAndroid Build Coastguard Worker     word_list << "'" << words[i] << "'";
3822*5c90c05cSAndroid Build Coastguard Worker   }
3823*5c90c05cSAndroid Build Coastguard Worker   return word_list.GetString();
3824*5c90c05cSAndroid Build Coastguard Worker }
3825*5c90c05cSAndroid Build Coastguard Worker 
ValidateTestPropertyName(const std::string & property_name,const std::vector<std::string> & reserved_names)3826*5c90c05cSAndroid Build Coastguard Worker static bool ValidateTestPropertyName(
3827*5c90c05cSAndroid Build Coastguard Worker     const std::string& property_name,
3828*5c90c05cSAndroid Build Coastguard Worker     const std::vector<std::string>& reserved_names) {
3829*5c90c05cSAndroid Build Coastguard Worker   if (std::find(reserved_names.begin(), reserved_names.end(), property_name) !=
3830*5c90c05cSAndroid Build Coastguard Worker           reserved_names.end()) {
3831*5c90c05cSAndroid Build Coastguard Worker     ADD_FAILURE() << "Reserved key used in RecordProperty(): " << property_name
3832*5c90c05cSAndroid Build Coastguard Worker                   << " (" << FormatWordList(reserved_names)
3833*5c90c05cSAndroid Build Coastguard Worker                   << " are reserved by " << GTEST_NAME_ << ")";
3834*5c90c05cSAndroid Build Coastguard Worker     return false;
3835*5c90c05cSAndroid Build Coastguard Worker   }
3836*5c90c05cSAndroid Build Coastguard Worker   return true;
3837*5c90c05cSAndroid Build Coastguard Worker }
3838*5c90c05cSAndroid Build Coastguard Worker 
3839*5c90c05cSAndroid Build Coastguard Worker // Adds a failure if the key is a reserved attribute of the element named
3840*5c90c05cSAndroid Build Coastguard Worker // xml_element.  Returns true if the property is valid.
ValidateTestProperty(const std::string & xml_element,const TestProperty & test_property)3841*5c90c05cSAndroid Build Coastguard Worker bool TestResult::ValidateTestProperty(const std::string& xml_element,
3842*5c90c05cSAndroid Build Coastguard Worker                                       const TestProperty& test_property) {
3843*5c90c05cSAndroid Build Coastguard Worker   return ValidateTestPropertyName(test_property.key(),
3844*5c90c05cSAndroid Build Coastguard Worker                                   GetReservedAttributesForElement(xml_element));
3845*5c90c05cSAndroid Build Coastguard Worker }
3846*5c90c05cSAndroid Build Coastguard Worker 
3847*5c90c05cSAndroid Build Coastguard Worker // Clears the object.
Clear()3848*5c90c05cSAndroid Build Coastguard Worker void TestResult::Clear() {
3849*5c90c05cSAndroid Build Coastguard Worker   test_part_results_.clear();
3850*5c90c05cSAndroid Build Coastguard Worker   test_properties_.clear();
3851*5c90c05cSAndroid Build Coastguard Worker   death_test_count_ = 0;
3852*5c90c05cSAndroid Build Coastguard Worker   elapsed_time_ = 0;
3853*5c90c05cSAndroid Build Coastguard Worker }
3854*5c90c05cSAndroid Build Coastguard Worker 
3855*5c90c05cSAndroid Build Coastguard Worker // Returns true off the test part was skipped.
TestPartSkipped(const TestPartResult & result)3856*5c90c05cSAndroid Build Coastguard Worker static bool TestPartSkipped(const TestPartResult& result) {
3857*5c90c05cSAndroid Build Coastguard Worker   return result.skipped();
3858*5c90c05cSAndroid Build Coastguard Worker }
3859*5c90c05cSAndroid Build Coastguard Worker 
3860*5c90c05cSAndroid Build Coastguard Worker // Returns true if and only if the test was skipped.
Skipped() const3861*5c90c05cSAndroid Build Coastguard Worker bool TestResult::Skipped() const {
3862*5c90c05cSAndroid Build Coastguard Worker   return !Failed() && CountIf(test_part_results_, TestPartSkipped) > 0;
3863*5c90c05cSAndroid Build Coastguard Worker }
3864*5c90c05cSAndroid Build Coastguard Worker 
3865*5c90c05cSAndroid Build Coastguard Worker // Returns true if and only if the test failed.
Failed() const3866*5c90c05cSAndroid Build Coastguard Worker bool TestResult::Failed() const {
3867*5c90c05cSAndroid Build Coastguard Worker   for (int i = 0; i < total_part_count(); ++i) {
3868*5c90c05cSAndroid Build Coastguard Worker     if (GetTestPartResult(i).failed())
3869*5c90c05cSAndroid Build Coastguard Worker       return true;
3870*5c90c05cSAndroid Build Coastguard Worker   }
3871*5c90c05cSAndroid Build Coastguard Worker   return false;
3872*5c90c05cSAndroid Build Coastguard Worker }
3873*5c90c05cSAndroid Build Coastguard Worker 
3874*5c90c05cSAndroid Build Coastguard Worker // Returns true if and only if the test part fatally failed.
TestPartFatallyFailed(const TestPartResult & result)3875*5c90c05cSAndroid Build Coastguard Worker static bool TestPartFatallyFailed(const TestPartResult& result) {
3876*5c90c05cSAndroid Build Coastguard Worker   return result.fatally_failed();
3877*5c90c05cSAndroid Build Coastguard Worker }
3878*5c90c05cSAndroid Build Coastguard Worker 
3879*5c90c05cSAndroid Build Coastguard Worker // Returns true if and only if the test fatally failed.
HasFatalFailure() const3880*5c90c05cSAndroid Build Coastguard Worker bool TestResult::HasFatalFailure() const {
3881*5c90c05cSAndroid Build Coastguard Worker   return CountIf(test_part_results_, TestPartFatallyFailed) > 0;
3882*5c90c05cSAndroid Build Coastguard Worker }
3883*5c90c05cSAndroid Build Coastguard Worker 
3884*5c90c05cSAndroid Build Coastguard Worker // Returns true if and only if the test part non-fatally failed.
TestPartNonfatallyFailed(const TestPartResult & result)3885*5c90c05cSAndroid Build Coastguard Worker static bool TestPartNonfatallyFailed(const TestPartResult& result) {
3886*5c90c05cSAndroid Build Coastguard Worker   return result.nonfatally_failed();
3887*5c90c05cSAndroid Build Coastguard Worker }
3888*5c90c05cSAndroid Build Coastguard Worker 
3889*5c90c05cSAndroid Build Coastguard Worker // Returns true if and only if the test has a non-fatal failure.
HasNonfatalFailure() const3890*5c90c05cSAndroid Build Coastguard Worker bool TestResult::HasNonfatalFailure() const {
3891*5c90c05cSAndroid Build Coastguard Worker   return CountIf(test_part_results_, TestPartNonfatallyFailed) > 0;
3892*5c90c05cSAndroid Build Coastguard Worker }
3893*5c90c05cSAndroid Build Coastguard Worker 
3894*5c90c05cSAndroid Build Coastguard Worker // Gets the number of all test parts.  This is the sum of the number
3895*5c90c05cSAndroid Build Coastguard Worker // of successful test parts and the number of failed test parts.
total_part_count() const3896*5c90c05cSAndroid Build Coastguard Worker int TestResult::total_part_count() const {
3897*5c90c05cSAndroid Build Coastguard Worker   return static_cast<int>(test_part_results_.size());
3898*5c90c05cSAndroid Build Coastguard Worker }
3899*5c90c05cSAndroid Build Coastguard Worker 
3900*5c90c05cSAndroid Build Coastguard Worker // Returns the number of the test properties.
test_property_count() const3901*5c90c05cSAndroid Build Coastguard Worker int TestResult::test_property_count() const {
3902*5c90c05cSAndroid Build Coastguard Worker   return static_cast<int>(test_properties_.size());
3903*5c90c05cSAndroid Build Coastguard Worker }
3904*5c90c05cSAndroid Build Coastguard Worker 
3905*5c90c05cSAndroid Build Coastguard Worker // class Test
3906*5c90c05cSAndroid Build Coastguard Worker 
3907*5c90c05cSAndroid Build Coastguard Worker // Creates a Test object.
3908*5c90c05cSAndroid Build Coastguard Worker 
3909*5c90c05cSAndroid Build Coastguard Worker // The c'tor saves the states of all flags.
Test()3910*5c90c05cSAndroid Build Coastguard Worker Test::Test()
3911*5c90c05cSAndroid Build Coastguard Worker     : gtest_flag_saver_(new GTEST_FLAG_SAVER_) {
3912*5c90c05cSAndroid Build Coastguard Worker }
3913*5c90c05cSAndroid Build Coastguard Worker 
3914*5c90c05cSAndroid Build Coastguard Worker // The d'tor restores the states of all flags.  The actual work is
3915*5c90c05cSAndroid Build Coastguard Worker // done by the d'tor of the gtest_flag_saver_ field, and thus not
3916*5c90c05cSAndroid Build Coastguard Worker // visible here.
~Test()3917*5c90c05cSAndroid Build Coastguard Worker Test::~Test() {
3918*5c90c05cSAndroid Build Coastguard Worker }
3919*5c90c05cSAndroid Build Coastguard Worker 
3920*5c90c05cSAndroid Build Coastguard Worker // Sets up the test fixture.
3921*5c90c05cSAndroid Build Coastguard Worker //
3922*5c90c05cSAndroid Build Coastguard Worker // A sub-class may override this.
SetUp()3923*5c90c05cSAndroid Build Coastguard Worker void Test::SetUp() {
3924*5c90c05cSAndroid Build Coastguard Worker }
3925*5c90c05cSAndroid Build Coastguard Worker 
3926*5c90c05cSAndroid Build Coastguard Worker // Tears down the test fixture.
3927*5c90c05cSAndroid Build Coastguard Worker //
3928*5c90c05cSAndroid Build Coastguard Worker // A sub-class may override this.
TearDown()3929*5c90c05cSAndroid Build Coastguard Worker void Test::TearDown() {
3930*5c90c05cSAndroid Build Coastguard Worker }
3931*5c90c05cSAndroid Build Coastguard Worker 
3932*5c90c05cSAndroid Build Coastguard Worker // Allows user supplied key value pairs to be recorded for later output.
RecordProperty(const std::string & key,const std::string & value)3933*5c90c05cSAndroid Build Coastguard Worker void Test::RecordProperty(const std::string& key, const std::string& value) {
3934*5c90c05cSAndroid Build Coastguard Worker   UnitTest::GetInstance()->RecordProperty(key, value);
3935*5c90c05cSAndroid Build Coastguard Worker }
3936*5c90c05cSAndroid Build Coastguard Worker 
3937*5c90c05cSAndroid Build Coastguard Worker // Allows user supplied key value pairs to be recorded for later output.
RecordProperty(const std::string & key,int value)3938*5c90c05cSAndroid Build Coastguard Worker void Test::RecordProperty(const std::string& key, int value) {
3939*5c90c05cSAndroid Build Coastguard Worker   Message value_message;
3940*5c90c05cSAndroid Build Coastguard Worker   value_message << value;
3941*5c90c05cSAndroid Build Coastguard Worker   RecordProperty(key, value_message.GetString().c_str());
3942*5c90c05cSAndroid Build Coastguard Worker }
3943*5c90c05cSAndroid Build Coastguard Worker 
3944*5c90c05cSAndroid Build Coastguard Worker namespace internal {
3945*5c90c05cSAndroid Build Coastguard Worker 
ReportFailureInUnknownLocation(TestPartResult::Type result_type,const std::string & message)3946*5c90c05cSAndroid Build Coastguard Worker void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
3947*5c90c05cSAndroid Build Coastguard Worker                                     const std::string& message) {
3948*5c90c05cSAndroid Build Coastguard Worker   // This function is a friend of UnitTest and as such has access to
3949*5c90c05cSAndroid Build Coastguard Worker   // AddTestPartResult.
3950*5c90c05cSAndroid Build Coastguard Worker   UnitTest::GetInstance()->AddTestPartResult(
3951*5c90c05cSAndroid Build Coastguard Worker       result_type,
3952*5c90c05cSAndroid Build Coastguard Worker       nullptr,  // No info about the source file where the exception occurred.
3953*5c90c05cSAndroid Build Coastguard Worker       -1,       // We have no info on which line caused the exception.
3954*5c90c05cSAndroid Build Coastguard Worker       message,
3955*5c90c05cSAndroid Build Coastguard Worker       "");  // No stack trace, either.
3956*5c90c05cSAndroid Build Coastguard Worker }
3957*5c90c05cSAndroid Build Coastguard Worker 
3958*5c90c05cSAndroid Build Coastguard Worker }  // namespace internal
3959*5c90c05cSAndroid Build Coastguard Worker 
3960*5c90c05cSAndroid Build Coastguard Worker // Google Test requires all tests in the same test suite to use the same test
3961*5c90c05cSAndroid Build Coastguard Worker // fixture class.  This function checks if the current test has the
3962*5c90c05cSAndroid Build Coastguard Worker // same fixture class as the first test in the current test suite.  If
3963*5c90c05cSAndroid Build Coastguard Worker // yes, it returns true; otherwise it generates a Google Test failure and
3964*5c90c05cSAndroid Build Coastguard Worker // returns false.
HasSameFixtureClass()3965*5c90c05cSAndroid Build Coastguard Worker bool Test::HasSameFixtureClass() {
3966*5c90c05cSAndroid Build Coastguard Worker   internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
3967*5c90c05cSAndroid Build Coastguard Worker   const TestSuite* const test_suite = impl->current_test_suite();
3968*5c90c05cSAndroid Build Coastguard Worker 
3969*5c90c05cSAndroid Build Coastguard Worker   // Info about the first test in the current test suite.
3970*5c90c05cSAndroid Build Coastguard Worker   const TestInfo* const first_test_info = test_suite->test_info_list()[0];
3971*5c90c05cSAndroid Build Coastguard Worker   const internal::TypeId first_fixture_id = first_test_info->fixture_class_id_;
3972*5c90c05cSAndroid Build Coastguard Worker   const char* const first_test_name = first_test_info->name();
3973*5c90c05cSAndroid Build Coastguard Worker 
3974*5c90c05cSAndroid Build Coastguard Worker   // Info about the current test.
3975*5c90c05cSAndroid Build Coastguard Worker   const TestInfo* const this_test_info = impl->current_test_info();
3976*5c90c05cSAndroid Build Coastguard Worker   const internal::TypeId this_fixture_id = this_test_info->fixture_class_id_;
3977*5c90c05cSAndroid Build Coastguard Worker   const char* const this_test_name = this_test_info->name();
3978*5c90c05cSAndroid Build Coastguard Worker 
3979*5c90c05cSAndroid Build Coastguard Worker   if (this_fixture_id != first_fixture_id) {
3980*5c90c05cSAndroid Build Coastguard Worker     // Is the first test defined using TEST?
3981*5c90c05cSAndroid Build Coastguard Worker     const bool first_is_TEST = first_fixture_id == internal::GetTestTypeId();
3982*5c90c05cSAndroid Build Coastguard Worker     // Is this test defined using TEST?
3983*5c90c05cSAndroid Build Coastguard Worker     const bool this_is_TEST = this_fixture_id == internal::GetTestTypeId();
3984*5c90c05cSAndroid Build Coastguard Worker 
3985*5c90c05cSAndroid Build Coastguard Worker     if (first_is_TEST || this_is_TEST) {
3986*5c90c05cSAndroid Build Coastguard Worker       // Both TEST and TEST_F appear in same test suite, which is incorrect.
3987*5c90c05cSAndroid Build Coastguard Worker       // Tell the user how to fix this.
3988*5c90c05cSAndroid Build Coastguard Worker 
3989*5c90c05cSAndroid Build Coastguard Worker       // Gets the name of the TEST and the name of the TEST_F.  Note
3990*5c90c05cSAndroid Build Coastguard Worker       // that first_is_TEST and this_is_TEST cannot both be true, as
3991*5c90c05cSAndroid Build Coastguard Worker       // the fixture IDs are different for the two tests.
3992*5c90c05cSAndroid Build Coastguard Worker       const char* const TEST_name =
3993*5c90c05cSAndroid Build Coastguard Worker           first_is_TEST ? first_test_name : this_test_name;
3994*5c90c05cSAndroid Build Coastguard Worker       const char* const TEST_F_name =
3995*5c90c05cSAndroid Build Coastguard Worker           first_is_TEST ? this_test_name : first_test_name;
3996*5c90c05cSAndroid Build Coastguard Worker 
3997*5c90c05cSAndroid Build Coastguard Worker       ADD_FAILURE()
3998*5c90c05cSAndroid Build Coastguard Worker           << "All tests in the same test suite must use the same test fixture\n"
3999*5c90c05cSAndroid Build Coastguard Worker           << "class, so mixing TEST_F and TEST in the same test suite is\n"
4000*5c90c05cSAndroid Build Coastguard Worker           << "illegal.  In test suite " << this_test_info->test_suite_name()
4001*5c90c05cSAndroid Build Coastguard Worker           << ",\n"
4002*5c90c05cSAndroid Build Coastguard Worker           << "test " << TEST_F_name << " is defined using TEST_F but\n"
4003*5c90c05cSAndroid Build Coastguard Worker           << "test " << TEST_name << " is defined using TEST.  You probably\n"
4004*5c90c05cSAndroid Build Coastguard Worker           << "want to change the TEST to TEST_F or move it to another test\n"
4005*5c90c05cSAndroid Build Coastguard Worker           << "case.";
4006*5c90c05cSAndroid Build Coastguard Worker     } else {
4007*5c90c05cSAndroid Build Coastguard Worker       // Two fixture classes with the same name appear in two different
4008*5c90c05cSAndroid Build Coastguard Worker       // namespaces, which is not allowed. Tell the user how to fix this.
4009*5c90c05cSAndroid Build Coastguard Worker       ADD_FAILURE()
4010*5c90c05cSAndroid Build Coastguard Worker           << "All tests in the same test suite must use the same test fixture\n"
4011*5c90c05cSAndroid Build Coastguard Worker           << "class.  However, in test suite "
4012*5c90c05cSAndroid Build Coastguard Worker           << this_test_info->test_suite_name() << ",\n"
4013*5c90c05cSAndroid Build Coastguard Worker           << "you defined test " << first_test_name << " and test "
4014*5c90c05cSAndroid Build Coastguard Worker           << this_test_name << "\n"
4015*5c90c05cSAndroid Build Coastguard Worker           << "using two different test fixture classes.  This can happen if\n"
4016*5c90c05cSAndroid Build Coastguard Worker           << "the two classes are from different namespaces or translation\n"
4017*5c90c05cSAndroid Build Coastguard Worker           << "units and have the same name.  You should probably rename one\n"
4018*5c90c05cSAndroid Build Coastguard Worker           << "of the classes to put the tests into different test suites.";
4019*5c90c05cSAndroid Build Coastguard Worker     }
4020*5c90c05cSAndroid Build Coastguard Worker     return false;
4021*5c90c05cSAndroid Build Coastguard Worker   }
4022*5c90c05cSAndroid Build Coastguard Worker 
4023*5c90c05cSAndroid Build Coastguard Worker   return true;
4024*5c90c05cSAndroid Build Coastguard Worker }
4025*5c90c05cSAndroid Build Coastguard Worker 
4026*5c90c05cSAndroid Build Coastguard Worker #if GTEST_HAS_SEH
4027*5c90c05cSAndroid Build Coastguard Worker 
4028*5c90c05cSAndroid Build Coastguard Worker // Adds an "exception thrown" fatal failure to the current test.  This
4029*5c90c05cSAndroid Build Coastguard Worker // function returns its result via an output parameter pointer because VC++
4030*5c90c05cSAndroid Build Coastguard Worker // prohibits creation of objects with destructors on stack in functions
4031*5c90c05cSAndroid Build Coastguard Worker // using __try (see error C2712).
FormatSehExceptionMessage(DWORD exception_code,const char * location)4032*5c90c05cSAndroid Build Coastguard Worker static std::string* FormatSehExceptionMessage(DWORD exception_code,
4033*5c90c05cSAndroid Build Coastguard Worker                                               const char* location) {
4034*5c90c05cSAndroid Build Coastguard Worker   Message message;
4035*5c90c05cSAndroid Build Coastguard Worker   message << "SEH exception with code 0x" << std::setbase(16) <<
4036*5c90c05cSAndroid Build Coastguard Worker     exception_code << std::setbase(10) << " thrown in " << location << ".";
4037*5c90c05cSAndroid Build Coastguard Worker 
4038*5c90c05cSAndroid Build Coastguard Worker   return new std::string(message.GetString());
4039*5c90c05cSAndroid Build Coastguard Worker }
4040*5c90c05cSAndroid Build Coastguard Worker 
4041*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_HAS_SEH
4042*5c90c05cSAndroid Build Coastguard Worker 
4043*5c90c05cSAndroid Build Coastguard Worker namespace internal {
4044*5c90c05cSAndroid Build Coastguard Worker 
4045*5c90c05cSAndroid Build Coastguard Worker #if GTEST_HAS_EXCEPTIONS
4046*5c90c05cSAndroid Build Coastguard Worker 
4047*5c90c05cSAndroid Build Coastguard Worker // Adds an "exception thrown" fatal failure to the current test.
FormatCxxExceptionMessage(const char * description,const char * location)4048*5c90c05cSAndroid Build Coastguard Worker static std::string FormatCxxExceptionMessage(const char* description,
4049*5c90c05cSAndroid Build Coastguard Worker                                              const char* location) {
4050*5c90c05cSAndroid Build Coastguard Worker   Message message;
4051*5c90c05cSAndroid Build Coastguard Worker   if (description != nullptr) {
4052*5c90c05cSAndroid Build Coastguard Worker     message << "C++ exception with description \"" << description << "\"";
4053*5c90c05cSAndroid Build Coastguard Worker   } else {
4054*5c90c05cSAndroid Build Coastguard Worker     message << "Unknown C++ exception";
4055*5c90c05cSAndroid Build Coastguard Worker   }
4056*5c90c05cSAndroid Build Coastguard Worker   message << " thrown in " << location << ".";
4057*5c90c05cSAndroid Build Coastguard Worker 
4058*5c90c05cSAndroid Build Coastguard Worker   return message.GetString();
4059*5c90c05cSAndroid Build Coastguard Worker }
4060*5c90c05cSAndroid Build Coastguard Worker 
4061*5c90c05cSAndroid Build Coastguard Worker static std::string PrintTestPartResultToString(
4062*5c90c05cSAndroid Build Coastguard Worker     const TestPartResult& test_part_result);
4063*5c90c05cSAndroid Build Coastguard Worker 
GoogleTestFailureException(const TestPartResult & failure)4064*5c90c05cSAndroid Build Coastguard Worker GoogleTestFailureException::GoogleTestFailureException(
4065*5c90c05cSAndroid Build Coastguard Worker     const TestPartResult& failure)
4066*5c90c05cSAndroid Build Coastguard Worker     : ::std::runtime_error(PrintTestPartResultToString(failure).c_str()) {}
4067*5c90c05cSAndroid Build Coastguard Worker 
4068*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_HAS_EXCEPTIONS
4069*5c90c05cSAndroid Build Coastguard Worker 
4070*5c90c05cSAndroid Build Coastguard Worker // We put these helper functions in the internal namespace as IBM's xlC
4071*5c90c05cSAndroid Build Coastguard Worker // compiler rejects the code if they were declared static.
4072*5c90c05cSAndroid Build Coastguard Worker 
4073*5c90c05cSAndroid Build Coastguard Worker // Runs the given method and handles SEH exceptions it throws, when
4074*5c90c05cSAndroid Build Coastguard Worker // SEH is supported; returns the 0-value for type Result in case of an
4075*5c90c05cSAndroid Build Coastguard Worker // SEH exception.  (Microsoft compilers cannot handle SEH and C++
4076*5c90c05cSAndroid Build Coastguard Worker // exceptions in the same function.  Therefore, we provide a separate
4077*5c90c05cSAndroid Build Coastguard Worker // wrapper function for handling SEH exceptions.)
4078*5c90c05cSAndroid Build Coastguard Worker template <class T, typename Result>
HandleSehExceptionsInMethodIfSupported(T * object,Result (T::* method)(),const char * location)4079*5c90c05cSAndroid Build Coastguard Worker Result HandleSehExceptionsInMethodIfSupported(
4080*5c90c05cSAndroid Build Coastguard Worker     T* object, Result (T::*method)(), const char* location) {
4081*5c90c05cSAndroid Build Coastguard Worker #if GTEST_HAS_SEH
4082*5c90c05cSAndroid Build Coastguard Worker   __try {
4083*5c90c05cSAndroid Build Coastguard Worker     return (object->*method)();
4084*5c90c05cSAndroid Build Coastguard Worker   } __except (internal::UnitTestOptions::GTestShouldProcessSEH(  // NOLINT
4085*5c90c05cSAndroid Build Coastguard Worker       GetExceptionCode())) {
4086*5c90c05cSAndroid Build Coastguard Worker     // We create the exception message on the heap because VC++ prohibits
4087*5c90c05cSAndroid Build Coastguard Worker     // creation of objects with destructors on stack in functions using __try
4088*5c90c05cSAndroid Build Coastguard Worker     // (see error C2712).
4089*5c90c05cSAndroid Build Coastguard Worker     std::string* exception_message = FormatSehExceptionMessage(
4090*5c90c05cSAndroid Build Coastguard Worker         GetExceptionCode(), location);
4091*5c90c05cSAndroid Build Coastguard Worker     internal::ReportFailureInUnknownLocation(TestPartResult::kFatalFailure,
4092*5c90c05cSAndroid Build Coastguard Worker                                              *exception_message);
4093*5c90c05cSAndroid Build Coastguard Worker     delete exception_message;
4094*5c90c05cSAndroid Build Coastguard Worker     return static_cast<Result>(0);
4095*5c90c05cSAndroid Build Coastguard Worker   }
4096*5c90c05cSAndroid Build Coastguard Worker #else
4097*5c90c05cSAndroid Build Coastguard Worker   (void)location;
4098*5c90c05cSAndroid Build Coastguard Worker   return (object->*method)();
4099*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_HAS_SEH
4100*5c90c05cSAndroid Build Coastguard Worker }
4101*5c90c05cSAndroid Build Coastguard Worker 
4102*5c90c05cSAndroid Build Coastguard Worker // Runs the given method and catches and reports C++ and/or SEH-style
4103*5c90c05cSAndroid Build Coastguard Worker // exceptions, if they are supported; returns the 0-value for type
4104*5c90c05cSAndroid Build Coastguard Worker // Result in case of an SEH exception.
4105*5c90c05cSAndroid Build Coastguard Worker template <class T, typename Result>
HandleExceptionsInMethodIfSupported(T * object,Result (T::* method)(),const char * location)4106*5c90c05cSAndroid Build Coastguard Worker Result HandleExceptionsInMethodIfSupported(
4107*5c90c05cSAndroid Build Coastguard Worker     T* object, Result (T::*method)(), const char* location) {
4108*5c90c05cSAndroid Build Coastguard Worker   // NOTE: The user code can affect the way in which Google Test handles
4109*5c90c05cSAndroid Build Coastguard Worker   // exceptions by setting GTEST_FLAG(catch_exceptions), but only before
4110*5c90c05cSAndroid Build Coastguard Worker   // RUN_ALL_TESTS() starts. It is technically possible to check the flag
4111*5c90c05cSAndroid Build Coastguard Worker   // after the exception is caught and either report or re-throw the
4112*5c90c05cSAndroid Build Coastguard Worker   // exception based on the flag's value:
4113*5c90c05cSAndroid Build Coastguard Worker   //
4114*5c90c05cSAndroid Build Coastguard Worker   // try {
4115*5c90c05cSAndroid Build Coastguard Worker   //   // Perform the test method.
4116*5c90c05cSAndroid Build Coastguard Worker   // } catch (...) {
4117*5c90c05cSAndroid Build Coastguard Worker   //   if (GTEST_FLAG(catch_exceptions))
4118*5c90c05cSAndroid Build Coastguard Worker   //     // Report the exception as failure.
4119*5c90c05cSAndroid Build Coastguard Worker   //   else
4120*5c90c05cSAndroid Build Coastguard Worker   //     throw;  // Re-throws the original exception.
4121*5c90c05cSAndroid Build Coastguard Worker   // }
4122*5c90c05cSAndroid Build Coastguard Worker   //
4123*5c90c05cSAndroid Build Coastguard Worker   // However, the purpose of this flag is to allow the program to drop into
4124*5c90c05cSAndroid Build Coastguard Worker   // the debugger when the exception is thrown. On most platforms, once the
4125*5c90c05cSAndroid Build Coastguard Worker   // control enters the catch block, the exception origin information is
4126*5c90c05cSAndroid Build Coastguard Worker   // lost and the debugger will stop the program at the point of the
4127*5c90c05cSAndroid Build Coastguard Worker   // re-throw in this function -- instead of at the point of the original
4128*5c90c05cSAndroid Build Coastguard Worker   // throw statement in the code under test.  For this reason, we perform
4129*5c90c05cSAndroid Build Coastguard Worker   // the check early, sacrificing the ability to affect Google Test's
4130*5c90c05cSAndroid Build Coastguard Worker   // exception handling in the method where the exception is thrown.
4131*5c90c05cSAndroid Build Coastguard Worker   if (internal::GetUnitTestImpl()->catch_exceptions()) {
4132*5c90c05cSAndroid Build Coastguard Worker #if GTEST_HAS_EXCEPTIONS
4133*5c90c05cSAndroid Build Coastguard Worker     try {
4134*5c90c05cSAndroid Build Coastguard Worker       return HandleSehExceptionsInMethodIfSupported(object, method, location);
4135*5c90c05cSAndroid Build Coastguard Worker     } catch (const AssertionException&) {  // NOLINT
4136*5c90c05cSAndroid Build Coastguard Worker       // This failure was reported already.
4137*5c90c05cSAndroid Build Coastguard Worker     } catch (const internal::GoogleTestFailureException&) {  // NOLINT
4138*5c90c05cSAndroid Build Coastguard Worker       // This exception type can only be thrown by a failed Google
4139*5c90c05cSAndroid Build Coastguard Worker       // Test assertion with the intention of letting another testing
4140*5c90c05cSAndroid Build Coastguard Worker       // framework catch it.  Therefore we just re-throw it.
4141*5c90c05cSAndroid Build Coastguard Worker       throw;
4142*5c90c05cSAndroid Build Coastguard Worker     } catch (const std::exception& e) {  // NOLINT
4143*5c90c05cSAndroid Build Coastguard Worker       internal::ReportFailureInUnknownLocation(
4144*5c90c05cSAndroid Build Coastguard Worker           TestPartResult::kFatalFailure,
4145*5c90c05cSAndroid Build Coastguard Worker           FormatCxxExceptionMessage(e.what(), location));
4146*5c90c05cSAndroid Build Coastguard Worker     } catch (...) {  // NOLINT
4147*5c90c05cSAndroid Build Coastguard Worker       internal::ReportFailureInUnknownLocation(
4148*5c90c05cSAndroid Build Coastguard Worker           TestPartResult::kFatalFailure,
4149*5c90c05cSAndroid Build Coastguard Worker           FormatCxxExceptionMessage(nullptr, location));
4150*5c90c05cSAndroid Build Coastguard Worker     }
4151*5c90c05cSAndroid Build Coastguard Worker     return static_cast<Result>(0);
4152*5c90c05cSAndroid Build Coastguard Worker #else
4153*5c90c05cSAndroid Build Coastguard Worker     return HandleSehExceptionsInMethodIfSupported(object, method, location);
4154*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_HAS_EXCEPTIONS
4155*5c90c05cSAndroid Build Coastguard Worker   } else {
4156*5c90c05cSAndroid Build Coastguard Worker     return (object->*method)();
4157*5c90c05cSAndroid Build Coastguard Worker   }
4158*5c90c05cSAndroid Build Coastguard Worker }
4159*5c90c05cSAndroid Build Coastguard Worker 
4160*5c90c05cSAndroid Build Coastguard Worker }  // namespace internal
4161*5c90c05cSAndroid Build Coastguard Worker 
4162*5c90c05cSAndroid Build Coastguard Worker // Runs the test and updates the test result.
Run()4163*5c90c05cSAndroid Build Coastguard Worker void Test::Run() {
4164*5c90c05cSAndroid Build Coastguard Worker   if (!HasSameFixtureClass()) return;
4165*5c90c05cSAndroid Build Coastguard Worker 
4166*5c90c05cSAndroid Build Coastguard Worker   internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
4167*5c90c05cSAndroid Build Coastguard Worker   impl->os_stack_trace_getter()->UponLeavingGTest();
4168*5c90c05cSAndroid Build Coastguard Worker   internal::HandleExceptionsInMethodIfSupported(this, &Test::SetUp, "SetUp()");
4169*5c90c05cSAndroid Build Coastguard Worker   // We will run the test only if SetUp() was successful and didn't call
4170*5c90c05cSAndroid Build Coastguard Worker   // GTEST_SKIP().
4171*5c90c05cSAndroid Build Coastguard Worker   if (!HasFatalFailure() && !IsSkipped()) {
4172*5c90c05cSAndroid Build Coastguard Worker     impl->os_stack_trace_getter()->UponLeavingGTest();
4173*5c90c05cSAndroid Build Coastguard Worker     internal::HandleExceptionsInMethodIfSupported(
4174*5c90c05cSAndroid Build Coastguard Worker         this, &Test::TestBody, "the test body");
4175*5c90c05cSAndroid Build Coastguard Worker   }
4176*5c90c05cSAndroid Build Coastguard Worker 
4177*5c90c05cSAndroid Build Coastguard Worker   // However, we want to clean up as much as possible.  Hence we will
4178*5c90c05cSAndroid Build Coastguard Worker   // always call TearDown(), even if SetUp() or the test body has
4179*5c90c05cSAndroid Build Coastguard Worker   // failed.
4180*5c90c05cSAndroid Build Coastguard Worker   impl->os_stack_trace_getter()->UponLeavingGTest();
4181*5c90c05cSAndroid Build Coastguard Worker   internal::HandleExceptionsInMethodIfSupported(
4182*5c90c05cSAndroid Build Coastguard Worker       this, &Test::TearDown, "TearDown()");
4183*5c90c05cSAndroid Build Coastguard Worker }
4184*5c90c05cSAndroid Build Coastguard Worker 
4185*5c90c05cSAndroid Build Coastguard Worker // Returns true if and only if the current test has a fatal failure.
HasFatalFailure()4186*5c90c05cSAndroid Build Coastguard Worker bool Test::HasFatalFailure() {
4187*5c90c05cSAndroid Build Coastguard Worker   return internal::GetUnitTestImpl()->current_test_result()->HasFatalFailure();
4188*5c90c05cSAndroid Build Coastguard Worker }
4189*5c90c05cSAndroid Build Coastguard Worker 
4190*5c90c05cSAndroid Build Coastguard Worker // Returns true if and only if the current test has a non-fatal failure.
HasNonfatalFailure()4191*5c90c05cSAndroid Build Coastguard Worker bool Test::HasNonfatalFailure() {
4192*5c90c05cSAndroid Build Coastguard Worker   return internal::GetUnitTestImpl()->current_test_result()->
4193*5c90c05cSAndroid Build Coastguard Worker       HasNonfatalFailure();
4194*5c90c05cSAndroid Build Coastguard Worker }
4195*5c90c05cSAndroid Build Coastguard Worker 
4196*5c90c05cSAndroid Build Coastguard Worker // Returns true if and only if the current test was skipped.
IsSkipped()4197*5c90c05cSAndroid Build Coastguard Worker bool Test::IsSkipped() {
4198*5c90c05cSAndroid Build Coastguard Worker   return internal::GetUnitTestImpl()->current_test_result()->Skipped();
4199*5c90c05cSAndroid Build Coastguard Worker }
4200*5c90c05cSAndroid Build Coastguard Worker 
4201*5c90c05cSAndroid Build Coastguard Worker // class TestInfo
4202*5c90c05cSAndroid Build Coastguard Worker 
4203*5c90c05cSAndroid Build Coastguard Worker // Constructs a TestInfo object. It assumes ownership of the test factory
4204*5c90c05cSAndroid Build Coastguard Worker // object.
TestInfo(const std::string & a_test_suite_name,const std::string & a_name,const char * a_type_param,const char * a_value_param,internal::CodeLocation a_code_location,internal::TypeId fixture_class_id,internal::TestFactoryBase * factory)4205*5c90c05cSAndroid Build Coastguard Worker TestInfo::TestInfo(const std::string& a_test_suite_name,
4206*5c90c05cSAndroid Build Coastguard Worker                    const std::string& a_name, const char* a_type_param,
4207*5c90c05cSAndroid Build Coastguard Worker                    const char* a_value_param,
4208*5c90c05cSAndroid Build Coastguard Worker                    internal::CodeLocation a_code_location,
4209*5c90c05cSAndroid Build Coastguard Worker                    internal::TypeId fixture_class_id,
4210*5c90c05cSAndroid Build Coastguard Worker                    internal::TestFactoryBase* factory)
4211*5c90c05cSAndroid Build Coastguard Worker     : test_suite_name_(a_test_suite_name),
4212*5c90c05cSAndroid Build Coastguard Worker       name_(a_name),
4213*5c90c05cSAndroid Build Coastguard Worker       type_param_(a_type_param ? new std::string(a_type_param) : nullptr),
4214*5c90c05cSAndroid Build Coastguard Worker       value_param_(a_value_param ? new std::string(a_value_param) : nullptr),
4215*5c90c05cSAndroid Build Coastguard Worker       location_(a_code_location),
4216*5c90c05cSAndroid Build Coastguard Worker       fixture_class_id_(fixture_class_id),
4217*5c90c05cSAndroid Build Coastguard Worker       should_run_(false),
4218*5c90c05cSAndroid Build Coastguard Worker       is_disabled_(false),
4219*5c90c05cSAndroid Build Coastguard Worker       matches_filter_(false),
4220*5c90c05cSAndroid Build Coastguard Worker       is_in_another_shard_(false),
4221*5c90c05cSAndroid Build Coastguard Worker       factory_(factory),
4222*5c90c05cSAndroid Build Coastguard Worker       result_() {}
4223*5c90c05cSAndroid Build Coastguard Worker 
4224*5c90c05cSAndroid Build Coastguard Worker // Destructs a TestInfo object.
~TestInfo()4225*5c90c05cSAndroid Build Coastguard Worker TestInfo::~TestInfo() { delete factory_; }
4226*5c90c05cSAndroid Build Coastguard Worker 
4227*5c90c05cSAndroid Build Coastguard Worker namespace internal {
4228*5c90c05cSAndroid Build Coastguard Worker 
4229*5c90c05cSAndroid Build Coastguard Worker // Creates a new TestInfo object and registers it with Google Test;
4230*5c90c05cSAndroid Build Coastguard Worker // returns the created object.
4231*5c90c05cSAndroid Build Coastguard Worker //
4232*5c90c05cSAndroid Build Coastguard Worker // Arguments:
4233*5c90c05cSAndroid Build Coastguard Worker //
4234*5c90c05cSAndroid Build Coastguard Worker //   test_suite_name:  name of the test suite
4235*5c90c05cSAndroid Build Coastguard Worker //   name:             name of the test
4236*5c90c05cSAndroid Build Coastguard Worker //   type_param:       the name of the test's type parameter, or NULL if
4237*5c90c05cSAndroid Build Coastguard Worker //                     this is not a typed or a type-parameterized test.
4238*5c90c05cSAndroid Build Coastguard Worker //   value_param:      text representation of the test's value parameter,
4239*5c90c05cSAndroid Build Coastguard Worker //                     or NULL if this is not a value-parameterized test.
4240*5c90c05cSAndroid Build Coastguard Worker //   code_location:    code location where the test is defined
4241*5c90c05cSAndroid Build Coastguard Worker //   fixture_class_id: ID of the test fixture class
4242*5c90c05cSAndroid Build Coastguard Worker //   set_up_tc:        pointer to the function that sets up the test suite
4243*5c90c05cSAndroid Build Coastguard Worker //   tear_down_tc:     pointer to the function that tears down the test suite
4244*5c90c05cSAndroid Build Coastguard Worker //   factory:          pointer to the factory that creates a test object.
4245*5c90c05cSAndroid Build Coastguard Worker //                     The newly created TestInfo instance will assume
4246*5c90c05cSAndroid Build Coastguard Worker //                     ownership of the factory object.
MakeAndRegisterTestInfo(const char * test_suite_name,const char * name,const char * type_param,const char * value_param,CodeLocation code_location,TypeId fixture_class_id,SetUpTestSuiteFunc set_up_tc,TearDownTestSuiteFunc tear_down_tc,TestFactoryBase * factory)4247*5c90c05cSAndroid Build Coastguard Worker TestInfo* MakeAndRegisterTestInfo(
4248*5c90c05cSAndroid Build Coastguard Worker     const char* test_suite_name, const char* name, const char* type_param,
4249*5c90c05cSAndroid Build Coastguard Worker     const char* value_param, CodeLocation code_location,
4250*5c90c05cSAndroid Build Coastguard Worker     TypeId fixture_class_id, SetUpTestSuiteFunc set_up_tc,
4251*5c90c05cSAndroid Build Coastguard Worker     TearDownTestSuiteFunc tear_down_tc, TestFactoryBase* factory) {
4252*5c90c05cSAndroid Build Coastguard Worker   TestInfo* const test_info =
4253*5c90c05cSAndroid Build Coastguard Worker       new TestInfo(test_suite_name, name, type_param, value_param,
4254*5c90c05cSAndroid Build Coastguard Worker                    code_location, fixture_class_id, factory);
4255*5c90c05cSAndroid Build Coastguard Worker   GetUnitTestImpl()->AddTestInfo(set_up_tc, tear_down_tc, test_info);
4256*5c90c05cSAndroid Build Coastguard Worker   return test_info;
4257*5c90c05cSAndroid Build Coastguard Worker }
4258*5c90c05cSAndroid Build Coastguard Worker 
ReportInvalidTestSuiteType(const char * test_suite_name,CodeLocation code_location)4259*5c90c05cSAndroid Build Coastguard Worker void ReportInvalidTestSuiteType(const char* test_suite_name,
4260*5c90c05cSAndroid Build Coastguard Worker                                 CodeLocation code_location) {
4261*5c90c05cSAndroid Build Coastguard Worker   Message errors;
4262*5c90c05cSAndroid Build Coastguard Worker   errors
4263*5c90c05cSAndroid Build Coastguard Worker       << "Attempted redefinition of test suite " << test_suite_name << ".\n"
4264*5c90c05cSAndroid Build Coastguard Worker       << "All tests in the same test suite must use the same test fixture\n"
4265*5c90c05cSAndroid Build Coastguard Worker       << "class.  However, in test suite " << test_suite_name << ", you tried\n"
4266*5c90c05cSAndroid Build Coastguard Worker       << "to define a test using a fixture class different from the one\n"
4267*5c90c05cSAndroid Build Coastguard Worker       << "used earlier. This can happen if the two fixture classes are\n"
4268*5c90c05cSAndroid Build Coastguard Worker       << "from different namespaces and have the same name. You should\n"
4269*5c90c05cSAndroid Build Coastguard Worker       << "probably rename one of the classes to put the tests into different\n"
4270*5c90c05cSAndroid Build Coastguard Worker       << "test suites.";
4271*5c90c05cSAndroid Build Coastguard Worker 
4272*5c90c05cSAndroid Build Coastguard Worker   GTEST_LOG_(ERROR) << FormatFileLocation(code_location.file.c_str(),
4273*5c90c05cSAndroid Build Coastguard Worker                                           code_location.line)
4274*5c90c05cSAndroid Build Coastguard Worker                     << " " << errors.GetString();
4275*5c90c05cSAndroid Build Coastguard Worker }
4276*5c90c05cSAndroid Build Coastguard Worker }  // namespace internal
4277*5c90c05cSAndroid Build Coastguard Worker 
4278*5c90c05cSAndroid Build Coastguard Worker namespace {
4279*5c90c05cSAndroid Build Coastguard Worker 
4280*5c90c05cSAndroid Build Coastguard Worker // A predicate that checks the test name of a TestInfo against a known
4281*5c90c05cSAndroid Build Coastguard Worker // value.
4282*5c90c05cSAndroid Build Coastguard Worker //
4283*5c90c05cSAndroid Build Coastguard Worker // This is used for implementation of the TestSuite class only.  We put
4284*5c90c05cSAndroid Build Coastguard Worker // it in the anonymous namespace to prevent polluting the outer
4285*5c90c05cSAndroid Build Coastguard Worker // namespace.
4286*5c90c05cSAndroid Build Coastguard Worker //
4287*5c90c05cSAndroid Build Coastguard Worker // TestNameIs is copyable.
4288*5c90c05cSAndroid Build Coastguard Worker class TestNameIs {
4289*5c90c05cSAndroid Build Coastguard Worker  public:
4290*5c90c05cSAndroid Build Coastguard Worker   // Constructor.
4291*5c90c05cSAndroid Build Coastguard Worker   //
4292*5c90c05cSAndroid Build Coastguard Worker   // TestNameIs has NO default constructor.
TestNameIs(const char * name)4293*5c90c05cSAndroid Build Coastguard Worker   explicit TestNameIs(const char* name)
4294*5c90c05cSAndroid Build Coastguard Worker       : name_(name) {}
4295*5c90c05cSAndroid Build Coastguard Worker 
4296*5c90c05cSAndroid Build Coastguard Worker   // Returns true if and only if the test name of test_info matches name_.
operator ()(const TestInfo * test_info) const4297*5c90c05cSAndroid Build Coastguard Worker   bool operator()(const TestInfo * test_info) const {
4298*5c90c05cSAndroid Build Coastguard Worker     return test_info && test_info->name() == name_;
4299*5c90c05cSAndroid Build Coastguard Worker   }
4300*5c90c05cSAndroid Build Coastguard Worker 
4301*5c90c05cSAndroid Build Coastguard Worker  private:
4302*5c90c05cSAndroid Build Coastguard Worker   std::string name_;
4303*5c90c05cSAndroid Build Coastguard Worker };
4304*5c90c05cSAndroid Build Coastguard Worker 
4305*5c90c05cSAndroid Build Coastguard Worker }  // namespace
4306*5c90c05cSAndroid Build Coastguard Worker 
4307*5c90c05cSAndroid Build Coastguard Worker namespace internal {
4308*5c90c05cSAndroid Build Coastguard Worker 
4309*5c90c05cSAndroid Build Coastguard Worker // This method expands all parameterized tests registered with macros TEST_P
4310*5c90c05cSAndroid Build Coastguard Worker // and INSTANTIATE_TEST_SUITE_P into regular tests and registers those.
4311*5c90c05cSAndroid Build Coastguard Worker // This will be done just once during the program runtime.
RegisterParameterizedTests()4312*5c90c05cSAndroid Build Coastguard Worker void UnitTestImpl::RegisterParameterizedTests() {
4313*5c90c05cSAndroid Build Coastguard Worker   if (!parameterized_tests_registered_) {
4314*5c90c05cSAndroid Build Coastguard Worker     parameterized_test_registry_.RegisterTests();
4315*5c90c05cSAndroid Build Coastguard Worker     type_parameterized_test_registry_.CheckForInstantiations();
4316*5c90c05cSAndroid Build Coastguard Worker     parameterized_tests_registered_ = true;
4317*5c90c05cSAndroid Build Coastguard Worker   }
4318*5c90c05cSAndroid Build Coastguard Worker }
4319*5c90c05cSAndroid Build Coastguard Worker 
4320*5c90c05cSAndroid Build Coastguard Worker }  // namespace internal
4321*5c90c05cSAndroid Build Coastguard Worker 
4322*5c90c05cSAndroid Build Coastguard Worker // Creates the test object, runs it, records its result, and then
4323*5c90c05cSAndroid Build Coastguard Worker // deletes it.
Run()4324*5c90c05cSAndroid Build Coastguard Worker void TestInfo::Run() {
4325*5c90c05cSAndroid Build Coastguard Worker   if (!should_run_) return;
4326*5c90c05cSAndroid Build Coastguard Worker 
4327*5c90c05cSAndroid Build Coastguard Worker   // Tells UnitTest where to store test result.
4328*5c90c05cSAndroid Build Coastguard Worker   internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
4329*5c90c05cSAndroid Build Coastguard Worker   impl->set_current_test_info(this);
4330*5c90c05cSAndroid Build Coastguard Worker 
4331*5c90c05cSAndroid Build Coastguard Worker   TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
4332*5c90c05cSAndroid Build Coastguard Worker 
4333*5c90c05cSAndroid Build Coastguard Worker   // Notifies the unit test event listeners that a test is about to start.
4334*5c90c05cSAndroid Build Coastguard Worker   repeater->OnTestStart(*this);
4335*5c90c05cSAndroid Build Coastguard Worker 
4336*5c90c05cSAndroid Build Coastguard Worker   result_.set_start_timestamp(internal::GetTimeInMillis());
4337*5c90c05cSAndroid Build Coastguard Worker   internal::Timer timer;
4338*5c90c05cSAndroid Build Coastguard Worker 
4339*5c90c05cSAndroid Build Coastguard Worker   impl->os_stack_trace_getter()->UponLeavingGTest();
4340*5c90c05cSAndroid Build Coastguard Worker 
4341*5c90c05cSAndroid Build Coastguard Worker   // Creates the test object.
4342*5c90c05cSAndroid Build Coastguard Worker   Test* const test = internal::HandleExceptionsInMethodIfSupported(
4343*5c90c05cSAndroid Build Coastguard Worker       factory_, &internal::TestFactoryBase::CreateTest,
4344*5c90c05cSAndroid Build Coastguard Worker       "the test fixture's constructor");
4345*5c90c05cSAndroid Build Coastguard Worker 
4346*5c90c05cSAndroid Build Coastguard Worker   // Runs the test if the constructor didn't generate a fatal failure or invoke
4347*5c90c05cSAndroid Build Coastguard Worker   // GTEST_SKIP().
4348*5c90c05cSAndroid Build Coastguard Worker   // Note that the object will not be null
4349*5c90c05cSAndroid Build Coastguard Worker   if (!Test::HasFatalFailure() && !Test::IsSkipped()) {
4350*5c90c05cSAndroid Build Coastguard Worker     // This doesn't throw as all user code that can throw are wrapped into
4351*5c90c05cSAndroid Build Coastguard Worker     // exception handling code.
4352*5c90c05cSAndroid Build Coastguard Worker     test->Run();
4353*5c90c05cSAndroid Build Coastguard Worker   }
4354*5c90c05cSAndroid Build Coastguard Worker 
4355*5c90c05cSAndroid Build Coastguard Worker   if (test != nullptr) {
4356*5c90c05cSAndroid Build Coastguard Worker     // Deletes the test object.
4357*5c90c05cSAndroid Build Coastguard Worker     impl->os_stack_trace_getter()->UponLeavingGTest();
4358*5c90c05cSAndroid Build Coastguard Worker     internal::HandleExceptionsInMethodIfSupported(
4359*5c90c05cSAndroid Build Coastguard Worker         test, &Test::DeleteSelf_, "the test fixture's destructor");
4360*5c90c05cSAndroid Build Coastguard Worker   }
4361*5c90c05cSAndroid Build Coastguard Worker 
4362*5c90c05cSAndroid Build Coastguard Worker   result_.set_elapsed_time(timer.Elapsed());
4363*5c90c05cSAndroid Build Coastguard Worker 
4364*5c90c05cSAndroid Build Coastguard Worker   // Notifies the unit test event listener that a test has just finished.
4365*5c90c05cSAndroid Build Coastguard Worker   repeater->OnTestEnd(*this);
4366*5c90c05cSAndroid Build Coastguard Worker 
4367*5c90c05cSAndroid Build Coastguard Worker   // Tells UnitTest to stop associating assertion results to this
4368*5c90c05cSAndroid Build Coastguard Worker   // test.
4369*5c90c05cSAndroid Build Coastguard Worker   impl->set_current_test_info(nullptr);
4370*5c90c05cSAndroid Build Coastguard Worker }
4371*5c90c05cSAndroid Build Coastguard Worker 
4372*5c90c05cSAndroid Build Coastguard Worker // Skip and records a skipped test result for this object.
Skip()4373*5c90c05cSAndroid Build Coastguard Worker void TestInfo::Skip() {
4374*5c90c05cSAndroid Build Coastguard Worker   if (!should_run_) return;
4375*5c90c05cSAndroid Build Coastguard Worker 
4376*5c90c05cSAndroid Build Coastguard Worker   internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
4377*5c90c05cSAndroid Build Coastguard Worker   impl->set_current_test_info(this);
4378*5c90c05cSAndroid Build Coastguard Worker 
4379*5c90c05cSAndroid Build Coastguard Worker   TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
4380*5c90c05cSAndroid Build Coastguard Worker 
4381*5c90c05cSAndroid Build Coastguard Worker   // Notifies the unit test event listeners that a test is about to start.
4382*5c90c05cSAndroid Build Coastguard Worker   repeater->OnTestStart(*this);
4383*5c90c05cSAndroid Build Coastguard Worker 
4384*5c90c05cSAndroid Build Coastguard Worker   const TestPartResult test_part_result =
4385*5c90c05cSAndroid Build Coastguard Worker       TestPartResult(TestPartResult::kSkip, this->file(), this->line(), "");
4386*5c90c05cSAndroid Build Coastguard Worker   impl->GetTestPartResultReporterForCurrentThread()->ReportTestPartResult(
4387*5c90c05cSAndroid Build Coastguard Worker       test_part_result);
4388*5c90c05cSAndroid Build Coastguard Worker 
4389*5c90c05cSAndroid Build Coastguard Worker   // Notifies the unit test event listener that a test has just finished.
4390*5c90c05cSAndroid Build Coastguard Worker   repeater->OnTestEnd(*this);
4391*5c90c05cSAndroid Build Coastguard Worker   impl->set_current_test_info(nullptr);
4392*5c90c05cSAndroid Build Coastguard Worker }
4393*5c90c05cSAndroid Build Coastguard Worker 
4394*5c90c05cSAndroid Build Coastguard Worker // class TestSuite
4395*5c90c05cSAndroid Build Coastguard Worker 
4396*5c90c05cSAndroid Build Coastguard Worker // Gets the number of successful tests in this test suite.
successful_test_count() const4397*5c90c05cSAndroid Build Coastguard Worker int TestSuite::successful_test_count() const {
4398*5c90c05cSAndroid Build Coastguard Worker   return CountIf(test_info_list_, TestPassed);
4399*5c90c05cSAndroid Build Coastguard Worker }
4400*5c90c05cSAndroid Build Coastguard Worker 
4401*5c90c05cSAndroid Build Coastguard Worker // Gets the number of successful tests in this test suite.
skipped_test_count() const4402*5c90c05cSAndroid Build Coastguard Worker int TestSuite::skipped_test_count() const {
4403*5c90c05cSAndroid Build Coastguard Worker   return CountIf(test_info_list_, TestSkipped);
4404*5c90c05cSAndroid Build Coastguard Worker }
4405*5c90c05cSAndroid Build Coastguard Worker 
4406*5c90c05cSAndroid Build Coastguard Worker // Gets the number of failed tests in this test suite.
failed_test_count() const4407*5c90c05cSAndroid Build Coastguard Worker int TestSuite::failed_test_count() const {
4408*5c90c05cSAndroid Build Coastguard Worker   return CountIf(test_info_list_, TestFailed);
4409*5c90c05cSAndroid Build Coastguard Worker }
4410*5c90c05cSAndroid Build Coastguard Worker 
4411*5c90c05cSAndroid Build Coastguard Worker // Gets the number of disabled tests that will be reported in the XML report.
reportable_disabled_test_count() const4412*5c90c05cSAndroid Build Coastguard Worker int TestSuite::reportable_disabled_test_count() const {
4413*5c90c05cSAndroid Build Coastguard Worker   return CountIf(test_info_list_, TestReportableDisabled);
4414*5c90c05cSAndroid Build Coastguard Worker }
4415*5c90c05cSAndroid Build Coastguard Worker 
4416*5c90c05cSAndroid Build Coastguard Worker // Gets the number of disabled tests in this test suite.
disabled_test_count() const4417*5c90c05cSAndroid Build Coastguard Worker int TestSuite::disabled_test_count() const {
4418*5c90c05cSAndroid Build Coastguard Worker   return CountIf(test_info_list_, TestDisabled);
4419*5c90c05cSAndroid Build Coastguard Worker }
4420*5c90c05cSAndroid Build Coastguard Worker 
4421*5c90c05cSAndroid Build Coastguard Worker // Gets the number of tests to be printed in the XML report.
reportable_test_count() const4422*5c90c05cSAndroid Build Coastguard Worker int TestSuite::reportable_test_count() const {
4423*5c90c05cSAndroid Build Coastguard Worker   return CountIf(test_info_list_, TestReportable);
4424*5c90c05cSAndroid Build Coastguard Worker }
4425*5c90c05cSAndroid Build Coastguard Worker 
4426*5c90c05cSAndroid Build Coastguard Worker // Get the number of tests in this test suite that should run.
test_to_run_count() const4427*5c90c05cSAndroid Build Coastguard Worker int TestSuite::test_to_run_count() const {
4428*5c90c05cSAndroid Build Coastguard Worker   return CountIf(test_info_list_, ShouldRunTest);
4429*5c90c05cSAndroid Build Coastguard Worker }
4430*5c90c05cSAndroid Build Coastguard Worker 
4431*5c90c05cSAndroid Build Coastguard Worker // Gets the number of all tests.
total_test_count() const4432*5c90c05cSAndroid Build Coastguard Worker int TestSuite::total_test_count() const {
4433*5c90c05cSAndroid Build Coastguard Worker   return static_cast<int>(test_info_list_.size());
4434*5c90c05cSAndroid Build Coastguard Worker }
4435*5c90c05cSAndroid Build Coastguard Worker 
4436*5c90c05cSAndroid Build Coastguard Worker // Creates a TestSuite with the given name.
4437*5c90c05cSAndroid Build Coastguard Worker //
4438*5c90c05cSAndroid Build Coastguard Worker // Arguments:
4439*5c90c05cSAndroid Build Coastguard Worker //
4440*5c90c05cSAndroid Build Coastguard Worker //   a_name:       name of the test suite
4441*5c90c05cSAndroid Build Coastguard Worker //   a_type_param: the name of the test suite's type parameter, or NULL if
4442*5c90c05cSAndroid Build Coastguard Worker //                 this is not a typed or a type-parameterized test suite.
4443*5c90c05cSAndroid Build Coastguard Worker //   set_up_tc:    pointer to the function that sets up the test suite
4444*5c90c05cSAndroid Build Coastguard Worker //   tear_down_tc: pointer to the function that tears down the test suite
TestSuite(const char * a_name,const char * a_type_param,internal::SetUpTestSuiteFunc set_up_tc,internal::TearDownTestSuiteFunc tear_down_tc)4445*5c90c05cSAndroid Build Coastguard Worker TestSuite::TestSuite(const char* a_name, const char* a_type_param,
4446*5c90c05cSAndroid Build Coastguard Worker                      internal::SetUpTestSuiteFunc set_up_tc,
4447*5c90c05cSAndroid Build Coastguard Worker                      internal::TearDownTestSuiteFunc tear_down_tc)
4448*5c90c05cSAndroid Build Coastguard Worker     : name_(a_name),
4449*5c90c05cSAndroid Build Coastguard Worker       type_param_(a_type_param ? new std::string(a_type_param) : nullptr),
4450*5c90c05cSAndroid Build Coastguard Worker       set_up_tc_(set_up_tc),
4451*5c90c05cSAndroid Build Coastguard Worker       tear_down_tc_(tear_down_tc),
4452*5c90c05cSAndroid Build Coastguard Worker       should_run_(false),
4453*5c90c05cSAndroid Build Coastguard Worker       start_timestamp_(0),
4454*5c90c05cSAndroid Build Coastguard Worker       elapsed_time_(0) {}
4455*5c90c05cSAndroid Build Coastguard Worker 
4456*5c90c05cSAndroid Build Coastguard Worker // Destructor of TestSuite.
~TestSuite()4457*5c90c05cSAndroid Build Coastguard Worker TestSuite::~TestSuite() {
4458*5c90c05cSAndroid Build Coastguard Worker   // Deletes every Test in the collection.
4459*5c90c05cSAndroid Build Coastguard Worker   ForEach(test_info_list_, internal::Delete<TestInfo>);
4460*5c90c05cSAndroid Build Coastguard Worker }
4461*5c90c05cSAndroid Build Coastguard Worker 
4462*5c90c05cSAndroid Build Coastguard Worker // Returns the i-th test among all the tests. i can range from 0 to
4463*5c90c05cSAndroid Build Coastguard Worker // total_test_count() - 1. If i is not in that range, returns NULL.
GetTestInfo(int i) const4464*5c90c05cSAndroid Build Coastguard Worker const TestInfo* TestSuite::GetTestInfo(int i) const {
4465*5c90c05cSAndroid Build Coastguard Worker   const int index = GetElementOr(test_indices_, i, -1);
4466*5c90c05cSAndroid Build Coastguard Worker   return index < 0 ? nullptr : test_info_list_[static_cast<size_t>(index)];
4467*5c90c05cSAndroid Build Coastguard Worker }
4468*5c90c05cSAndroid Build Coastguard Worker 
4469*5c90c05cSAndroid Build Coastguard Worker // Returns the i-th test among all the tests. i can range from 0 to
4470*5c90c05cSAndroid Build Coastguard Worker // total_test_count() - 1. If i is not in that range, returns NULL.
GetMutableTestInfo(int i)4471*5c90c05cSAndroid Build Coastguard Worker TestInfo* TestSuite::GetMutableTestInfo(int i) {
4472*5c90c05cSAndroid Build Coastguard Worker   const int index = GetElementOr(test_indices_, i, -1);
4473*5c90c05cSAndroid Build Coastguard Worker   return index < 0 ? nullptr : test_info_list_[static_cast<size_t>(index)];
4474*5c90c05cSAndroid Build Coastguard Worker }
4475*5c90c05cSAndroid Build Coastguard Worker 
4476*5c90c05cSAndroid Build Coastguard Worker // Adds a test to this test suite.  Will delete the test upon
4477*5c90c05cSAndroid Build Coastguard Worker // destruction of the TestSuite object.
AddTestInfo(TestInfo * test_info)4478*5c90c05cSAndroid Build Coastguard Worker void TestSuite::AddTestInfo(TestInfo* test_info) {
4479*5c90c05cSAndroid Build Coastguard Worker   test_info_list_.push_back(test_info);
4480*5c90c05cSAndroid Build Coastguard Worker   test_indices_.push_back(static_cast<int>(test_indices_.size()));
4481*5c90c05cSAndroid Build Coastguard Worker }
4482*5c90c05cSAndroid Build Coastguard Worker 
4483*5c90c05cSAndroid Build Coastguard Worker // Runs every test in this TestSuite.
Run()4484*5c90c05cSAndroid Build Coastguard Worker void TestSuite::Run() {
4485*5c90c05cSAndroid Build Coastguard Worker   if (!should_run_) return;
4486*5c90c05cSAndroid Build Coastguard Worker 
4487*5c90c05cSAndroid Build Coastguard Worker   internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
4488*5c90c05cSAndroid Build Coastguard Worker   impl->set_current_test_suite(this);
4489*5c90c05cSAndroid Build Coastguard Worker 
4490*5c90c05cSAndroid Build Coastguard Worker   TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
4491*5c90c05cSAndroid Build Coastguard Worker 
4492*5c90c05cSAndroid Build Coastguard Worker   // Call both legacy and the new API
4493*5c90c05cSAndroid Build Coastguard Worker   repeater->OnTestSuiteStart(*this);
4494*5c90c05cSAndroid Build Coastguard Worker //  Legacy API is deprecated but still available
4495*5c90c05cSAndroid Build Coastguard Worker #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
4496*5c90c05cSAndroid Build Coastguard Worker   repeater->OnTestCaseStart(*this);
4497*5c90c05cSAndroid Build Coastguard Worker #endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_
4498*5c90c05cSAndroid Build Coastguard Worker 
4499*5c90c05cSAndroid Build Coastguard Worker   impl->os_stack_trace_getter()->UponLeavingGTest();
4500*5c90c05cSAndroid Build Coastguard Worker   internal::HandleExceptionsInMethodIfSupported(
4501*5c90c05cSAndroid Build Coastguard Worker       this, &TestSuite::RunSetUpTestSuite, "SetUpTestSuite()");
4502*5c90c05cSAndroid Build Coastguard Worker 
4503*5c90c05cSAndroid Build Coastguard Worker   start_timestamp_ = internal::GetTimeInMillis();
4504*5c90c05cSAndroid Build Coastguard Worker   internal::Timer timer;
4505*5c90c05cSAndroid Build Coastguard Worker   for (int i = 0; i < total_test_count(); i++) {
4506*5c90c05cSAndroid Build Coastguard Worker     GetMutableTestInfo(i)->Run();
4507*5c90c05cSAndroid Build Coastguard Worker     if (GTEST_FLAG(fail_fast) && GetMutableTestInfo(i)->result()->Failed()) {
4508*5c90c05cSAndroid Build Coastguard Worker       for (int j = i + 1; j < total_test_count(); j++) {
4509*5c90c05cSAndroid Build Coastguard Worker         GetMutableTestInfo(j)->Skip();
4510*5c90c05cSAndroid Build Coastguard Worker       }
4511*5c90c05cSAndroid Build Coastguard Worker       break;
4512*5c90c05cSAndroid Build Coastguard Worker     }
4513*5c90c05cSAndroid Build Coastguard Worker   }
4514*5c90c05cSAndroid Build Coastguard Worker   elapsed_time_ = timer.Elapsed();
4515*5c90c05cSAndroid Build Coastguard Worker 
4516*5c90c05cSAndroid Build Coastguard Worker   impl->os_stack_trace_getter()->UponLeavingGTest();
4517*5c90c05cSAndroid Build Coastguard Worker   internal::HandleExceptionsInMethodIfSupported(
4518*5c90c05cSAndroid Build Coastguard Worker       this, &TestSuite::RunTearDownTestSuite, "TearDownTestSuite()");
4519*5c90c05cSAndroid Build Coastguard Worker 
4520*5c90c05cSAndroid Build Coastguard Worker   // Call both legacy and the new API
4521*5c90c05cSAndroid Build Coastguard Worker   repeater->OnTestSuiteEnd(*this);
4522*5c90c05cSAndroid Build Coastguard Worker //  Legacy API is deprecated but still available
4523*5c90c05cSAndroid Build Coastguard Worker #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
4524*5c90c05cSAndroid Build Coastguard Worker   repeater->OnTestCaseEnd(*this);
4525*5c90c05cSAndroid Build Coastguard Worker #endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_
4526*5c90c05cSAndroid Build Coastguard Worker 
4527*5c90c05cSAndroid Build Coastguard Worker   impl->set_current_test_suite(nullptr);
4528*5c90c05cSAndroid Build Coastguard Worker }
4529*5c90c05cSAndroid Build Coastguard Worker 
4530*5c90c05cSAndroid Build Coastguard Worker // Skips all tests under this TestSuite.
Skip()4531*5c90c05cSAndroid Build Coastguard Worker void TestSuite::Skip() {
4532*5c90c05cSAndroid Build Coastguard Worker   if (!should_run_) return;
4533*5c90c05cSAndroid Build Coastguard Worker 
4534*5c90c05cSAndroid Build Coastguard Worker   internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
4535*5c90c05cSAndroid Build Coastguard Worker   impl->set_current_test_suite(this);
4536*5c90c05cSAndroid Build Coastguard Worker 
4537*5c90c05cSAndroid Build Coastguard Worker   TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
4538*5c90c05cSAndroid Build Coastguard Worker 
4539*5c90c05cSAndroid Build Coastguard Worker   // Call both legacy and the new API
4540*5c90c05cSAndroid Build Coastguard Worker   repeater->OnTestSuiteStart(*this);
4541*5c90c05cSAndroid Build Coastguard Worker //  Legacy API is deprecated but still available
4542*5c90c05cSAndroid Build Coastguard Worker #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
4543*5c90c05cSAndroid Build Coastguard Worker   repeater->OnTestCaseStart(*this);
4544*5c90c05cSAndroid Build Coastguard Worker #endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_
4545*5c90c05cSAndroid Build Coastguard Worker 
4546*5c90c05cSAndroid Build Coastguard Worker   for (int i = 0; i < total_test_count(); i++) {
4547*5c90c05cSAndroid Build Coastguard Worker     GetMutableTestInfo(i)->Skip();
4548*5c90c05cSAndroid Build Coastguard Worker   }
4549*5c90c05cSAndroid Build Coastguard Worker 
4550*5c90c05cSAndroid Build Coastguard Worker   // Call both legacy and the new API
4551*5c90c05cSAndroid Build Coastguard Worker   repeater->OnTestSuiteEnd(*this);
4552*5c90c05cSAndroid Build Coastguard Worker   // Legacy API is deprecated but still available
4553*5c90c05cSAndroid Build Coastguard Worker #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
4554*5c90c05cSAndroid Build Coastguard Worker   repeater->OnTestCaseEnd(*this);
4555*5c90c05cSAndroid Build Coastguard Worker #endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_
4556*5c90c05cSAndroid Build Coastguard Worker 
4557*5c90c05cSAndroid Build Coastguard Worker   impl->set_current_test_suite(nullptr);
4558*5c90c05cSAndroid Build Coastguard Worker }
4559*5c90c05cSAndroid Build Coastguard Worker 
4560*5c90c05cSAndroid Build Coastguard Worker // Clears the results of all tests in this test suite.
ClearResult()4561*5c90c05cSAndroid Build Coastguard Worker void TestSuite::ClearResult() {
4562*5c90c05cSAndroid Build Coastguard Worker   ad_hoc_test_result_.Clear();
4563*5c90c05cSAndroid Build Coastguard Worker   ForEach(test_info_list_, TestInfo::ClearTestResult);
4564*5c90c05cSAndroid Build Coastguard Worker }
4565*5c90c05cSAndroid Build Coastguard Worker 
4566*5c90c05cSAndroid Build Coastguard Worker // Shuffles the tests in this test suite.
ShuffleTests(internal::Random * random)4567*5c90c05cSAndroid Build Coastguard Worker void TestSuite::ShuffleTests(internal::Random* random) {
4568*5c90c05cSAndroid Build Coastguard Worker   Shuffle(random, &test_indices_);
4569*5c90c05cSAndroid Build Coastguard Worker }
4570*5c90c05cSAndroid Build Coastguard Worker 
4571*5c90c05cSAndroid Build Coastguard Worker // Restores the test order to before the first shuffle.
UnshuffleTests()4572*5c90c05cSAndroid Build Coastguard Worker void TestSuite::UnshuffleTests() {
4573*5c90c05cSAndroid Build Coastguard Worker   for (size_t i = 0; i < test_indices_.size(); i++) {
4574*5c90c05cSAndroid Build Coastguard Worker     test_indices_[i] = static_cast<int>(i);
4575*5c90c05cSAndroid Build Coastguard Worker   }
4576*5c90c05cSAndroid Build Coastguard Worker }
4577*5c90c05cSAndroid Build Coastguard Worker 
4578*5c90c05cSAndroid Build Coastguard Worker // Formats a countable noun.  Depending on its quantity, either the
4579*5c90c05cSAndroid Build Coastguard Worker // singular form or the plural form is used. e.g.
4580*5c90c05cSAndroid Build Coastguard Worker //
4581*5c90c05cSAndroid Build Coastguard Worker // FormatCountableNoun(1, "formula", "formuli") returns "1 formula".
4582*5c90c05cSAndroid Build Coastguard Worker // FormatCountableNoun(5, "book", "books") returns "5 books".
FormatCountableNoun(int count,const char * singular_form,const char * plural_form)4583*5c90c05cSAndroid Build Coastguard Worker static std::string FormatCountableNoun(int count,
4584*5c90c05cSAndroid Build Coastguard Worker                                        const char * singular_form,
4585*5c90c05cSAndroid Build Coastguard Worker                                        const char * plural_form) {
4586*5c90c05cSAndroid Build Coastguard Worker   return internal::StreamableToString(count) + " " +
4587*5c90c05cSAndroid Build Coastguard Worker       (count == 1 ? singular_form : plural_form);
4588*5c90c05cSAndroid Build Coastguard Worker }
4589*5c90c05cSAndroid Build Coastguard Worker 
4590*5c90c05cSAndroid Build Coastguard Worker // Formats the count of tests.
FormatTestCount(int test_count)4591*5c90c05cSAndroid Build Coastguard Worker static std::string FormatTestCount(int test_count) {
4592*5c90c05cSAndroid Build Coastguard Worker   return FormatCountableNoun(test_count, "test", "tests");
4593*5c90c05cSAndroid Build Coastguard Worker }
4594*5c90c05cSAndroid Build Coastguard Worker 
4595*5c90c05cSAndroid Build Coastguard Worker // Formats the count of test suites.
FormatTestSuiteCount(int test_suite_count)4596*5c90c05cSAndroid Build Coastguard Worker static std::string FormatTestSuiteCount(int test_suite_count) {
4597*5c90c05cSAndroid Build Coastguard Worker   return FormatCountableNoun(test_suite_count, "test suite", "test suites");
4598*5c90c05cSAndroid Build Coastguard Worker }
4599*5c90c05cSAndroid Build Coastguard Worker 
4600*5c90c05cSAndroid Build Coastguard Worker // Converts a TestPartResult::Type enum to human-friendly string
4601*5c90c05cSAndroid Build Coastguard Worker // representation.  Both kNonFatalFailure and kFatalFailure are translated
4602*5c90c05cSAndroid Build Coastguard Worker // to "Failure", as the user usually doesn't care about the difference
4603*5c90c05cSAndroid Build Coastguard Worker // between the two when viewing the test result.
TestPartResultTypeToString(TestPartResult::Type type)4604*5c90c05cSAndroid Build Coastguard Worker static const char * TestPartResultTypeToString(TestPartResult::Type type) {
4605*5c90c05cSAndroid Build Coastguard Worker   switch (type) {
4606*5c90c05cSAndroid Build Coastguard Worker     case TestPartResult::kSkip:
4607*5c90c05cSAndroid Build Coastguard Worker       return "Skipped\n";
4608*5c90c05cSAndroid Build Coastguard Worker     case TestPartResult::kSuccess:
4609*5c90c05cSAndroid Build Coastguard Worker       return "Success";
4610*5c90c05cSAndroid Build Coastguard Worker 
4611*5c90c05cSAndroid Build Coastguard Worker     case TestPartResult::kNonFatalFailure:
4612*5c90c05cSAndroid Build Coastguard Worker     case TestPartResult::kFatalFailure:
4613*5c90c05cSAndroid Build Coastguard Worker #ifdef _MSC_VER
4614*5c90c05cSAndroid Build Coastguard Worker       return "error: ";
4615*5c90c05cSAndroid Build Coastguard Worker #else
4616*5c90c05cSAndroid Build Coastguard Worker       return "Failure\n";
4617*5c90c05cSAndroid Build Coastguard Worker #endif
4618*5c90c05cSAndroid Build Coastguard Worker     default:
4619*5c90c05cSAndroid Build Coastguard Worker       return "Unknown result type";
4620*5c90c05cSAndroid Build Coastguard Worker   }
4621*5c90c05cSAndroid Build Coastguard Worker }
4622*5c90c05cSAndroid Build Coastguard Worker 
4623*5c90c05cSAndroid Build Coastguard Worker namespace internal {
4624*5c90c05cSAndroid Build Coastguard Worker namespace {
4625*5c90c05cSAndroid Build Coastguard Worker enum class GTestColor { kDefault, kRed, kGreen, kYellow };
4626*5c90c05cSAndroid Build Coastguard Worker }  // namespace
4627*5c90c05cSAndroid Build Coastguard Worker 
4628*5c90c05cSAndroid Build Coastguard Worker // Prints a TestPartResult to an std::string.
PrintTestPartResultToString(const TestPartResult & test_part_result)4629*5c90c05cSAndroid Build Coastguard Worker static std::string PrintTestPartResultToString(
4630*5c90c05cSAndroid Build Coastguard Worker     const TestPartResult& test_part_result) {
4631*5c90c05cSAndroid Build Coastguard Worker   return (Message()
4632*5c90c05cSAndroid Build Coastguard Worker           << internal::FormatFileLocation(test_part_result.file_name(),
4633*5c90c05cSAndroid Build Coastguard Worker                                           test_part_result.line_number())
4634*5c90c05cSAndroid Build Coastguard Worker           << " " << TestPartResultTypeToString(test_part_result.type())
4635*5c90c05cSAndroid Build Coastguard Worker           << test_part_result.message()).GetString();
4636*5c90c05cSAndroid Build Coastguard Worker }
4637*5c90c05cSAndroid Build Coastguard Worker 
4638*5c90c05cSAndroid Build Coastguard Worker // Prints a TestPartResult.
PrintTestPartResult(const TestPartResult & test_part_result)4639*5c90c05cSAndroid Build Coastguard Worker static void PrintTestPartResult(const TestPartResult& test_part_result) {
4640*5c90c05cSAndroid Build Coastguard Worker   const std::string& result =
4641*5c90c05cSAndroid Build Coastguard Worker       PrintTestPartResultToString(test_part_result);
4642*5c90c05cSAndroid Build Coastguard Worker   printf("%s\n", result.c_str());
4643*5c90c05cSAndroid Build Coastguard Worker   fflush(stdout);
4644*5c90c05cSAndroid Build Coastguard Worker   // If the test program runs in Visual Studio or a debugger, the
4645*5c90c05cSAndroid Build Coastguard Worker   // following statements add the test part result message to the Output
4646*5c90c05cSAndroid Build Coastguard Worker   // window such that the user can double-click on it to jump to the
4647*5c90c05cSAndroid Build Coastguard Worker   // corresponding source code location; otherwise they do nothing.
4648*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
4649*5c90c05cSAndroid Build Coastguard Worker   // We don't call OutputDebugString*() on Windows Mobile, as printing
4650*5c90c05cSAndroid Build Coastguard Worker   // to stdout is done by OutputDebugString() there already - we don't
4651*5c90c05cSAndroid Build Coastguard Worker   // want the same message printed twice.
4652*5c90c05cSAndroid Build Coastguard Worker   ::OutputDebugStringA(result.c_str());
4653*5c90c05cSAndroid Build Coastguard Worker   ::OutputDebugStringA("\n");
4654*5c90c05cSAndroid Build Coastguard Worker #endif
4655*5c90c05cSAndroid Build Coastguard Worker }
4656*5c90c05cSAndroid Build Coastguard Worker 
4657*5c90c05cSAndroid Build Coastguard Worker // class PrettyUnitTestResultPrinter
4658*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE && \
4659*5c90c05cSAndroid Build Coastguard Worker     !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT && !GTEST_OS_WINDOWS_MINGW
4660*5c90c05cSAndroid Build Coastguard Worker 
4661*5c90c05cSAndroid Build Coastguard Worker // Returns the character attribute for the given color.
GetColorAttribute(GTestColor color)4662*5c90c05cSAndroid Build Coastguard Worker static WORD GetColorAttribute(GTestColor color) {
4663*5c90c05cSAndroid Build Coastguard Worker   switch (color) {
4664*5c90c05cSAndroid Build Coastguard Worker     case GTestColor::kRed:
4665*5c90c05cSAndroid Build Coastguard Worker       return FOREGROUND_RED;
4666*5c90c05cSAndroid Build Coastguard Worker     case GTestColor::kGreen:
4667*5c90c05cSAndroid Build Coastguard Worker       return FOREGROUND_GREEN;
4668*5c90c05cSAndroid Build Coastguard Worker     case GTestColor::kYellow:
4669*5c90c05cSAndroid Build Coastguard Worker       return FOREGROUND_RED | FOREGROUND_GREEN;
4670*5c90c05cSAndroid Build Coastguard Worker     default:           return 0;
4671*5c90c05cSAndroid Build Coastguard Worker   }
4672*5c90c05cSAndroid Build Coastguard Worker }
4673*5c90c05cSAndroid Build Coastguard Worker 
GetBitOffset(WORD color_mask)4674*5c90c05cSAndroid Build Coastguard Worker static int GetBitOffset(WORD color_mask) {
4675*5c90c05cSAndroid Build Coastguard Worker   if (color_mask == 0) return 0;
4676*5c90c05cSAndroid Build Coastguard Worker 
4677*5c90c05cSAndroid Build Coastguard Worker   int bitOffset = 0;
4678*5c90c05cSAndroid Build Coastguard Worker   while ((color_mask & 1) == 0) {
4679*5c90c05cSAndroid Build Coastguard Worker     color_mask >>= 1;
4680*5c90c05cSAndroid Build Coastguard Worker     ++bitOffset;
4681*5c90c05cSAndroid Build Coastguard Worker   }
4682*5c90c05cSAndroid Build Coastguard Worker   return bitOffset;
4683*5c90c05cSAndroid Build Coastguard Worker }
4684*5c90c05cSAndroid Build Coastguard Worker 
GetNewColor(GTestColor color,WORD old_color_attrs)4685*5c90c05cSAndroid Build Coastguard Worker static WORD GetNewColor(GTestColor color, WORD old_color_attrs) {
4686*5c90c05cSAndroid Build Coastguard Worker   // Let's reuse the BG
4687*5c90c05cSAndroid Build Coastguard Worker   static const WORD background_mask = BACKGROUND_BLUE | BACKGROUND_GREEN |
4688*5c90c05cSAndroid Build Coastguard Worker                                       BACKGROUND_RED | BACKGROUND_INTENSITY;
4689*5c90c05cSAndroid Build Coastguard Worker   static const WORD foreground_mask = FOREGROUND_BLUE | FOREGROUND_GREEN |
4690*5c90c05cSAndroid Build Coastguard Worker                                       FOREGROUND_RED | FOREGROUND_INTENSITY;
4691*5c90c05cSAndroid Build Coastguard Worker   const WORD existing_bg = old_color_attrs & background_mask;
4692*5c90c05cSAndroid Build Coastguard Worker 
4693*5c90c05cSAndroid Build Coastguard Worker   WORD new_color =
4694*5c90c05cSAndroid Build Coastguard Worker       GetColorAttribute(color) | existing_bg | FOREGROUND_INTENSITY;
4695*5c90c05cSAndroid Build Coastguard Worker   static const int bg_bitOffset = GetBitOffset(background_mask);
4696*5c90c05cSAndroid Build Coastguard Worker   static const int fg_bitOffset = GetBitOffset(foreground_mask);
4697*5c90c05cSAndroid Build Coastguard Worker 
4698*5c90c05cSAndroid Build Coastguard Worker   if (((new_color & background_mask) >> bg_bitOffset) ==
4699*5c90c05cSAndroid Build Coastguard Worker       ((new_color & foreground_mask) >> fg_bitOffset)) {
4700*5c90c05cSAndroid Build Coastguard Worker     new_color ^= FOREGROUND_INTENSITY;  // invert intensity
4701*5c90c05cSAndroid Build Coastguard Worker   }
4702*5c90c05cSAndroid Build Coastguard Worker   return new_color;
4703*5c90c05cSAndroid Build Coastguard Worker }
4704*5c90c05cSAndroid Build Coastguard Worker 
4705*5c90c05cSAndroid Build Coastguard Worker #else
4706*5c90c05cSAndroid Build Coastguard Worker 
4707*5c90c05cSAndroid Build Coastguard Worker // Returns the ANSI color code for the given color. GTestColor::kDefault is
4708*5c90c05cSAndroid Build Coastguard Worker // an invalid input.
GetAnsiColorCode(GTestColor color)4709*5c90c05cSAndroid Build Coastguard Worker static const char* GetAnsiColorCode(GTestColor color) {
4710*5c90c05cSAndroid Build Coastguard Worker   switch (color) {
4711*5c90c05cSAndroid Build Coastguard Worker     case GTestColor::kRed:
4712*5c90c05cSAndroid Build Coastguard Worker       return "1";
4713*5c90c05cSAndroid Build Coastguard Worker     case GTestColor::kGreen:
4714*5c90c05cSAndroid Build Coastguard Worker       return "2";
4715*5c90c05cSAndroid Build Coastguard Worker     case GTestColor::kYellow:
4716*5c90c05cSAndroid Build Coastguard Worker       return "3";
4717*5c90c05cSAndroid Build Coastguard Worker     default:
4718*5c90c05cSAndroid Build Coastguard Worker       return nullptr;
4719*5c90c05cSAndroid Build Coastguard Worker   }
4720*5c90c05cSAndroid Build Coastguard Worker }
4721*5c90c05cSAndroid Build Coastguard Worker 
4722*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
4723*5c90c05cSAndroid Build Coastguard Worker 
4724*5c90c05cSAndroid Build Coastguard Worker // Returns true if and only if Google Test should use colors in the output.
ShouldUseColor(bool stdout_is_tty)4725*5c90c05cSAndroid Build Coastguard Worker bool ShouldUseColor(bool stdout_is_tty) {
4726*5c90c05cSAndroid Build Coastguard Worker   const char* const gtest_color = GTEST_FLAG(color).c_str();
4727*5c90c05cSAndroid Build Coastguard Worker 
4728*5c90c05cSAndroid Build Coastguard Worker   if (String::CaseInsensitiveCStringEquals(gtest_color, "auto")) {
4729*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MINGW
4730*5c90c05cSAndroid Build Coastguard Worker     // On Windows the TERM variable is usually not set, but the
4731*5c90c05cSAndroid Build Coastguard Worker     // console there does support colors.
4732*5c90c05cSAndroid Build Coastguard Worker     return stdout_is_tty;
4733*5c90c05cSAndroid Build Coastguard Worker #else
4734*5c90c05cSAndroid Build Coastguard Worker     // On non-Windows platforms, we rely on the TERM variable.
4735*5c90c05cSAndroid Build Coastguard Worker     const char* const term = posix::GetEnv("TERM");
4736*5c90c05cSAndroid Build Coastguard Worker     const bool term_supports_color =
4737*5c90c05cSAndroid Build Coastguard Worker         String::CStringEquals(term, "xterm") ||
4738*5c90c05cSAndroid Build Coastguard Worker         String::CStringEquals(term, "xterm-color") ||
4739*5c90c05cSAndroid Build Coastguard Worker         String::CStringEquals(term, "xterm-256color") ||
4740*5c90c05cSAndroid Build Coastguard Worker         String::CStringEquals(term, "screen") ||
4741*5c90c05cSAndroid Build Coastguard Worker         String::CStringEquals(term, "screen-256color") ||
4742*5c90c05cSAndroid Build Coastguard Worker         String::CStringEquals(term, "tmux") ||
4743*5c90c05cSAndroid Build Coastguard Worker         String::CStringEquals(term, "tmux-256color") ||
4744*5c90c05cSAndroid Build Coastguard Worker         String::CStringEquals(term, "rxvt-unicode") ||
4745*5c90c05cSAndroid Build Coastguard Worker         String::CStringEquals(term, "rxvt-unicode-256color") ||
4746*5c90c05cSAndroid Build Coastguard Worker         String::CStringEquals(term, "linux") ||
4747*5c90c05cSAndroid Build Coastguard Worker         String::CStringEquals(term, "cygwin");
4748*5c90c05cSAndroid Build Coastguard Worker     return stdout_is_tty && term_supports_color;
4749*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_OS_WINDOWS
4750*5c90c05cSAndroid Build Coastguard Worker   }
4751*5c90c05cSAndroid Build Coastguard Worker 
4752*5c90c05cSAndroid Build Coastguard Worker   return String::CaseInsensitiveCStringEquals(gtest_color, "yes") ||
4753*5c90c05cSAndroid Build Coastguard Worker       String::CaseInsensitiveCStringEquals(gtest_color, "true") ||
4754*5c90c05cSAndroid Build Coastguard Worker       String::CaseInsensitiveCStringEquals(gtest_color, "t") ||
4755*5c90c05cSAndroid Build Coastguard Worker       String::CStringEquals(gtest_color, "1");
4756*5c90c05cSAndroid Build Coastguard Worker   // We take "yes", "true", "t", and "1" as meaning "yes".  If the
4757*5c90c05cSAndroid Build Coastguard Worker   // value is neither one of these nor "auto", we treat it as "no" to
4758*5c90c05cSAndroid Build Coastguard Worker   // be conservative.
4759*5c90c05cSAndroid Build Coastguard Worker }
4760*5c90c05cSAndroid Build Coastguard Worker 
4761*5c90c05cSAndroid Build Coastguard Worker // Helpers for printing colored strings to stdout. Note that on Windows, we
4762*5c90c05cSAndroid Build Coastguard Worker // cannot simply emit special characters and have the terminal change colors.
4763*5c90c05cSAndroid Build Coastguard Worker // This routine must actually emit the characters rather than return a string
4764*5c90c05cSAndroid Build Coastguard Worker // that would be colored when printed, as can be done on Linux.
4765*5c90c05cSAndroid Build Coastguard Worker 
4766*5c90c05cSAndroid Build Coastguard Worker GTEST_ATTRIBUTE_PRINTF_(2, 3)
ColoredPrintf(GTestColor color,const char * fmt,...)4767*5c90c05cSAndroid Build Coastguard Worker static void ColoredPrintf(GTestColor color, const char *fmt, ...) {
4768*5c90c05cSAndroid Build Coastguard Worker   va_list args;
4769*5c90c05cSAndroid Build Coastguard Worker   va_start(args, fmt);
4770*5c90c05cSAndroid Build Coastguard Worker 
4771*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_ZOS || GTEST_OS_IOS || \
4772*5c90c05cSAndroid Build Coastguard Worker     GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT || defined(ESP_PLATFORM)
4773*5c90c05cSAndroid Build Coastguard Worker   const bool use_color = AlwaysFalse();
4774*5c90c05cSAndroid Build Coastguard Worker #else
4775*5c90c05cSAndroid Build Coastguard Worker   static const bool in_color_mode =
4776*5c90c05cSAndroid Build Coastguard Worker       ShouldUseColor(posix::IsATTY(posix::FileNo(stdout)) != 0);
4777*5c90c05cSAndroid Build Coastguard Worker   const bool use_color = in_color_mode && (color != GTestColor::kDefault);
4778*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_ZOS
4779*5c90c05cSAndroid Build Coastguard Worker 
4780*5c90c05cSAndroid Build Coastguard Worker   if (!use_color) {
4781*5c90c05cSAndroid Build Coastguard Worker     vprintf(fmt, args);
4782*5c90c05cSAndroid Build Coastguard Worker     va_end(args);
4783*5c90c05cSAndroid Build Coastguard Worker     return;
4784*5c90c05cSAndroid Build Coastguard Worker   }
4785*5c90c05cSAndroid Build Coastguard Worker 
4786*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE && \
4787*5c90c05cSAndroid Build Coastguard Worker     !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT && !GTEST_OS_WINDOWS_MINGW
4788*5c90c05cSAndroid Build Coastguard Worker   const HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE);
4789*5c90c05cSAndroid Build Coastguard Worker 
4790*5c90c05cSAndroid Build Coastguard Worker   // Gets the current text color.
4791*5c90c05cSAndroid Build Coastguard Worker   CONSOLE_SCREEN_BUFFER_INFO buffer_info;
4792*5c90c05cSAndroid Build Coastguard Worker   GetConsoleScreenBufferInfo(stdout_handle, &buffer_info);
4793*5c90c05cSAndroid Build Coastguard Worker   const WORD old_color_attrs = buffer_info.wAttributes;
4794*5c90c05cSAndroid Build Coastguard Worker   const WORD new_color = GetNewColor(color, old_color_attrs);
4795*5c90c05cSAndroid Build Coastguard Worker 
4796*5c90c05cSAndroid Build Coastguard Worker   // We need to flush the stream buffers into the console before each
4797*5c90c05cSAndroid Build Coastguard Worker   // SetConsoleTextAttribute call lest it affect the text that is already
4798*5c90c05cSAndroid Build Coastguard Worker   // printed but has not yet reached the console.
4799*5c90c05cSAndroid Build Coastguard Worker   fflush(stdout);
4800*5c90c05cSAndroid Build Coastguard Worker   SetConsoleTextAttribute(stdout_handle, new_color);
4801*5c90c05cSAndroid Build Coastguard Worker 
4802*5c90c05cSAndroid Build Coastguard Worker   vprintf(fmt, args);
4803*5c90c05cSAndroid Build Coastguard Worker 
4804*5c90c05cSAndroid Build Coastguard Worker   fflush(stdout);
4805*5c90c05cSAndroid Build Coastguard Worker   // Restores the text color.
4806*5c90c05cSAndroid Build Coastguard Worker   SetConsoleTextAttribute(stdout_handle, old_color_attrs);
4807*5c90c05cSAndroid Build Coastguard Worker #else
4808*5c90c05cSAndroid Build Coastguard Worker   printf("\033[0;3%sm", GetAnsiColorCode(color));
4809*5c90c05cSAndroid Build Coastguard Worker   vprintf(fmt, args);
4810*5c90c05cSAndroid Build Coastguard Worker   printf("\033[m");  // Resets the terminal to default.
4811*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
4812*5c90c05cSAndroid Build Coastguard Worker   va_end(args);
4813*5c90c05cSAndroid Build Coastguard Worker }
4814*5c90c05cSAndroid Build Coastguard Worker 
4815*5c90c05cSAndroid Build Coastguard Worker // Text printed in Google Test's text output and --gtest_list_tests
4816*5c90c05cSAndroid Build Coastguard Worker // output to label the type parameter and value parameter for a test.
4817*5c90c05cSAndroid Build Coastguard Worker static const char kTypeParamLabel[] = "TypeParam";
4818*5c90c05cSAndroid Build Coastguard Worker static const char kValueParamLabel[] = "GetParam()";
4819*5c90c05cSAndroid Build Coastguard Worker 
PrintFullTestCommentIfPresent(const TestInfo & test_info)4820*5c90c05cSAndroid Build Coastguard Worker static void PrintFullTestCommentIfPresent(const TestInfo& test_info) {
4821*5c90c05cSAndroid Build Coastguard Worker   const char* const type_param = test_info.type_param();
4822*5c90c05cSAndroid Build Coastguard Worker   const char* const value_param = test_info.value_param();
4823*5c90c05cSAndroid Build Coastguard Worker 
4824*5c90c05cSAndroid Build Coastguard Worker   if (type_param != nullptr || value_param != nullptr) {
4825*5c90c05cSAndroid Build Coastguard Worker     printf(", where ");
4826*5c90c05cSAndroid Build Coastguard Worker     if (type_param != nullptr) {
4827*5c90c05cSAndroid Build Coastguard Worker       printf("%s = %s", kTypeParamLabel, type_param);
4828*5c90c05cSAndroid Build Coastguard Worker       if (value_param != nullptr) printf(" and ");
4829*5c90c05cSAndroid Build Coastguard Worker     }
4830*5c90c05cSAndroid Build Coastguard Worker     if (value_param != nullptr) {
4831*5c90c05cSAndroid Build Coastguard Worker       printf("%s = %s", kValueParamLabel, value_param);
4832*5c90c05cSAndroid Build Coastguard Worker     }
4833*5c90c05cSAndroid Build Coastguard Worker   }
4834*5c90c05cSAndroid Build Coastguard Worker }
4835*5c90c05cSAndroid Build Coastguard Worker 
4836*5c90c05cSAndroid Build Coastguard Worker // This class implements the TestEventListener interface.
4837*5c90c05cSAndroid Build Coastguard Worker //
4838*5c90c05cSAndroid Build Coastguard Worker // Class PrettyUnitTestResultPrinter is copyable.
4839*5c90c05cSAndroid Build Coastguard Worker class PrettyUnitTestResultPrinter : public TestEventListener {
4840*5c90c05cSAndroid Build Coastguard Worker  public:
PrettyUnitTestResultPrinter()4841*5c90c05cSAndroid Build Coastguard Worker   PrettyUnitTestResultPrinter() {}
PrintTestName(const char * test_suite,const char * test)4842*5c90c05cSAndroid Build Coastguard Worker   static void PrintTestName(const char* test_suite, const char* test) {
4843*5c90c05cSAndroid Build Coastguard Worker     printf("%s.%s", test_suite, test);
4844*5c90c05cSAndroid Build Coastguard Worker   }
4845*5c90c05cSAndroid Build Coastguard Worker 
4846*5c90c05cSAndroid Build Coastguard Worker   // The following methods override what's in the TestEventListener class.
OnTestProgramStart(const UnitTest &)4847*5c90c05cSAndroid Build Coastguard Worker   void OnTestProgramStart(const UnitTest& /*unit_test*/) override {}
4848*5c90c05cSAndroid Build Coastguard Worker   void OnTestIterationStart(const UnitTest& unit_test, int iteration) override;
4849*5c90c05cSAndroid Build Coastguard Worker   void OnEnvironmentsSetUpStart(const UnitTest& unit_test) override;
OnEnvironmentsSetUpEnd(const UnitTest &)4850*5c90c05cSAndroid Build Coastguard Worker   void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) override {}
4851*5c90c05cSAndroid Build Coastguard Worker #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
4852*5c90c05cSAndroid Build Coastguard Worker   void OnTestCaseStart(const TestCase& test_case) override;
4853*5c90c05cSAndroid Build Coastguard Worker #else
4854*5c90c05cSAndroid Build Coastguard Worker   void OnTestSuiteStart(const TestSuite& test_suite) override;
4855*5c90c05cSAndroid Build Coastguard Worker #endif  // OnTestCaseStart
4856*5c90c05cSAndroid Build Coastguard Worker 
4857*5c90c05cSAndroid Build Coastguard Worker   void OnTestStart(const TestInfo& test_info) override;
4858*5c90c05cSAndroid Build Coastguard Worker 
4859*5c90c05cSAndroid Build Coastguard Worker   void OnTestPartResult(const TestPartResult& result) override;
4860*5c90c05cSAndroid Build Coastguard Worker   void OnTestEnd(const TestInfo& test_info) override;
4861*5c90c05cSAndroid Build Coastguard Worker #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
4862*5c90c05cSAndroid Build Coastguard Worker   void OnTestCaseEnd(const TestCase& test_case) override;
4863*5c90c05cSAndroid Build Coastguard Worker #else
4864*5c90c05cSAndroid Build Coastguard Worker   void OnTestSuiteEnd(const TestSuite& test_suite) override;
4865*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
4866*5c90c05cSAndroid Build Coastguard Worker 
4867*5c90c05cSAndroid Build Coastguard Worker   void OnEnvironmentsTearDownStart(const UnitTest& unit_test) override;
OnEnvironmentsTearDownEnd(const UnitTest &)4868*5c90c05cSAndroid Build Coastguard Worker   void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) override {}
4869*5c90c05cSAndroid Build Coastguard Worker   void OnTestIterationEnd(const UnitTest& unit_test, int iteration) override;
OnTestProgramEnd(const UnitTest &)4870*5c90c05cSAndroid Build Coastguard Worker   void OnTestProgramEnd(const UnitTest& /*unit_test*/) override {}
4871*5c90c05cSAndroid Build Coastguard Worker 
4872*5c90c05cSAndroid Build Coastguard Worker  private:
4873*5c90c05cSAndroid Build Coastguard Worker   static void PrintFailedTests(const UnitTest& unit_test);
4874*5c90c05cSAndroid Build Coastguard Worker   static void PrintFailedTestSuites(const UnitTest& unit_test);
4875*5c90c05cSAndroid Build Coastguard Worker   static void PrintSkippedTests(const UnitTest& unit_test);
4876*5c90c05cSAndroid Build Coastguard Worker };
4877*5c90c05cSAndroid Build Coastguard Worker 
4878*5c90c05cSAndroid Build Coastguard Worker   // Fired before each iteration of tests starts.
OnTestIterationStart(const UnitTest & unit_test,int iteration)4879*5c90c05cSAndroid Build Coastguard Worker void PrettyUnitTestResultPrinter::OnTestIterationStart(
4880*5c90c05cSAndroid Build Coastguard Worker     const UnitTest& unit_test, int iteration) {
4881*5c90c05cSAndroid Build Coastguard Worker   if (GTEST_FLAG(repeat) != 1)
4882*5c90c05cSAndroid Build Coastguard Worker     printf("\nRepeating all tests (iteration %d) . . .\n\n", iteration + 1);
4883*5c90c05cSAndroid Build Coastguard Worker 
4884*5c90c05cSAndroid Build Coastguard Worker   const char* const filter = GTEST_FLAG(filter).c_str();
4885*5c90c05cSAndroid Build Coastguard Worker 
4886*5c90c05cSAndroid Build Coastguard Worker   // Prints the filter if it's not *.  This reminds the user that some
4887*5c90c05cSAndroid Build Coastguard Worker   // tests may be skipped.
4888*5c90c05cSAndroid Build Coastguard Worker   if (!String::CStringEquals(filter, kUniversalFilter)) {
4889*5c90c05cSAndroid Build Coastguard Worker     ColoredPrintf(GTestColor::kYellow, "Note: %s filter = %s\n", GTEST_NAME_,
4890*5c90c05cSAndroid Build Coastguard Worker                   filter);
4891*5c90c05cSAndroid Build Coastguard Worker   }
4892*5c90c05cSAndroid Build Coastguard Worker 
4893*5c90c05cSAndroid Build Coastguard Worker   if (internal::ShouldShard(kTestTotalShards, kTestShardIndex, false)) {
4894*5c90c05cSAndroid Build Coastguard Worker     const int32_t shard_index = Int32FromEnvOrDie(kTestShardIndex, -1);
4895*5c90c05cSAndroid Build Coastguard Worker     ColoredPrintf(GTestColor::kYellow, "Note: This is test shard %d of %s.\n",
4896*5c90c05cSAndroid Build Coastguard Worker                   static_cast<int>(shard_index) + 1,
4897*5c90c05cSAndroid Build Coastguard Worker                   internal::posix::GetEnv(kTestTotalShards));
4898*5c90c05cSAndroid Build Coastguard Worker   }
4899*5c90c05cSAndroid Build Coastguard Worker 
4900*5c90c05cSAndroid Build Coastguard Worker   if (GTEST_FLAG(shuffle)) {
4901*5c90c05cSAndroid Build Coastguard Worker     ColoredPrintf(GTestColor::kYellow,
4902*5c90c05cSAndroid Build Coastguard Worker                   "Note: Randomizing tests' orders with a seed of %d .\n",
4903*5c90c05cSAndroid Build Coastguard Worker                   unit_test.random_seed());
4904*5c90c05cSAndroid Build Coastguard Worker   }
4905*5c90c05cSAndroid Build Coastguard Worker 
4906*5c90c05cSAndroid Build Coastguard Worker   ColoredPrintf(GTestColor::kGreen, "[==========] ");
4907*5c90c05cSAndroid Build Coastguard Worker   printf("Running %s from %s.\n",
4908*5c90c05cSAndroid Build Coastguard Worker          FormatTestCount(unit_test.test_to_run_count()).c_str(),
4909*5c90c05cSAndroid Build Coastguard Worker          FormatTestSuiteCount(unit_test.test_suite_to_run_count()).c_str());
4910*5c90c05cSAndroid Build Coastguard Worker   fflush(stdout);
4911*5c90c05cSAndroid Build Coastguard Worker }
4912*5c90c05cSAndroid Build Coastguard Worker 
OnEnvironmentsSetUpStart(const UnitTest &)4913*5c90c05cSAndroid Build Coastguard Worker void PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart(
4914*5c90c05cSAndroid Build Coastguard Worker     const UnitTest& /*unit_test*/) {
4915*5c90c05cSAndroid Build Coastguard Worker   ColoredPrintf(GTestColor::kGreen, "[----------] ");
4916*5c90c05cSAndroid Build Coastguard Worker   printf("Global test environment set-up.\n");
4917*5c90c05cSAndroid Build Coastguard Worker   fflush(stdout);
4918*5c90c05cSAndroid Build Coastguard Worker }
4919*5c90c05cSAndroid Build Coastguard Worker 
4920*5c90c05cSAndroid Build Coastguard Worker #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
OnTestCaseStart(const TestCase & test_case)4921*5c90c05cSAndroid Build Coastguard Worker void PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) {
4922*5c90c05cSAndroid Build Coastguard Worker   const std::string counts =
4923*5c90c05cSAndroid Build Coastguard Worker       FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
4924*5c90c05cSAndroid Build Coastguard Worker   ColoredPrintf(GTestColor::kGreen, "[----------] ");
4925*5c90c05cSAndroid Build Coastguard Worker   printf("%s from %s", counts.c_str(), test_case.name());
4926*5c90c05cSAndroid Build Coastguard Worker   if (test_case.type_param() == nullptr) {
4927*5c90c05cSAndroid Build Coastguard Worker     printf("\n");
4928*5c90c05cSAndroid Build Coastguard Worker   } else {
4929*5c90c05cSAndroid Build Coastguard Worker     printf(", where %s = %s\n", kTypeParamLabel, test_case.type_param());
4930*5c90c05cSAndroid Build Coastguard Worker   }
4931*5c90c05cSAndroid Build Coastguard Worker   fflush(stdout);
4932*5c90c05cSAndroid Build Coastguard Worker }
4933*5c90c05cSAndroid Build Coastguard Worker #else
OnTestSuiteStart(const TestSuite & test_suite)4934*5c90c05cSAndroid Build Coastguard Worker void PrettyUnitTestResultPrinter::OnTestSuiteStart(
4935*5c90c05cSAndroid Build Coastguard Worker     const TestSuite& test_suite) {
4936*5c90c05cSAndroid Build Coastguard Worker   const std::string counts =
4937*5c90c05cSAndroid Build Coastguard Worker       FormatCountableNoun(test_suite.test_to_run_count(), "test", "tests");
4938*5c90c05cSAndroid Build Coastguard Worker   ColoredPrintf(GTestColor::kGreen, "[----------] ");
4939*5c90c05cSAndroid Build Coastguard Worker   printf("%s from %s", counts.c_str(), test_suite.name());
4940*5c90c05cSAndroid Build Coastguard Worker   if (test_suite.type_param() == nullptr) {
4941*5c90c05cSAndroid Build Coastguard Worker     printf("\n");
4942*5c90c05cSAndroid Build Coastguard Worker   } else {
4943*5c90c05cSAndroid Build Coastguard Worker     printf(", where %s = %s\n", kTypeParamLabel, test_suite.type_param());
4944*5c90c05cSAndroid Build Coastguard Worker   }
4945*5c90c05cSAndroid Build Coastguard Worker   fflush(stdout);
4946*5c90c05cSAndroid Build Coastguard Worker }
4947*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
4948*5c90c05cSAndroid Build Coastguard Worker 
OnTestStart(const TestInfo & test_info)4949*5c90c05cSAndroid Build Coastguard Worker void PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) {
4950*5c90c05cSAndroid Build Coastguard Worker   ColoredPrintf(GTestColor::kGreen, "[ RUN      ] ");
4951*5c90c05cSAndroid Build Coastguard Worker   PrintTestName(test_info.test_suite_name(), test_info.name());
4952*5c90c05cSAndroid Build Coastguard Worker   printf("\n");
4953*5c90c05cSAndroid Build Coastguard Worker   fflush(stdout);
4954*5c90c05cSAndroid Build Coastguard Worker }
4955*5c90c05cSAndroid Build Coastguard Worker 
4956*5c90c05cSAndroid Build Coastguard Worker // Called after an assertion failure.
OnTestPartResult(const TestPartResult & result)4957*5c90c05cSAndroid Build Coastguard Worker void PrettyUnitTestResultPrinter::OnTestPartResult(
4958*5c90c05cSAndroid Build Coastguard Worker     const TestPartResult& result) {
4959*5c90c05cSAndroid Build Coastguard Worker   switch (result.type()) {
4960*5c90c05cSAndroid Build Coastguard Worker     // If the test part succeeded, we don't need to do anything.
4961*5c90c05cSAndroid Build Coastguard Worker     case TestPartResult::kSuccess:
4962*5c90c05cSAndroid Build Coastguard Worker       return;
4963*5c90c05cSAndroid Build Coastguard Worker     default:
4964*5c90c05cSAndroid Build Coastguard Worker       // Print failure message from the assertion
4965*5c90c05cSAndroid Build Coastguard Worker       // (e.g. expected this and got that).
4966*5c90c05cSAndroid Build Coastguard Worker       PrintTestPartResult(result);
4967*5c90c05cSAndroid Build Coastguard Worker       fflush(stdout);
4968*5c90c05cSAndroid Build Coastguard Worker   }
4969*5c90c05cSAndroid Build Coastguard Worker }
4970*5c90c05cSAndroid Build Coastguard Worker 
OnTestEnd(const TestInfo & test_info)4971*5c90c05cSAndroid Build Coastguard Worker void PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) {
4972*5c90c05cSAndroid Build Coastguard Worker   if (test_info.result()->Passed()) {
4973*5c90c05cSAndroid Build Coastguard Worker     ColoredPrintf(GTestColor::kGreen, "[       OK ] ");
4974*5c90c05cSAndroid Build Coastguard Worker   } else if (test_info.result()->Skipped()) {
4975*5c90c05cSAndroid Build Coastguard Worker     ColoredPrintf(GTestColor::kGreen, "[  SKIPPED ] ");
4976*5c90c05cSAndroid Build Coastguard Worker   } else {
4977*5c90c05cSAndroid Build Coastguard Worker     ColoredPrintf(GTestColor::kRed, "[  FAILED  ] ");
4978*5c90c05cSAndroid Build Coastguard Worker   }
4979*5c90c05cSAndroid Build Coastguard Worker   PrintTestName(test_info.test_suite_name(), test_info.name());
4980*5c90c05cSAndroid Build Coastguard Worker   if (test_info.result()->Failed())
4981*5c90c05cSAndroid Build Coastguard Worker     PrintFullTestCommentIfPresent(test_info);
4982*5c90c05cSAndroid Build Coastguard Worker 
4983*5c90c05cSAndroid Build Coastguard Worker   if (GTEST_FLAG(print_time)) {
4984*5c90c05cSAndroid Build Coastguard Worker     printf(" (%s ms)\n", internal::StreamableToString(
4985*5c90c05cSAndroid Build Coastguard Worker            test_info.result()->elapsed_time()).c_str());
4986*5c90c05cSAndroid Build Coastguard Worker   } else {
4987*5c90c05cSAndroid Build Coastguard Worker     printf("\n");
4988*5c90c05cSAndroid Build Coastguard Worker   }
4989*5c90c05cSAndroid Build Coastguard Worker   fflush(stdout);
4990*5c90c05cSAndroid Build Coastguard Worker }
4991*5c90c05cSAndroid Build Coastguard Worker 
4992*5c90c05cSAndroid Build Coastguard Worker #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
OnTestCaseEnd(const TestCase & test_case)4993*5c90c05cSAndroid Build Coastguard Worker void PrettyUnitTestResultPrinter::OnTestCaseEnd(const TestCase& test_case) {
4994*5c90c05cSAndroid Build Coastguard Worker   if (!GTEST_FLAG(print_time)) return;
4995*5c90c05cSAndroid Build Coastguard Worker 
4996*5c90c05cSAndroid Build Coastguard Worker   const std::string counts =
4997*5c90c05cSAndroid Build Coastguard Worker       FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
4998*5c90c05cSAndroid Build Coastguard Worker   ColoredPrintf(GTestColor::kGreen, "[----------] ");
4999*5c90c05cSAndroid Build Coastguard Worker   printf("%s from %s (%s ms total)\n\n", counts.c_str(), test_case.name(),
5000*5c90c05cSAndroid Build Coastguard Worker          internal::StreamableToString(test_case.elapsed_time()).c_str());
5001*5c90c05cSAndroid Build Coastguard Worker   fflush(stdout);
5002*5c90c05cSAndroid Build Coastguard Worker }
5003*5c90c05cSAndroid Build Coastguard Worker #else
OnTestSuiteEnd(const TestSuite & test_suite)5004*5c90c05cSAndroid Build Coastguard Worker void PrettyUnitTestResultPrinter::OnTestSuiteEnd(const TestSuite& test_suite) {
5005*5c90c05cSAndroid Build Coastguard Worker   if (!GTEST_FLAG(print_time)) return;
5006*5c90c05cSAndroid Build Coastguard Worker 
5007*5c90c05cSAndroid Build Coastguard Worker   const std::string counts =
5008*5c90c05cSAndroid Build Coastguard Worker       FormatCountableNoun(test_suite.test_to_run_count(), "test", "tests");
5009*5c90c05cSAndroid Build Coastguard Worker   ColoredPrintf(GTestColor::kGreen, "[----------] ");
5010*5c90c05cSAndroid Build Coastguard Worker   printf("%s from %s (%s ms total)\n\n", counts.c_str(), test_suite.name(),
5011*5c90c05cSAndroid Build Coastguard Worker          internal::StreamableToString(test_suite.elapsed_time()).c_str());
5012*5c90c05cSAndroid Build Coastguard Worker   fflush(stdout);
5013*5c90c05cSAndroid Build Coastguard Worker }
5014*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
5015*5c90c05cSAndroid Build Coastguard Worker 
OnEnvironmentsTearDownStart(const UnitTest &)5016*5c90c05cSAndroid Build Coastguard Worker void PrettyUnitTestResultPrinter::OnEnvironmentsTearDownStart(
5017*5c90c05cSAndroid Build Coastguard Worker     const UnitTest& /*unit_test*/) {
5018*5c90c05cSAndroid Build Coastguard Worker   ColoredPrintf(GTestColor::kGreen, "[----------] ");
5019*5c90c05cSAndroid Build Coastguard Worker   printf("Global test environment tear-down\n");
5020*5c90c05cSAndroid Build Coastguard Worker   fflush(stdout);
5021*5c90c05cSAndroid Build Coastguard Worker }
5022*5c90c05cSAndroid Build Coastguard Worker 
5023*5c90c05cSAndroid Build Coastguard Worker // Internal helper for printing the list of failed tests.
PrintFailedTests(const UnitTest & unit_test)5024*5c90c05cSAndroid Build Coastguard Worker void PrettyUnitTestResultPrinter::PrintFailedTests(const UnitTest& unit_test) {
5025*5c90c05cSAndroid Build Coastguard Worker   const int failed_test_count = unit_test.failed_test_count();
5026*5c90c05cSAndroid Build Coastguard Worker   ColoredPrintf(GTestColor::kRed, "[  FAILED  ] ");
5027*5c90c05cSAndroid Build Coastguard Worker   printf("%s, listed below:\n", FormatTestCount(failed_test_count).c_str());
5028*5c90c05cSAndroid Build Coastguard Worker 
5029*5c90c05cSAndroid Build Coastguard Worker   for (int i = 0; i < unit_test.total_test_suite_count(); ++i) {
5030*5c90c05cSAndroid Build Coastguard Worker     const TestSuite& test_suite = *unit_test.GetTestSuite(i);
5031*5c90c05cSAndroid Build Coastguard Worker     if (!test_suite.should_run() || (test_suite.failed_test_count() == 0)) {
5032*5c90c05cSAndroid Build Coastguard Worker       continue;
5033*5c90c05cSAndroid Build Coastguard Worker     }
5034*5c90c05cSAndroid Build Coastguard Worker     for (int j = 0; j < test_suite.total_test_count(); ++j) {
5035*5c90c05cSAndroid Build Coastguard Worker       const TestInfo& test_info = *test_suite.GetTestInfo(j);
5036*5c90c05cSAndroid Build Coastguard Worker       if (!test_info.should_run() || !test_info.result()->Failed()) {
5037*5c90c05cSAndroid Build Coastguard Worker         continue;
5038*5c90c05cSAndroid Build Coastguard Worker       }
5039*5c90c05cSAndroid Build Coastguard Worker       ColoredPrintf(GTestColor::kRed, "[  FAILED  ] ");
5040*5c90c05cSAndroid Build Coastguard Worker       printf("%s.%s", test_suite.name(), test_info.name());
5041*5c90c05cSAndroid Build Coastguard Worker       PrintFullTestCommentIfPresent(test_info);
5042*5c90c05cSAndroid Build Coastguard Worker       printf("\n");
5043*5c90c05cSAndroid Build Coastguard Worker     }
5044*5c90c05cSAndroid Build Coastguard Worker   }
5045*5c90c05cSAndroid Build Coastguard Worker   printf("\n%2d FAILED %s\n", failed_test_count,
5046*5c90c05cSAndroid Build Coastguard Worker          failed_test_count == 1 ? "TEST" : "TESTS");
5047*5c90c05cSAndroid Build Coastguard Worker }
5048*5c90c05cSAndroid Build Coastguard Worker 
5049*5c90c05cSAndroid Build Coastguard Worker // Internal helper for printing the list of test suite failures not covered by
5050*5c90c05cSAndroid Build Coastguard Worker // PrintFailedTests.
PrintFailedTestSuites(const UnitTest & unit_test)5051*5c90c05cSAndroid Build Coastguard Worker void PrettyUnitTestResultPrinter::PrintFailedTestSuites(
5052*5c90c05cSAndroid Build Coastguard Worker     const UnitTest& unit_test) {
5053*5c90c05cSAndroid Build Coastguard Worker   int suite_failure_count = 0;
5054*5c90c05cSAndroid Build Coastguard Worker   for (int i = 0; i < unit_test.total_test_suite_count(); ++i) {
5055*5c90c05cSAndroid Build Coastguard Worker     const TestSuite& test_suite = *unit_test.GetTestSuite(i);
5056*5c90c05cSAndroid Build Coastguard Worker     if (!test_suite.should_run()) {
5057*5c90c05cSAndroid Build Coastguard Worker       continue;
5058*5c90c05cSAndroid Build Coastguard Worker     }
5059*5c90c05cSAndroid Build Coastguard Worker     if (test_suite.ad_hoc_test_result().Failed()) {
5060*5c90c05cSAndroid Build Coastguard Worker       ColoredPrintf(GTestColor::kRed, "[  FAILED  ] ");
5061*5c90c05cSAndroid Build Coastguard Worker       printf("%s: SetUpTestSuite or TearDownTestSuite\n", test_suite.name());
5062*5c90c05cSAndroid Build Coastguard Worker       ++suite_failure_count;
5063*5c90c05cSAndroid Build Coastguard Worker     }
5064*5c90c05cSAndroid Build Coastguard Worker   }
5065*5c90c05cSAndroid Build Coastguard Worker   if (suite_failure_count > 0) {
5066*5c90c05cSAndroid Build Coastguard Worker     printf("\n%2d FAILED TEST %s\n", suite_failure_count,
5067*5c90c05cSAndroid Build Coastguard Worker            suite_failure_count == 1 ? "SUITE" : "SUITES");
5068*5c90c05cSAndroid Build Coastguard Worker   }
5069*5c90c05cSAndroid Build Coastguard Worker }
5070*5c90c05cSAndroid Build Coastguard Worker 
5071*5c90c05cSAndroid Build Coastguard Worker // Internal helper for printing the list of skipped tests.
PrintSkippedTests(const UnitTest & unit_test)5072*5c90c05cSAndroid Build Coastguard Worker void PrettyUnitTestResultPrinter::PrintSkippedTests(const UnitTest& unit_test) {
5073*5c90c05cSAndroid Build Coastguard Worker   const int skipped_test_count = unit_test.skipped_test_count();
5074*5c90c05cSAndroid Build Coastguard Worker   if (skipped_test_count == 0) {
5075*5c90c05cSAndroid Build Coastguard Worker     return;
5076*5c90c05cSAndroid Build Coastguard Worker   }
5077*5c90c05cSAndroid Build Coastguard Worker 
5078*5c90c05cSAndroid Build Coastguard Worker   for (int i = 0; i < unit_test.total_test_suite_count(); ++i) {
5079*5c90c05cSAndroid Build Coastguard Worker     const TestSuite& test_suite = *unit_test.GetTestSuite(i);
5080*5c90c05cSAndroid Build Coastguard Worker     if (!test_suite.should_run() || (test_suite.skipped_test_count() == 0)) {
5081*5c90c05cSAndroid Build Coastguard Worker       continue;
5082*5c90c05cSAndroid Build Coastguard Worker     }
5083*5c90c05cSAndroid Build Coastguard Worker     for (int j = 0; j < test_suite.total_test_count(); ++j) {
5084*5c90c05cSAndroid Build Coastguard Worker       const TestInfo& test_info = *test_suite.GetTestInfo(j);
5085*5c90c05cSAndroid Build Coastguard Worker       if (!test_info.should_run() || !test_info.result()->Skipped()) {
5086*5c90c05cSAndroid Build Coastguard Worker         continue;
5087*5c90c05cSAndroid Build Coastguard Worker       }
5088*5c90c05cSAndroid Build Coastguard Worker       ColoredPrintf(GTestColor::kGreen, "[  SKIPPED ] ");
5089*5c90c05cSAndroid Build Coastguard Worker       printf("%s.%s", test_suite.name(), test_info.name());
5090*5c90c05cSAndroid Build Coastguard Worker       printf("\n");
5091*5c90c05cSAndroid Build Coastguard Worker     }
5092*5c90c05cSAndroid Build Coastguard Worker   }
5093*5c90c05cSAndroid Build Coastguard Worker }
5094*5c90c05cSAndroid Build Coastguard Worker 
OnTestIterationEnd(const UnitTest & unit_test,int)5095*5c90c05cSAndroid Build Coastguard Worker void PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
5096*5c90c05cSAndroid Build Coastguard Worker                                                      int /*iteration*/) {
5097*5c90c05cSAndroid Build Coastguard Worker   ColoredPrintf(GTestColor::kGreen, "[==========] ");
5098*5c90c05cSAndroid Build Coastguard Worker   printf("%s from %s ran.",
5099*5c90c05cSAndroid Build Coastguard Worker          FormatTestCount(unit_test.test_to_run_count()).c_str(),
5100*5c90c05cSAndroid Build Coastguard Worker          FormatTestSuiteCount(unit_test.test_suite_to_run_count()).c_str());
5101*5c90c05cSAndroid Build Coastguard Worker   if (GTEST_FLAG(print_time)) {
5102*5c90c05cSAndroid Build Coastguard Worker     printf(" (%s ms total)",
5103*5c90c05cSAndroid Build Coastguard Worker            internal::StreamableToString(unit_test.elapsed_time()).c_str());
5104*5c90c05cSAndroid Build Coastguard Worker   }
5105*5c90c05cSAndroid Build Coastguard Worker   printf("\n");
5106*5c90c05cSAndroid Build Coastguard Worker   ColoredPrintf(GTestColor::kGreen, "[  PASSED  ] ");
5107*5c90c05cSAndroid Build Coastguard Worker   printf("%s.\n", FormatTestCount(unit_test.successful_test_count()).c_str());
5108*5c90c05cSAndroid Build Coastguard Worker 
5109*5c90c05cSAndroid Build Coastguard Worker   const int skipped_test_count = unit_test.skipped_test_count();
5110*5c90c05cSAndroid Build Coastguard Worker   if (skipped_test_count > 0) {
5111*5c90c05cSAndroid Build Coastguard Worker     ColoredPrintf(GTestColor::kGreen, "[  SKIPPED ] ");
5112*5c90c05cSAndroid Build Coastguard Worker     printf("%s, listed below:\n", FormatTestCount(skipped_test_count).c_str());
5113*5c90c05cSAndroid Build Coastguard Worker     PrintSkippedTests(unit_test);
5114*5c90c05cSAndroid Build Coastguard Worker   }
5115*5c90c05cSAndroid Build Coastguard Worker 
5116*5c90c05cSAndroid Build Coastguard Worker   if (!unit_test.Passed()) {
5117*5c90c05cSAndroid Build Coastguard Worker     PrintFailedTests(unit_test);
5118*5c90c05cSAndroid Build Coastguard Worker     PrintFailedTestSuites(unit_test);
5119*5c90c05cSAndroid Build Coastguard Worker   }
5120*5c90c05cSAndroid Build Coastguard Worker 
5121*5c90c05cSAndroid Build Coastguard Worker   int num_disabled = unit_test.reportable_disabled_test_count();
5122*5c90c05cSAndroid Build Coastguard Worker   if (num_disabled && !GTEST_FLAG(also_run_disabled_tests)) {
5123*5c90c05cSAndroid Build Coastguard Worker     if (unit_test.Passed()) {
5124*5c90c05cSAndroid Build Coastguard Worker       printf("\n");  // Add a spacer if no FAILURE banner is displayed.
5125*5c90c05cSAndroid Build Coastguard Worker     }
5126*5c90c05cSAndroid Build Coastguard Worker     ColoredPrintf(GTestColor::kYellow, "  YOU HAVE %d DISABLED %s\n\n",
5127*5c90c05cSAndroid Build Coastguard Worker                   num_disabled, num_disabled == 1 ? "TEST" : "TESTS");
5128*5c90c05cSAndroid Build Coastguard Worker   }
5129*5c90c05cSAndroid Build Coastguard Worker   // Ensure that Google Test output is printed before, e.g., heapchecker output.
5130*5c90c05cSAndroid Build Coastguard Worker   fflush(stdout);
5131*5c90c05cSAndroid Build Coastguard Worker }
5132*5c90c05cSAndroid Build Coastguard Worker 
5133*5c90c05cSAndroid Build Coastguard Worker // End PrettyUnitTestResultPrinter
5134*5c90c05cSAndroid Build Coastguard Worker 
5135*5c90c05cSAndroid Build Coastguard Worker // This class implements the TestEventListener interface.
5136*5c90c05cSAndroid Build Coastguard Worker //
5137*5c90c05cSAndroid Build Coastguard Worker // Class BriefUnitTestResultPrinter is copyable.
5138*5c90c05cSAndroid Build Coastguard Worker class BriefUnitTestResultPrinter : public TestEventListener {
5139*5c90c05cSAndroid Build Coastguard Worker  public:
BriefUnitTestResultPrinter()5140*5c90c05cSAndroid Build Coastguard Worker   BriefUnitTestResultPrinter() {}
PrintTestName(const char * test_suite,const char * test)5141*5c90c05cSAndroid Build Coastguard Worker   static void PrintTestName(const char* test_suite, const char* test) {
5142*5c90c05cSAndroid Build Coastguard Worker     printf("%s.%s", test_suite, test);
5143*5c90c05cSAndroid Build Coastguard Worker   }
5144*5c90c05cSAndroid Build Coastguard Worker 
5145*5c90c05cSAndroid Build Coastguard Worker   // The following methods override what's in the TestEventListener class.
OnTestProgramStart(const UnitTest &)5146*5c90c05cSAndroid Build Coastguard Worker   void OnTestProgramStart(const UnitTest& /*unit_test*/) override {}
OnTestIterationStart(const UnitTest &,int)5147*5c90c05cSAndroid Build Coastguard Worker   void OnTestIterationStart(const UnitTest& /*unit_test*/,
5148*5c90c05cSAndroid Build Coastguard Worker                             int /*iteration*/) override {}
OnEnvironmentsSetUpStart(const UnitTest &)5149*5c90c05cSAndroid Build Coastguard Worker   void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) override {}
OnEnvironmentsSetUpEnd(const UnitTest &)5150*5c90c05cSAndroid Build Coastguard Worker   void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) override {}
5151*5c90c05cSAndroid Build Coastguard Worker #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
OnTestCaseStart(const TestCase &)5152*5c90c05cSAndroid Build Coastguard Worker   void OnTestCaseStart(const TestCase& /*test_case*/) override {}
5153*5c90c05cSAndroid Build Coastguard Worker #else
OnTestSuiteStart(const TestSuite &)5154*5c90c05cSAndroid Build Coastguard Worker   void OnTestSuiteStart(const TestSuite& /*test_suite*/) override {}
5155*5c90c05cSAndroid Build Coastguard Worker #endif  // OnTestCaseStart
5156*5c90c05cSAndroid Build Coastguard Worker 
OnTestStart(const TestInfo &)5157*5c90c05cSAndroid Build Coastguard Worker   void OnTestStart(const TestInfo& /*test_info*/) override {}
5158*5c90c05cSAndroid Build Coastguard Worker 
5159*5c90c05cSAndroid Build Coastguard Worker   void OnTestPartResult(const TestPartResult& result) override;
5160*5c90c05cSAndroid Build Coastguard Worker   void OnTestEnd(const TestInfo& test_info) override;
5161*5c90c05cSAndroid Build Coastguard Worker #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
OnTestCaseEnd(const TestCase &)5162*5c90c05cSAndroid Build Coastguard Worker   void OnTestCaseEnd(const TestCase& /*test_case*/) override {}
5163*5c90c05cSAndroid Build Coastguard Worker #else
OnTestSuiteEnd(const TestSuite &)5164*5c90c05cSAndroid Build Coastguard Worker   void OnTestSuiteEnd(const TestSuite& /*test_suite*/) override {}
5165*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
5166*5c90c05cSAndroid Build Coastguard Worker 
OnEnvironmentsTearDownStart(const UnitTest &)5167*5c90c05cSAndroid Build Coastguard Worker   void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) override {}
OnEnvironmentsTearDownEnd(const UnitTest &)5168*5c90c05cSAndroid Build Coastguard Worker   void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) override {}
5169*5c90c05cSAndroid Build Coastguard Worker   void OnTestIterationEnd(const UnitTest& unit_test, int iteration) override;
OnTestProgramEnd(const UnitTest &)5170*5c90c05cSAndroid Build Coastguard Worker   void OnTestProgramEnd(const UnitTest& /*unit_test*/) override {}
5171*5c90c05cSAndroid Build Coastguard Worker };
5172*5c90c05cSAndroid Build Coastguard Worker 
5173*5c90c05cSAndroid Build Coastguard Worker // Called after an assertion failure.
OnTestPartResult(const TestPartResult & result)5174*5c90c05cSAndroid Build Coastguard Worker void BriefUnitTestResultPrinter::OnTestPartResult(
5175*5c90c05cSAndroid Build Coastguard Worker     const TestPartResult& result) {
5176*5c90c05cSAndroid Build Coastguard Worker   switch (result.type()) {
5177*5c90c05cSAndroid Build Coastguard Worker     // If the test part succeeded, we don't need to do anything.
5178*5c90c05cSAndroid Build Coastguard Worker     case TestPartResult::kSuccess:
5179*5c90c05cSAndroid Build Coastguard Worker       return;
5180*5c90c05cSAndroid Build Coastguard Worker     default:
5181*5c90c05cSAndroid Build Coastguard Worker       // Print failure message from the assertion
5182*5c90c05cSAndroid Build Coastguard Worker       // (e.g. expected this and got that).
5183*5c90c05cSAndroid Build Coastguard Worker       PrintTestPartResult(result);
5184*5c90c05cSAndroid Build Coastguard Worker       fflush(stdout);
5185*5c90c05cSAndroid Build Coastguard Worker   }
5186*5c90c05cSAndroid Build Coastguard Worker }
5187*5c90c05cSAndroid Build Coastguard Worker 
OnTestEnd(const TestInfo & test_info)5188*5c90c05cSAndroid Build Coastguard Worker void BriefUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) {
5189*5c90c05cSAndroid Build Coastguard Worker   if (test_info.result()->Failed()) {
5190*5c90c05cSAndroid Build Coastguard Worker     ColoredPrintf(GTestColor::kRed, "[  FAILED  ] ");
5191*5c90c05cSAndroid Build Coastguard Worker     PrintTestName(test_info.test_suite_name(), test_info.name());
5192*5c90c05cSAndroid Build Coastguard Worker     PrintFullTestCommentIfPresent(test_info);
5193*5c90c05cSAndroid Build Coastguard Worker 
5194*5c90c05cSAndroid Build Coastguard Worker     if (GTEST_FLAG(print_time)) {
5195*5c90c05cSAndroid Build Coastguard Worker       printf(" (%s ms)\n",
5196*5c90c05cSAndroid Build Coastguard Worker              internal::StreamableToString(test_info.result()->elapsed_time())
5197*5c90c05cSAndroid Build Coastguard Worker                  .c_str());
5198*5c90c05cSAndroid Build Coastguard Worker     } else {
5199*5c90c05cSAndroid Build Coastguard Worker       printf("\n");
5200*5c90c05cSAndroid Build Coastguard Worker     }
5201*5c90c05cSAndroid Build Coastguard Worker     fflush(stdout);
5202*5c90c05cSAndroid Build Coastguard Worker   }
5203*5c90c05cSAndroid Build Coastguard Worker }
5204*5c90c05cSAndroid Build Coastguard Worker 
OnTestIterationEnd(const UnitTest & unit_test,int)5205*5c90c05cSAndroid Build Coastguard Worker void BriefUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
5206*5c90c05cSAndroid Build Coastguard Worker                                                     int /*iteration*/) {
5207*5c90c05cSAndroid Build Coastguard Worker   ColoredPrintf(GTestColor::kGreen, "[==========] ");
5208*5c90c05cSAndroid Build Coastguard Worker   printf("%s from %s ran.",
5209*5c90c05cSAndroid Build Coastguard Worker          FormatTestCount(unit_test.test_to_run_count()).c_str(),
5210*5c90c05cSAndroid Build Coastguard Worker          FormatTestSuiteCount(unit_test.test_suite_to_run_count()).c_str());
5211*5c90c05cSAndroid Build Coastguard Worker   if (GTEST_FLAG(print_time)) {
5212*5c90c05cSAndroid Build Coastguard Worker     printf(" (%s ms total)",
5213*5c90c05cSAndroid Build Coastguard Worker            internal::StreamableToString(unit_test.elapsed_time()).c_str());
5214*5c90c05cSAndroid Build Coastguard Worker   }
5215*5c90c05cSAndroid Build Coastguard Worker   printf("\n");
5216*5c90c05cSAndroid Build Coastguard Worker   ColoredPrintf(GTestColor::kGreen, "[  PASSED  ] ");
5217*5c90c05cSAndroid Build Coastguard Worker   printf("%s.\n", FormatTestCount(unit_test.successful_test_count()).c_str());
5218*5c90c05cSAndroid Build Coastguard Worker 
5219*5c90c05cSAndroid Build Coastguard Worker   const int skipped_test_count = unit_test.skipped_test_count();
5220*5c90c05cSAndroid Build Coastguard Worker   if (skipped_test_count > 0) {
5221*5c90c05cSAndroid Build Coastguard Worker     ColoredPrintf(GTestColor::kGreen, "[  SKIPPED ] ");
5222*5c90c05cSAndroid Build Coastguard Worker     printf("%s.\n", FormatTestCount(skipped_test_count).c_str());
5223*5c90c05cSAndroid Build Coastguard Worker   }
5224*5c90c05cSAndroid Build Coastguard Worker 
5225*5c90c05cSAndroid Build Coastguard Worker   int num_disabled = unit_test.reportable_disabled_test_count();
5226*5c90c05cSAndroid Build Coastguard Worker   if (num_disabled && !GTEST_FLAG(also_run_disabled_tests)) {
5227*5c90c05cSAndroid Build Coastguard Worker     if (unit_test.Passed()) {
5228*5c90c05cSAndroid Build Coastguard Worker       printf("\n");  // Add a spacer if no FAILURE banner is displayed.
5229*5c90c05cSAndroid Build Coastguard Worker     }
5230*5c90c05cSAndroid Build Coastguard Worker     ColoredPrintf(GTestColor::kYellow, "  YOU HAVE %d DISABLED %s\n\n",
5231*5c90c05cSAndroid Build Coastguard Worker                   num_disabled, num_disabled == 1 ? "TEST" : "TESTS");
5232*5c90c05cSAndroid Build Coastguard Worker   }
5233*5c90c05cSAndroid Build Coastguard Worker   // Ensure that Google Test output is printed before, e.g., heapchecker output.
5234*5c90c05cSAndroid Build Coastguard Worker   fflush(stdout);
5235*5c90c05cSAndroid Build Coastguard Worker }
5236*5c90c05cSAndroid Build Coastguard Worker 
5237*5c90c05cSAndroid Build Coastguard Worker // End BriefUnitTestResultPrinter
5238*5c90c05cSAndroid Build Coastguard Worker 
5239*5c90c05cSAndroid Build Coastguard Worker // class TestEventRepeater
5240*5c90c05cSAndroid Build Coastguard Worker //
5241*5c90c05cSAndroid Build Coastguard Worker // This class forwards events to other event listeners.
5242*5c90c05cSAndroid Build Coastguard Worker class TestEventRepeater : public TestEventListener {
5243*5c90c05cSAndroid Build Coastguard Worker  public:
TestEventRepeater()5244*5c90c05cSAndroid Build Coastguard Worker   TestEventRepeater() : forwarding_enabled_(true) {}
5245*5c90c05cSAndroid Build Coastguard Worker   ~TestEventRepeater() override;
5246*5c90c05cSAndroid Build Coastguard Worker   void Append(TestEventListener *listener);
5247*5c90c05cSAndroid Build Coastguard Worker   TestEventListener* Release(TestEventListener* listener);
5248*5c90c05cSAndroid Build Coastguard Worker 
5249*5c90c05cSAndroid Build Coastguard Worker   // Controls whether events will be forwarded to listeners_. Set to false
5250*5c90c05cSAndroid Build Coastguard Worker   // in death test child processes.
forwarding_enabled() const5251*5c90c05cSAndroid Build Coastguard Worker   bool forwarding_enabled() const { return forwarding_enabled_; }
set_forwarding_enabled(bool enable)5252*5c90c05cSAndroid Build Coastguard Worker   void set_forwarding_enabled(bool enable) { forwarding_enabled_ = enable; }
5253*5c90c05cSAndroid Build Coastguard Worker 
5254*5c90c05cSAndroid Build Coastguard Worker   void OnTestProgramStart(const UnitTest& unit_test) override;
5255*5c90c05cSAndroid Build Coastguard Worker   void OnTestIterationStart(const UnitTest& unit_test, int iteration) override;
5256*5c90c05cSAndroid Build Coastguard Worker   void OnEnvironmentsSetUpStart(const UnitTest& unit_test) override;
5257*5c90c05cSAndroid Build Coastguard Worker   void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) override;
5258*5c90c05cSAndroid Build Coastguard Worker //  Legacy API is deprecated but still available
5259*5c90c05cSAndroid Build Coastguard Worker #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
5260*5c90c05cSAndroid Build Coastguard Worker   void OnTestCaseStart(const TestSuite& parameter) override;
5261*5c90c05cSAndroid Build Coastguard Worker #endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_
5262*5c90c05cSAndroid Build Coastguard Worker   void OnTestSuiteStart(const TestSuite& parameter) override;
5263*5c90c05cSAndroid Build Coastguard Worker   void OnTestStart(const TestInfo& test_info) override;
5264*5c90c05cSAndroid Build Coastguard Worker   void OnTestPartResult(const TestPartResult& result) override;
5265*5c90c05cSAndroid Build Coastguard Worker   void OnTestEnd(const TestInfo& test_info) override;
5266*5c90c05cSAndroid Build Coastguard Worker //  Legacy API is deprecated but still available
5267*5c90c05cSAndroid Build Coastguard Worker #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
5268*5c90c05cSAndroid Build Coastguard Worker   void OnTestCaseEnd(const TestCase& parameter) override;
5269*5c90c05cSAndroid Build Coastguard Worker #endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_
5270*5c90c05cSAndroid Build Coastguard Worker   void OnTestSuiteEnd(const TestSuite& parameter) override;
5271*5c90c05cSAndroid Build Coastguard Worker   void OnEnvironmentsTearDownStart(const UnitTest& unit_test) override;
5272*5c90c05cSAndroid Build Coastguard Worker   void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) override;
5273*5c90c05cSAndroid Build Coastguard Worker   void OnTestIterationEnd(const UnitTest& unit_test, int iteration) override;
5274*5c90c05cSAndroid Build Coastguard Worker   void OnTestProgramEnd(const UnitTest& unit_test) override;
5275*5c90c05cSAndroid Build Coastguard Worker 
5276*5c90c05cSAndroid Build Coastguard Worker  private:
5277*5c90c05cSAndroid Build Coastguard Worker   // Controls whether events will be forwarded to listeners_. Set to false
5278*5c90c05cSAndroid Build Coastguard Worker   // in death test child processes.
5279*5c90c05cSAndroid Build Coastguard Worker   bool forwarding_enabled_;
5280*5c90c05cSAndroid Build Coastguard Worker   // The list of listeners that receive events.
5281*5c90c05cSAndroid Build Coastguard Worker   std::vector<TestEventListener*> listeners_;
5282*5c90c05cSAndroid Build Coastguard Worker 
5283*5c90c05cSAndroid Build Coastguard Worker   GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventRepeater);
5284*5c90c05cSAndroid Build Coastguard Worker };
5285*5c90c05cSAndroid Build Coastguard Worker 
~TestEventRepeater()5286*5c90c05cSAndroid Build Coastguard Worker TestEventRepeater::~TestEventRepeater() {
5287*5c90c05cSAndroid Build Coastguard Worker   ForEach(listeners_, Delete<TestEventListener>);
5288*5c90c05cSAndroid Build Coastguard Worker }
5289*5c90c05cSAndroid Build Coastguard Worker 
Append(TestEventListener * listener)5290*5c90c05cSAndroid Build Coastguard Worker void TestEventRepeater::Append(TestEventListener *listener) {
5291*5c90c05cSAndroid Build Coastguard Worker   listeners_.push_back(listener);
5292*5c90c05cSAndroid Build Coastguard Worker }
5293*5c90c05cSAndroid Build Coastguard Worker 
Release(TestEventListener * listener)5294*5c90c05cSAndroid Build Coastguard Worker TestEventListener* TestEventRepeater::Release(TestEventListener *listener) {
5295*5c90c05cSAndroid Build Coastguard Worker   for (size_t i = 0; i < listeners_.size(); ++i) {
5296*5c90c05cSAndroid Build Coastguard Worker     if (listeners_[i] == listener) {
5297*5c90c05cSAndroid Build Coastguard Worker       listeners_.erase(listeners_.begin() + static_cast<int>(i));
5298*5c90c05cSAndroid Build Coastguard Worker       return listener;
5299*5c90c05cSAndroid Build Coastguard Worker     }
5300*5c90c05cSAndroid Build Coastguard Worker   }
5301*5c90c05cSAndroid Build Coastguard Worker 
5302*5c90c05cSAndroid Build Coastguard Worker   return nullptr;
5303*5c90c05cSAndroid Build Coastguard Worker }
5304*5c90c05cSAndroid Build Coastguard Worker 
5305*5c90c05cSAndroid Build Coastguard Worker // Since most methods are very similar, use macros to reduce boilerplate.
5306*5c90c05cSAndroid Build Coastguard Worker // This defines a member that forwards the call to all listeners.
5307*5c90c05cSAndroid Build Coastguard Worker #define GTEST_REPEATER_METHOD_(Name, Type) \
5308*5c90c05cSAndroid Build Coastguard Worker void TestEventRepeater::Name(const Type& parameter) { \
5309*5c90c05cSAndroid Build Coastguard Worker   if (forwarding_enabled_) { \
5310*5c90c05cSAndroid Build Coastguard Worker     for (size_t i = 0; i < listeners_.size(); i++) { \
5311*5c90c05cSAndroid Build Coastguard Worker       listeners_[i]->Name(parameter); \
5312*5c90c05cSAndroid Build Coastguard Worker     } \
5313*5c90c05cSAndroid Build Coastguard Worker   } \
5314*5c90c05cSAndroid Build Coastguard Worker }
5315*5c90c05cSAndroid Build Coastguard Worker // This defines a member that forwards the call to all listeners in reverse
5316*5c90c05cSAndroid Build Coastguard Worker // order.
5317*5c90c05cSAndroid Build Coastguard Worker #define GTEST_REVERSE_REPEATER_METHOD_(Name, Type)      \
5318*5c90c05cSAndroid Build Coastguard Worker   void TestEventRepeater::Name(const Type& parameter) { \
5319*5c90c05cSAndroid Build Coastguard Worker     if (forwarding_enabled_) {                          \
5320*5c90c05cSAndroid Build Coastguard Worker       for (size_t i = listeners_.size(); i != 0; i--) { \
5321*5c90c05cSAndroid Build Coastguard Worker         listeners_[i - 1]->Name(parameter);             \
5322*5c90c05cSAndroid Build Coastguard Worker       }                                                 \
5323*5c90c05cSAndroid Build Coastguard Worker     }                                                   \
5324*5c90c05cSAndroid Build Coastguard Worker   }
5325*5c90c05cSAndroid Build Coastguard Worker 
GTEST_REPEATER_METHOD_(OnTestProgramStart,UnitTest)5326*5c90c05cSAndroid Build Coastguard Worker GTEST_REPEATER_METHOD_(OnTestProgramStart, UnitTest)
5327*5c90c05cSAndroid Build Coastguard Worker GTEST_REPEATER_METHOD_(OnEnvironmentsSetUpStart, UnitTest)
5328*5c90c05cSAndroid Build Coastguard Worker //  Legacy API is deprecated but still available
5329*5c90c05cSAndroid Build Coastguard Worker #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
5330*5c90c05cSAndroid Build Coastguard Worker GTEST_REPEATER_METHOD_(OnTestCaseStart, TestSuite)
5331*5c90c05cSAndroid Build Coastguard Worker #endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_
5332*5c90c05cSAndroid Build Coastguard Worker GTEST_REPEATER_METHOD_(OnTestSuiteStart, TestSuite)
5333*5c90c05cSAndroid Build Coastguard Worker GTEST_REPEATER_METHOD_(OnTestStart, TestInfo)
5334*5c90c05cSAndroid Build Coastguard Worker GTEST_REPEATER_METHOD_(OnTestPartResult, TestPartResult)
5335*5c90c05cSAndroid Build Coastguard Worker GTEST_REPEATER_METHOD_(OnEnvironmentsTearDownStart, UnitTest)
5336*5c90c05cSAndroid Build Coastguard Worker GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsSetUpEnd, UnitTest)
5337*5c90c05cSAndroid Build Coastguard Worker GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsTearDownEnd, UnitTest)
5338*5c90c05cSAndroid Build Coastguard Worker GTEST_REVERSE_REPEATER_METHOD_(OnTestEnd, TestInfo)
5339*5c90c05cSAndroid Build Coastguard Worker //  Legacy API is deprecated but still available
5340*5c90c05cSAndroid Build Coastguard Worker #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
5341*5c90c05cSAndroid Build Coastguard Worker GTEST_REVERSE_REPEATER_METHOD_(OnTestCaseEnd, TestSuite)
5342*5c90c05cSAndroid Build Coastguard Worker #endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_
5343*5c90c05cSAndroid Build Coastguard Worker GTEST_REVERSE_REPEATER_METHOD_(OnTestSuiteEnd, TestSuite)
5344*5c90c05cSAndroid Build Coastguard Worker GTEST_REVERSE_REPEATER_METHOD_(OnTestProgramEnd, UnitTest)
5345*5c90c05cSAndroid Build Coastguard Worker 
5346*5c90c05cSAndroid Build Coastguard Worker #undef GTEST_REPEATER_METHOD_
5347*5c90c05cSAndroid Build Coastguard Worker #undef GTEST_REVERSE_REPEATER_METHOD_
5348*5c90c05cSAndroid Build Coastguard Worker 
5349*5c90c05cSAndroid Build Coastguard Worker void TestEventRepeater::OnTestIterationStart(const UnitTest& unit_test,
5350*5c90c05cSAndroid Build Coastguard Worker                                              int iteration) {
5351*5c90c05cSAndroid Build Coastguard Worker   if (forwarding_enabled_) {
5352*5c90c05cSAndroid Build Coastguard Worker     for (size_t i = 0; i < listeners_.size(); i++) {
5353*5c90c05cSAndroid Build Coastguard Worker       listeners_[i]->OnTestIterationStart(unit_test, iteration);
5354*5c90c05cSAndroid Build Coastguard Worker     }
5355*5c90c05cSAndroid Build Coastguard Worker   }
5356*5c90c05cSAndroid Build Coastguard Worker }
5357*5c90c05cSAndroid Build Coastguard Worker 
OnTestIterationEnd(const UnitTest & unit_test,int iteration)5358*5c90c05cSAndroid Build Coastguard Worker void TestEventRepeater::OnTestIterationEnd(const UnitTest& unit_test,
5359*5c90c05cSAndroid Build Coastguard Worker                                            int iteration) {
5360*5c90c05cSAndroid Build Coastguard Worker   if (forwarding_enabled_) {
5361*5c90c05cSAndroid Build Coastguard Worker     for (size_t i = listeners_.size(); i > 0; i--) {
5362*5c90c05cSAndroid Build Coastguard Worker       listeners_[i - 1]->OnTestIterationEnd(unit_test, iteration);
5363*5c90c05cSAndroid Build Coastguard Worker     }
5364*5c90c05cSAndroid Build Coastguard Worker   }
5365*5c90c05cSAndroid Build Coastguard Worker }
5366*5c90c05cSAndroid Build Coastguard Worker 
5367*5c90c05cSAndroid Build Coastguard Worker // End TestEventRepeater
5368*5c90c05cSAndroid Build Coastguard Worker 
5369*5c90c05cSAndroid Build Coastguard Worker // This class generates an XML output file.
5370*5c90c05cSAndroid Build Coastguard Worker class XmlUnitTestResultPrinter : public EmptyTestEventListener {
5371*5c90c05cSAndroid Build Coastguard Worker  public:
5372*5c90c05cSAndroid Build Coastguard Worker   explicit XmlUnitTestResultPrinter(const char* output_file);
5373*5c90c05cSAndroid Build Coastguard Worker 
5374*5c90c05cSAndroid Build Coastguard Worker   void OnTestIterationEnd(const UnitTest& unit_test, int iteration) override;
5375*5c90c05cSAndroid Build Coastguard Worker   void ListTestsMatchingFilter(const std::vector<TestSuite*>& test_suites);
5376*5c90c05cSAndroid Build Coastguard Worker 
5377*5c90c05cSAndroid Build Coastguard Worker   // Prints an XML summary of all unit tests.
5378*5c90c05cSAndroid Build Coastguard Worker   static void PrintXmlTestsList(std::ostream* stream,
5379*5c90c05cSAndroid Build Coastguard Worker                                 const std::vector<TestSuite*>& test_suites);
5380*5c90c05cSAndroid Build Coastguard Worker 
5381*5c90c05cSAndroid Build Coastguard Worker  private:
5382*5c90c05cSAndroid Build Coastguard Worker   // Is c a whitespace character that is normalized to a space character
5383*5c90c05cSAndroid Build Coastguard Worker   // when it appears in an XML attribute value?
IsNormalizableWhitespace(char c)5384*5c90c05cSAndroid Build Coastguard Worker   static bool IsNormalizableWhitespace(char c) {
5385*5c90c05cSAndroid Build Coastguard Worker     return c == 0x9 || c == 0xA || c == 0xD;
5386*5c90c05cSAndroid Build Coastguard Worker   }
5387*5c90c05cSAndroid Build Coastguard Worker 
5388*5c90c05cSAndroid Build Coastguard Worker   // May c appear in a well-formed XML document?
IsValidXmlCharacter(char c)5389*5c90c05cSAndroid Build Coastguard Worker   static bool IsValidXmlCharacter(char c) {
5390*5c90c05cSAndroid Build Coastguard Worker     return IsNormalizableWhitespace(c) || c >= 0x20;
5391*5c90c05cSAndroid Build Coastguard Worker   }
5392*5c90c05cSAndroid Build Coastguard Worker 
5393*5c90c05cSAndroid Build Coastguard Worker   // Returns an XML-escaped copy of the input string str.  If
5394*5c90c05cSAndroid Build Coastguard Worker   // is_attribute is true, the text is meant to appear as an attribute
5395*5c90c05cSAndroid Build Coastguard Worker   // value, and normalizable whitespace is preserved by replacing it
5396*5c90c05cSAndroid Build Coastguard Worker   // with character references.
5397*5c90c05cSAndroid Build Coastguard Worker   static std::string EscapeXml(const std::string& str, bool is_attribute);
5398*5c90c05cSAndroid Build Coastguard Worker 
5399*5c90c05cSAndroid Build Coastguard Worker   // Returns the given string with all characters invalid in XML removed.
5400*5c90c05cSAndroid Build Coastguard Worker   static std::string RemoveInvalidXmlCharacters(const std::string& str);
5401*5c90c05cSAndroid Build Coastguard Worker 
5402*5c90c05cSAndroid Build Coastguard Worker   // Convenience wrapper around EscapeXml when str is an attribute value.
EscapeXmlAttribute(const std::string & str)5403*5c90c05cSAndroid Build Coastguard Worker   static std::string EscapeXmlAttribute(const std::string& str) {
5404*5c90c05cSAndroid Build Coastguard Worker     return EscapeXml(str, true);
5405*5c90c05cSAndroid Build Coastguard Worker   }
5406*5c90c05cSAndroid Build Coastguard Worker 
5407*5c90c05cSAndroid Build Coastguard Worker   // Convenience wrapper around EscapeXml when str is not an attribute value.
EscapeXmlText(const char * str)5408*5c90c05cSAndroid Build Coastguard Worker   static std::string EscapeXmlText(const char* str) {
5409*5c90c05cSAndroid Build Coastguard Worker     return EscapeXml(str, false);
5410*5c90c05cSAndroid Build Coastguard Worker   }
5411*5c90c05cSAndroid Build Coastguard Worker 
5412*5c90c05cSAndroid Build Coastguard Worker   // Verifies that the given attribute belongs to the given element and
5413*5c90c05cSAndroid Build Coastguard Worker   // streams the attribute as XML.
5414*5c90c05cSAndroid Build Coastguard Worker   static void OutputXmlAttribute(std::ostream* stream,
5415*5c90c05cSAndroid Build Coastguard Worker                                  const std::string& element_name,
5416*5c90c05cSAndroid Build Coastguard Worker                                  const std::string& name,
5417*5c90c05cSAndroid Build Coastguard Worker                                  const std::string& value);
5418*5c90c05cSAndroid Build Coastguard Worker 
5419*5c90c05cSAndroid Build Coastguard Worker   // Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
5420*5c90c05cSAndroid Build Coastguard Worker   static void OutputXmlCDataSection(::std::ostream* stream, const char* data);
5421*5c90c05cSAndroid Build Coastguard Worker 
5422*5c90c05cSAndroid Build Coastguard Worker   // Streams a test suite XML stanza containing the given test result.
5423*5c90c05cSAndroid Build Coastguard Worker   //
5424*5c90c05cSAndroid Build Coastguard Worker   // Requires: result.Failed()
5425*5c90c05cSAndroid Build Coastguard Worker   static void OutputXmlTestSuiteForTestResult(::std::ostream* stream,
5426*5c90c05cSAndroid Build Coastguard Worker                                               const TestResult& result);
5427*5c90c05cSAndroid Build Coastguard Worker 
5428*5c90c05cSAndroid Build Coastguard Worker   // Streams an XML representation of a TestResult object.
5429*5c90c05cSAndroid Build Coastguard Worker   static void OutputXmlTestResult(::std::ostream* stream,
5430*5c90c05cSAndroid Build Coastguard Worker                                   const TestResult& result);
5431*5c90c05cSAndroid Build Coastguard Worker 
5432*5c90c05cSAndroid Build Coastguard Worker   // Streams an XML representation of a TestInfo object.
5433*5c90c05cSAndroid Build Coastguard Worker   static void OutputXmlTestInfo(::std::ostream* stream,
5434*5c90c05cSAndroid Build Coastguard Worker                                 const char* test_suite_name,
5435*5c90c05cSAndroid Build Coastguard Worker                                 const TestInfo& test_info);
5436*5c90c05cSAndroid Build Coastguard Worker 
5437*5c90c05cSAndroid Build Coastguard Worker   // Prints an XML representation of a TestSuite object
5438*5c90c05cSAndroid Build Coastguard Worker   static void PrintXmlTestSuite(::std::ostream* stream,
5439*5c90c05cSAndroid Build Coastguard Worker                                 const TestSuite& test_suite);
5440*5c90c05cSAndroid Build Coastguard Worker 
5441*5c90c05cSAndroid Build Coastguard Worker   // Prints an XML summary of unit_test to output stream out.
5442*5c90c05cSAndroid Build Coastguard Worker   static void PrintXmlUnitTest(::std::ostream* stream,
5443*5c90c05cSAndroid Build Coastguard Worker                                const UnitTest& unit_test);
5444*5c90c05cSAndroid Build Coastguard Worker 
5445*5c90c05cSAndroid Build Coastguard Worker   // Produces a string representing the test properties in a result as space
5446*5c90c05cSAndroid Build Coastguard Worker   // delimited XML attributes based on the property key="value" pairs.
5447*5c90c05cSAndroid Build Coastguard Worker   // When the std::string is not empty, it includes a space at the beginning,
5448*5c90c05cSAndroid Build Coastguard Worker   // to delimit this attribute from prior attributes.
5449*5c90c05cSAndroid Build Coastguard Worker   static std::string TestPropertiesAsXmlAttributes(const TestResult& result);
5450*5c90c05cSAndroid Build Coastguard Worker 
5451*5c90c05cSAndroid Build Coastguard Worker   // Streams an XML representation of the test properties of a TestResult
5452*5c90c05cSAndroid Build Coastguard Worker   // object.
5453*5c90c05cSAndroid Build Coastguard Worker   static void OutputXmlTestProperties(std::ostream* stream,
5454*5c90c05cSAndroid Build Coastguard Worker                                       const TestResult& result);
5455*5c90c05cSAndroid Build Coastguard Worker 
5456*5c90c05cSAndroid Build Coastguard Worker   // The output file.
5457*5c90c05cSAndroid Build Coastguard Worker   const std::string output_file_;
5458*5c90c05cSAndroid Build Coastguard Worker 
5459*5c90c05cSAndroid Build Coastguard Worker   GTEST_DISALLOW_COPY_AND_ASSIGN_(XmlUnitTestResultPrinter);
5460*5c90c05cSAndroid Build Coastguard Worker };
5461*5c90c05cSAndroid Build Coastguard Worker 
5462*5c90c05cSAndroid Build Coastguard Worker // Creates a new XmlUnitTestResultPrinter.
XmlUnitTestResultPrinter(const char * output_file)5463*5c90c05cSAndroid Build Coastguard Worker XmlUnitTestResultPrinter::XmlUnitTestResultPrinter(const char* output_file)
5464*5c90c05cSAndroid Build Coastguard Worker     : output_file_(output_file) {
5465*5c90c05cSAndroid Build Coastguard Worker   if (output_file_.empty()) {
5466*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOG_(FATAL) << "XML output file may not be null";
5467*5c90c05cSAndroid Build Coastguard Worker   }
5468*5c90c05cSAndroid Build Coastguard Worker }
5469*5c90c05cSAndroid Build Coastguard Worker 
5470*5c90c05cSAndroid Build Coastguard Worker // Called after the unit test ends.
OnTestIterationEnd(const UnitTest & unit_test,int)5471*5c90c05cSAndroid Build Coastguard Worker void XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
5472*5c90c05cSAndroid Build Coastguard Worker                                                   int /*iteration*/) {
5473*5c90c05cSAndroid Build Coastguard Worker   FILE* xmlout = OpenFileForWriting(output_file_);
5474*5c90c05cSAndroid Build Coastguard Worker   std::stringstream stream;
5475*5c90c05cSAndroid Build Coastguard Worker   PrintXmlUnitTest(&stream, unit_test);
5476*5c90c05cSAndroid Build Coastguard Worker   fprintf(xmlout, "%s", StringStreamToString(&stream).c_str());
5477*5c90c05cSAndroid Build Coastguard Worker   fclose(xmlout);
5478*5c90c05cSAndroid Build Coastguard Worker }
5479*5c90c05cSAndroid Build Coastguard Worker 
ListTestsMatchingFilter(const std::vector<TestSuite * > & test_suites)5480*5c90c05cSAndroid Build Coastguard Worker void XmlUnitTestResultPrinter::ListTestsMatchingFilter(
5481*5c90c05cSAndroid Build Coastguard Worker     const std::vector<TestSuite*>& test_suites) {
5482*5c90c05cSAndroid Build Coastguard Worker   FILE* xmlout = OpenFileForWriting(output_file_);
5483*5c90c05cSAndroid Build Coastguard Worker   std::stringstream stream;
5484*5c90c05cSAndroid Build Coastguard Worker   PrintXmlTestsList(&stream, test_suites);
5485*5c90c05cSAndroid Build Coastguard Worker   fprintf(xmlout, "%s", StringStreamToString(&stream).c_str());
5486*5c90c05cSAndroid Build Coastguard Worker   fclose(xmlout);
5487*5c90c05cSAndroid Build Coastguard Worker }
5488*5c90c05cSAndroid Build Coastguard Worker 
5489*5c90c05cSAndroid Build Coastguard Worker // Returns an XML-escaped copy of the input string str.  If is_attribute
5490*5c90c05cSAndroid Build Coastguard Worker // is true, the text is meant to appear as an attribute value, and
5491*5c90c05cSAndroid Build Coastguard Worker // normalizable whitespace is preserved by replacing it with character
5492*5c90c05cSAndroid Build Coastguard Worker // references.
5493*5c90c05cSAndroid Build Coastguard Worker //
5494*5c90c05cSAndroid Build Coastguard Worker // Invalid XML characters in str, if any, are stripped from the output.
5495*5c90c05cSAndroid Build Coastguard Worker // It is expected that most, if not all, of the text processed by this
5496*5c90c05cSAndroid Build Coastguard Worker // module will consist of ordinary English text.
5497*5c90c05cSAndroid Build Coastguard Worker // If this module is ever modified to produce version 1.1 XML output,
5498*5c90c05cSAndroid Build Coastguard Worker // most invalid characters can be retained using character references.
EscapeXml(const std::string & str,bool is_attribute)5499*5c90c05cSAndroid Build Coastguard Worker std::string XmlUnitTestResultPrinter::EscapeXml(
5500*5c90c05cSAndroid Build Coastguard Worker     const std::string& str, bool is_attribute) {
5501*5c90c05cSAndroid Build Coastguard Worker   Message m;
5502*5c90c05cSAndroid Build Coastguard Worker 
5503*5c90c05cSAndroid Build Coastguard Worker   for (size_t i = 0; i < str.size(); ++i) {
5504*5c90c05cSAndroid Build Coastguard Worker     const char ch = str[i];
5505*5c90c05cSAndroid Build Coastguard Worker     switch (ch) {
5506*5c90c05cSAndroid Build Coastguard Worker       case '<':
5507*5c90c05cSAndroid Build Coastguard Worker         m << "&lt;";
5508*5c90c05cSAndroid Build Coastguard Worker         break;
5509*5c90c05cSAndroid Build Coastguard Worker       case '>':
5510*5c90c05cSAndroid Build Coastguard Worker         m << "&gt;";
5511*5c90c05cSAndroid Build Coastguard Worker         break;
5512*5c90c05cSAndroid Build Coastguard Worker       case '&':
5513*5c90c05cSAndroid Build Coastguard Worker         m << "&amp;";
5514*5c90c05cSAndroid Build Coastguard Worker         break;
5515*5c90c05cSAndroid Build Coastguard Worker       case '\'':
5516*5c90c05cSAndroid Build Coastguard Worker         if (is_attribute)
5517*5c90c05cSAndroid Build Coastguard Worker           m << "&apos;";
5518*5c90c05cSAndroid Build Coastguard Worker         else
5519*5c90c05cSAndroid Build Coastguard Worker           m << '\'';
5520*5c90c05cSAndroid Build Coastguard Worker         break;
5521*5c90c05cSAndroid Build Coastguard Worker       case '"':
5522*5c90c05cSAndroid Build Coastguard Worker         if (is_attribute)
5523*5c90c05cSAndroid Build Coastguard Worker           m << "&quot;";
5524*5c90c05cSAndroid Build Coastguard Worker         else
5525*5c90c05cSAndroid Build Coastguard Worker           m << '"';
5526*5c90c05cSAndroid Build Coastguard Worker         break;
5527*5c90c05cSAndroid Build Coastguard Worker       default:
5528*5c90c05cSAndroid Build Coastguard Worker         if (IsValidXmlCharacter(ch)) {
5529*5c90c05cSAndroid Build Coastguard Worker           if (is_attribute && IsNormalizableWhitespace(ch))
5530*5c90c05cSAndroid Build Coastguard Worker             m << "&#x" << String::FormatByte(static_cast<unsigned char>(ch))
5531*5c90c05cSAndroid Build Coastguard Worker               << ";";
5532*5c90c05cSAndroid Build Coastguard Worker           else
5533*5c90c05cSAndroid Build Coastguard Worker             m << ch;
5534*5c90c05cSAndroid Build Coastguard Worker         }
5535*5c90c05cSAndroid Build Coastguard Worker         break;
5536*5c90c05cSAndroid Build Coastguard Worker     }
5537*5c90c05cSAndroid Build Coastguard Worker   }
5538*5c90c05cSAndroid Build Coastguard Worker 
5539*5c90c05cSAndroid Build Coastguard Worker   return m.GetString();
5540*5c90c05cSAndroid Build Coastguard Worker }
5541*5c90c05cSAndroid Build Coastguard Worker 
5542*5c90c05cSAndroid Build Coastguard Worker // Returns the given string with all characters invalid in XML removed.
5543*5c90c05cSAndroid Build Coastguard Worker // Currently invalid characters are dropped from the string. An
5544*5c90c05cSAndroid Build Coastguard Worker // alternative is to replace them with certain characters such as . or ?.
RemoveInvalidXmlCharacters(const std::string & str)5545*5c90c05cSAndroid Build Coastguard Worker std::string XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters(
5546*5c90c05cSAndroid Build Coastguard Worker     const std::string& str) {
5547*5c90c05cSAndroid Build Coastguard Worker   std::string output;
5548*5c90c05cSAndroid Build Coastguard Worker   output.reserve(str.size());
5549*5c90c05cSAndroid Build Coastguard Worker   for (std::string::const_iterator it = str.begin(); it != str.end(); ++it)
5550*5c90c05cSAndroid Build Coastguard Worker     if (IsValidXmlCharacter(*it))
5551*5c90c05cSAndroid Build Coastguard Worker       output.push_back(*it);
5552*5c90c05cSAndroid Build Coastguard Worker 
5553*5c90c05cSAndroid Build Coastguard Worker   return output;
5554*5c90c05cSAndroid Build Coastguard Worker }
5555*5c90c05cSAndroid Build Coastguard Worker 
5556*5c90c05cSAndroid Build Coastguard Worker // The following routines generate an XML representation of a UnitTest
5557*5c90c05cSAndroid Build Coastguard Worker // object.
5558*5c90c05cSAndroid Build Coastguard Worker // GOOGLETEST_CM0009 DO NOT DELETE
5559*5c90c05cSAndroid Build Coastguard Worker //
5560*5c90c05cSAndroid Build Coastguard Worker // This is how Google Test concepts map to the DTD:
5561*5c90c05cSAndroid Build Coastguard Worker //
5562*5c90c05cSAndroid Build Coastguard Worker // <testsuites name="AllTests">        <-- corresponds to a UnitTest object
5563*5c90c05cSAndroid Build Coastguard Worker //   <testsuite name="testcase-name">  <-- corresponds to a TestSuite object
5564*5c90c05cSAndroid Build Coastguard Worker //     <testcase name="test-name">     <-- corresponds to a TestInfo object
5565*5c90c05cSAndroid Build Coastguard Worker //       <failure message="...">...</failure>
5566*5c90c05cSAndroid Build Coastguard Worker //       <failure message="...">...</failure>
5567*5c90c05cSAndroid Build Coastguard Worker //       <failure message="...">...</failure>
5568*5c90c05cSAndroid Build Coastguard Worker //                                     <-- individual assertion failures
5569*5c90c05cSAndroid Build Coastguard Worker //     </testcase>
5570*5c90c05cSAndroid Build Coastguard Worker //   </testsuite>
5571*5c90c05cSAndroid Build Coastguard Worker // </testsuites>
5572*5c90c05cSAndroid Build Coastguard Worker 
5573*5c90c05cSAndroid Build Coastguard Worker // Formats the given time in milliseconds as seconds.
FormatTimeInMillisAsSeconds(TimeInMillis ms)5574*5c90c05cSAndroid Build Coastguard Worker std::string FormatTimeInMillisAsSeconds(TimeInMillis ms) {
5575*5c90c05cSAndroid Build Coastguard Worker   ::std::stringstream ss;
5576*5c90c05cSAndroid Build Coastguard Worker   ss << (static_cast<double>(ms) * 1e-3);
5577*5c90c05cSAndroid Build Coastguard Worker   return ss.str();
5578*5c90c05cSAndroid Build Coastguard Worker }
5579*5c90c05cSAndroid Build Coastguard Worker 
PortableLocaltime(time_t seconds,struct tm * out)5580*5c90c05cSAndroid Build Coastguard Worker static bool PortableLocaltime(time_t seconds, struct tm* out) {
5581*5c90c05cSAndroid Build Coastguard Worker #if defined(_MSC_VER)
5582*5c90c05cSAndroid Build Coastguard Worker   return localtime_s(out, &seconds) == 0;
5583*5c90c05cSAndroid Build Coastguard Worker #elif defined(__MINGW32__) || defined(__MINGW64__)
5584*5c90c05cSAndroid Build Coastguard Worker   // MINGW <time.h> provides neither localtime_r nor localtime_s, but uses
5585*5c90c05cSAndroid Build Coastguard Worker   // Windows' localtime(), which has a thread-local tm buffer.
5586*5c90c05cSAndroid Build Coastguard Worker   struct tm* tm_ptr = localtime(&seconds);  // NOLINT
5587*5c90c05cSAndroid Build Coastguard Worker   if (tm_ptr == nullptr) return false;
5588*5c90c05cSAndroid Build Coastguard Worker   *out = *tm_ptr;
5589*5c90c05cSAndroid Build Coastguard Worker   return true;
5590*5c90c05cSAndroid Build Coastguard Worker #elif defined(__STDC_LIB_EXT1__)
5591*5c90c05cSAndroid Build Coastguard Worker   // Uses localtime_s when available as localtime_r is only available from
5592*5c90c05cSAndroid Build Coastguard Worker   // C23 standard.
5593*5c90c05cSAndroid Build Coastguard Worker   return localtime_s(&seconds, out) != nullptr;
5594*5c90c05cSAndroid Build Coastguard Worker #else
5595*5c90c05cSAndroid Build Coastguard Worker   return localtime_r(&seconds, out) != nullptr;
5596*5c90c05cSAndroid Build Coastguard Worker #endif
5597*5c90c05cSAndroid Build Coastguard Worker }
5598*5c90c05cSAndroid Build Coastguard Worker 
5599*5c90c05cSAndroid Build Coastguard Worker // Converts the given epoch time in milliseconds to a date string in the ISO
5600*5c90c05cSAndroid Build Coastguard Worker // 8601 format, without the timezone information.
FormatEpochTimeInMillisAsIso8601(TimeInMillis ms)5601*5c90c05cSAndroid Build Coastguard Worker std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms) {
5602*5c90c05cSAndroid Build Coastguard Worker   struct tm time_struct;
5603*5c90c05cSAndroid Build Coastguard Worker   if (!PortableLocaltime(static_cast<time_t>(ms / 1000), &time_struct))
5604*5c90c05cSAndroid Build Coastguard Worker     return "";
5605*5c90c05cSAndroid Build Coastguard Worker   // YYYY-MM-DDThh:mm:ss.sss
5606*5c90c05cSAndroid Build Coastguard Worker   return StreamableToString(time_struct.tm_year + 1900) + "-" +
5607*5c90c05cSAndroid Build Coastguard Worker       String::FormatIntWidth2(time_struct.tm_mon + 1) + "-" +
5608*5c90c05cSAndroid Build Coastguard Worker       String::FormatIntWidth2(time_struct.tm_mday) + "T" +
5609*5c90c05cSAndroid Build Coastguard Worker       String::FormatIntWidth2(time_struct.tm_hour) + ":" +
5610*5c90c05cSAndroid Build Coastguard Worker       String::FormatIntWidth2(time_struct.tm_min) + ":" +
5611*5c90c05cSAndroid Build Coastguard Worker       String::FormatIntWidth2(time_struct.tm_sec) + "." +
5612*5c90c05cSAndroid Build Coastguard Worker       String::FormatIntWidthN(static_cast<int>(ms % 1000), 3);
5613*5c90c05cSAndroid Build Coastguard Worker }
5614*5c90c05cSAndroid Build Coastguard Worker 
5615*5c90c05cSAndroid Build Coastguard Worker // Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
OutputXmlCDataSection(::std::ostream * stream,const char * data)5616*5c90c05cSAndroid Build Coastguard Worker void XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream,
5617*5c90c05cSAndroid Build Coastguard Worker                                                      const char* data) {
5618*5c90c05cSAndroid Build Coastguard Worker   const char* segment = data;
5619*5c90c05cSAndroid Build Coastguard Worker   *stream << "<![CDATA[";
5620*5c90c05cSAndroid Build Coastguard Worker   for (;;) {
5621*5c90c05cSAndroid Build Coastguard Worker     const char* const next_segment = strstr(segment, "]]>");
5622*5c90c05cSAndroid Build Coastguard Worker     if (next_segment != nullptr) {
5623*5c90c05cSAndroid Build Coastguard Worker       stream->write(
5624*5c90c05cSAndroid Build Coastguard Worker           segment, static_cast<std::streamsize>(next_segment - segment));
5625*5c90c05cSAndroid Build Coastguard Worker       *stream << "]]>]]&gt;<![CDATA[";
5626*5c90c05cSAndroid Build Coastguard Worker       segment = next_segment + strlen("]]>");
5627*5c90c05cSAndroid Build Coastguard Worker     } else {
5628*5c90c05cSAndroid Build Coastguard Worker       *stream << segment;
5629*5c90c05cSAndroid Build Coastguard Worker       break;
5630*5c90c05cSAndroid Build Coastguard Worker     }
5631*5c90c05cSAndroid Build Coastguard Worker   }
5632*5c90c05cSAndroid Build Coastguard Worker   *stream << "]]>";
5633*5c90c05cSAndroid Build Coastguard Worker }
5634*5c90c05cSAndroid Build Coastguard Worker 
OutputXmlAttribute(std::ostream * stream,const std::string & element_name,const std::string & name,const std::string & value)5635*5c90c05cSAndroid Build Coastguard Worker void XmlUnitTestResultPrinter::OutputXmlAttribute(
5636*5c90c05cSAndroid Build Coastguard Worker     std::ostream* stream,
5637*5c90c05cSAndroid Build Coastguard Worker     const std::string& element_name,
5638*5c90c05cSAndroid Build Coastguard Worker     const std::string& name,
5639*5c90c05cSAndroid Build Coastguard Worker     const std::string& value) {
5640*5c90c05cSAndroid Build Coastguard Worker   const std::vector<std::string>& allowed_names =
5641*5c90c05cSAndroid Build Coastguard Worker       GetReservedOutputAttributesForElement(element_name);
5642*5c90c05cSAndroid Build Coastguard Worker 
5643*5c90c05cSAndroid Build Coastguard Worker   GTEST_CHECK_(std::find(allowed_names.begin(), allowed_names.end(), name) !=
5644*5c90c05cSAndroid Build Coastguard Worker                    allowed_names.end())
5645*5c90c05cSAndroid Build Coastguard Worker       << "Attribute " << name << " is not allowed for element <" << element_name
5646*5c90c05cSAndroid Build Coastguard Worker       << ">.";
5647*5c90c05cSAndroid Build Coastguard Worker 
5648*5c90c05cSAndroid Build Coastguard Worker   *stream << " " << name << "=\"" << EscapeXmlAttribute(value) << "\"";
5649*5c90c05cSAndroid Build Coastguard Worker }
5650*5c90c05cSAndroid Build Coastguard Worker 
5651*5c90c05cSAndroid Build Coastguard Worker // Streams a test suite XML stanza containing the given test result.
OutputXmlTestSuiteForTestResult(::std::ostream * stream,const TestResult & result)5652*5c90c05cSAndroid Build Coastguard Worker void XmlUnitTestResultPrinter::OutputXmlTestSuiteForTestResult(
5653*5c90c05cSAndroid Build Coastguard Worker     ::std::ostream* stream, const TestResult& result) {
5654*5c90c05cSAndroid Build Coastguard Worker   // Output the boilerplate for a minimal test suite with one test.
5655*5c90c05cSAndroid Build Coastguard Worker   *stream << "  <testsuite";
5656*5c90c05cSAndroid Build Coastguard Worker   OutputXmlAttribute(stream, "testsuite", "name", "NonTestSuiteFailure");
5657*5c90c05cSAndroid Build Coastguard Worker   OutputXmlAttribute(stream, "testsuite", "tests", "1");
5658*5c90c05cSAndroid Build Coastguard Worker   OutputXmlAttribute(stream, "testsuite", "failures", "1");
5659*5c90c05cSAndroid Build Coastguard Worker   OutputXmlAttribute(stream, "testsuite", "disabled", "0");
5660*5c90c05cSAndroid Build Coastguard Worker   OutputXmlAttribute(stream, "testsuite", "skipped", "0");
5661*5c90c05cSAndroid Build Coastguard Worker   OutputXmlAttribute(stream, "testsuite", "errors", "0");
5662*5c90c05cSAndroid Build Coastguard Worker   OutputXmlAttribute(stream, "testsuite", "time",
5663*5c90c05cSAndroid Build Coastguard Worker                      FormatTimeInMillisAsSeconds(result.elapsed_time()));
5664*5c90c05cSAndroid Build Coastguard Worker   OutputXmlAttribute(
5665*5c90c05cSAndroid Build Coastguard Worker       stream, "testsuite", "timestamp",
5666*5c90c05cSAndroid Build Coastguard Worker       FormatEpochTimeInMillisAsIso8601(result.start_timestamp()));
5667*5c90c05cSAndroid Build Coastguard Worker   *stream << ">";
5668*5c90c05cSAndroid Build Coastguard Worker 
5669*5c90c05cSAndroid Build Coastguard Worker   // Output the boilerplate for a minimal test case with a single test.
5670*5c90c05cSAndroid Build Coastguard Worker   *stream << "    <testcase";
5671*5c90c05cSAndroid Build Coastguard Worker   OutputXmlAttribute(stream, "testcase", "name", "");
5672*5c90c05cSAndroid Build Coastguard Worker   OutputXmlAttribute(stream, "testcase", "status", "run");
5673*5c90c05cSAndroid Build Coastguard Worker   OutputXmlAttribute(stream, "testcase", "result", "completed");
5674*5c90c05cSAndroid Build Coastguard Worker   OutputXmlAttribute(stream, "testcase", "classname", "");
5675*5c90c05cSAndroid Build Coastguard Worker   OutputXmlAttribute(stream, "testcase", "time",
5676*5c90c05cSAndroid Build Coastguard Worker                      FormatTimeInMillisAsSeconds(result.elapsed_time()));
5677*5c90c05cSAndroid Build Coastguard Worker   OutputXmlAttribute(
5678*5c90c05cSAndroid Build Coastguard Worker       stream, "testcase", "timestamp",
5679*5c90c05cSAndroid Build Coastguard Worker       FormatEpochTimeInMillisAsIso8601(result.start_timestamp()));
5680*5c90c05cSAndroid Build Coastguard Worker 
5681*5c90c05cSAndroid Build Coastguard Worker   // Output the actual test result.
5682*5c90c05cSAndroid Build Coastguard Worker   OutputXmlTestResult(stream, result);
5683*5c90c05cSAndroid Build Coastguard Worker 
5684*5c90c05cSAndroid Build Coastguard Worker   // Complete the test suite.
5685*5c90c05cSAndroid Build Coastguard Worker   *stream << "  </testsuite>\n";
5686*5c90c05cSAndroid Build Coastguard Worker }
5687*5c90c05cSAndroid Build Coastguard Worker 
5688*5c90c05cSAndroid Build Coastguard Worker // Prints an XML representation of a TestInfo object.
OutputXmlTestInfo(::std::ostream * stream,const char * test_suite_name,const TestInfo & test_info)5689*5c90c05cSAndroid Build Coastguard Worker void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,
5690*5c90c05cSAndroid Build Coastguard Worker                                                  const char* test_suite_name,
5691*5c90c05cSAndroid Build Coastguard Worker                                                  const TestInfo& test_info) {
5692*5c90c05cSAndroid Build Coastguard Worker   const TestResult& result = *test_info.result();
5693*5c90c05cSAndroid Build Coastguard Worker   const std::string kTestsuite = "testcase";
5694*5c90c05cSAndroid Build Coastguard Worker 
5695*5c90c05cSAndroid Build Coastguard Worker   if (test_info.is_in_another_shard()) {
5696*5c90c05cSAndroid Build Coastguard Worker     return;
5697*5c90c05cSAndroid Build Coastguard Worker   }
5698*5c90c05cSAndroid Build Coastguard Worker 
5699*5c90c05cSAndroid Build Coastguard Worker   *stream << "    <testcase";
5700*5c90c05cSAndroid Build Coastguard Worker   OutputXmlAttribute(stream, kTestsuite, "name", test_info.name());
5701*5c90c05cSAndroid Build Coastguard Worker 
5702*5c90c05cSAndroid Build Coastguard Worker   if (test_info.value_param() != nullptr) {
5703*5c90c05cSAndroid Build Coastguard Worker     OutputXmlAttribute(stream, kTestsuite, "value_param",
5704*5c90c05cSAndroid Build Coastguard Worker                        test_info.value_param());
5705*5c90c05cSAndroid Build Coastguard Worker   }
5706*5c90c05cSAndroid Build Coastguard Worker   if (test_info.type_param() != nullptr) {
5707*5c90c05cSAndroid Build Coastguard Worker     OutputXmlAttribute(stream, kTestsuite, "type_param",
5708*5c90c05cSAndroid Build Coastguard Worker                        test_info.type_param());
5709*5c90c05cSAndroid Build Coastguard Worker   }
5710*5c90c05cSAndroid Build Coastguard Worker   if (GTEST_FLAG(list_tests)) {
5711*5c90c05cSAndroid Build Coastguard Worker     OutputXmlAttribute(stream, kTestsuite, "file", test_info.file());
5712*5c90c05cSAndroid Build Coastguard Worker     OutputXmlAttribute(stream, kTestsuite, "line",
5713*5c90c05cSAndroid Build Coastguard Worker                        StreamableToString(test_info.line()));
5714*5c90c05cSAndroid Build Coastguard Worker     *stream << " />\n";
5715*5c90c05cSAndroid Build Coastguard Worker     return;
5716*5c90c05cSAndroid Build Coastguard Worker   }
5717*5c90c05cSAndroid Build Coastguard Worker 
5718*5c90c05cSAndroid Build Coastguard Worker   OutputXmlAttribute(stream, kTestsuite, "status",
5719*5c90c05cSAndroid Build Coastguard Worker                      test_info.should_run() ? "run" : "notrun");
5720*5c90c05cSAndroid Build Coastguard Worker   OutputXmlAttribute(stream, kTestsuite, "result",
5721*5c90c05cSAndroid Build Coastguard Worker                      test_info.should_run()
5722*5c90c05cSAndroid Build Coastguard Worker                          ? (result.Skipped() ? "skipped" : "completed")
5723*5c90c05cSAndroid Build Coastguard Worker                          : "suppressed");
5724*5c90c05cSAndroid Build Coastguard Worker   OutputXmlAttribute(stream, kTestsuite, "time",
5725*5c90c05cSAndroid Build Coastguard Worker                      FormatTimeInMillisAsSeconds(result.elapsed_time()));
5726*5c90c05cSAndroid Build Coastguard Worker   OutputXmlAttribute(
5727*5c90c05cSAndroid Build Coastguard Worker       stream, kTestsuite, "timestamp",
5728*5c90c05cSAndroid Build Coastguard Worker       FormatEpochTimeInMillisAsIso8601(result.start_timestamp()));
5729*5c90c05cSAndroid Build Coastguard Worker   OutputXmlAttribute(stream, kTestsuite, "classname", test_suite_name);
5730*5c90c05cSAndroid Build Coastguard Worker 
5731*5c90c05cSAndroid Build Coastguard Worker   OutputXmlTestResult(stream, result);
5732*5c90c05cSAndroid Build Coastguard Worker }
5733*5c90c05cSAndroid Build Coastguard Worker 
OutputXmlTestResult(::std::ostream * stream,const TestResult & result)5734*5c90c05cSAndroid Build Coastguard Worker void XmlUnitTestResultPrinter::OutputXmlTestResult(::std::ostream* stream,
5735*5c90c05cSAndroid Build Coastguard Worker                                                    const TestResult& result) {
5736*5c90c05cSAndroid Build Coastguard Worker   int failures = 0;
5737*5c90c05cSAndroid Build Coastguard Worker   int skips = 0;
5738*5c90c05cSAndroid Build Coastguard Worker   for (int i = 0; i < result.total_part_count(); ++i) {
5739*5c90c05cSAndroid Build Coastguard Worker     const TestPartResult& part = result.GetTestPartResult(i);
5740*5c90c05cSAndroid Build Coastguard Worker     if (part.failed()) {
5741*5c90c05cSAndroid Build Coastguard Worker       if (++failures == 1 && skips == 0) {
5742*5c90c05cSAndroid Build Coastguard Worker         *stream << ">\n";
5743*5c90c05cSAndroid Build Coastguard Worker       }
5744*5c90c05cSAndroid Build Coastguard Worker       const std::string location =
5745*5c90c05cSAndroid Build Coastguard Worker           internal::FormatCompilerIndependentFileLocation(part.file_name(),
5746*5c90c05cSAndroid Build Coastguard Worker                                                           part.line_number());
5747*5c90c05cSAndroid Build Coastguard Worker       const std::string summary = location + "\n" + part.summary();
5748*5c90c05cSAndroid Build Coastguard Worker       *stream << "      <failure message=\""
5749*5c90c05cSAndroid Build Coastguard Worker               << EscapeXmlAttribute(summary)
5750*5c90c05cSAndroid Build Coastguard Worker               << "\" type=\"\">";
5751*5c90c05cSAndroid Build Coastguard Worker       const std::string detail = location + "\n" + part.message();
5752*5c90c05cSAndroid Build Coastguard Worker       OutputXmlCDataSection(stream, RemoveInvalidXmlCharacters(detail).c_str());
5753*5c90c05cSAndroid Build Coastguard Worker       *stream << "</failure>\n";
5754*5c90c05cSAndroid Build Coastguard Worker     } else if (part.skipped()) {
5755*5c90c05cSAndroid Build Coastguard Worker       if (++skips == 1 && failures == 0) {
5756*5c90c05cSAndroid Build Coastguard Worker         *stream << ">\n";
5757*5c90c05cSAndroid Build Coastguard Worker       }
5758*5c90c05cSAndroid Build Coastguard Worker       const std::string location =
5759*5c90c05cSAndroid Build Coastguard Worker           internal::FormatCompilerIndependentFileLocation(part.file_name(),
5760*5c90c05cSAndroid Build Coastguard Worker                                                           part.line_number());
5761*5c90c05cSAndroid Build Coastguard Worker       const std::string summary = location + "\n" + part.summary();
5762*5c90c05cSAndroid Build Coastguard Worker       *stream << "      <skipped message=\""
5763*5c90c05cSAndroid Build Coastguard Worker               << EscapeXmlAttribute(summary.c_str()) << "\">";
5764*5c90c05cSAndroid Build Coastguard Worker       const std::string detail = location + "\n" + part.message();
5765*5c90c05cSAndroid Build Coastguard Worker       OutputXmlCDataSection(stream, RemoveInvalidXmlCharacters(detail).c_str());
5766*5c90c05cSAndroid Build Coastguard Worker       *stream << "</skipped>\n";
5767*5c90c05cSAndroid Build Coastguard Worker     }
5768*5c90c05cSAndroid Build Coastguard Worker   }
5769*5c90c05cSAndroid Build Coastguard Worker 
5770*5c90c05cSAndroid Build Coastguard Worker   if (failures == 0 && skips == 0 && result.test_property_count() == 0) {
5771*5c90c05cSAndroid Build Coastguard Worker     *stream << " />\n";
5772*5c90c05cSAndroid Build Coastguard Worker   } else {
5773*5c90c05cSAndroid Build Coastguard Worker     if (failures == 0 && skips == 0) {
5774*5c90c05cSAndroid Build Coastguard Worker       *stream << ">\n";
5775*5c90c05cSAndroid Build Coastguard Worker     }
5776*5c90c05cSAndroid Build Coastguard Worker     OutputXmlTestProperties(stream, result);
5777*5c90c05cSAndroid Build Coastguard Worker     *stream << "    </testcase>\n";
5778*5c90c05cSAndroid Build Coastguard Worker   }
5779*5c90c05cSAndroid Build Coastguard Worker }
5780*5c90c05cSAndroid Build Coastguard Worker 
5781*5c90c05cSAndroid Build Coastguard Worker // Prints an XML representation of a TestSuite object
PrintXmlTestSuite(std::ostream * stream,const TestSuite & test_suite)5782*5c90c05cSAndroid Build Coastguard Worker void XmlUnitTestResultPrinter::PrintXmlTestSuite(std::ostream* stream,
5783*5c90c05cSAndroid Build Coastguard Worker                                                  const TestSuite& test_suite) {
5784*5c90c05cSAndroid Build Coastguard Worker   const std::string kTestsuite = "testsuite";
5785*5c90c05cSAndroid Build Coastguard Worker   *stream << "  <" << kTestsuite;
5786*5c90c05cSAndroid Build Coastguard Worker   OutputXmlAttribute(stream, kTestsuite, "name", test_suite.name());
5787*5c90c05cSAndroid Build Coastguard Worker   OutputXmlAttribute(stream, kTestsuite, "tests",
5788*5c90c05cSAndroid Build Coastguard Worker                      StreamableToString(test_suite.reportable_test_count()));
5789*5c90c05cSAndroid Build Coastguard Worker   if (!GTEST_FLAG(list_tests)) {
5790*5c90c05cSAndroid Build Coastguard Worker     OutputXmlAttribute(stream, kTestsuite, "failures",
5791*5c90c05cSAndroid Build Coastguard Worker                        StreamableToString(test_suite.failed_test_count()));
5792*5c90c05cSAndroid Build Coastguard Worker     OutputXmlAttribute(
5793*5c90c05cSAndroid Build Coastguard Worker         stream, kTestsuite, "disabled",
5794*5c90c05cSAndroid Build Coastguard Worker         StreamableToString(test_suite.reportable_disabled_test_count()));
5795*5c90c05cSAndroid Build Coastguard Worker     OutputXmlAttribute(stream, kTestsuite, "skipped",
5796*5c90c05cSAndroid Build Coastguard Worker                        StreamableToString(test_suite.skipped_test_count()));
5797*5c90c05cSAndroid Build Coastguard Worker 
5798*5c90c05cSAndroid Build Coastguard Worker     OutputXmlAttribute(stream, kTestsuite, "errors", "0");
5799*5c90c05cSAndroid Build Coastguard Worker 
5800*5c90c05cSAndroid Build Coastguard Worker     OutputXmlAttribute(stream, kTestsuite, "time",
5801*5c90c05cSAndroid Build Coastguard Worker                        FormatTimeInMillisAsSeconds(test_suite.elapsed_time()));
5802*5c90c05cSAndroid Build Coastguard Worker     OutputXmlAttribute(
5803*5c90c05cSAndroid Build Coastguard Worker         stream, kTestsuite, "timestamp",
5804*5c90c05cSAndroid Build Coastguard Worker         FormatEpochTimeInMillisAsIso8601(test_suite.start_timestamp()));
5805*5c90c05cSAndroid Build Coastguard Worker     *stream << TestPropertiesAsXmlAttributes(test_suite.ad_hoc_test_result());
5806*5c90c05cSAndroid Build Coastguard Worker   }
5807*5c90c05cSAndroid Build Coastguard Worker   *stream << ">\n";
5808*5c90c05cSAndroid Build Coastguard Worker   for (int i = 0; i < test_suite.total_test_count(); ++i) {
5809*5c90c05cSAndroid Build Coastguard Worker     if (test_suite.GetTestInfo(i)->is_reportable())
5810*5c90c05cSAndroid Build Coastguard Worker       OutputXmlTestInfo(stream, test_suite.name(), *test_suite.GetTestInfo(i));
5811*5c90c05cSAndroid Build Coastguard Worker   }
5812*5c90c05cSAndroid Build Coastguard Worker   *stream << "  </" << kTestsuite << ">\n";
5813*5c90c05cSAndroid Build Coastguard Worker }
5814*5c90c05cSAndroid Build Coastguard Worker 
5815*5c90c05cSAndroid Build Coastguard Worker // Prints an XML summary of unit_test to output stream out.
PrintXmlUnitTest(std::ostream * stream,const UnitTest & unit_test)5816*5c90c05cSAndroid Build Coastguard Worker void XmlUnitTestResultPrinter::PrintXmlUnitTest(std::ostream* stream,
5817*5c90c05cSAndroid Build Coastguard Worker                                                 const UnitTest& unit_test) {
5818*5c90c05cSAndroid Build Coastguard Worker   const std::string kTestsuites = "testsuites";
5819*5c90c05cSAndroid Build Coastguard Worker 
5820*5c90c05cSAndroid Build Coastguard Worker   *stream << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
5821*5c90c05cSAndroid Build Coastguard Worker   *stream << "<" << kTestsuites;
5822*5c90c05cSAndroid Build Coastguard Worker 
5823*5c90c05cSAndroid Build Coastguard Worker   OutputXmlAttribute(stream, kTestsuites, "tests",
5824*5c90c05cSAndroid Build Coastguard Worker                      StreamableToString(unit_test.reportable_test_count()));
5825*5c90c05cSAndroid Build Coastguard Worker   OutputXmlAttribute(stream, kTestsuites, "failures",
5826*5c90c05cSAndroid Build Coastguard Worker                      StreamableToString(unit_test.failed_test_count()));
5827*5c90c05cSAndroid Build Coastguard Worker   OutputXmlAttribute(
5828*5c90c05cSAndroid Build Coastguard Worker       stream, kTestsuites, "disabled",
5829*5c90c05cSAndroid Build Coastguard Worker       StreamableToString(unit_test.reportable_disabled_test_count()));
5830*5c90c05cSAndroid Build Coastguard Worker   OutputXmlAttribute(stream, kTestsuites, "errors", "0");
5831*5c90c05cSAndroid Build Coastguard Worker   OutputXmlAttribute(stream, kTestsuites, "time",
5832*5c90c05cSAndroid Build Coastguard Worker                      FormatTimeInMillisAsSeconds(unit_test.elapsed_time()));
5833*5c90c05cSAndroid Build Coastguard Worker   OutputXmlAttribute(
5834*5c90c05cSAndroid Build Coastguard Worker       stream, kTestsuites, "timestamp",
5835*5c90c05cSAndroid Build Coastguard Worker       FormatEpochTimeInMillisAsIso8601(unit_test.start_timestamp()));
5836*5c90c05cSAndroid Build Coastguard Worker 
5837*5c90c05cSAndroid Build Coastguard Worker   if (GTEST_FLAG(shuffle)) {
5838*5c90c05cSAndroid Build Coastguard Worker     OutputXmlAttribute(stream, kTestsuites, "random_seed",
5839*5c90c05cSAndroid Build Coastguard Worker                        StreamableToString(unit_test.random_seed()));
5840*5c90c05cSAndroid Build Coastguard Worker   }
5841*5c90c05cSAndroid Build Coastguard Worker   *stream << TestPropertiesAsXmlAttributes(unit_test.ad_hoc_test_result());
5842*5c90c05cSAndroid Build Coastguard Worker 
5843*5c90c05cSAndroid Build Coastguard Worker   OutputXmlAttribute(stream, kTestsuites, "name", "AllTests");
5844*5c90c05cSAndroid Build Coastguard Worker   *stream << ">\n";
5845*5c90c05cSAndroid Build Coastguard Worker 
5846*5c90c05cSAndroid Build Coastguard Worker   for (int i = 0; i < unit_test.total_test_suite_count(); ++i) {
5847*5c90c05cSAndroid Build Coastguard Worker     if (unit_test.GetTestSuite(i)->reportable_test_count() > 0)
5848*5c90c05cSAndroid Build Coastguard Worker       PrintXmlTestSuite(stream, *unit_test.GetTestSuite(i));
5849*5c90c05cSAndroid Build Coastguard Worker   }
5850*5c90c05cSAndroid Build Coastguard Worker 
5851*5c90c05cSAndroid Build Coastguard Worker   // If there was a test failure outside of one of the test suites (like in a
5852*5c90c05cSAndroid Build Coastguard Worker   // test environment) include that in the output.
5853*5c90c05cSAndroid Build Coastguard Worker   if (unit_test.ad_hoc_test_result().Failed()) {
5854*5c90c05cSAndroid Build Coastguard Worker     OutputXmlTestSuiteForTestResult(stream, unit_test.ad_hoc_test_result());
5855*5c90c05cSAndroid Build Coastguard Worker   }
5856*5c90c05cSAndroid Build Coastguard Worker 
5857*5c90c05cSAndroid Build Coastguard Worker   *stream << "</" << kTestsuites << ">\n";
5858*5c90c05cSAndroid Build Coastguard Worker }
5859*5c90c05cSAndroid Build Coastguard Worker 
PrintXmlTestsList(std::ostream * stream,const std::vector<TestSuite * > & test_suites)5860*5c90c05cSAndroid Build Coastguard Worker void XmlUnitTestResultPrinter::PrintXmlTestsList(
5861*5c90c05cSAndroid Build Coastguard Worker     std::ostream* stream, const std::vector<TestSuite*>& test_suites) {
5862*5c90c05cSAndroid Build Coastguard Worker   const std::string kTestsuites = "testsuites";
5863*5c90c05cSAndroid Build Coastguard Worker 
5864*5c90c05cSAndroid Build Coastguard Worker   *stream << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
5865*5c90c05cSAndroid Build Coastguard Worker   *stream << "<" << kTestsuites;
5866*5c90c05cSAndroid Build Coastguard Worker 
5867*5c90c05cSAndroid Build Coastguard Worker   int total_tests = 0;
5868*5c90c05cSAndroid Build Coastguard Worker   for (auto test_suite : test_suites) {
5869*5c90c05cSAndroid Build Coastguard Worker     total_tests += test_suite->total_test_count();
5870*5c90c05cSAndroid Build Coastguard Worker   }
5871*5c90c05cSAndroid Build Coastguard Worker   OutputXmlAttribute(stream, kTestsuites, "tests",
5872*5c90c05cSAndroid Build Coastguard Worker                      StreamableToString(total_tests));
5873*5c90c05cSAndroid Build Coastguard Worker   OutputXmlAttribute(stream, kTestsuites, "name", "AllTests");
5874*5c90c05cSAndroid Build Coastguard Worker   *stream << ">\n";
5875*5c90c05cSAndroid Build Coastguard Worker 
5876*5c90c05cSAndroid Build Coastguard Worker   for (auto test_suite : test_suites) {
5877*5c90c05cSAndroid Build Coastguard Worker     PrintXmlTestSuite(stream, *test_suite);
5878*5c90c05cSAndroid Build Coastguard Worker   }
5879*5c90c05cSAndroid Build Coastguard Worker   *stream << "</" << kTestsuites << ">\n";
5880*5c90c05cSAndroid Build Coastguard Worker }
5881*5c90c05cSAndroid Build Coastguard Worker 
5882*5c90c05cSAndroid Build Coastguard Worker // Produces a string representing the test properties in a result as space
5883*5c90c05cSAndroid Build Coastguard Worker // delimited XML attributes based on the property key="value" pairs.
TestPropertiesAsXmlAttributes(const TestResult & result)5884*5c90c05cSAndroid Build Coastguard Worker std::string XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes(
5885*5c90c05cSAndroid Build Coastguard Worker     const TestResult& result) {
5886*5c90c05cSAndroid Build Coastguard Worker   Message attributes;
5887*5c90c05cSAndroid Build Coastguard Worker   for (int i = 0; i < result.test_property_count(); ++i) {
5888*5c90c05cSAndroid Build Coastguard Worker     const TestProperty& property = result.GetTestProperty(i);
5889*5c90c05cSAndroid Build Coastguard Worker     attributes << " " << property.key() << "="
5890*5c90c05cSAndroid Build Coastguard Worker         << "\"" << EscapeXmlAttribute(property.value()) << "\"";
5891*5c90c05cSAndroid Build Coastguard Worker   }
5892*5c90c05cSAndroid Build Coastguard Worker   return attributes.GetString();
5893*5c90c05cSAndroid Build Coastguard Worker }
5894*5c90c05cSAndroid Build Coastguard Worker 
OutputXmlTestProperties(std::ostream * stream,const TestResult & result)5895*5c90c05cSAndroid Build Coastguard Worker void XmlUnitTestResultPrinter::OutputXmlTestProperties(
5896*5c90c05cSAndroid Build Coastguard Worker     std::ostream* stream, const TestResult& result) {
5897*5c90c05cSAndroid Build Coastguard Worker   const std::string kProperties = "properties";
5898*5c90c05cSAndroid Build Coastguard Worker   const std::string kProperty = "property";
5899*5c90c05cSAndroid Build Coastguard Worker 
5900*5c90c05cSAndroid Build Coastguard Worker   if (result.test_property_count() <= 0) {
5901*5c90c05cSAndroid Build Coastguard Worker     return;
5902*5c90c05cSAndroid Build Coastguard Worker   }
5903*5c90c05cSAndroid Build Coastguard Worker 
5904*5c90c05cSAndroid Build Coastguard Worker   *stream << "<" << kProperties << ">\n";
5905*5c90c05cSAndroid Build Coastguard Worker   for (int i = 0; i < result.test_property_count(); ++i) {
5906*5c90c05cSAndroid Build Coastguard Worker     const TestProperty& property = result.GetTestProperty(i);
5907*5c90c05cSAndroid Build Coastguard Worker     *stream << "<" << kProperty;
5908*5c90c05cSAndroid Build Coastguard Worker     *stream << " name=\"" << EscapeXmlAttribute(property.key()) << "\"";
5909*5c90c05cSAndroid Build Coastguard Worker     *stream << " value=\"" << EscapeXmlAttribute(property.value()) << "\"";
5910*5c90c05cSAndroid Build Coastguard Worker     *stream << "/>\n";
5911*5c90c05cSAndroid Build Coastguard Worker   }
5912*5c90c05cSAndroid Build Coastguard Worker   *stream << "</" << kProperties << ">\n";
5913*5c90c05cSAndroid Build Coastguard Worker }
5914*5c90c05cSAndroid Build Coastguard Worker 
5915*5c90c05cSAndroid Build Coastguard Worker // End XmlUnitTestResultPrinter
5916*5c90c05cSAndroid Build Coastguard Worker 
5917*5c90c05cSAndroid Build Coastguard Worker // This class generates an JSON output file.
5918*5c90c05cSAndroid Build Coastguard Worker class JsonUnitTestResultPrinter : public EmptyTestEventListener {
5919*5c90c05cSAndroid Build Coastguard Worker  public:
5920*5c90c05cSAndroid Build Coastguard Worker   explicit JsonUnitTestResultPrinter(const char* output_file);
5921*5c90c05cSAndroid Build Coastguard Worker 
5922*5c90c05cSAndroid Build Coastguard Worker   void OnTestIterationEnd(const UnitTest& unit_test, int iteration) override;
5923*5c90c05cSAndroid Build Coastguard Worker 
5924*5c90c05cSAndroid Build Coastguard Worker   // Prints an JSON summary of all unit tests.
5925*5c90c05cSAndroid Build Coastguard Worker   static void PrintJsonTestList(::std::ostream* stream,
5926*5c90c05cSAndroid Build Coastguard Worker                                 const std::vector<TestSuite*>& test_suites);
5927*5c90c05cSAndroid Build Coastguard Worker 
5928*5c90c05cSAndroid Build Coastguard Worker  private:
5929*5c90c05cSAndroid Build Coastguard Worker   // Returns an JSON-escaped copy of the input string str.
5930*5c90c05cSAndroid Build Coastguard Worker   static std::string EscapeJson(const std::string& str);
5931*5c90c05cSAndroid Build Coastguard Worker 
5932*5c90c05cSAndroid Build Coastguard Worker   //// Verifies that the given attribute belongs to the given element and
5933*5c90c05cSAndroid Build Coastguard Worker   //// streams the attribute as JSON.
5934*5c90c05cSAndroid Build Coastguard Worker   static void OutputJsonKey(std::ostream* stream,
5935*5c90c05cSAndroid Build Coastguard Worker                             const std::string& element_name,
5936*5c90c05cSAndroid Build Coastguard Worker                             const std::string& name,
5937*5c90c05cSAndroid Build Coastguard Worker                             const std::string& value,
5938*5c90c05cSAndroid Build Coastguard Worker                             const std::string& indent,
5939*5c90c05cSAndroid Build Coastguard Worker                             bool comma = true);
5940*5c90c05cSAndroid Build Coastguard Worker   static void OutputJsonKey(std::ostream* stream,
5941*5c90c05cSAndroid Build Coastguard Worker                             const std::string& element_name,
5942*5c90c05cSAndroid Build Coastguard Worker                             const std::string& name,
5943*5c90c05cSAndroid Build Coastguard Worker                             int value,
5944*5c90c05cSAndroid Build Coastguard Worker                             const std::string& indent,
5945*5c90c05cSAndroid Build Coastguard Worker                             bool comma = true);
5946*5c90c05cSAndroid Build Coastguard Worker 
5947*5c90c05cSAndroid Build Coastguard Worker   // Streams a test suite JSON stanza containing the given test result.
5948*5c90c05cSAndroid Build Coastguard Worker   //
5949*5c90c05cSAndroid Build Coastguard Worker   // Requires: result.Failed()
5950*5c90c05cSAndroid Build Coastguard Worker   static void OutputJsonTestSuiteForTestResult(::std::ostream* stream,
5951*5c90c05cSAndroid Build Coastguard Worker                                                const TestResult& result);
5952*5c90c05cSAndroid Build Coastguard Worker 
5953*5c90c05cSAndroid Build Coastguard Worker   // Streams a JSON representation of a TestResult object.
5954*5c90c05cSAndroid Build Coastguard Worker   static void OutputJsonTestResult(::std::ostream* stream,
5955*5c90c05cSAndroid Build Coastguard Worker                                    const TestResult& result);
5956*5c90c05cSAndroid Build Coastguard Worker 
5957*5c90c05cSAndroid Build Coastguard Worker   // Streams a JSON representation of a TestInfo object.
5958*5c90c05cSAndroid Build Coastguard Worker   static void OutputJsonTestInfo(::std::ostream* stream,
5959*5c90c05cSAndroid Build Coastguard Worker                                  const char* test_suite_name,
5960*5c90c05cSAndroid Build Coastguard Worker                                  const TestInfo& test_info);
5961*5c90c05cSAndroid Build Coastguard Worker 
5962*5c90c05cSAndroid Build Coastguard Worker   // Prints a JSON representation of a TestSuite object
5963*5c90c05cSAndroid Build Coastguard Worker   static void PrintJsonTestSuite(::std::ostream* stream,
5964*5c90c05cSAndroid Build Coastguard Worker                                  const TestSuite& test_suite);
5965*5c90c05cSAndroid Build Coastguard Worker 
5966*5c90c05cSAndroid Build Coastguard Worker   // Prints a JSON summary of unit_test to output stream out.
5967*5c90c05cSAndroid Build Coastguard Worker   static void PrintJsonUnitTest(::std::ostream* stream,
5968*5c90c05cSAndroid Build Coastguard Worker                                 const UnitTest& unit_test);
5969*5c90c05cSAndroid Build Coastguard Worker 
5970*5c90c05cSAndroid Build Coastguard Worker   // Produces a string representing the test properties in a result as
5971*5c90c05cSAndroid Build Coastguard Worker   // a JSON dictionary.
5972*5c90c05cSAndroid Build Coastguard Worker   static std::string TestPropertiesAsJson(const TestResult& result,
5973*5c90c05cSAndroid Build Coastguard Worker                                           const std::string& indent);
5974*5c90c05cSAndroid Build Coastguard Worker 
5975*5c90c05cSAndroid Build Coastguard Worker   // The output file.
5976*5c90c05cSAndroid Build Coastguard Worker   const std::string output_file_;
5977*5c90c05cSAndroid Build Coastguard Worker 
5978*5c90c05cSAndroid Build Coastguard Worker   GTEST_DISALLOW_COPY_AND_ASSIGN_(JsonUnitTestResultPrinter);
5979*5c90c05cSAndroid Build Coastguard Worker };
5980*5c90c05cSAndroid Build Coastguard Worker 
5981*5c90c05cSAndroid Build Coastguard Worker // Creates a new JsonUnitTestResultPrinter.
JsonUnitTestResultPrinter(const char * output_file)5982*5c90c05cSAndroid Build Coastguard Worker JsonUnitTestResultPrinter::JsonUnitTestResultPrinter(const char* output_file)
5983*5c90c05cSAndroid Build Coastguard Worker     : output_file_(output_file) {
5984*5c90c05cSAndroid Build Coastguard Worker   if (output_file_.empty()) {
5985*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOG_(FATAL) << "JSON output file may not be null";
5986*5c90c05cSAndroid Build Coastguard Worker   }
5987*5c90c05cSAndroid Build Coastguard Worker }
5988*5c90c05cSAndroid Build Coastguard Worker 
OnTestIterationEnd(const UnitTest & unit_test,int)5989*5c90c05cSAndroid Build Coastguard Worker void JsonUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
5990*5c90c05cSAndroid Build Coastguard Worker                                                   int /*iteration*/) {
5991*5c90c05cSAndroid Build Coastguard Worker   FILE* jsonout = OpenFileForWriting(output_file_);
5992*5c90c05cSAndroid Build Coastguard Worker   std::stringstream stream;
5993*5c90c05cSAndroid Build Coastguard Worker   PrintJsonUnitTest(&stream, unit_test);
5994*5c90c05cSAndroid Build Coastguard Worker   fprintf(jsonout, "%s", StringStreamToString(&stream).c_str());
5995*5c90c05cSAndroid Build Coastguard Worker   fclose(jsonout);
5996*5c90c05cSAndroid Build Coastguard Worker }
5997*5c90c05cSAndroid Build Coastguard Worker 
5998*5c90c05cSAndroid Build Coastguard Worker // Returns an JSON-escaped copy of the input string str.
EscapeJson(const std::string & str)5999*5c90c05cSAndroid Build Coastguard Worker std::string JsonUnitTestResultPrinter::EscapeJson(const std::string& str) {
6000*5c90c05cSAndroid Build Coastguard Worker   Message m;
6001*5c90c05cSAndroid Build Coastguard Worker 
6002*5c90c05cSAndroid Build Coastguard Worker   for (size_t i = 0; i < str.size(); ++i) {
6003*5c90c05cSAndroid Build Coastguard Worker     const char ch = str[i];
6004*5c90c05cSAndroid Build Coastguard Worker     switch (ch) {
6005*5c90c05cSAndroid Build Coastguard Worker       case '\\':
6006*5c90c05cSAndroid Build Coastguard Worker       case '"':
6007*5c90c05cSAndroid Build Coastguard Worker       case '/':
6008*5c90c05cSAndroid Build Coastguard Worker         m << '\\' << ch;
6009*5c90c05cSAndroid Build Coastguard Worker         break;
6010*5c90c05cSAndroid Build Coastguard Worker       case '\b':
6011*5c90c05cSAndroid Build Coastguard Worker         m << "\\b";
6012*5c90c05cSAndroid Build Coastguard Worker         break;
6013*5c90c05cSAndroid Build Coastguard Worker       case '\t':
6014*5c90c05cSAndroid Build Coastguard Worker         m << "\\t";
6015*5c90c05cSAndroid Build Coastguard Worker         break;
6016*5c90c05cSAndroid Build Coastguard Worker       case '\n':
6017*5c90c05cSAndroid Build Coastguard Worker         m << "\\n";
6018*5c90c05cSAndroid Build Coastguard Worker         break;
6019*5c90c05cSAndroid Build Coastguard Worker       case '\f':
6020*5c90c05cSAndroid Build Coastguard Worker         m << "\\f";
6021*5c90c05cSAndroid Build Coastguard Worker         break;
6022*5c90c05cSAndroid Build Coastguard Worker       case '\r':
6023*5c90c05cSAndroid Build Coastguard Worker         m << "\\r";
6024*5c90c05cSAndroid Build Coastguard Worker         break;
6025*5c90c05cSAndroid Build Coastguard Worker       default:
6026*5c90c05cSAndroid Build Coastguard Worker         if (ch < ' ') {
6027*5c90c05cSAndroid Build Coastguard Worker           m << "\\u00" << String::FormatByte(static_cast<unsigned char>(ch));
6028*5c90c05cSAndroid Build Coastguard Worker         } else {
6029*5c90c05cSAndroid Build Coastguard Worker           m << ch;
6030*5c90c05cSAndroid Build Coastguard Worker         }
6031*5c90c05cSAndroid Build Coastguard Worker         break;
6032*5c90c05cSAndroid Build Coastguard Worker     }
6033*5c90c05cSAndroid Build Coastguard Worker   }
6034*5c90c05cSAndroid Build Coastguard Worker 
6035*5c90c05cSAndroid Build Coastguard Worker   return m.GetString();
6036*5c90c05cSAndroid Build Coastguard Worker }
6037*5c90c05cSAndroid Build Coastguard Worker 
6038*5c90c05cSAndroid Build Coastguard Worker // The following routines generate an JSON representation of a UnitTest
6039*5c90c05cSAndroid Build Coastguard Worker // object.
6040*5c90c05cSAndroid Build Coastguard Worker 
6041*5c90c05cSAndroid Build Coastguard Worker // Formats the given time in milliseconds as seconds.
FormatTimeInMillisAsDuration(TimeInMillis ms)6042*5c90c05cSAndroid Build Coastguard Worker static std::string FormatTimeInMillisAsDuration(TimeInMillis ms) {
6043*5c90c05cSAndroid Build Coastguard Worker   ::std::stringstream ss;
6044*5c90c05cSAndroid Build Coastguard Worker   ss << (static_cast<double>(ms) * 1e-3) << "s";
6045*5c90c05cSAndroid Build Coastguard Worker   return ss.str();
6046*5c90c05cSAndroid Build Coastguard Worker }
6047*5c90c05cSAndroid Build Coastguard Worker 
6048*5c90c05cSAndroid Build Coastguard Worker // Converts the given epoch time in milliseconds to a date string in the
6049*5c90c05cSAndroid Build Coastguard Worker // RFC3339 format, without the timezone information.
FormatEpochTimeInMillisAsRFC3339(TimeInMillis ms)6050*5c90c05cSAndroid Build Coastguard Worker static std::string FormatEpochTimeInMillisAsRFC3339(TimeInMillis ms) {
6051*5c90c05cSAndroid Build Coastguard Worker   struct tm time_struct;
6052*5c90c05cSAndroid Build Coastguard Worker   if (!PortableLocaltime(static_cast<time_t>(ms / 1000), &time_struct))
6053*5c90c05cSAndroid Build Coastguard Worker     return "";
6054*5c90c05cSAndroid Build Coastguard Worker   // YYYY-MM-DDThh:mm:ss
6055*5c90c05cSAndroid Build Coastguard Worker   return StreamableToString(time_struct.tm_year + 1900) + "-" +
6056*5c90c05cSAndroid Build Coastguard Worker       String::FormatIntWidth2(time_struct.tm_mon + 1) + "-" +
6057*5c90c05cSAndroid Build Coastguard Worker       String::FormatIntWidth2(time_struct.tm_mday) + "T" +
6058*5c90c05cSAndroid Build Coastguard Worker       String::FormatIntWidth2(time_struct.tm_hour) + ":" +
6059*5c90c05cSAndroid Build Coastguard Worker       String::FormatIntWidth2(time_struct.tm_min) + ":" +
6060*5c90c05cSAndroid Build Coastguard Worker       String::FormatIntWidth2(time_struct.tm_sec) + "Z";
6061*5c90c05cSAndroid Build Coastguard Worker }
6062*5c90c05cSAndroid Build Coastguard Worker 
Indent(size_t width)6063*5c90c05cSAndroid Build Coastguard Worker static inline std::string Indent(size_t width) {
6064*5c90c05cSAndroid Build Coastguard Worker   return std::string(width, ' ');
6065*5c90c05cSAndroid Build Coastguard Worker }
6066*5c90c05cSAndroid Build Coastguard Worker 
OutputJsonKey(std::ostream * stream,const std::string & element_name,const std::string & name,const std::string & value,const std::string & indent,bool comma)6067*5c90c05cSAndroid Build Coastguard Worker void JsonUnitTestResultPrinter::OutputJsonKey(
6068*5c90c05cSAndroid Build Coastguard Worker     std::ostream* stream,
6069*5c90c05cSAndroid Build Coastguard Worker     const std::string& element_name,
6070*5c90c05cSAndroid Build Coastguard Worker     const std::string& name,
6071*5c90c05cSAndroid Build Coastguard Worker     const std::string& value,
6072*5c90c05cSAndroid Build Coastguard Worker     const std::string& indent,
6073*5c90c05cSAndroid Build Coastguard Worker     bool comma) {
6074*5c90c05cSAndroid Build Coastguard Worker   const std::vector<std::string>& allowed_names =
6075*5c90c05cSAndroid Build Coastguard Worker       GetReservedOutputAttributesForElement(element_name);
6076*5c90c05cSAndroid Build Coastguard Worker 
6077*5c90c05cSAndroid Build Coastguard Worker   GTEST_CHECK_(std::find(allowed_names.begin(), allowed_names.end(), name) !=
6078*5c90c05cSAndroid Build Coastguard Worker                    allowed_names.end())
6079*5c90c05cSAndroid Build Coastguard Worker       << "Key \"" << name << "\" is not allowed for value \"" << element_name
6080*5c90c05cSAndroid Build Coastguard Worker       << "\".";
6081*5c90c05cSAndroid Build Coastguard Worker 
6082*5c90c05cSAndroid Build Coastguard Worker   *stream << indent << "\"" << name << "\": \"" << EscapeJson(value) << "\"";
6083*5c90c05cSAndroid Build Coastguard Worker   if (comma)
6084*5c90c05cSAndroid Build Coastguard Worker     *stream << ",\n";
6085*5c90c05cSAndroid Build Coastguard Worker }
6086*5c90c05cSAndroid Build Coastguard Worker 
OutputJsonKey(std::ostream * stream,const std::string & element_name,const std::string & name,int value,const std::string & indent,bool comma)6087*5c90c05cSAndroid Build Coastguard Worker void JsonUnitTestResultPrinter::OutputJsonKey(
6088*5c90c05cSAndroid Build Coastguard Worker     std::ostream* stream,
6089*5c90c05cSAndroid Build Coastguard Worker     const std::string& element_name,
6090*5c90c05cSAndroid Build Coastguard Worker     const std::string& name,
6091*5c90c05cSAndroid Build Coastguard Worker     int value,
6092*5c90c05cSAndroid Build Coastguard Worker     const std::string& indent,
6093*5c90c05cSAndroid Build Coastguard Worker     bool comma) {
6094*5c90c05cSAndroid Build Coastguard Worker   const std::vector<std::string>& allowed_names =
6095*5c90c05cSAndroid Build Coastguard Worker       GetReservedOutputAttributesForElement(element_name);
6096*5c90c05cSAndroid Build Coastguard Worker 
6097*5c90c05cSAndroid Build Coastguard Worker   GTEST_CHECK_(std::find(allowed_names.begin(), allowed_names.end(), name) !=
6098*5c90c05cSAndroid Build Coastguard Worker                    allowed_names.end())
6099*5c90c05cSAndroid Build Coastguard Worker       << "Key \"" << name << "\" is not allowed for value \"" << element_name
6100*5c90c05cSAndroid Build Coastguard Worker       << "\".";
6101*5c90c05cSAndroid Build Coastguard Worker 
6102*5c90c05cSAndroid Build Coastguard Worker   *stream << indent << "\"" << name << "\": " << StreamableToString(value);
6103*5c90c05cSAndroid Build Coastguard Worker   if (comma)
6104*5c90c05cSAndroid Build Coastguard Worker     *stream << ",\n";
6105*5c90c05cSAndroid Build Coastguard Worker }
6106*5c90c05cSAndroid Build Coastguard Worker 
6107*5c90c05cSAndroid Build Coastguard Worker // Streams a test suite JSON stanza containing the given test result.
OutputJsonTestSuiteForTestResult(::std::ostream * stream,const TestResult & result)6108*5c90c05cSAndroid Build Coastguard Worker void JsonUnitTestResultPrinter::OutputJsonTestSuiteForTestResult(
6109*5c90c05cSAndroid Build Coastguard Worker     ::std::ostream* stream, const TestResult& result) {
6110*5c90c05cSAndroid Build Coastguard Worker   // Output the boilerplate for a new test suite.
6111*5c90c05cSAndroid Build Coastguard Worker   *stream << Indent(4) << "{\n";
6112*5c90c05cSAndroid Build Coastguard Worker   OutputJsonKey(stream, "testsuite", "name", "NonTestSuiteFailure", Indent(6));
6113*5c90c05cSAndroid Build Coastguard Worker   OutputJsonKey(stream, "testsuite", "tests", 1, Indent(6));
6114*5c90c05cSAndroid Build Coastguard Worker   if (!GTEST_FLAG(list_tests)) {
6115*5c90c05cSAndroid Build Coastguard Worker     OutputJsonKey(stream, "testsuite", "failures", 1, Indent(6));
6116*5c90c05cSAndroid Build Coastguard Worker     OutputJsonKey(stream, "testsuite", "disabled", 0, Indent(6));
6117*5c90c05cSAndroid Build Coastguard Worker     OutputJsonKey(stream, "testsuite", "skipped", 0, Indent(6));
6118*5c90c05cSAndroid Build Coastguard Worker     OutputJsonKey(stream, "testsuite", "errors", 0, Indent(6));
6119*5c90c05cSAndroid Build Coastguard Worker     OutputJsonKey(stream, "testsuite", "time",
6120*5c90c05cSAndroid Build Coastguard Worker                   FormatTimeInMillisAsDuration(result.elapsed_time()),
6121*5c90c05cSAndroid Build Coastguard Worker                   Indent(6));
6122*5c90c05cSAndroid Build Coastguard Worker     OutputJsonKey(stream, "testsuite", "timestamp",
6123*5c90c05cSAndroid Build Coastguard Worker                   FormatEpochTimeInMillisAsRFC3339(result.start_timestamp()),
6124*5c90c05cSAndroid Build Coastguard Worker                   Indent(6));
6125*5c90c05cSAndroid Build Coastguard Worker   }
6126*5c90c05cSAndroid Build Coastguard Worker   *stream << Indent(6) << "\"testsuite\": [\n";
6127*5c90c05cSAndroid Build Coastguard Worker 
6128*5c90c05cSAndroid Build Coastguard Worker   // Output the boilerplate for a new test case.
6129*5c90c05cSAndroid Build Coastguard Worker   *stream << Indent(8) << "{\n";
6130*5c90c05cSAndroid Build Coastguard Worker   OutputJsonKey(stream, "testcase", "name", "", Indent(10));
6131*5c90c05cSAndroid Build Coastguard Worker   OutputJsonKey(stream, "testcase", "status", "RUN", Indent(10));
6132*5c90c05cSAndroid Build Coastguard Worker   OutputJsonKey(stream, "testcase", "result", "COMPLETED", Indent(10));
6133*5c90c05cSAndroid Build Coastguard Worker   OutputJsonKey(stream, "testcase", "timestamp",
6134*5c90c05cSAndroid Build Coastguard Worker                 FormatEpochTimeInMillisAsRFC3339(result.start_timestamp()),
6135*5c90c05cSAndroid Build Coastguard Worker                 Indent(10));
6136*5c90c05cSAndroid Build Coastguard Worker   OutputJsonKey(stream, "testcase", "time",
6137*5c90c05cSAndroid Build Coastguard Worker                 FormatTimeInMillisAsDuration(result.elapsed_time()),
6138*5c90c05cSAndroid Build Coastguard Worker                 Indent(10));
6139*5c90c05cSAndroid Build Coastguard Worker   OutputJsonKey(stream, "testcase", "classname", "", Indent(10), false);
6140*5c90c05cSAndroid Build Coastguard Worker   *stream << TestPropertiesAsJson(result, Indent(10));
6141*5c90c05cSAndroid Build Coastguard Worker 
6142*5c90c05cSAndroid Build Coastguard Worker   // Output the actual test result.
6143*5c90c05cSAndroid Build Coastguard Worker   OutputJsonTestResult(stream, result);
6144*5c90c05cSAndroid Build Coastguard Worker 
6145*5c90c05cSAndroid Build Coastguard Worker   // Finish the test suite.
6146*5c90c05cSAndroid Build Coastguard Worker   *stream << "\n" << Indent(6) << "]\n" << Indent(4) << "}";
6147*5c90c05cSAndroid Build Coastguard Worker }
6148*5c90c05cSAndroid Build Coastguard Worker 
6149*5c90c05cSAndroid Build Coastguard Worker // Prints a JSON representation of a TestInfo object.
OutputJsonTestInfo(::std::ostream * stream,const char * test_suite_name,const TestInfo & test_info)6150*5c90c05cSAndroid Build Coastguard Worker void JsonUnitTestResultPrinter::OutputJsonTestInfo(::std::ostream* stream,
6151*5c90c05cSAndroid Build Coastguard Worker                                                    const char* test_suite_name,
6152*5c90c05cSAndroid Build Coastguard Worker                                                    const TestInfo& test_info) {
6153*5c90c05cSAndroid Build Coastguard Worker   const TestResult& result = *test_info.result();
6154*5c90c05cSAndroid Build Coastguard Worker   const std::string kTestsuite = "testcase";
6155*5c90c05cSAndroid Build Coastguard Worker   const std::string kIndent = Indent(10);
6156*5c90c05cSAndroid Build Coastguard Worker 
6157*5c90c05cSAndroid Build Coastguard Worker   *stream << Indent(8) << "{\n";
6158*5c90c05cSAndroid Build Coastguard Worker   OutputJsonKey(stream, kTestsuite, "name", test_info.name(), kIndent);
6159*5c90c05cSAndroid Build Coastguard Worker 
6160*5c90c05cSAndroid Build Coastguard Worker   if (test_info.value_param() != nullptr) {
6161*5c90c05cSAndroid Build Coastguard Worker     OutputJsonKey(stream, kTestsuite, "value_param", test_info.value_param(),
6162*5c90c05cSAndroid Build Coastguard Worker                   kIndent);
6163*5c90c05cSAndroid Build Coastguard Worker   }
6164*5c90c05cSAndroid Build Coastguard Worker   if (test_info.type_param() != nullptr) {
6165*5c90c05cSAndroid Build Coastguard Worker     OutputJsonKey(stream, kTestsuite, "type_param", test_info.type_param(),
6166*5c90c05cSAndroid Build Coastguard Worker                   kIndent);
6167*5c90c05cSAndroid Build Coastguard Worker   }
6168*5c90c05cSAndroid Build Coastguard Worker   if (GTEST_FLAG(list_tests)) {
6169*5c90c05cSAndroid Build Coastguard Worker     OutputJsonKey(stream, kTestsuite, "file", test_info.file(), kIndent);
6170*5c90c05cSAndroid Build Coastguard Worker     OutputJsonKey(stream, kTestsuite, "line", test_info.line(), kIndent, false);
6171*5c90c05cSAndroid Build Coastguard Worker     *stream << "\n" << Indent(8) << "}";
6172*5c90c05cSAndroid Build Coastguard Worker     return;
6173*5c90c05cSAndroid Build Coastguard Worker   }
6174*5c90c05cSAndroid Build Coastguard Worker 
6175*5c90c05cSAndroid Build Coastguard Worker   OutputJsonKey(stream, kTestsuite, "status",
6176*5c90c05cSAndroid Build Coastguard Worker                 test_info.should_run() ? "RUN" : "NOTRUN", kIndent);
6177*5c90c05cSAndroid Build Coastguard Worker   OutputJsonKey(stream, kTestsuite, "result",
6178*5c90c05cSAndroid Build Coastguard Worker                 test_info.should_run()
6179*5c90c05cSAndroid Build Coastguard Worker                     ? (result.Skipped() ? "SKIPPED" : "COMPLETED")
6180*5c90c05cSAndroid Build Coastguard Worker                     : "SUPPRESSED",
6181*5c90c05cSAndroid Build Coastguard Worker                 kIndent);
6182*5c90c05cSAndroid Build Coastguard Worker   OutputJsonKey(stream, kTestsuite, "timestamp",
6183*5c90c05cSAndroid Build Coastguard Worker                 FormatEpochTimeInMillisAsRFC3339(result.start_timestamp()),
6184*5c90c05cSAndroid Build Coastguard Worker                 kIndent);
6185*5c90c05cSAndroid Build Coastguard Worker   OutputJsonKey(stream, kTestsuite, "time",
6186*5c90c05cSAndroid Build Coastguard Worker                 FormatTimeInMillisAsDuration(result.elapsed_time()), kIndent);
6187*5c90c05cSAndroid Build Coastguard Worker   OutputJsonKey(stream, kTestsuite, "classname", test_suite_name, kIndent,
6188*5c90c05cSAndroid Build Coastguard Worker                 false);
6189*5c90c05cSAndroid Build Coastguard Worker   *stream << TestPropertiesAsJson(result, kIndent);
6190*5c90c05cSAndroid Build Coastguard Worker 
6191*5c90c05cSAndroid Build Coastguard Worker   OutputJsonTestResult(stream, result);
6192*5c90c05cSAndroid Build Coastguard Worker }
6193*5c90c05cSAndroid Build Coastguard Worker 
OutputJsonTestResult(::std::ostream * stream,const TestResult & result)6194*5c90c05cSAndroid Build Coastguard Worker void JsonUnitTestResultPrinter::OutputJsonTestResult(::std::ostream* stream,
6195*5c90c05cSAndroid Build Coastguard Worker                                                      const TestResult& result) {
6196*5c90c05cSAndroid Build Coastguard Worker   const std::string kIndent = Indent(10);
6197*5c90c05cSAndroid Build Coastguard Worker 
6198*5c90c05cSAndroid Build Coastguard Worker   int failures = 0;
6199*5c90c05cSAndroid Build Coastguard Worker   for (int i = 0; i < result.total_part_count(); ++i) {
6200*5c90c05cSAndroid Build Coastguard Worker     const TestPartResult& part = result.GetTestPartResult(i);
6201*5c90c05cSAndroid Build Coastguard Worker     if (part.failed()) {
6202*5c90c05cSAndroid Build Coastguard Worker       *stream << ",\n";
6203*5c90c05cSAndroid Build Coastguard Worker       if (++failures == 1) {
6204*5c90c05cSAndroid Build Coastguard Worker         *stream << kIndent << "\"" << "failures" << "\": [\n";
6205*5c90c05cSAndroid Build Coastguard Worker       }
6206*5c90c05cSAndroid Build Coastguard Worker       const std::string location =
6207*5c90c05cSAndroid Build Coastguard Worker           internal::FormatCompilerIndependentFileLocation(part.file_name(),
6208*5c90c05cSAndroid Build Coastguard Worker                                                           part.line_number());
6209*5c90c05cSAndroid Build Coastguard Worker       const std::string message = EscapeJson(location + "\n" + part.message());
6210*5c90c05cSAndroid Build Coastguard Worker       *stream << kIndent << "  {\n"
6211*5c90c05cSAndroid Build Coastguard Worker               << kIndent << "    \"failure\": \"" << message << "\",\n"
6212*5c90c05cSAndroid Build Coastguard Worker               << kIndent << "    \"type\": \"\"\n"
6213*5c90c05cSAndroid Build Coastguard Worker               << kIndent << "  }";
6214*5c90c05cSAndroid Build Coastguard Worker     }
6215*5c90c05cSAndroid Build Coastguard Worker   }
6216*5c90c05cSAndroid Build Coastguard Worker 
6217*5c90c05cSAndroid Build Coastguard Worker   if (failures > 0)
6218*5c90c05cSAndroid Build Coastguard Worker     *stream << "\n" << kIndent << "]";
6219*5c90c05cSAndroid Build Coastguard Worker   *stream << "\n" << Indent(8) << "}";
6220*5c90c05cSAndroid Build Coastguard Worker }
6221*5c90c05cSAndroid Build Coastguard Worker 
6222*5c90c05cSAndroid Build Coastguard Worker // Prints an JSON representation of a TestSuite object
PrintJsonTestSuite(std::ostream * stream,const TestSuite & test_suite)6223*5c90c05cSAndroid Build Coastguard Worker void JsonUnitTestResultPrinter::PrintJsonTestSuite(
6224*5c90c05cSAndroid Build Coastguard Worker     std::ostream* stream, const TestSuite& test_suite) {
6225*5c90c05cSAndroid Build Coastguard Worker   const std::string kTestsuite = "testsuite";
6226*5c90c05cSAndroid Build Coastguard Worker   const std::string kIndent = Indent(6);
6227*5c90c05cSAndroid Build Coastguard Worker 
6228*5c90c05cSAndroid Build Coastguard Worker   *stream << Indent(4) << "{\n";
6229*5c90c05cSAndroid Build Coastguard Worker   OutputJsonKey(stream, kTestsuite, "name", test_suite.name(), kIndent);
6230*5c90c05cSAndroid Build Coastguard Worker   OutputJsonKey(stream, kTestsuite, "tests", test_suite.reportable_test_count(),
6231*5c90c05cSAndroid Build Coastguard Worker                 kIndent);
6232*5c90c05cSAndroid Build Coastguard Worker   if (!GTEST_FLAG(list_tests)) {
6233*5c90c05cSAndroid Build Coastguard Worker     OutputJsonKey(stream, kTestsuite, "failures",
6234*5c90c05cSAndroid Build Coastguard Worker                   test_suite.failed_test_count(), kIndent);
6235*5c90c05cSAndroid Build Coastguard Worker     OutputJsonKey(stream, kTestsuite, "disabled",
6236*5c90c05cSAndroid Build Coastguard Worker                   test_suite.reportable_disabled_test_count(), kIndent);
6237*5c90c05cSAndroid Build Coastguard Worker     OutputJsonKey(stream, kTestsuite, "errors", 0, kIndent);
6238*5c90c05cSAndroid Build Coastguard Worker     OutputJsonKey(
6239*5c90c05cSAndroid Build Coastguard Worker         stream, kTestsuite, "timestamp",
6240*5c90c05cSAndroid Build Coastguard Worker         FormatEpochTimeInMillisAsRFC3339(test_suite.start_timestamp()),
6241*5c90c05cSAndroid Build Coastguard Worker         kIndent);
6242*5c90c05cSAndroid Build Coastguard Worker     OutputJsonKey(stream, kTestsuite, "time",
6243*5c90c05cSAndroid Build Coastguard Worker                   FormatTimeInMillisAsDuration(test_suite.elapsed_time()),
6244*5c90c05cSAndroid Build Coastguard Worker                   kIndent, false);
6245*5c90c05cSAndroid Build Coastguard Worker     *stream << TestPropertiesAsJson(test_suite.ad_hoc_test_result(), kIndent)
6246*5c90c05cSAndroid Build Coastguard Worker             << ",\n";
6247*5c90c05cSAndroid Build Coastguard Worker   }
6248*5c90c05cSAndroid Build Coastguard Worker 
6249*5c90c05cSAndroid Build Coastguard Worker   *stream << kIndent << "\"" << kTestsuite << "\": [\n";
6250*5c90c05cSAndroid Build Coastguard Worker 
6251*5c90c05cSAndroid Build Coastguard Worker   bool comma = false;
6252*5c90c05cSAndroid Build Coastguard Worker   for (int i = 0; i < test_suite.total_test_count(); ++i) {
6253*5c90c05cSAndroid Build Coastguard Worker     if (test_suite.GetTestInfo(i)->is_reportable()) {
6254*5c90c05cSAndroid Build Coastguard Worker       if (comma) {
6255*5c90c05cSAndroid Build Coastguard Worker         *stream << ",\n";
6256*5c90c05cSAndroid Build Coastguard Worker       } else {
6257*5c90c05cSAndroid Build Coastguard Worker         comma = true;
6258*5c90c05cSAndroid Build Coastguard Worker       }
6259*5c90c05cSAndroid Build Coastguard Worker       OutputJsonTestInfo(stream, test_suite.name(), *test_suite.GetTestInfo(i));
6260*5c90c05cSAndroid Build Coastguard Worker     }
6261*5c90c05cSAndroid Build Coastguard Worker   }
6262*5c90c05cSAndroid Build Coastguard Worker   *stream << "\n" << kIndent << "]\n" << Indent(4) << "}";
6263*5c90c05cSAndroid Build Coastguard Worker }
6264*5c90c05cSAndroid Build Coastguard Worker 
6265*5c90c05cSAndroid Build Coastguard Worker // Prints a JSON summary of unit_test to output stream out.
PrintJsonUnitTest(std::ostream * stream,const UnitTest & unit_test)6266*5c90c05cSAndroid Build Coastguard Worker void JsonUnitTestResultPrinter::PrintJsonUnitTest(std::ostream* stream,
6267*5c90c05cSAndroid Build Coastguard Worker                                                   const UnitTest& unit_test) {
6268*5c90c05cSAndroid Build Coastguard Worker   const std::string kTestsuites = "testsuites";
6269*5c90c05cSAndroid Build Coastguard Worker   const std::string kIndent = Indent(2);
6270*5c90c05cSAndroid Build Coastguard Worker   *stream << "{\n";
6271*5c90c05cSAndroid Build Coastguard Worker 
6272*5c90c05cSAndroid Build Coastguard Worker   OutputJsonKey(stream, kTestsuites, "tests", unit_test.reportable_test_count(),
6273*5c90c05cSAndroid Build Coastguard Worker                 kIndent);
6274*5c90c05cSAndroid Build Coastguard Worker   OutputJsonKey(stream, kTestsuites, "failures", unit_test.failed_test_count(),
6275*5c90c05cSAndroid Build Coastguard Worker                 kIndent);
6276*5c90c05cSAndroid Build Coastguard Worker   OutputJsonKey(stream, kTestsuites, "disabled",
6277*5c90c05cSAndroid Build Coastguard Worker                 unit_test.reportable_disabled_test_count(), kIndent);
6278*5c90c05cSAndroid Build Coastguard Worker   OutputJsonKey(stream, kTestsuites, "errors", 0, kIndent);
6279*5c90c05cSAndroid Build Coastguard Worker   if (GTEST_FLAG(shuffle)) {
6280*5c90c05cSAndroid Build Coastguard Worker     OutputJsonKey(stream, kTestsuites, "random_seed", unit_test.random_seed(),
6281*5c90c05cSAndroid Build Coastguard Worker                   kIndent);
6282*5c90c05cSAndroid Build Coastguard Worker   }
6283*5c90c05cSAndroid Build Coastguard Worker   OutputJsonKey(stream, kTestsuites, "timestamp",
6284*5c90c05cSAndroid Build Coastguard Worker                 FormatEpochTimeInMillisAsRFC3339(unit_test.start_timestamp()),
6285*5c90c05cSAndroid Build Coastguard Worker                 kIndent);
6286*5c90c05cSAndroid Build Coastguard Worker   OutputJsonKey(stream, kTestsuites, "time",
6287*5c90c05cSAndroid Build Coastguard Worker                 FormatTimeInMillisAsDuration(unit_test.elapsed_time()), kIndent,
6288*5c90c05cSAndroid Build Coastguard Worker                 false);
6289*5c90c05cSAndroid Build Coastguard Worker 
6290*5c90c05cSAndroid Build Coastguard Worker   *stream << TestPropertiesAsJson(unit_test.ad_hoc_test_result(), kIndent)
6291*5c90c05cSAndroid Build Coastguard Worker           << ",\n";
6292*5c90c05cSAndroid Build Coastguard Worker 
6293*5c90c05cSAndroid Build Coastguard Worker   OutputJsonKey(stream, kTestsuites, "name", "AllTests", kIndent);
6294*5c90c05cSAndroid Build Coastguard Worker   *stream << kIndent << "\"" << kTestsuites << "\": [\n";
6295*5c90c05cSAndroid Build Coastguard Worker 
6296*5c90c05cSAndroid Build Coastguard Worker   bool comma = false;
6297*5c90c05cSAndroid Build Coastguard Worker   for (int i = 0; i < unit_test.total_test_suite_count(); ++i) {
6298*5c90c05cSAndroid Build Coastguard Worker     if (unit_test.GetTestSuite(i)->reportable_test_count() > 0) {
6299*5c90c05cSAndroid Build Coastguard Worker       if (comma) {
6300*5c90c05cSAndroid Build Coastguard Worker         *stream << ",\n";
6301*5c90c05cSAndroid Build Coastguard Worker       } else {
6302*5c90c05cSAndroid Build Coastguard Worker         comma = true;
6303*5c90c05cSAndroid Build Coastguard Worker       }
6304*5c90c05cSAndroid Build Coastguard Worker       PrintJsonTestSuite(stream, *unit_test.GetTestSuite(i));
6305*5c90c05cSAndroid Build Coastguard Worker     }
6306*5c90c05cSAndroid Build Coastguard Worker   }
6307*5c90c05cSAndroid Build Coastguard Worker 
6308*5c90c05cSAndroid Build Coastguard Worker   // If there was a test failure outside of one of the test suites (like in a
6309*5c90c05cSAndroid Build Coastguard Worker   // test environment) include that in the output.
6310*5c90c05cSAndroid Build Coastguard Worker   if (unit_test.ad_hoc_test_result().Failed()) {
6311*5c90c05cSAndroid Build Coastguard Worker     OutputJsonTestSuiteForTestResult(stream, unit_test.ad_hoc_test_result());
6312*5c90c05cSAndroid Build Coastguard Worker   }
6313*5c90c05cSAndroid Build Coastguard Worker 
6314*5c90c05cSAndroid Build Coastguard Worker   *stream << "\n" << kIndent << "]\n" << "}\n";
6315*5c90c05cSAndroid Build Coastguard Worker }
6316*5c90c05cSAndroid Build Coastguard Worker 
PrintJsonTestList(std::ostream * stream,const std::vector<TestSuite * > & test_suites)6317*5c90c05cSAndroid Build Coastguard Worker void JsonUnitTestResultPrinter::PrintJsonTestList(
6318*5c90c05cSAndroid Build Coastguard Worker     std::ostream* stream, const std::vector<TestSuite*>& test_suites) {
6319*5c90c05cSAndroid Build Coastguard Worker   const std::string kTestsuites = "testsuites";
6320*5c90c05cSAndroid Build Coastguard Worker   const std::string kIndent = Indent(2);
6321*5c90c05cSAndroid Build Coastguard Worker   *stream << "{\n";
6322*5c90c05cSAndroid Build Coastguard Worker   int total_tests = 0;
6323*5c90c05cSAndroid Build Coastguard Worker   for (auto test_suite : test_suites) {
6324*5c90c05cSAndroid Build Coastguard Worker     total_tests += test_suite->total_test_count();
6325*5c90c05cSAndroid Build Coastguard Worker   }
6326*5c90c05cSAndroid Build Coastguard Worker   OutputJsonKey(stream, kTestsuites, "tests", total_tests, kIndent);
6327*5c90c05cSAndroid Build Coastguard Worker 
6328*5c90c05cSAndroid Build Coastguard Worker   OutputJsonKey(stream, kTestsuites, "name", "AllTests", kIndent);
6329*5c90c05cSAndroid Build Coastguard Worker   *stream << kIndent << "\"" << kTestsuites << "\": [\n";
6330*5c90c05cSAndroid Build Coastguard Worker 
6331*5c90c05cSAndroid Build Coastguard Worker   for (size_t i = 0; i < test_suites.size(); ++i) {
6332*5c90c05cSAndroid Build Coastguard Worker     if (i != 0) {
6333*5c90c05cSAndroid Build Coastguard Worker       *stream << ",\n";
6334*5c90c05cSAndroid Build Coastguard Worker     }
6335*5c90c05cSAndroid Build Coastguard Worker     PrintJsonTestSuite(stream, *test_suites[i]);
6336*5c90c05cSAndroid Build Coastguard Worker   }
6337*5c90c05cSAndroid Build Coastguard Worker 
6338*5c90c05cSAndroid Build Coastguard Worker   *stream << "\n"
6339*5c90c05cSAndroid Build Coastguard Worker           << kIndent << "]\n"
6340*5c90c05cSAndroid Build Coastguard Worker           << "}\n";
6341*5c90c05cSAndroid Build Coastguard Worker }
6342*5c90c05cSAndroid Build Coastguard Worker // Produces a string representing the test properties in a result as
6343*5c90c05cSAndroid Build Coastguard Worker // a JSON dictionary.
TestPropertiesAsJson(const TestResult & result,const std::string & indent)6344*5c90c05cSAndroid Build Coastguard Worker std::string JsonUnitTestResultPrinter::TestPropertiesAsJson(
6345*5c90c05cSAndroid Build Coastguard Worker     const TestResult& result, const std::string& indent) {
6346*5c90c05cSAndroid Build Coastguard Worker   Message attributes;
6347*5c90c05cSAndroid Build Coastguard Worker   for (int i = 0; i < result.test_property_count(); ++i) {
6348*5c90c05cSAndroid Build Coastguard Worker     const TestProperty& property = result.GetTestProperty(i);
6349*5c90c05cSAndroid Build Coastguard Worker     attributes << ",\n" << indent << "\"" << property.key() << "\": "
6350*5c90c05cSAndroid Build Coastguard Worker                << "\"" << EscapeJson(property.value()) << "\"";
6351*5c90c05cSAndroid Build Coastguard Worker   }
6352*5c90c05cSAndroid Build Coastguard Worker   return attributes.GetString();
6353*5c90c05cSAndroid Build Coastguard Worker }
6354*5c90c05cSAndroid Build Coastguard Worker 
6355*5c90c05cSAndroid Build Coastguard Worker // End JsonUnitTestResultPrinter
6356*5c90c05cSAndroid Build Coastguard Worker 
6357*5c90c05cSAndroid Build Coastguard Worker #if GTEST_CAN_STREAM_RESULTS_
6358*5c90c05cSAndroid Build Coastguard Worker 
6359*5c90c05cSAndroid Build Coastguard Worker // Checks if str contains '=', '&', '%' or '\n' characters. If yes,
6360*5c90c05cSAndroid Build Coastguard Worker // replaces them by "%xx" where xx is their hexadecimal value. For
6361*5c90c05cSAndroid Build Coastguard Worker // example, replaces "=" with "%3D".  This algorithm is O(strlen(str))
6362*5c90c05cSAndroid Build Coastguard Worker // in both time and space -- important as the input str may contain an
6363*5c90c05cSAndroid Build Coastguard Worker // arbitrarily long test failure message and stack trace.
UrlEncode(const char * str)6364*5c90c05cSAndroid Build Coastguard Worker std::string StreamingListener::UrlEncode(const char* str) {
6365*5c90c05cSAndroid Build Coastguard Worker   std::string result;
6366*5c90c05cSAndroid Build Coastguard Worker   result.reserve(strlen(str) + 1);
6367*5c90c05cSAndroid Build Coastguard Worker   for (char ch = *str; ch != '\0'; ch = *++str) {
6368*5c90c05cSAndroid Build Coastguard Worker     switch (ch) {
6369*5c90c05cSAndroid Build Coastguard Worker       case '%':
6370*5c90c05cSAndroid Build Coastguard Worker       case '=':
6371*5c90c05cSAndroid Build Coastguard Worker       case '&':
6372*5c90c05cSAndroid Build Coastguard Worker       case '\n':
6373*5c90c05cSAndroid Build Coastguard Worker         result.append("%" + String::FormatByte(static_cast<unsigned char>(ch)));
6374*5c90c05cSAndroid Build Coastguard Worker         break;
6375*5c90c05cSAndroid Build Coastguard Worker       default:
6376*5c90c05cSAndroid Build Coastguard Worker         result.push_back(ch);
6377*5c90c05cSAndroid Build Coastguard Worker         break;
6378*5c90c05cSAndroid Build Coastguard Worker     }
6379*5c90c05cSAndroid Build Coastguard Worker   }
6380*5c90c05cSAndroid Build Coastguard Worker   return result;
6381*5c90c05cSAndroid Build Coastguard Worker }
6382*5c90c05cSAndroid Build Coastguard Worker 
MakeConnection()6383*5c90c05cSAndroid Build Coastguard Worker void StreamingListener::SocketWriter::MakeConnection() {
6384*5c90c05cSAndroid Build Coastguard Worker   GTEST_CHECK_(sockfd_ == -1)
6385*5c90c05cSAndroid Build Coastguard Worker       << "MakeConnection() can't be called when there is already a connection.";
6386*5c90c05cSAndroid Build Coastguard Worker 
6387*5c90c05cSAndroid Build Coastguard Worker   addrinfo hints;
6388*5c90c05cSAndroid Build Coastguard Worker   memset(&hints, 0, sizeof(hints));
6389*5c90c05cSAndroid Build Coastguard Worker   hints.ai_family = AF_UNSPEC;    // To allow both IPv4 and IPv6 addresses.
6390*5c90c05cSAndroid Build Coastguard Worker   hints.ai_socktype = SOCK_STREAM;
6391*5c90c05cSAndroid Build Coastguard Worker   addrinfo* servinfo = nullptr;
6392*5c90c05cSAndroid Build Coastguard Worker 
6393*5c90c05cSAndroid Build Coastguard Worker   // Use the getaddrinfo() to get a linked list of IP addresses for
6394*5c90c05cSAndroid Build Coastguard Worker   // the given host name.
6395*5c90c05cSAndroid Build Coastguard Worker   const int error_num = getaddrinfo(
6396*5c90c05cSAndroid Build Coastguard Worker       host_name_.c_str(), port_num_.c_str(), &hints, &servinfo);
6397*5c90c05cSAndroid Build Coastguard Worker   if (error_num != 0) {
6398*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOG_(WARNING) << "stream_result_to: getaddrinfo() failed: "
6399*5c90c05cSAndroid Build Coastguard Worker                         << gai_strerror(error_num);
6400*5c90c05cSAndroid Build Coastguard Worker   }
6401*5c90c05cSAndroid Build Coastguard Worker 
6402*5c90c05cSAndroid Build Coastguard Worker   // Loop through all the results and connect to the first we can.
6403*5c90c05cSAndroid Build Coastguard Worker   for (addrinfo* cur_addr = servinfo; sockfd_ == -1 && cur_addr != nullptr;
6404*5c90c05cSAndroid Build Coastguard Worker        cur_addr = cur_addr->ai_next) {
6405*5c90c05cSAndroid Build Coastguard Worker     sockfd_ = socket(
6406*5c90c05cSAndroid Build Coastguard Worker         cur_addr->ai_family, cur_addr->ai_socktype, cur_addr->ai_protocol);
6407*5c90c05cSAndroid Build Coastguard Worker     if (sockfd_ != -1) {
6408*5c90c05cSAndroid Build Coastguard Worker       // Connect the client socket to the server socket.
6409*5c90c05cSAndroid Build Coastguard Worker       if (connect(sockfd_, cur_addr->ai_addr, cur_addr->ai_addrlen) == -1) {
6410*5c90c05cSAndroid Build Coastguard Worker         close(sockfd_);
6411*5c90c05cSAndroid Build Coastguard Worker         sockfd_ = -1;
6412*5c90c05cSAndroid Build Coastguard Worker       }
6413*5c90c05cSAndroid Build Coastguard Worker     }
6414*5c90c05cSAndroid Build Coastguard Worker   }
6415*5c90c05cSAndroid Build Coastguard Worker 
6416*5c90c05cSAndroid Build Coastguard Worker   freeaddrinfo(servinfo);  // all done with this structure
6417*5c90c05cSAndroid Build Coastguard Worker 
6418*5c90c05cSAndroid Build Coastguard Worker   if (sockfd_ == -1) {
6419*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOG_(WARNING) << "stream_result_to: failed to connect to "
6420*5c90c05cSAndroid Build Coastguard Worker                         << host_name_ << ":" << port_num_;
6421*5c90c05cSAndroid Build Coastguard Worker   }
6422*5c90c05cSAndroid Build Coastguard Worker }
6423*5c90c05cSAndroid Build Coastguard Worker 
6424*5c90c05cSAndroid Build Coastguard Worker // End of class Streaming Listener
6425*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_CAN_STREAM_RESULTS__
6426*5c90c05cSAndroid Build Coastguard Worker 
6427*5c90c05cSAndroid Build Coastguard Worker // class OsStackTraceGetter
6428*5c90c05cSAndroid Build Coastguard Worker 
6429*5c90c05cSAndroid Build Coastguard Worker const char* const OsStackTraceGetterInterface::kElidedFramesMarker =
6430*5c90c05cSAndroid Build Coastguard Worker     "... " GTEST_NAME_ " internal frames ...";
6431*5c90c05cSAndroid Build Coastguard Worker 
CurrentStackTrace(int max_depth,int skip_count)6432*5c90c05cSAndroid Build Coastguard Worker std::string OsStackTraceGetter::CurrentStackTrace(int max_depth, int skip_count)
6433*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOCK_EXCLUDED_(mutex_) {
6434*5c90c05cSAndroid Build Coastguard Worker #if GTEST_HAS_ABSL
6435*5c90c05cSAndroid Build Coastguard Worker   std::string result;
6436*5c90c05cSAndroid Build Coastguard Worker 
6437*5c90c05cSAndroid Build Coastguard Worker   if (max_depth <= 0) {
6438*5c90c05cSAndroid Build Coastguard Worker     return result;
6439*5c90c05cSAndroid Build Coastguard Worker   }
6440*5c90c05cSAndroid Build Coastguard Worker 
6441*5c90c05cSAndroid Build Coastguard Worker   max_depth = std::min(max_depth, kMaxStackTraceDepth);
6442*5c90c05cSAndroid Build Coastguard Worker 
6443*5c90c05cSAndroid Build Coastguard Worker   std::vector<void*> raw_stack(max_depth);
6444*5c90c05cSAndroid Build Coastguard Worker   // Skips the frames requested by the caller, plus this function.
6445*5c90c05cSAndroid Build Coastguard Worker   const int raw_stack_size =
6446*5c90c05cSAndroid Build Coastguard Worker       absl::GetStackTrace(&raw_stack[0], max_depth, skip_count + 1);
6447*5c90c05cSAndroid Build Coastguard Worker 
6448*5c90c05cSAndroid Build Coastguard Worker   void* caller_frame = nullptr;
6449*5c90c05cSAndroid Build Coastguard Worker   {
6450*5c90c05cSAndroid Build Coastguard Worker     MutexLock lock(&mutex_);
6451*5c90c05cSAndroid Build Coastguard Worker     caller_frame = caller_frame_;
6452*5c90c05cSAndroid Build Coastguard Worker   }
6453*5c90c05cSAndroid Build Coastguard Worker 
6454*5c90c05cSAndroid Build Coastguard Worker   for (int i = 0; i < raw_stack_size; ++i) {
6455*5c90c05cSAndroid Build Coastguard Worker     if (raw_stack[i] == caller_frame &&
6456*5c90c05cSAndroid Build Coastguard Worker         !GTEST_FLAG(show_internal_stack_frames)) {
6457*5c90c05cSAndroid Build Coastguard Worker       // Add a marker to the trace and stop adding frames.
6458*5c90c05cSAndroid Build Coastguard Worker       absl::StrAppend(&result, kElidedFramesMarker, "\n");
6459*5c90c05cSAndroid Build Coastguard Worker       break;
6460*5c90c05cSAndroid Build Coastguard Worker     }
6461*5c90c05cSAndroid Build Coastguard Worker 
6462*5c90c05cSAndroid Build Coastguard Worker     char tmp[1024];
6463*5c90c05cSAndroid Build Coastguard Worker     const char* symbol = "(unknown)";
6464*5c90c05cSAndroid Build Coastguard Worker     if (absl::Symbolize(raw_stack[i], tmp, sizeof(tmp))) {
6465*5c90c05cSAndroid Build Coastguard Worker       symbol = tmp;
6466*5c90c05cSAndroid Build Coastguard Worker     }
6467*5c90c05cSAndroid Build Coastguard Worker 
6468*5c90c05cSAndroid Build Coastguard Worker     char line[1024];
6469*5c90c05cSAndroid Build Coastguard Worker     snprintf(line, sizeof(line), "  %p: %s\n", raw_stack[i], symbol);
6470*5c90c05cSAndroid Build Coastguard Worker     result += line;
6471*5c90c05cSAndroid Build Coastguard Worker   }
6472*5c90c05cSAndroid Build Coastguard Worker 
6473*5c90c05cSAndroid Build Coastguard Worker   return result;
6474*5c90c05cSAndroid Build Coastguard Worker 
6475*5c90c05cSAndroid Build Coastguard Worker #else  // !GTEST_HAS_ABSL
6476*5c90c05cSAndroid Build Coastguard Worker   static_cast<void>(max_depth);
6477*5c90c05cSAndroid Build Coastguard Worker   static_cast<void>(skip_count);
6478*5c90c05cSAndroid Build Coastguard Worker   return "";
6479*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_HAS_ABSL
6480*5c90c05cSAndroid Build Coastguard Worker }
6481*5c90c05cSAndroid Build Coastguard Worker 
UponLeavingGTest()6482*5c90c05cSAndroid Build Coastguard Worker void OsStackTraceGetter::UponLeavingGTest() GTEST_LOCK_EXCLUDED_(mutex_) {
6483*5c90c05cSAndroid Build Coastguard Worker #if GTEST_HAS_ABSL
6484*5c90c05cSAndroid Build Coastguard Worker   void* caller_frame = nullptr;
6485*5c90c05cSAndroid Build Coastguard Worker   if (absl::GetStackTrace(&caller_frame, 1, 3) <= 0) {
6486*5c90c05cSAndroid Build Coastguard Worker     caller_frame = nullptr;
6487*5c90c05cSAndroid Build Coastguard Worker   }
6488*5c90c05cSAndroid Build Coastguard Worker 
6489*5c90c05cSAndroid Build Coastguard Worker   MutexLock lock(&mutex_);
6490*5c90c05cSAndroid Build Coastguard Worker   caller_frame_ = caller_frame;
6491*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_HAS_ABSL
6492*5c90c05cSAndroid Build Coastguard Worker }
6493*5c90c05cSAndroid Build Coastguard Worker 
6494*5c90c05cSAndroid Build Coastguard Worker // A helper class that creates the premature-exit file in its
6495*5c90c05cSAndroid Build Coastguard Worker // constructor and deletes the file in its destructor.
6496*5c90c05cSAndroid Build Coastguard Worker class ScopedPrematureExitFile {
6497*5c90c05cSAndroid Build Coastguard Worker  public:
ScopedPrematureExitFile(const char * premature_exit_filepath)6498*5c90c05cSAndroid Build Coastguard Worker   explicit ScopedPrematureExitFile(const char* premature_exit_filepath)
6499*5c90c05cSAndroid Build Coastguard Worker       : premature_exit_filepath_(premature_exit_filepath ?
6500*5c90c05cSAndroid Build Coastguard Worker                                  premature_exit_filepath : "") {
6501*5c90c05cSAndroid Build Coastguard Worker     // If a path to the premature-exit file is specified...
6502*5c90c05cSAndroid Build Coastguard Worker     if (!premature_exit_filepath_.empty()) {
6503*5c90c05cSAndroid Build Coastguard Worker       // create the file with a single "0" character in it.  I/O
6504*5c90c05cSAndroid Build Coastguard Worker       // errors are ignored as there's nothing better we can do and we
6505*5c90c05cSAndroid Build Coastguard Worker       // don't want to fail the test because of this.
6506*5c90c05cSAndroid Build Coastguard Worker       FILE* pfile = posix::FOpen(premature_exit_filepath, "w");
6507*5c90c05cSAndroid Build Coastguard Worker       fwrite("0", 1, 1, pfile);
6508*5c90c05cSAndroid Build Coastguard Worker       fclose(pfile);
6509*5c90c05cSAndroid Build Coastguard Worker     }
6510*5c90c05cSAndroid Build Coastguard Worker   }
6511*5c90c05cSAndroid Build Coastguard Worker 
~ScopedPrematureExitFile()6512*5c90c05cSAndroid Build Coastguard Worker   ~ScopedPrematureExitFile() {
6513*5c90c05cSAndroid Build Coastguard Worker #if !defined GTEST_OS_ESP8266
6514*5c90c05cSAndroid Build Coastguard Worker     if (!premature_exit_filepath_.empty()) {
6515*5c90c05cSAndroid Build Coastguard Worker       int retval = remove(premature_exit_filepath_.c_str());
6516*5c90c05cSAndroid Build Coastguard Worker       if (retval) {
6517*5c90c05cSAndroid Build Coastguard Worker         GTEST_LOG_(ERROR) << "Failed to remove premature exit filepath \""
6518*5c90c05cSAndroid Build Coastguard Worker                           << premature_exit_filepath_ << "\" with error "
6519*5c90c05cSAndroid Build Coastguard Worker                           << retval;
6520*5c90c05cSAndroid Build Coastguard Worker       }
6521*5c90c05cSAndroid Build Coastguard Worker     }
6522*5c90c05cSAndroid Build Coastguard Worker #endif
6523*5c90c05cSAndroid Build Coastguard Worker   }
6524*5c90c05cSAndroid Build Coastguard Worker 
6525*5c90c05cSAndroid Build Coastguard Worker  private:
6526*5c90c05cSAndroid Build Coastguard Worker   const std::string premature_exit_filepath_;
6527*5c90c05cSAndroid Build Coastguard Worker 
6528*5c90c05cSAndroid Build Coastguard Worker   GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedPrematureExitFile);
6529*5c90c05cSAndroid Build Coastguard Worker };
6530*5c90c05cSAndroid Build Coastguard Worker 
6531*5c90c05cSAndroid Build Coastguard Worker }  // namespace internal
6532*5c90c05cSAndroid Build Coastguard Worker 
6533*5c90c05cSAndroid Build Coastguard Worker // class TestEventListeners
6534*5c90c05cSAndroid Build Coastguard Worker 
TestEventListeners()6535*5c90c05cSAndroid Build Coastguard Worker TestEventListeners::TestEventListeners()
6536*5c90c05cSAndroid Build Coastguard Worker     : repeater_(new internal::TestEventRepeater()),
6537*5c90c05cSAndroid Build Coastguard Worker       default_result_printer_(nullptr),
6538*5c90c05cSAndroid Build Coastguard Worker       default_xml_generator_(nullptr) {}
6539*5c90c05cSAndroid Build Coastguard Worker 
~TestEventListeners()6540*5c90c05cSAndroid Build Coastguard Worker TestEventListeners::~TestEventListeners() { delete repeater_; }
6541*5c90c05cSAndroid Build Coastguard Worker 
6542*5c90c05cSAndroid Build Coastguard Worker // Returns the standard listener responsible for the default console
6543*5c90c05cSAndroid Build Coastguard Worker // output.  Can be removed from the listeners list to shut down default
6544*5c90c05cSAndroid Build Coastguard Worker // console output.  Note that removing this object from the listener list
6545*5c90c05cSAndroid Build Coastguard Worker // with Release transfers its ownership to the user.
Append(TestEventListener * listener)6546*5c90c05cSAndroid Build Coastguard Worker void TestEventListeners::Append(TestEventListener* listener) {
6547*5c90c05cSAndroid Build Coastguard Worker   repeater_->Append(listener);
6548*5c90c05cSAndroid Build Coastguard Worker }
6549*5c90c05cSAndroid Build Coastguard Worker 
6550*5c90c05cSAndroid Build Coastguard Worker // Removes the given event listener from the list and returns it.  It then
6551*5c90c05cSAndroid Build Coastguard Worker // becomes the caller's responsibility to delete the listener. Returns
6552*5c90c05cSAndroid Build Coastguard Worker // NULL if the listener is not found in the list.
Release(TestEventListener * listener)6553*5c90c05cSAndroid Build Coastguard Worker TestEventListener* TestEventListeners::Release(TestEventListener* listener) {
6554*5c90c05cSAndroid Build Coastguard Worker   if (listener == default_result_printer_)
6555*5c90c05cSAndroid Build Coastguard Worker     default_result_printer_ = nullptr;
6556*5c90c05cSAndroid Build Coastguard Worker   else if (listener == default_xml_generator_)
6557*5c90c05cSAndroid Build Coastguard Worker     default_xml_generator_ = nullptr;
6558*5c90c05cSAndroid Build Coastguard Worker   return repeater_->Release(listener);
6559*5c90c05cSAndroid Build Coastguard Worker }
6560*5c90c05cSAndroid Build Coastguard Worker 
6561*5c90c05cSAndroid Build Coastguard Worker // Returns repeater that broadcasts the TestEventListener events to all
6562*5c90c05cSAndroid Build Coastguard Worker // subscribers.
repeater()6563*5c90c05cSAndroid Build Coastguard Worker TestEventListener* TestEventListeners::repeater() { return repeater_; }
6564*5c90c05cSAndroid Build Coastguard Worker 
6565*5c90c05cSAndroid Build Coastguard Worker // Sets the default_result_printer attribute to the provided listener.
6566*5c90c05cSAndroid Build Coastguard Worker // The listener is also added to the listener list and previous
6567*5c90c05cSAndroid Build Coastguard Worker // default_result_printer is removed from it and deleted. The listener can
6568*5c90c05cSAndroid Build Coastguard Worker // also be NULL in which case it will not be added to the list. Does
6569*5c90c05cSAndroid Build Coastguard Worker // nothing if the previous and the current listener objects are the same.
SetDefaultResultPrinter(TestEventListener * listener)6570*5c90c05cSAndroid Build Coastguard Worker void TestEventListeners::SetDefaultResultPrinter(TestEventListener* listener) {
6571*5c90c05cSAndroid Build Coastguard Worker   if (default_result_printer_ != listener) {
6572*5c90c05cSAndroid Build Coastguard Worker     // It is an error to pass this method a listener that is already in the
6573*5c90c05cSAndroid Build Coastguard Worker     // list.
6574*5c90c05cSAndroid Build Coastguard Worker     delete Release(default_result_printer_);
6575*5c90c05cSAndroid Build Coastguard Worker     default_result_printer_ = listener;
6576*5c90c05cSAndroid Build Coastguard Worker     if (listener != nullptr) Append(listener);
6577*5c90c05cSAndroid Build Coastguard Worker   }
6578*5c90c05cSAndroid Build Coastguard Worker }
6579*5c90c05cSAndroid Build Coastguard Worker 
6580*5c90c05cSAndroid Build Coastguard Worker // Sets the default_xml_generator attribute to the provided listener.  The
6581*5c90c05cSAndroid Build Coastguard Worker // listener is also added to the listener list and previous
6582*5c90c05cSAndroid Build Coastguard Worker // default_xml_generator is removed from it and deleted. The listener can
6583*5c90c05cSAndroid Build Coastguard Worker // also be NULL in which case it will not be added to the list. Does
6584*5c90c05cSAndroid Build Coastguard Worker // nothing if the previous and the current listener objects are the same.
SetDefaultXmlGenerator(TestEventListener * listener)6585*5c90c05cSAndroid Build Coastguard Worker void TestEventListeners::SetDefaultXmlGenerator(TestEventListener* listener) {
6586*5c90c05cSAndroid Build Coastguard Worker   if (default_xml_generator_ != listener) {
6587*5c90c05cSAndroid Build Coastguard Worker     // It is an error to pass this method a listener that is already in the
6588*5c90c05cSAndroid Build Coastguard Worker     // list.
6589*5c90c05cSAndroid Build Coastguard Worker     delete Release(default_xml_generator_);
6590*5c90c05cSAndroid Build Coastguard Worker     default_xml_generator_ = listener;
6591*5c90c05cSAndroid Build Coastguard Worker     if (listener != nullptr) Append(listener);
6592*5c90c05cSAndroid Build Coastguard Worker   }
6593*5c90c05cSAndroid Build Coastguard Worker }
6594*5c90c05cSAndroid Build Coastguard Worker 
6595*5c90c05cSAndroid Build Coastguard Worker // Controls whether events will be forwarded by the repeater to the
6596*5c90c05cSAndroid Build Coastguard Worker // listeners in the list.
EventForwardingEnabled() const6597*5c90c05cSAndroid Build Coastguard Worker bool TestEventListeners::EventForwardingEnabled() const {
6598*5c90c05cSAndroid Build Coastguard Worker   return repeater_->forwarding_enabled();
6599*5c90c05cSAndroid Build Coastguard Worker }
6600*5c90c05cSAndroid Build Coastguard Worker 
SuppressEventForwarding()6601*5c90c05cSAndroid Build Coastguard Worker void TestEventListeners::SuppressEventForwarding() {
6602*5c90c05cSAndroid Build Coastguard Worker   repeater_->set_forwarding_enabled(false);
6603*5c90c05cSAndroid Build Coastguard Worker }
6604*5c90c05cSAndroid Build Coastguard Worker 
6605*5c90c05cSAndroid Build Coastguard Worker // class UnitTest
6606*5c90c05cSAndroid Build Coastguard Worker 
6607*5c90c05cSAndroid Build Coastguard Worker // Gets the singleton UnitTest object.  The first time this method is
6608*5c90c05cSAndroid Build Coastguard Worker // called, a UnitTest object is constructed and returned.  Consecutive
6609*5c90c05cSAndroid Build Coastguard Worker // calls will return the same object.
6610*5c90c05cSAndroid Build Coastguard Worker //
6611*5c90c05cSAndroid Build Coastguard Worker // We don't protect this under mutex_ as a user is not supposed to
6612*5c90c05cSAndroid Build Coastguard Worker // call this before main() starts, from which point on the return
6613*5c90c05cSAndroid Build Coastguard Worker // value will never change.
GetInstance()6614*5c90c05cSAndroid Build Coastguard Worker UnitTest* UnitTest::GetInstance() {
6615*5c90c05cSAndroid Build Coastguard Worker   // CodeGear C++Builder insists on a public destructor for the
6616*5c90c05cSAndroid Build Coastguard Worker   // default implementation.  Use this implementation to keep good OO
6617*5c90c05cSAndroid Build Coastguard Worker   // design with private destructor.
6618*5c90c05cSAndroid Build Coastguard Worker 
6619*5c90c05cSAndroid Build Coastguard Worker #if defined(__BORLANDC__)
6620*5c90c05cSAndroid Build Coastguard Worker   static UnitTest* const instance = new UnitTest;
6621*5c90c05cSAndroid Build Coastguard Worker   return instance;
6622*5c90c05cSAndroid Build Coastguard Worker #else
6623*5c90c05cSAndroid Build Coastguard Worker   static UnitTest instance;
6624*5c90c05cSAndroid Build Coastguard Worker   return &instance;
6625*5c90c05cSAndroid Build Coastguard Worker #endif  // defined(__BORLANDC__)
6626*5c90c05cSAndroid Build Coastguard Worker }
6627*5c90c05cSAndroid Build Coastguard Worker 
6628*5c90c05cSAndroid Build Coastguard Worker // Gets the number of successful test suites.
successful_test_suite_count() const6629*5c90c05cSAndroid Build Coastguard Worker int UnitTest::successful_test_suite_count() const {
6630*5c90c05cSAndroid Build Coastguard Worker   return impl()->successful_test_suite_count();
6631*5c90c05cSAndroid Build Coastguard Worker }
6632*5c90c05cSAndroid Build Coastguard Worker 
6633*5c90c05cSAndroid Build Coastguard Worker // Gets the number of failed test suites.
failed_test_suite_count() const6634*5c90c05cSAndroid Build Coastguard Worker int UnitTest::failed_test_suite_count() const {
6635*5c90c05cSAndroid Build Coastguard Worker   return impl()->failed_test_suite_count();
6636*5c90c05cSAndroid Build Coastguard Worker }
6637*5c90c05cSAndroid Build Coastguard Worker 
6638*5c90c05cSAndroid Build Coastguard Worker // Gets the number of all test suites.
total_test_suite_count() const6639*5c90c05cSAndroid Build Coastguard Worker int UnitTest::total_test_suite_count() const {
6640*5c90c05cSAndroid Build Coastguard Worker   return impl()->total_test_suite_count();
6641*5c90c05cSAndroid Build Coastguard Worker }
6642*5c90c05cSAndroid Build Coastguard Worker 
6643*5c90c05cSAndroid Build Coastguard Worker // Gets the number of all test suites that contain at least one test
6644*5c90c05cSAndroid Build Coastguard Worker // that should run.
test_suite_to_run_count() const6645*5c90c05cSAndroid Build Coastguard Worker int UnitTest::test_suite_to_run_count() const {
6646*5c90c05cSAndroid Build Coastguard Worker   return impl()->test_suite_to_run_count();
6647*5c90c05cSAndroid Build Coastguard Worker }
6648*5c90c05cSAndroid Build Coastguard Worker 
6649*5c90c05cSAndroid Build Coastguard Worker //  Legacy API is deprecated but still available
6650*5c90c05cSAndroid Build Coastguard Worker #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
successful_test_case_count() const6651*5c90c05cSAndroid Build Coastguard Worker int UnitTest::successful_test_case_count() const {
6652*5c90c05cSAndroid Build Coastguard Worker   return impl()->successful_test_suite_count();
6653*5c90c05cSAndroid Build Coastguard Worker }
failed_test_case_count() const6654*5c90c05cSAndroid Build Coastguard Worker int UnitTest::failed_test_case_count() const {
6655*5c90c05cSAndroid Build Coastguard Worker   return impl()->failed_test_suite_count();
6656*5c90c05cSAndroid Build Coastguard Worker }
total_test_case_count() const6657*5c90c05cSAndroid Build Coastguard Worker int UnitTest::total_test_case_count() const {
6658*5c90c05cSAndroid Build Coastguard Worker   return impl()->total_test_suite_count();
6659*5c90c05cSAndroid Build Coastguard Worker }
test_case_to_run_count() const6660*5c90c05cSAndroid Build Coastguard Worker int UnitTest::test_case_to_run_count() const {
6661*5c90c05cSAndroid Build Coastguard Worker   return impl()->test_suite_to_run_count();
6662*5c90c05cSAndroid Build Coastguard Worker }
6663*5c90c05cSAndroid Build Coastguard Worker #endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_
6664*5c90c05cSAndroid Build Coastguard Worker 
6665*5c90c05cSAndroid Build Coastguard Worker // Gets the number of successful tests.
successful_test_count() const6666*5c90c05cSAndroid Build Coastguard Worker int UnitTest::successful_test_count() const {
6667*5c90c05cSAndroid Build Coastguard Worker   return impl()->successful_test_count();
6668*5c90c05cSAndroid Build Coastguard Worker }
6669*5c90c05cSAndroid Build Coastguard Worker 
6670*5c90c05cSAndroid Build Coastguard Worker // Gets the number of skipped tests.
skipped_test_count() const6671*5c90c05cSAndroid Build Coastguard Worker int UnitTest::skipped_test_count() const {
6672*5c90c05cSAndroid Build Coastguard Worker   return impl()->skipped_test_count();
6673*5c90c05cSAndroid Build Coastguard Worker }
6674*5c90c05cSAndroid Build Coastguard Worker 
6675*5c90c05cSAndroid Build Coastguard Worker // Gets the number of failed tests.
failed_test_count() const6676*5c90c05cSAndroid Build Coastguard Worker int UnitTest::failed_test_count() const { return impl()->failed_test_count(); }
6677*5c90c05cSAndroid Build Coastguard Worker 
6678*5c90c05cSAndroid Build Coastguard Worker // Gets the number of disabled tests that will be reported in the XML report.
reportable_disabled_test_count() const6679*5c90c05cSAndroid Build Coastguard Worker int UnitTest::reportable_disabled_test_count() const {
6680*5c90c05cSAndroid Build Coastguard Worker   return impl()->reportable_disabled_test_count();
6681*5c90c05cSAndroid Build Coastguard Worker }
6682*5c90c05cSAndroid Build Coastguard Worker 
6683*5c90c05cSAndroid Build Coastguard Worker // Gets the number of disabled tests.
disabled_test_count() const6684*5c90c05cSAndroid Build Coastguard Worker int UnitTest::disabled_test_count() const {
6685*5c90c05cSAndroid Build Coastguard Worker   return impl()->disabled_test_count();
6686*5c90c05cSAndroid Build Coastguard Worker }
6687*5c90c05cSAndroid Build Coastguard Worker 
6688*5c90c05cSAndroid Build Coastguard Worker // Gets the number of tests to be printed in the XML report.
reportable_test_count() const6689*5c90c05cSAndroid Build Coastguard Worker int UnitTest::reportable_test_count() const {
6690*5c90c05cSAndroid Build Coastguard Worker   return impl()->reportable_test_count();
6691*5c90c05cSAndroid Build Coastguard Worker }
6692*5c90c05cSAndroid Build Coastguard Worker 
6693*5c90c05cSAndroid Build Coastguard Worker // Gets the number of all tests.
total_test_count() const6694*5c90c05cSAndroid Build Coastguard Worker int UnitTest::total_test_count() const { return impl()->total_test_count(); }
6695*5c90c05cSAndroid Build Coastguard Worker 
6696*5c90c05cSAndroid Build Coastguard Worker // Gets the number of tests that should run.
test_to_run_count() const6697*5c90c05cSAndroid Build Coastguard Worker int UnitTest::test_to_run_count() const { return impl()->test_to_run_count(); }
6698*5c90c05cSAndroid Build Coastguard Worker 
6699*5c90c05cSAndroid Build Coastguard Worker // Gets the time of the test program start, in ms from the start of the
6700*5c90c05cSAndroid Build Coastguard Worker // UNIX epoch.
start_timestamp() const6701*5c90c05cSAndroid Build Coastguard Worker internal::TimeInMillis UnitTest::start_timestamp() const {
6702*5c90c05cSAndroid Build Coastguard Worker     return impl()->start_timestamp();
6703*5c90c05cSAndroid Build Coastguard Worker }
6704*5c90c05cSAndroid Build Coastguard Worker 
6705*5c90c05cSAndroid Build Coastguard Worker // Gets the elapsed time, in milliseconds.
elapsed_time() const6706*5c90c05cSAndroid Build Coastguard Worker internal::TimeInMillis UnitTest::elapsed_time() const {
6707*5c90c05cSAndroid Build Coastguard Worker   return impl()->elapsed_time();
6708*5c90c05cSAndroid Build Coastguard Worker }
6709*5c90c05cSAndroid Build Coastguard Worker 
6710*5c90c05cSAndroid Build Coastguard Worker // Returns true if and only if the unit test passed (i.e. all test suites
6711*5c90c05cSAndroid Build Coastguard Worker // passed).
Passed() const6712*5c90c05cSAndroid Build Coastguard Worker bool UnitTest::Passed() const { return impl()->Passed(); }
6713*5c90c05cSAndroid Build Coastguard Worker 
6714*5c90c05cSAndroid Build Coastguard Worker // Returns true if and only if the unit test failed (i.e. some test suite
6715*5c90c05cSAndroid Build Coastguard Worker // failed or something outside of all tests failed).
Failed() const6716*5c90c05cSAndroid Build Coastguard Worker bool UnitTest::Failed() const { return impl()->Failed(); }
6717*5c90c05cSAndroid Build Coastguard Worker 
6718*5c90c05cSAndroid Build Coastguard Worker // Gets the i-th test suite among all the test suites. i can range from 0 to
6719*5c90c05cSAndroid Build Coastguard Worker // total_test_suite_count() - 1. If i is not in that range, returns NULL.
GetTestSuite(int i) const6720*5c90c05cSAndroid Build Coastguard Worker const TestSuite* UnitTest::GetTestSuite(int i) const {
6721*5c90c05cSAndroid Build Coastguard Worker   return impl()->GetTestSuite(i);
6722*5c90c05cSAndroid Build Coastguard Worker }
6723*5c90c05cSAndroid Build Coastguard Worker 
6724*5c90c05cSAndroid Build Coastguard Worker //  Legacy API is deprecated but still available
6725*5c90c05cSAndroid Build Coastguard Worker #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
GetTestCase(int i) const6726*5c90c05cSAndroid Build Coastguard Worker const TestCase* UnitTest::GetTestCase(int i) const {
6727*5c90c05cSAndroid Build Coastguard Worker   return impl()->GetTestCase(i);
6728*5c90c05cSAndroid Build Coastguard Worker }
6729*5c90c05cSAndroid Build Coastguard Worker #endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_
6730*5c90c05cSAndroid Build Coastguard Worker 
6731*5c90c05cSAndroid Build Coastguard Worker // Returns the TestResult containing information on test failures and
6732*5c90c05cSAndroid Build Coastguard Worker // properties logged outside of individual test suites.
ad_hoc_test_result() const6733*5c90c05cSAndroid Build Coastguard Worker const TestResult& UnitTest::ad_hoc_test_result() const {
6734*5c90c05cSAndroid Build Coastguard Worker   return *impl()->ad_hoc_test_result();
6735*5c90c05cSAndroid Build Coastguard Worker }
6736*5c90c05cSAndroid Build Coastguard Worker 
6737*5c90c05cSAndroid Build Coastguard Worker // Gets the i-th test suite among all the test suites. i can range from 0 to
6738*5c90c05cSAndroid Build Coastguard Worker // total_test_suite_count() - 1. If i is not in that range, returns NULL.
GetMutableTestSuite(int i)6739*5c90c05cSAndroid Build Coastguard Worker TestSuite* UnitTest::GetMutableTestSuite(int i) {
6740*5c90c05cSAndroid Build Coastguard Worker   return impl()->GetMutableSuiteCase(i);
6741*5c90c05cSAndroid Build Coastguard Worker }
6742*5c90c05cSAndroid Build Coastguard Worker 
6743*5c90c05cSAndroid Build Coastguard Worker // Returns the list of event listeners that can be used to track events
6744*5c90c05cSAndroid Build Coastguard Worker // inside Google Test.
listeners()6745*5c90c05cSAndroid Build Coastguard Worker TestEventListeners& UnitTest::listeners() {
6746*5c90c05cSAndroid Build Coastguard Worker   return *impl()->listeners();
6747*5c90c05cSAndroid Build Coastguard Worker }
6748*5c90c05cSAndroid Build Coastguard Worker 
6749*5c90c05cSAndroid Build Coastguard Worker // Registers and returns a global test environment.  When a test
6750*5c90c05cSAndroid Build Coastguard Worker // program is run, all global test environments will be set-up in the
6751*5c90c05cSAndroid Build Coastguard Worker // order they were registered.  After all tests in the program have
6752*5c90c05cSAndroid Build Coastguard Worker // finished, all global test environments will be torn-down in the
6753*5c90c05cSAndroid Build Coastguard Worker // *reverse* order they were registered.
6754*5c90c05cSAndroid Build Coastguard Worker //
6755*5c90c05cSAndroid Build Coastguard Worker // The UnitTest object takes ownership of the given environment.
6756*5c90c05cSAndroid Build Coastguard Worker //
6757*5c90c05cSAndroid Build Coastguard Worker // We don't protect this under mutex_, as we only support calling it
6758*5c90c05cSAndroid Build Coastguard Worker // from the main thread.
AddEnvironment(Environment * env)6759*5c90c05cSAndroid Build Coastguard Worker Environment* UnitTest::AddEnvironment(Environment* env) {
6760*5c90c05cSAndroid Build Coastguard Worker   if (env == nullptr) {
6761*5c90c05cSAndroid Build Coastguard Worker     return nullptr;
6762*5c90c05cSAndroid Build Coastguard Worker   }
6763*5c90c05cSAndroid Build Coastguard Worker 
6764*5c90c05cSAndroid Build Coastguard Worker   impl_->environments().push_back(env);
6765*5c90c05cSAndroid Build Coastguard Worker   return env;
6766*5c90c05cSAndroid Build Coastguard Worker }
6767*5c90c05cSAndroid Build Coastguard Worker 
6768*5c90c05cSAndroid Build Coastguard Worker // Adds a TestPartResult to the current TestResult object.  All Google Test
6769*5c90c05cSAndroid Build Coastguard Worker // assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) eventually call
6770*5c90c05cSAndroid Build Coastguard Worker // this to report their results.  The user code should use the
6771*5c90c05cSAndroid Build Coastguard Worker // assertion macros instead of calling this directly.
AddTestPartResult(TestPartResult::Type result_type,const char * file_name,int line_number,const std::string & message,const std::string & os_stack_trace)6772*5c90c05cSAndroid Build Coastguard Worker void UnitTest::AddTestPartResult(
6773*5c90c05cSAndroid Build Coastguard Worker     TestPartResult::Type result_type,
6774*5c90c05cSAndroid Build Coastguard Worker     const char* file_name,
6775*5c90c05cSAndroid Build Coastguard Worker     int line_number,
6776*5c90c05cSAndroid Build Coastguard Worker     const std::string& message,
6777*5c90c05cSAndroid Build Coastguard Worker     const std::string& os_stack_trace) GTEST_LOCK_EXCLUDED_(mutex_) {
6778*5c90c05cSAndroid Build Coastguard Worker   Message msg;
6779*5c90c05cSAndroid Build Coastguard Worker   msg << message;
6780*5c90c05cSAndroid Build Coastguard Worker 
6781*5c90c05cSAndroid Build Coastguard Worker   internal::MutexLock lock(&mutex_);
6782*5c90c05cSAndroid Build Coastguard Worker   if (impl_->gtest_trace_stack().size() > 0) {
6783*5c90c05cSAndroid Build Coastguard Worker     msg << "\n" << GTEST_NAME_ << " trace:";
6784*5c90c05cSAndroid Build Coastguard Worker 
6785*5c90c05cSAndroid Build Coastguard Worker     for (size_t i = impl_->gtest_trace_stack().size(); i > 0; --i) {
6786*5c90c05cSAndroid Build Coastguard Worker       const internal::TraceInfo& trace = impl_->gtest_trace_stack()[i - 1];
6787*5c90c05cSAndroid Build Coastguard Worker       msg << "\n" << internal::FormatFileLocation(trace.file, trace.line)
6788*5c90c05cSAndroid Build Coastguard Worker           << " " << trace.message;
6789*5c90c05cSAndroid Build Coastguard Worker     }
6790*5c90c05cSAndroid Build Coastguard Worker   }
6791*5c90c05cSAndroid Build Coastguard Worker 
6792*5c90c05cSAndroid Build Coastguard Worker   if (os_stack_trace.c_str() != nullptr && !os_stack_trace.empty()) {
6793*5c90c05cSAndroid Build Coastguard Worker     msg << internal::kStackTraceMarker << os_stack_trace;
6794*5c90c05cSAndroid Build Coastguard Worker   }
6795*5c90c05cSAndroid Build Coastguard Worker 
6796*5c90c05cSAndroid Build Coastguard Worker   const TestPartResult result = TestPartResult(
6797*5c90c05cSAndroid Build Coastguard Worker       result_type, file_name, line_number, msg.GetString().c_str());
6798*5c90c05cSAndroid Build Coastguard Worker   impl_->GetTestPartResultReporterForCurrentThread()->
6799*5c90c05cSAndroid Build Coastguard Worker       ReportTestPartResult(result);
6800*5c90c05cSAndroid Build Coastguard Worker 
6801*5c90c05cSAndroid Build Coastguard Worker   if (result_type != TestPartResult::kSuccess &&
6802*5c90c05cSAndroid Build Coastguard Worker       result_type != TestPartResult::kSkip) {
6803*5c90c05cSAndroid Build Coastguard Worker     // gtest_break_on_failure takes precedence over
6804*5c90c05cSAndroid Build Coastguard Worker     // gtest_throw_on_failure.  This allows a user to set the latter
6805*5c90c05cSAndroid Build Coastguard Worker     // in the code (perhaps in order to use Google Test assertions
6806*5c90c05cSAndroid Build Coastguard Worker     // with another testing framework) and specify the former on the
6807*5c90c05cSAndroid Build Coastguard Worker     // command line for debugging.
6808*5c90c05cSAndroid Build Coastguard Worker     if (GTEST_FLAG(break_on_failure)) {
6809*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT
6810*5c90c05cSAndroid Build Coastguard Worker       // Using DebugBreak on Windows allows gtest to still break into a debugger
6811*5c90c05cSAndroid Build Coastguard Worker       // when a failure happens and both the --gtest_break_on_failure and
6812*5c90c05cSAndroid Build Coastguard Worker       // the --gtest_catch_exceptions flags are specified.
6813*5c90c05cSAndroid Build Coastguard Worker       DebugBreak();
6814*5c90c05cSAndroid Build Coastguard Worker #elif (!defined(__native_client__)) &&            \
6815*5c90c05cSAndroid Build Coastguard Worker     ((defined(__clang__) || defined(__GNUC__)) && \
6816*5c90c05cSAndroid Build Coastguard Worker      (defined(__x86_64__) || defined(__i386__)))
6817*5c90c05cSAndroid Build Coastguard Worker       // with clang/gcc we can achieve the same effect on x86 by invoking int3
6818*5c90c05cSAndroid Build Coastguard Worker       asm("int3");
6819*5c90c05cSAndroid Build Coastguard Worker #else
6820*5c90c05cSAndroid Build Coastguard Worker       // Dereference nullptr through a volatile pointer to prevent the compiler
6821*5c90c05cSAndroid Build Coastguard Worker       // from removing. We use this rather than abort() or __builtin_trap() for
6822*5c90c05cSAndroid Build Coastguard Worker       // portability: some debuggers don't correctly trap abort().
6823*5c90c05cSAndroid Build Coastguard Worker       *static_cast<volatile int*>(nullptr) = 1;
6824*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_OS_WINDOWS
6825*5c90c05cSAndroid Build Coastguard Worker     } else if (GTEST_FLAG(throw_on_failure)) {
6826*5c90c05cSAndroid Build Coastguard Worker #if GTEST_HAS_EXCEPTIONS
6827*5c90c05cSAndroid Build Coastguard Worker       throw internal::GoogleTestFailureException(result);
6828*5c90c05cSAndroid Build Coastguard Worker #else
6829*5c90c05cSAndroid Build Coastguard Worker       // We cannot call abort() as it generates a pop-up in debug mode
6830*5c90c05cSAndroid Build Coastguard Worker       // that cannot be suppressed in VC 7.1 or below.
6831*5c90c05cSAndroid Build Coastguard Worker       exit(1);
6832*5c90c05cSAndroid Build Coastguard Worker #endif
6833*5c90c05cSAndroid Build Coastguard Worker     }
6834*5c90c05cSAndroid Build Coastguard Worker   }
6835*5c90c05cSAndroid Build Coastguard Worker }
6836*5c90c05cSAndroid Build Coastguard Worker 
6837*5c90c05cSAndroid Build Coastguard Worker // Adds a TestProperty to the current TestResult object when invoked from
6838*5c90c05cSAndroid Build Coastguard Worker // inside a test, to current TestSuite's ad_hoc_test_result_ when invoked
6839*5c90c05cSAndroid Build Coastguard Worker // from SetUpTestSuite or TearDownTestSuite, or to the global property set
6840*5c90c05cSAndroid Build Coastguard Worker // when invoked elsewhere.  If the result already contains a property with
6841*5c90c05cSAndroid Build Coastguard Worker // the same key, the value will be updated.
RecordProperty(const std::string & key,const std::string & value)6842*5c90c05cSAndroid Build Coastguard Worker void UnitTest::RecordProperty(const std::string& key,
6843*5c90c05cSAndroid Build Coastguard Worker                               const std::string& value) {
6844*5c90c05cSAndroid Build Coastguard Worker   impl_->RecordProperty(TestProperty(key, value));
6845*5c90c05cSAndroid Build Coastguard Worker }
6846*5c90c05cSAndroid Build Coastguard Worker 
6847*5c90c05cSAndroid Build Coastguard Worker // Runs all tests in this UnitTest object and prints the result.
6848*5c90c05cSAndroid Build Coastguard Worker // Returns 0 if successful, or 1 otherwise.
6849*5c90c05cSAndroid Build Coastguard Worker //
6850*5c90c05cSAndroid Build Coastguard Worker // We don't protect this under mutex_, as we only support calling it
6851*5c90c05cSAndroid Build Coastguard Worker // from the main thread.
Run()6852*5c90c05cSAndroid Build Coastguard Worker int UnitTest::Run() {
6853*5c90c05cSAndroid Build Coastguard Worker   const bool in_death_test_child_process =
6854*5c90c05cSAndroid Build Coastguard Worker       internal::GTEST_FLAG(internal_run_death_test).length() > 0;
6855*5c90c05cSAndroid Build Coastguard Worker 
6856*5c90c05cSAndroid Build Coastguard Worker   // Google Test implements this protocol for catching that a test
6857*5c90c05cSAndroid Build Coastguard Worker   // program exits before returning control to Google Test:
6858*5c90c05cSAndroid Build Coastguard Worker   //
6859*5c90c05cSAndroid Build Coastguard Worker   //   1. Upon start, Google Test creates a file whose absolute path
6860*5c90c05cSAndroid Build Coastguard Worker   //      is specified by the environment variable
6861*5c90c05cSAndroid Build Coastguard Worker   //      TEST_PREMATURE_EXIT_FILE.
6862*5c90c05cSAndroid Build Coastguard Worker   //   2. When Google Test has finished its work, it deletes the file.
6863*5c90c05cSAndroid Build Coastguard Worker   //
6864*5c90c05cSAndroid Build Coastguard Worker   // This allows a test runner to set TEST_PREMATURE_EXIT_FILE before
6865*5c90c05cSAndroid Build Coastguard Worker   // running a Google-Test-based test program and check the existence
6866*5c90c05cSAndroid Build Coastguard Worker   // of the file at the end of the test execution to see if it has
6867*5c90c05cSAndroid Build Coastguard Worker   // exited prematurely.
6868*5c90c05cSAndroid Build Coastguard Worker 
6869*5c90c05cSAndroid Build Coastguard Worker   // If we are in the child process of a death test, don't
6870*5c90c05cSAndroid Build Coastguard Worker   // create/delete the premature exit file, as doing so is unnecessary
6871*5c90c05cSAndroid Build Coastguard Worker   // and will confuse the parent process.  Otherwise, create/delete
6872*5c90c05cSAndroid Build Coastguard Worker   // the file upon entering/leaving this function.  If the program
6873*5c90c05cSAndroid Build Coastguard Worker   // somehow exits before this function has a chance to return, the
6874*5c90c05cSAndroid Build Coastguard Worker   // premature-exit file will be left undeleted, causing a test runner
6875*5c90c05cSAndroid Build Coastguard Worker   // that understands the premature-exit-file protocol to report the
6876*5c90c05cSAndroid Build Coastguard Worker   // test as having failed.
6877*5c90c05cSAndroid Build Coastguard Worker   const internal::ScopedPrematureExitFile premature_exit_file(
6878*5c90c05cSAndroid Build Coastguard Worker       in_death_test_child_process
6879*5c90c05cSAndroid Build Coastguard Worker           ? nullptr
6880*5c90c05cSAndroid Build Coastguard Worker           : internal::posix::GetEnv("TEST_PREMATURE_EXIT_FILE"));
6881*5c90c05cSAndroid Build Coastguard Worker 
6882*5c90c05cSAndroid Build Coastguard Worker   // Captures the value of GTEST_FLAG(catch_exceptions).  This value will be
6883*5c90c05cSAndroid Build Coastguard Worker   // used for the duration of the program.
6884*5c90c05cSAndroid Build Coastguard Worker   impl()->set_catch_exceptions(GTEST_FLAG(catch_exceptions));
6885*5c90c05cSAndroid Build Coastguard Worker 
6886*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_WINDOWS
6887*5c90c05cSAndroid Build Coastguard Worker   // Either the user wants Google Test to catch exceptions thrown by the
6888*5c90c05cSAndroid Build Coastguard Worker   // tests or this is executing in the context of death test child
6889*5c90c05cSAndroid Build Coastguard Worker   // process. In either case the user does not want to see pop-up dialogs
6890*5c90c05cSAndroid Build Coastguard Worker   // about crashes - they are expected.
6891*5c90c05cSAndroid Build Coastguard Worker   if (impl()->catch_exceptions() || in_death_test_child_process) {
6892*5c90c05cSAndroid Build Coastguard Worker # if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT
6893*5c90c05cSAndroid Build Coastguard Worker     // SetErrorMode doesn't exist on CE.
6894*5c90c05cSAndroid Build Coastguard Worker     SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT |
6895*5c90c05cSAndroid Build Coastguard Worker                  SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
6896*5c90c05cSAndroid Build Coastguard Worker # endif  // !GTEST_OS_WINDOWS_MOBILE
6897*5c90c05cSAndroid Build Coastguard Worker 
6898*5c90c05cSAndroid Build Coastguard Worker # if (defined(_MSC_VER) || GTEST_OS_WINDOWS_MINGW) && !GTEST_OS_WINDOWS_MOBILE
6899*5c90c05cSAndroid Build Coastguard Worker     // Death test children can be terminated with _abort().  On Windows,
6900*5c90c05cSAndroid Build Coastguard Worker     // _abort() can show a dialog with a warning message.  This forces the
6901*5c90c05cSAndroid Build Coastguard Worker     // abort message to go to stderr instead.
6902*5c90c05cSAndroid Build Coastguard Worker     _set_error_mode(_OUT_TO_STDERR);
6903*5c90c05cSAndroid Build Coastguard Worker # endif
6904*5c90c05cSAndroid Build Coastguard Worker 
6905*5c90c05cSAndroid Build Coastguard Worker # if defined(_MSC_VER) && !GTEST_OS_WINDOWS_MOBILE
6906*5c90c05cSAndroid Build Coastguard Worker     // In the debug version, Visual Studio pops up a separate dialog
6907*5c90c05cSAndroid Build Coastguard Worker     // offering a choice to debug the aborted program. We need to suppress
6908*5c90c05cSAndroid Build Coastguard Worker     // this dialog or it will pop up for every EXPECT/ASSERT_DEATH statement
6909*5c90c05cSAndroid Build Coastguard Worker     // executed. Google Test will notify the user of any unexpected
6910*5c90c05cSAndroid Build Coastguard Worker     // failure via stderr.
6911*5c90c05cSAndroid Build Coastguard Worker     if (!GTEST_FLAG(break_on_failure))
6912*5c90c05cSAndroid Build Coastguard Worker       _set_abort_behavior(
6913*5c90c05cSAndroid Build Coastguard Worker           0x0,                                    // Clear the following flags:
6914*5c90c05cSAndroid Build Coastguard Worker           _WRITE_ABORT_MSG | _CALL_REPORTFAULT);  // pop-up window, core dump.
6915*5c90c05cSAndroid Build Coastguard Worker 
6916*5c90c05cSAndroid Build Coastguard Worker     // In debug mode, the Windows CRT can crash with an assertion over invalid
6917*5c90c05cSAndroid Build Coastguard Worker     // input (e.g. passing an invalid file descriptor).  The default handling
6918*5c90c05cSAndroid Build Coastguard Worker     // for these assertions is to pop up a dialog and wait for user input.
6919*5c90c05cSAndroid Build Coastguard Worker     // Instead ask the CRT to dump such assertions to stderr non-interactively.
6920*5c90c05cSAndroid Build Coastguard Worker     if (!IsDebuggerPresent()) {
6921*5c90c05cSAndroid Build Coastguard Worker       (void)_CrtSetReportMode(_CRT_ASSERT,
6922*5c90c05cSAndroid Build Coastguard Worker                               _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
6923*5c90c05cSAndroid Build Coastguard Worker       (void)_CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);
6924*5c90c05cSAndroid Build Coastguard Worker     }
6925*5c90c05cSAndroid Build Coastguard Worker # endif
6926*5c90c05cSAndroid Build Coastguard Worker   }
6927*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_OS_WINDOWS
6928*5c90c05cSAndroid Build Coastguard Worker 
6929*5c90c05cSAndroid Build Coastguard Worker   return internal::HandleExceptionsInMethodIfSupported(
6930*5c90c05cSAndroid Build Coastguard Worker       impl(),
6931*5c90c05cSAndroid Build Coastguard Worker       &internal::UnitTestImpl::RunAllTests,
6932*5c90c05cSAndroid Build Coastguard Worker       "auxiliary test code (environments or event listeners)") ? 0 : 1;
6933*5c90c05cSAndroid Build Coastguard Worker }
6934*5c90c05cSAndroid Build Coastguard Worker 
6935*5c90c05cSAndroid Build Coastguard Worker // Returns the working directory when the first TEST() or TEST_F() was
6936*5c90c05cSAndroid Build Coastguard Worker // executed.
original_working_dir() const6937*5c90c05cSAndroid Build Coastguard Worker const char* UnitTest::original_working_dir() const {
6938*5c90c05cSAndroid Build Coastguard Worker   return impl_->original_working_dir_.c_str();
6939*5c90c05cSAndroid Build Coastguard Worker }
6940*5c90c05cSAndroid Build Coastguard Worker 
6941*5c90c05cSAndroid Build Coastguard Worker // Returns the TestSuite object for the test that's currently running,
6942*5c90c05cSAndroid Build Coastguard Worker // or NULL if no test is running.
current_test_suite() const6943*5c90c05cSAndroid Build Coastguard Worker const TestSuite* UnitTest::current_test_suite() const
6944*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOCK_EXCLUDED_(mutex_) {
6945*5c90c05cSAndroid Build Coastguard Worker   internal::MutexLock lock(&mutex_);
6946*5c90c05cSAndroid Build Coastguard Worker   return impl_->current_test_suite();
6947*5c90c05cSAndroid Build Coastguard Worker }
6948*5c90c05cSAndroid Build Coastguard Worker 
6949*5c90c05cSAndroid Build Coastguard Worker // Legacy API is still available but deprecated
6950*5c90c05cSAndroid Build Coastguard Worker #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
current_test_case() const6951*5c90c05cSAndroid Build Coastguard Worker const TestCase* UnitTest::current_test_case() const
6952*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOCK_EXCLUDED_(mutex_) {
6953*5c90c05cSAndroid Build Coastguard Worker   internal::MutexLock lock(&mutex_);
6954*5c90c05cSAndroid Build Coastguard Worker   return impl_->current_test_suite();
6955*5c90c05cSAndroid Build Coastguard Worker }
6956*5c90c05cSAndroid Build Coastguard Worker #endif
6957*5c90c05cSAndroid Build Coastguard Worker 
6958*5c90c05cSAndroid Build Coastguard Worker // Returns the TestInfo object for the test that's currently running,
6959*5c90c05cSAndroid Build Coastguard Worker // or NULL if no test is running.
current_test_info() const6960*5c90c05cSAndroid Build Coastguard Worker const TestInfo* UnitTest::current_test_info() const
6961*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOCK_EXCLUDED_(mutex_) {
6962*5c90c05cSAndroid Build Coastguard Worker   internal::MutexLock lock(&mutex_);
6963*5c90c05cSAndroid Build Coastguard Worker   return impl_->current_test_info();
6964*5c90c05cSAndroid Build Coastguard Worker }
6965*5c90c05cSAndroid Build Coastguard Worker 
6966*5c90c05cSAndroid Build Coastguard Worker // Returns the random seed used at the start of the current test run.
random_seed() const6967*5c90c05cSAndroid Build Coastguard Worker int UnitTest::random_seed() const { return impl_->random_seed(); }
6968*5c90c05cSAndroid Build Coastguard Worker 
6969*5c90c05cSAndroid Build Coastguard Worker // Returns ParameterizedTestSuiteRegistry object used to keep track of
6970*5c90c05cSAndroid Build Coastguard Worker // value-parameterized tests and instantiate and register them.
6971*5c90c05cSAndroid Build Coastguard Worker internal::ParameterizedTestSuiteRegistry&
parameterized_test_registry()6972*5c90c05cSAndroid Build Coastguard Worker UnitTest::parameterized_test_registry() GTEST_LOCK_EXCLUDED_(mutex_) {
6973*5c90c05cSAndroid Build Coastguard Worker   return impl_->parameterized_test_registry();
6974*5c90c05cSAndroid Build Coastguard Worker }
6975*5c90c05cSAndroid Build Coastguard Worker 
6976*5c90c05cSAndroid Build Coastguard Worker // Creates an empty UnitTest.
UnitTest()6977*5c90c05cSAndroid Build Coastguard Worker UnitTest::UnitTest() {
6978*5c90c05cSAndroid Build Coastguard Worker   impl_ = new internal::UnitTestImpl(this);
6979*5c90c05cSAndroid Build Coastguard Worker }
6980*5c90c05cSAndroid Build Coastguard Worker 
6981*5c90c05cSAndroid Build Coastguard Worker // Destructor of UnitTest.
~UnitTest()6982*5c90c05cSAndroid Build Coastguard Worker UnitTest::~UnitTest() {
6983*5c90c05cSAndroid Build Coastguard Worker   delete impl_;
6984*5c90c05cSAndroid Build Coastguard Worker }
6985*5c90c05cSAndroid Build Coastguard Worker 
6986*5c90c05cSAndroid Build Coastguard Worker // Pushes a trace defined by SCOPED_TRACE() on to the per-thread
6987*5c90c05cSAndroid Build Coastguard Worker // Google Test trace stack.
PushGTestTrace(const internal::TraceInfo & trace)6988*5c90c05cSAndroid Build Coastguard Worker void UnitTest::PushGTestTrace(const internal::TraceInfo& trace)
6989*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOCK_EXCLUDED_(mutex_) {
6990*5c90c05cSAndroid Build Coastguard Worker   internal::MutexLock lock(&mutex_);
6991*5c90c05cSAndroid Build Coastguard Worker   impl_->gtest_trace_stack().push_back(trace);
6992*5c90c05cSAndroid Build Coastguard Worker }
6993*5c90c05cSAndroid Build Coastguard Worker 
6994*5c90c05cSAndroid Build Coastguard Worker // Pops a trace from the per-thread Google Test trace stack.
PopGTestTrace()6995*5c90c05cSAndroid Build Coastguard Worker void UnitTest::PopGTestTrace()
6996*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOCK_EXCLUDED_(mutex_) {
6997*5c90c05cSAndroid Build Coastguard Worker   internal::MutexLock lock(&mutex_);
6998*5c90c05cSAndroid Build Coastguard Worker   impl_->gtest_trace_stack().pop_back();
6999*5c90c05cSAndroid Build Coastguard Worker }
7000*5c90c05cSAndroid Build Coastguard Worker 
7001*5c90c05cSAndroid Build Coastguard Worker namespace internal {
7002*5c90c05cSAndroid Build Coastguard Worker 
UnitTestImpl(UnitTest * parent)7003*5c90c05cSAndroid Build Coastguard Worker UnitTestImpl::UnitTestImpl(UnitTest* parent)
7004*5c90c05cSAndroid Build Coastguard Worker     : parent_(parent),
7005*5c90c05cSAndroid Build Coastguard Worker       GTEST_DISABLE_MSC_WARNINGS_PUSH_(4355 /* using this in initializer */)
7006*5c90c05cSAndroid Build Coastguard Worker           default_global_test_part_result_reporter_(this),
7007*5c90c05cSAndroid Build Coastguard Worker       default_per_thread_test_part_result_reporter_(this),
7008*5c90c05cSAndroid Build Coastguard Worker       GTEST_DISABLE_MSC_WARNINGS_POP_() global_test_part_result_repoter_(
7009*5c90c05cSAndroid Build Coastguard Worker           &default_global_test_part_result_reporter_),
7010*5c90c05cSAndroid Build Coastguard Worker       per_thread_test_part_result_reporter_(
7011*5c90c05cSAndroid Build Coastguard Worker           &default_per_thread_test_part_result_reporter_),
7012*5c90c05cSAndroid Build Coastguard Worker       parameterized_test_registry_(),
7013*5c90c05cSAndroid Build Coastguard Worker       parameterized_tests_registered_(false),
7014*5c90c05cSAndroid Build Coastguard Worker       last_death_test_suite_(-1),
7015*5c90c05cSAndroid Build Coastguard Worker       current_test_suite_(nullptr),
7016*5c90c05cSAndroid Build Coastguard Worker       current_test_info_(nullptr),
7017*5c90c05cSAndroid Build Coastguard Worker       ad_hoc_test_result_(),
7018*5c90c05cSAndroid Build Coastguard Worker       os_stack_trace_getter_(nullptr),
7019*5c90c05cSAndroid Build Coastguard Worker       post_flag_parse_init_performed_(false),
7020*5c90c05cSAndroid Build Coastguard Worker       random_seed_(0),  // Will be overridden by the flag before first use.
7021*5c90c05cSAndroid Build Coastguard Worker       random_(0),       // Will be reseeded before first use.
7022*5c90c05cSAndroid Build Coastguard Worker       start_timestamp_(0),
7023*5c90c05cSAndroid Build Coastguard Worker       elapsed_time_(0),
7024*5c90c05cSAndroid Build Coastguard Worker #if GTEST_HAS_DEATH_TEST
7025*5c90c05cSAndroid Build Coastguard Worker       death_test_factory_(new DefaultDeathTestFactory),
7026*5c90c05cSAndroid Build Coastguard Worker #endif
7027*5c90c05cSAndroid Build Coastguard Worker       // Will be overridden by the flag before first use.
7028*5c90c05cSAndroid Build Coastguard Worker       catch_exceptions_(false) {
7029*5c90c05cSAndroid Build Coastguard Worker   listeners()->SetDefaultResultPrinter(new PrettyUnitTestResultPrinter);
7030*5c90c05cSAndroid Build Coastguard Worker }
7031*5c90c05cSAndroid Build Coastguard Worker 
~UnitTestImpl()7032*5c90c05cSAndroid Build Coastguard Worker UnitTestImpl::~UnitTestImpl() {
7033*5c90c05cSAndroid Build Coastguard Worker   // Deletes every TestSuite.
7034*5c90c05cSAndroid Build Coastguard Worker   ForEach(test_suites_, internal::Delete<TestSuite>);
7035*5c90c05cSAndroid Build Coastguard Worker 
7036*5c90c05cSAndroid Build Coastguard Worker   // Deletes every Environment.
7037*5c90c05cSAndroid Build Coastguard Worker   ForEach(environments_, internal::Delete<Environment>);
7038*5c90c05cSAndroid Build Coastguard Worker 
7039*5c90c05cSAndroid Build Coastguard Worker   delete os_stack_trace_getter_;
7040*5c90c05cSAndroid Build Coastguard Worker }
7041*5c90c05cSAndroid Build Coastguard Worker 
7042*5c90c05cSAndroid Build Coastguard Worker // Adds a TestProperty to the current TestResult object when invoked in a
7043*5c90c05cSAndroid Build Coastguard Worker // context of a test, to current test suite's ad_hoc_test_result when invoke
7044*5c90c05cSAndroid Build Coastguard Worker // from SetUpTestSuite/TearDownTestSuite, or to the global property set
7045*5c90c05cSAndroid Build Coastguard Worker // otherwise.  If the result already contains a property with the same key,
7046*5c90c05cSAndroid Build Coastguard Worker // the value will be updated.
RecordProperty(const TestProperty & test_property)7047*5c90c05cSAndroid Build Coastguard Worker void UnitTestImpl::RecordProperty(const TestProperty& test_property) {
7048*5c90c05cSAndroid Build Coastguard Worker   std::string xml_element;
7049*5c90c05cSAndroid Build Coastguard Worker   TestResult* test_result;  // TestResult appropriate for property recording.
7050*5c90c05cSAndroid Build Coastguard Worker 
7051*5c90c05cSAndroid Build Coastguard Worker   if (current_test_info_ != nullptr) {
7052*5c90c05cSAndroid Build Coastguard Worker     xml_element = "testcase";
7053*5c90c05cSAndroid Build Coastguard Worker     test_result = &(current_test_info_->result_);
7054*5c90c05cSAndroid Build Coastguard Worker   } else if (current_test_suite_ != nullptr) {
7055*5c90c05cSAndroid Build Coastguard Worker     xml_element = "testsuite";
7056*5c90c05cSAndroid Build Coastguard Worker     test_result = &(current_test_suite_->ad_hoc_test_result_);
7057*5c90c05cSAndroid Build Coastguard Worker   } else {
7058*5c90c05cSAndroid Build Coastguard Worker     xml_element = "testsuites";
7059*5c90c05cSAndroid Build Coastguard Worker     test_result = &ad_hoc_test_result_;
7060*5c90c05cSAndroid Build Coastguard Worker   }
7061*5c90c05cSAndroid Build Coastguard Worker   test_result->RecordProperty(xml_element, test_property);
7062*5c90c05cSAndroid Build Coastguard Worker }
7063*5c90c05cSAndroid Build Coastguard Worker 
7064*5c90c05cSAndroid Build Coastguard Worker #if GTEST_HAS_DEATH_TEST
7065*5c90c05cSAndroid Build Coastguard Worker // Disables event forwarding if the control is currently in a death test
7066*5c90c05cSAndroid Build Coastguard Worker // subprocess. Must not be called before InitGoogleTest.
SuppressTestEventsIfInSubprocess()7067*5c90c05cSAndroid Build Coastguard Worker void UnitTestImpl::SuppressTestEventsIfInSubprocess() {
7068*5c90c05cSAndroid Build Coastguard Worker   if (internal_run_death_test_flag_.get() != nullptr)
7069*5c90c05cSAndroid Build Coastguard Worker     listeners()->SuppressEventForwarding();
7070*5c90c05cSAndroid Build Coastguard Worker }
7071*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_HAS_DEATH_TEST
7072*5c90c05cSAndroid Build Coastguard Worker 
7073*5c90c05cSAndroid Build Coastguard Worker // Initializes event listeners performing XML output as specified by
7074*5c90c05cSAndroid Build Coastguard Worker // UnitTestOptions. Must not be called before InitGoogleTest.
ConfigureXmlOutput()7075*5c90c05cSAndroid Build Coastguard Worker void UnitTestImpl::ConfigureXmlOutput() {
7076*5c90c05cSAndroid Build Coastguard Worker   const std::string& output_format = UnitTestOptions::GetOutputFormat();
7077*5c90c05cSAndroid Build Coastguard Worker   if (output_format == "xml") {
7078*5c90c05cSAndroid Build Coastguard Worker     listeners()->SetDefaultXmlGenerator(new XmlUnitTestResultPrinter(
7079*5c90c05cSAndroid Build Coastguard Worker         UnitTestOptions::GetAbsolutePathToOutputFile().c_str()));
7080*5c90c05cSAndroid Build Coastguard Worker   } else if (output_format == "json") {
7081*5c90c05cSAndroid Build Coastguard Worker     listeners()->SetDefaultXmlGenerator(new JsonUnitTestResultPrinter(
7082*5c90c05cSAndroid Build Coastguard Worker         UnitTestOptions::GetAbsolutePathToOutputFile().c_str()));
7083*5c90c05cSAndroid Build Coastguard Worker   } else if (output_format != "") {
7084*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOG_(WARNING) << "WARNING: unrecognized output format \""
7085*5c90c05cSAndroid Build Coastguard Worker                         << output_format << "\" ignored.";
7086*5c90c05cSAndroid Build Coastguard Worker   }
7087*5c90c05cSAndroid Build Coastguard Worker }
7088*5c90c05cSAndroid Build Coastguard Worker 
7089*5c90c05cSAndroid Build Coastguard Worker #if GTEST_CAN_STREAM_RESULTS_
7090*5c90c05cSAndroid Build Coastguard Worker // Initializes event listeners for streaming test results in string form.
7091*5c90c05cSAndroid Build Coastguard Worker // Must not be called before InitGoogleTest.
ConfigureStreamingOutput()7092*5c90c05cSAndroid Build Coastguard Worker void UnitTestImpl::ConfigureStreamingOutput() {
7093*5c90c05cSAndroid Build Coastguard Worker   const std::string& target = GTEST_FLAG(stream_result_to);
7094*5c90c05cSAndroid Build Coastguard Worker   if (!target.empty()) {
7095*5c90c05cSAndroid Build Coastguard Worker     const size_t pos = target.find(':');
7096*5c90c05cSAndroid Build Coastguard Worker     if (pos != std::string::npos) {
7097*5c90c05cSAndroid Build Coastguard Worker       listeners()->Append(new StreamingListener(target.substr(0, pos),
7098*5c90c05cSAndroid Build Coastguard Worker                                                 target.substr(pos+1)));
7099*5c90c05cSAndroid Build Coastguard Worker     } else {
7100*5c90c05cSAndroid Build Coastguard Worker       GTEST_LOG_(WARNING) << "unrecognized streaming target \"" << target
7101*5c90c05cSAndroid Build Coastguard Worker                           << "\" ignored.";
7102*5c90c05cSAndroid Build Coastguard Worker     }
7103*5c90c05cSAndroid Build Coastguard Worker   }
7104*5c90c05cSAndroid Build Coastguard Worker }
7105*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_CAN_STREAM_RESULTS_
7106*5c90c05cSAndroid Build Coastguard Worker 
7107*5c90c05cSAndroid Build Coastguard Worker // Performs initialization dependent upon flag values obtained in
7108*5c90c05cSAndroid Build Coastguard Worker // ParseGoogleTestFlagsOnly.  Is called from InitGoogleTest after the call to
7109*5c90c05cSAndroid Build Coastguard Worker // ParseGoogleTestFlagsOnly.  In case a user neglects to call InitGoogleTest
7110*5c90c05cSAndroid Build Coastguard Worker // this function is also called from RunAllTests.  Since this function can be
7111*5c90c05cSAndroid Build Coastguard Worker // called more than once, it has to be idempotent.
PostFlagParsingInit()7112*5c90c05cSAndroid Build Coastguard Worker void UnitTestImpl::PostFlagParsingInit() {
7113*5c90c05cSAndroid Build Coastguard Worker   // Ensures that this function does not execute more than once.
7114*5c90c05cSAndroid Build Coastguard Worker   if (!post_flag_parse_init_performed_) {
7115*5c90c05cSAndroid Build Coastguard Worker     post_flag_parse_init_performed_ = true;
7116*5c90c05cSAndroid Build Coastguard Worker 
7117*5c90c05cSAndroid Build Coastguard Worker #if defined(GTEST_CUSTOM_TEST_EVENT_LISTENER_)
7118*5c90c05cSAndroid Build Coastguard Worker     // Register to send notifications about key process state changes.
7119*5c90c05cSAndroid Build Coastguard Worker     listeners()->Append(new GTEST_CUSTOM_TEST_EVENT_LISTENER_());
7120*5c90c05cSAndroid Build Coastguard Worker #endif  // defined(GTEST_CUSTOM_TEST_EVENT_LISTENER_)
7121*5c90c05cSAndroid Build Coastguard Worker 
7122*5c90c05cSAndroid Build Coastguard Worker #if GTEST_HAS_DEATH_TEST
7123*5c90c05cSAndroid Build Coastguard Worker     InitDeathTestSubprocessControlInfo();
7124*5c90c05cSAndroid Build Coastguard Worker     SuppressTestEventsIfInSubprocess();
7125*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_HAS_DEATH_TEST
7126*5c90c05cSAndroid Build Coastguard Worker 
7127*5c90c05cSAndroid Build Coastguard Worker     // Registers parameterized tests. This makes parameterized tests
7128*5c90c05cSAndroid Build Coastguard Worker     // available to the UnitTest reflection API without running
7129*5c90c05cSAndroid Build Coastguard Worker     // RUN_ALL_TESTS.
7130*5c90c05cSAndroid Build Coastguard Worker     RegisterParameterizedTests();
7131*5c90c05cSAndroid Build Coastguard Worker 
7132*5c90c05cSAndroid Build Coastguard Worker     // Configures listeners for XML output. This makes it possible for users
7133*5c90c05cSAndroid Build Coastguard Worker     // to shut down the default XML output before invoking RUN_ALL_TESTS.
7134*5c90c05cSAndroid Build Coastguard Worker     ConfigureXmlOutput();
7135*5c90c05cSAndroid Build Coastguard Worker 
7136*5c90c05cSAndroid Build Coastguard Worker     if (GTEST_FLAG(brief)) {
7137*5c90c05cSAndroid Build Coastguard Worker       listeners()->SetDefaultResultPrinter(new BriefUnitTestResultPrinter);
7138*5c90c05cSAndroid Build Coastguard Worker     }
7139*5c90c05cSAndroid Build Coastguard Worker 
7140*5c90c05cSAndroid Build Coastguard Worker #if GTEST_CAN_STREAM_RESULTS_
7141*5c90c05cSAndroid Build Coastguard Worker     // Configures listeners for streaming test results to the specified server.
7142*5c90c05cSAndroid Build Coastguard Worker     ConfigureStreamingOutput();
7143*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_CAN_STREAM_RESULTS_
7144*5c90c05cSAndroid Build Coastguard Worker 
7145*5c90c05cSAndroid Build Coastguard Worker #if GTEST_HAS_ABSL
7146*5c90c05cSAndroid Build Coastguard Worker     if (GTEST_FLAG(install_failure_signal_handler)) {
7147*5c90c05cSAndroid Build Coastguard Worker       absl::FailureSignalHandlerOptions options;
7148*5c90c05cSAndroid Build Coastguard Worker       absl::InstallFailureSignalHandler(options);
7149*5c90c05cSAndroid Build Coastguard Worker     }
7150*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_HAS_ABSL
7151*5c90c05cSAndroid Build Coastguard Worker   }
7152*5c90c05cSAndroid Build Coastguard Worker }
7153*5c90c05cSAndroid Build Coastguard Worker 
7154*5c90c05cSAndroid Build Coastguard Worker // A predicate that checks the name of a TestSuite against a known
7155*5c90c05cSAndroid Build Coastguard Worker // value.
7156*5c90c05cSAndroid Build Coastguard Worker //
7157*5c90c05cSAndroid Build Coastguard Worker // This is used for implementation of the UnitTest class only.  We put
7158*5c90c05cSAndroid Build Coastguard Worker // it in the anonymous namespace to prevent polluting the outer
7159*5c90c05cSAndroid Build Coastguard Worker // namespace.
7160*5c90c05cSAndroid Build Coastguard Worker //
7161*5c90c05cSAndroid Build Coastguard Worker // TestSuiteNameIs is copyable.
7162*5c90c05cSAndroid Build Coastguard Worker class TestSuiteNameIs {
7163*5c90c05cSAndroid Build Coastguard Worker  public:
7164*5c90c05cSAndroid Build Coastguard Worker   // Constructor.
TestSuiteNameIs(const std::string & name)7165*5c90c05cSAndroid Build Coastguard Worker   explicit TestSuiteNameIs(const std::string& name) : name_(name) {}
7166*5c90c05cSAndroid Build Coastguard Worker 
7167*5c90c05cSAndroid Build Coastguard Worker   // Returns true if and only if the name of test_suite matches name_.
operator ()(const TestSuite * test_suite) const7168*5c90c05cSAndroid Build Coastguard Worker   bool operator()(const TestSuite* test_suite) const {
7169*5c90c05cSAndroid Build Coastguard Worker     return test_suite != nullptr &&
7170*5c90c05cSAndroid Build Coastguard Worker            strcmp(test_suite->name(), name_.c_str()) == 0;
7171*5c90c05cSAndroid Build Coastguard Worker   }
7172*5c90c05cSAndroid Build Coastguard Worker 
7173*5c90c05cSAndroid Build Coastguard Worker  private:
7174*5c90c05cSAndroid Build Coastguard Worker   std::string name_;
7175*5c90c05cSAndroid Build Coastguard Worker };
7176*5c90c05cSAndroid Build Coastguard Worker 
7177*5c90c05cSAndroid Build Coastguard Worker // Finds and returns a TestSuite with the given name.  If one doesn't
7178*5c90c05cSAndroid Build Coastguard Worker // exist, creates one and returns it.  It's the CALLER'S
7179*5c90c05cSAndroid Build Coastguard Worker // RESPONSIBILITY to ensure that this function is only called WHEN THE
7180*5c90c05cSAndroid Build Coastguard Worker // TESTS ARE NOT SHUFFLED.
7181*5c90c05cSAndroid Build Coastguard Worker //
7182*5c90c05cSAndroid Build Coastguard Worker // Arguments:
7183*5c90c05cSAndroid Build Coastguard Worker //
7184*5c90c05cSAndroid Build Coastguard Worker //   test_suite_name: name of the test suite
7185*5c90c05cSAndroid Build Coastguard Worker //   type_param:      the name of the test suite's type parameter, or NULL if
7186*5c90c05cSAndroid Build Coastguard Worker //                    this is not a typed or a type-parameterized test suite.
7187*5c90c05cSAndroid Build Coastguard Worker //   set_up_tc:       pointer to the function that sets up the test suite
7188*5c90c05cSAndroid Build Coastguard Worker //   tear_down_tc:    pointer to the function that tears down the test suite
GetTestSuite(const char * test_suite_name,const char * type_param,internal::SetUpTestSuiteFunc set_up_tc,internal::TearDownTestSuiteFunc tear_down_tc)7189*5c90c05cSAndroid Build Coastguard Worker TestSuite* UnitTestImpl::GetTestSuite(
7190*5c90c05cSAndroid Build Coastguard Worker     const char* test_suite_name, const char* type_param,
7191*5c90c05cSAndroid Build Coastguard Worker     internal::SetUpTestSuiteFunc set_up_tc,
7192*5c90c05cSAndroid Build Coastguard Worker     internal::TearDownTestSuiteFunc tear_down_tc) {
7193*5c90c05cSAndroid Build Coastguard Worker   // Can we find a TestSuite with the given name?
7194*5c90c05cSAndroid Build Coastguard Worker   const auto test_suite =
7195*5c90c05cSAndroid Build Coastguard Worker       std::find_if(test_suites_.rbegin(), test_suites_.rend(),
7196*5c90c05cSAndroid Build Coastguard Worker                    TestSuiteNameIs(test_suite_name));
7197*5c90c05cSAndroid Build Coastguard Worker 
7198*5c90c05cSAndroid Build Coastguard Worker   if (test_suite != test_suites_.rend()) return *test_suite;
7199*5c90c05cSAndroid Build Coastguard Worker 
7200*5c90c05cSAndroid Build Coastguard Worker   // No.  Let's create one.
7201*5c90c05cSAndroid Build Coastguard Worker   auto* const new_test_suite =
7202*5c90c05cSAndroid Build Coastguard Worker       new TestSuite(test_suite_name, type_param, set_up_tc, tear_down_tc);
7203*5c90c05cSAndroid Build Coastguard Worker 
7204*5c90c05cSAndroid Build Coastguard Worker   // Is this a death test suite?
7205*5c90c05cSAndroid Build Coastguard Worker   if (internal::UnitTestOptions::MatchesFilter(test_suite_name,
7206*5c90c05cSAndroid Build Coastguard Worker                                                kDeathTestSuiteFilter)) {
7207*5c90c05cSAndroid Build Coastguard Worker     // Yes.  Inserts the test suite after the last death test suite
7208*5c90c05cSAndroid Build Coastguard Worker     // defined so far.  This only works when the test suites haven't
7209*5c90c05cSAndroid Build Coastguard Worker     // been shuffled.  Otherwise we may end up running a death test
7210*5c90c05cSAndroid Build Coastguard Worker     // after a non-death test.
7211*5c90c05cSAndroid Build Coastguard Worker     ++last_death_test_suite_;
7212*5c90c05cSAndroid Build Coastguard Worker     test_suites_.insert(test_suites_.begin() + last_death_test_suite_,
7213*5c90c05cSAndroid Build Coastguard Worker                         new_test_suite);
7214*5c90c05cSAndroid Build Coastguard Worker   } else {
7215*5c90c05cSAndroid Build Coastguard Worker     // No.  Appends to the end of the list.
7216*5c90c05cSAndroid Build Coastguard Worker     test_suites_.push_back(new_test_suite);
7217*5c90c05cSAndroid Build Coastguard Worker   }
7218*5c90c05cSAndroid Build Coastguard Worker 
7219*5c90c05cSAndroid Build Coastguard Worker   test_suite_indices_.push_back(static_cast<int>(test_suite_indices_.size()));
7220*5c90c05cSAndroid Build Coastguard Worker   return new_test_suite;
7221*5c90c05cSAndroid Build Coastguard Worker }
7222*5c90c05cSAndroid Build Coastguard Worker 
7223*5c90c05cSAndroid Build Coastguard Worker // Helpers for setting up / tearing down the given environment.  They
7224*5c90c05cSAndroid Build Coastguard Worker // are for use in the ForEach() function.
SetUpEnvironment(Environment * env)7225*5c90c05cSAndroid Build Coastguard Worker static void SetUpEnvironment(Environment* env) { env->SetUp(); }
TearDownEnvironment(Environment * env)7226*5c90c05cSAndroid Build Coastguard Worker static void TearDownEnvironment(Environment* env) { env->TearDown(); }
7227*5c90c05cSAndroid Build Coastguard Worker 
7228*5c90c05cSAndroid Build Coastguard Worker // Runs all tests in this UnitTest object, prints the result, and
7229*5c90c05cSAndroid Build Coastguard Worker // returns true if all tests are successful.  If any exception is
7230*5c90c05cSAndroid Build Coastguard Worker // thrown during a test, the test is considered to be failed, but the
7231*5c90c05cSAndroid Build Coastguard Worker // rest of the tests will still be run.
7232*5c90c05cSAndroid Build Coastguard Worker //
7233*5c90c05cSAndroid Build Coastguard Worker // When parameterized tests are enabled, it expands and registers
7234*5c90c05cSAndroid Build Coastguard Worker // parameterized tests first in RegisterParameterizedTests().
7235*5c90c05cSAndroid Build Coastguard Worker // All other functions called from RunAllTests() may safely assume that
7236*5c90c05cSAndroid Build Coastguard Worker // parameterized tests are ready to be counted and run.
RunAllTests()7237*5c90c05cSAndroid Build Coastguard Worker bool UnitTestImpl::RunAllTests() {
7238*5c90c05cSAndroid Build Coastguard Worker   // True if and only if Google Test is initialized before RUN_ALL_TESTS() is
7239*5c90c05cSAndroid Build Coastguard Worker   // called.
7240*5c90c05cSAndroid Build Coastguard Worker   const bool gtest_is_initialized_before_run_all_tests = GTestIsInitialized();
7241*5c90c05cSAndroid Build Coastguard Worker 
7242*5c90c05cSAndroid Build Coastguard Worker   // Do not run any test if the --help flag was specified.
7243*5c90c05cSAndroid Build Coastguard Worker   if (g_help_flag)
7244*5c90c05cSAndroid Build Coastguard Worker     return true;
7245*5c90c05cSAndroid Build Coastguard Worker 
7246*5c90c05cSAndroid Build Coastguard Worker   // Repeats the call to the post-flag parsing initialization in case the
7247*5c90c05cSAndroid Build Coastguard Worker   // user didn't call InitGoogleTest.
7248*5c90c05cSAndroid Build Coastguard Worker   PostFlagParsingInit();
7249*5c90c05cSAndroid Build Coastguard Worker 
7250*5c90c05cSAndroid Build Coastguard Worker   // Even if sharding is not on, test runners may want to use the
7251*5c90c05cSAndroid Build Coastguard Worker   // GTEST_SHARD_STATUS_FILE to query whether the test supports the sharding
7252*5c90c05cSAndroid Build Coastguard Worker   // protocol.
7253*5c90c05cSAndroid Build Coastguard Worker   internal::WriteToShardStatusFileIfNeeded();
7254*5c90c05cSAndroid Build Coastguard Worker 
7255*5c90c05cSAndroid Build Coastguard Worker   // True if and only if we are in a subprocess for running a thread-safe-style
7256*5c90c05cSAndroid Build Coastguard Worker   // death test.
7257*5c90c05cSAndroid Build Coastguard Worker   bool in_subprocess_for_death_test = false;
7258*5c90c05cSAndroid Build Coastguard Worker 
7259*5c90c05cSAndroid Build Coastguard Worker #if GTEST_HAS_DEATH_TEST
7260*5c90c05cSAndroid Build Coastguard Worker   in_subprocess_for_death_test =
7261*5c90c05cSAndroid Build Coastguard Worker       (internal_run_death_test_flag_.get() != nullptr);
7262*5c90c05cSAndroid Build Coastguard Worker # if defined(GTEST_EXTRA_DEATH_TEST_CHILD_SETUP_)
7263*5c90c05cSAndroid Build Coastguard Worker   if (in_subprocess_for_death_test) {
7264*5c90c05cSAndroid Build Coastguard Worker     GTEST_EXTRA_DEATH_TEST_CHILD_SETUP_();
7265*5c90c05cSAndroid Build Coastguard Worker   }
7266*5c90c05cSAndroid Build Coastguard Worker # endif  // defined(GTEST_EXTRA_DEATH_TEST_CHILD_SETUP_)
7267*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_HAS_DEATH_TEST
7268*5c90c05cSAndroid Build Coastguard Worker 
7269*5c90c05cSAndroid Build Coastguard Worker   const bool should_shard = ShouldShard(kTestTotalShards, kTestShardIndex,
7270*5c90c05cSAndroid Build Coastguard Worker                                         in_subprocess_for_death_test);
7271*5c90c05cSAndroid Build Coastguard Worker 
7272*5c90c05cSAndroid Build Coastguard Worker   // Compares the full test names with the filter to decide which
7273*5c90c05cSAndroid Build Coastguard Worker   // tests to run.
7274*5c90c05cSAndroid Build Coastguard Worker   const bool has_tests_to_run = FilterTests(should_shard
7275*5c90c05cSAndroid Build Coastguard Worker                                               ? HONOR_SHARDING_PROTOCOL
7276*5c90c05cSAndroid Build Coastguard Worker                                               : IGNORE_SHARDING_PROTOCOL) > 0;
7277*5c90c05cSAndroid Build Coastguard Worker 
7278*5c90c05cSAndroid Build Coastguard Worker   // Lists the tests and exits if the --gtest_list_tests flag was specified.
7279*5c90c05cSAndroid Build Coastguard Worker   if (GTEST_FLAG(list_tests)) {
7280*5c90c05cSAndroid Build Coastguard Worker     // This must be called *after* FilterTests() has been called.
7281*5c90c05cSAndroid Build Coastguard Worker     ListTestsMatchingFilter();
7282*5c90c05cSAndroid Build Coastguard Worker     return true;
7283*5c90c05cSAndroid Build Coastguard Worker   }
7284*5c90c05cSAndroid Build Coastguard Worker 
7285*5c90c05cSAndroid Build Coastguard Worker   random_seed_ = GTEST_FLAG(shuffle) ?
7286*5c90c05cSAndroid Build Coastguard Worker       GetRandomSeedFromFlag(GTEST_FLAG(random_seed)) : 0;
7287*5c90c05cSAndroid Build Coastguard Worker 
7288*5c90c05cSAndroid Build Coastguard Worker   // True if and only if at least one test has failed.
7289*5c90c05cSAndroid Build Coastguard Worker   bool failed = false;
7290*5c90c05cSAndroid Build Coastguard Worker 
7291*5c90c05cSAndroid Build Coastguard Worker   TestEventListener* repeater = listeners()->repeater();
7292*5c90c05cSAndroid Build Coastguard Worker 
7293*5c90c05cSAndroid Build Coastguard Worker   start_timestamp_ = GetTimeInMillis();
7294*5c90c05cSAndroid Build Coastguard Worker   repeater->OnTestProgramStart(*parent_);
7295*5c90c05cSAndroid Build Coastguard Worker 
7296*5c90c05cSAndroid Build Coastguard Worker   // How many times to repeat the tests?  We don't want to repeat them
7297*5c90c05cSAndroid Build Coastguard Worker   // when we are inside the subprocess of a death test.
7298*5c90c05cSAndroid Build Coastguard Worker   const int repeat = in_subprocess_for_death_test ? 1 : GTEST_FLAG(repeat);
7299*5c90c05cSAndroid Build Coastguard Worker   // Repeats forever if the repeat count is negative.
7300*5c90c05cSAndroid Build Coastguard Worker   const bool gtest_repeat_forever = repeat < 0;
7301*5c90c05cSAndroid Build Coastguard Worker   for (int i = 0; gtest_repeat_forever || i != repeat; i++) {
7302*5c90c05cSAndroid Build Coastguard Worker     // We want to preserve failures generated by ad-hoc test
7303*5c90c05cSAndroid Build Coastguard Worker     // assertions executed before RUN_ALL_TESTS().
7304*5c90c05cSAndroid Build Coastguard Worker     ClearNonAdHocTestResult();
7305*5c90c05cSAndroid Build Coastguard Worker 
7306*5c90c05cSAndroid Build Coastguard Worker     Timer timer;
7307*5c90c05cSAndroid Build Coastguard Worker 
7308*5c90c05cSAndroid Build Coastguard Worker     // Shuffles test suites and tests if requested.
7309*5c90c05cSAndroid Build Coastguard Worker     if (has_tests_to_run && GTEST_FLAG(shuffle)) {
7310*5c90c05cSAndroid Build Coastguard Worker       random()->Reseed(static_cast<uint32_t>(random_seed_));
7311*5c90c05cSAndroid Build Coastguard Worker       // This should be done before calling OnTestIterationStart(),
7312*5c90c05cSAndroid Build Coastguard Worker       // such that a test event listener can see the actual test order
7313*5c90c05cSAndroid Build Coastguard Worker       // in the event.
7314*5c90c05cSAndroid Build Coastguard Worker       ShuffleTests();
7315*5c90c05cSAndroid Build Coastguard Worker     }
7316*5c90c05cSAndroid Build Coastguard Worker 
7317*5c90c05cSAndroid Build Coastguard Worker     // Tells the unit test event listeners that the tests are about to start.
7318*5c90c05cSAndroid Build Coastguard Worker     repeater->OnTestIterationStart(*parent_, i);
7319*5c90c05cSAndroid Build Coastguard Worker 
7320*5c90c05cSAndroid Build Coastguard Worker     // Runs each test suite if there is at least one test to run.
7321*5c90c05cSAndroid Build Coastguard Worker     if (has_tests_to_run) {
7322*5c90c05cSAndroid Build Coastguard Worker       // Sets up all environments beforehand.
7323*5c90c05cSAndroid Build Coastguard Worker       repeater->OnEnvironmentsSetUpStart(*parent_);
7324*5c90c05cSAndroid Build Coastguard Worker       ForEach(environments_, SetUpEnvironment);
7325*5c90c05cSAndroid Build Coastguard Worker       repeater->OnEnvironmentsSetUpEnd(*parent_);
7326*5c90c05cSAndroid Build Coastguard Worker 
7327*5c90c05cSAndroid Build Coastguard Worker       // Runs the tests only if there was no fatal failure or skip triggered
7328*5c90c05cSAndroid Build Coastguard Worker       // during global set-up.
7329*5c90c05cSAndroid Build Coastguard Worker       if (Test::IsSkipped()) {
7330*5c90c05cSAndroid Build Coastguard Worker         // Emit diagnostics when global set-up calls skip, as it will not be
7331*5c90c05cSAndroid Build Coastguard Worker         // emitted by default.
7332*5c90c05cSAndroid Build Coastguard Worker         TestResult& test_result =
7333*5c90c05cSAndroid Build Coastguard Worker             *internal::GetUnitTestImpl()->current_test_result();
7334*5c90c05cSAndroid Build Coastguard Worker         for (int j = 0; j < test_result.total_part_count(); ++j) {
7335*5c90c05cSAndroid Build Coastguard Worker           const TestPartResult& test_part_result =
7336*5c90c05cSAndroid Build Coastguard Worker               test_result.GetTestPartResult(j);
7337*5c90c05cSAndroid Build Coastguard Worker           if (test_part_result.type() == TestPartResult::kSkip) {
7338*5c90c05cSAndroid Build Coastguard Worker             const std::string& result = test_part_result.message();
7339*5c90c05cSAndroid Build Coastguard Worker             printf("%s\n", result.c_str());
7340*5c90c05cSAndroid Build Coastguard Worker           }
7341*5c90c05cSAndroid Build Coastguard Worker         }
7342*5c90c05cSAndroid Build Coastguard Worker         fflush(stdout);
7343*5c90c05cSAndroid Build Coastguard Worker       } else if (!Test::HasFatalFailure()) {
7344*5c90c05cSAndroid Build Coastguard Worker         for (int test_index = 0; test_index < total_test_suite_count();
7345*5c90c05cSAndroid Build Coastguard Worker              test_index++) {
7346*5c90c05cSAndroid Build Coastguard Worker           GetMutableSuiteCase(test_index)->Run();
7347*5c90c05cSAndroid Build Coastguard Worker           if (GTEST_FLAG(fail_fast) &&
7348*5c90c05cSAndroid Build Coastguard Worker               GetMutableSuiteCase(test_index)->Failed()) {
7349*5c90c05cSAndroid Build Coastguard Worker             for (int j = test_index + 1; j < total_test_suite_count(); j++) {
7350*5c90c05cSAndroid Build Coastguard Worker               GetMutableSuiteCase(j)->Skip();
7351*5c90c05cSAndroid Build Coastguard Worker             }
7352*5c90c05cSAndroid Build Coastguard Worker             break;
7353*5c90c05cSAndroid Build Coastguard Worker           }
7354*5c90c05cSAndroid Build Coastguard Worker         }
7355*5c90c05cSAndroid Build Coastguard Worker       } else if (Test::HasFatalFailure()) {
7356*5c90c05cSAndroid Build Coastguard Worker         // If there was a fatal failure during the global setup then we know we
7357*5c90c05cSAndroid Build Coastguard Worker         // aren't going to run any tests. Explicitly mark all of the tests as
7358*5c90c05cSAndroid Build Coastguard Worker         // skipped to make this obvious in the output.
7359*5c90c05cSAndroid Build Coastguard Worker         for (int test_index = 0; test_index < total_test_suite_count();
7360*5c90c05cSAndroid Build Coastguard Worker              test_index++) {
7361*5c90c05cSAndroid Build Coastguard Worker           GetMutableSuiteCase(test_index)->Skip();
7362*5c90c05cSAndroid Build Coastguard Worker         }
7363*5c90c05cSAndroid Build Coastguard Worker       }
7364*5c90c05cSAndroid Build Coastguard Worker 
7365*5c90c05cSAndroid Build Coastguard Worker       // Tears down all environments in reverse order afterwards.
7366*5c90c05cSAndroid Build Coastguard Worker       repeater->OnEnvironmentsTearDownStart(*parent_);
7367*5c90c05cSAndroid Build Coastguard Worker       std::for_each(environments_.rbegin(), environments_.rend(),
7368*5c90c05cSAndroid Build Coastguard Worker                     TearDownEnvironment);
7369*5c90c05cSAndroid Build Coastguard Worker       repeater->OnEnvironmentsTearDownEnd(*parent_);
7370*5c90c05cSAndroid Build Coastguard Worker     }
7371*5c90c05cSAndroid Build Coastguard Worker 
7372*5c90c05cSAndroid Build Coastguard Worker     elapsed_time_ = timer.Elapsed();
7373*5c90c05cSAndroid Build Coastguard Worker 
7374*5c90c05cSAndroid Build Coastguard Worker     // Tells the unit test event listener that the tests have just finished.
7375*5c90c05cSAndroid Build Coastguard Worker     repeater->OnTestIterationEnd(*parent_, i);
7376*5c90c05cSAndroid Build Coastguard Worker 
7377*5c90c05cSAndroid Build Coastguard Worker     // Gets the result and clears it.
7378*5c90c05cSAndroid Build Coastguard Worker     if (!Passed()) {
7379*5c90c05cSAndroid Build Coastguard Worker       failed = true;
7380*5c90c05cSAndroid Build Coastguard Worker     }
7381*5c90c05cSAndroid Build Coastguard Worker 
7382*5c90c05cSAndroid Build Coastguard Worker     // Restores the original test order after the iteration.  This
7383*5c90c05cSAndroid Build Coastguard Worker     // allows the user to quickly repro a failure that happens in the
7384*5c90c05cSAndroid Build Coastguard Worker     // N-th iteration without repeating the first (N - 1) iterations.
7385*5c90c05cSAndroid Build Coastguard Worker     // This is not enclosed in "if (GTEST_FLAG(shuffle)) { ... }", in
7386*5c90c05cSAndroid Build Coastguard Worker     // case the user somehow changes the value of the flag somewhere
7387*5c90c05cSAndroid Build Coastguard Worker     // (it's always safe to unshuffle the tests).
7388*5c90c05cSAndroid Build Coastguard Worker     UnshuffleTests();
7389*5c90c05cSAndroid Build Coastguard Worker 
7390*5c90c05cSAndroid Build Coastguard Worker     if (GTEST_FLAG(shuffle)) {
7391*5c90c05cSAndroid Build Coastguard Worker       // Picks a new random seed for each iteration.
7392*5c90c05cSAndroid Build Coastguard Worker       random_seed_ = GetNextRandomSeed(random_seed_);
7393*5c90c05cSAndroid Build Coastguard Worker     }
7394*5c90c05cSAndroid Build Coastguard Worker   }
7395*5c90c05cSAndroid Build Coastguard Worker 
7396*5c90c05cSAndroid Build Coastguard Worker   repeater->OnTestProgramEnd(*parent_);
7397*5c90c05cSAndroid Build Coastguard Worker 
7398*5c90c05cSAndroid Build Coastguard Worker   if (!gtest_is_initialized_before_run_all_tests) {
7399*5c90c05cSAndroid Build Coastguard Worker     ColoredPrintf(
7400*5c90c05cSAndroid Build Coastguard Worker         GTestColor::kRed,
7401*5c90c05cSAndroid Build Coastguard Worker         "\nIMPORTANT NOTICE - DO NOT IGNORE:\n"
7402*5c90c05cSAndroid Build Coastguard Worker         "This test program did NOT call " GTEST_INIT_GOOGLE_TEST_NAME_
7403*5c90c05cSAndroid Build Coastguard Worker         "() before calling RUN_ALL_TESTS(). This is INVALID. Soon " GTEST_NAME_
7404*5c90c05cSAndroid Build Coastguard Worker         " will start to enforce the valid usage. "
7405*5c90c05cSAndroid Build Coastguard Worker         "Please fix it ASAP, or IT WILL START TO FAIL.\n");  // NOLINT
7406*5c90c05cSAndroid Build Coastguard Worker #if GTEST_FOR_GOOGLE_
7407*5c90c05cSAndroid Build Coastguard Worker     ColoredPrintf(GTestColor::kRed,
7408*5c90c05cSAndroid Build Coastguard Worker                   "For more details, see http://wiki/Main/ValidGUnitMain.\n");
7409*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_FOR_GOOGLE_
7410*5c90c05cSAndroid Build Coastguard Worker   }
7411*5c90c05cSAndroid Build Coastguard Worker 
7412*5c90c05cSAndroid Build Coastguard Worker   return !failed;
7413*5c90c05cSAndroid Build Coastguard Worker }
7414*5c90c05cSAndroid Build Coastguard Worker 
7415*5c90c05cSAndroid Build Coastguard Worker // Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file
7416*5c90c05cSAndroid Build Coastguard Worker // if the variable is present. If a file already exists at this location, this
7417*5c90c05cSAndroid Build Coastguard Worker // function will write over it. If the variable is present, but the file cannot
7418*5c90c05cSAndroid Build Coastguard Worker // be created, prints an error and exits.
WriteToShardStatusFileIfNeeded()7419*5c90c05cSAndroid Build Coastguard Worker void WriteToShardStatusFileIfNeeded() {
7420*5c90c05cSAndroid Build Coastguard Worker   const char* const test_shard_file = posix::GetEnv(kTestShardStatusFile);
7421*5c90c05cSAndroid Build Coastguard Worker   if (test_shard_file != nullptr) {
7422*5c90c05cSAndroid Build Coastguard Worker     FILE* const file = posix::FOpen(test_shard_file, "w");
7423*5c90c05cSAndroid Build Coastguard Worker     if (file == nullptr) {
7424*5c90c05cSAndroid Build Coastguard Worker       ColoredPrintf(GTestColor::kRed,
7425*5c90c05cSAndroid Build Coastguard Worker                     "Could not write to the test shard status file \"%s\" "
7426*5c90c05cSAndroid Build Coastguard Worker                     "specified by the %s environment variable.\n",
7427*5c90c05cSAndroid Build Coastguard Worker                     test_shard_file, kTestShardStatusFile);
7428*5c90c05cSAndroid Build Coastguard Worker       fflush(stdout);
7429*5c90c05cSAndroid Build Coastguard Worker       exit(EXIT_FAILURE);
7430*5c90c05cSAndroid Build Coastguard Worker     }
7431*5c90c05cSAndroid Build Coastguard Worker     fclose(file);
7432*5c90c05cSAndroid Build Coastguard Worker   }
7433*5c90c05cSAndroid Build Coastguard Worker }
7434*5c90c05cSAndroid Build Coastguard Worker 
7435*5c90c05cSAndroid Build Coastguard Worker // Checks whether sharding is enabled by examining the relevant
7436*5c90c05cSAndroid Build Coastguard Worker // environment variable values. If the variables are present,
7437*5c90c05cSAndroid Build Coastguard Worker // but inconsistent (i.e., shard_index >= total_shards), prints
7438*5c90c05cSAndroid Build Coastguard Worker // an error and exits. If in_subprocess_for_death_test, sharding is
7439*5c90c05cSAndroid Build Coastguard Worker // disabled because it must only be applied to the original test
7440*5c90c05cSAndroid Build Coastguard Worker // process. Otherwise, we could filter out death tests we intended to execute.
ShouldShard(const char * total_shards_env,const char * shard_index_env,bool in_subprocess_for_death_test)7441*5c90c05cSAndroid Build Coastguard Worker bool ShouldShard(const char* total_shards_env,
7442*5c90c05cSAndroid Build Coastguard Worker                  const char* shard_index_env,
7443*5c90c05cSAndroid Build Coastguard Worker                  bool in_subprocess_for_death_test) {
7444*5c90c05cSAndroid Build Coastguard Worker   if (in_subprocess_for_death_test) {
7445*5c90c05cSAndroid Build Coastguard Worker     return false;
7446*5c90c05cSAndroid Build Coastguard Worker   }
7447*5c90c05cSAndroid Build Coastguard Worker 
7448*5c90c05cSAndroid Build Coastguard Worker   const int32_t total_shards = Int32FromEnvOrDie(total_shards_env, -1);
7449*5c90c05cSAndroid Build Coastguard Worker   const int32_t shard_index = Int32FromEnvOrDie(shard_index_env, -1);
7450*5c90c05cSAndroid Build Coastguard Worker 
7451*5c90c05cSAndroid Build Coastguard Worker   if (total_shards == -1 && shard_index == -1) {
7452*5c90c05cSAndroid Build Coastguard Worker     return false;
7453*5c90c05cSAndroid Build Coastguard Worker   } else if (total_shards == -1 && shard_index != -1) {
7454*5c90c05cSAndroid Build Coastguard Worker     const Message msg = Message()
7455*5c90c05cSAndroid Build Coastguard Worker       << "Invalid environment variables: you have "
7456*5c90c05cSAndroid Build Coastguard Worker       << kTestShardIndex << " = " << shard_index
7457*5c90c05cSAndroid Build Coastguard Worker       << ", but have left " << kTestTotalShards << " unset.\n";
7458*5c90c05cSAndroid Build Coastguard Worker     ColoredPrintf(GTestColor::kRed, "%s", msg.GetString().c_str());
7459*5c90c05cSAndroid Build Coastguard Worker     fflush(stdout);
7460*5c90c05cSAndroid Build Coastguard Worker     exit(EXIT_FAILURE);
7461*5c90c05cSAndroid Build Coastguard Worker   } else if (total_shards != -1 && shard_index == -1) {
7462*5c90c05cSAndroid Build Coastguard Worker     const Message msg = Message()
7463*5c90c05cSAndroid Build Coastguard Worker       << "Invalid environment variables: you have "
7464*5c90c05cSAndroid Build Coastguard Worker       << kTestTotalShards << " = " << total_shards
7465*5c90c05cSAndroid Build Coastguard Worker       << ", but have left " << kTestShardIndex << " unset.\n";
7466*5c90c05cSAndroid Build Coastguard Worker     ColoredPrintf(GTestColor::kRed, "%s", msg.GetString().c_str());
7467*5c90c05cSAndroid Build Coastguard Worker     fflush(stdout);
7468*5c90c05cSAndroid Build Coastguard Worker     exit(EXIT_FAILURE);
7469*5c90c05cSAndroid Build Coastguard Worker   } else if (shard_index < 0 || shard_index >= total_shards) {
7470*5c90c05cSAndroid Build Coastguard Worker     const Message msg = Message()
7471*5c90c05cSAndroid Build Coastguard Worker       << "Invalid environment variables: we require 0 <= "
7472*5c90c05cSAndroid Build Coastguard Worker       << kTestShardIndex << " < " << kTestTotalShards
7473*5c90c05cSAndroid Build Coastguard Worker       << ", but you have " << kTestShardIndex << "=" << shard_index
7474*5c90c05cSAndroid Build Coastguard Worker       << ", " << kTestTotalShards << "=" << total_shards << ".\n";
7475*5c90c05cSAndroid Build Coastguard Worker     ColoredPrintf(GTestColor::kRed, "%s", msg.GetString().c_str());
7476*5c90c05cSAndroid Build Coastguard Worker     fflush(stdout);
7477*5c90c05cSAndroid Build Coastguard Worker     exit(EXIT_FAILURE);
7478*5c90c05cSAndroid Build Coastguard Worker   }
7479*5c90c05cSAndroid Build Coastguard Worker 
7480*5c90c05cSAndroid Build Coastguard Worker   return total_shards > 1;
7481*5c90c05cSAndroid Build Coastguard Worker }
7482*5c90c05cSAndroid Build Coastguard Worker 
7483*5c90c05cSAndroid Build Coastguard Worker // Parses the environment variable var as an Int32. If it is unset,
7484*5c90c05cSAndroid Build Coastguard Worker // returns default_val. If it is not an Int32, prints an error
7485*5c90c05cSAndroid Build Coastguard Worker // and aborts.
Int32FromEnvOrDie(const char * var,int32_t default_val)7486*5c90c05cSAndroid Build Coastguard Worker int32_t Int32FromEnvOrDie(const char* var, int32_t default_val) {
7487*5c90c05cSAndroid Build Coastguard Worker   const char* str_val = posix::GetEnv(var);
7488*5c90c05cSAndroid Build Coastguard Worker   if (str_val == nullptr) {
7489*5c90c05cSAndroid Build Coastguard Worker     return default_val;
7490*5c90c05cSAndroid Build Coastguard Worker   }
7491*5c90c05cSAndroid Build Coastguard Worker 
7492*5c90c05cSAndroid Build Coastguard Worker   int32_t result;
7493*5c90c05cSAndroid Build Coastguard Worker   if (!ParseInt32(Message() << "The value of environment variable " << var,
7494*5c90c05cSAndroid Build Coastguard Worker                   str_val, &result)) {
7495*5c90c05cSAndroid Build Coastguard Worker     exit(EXIT_FAILURE);
7496*5c90c05cSAndroid Build Coastguard Worker   }
7497*5c90c05cSAndroid Build Coastguard Worker   return result;
7498*5c90c05cSAndroid Build Coastguard Worker }
7499*5c90c05cSAndroid Build Coastguard Worker 
7500*5c90c05cSAndroid Build Coastguard Worker // Given the total number of shards, the shard index, and the test id,
7501*5c90c05cSAndroid Build Coastguard Worker // returns true if and only if the test should be run on this shard. The test id
7502*5c90c05cSAndroid Build Coastguard Worker // is some arbitrary but unique non-negative integer assigned to each test
7503*5c90c05cSAndroid Build Coastguard Worker // method. Assumes that 0 <= shard_index < total_shards.
ShouldRunTestOnShard(int total_shards,int shard_index,int test_id)7504*5c90c05cSAndroid Build Coastguard Worker bool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id) {
7505*5c90c05cSAndroid Build Coastguard Worker   return (test_id % total_shards) == shard_index;
7506*5c90c05cSAndroid Build Coastguard Worker }
7507*5c90c05cSAndroid Build Coastguard Worker 
7508*5c90c05cSAndroid Build Coastguard Worker // Compares the name of each test with the user-specified filter to
7509*5c90c05cSAndroid Build Coastguard Worker // decide whether the test should be run, then records the result in
7510*5c90c05cSAndroid Build Coastguard Worker // each TestSuite and TestInfo object.
7511*5c90c05cSAndroid Build Coastguard Worker // If shard_tests == true, further filters tests based on sharding
7512*5c90c05cSAndroid Build Coastguard Worker // variables in the environment - see
7513*5c90c05cSAndroid Build Coastguard Worker // https://github.com/google/googletest/blob/master/googletest/docs/advanced.md
7514*5c90c05cSAndroid Build Coastguard Worker // . Returns the number of tests that should run.
FilterTests(ReactionToSharding shard_tests)7515*5c90c05cSAndroid Build Coastguard Worker int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {
7516*5c90c05cSAndroid Build Coastguard Worker   const int32_t total_shards = shard_tests == HONOR_SHARDING_PROTOCOL ?
7517*5c90c05cSAndroid Build Coastguard Worker       Int32FromEnvOrDie(kTestTotalShards, -1) : -1;
7518*5c90c05cSAndroid Build Coastguard Worker   const int32_t shard_index = shard_tests == HONOR_SHARDING_PROTOCOL ?
7519*5c90c05cSAndroid Build Coastguard Worker       Int32FromEnvOrDie(kTestShardIndex, -1) : -1;
7520*5c90c05cSAndroid Build Coastguard Worker 
7521*5c90c05cSAndroid Build Coastguard Worker   // num_runnable_tests are the number of tests that will
7522*5c90c05cSAndroid Build Coastguard Worker   // run across all shards (i.e., match filter and are not disabled).
7523*5c90c05cSAndroid Build Coastguard Worker   // num_selected_tests are the number of tests to be run on
7524*5c90c05cSAndroid Build Coastguard Worker   // this shard.
7525*5c90c05cSAndroid Build Coastguard Worker   int num_runnable_tests = 0;
7526*5c90c05cSAndroid Build Coastguard Worker   int num_selected_tests = 0;
7527*5c90c05cSAndroid Build Coastguard Worker   for (auto* test_suite : test_suites_) {
7528*5c90c05cSAndroid Build Coastguard Worker     const std::string& test_suite_name = test_suite->name();
7529*5c90c05cSAndroid Build Coastguard Worker     test_suite->set_should_run(false);
7530*5c90c05cSAndroid Build Coastguard Worker 
7531*5c90c05cSAndroid Build Coastguard Worker     for (size_t j = 0; j < test_suite->test_info_list().size(); j++) {
7532*5c90c05cSAndroid Build Coastguard Worker       TestInfo* const test_info = test_suite->test_info_list()[j];
7533*5c90c05cSAndroid Build Coastguard Worker       const std::string test_name(test_info->name());
7534*5c90c05cSAndroid Build Coastguard Worker       // A test is disabled if test suite name or test name matches
7535*5c90c05cSAndroid Build Coastguard Worker       // kDisableTestFilter.
7536*5c90c05cSAndroid Build Coastguard Worker       const bool is_disabled = internal::UnitTestOptions::MatchesFilter(
7537*5c90c05cSAndroid Build Coastguard Worker                                    test_suite_name, kDisableTestFilter) ||
7538*5c90c05cSAndroid Build Coastguard Worker                                internal::UnitTestOptions::MatchesFilter(
7539*5c90c05cSAndroid Build Coastguard Worker                                    test_name, kDisableTestFilter);
7540*5c90c05cSAndroid Build Coastguard Worker       test_info->is_disabled_ = is_disabled;
7541*5c90c05cSAndroid Build Coastguard Worker 
7542*5c90c05cSAndroid Build Coastguard Worker       const bool matches_filter = internal::UnitTestOptions::FilterMatchesTest(
7543*5c90c05cSAndroid Build Coastguard Worker           test_suite_name, test_name);
7544*5c90c05cSAndroid Build Coastguard Worker       test_info->matches_filter_ = matches_filter;
7545*5c90c05cSAndroid Build Coastguard Worker 
7546*5c90c05cSAndroid Build Coastguard Worker       const bool is_runnable =
7547*5c90c05cSAndroid Build Coastguard Worker           (GTEST_FLAG(also_run_disabled_tests) || !is_disabled) &&
7548*5c90c05cSAndroid Build Coastguard Worker           matches_filter;
7549*5c90c05cSAndroid Build Coastguard Worker 
7550*5c90c05cSAndroid Build Coastguard Worker       const bool is_in_another_shard =
7551*5c90c05cSAndroid Build Coastguard Worker           shard_tests != IGNORE_SHARDING_PROTOCOL &&
7552*5c90c05cSAndroid Build Coastguard Worker           !ShouldRunTestOnShard(total_shards, shard_index, num_runnable_tests);
7553*5c90c05cSAndroid Build Coastguard Worker       test_info->is_in_another_shard_ = is_in_another_shard;
7554*5c90c05cSAndroid Build Coastguard Worker       const bool is_selected = is_runnable && !is_in_another_shard;
7555*5c90c05cSAndroid Build Coastguard Worker 
7556*5c90c05cSAndroid Build Coastguard Worker       num_runnable_tests += is_runnable;
7557*5c90c05cSAndroid Build Coastguard Worker       num_selected_tests += is_selected;
7558*5c90c05cSAndroid Build Coastguard Worker 
7559*5c90c05cSAndroid Build Coastguard Worker       test_info->should_run_ = is_selected;
7560*5c90c05cSAndroid Build Coastguard Worker       test_suite->set_should_run(test_suite->should_run() || is_selected);
7561*5c90c05cSAndroid Build Coastguard Worker     }
7562*5c90c05cSAndroid Build Coastguard Worker   }
7563*5c90c05cSAndroid Build Coastguard Worker   return num_selected_tests;
7564*5c90c05cSAndroid Build Coastguard Worker }
7565*5c90c05cSAndroid Build Coastguard Worker 
7566*5c90c05cSAndroid Build Coastguard Worker // Prints the given C-string on a single line by replacing all '\n'
7567*5c90c05cSAndroid Build Coastguard Worker // characters with string "\\n".  If the output takes more than
7568*5c90c05cSAndroid Build Coastguard Worker // max_length characters, only prints the first max_length characters
7569*5c90c05cSAndroid Build Coastguard Worker // and "...".
PrintOnOneLine(const char * str,int max_length)7570*5c90c05cSAndroid Build Coastguard Worker static void PrintOnOneLine(const char* str, int max_length) {
7571*5c90c05cSAndroid Build Coastguard Worker   if (str != nullptr) {
7572*5c90c05cSAndroid Build Coastguard Worker     for (int i = 0; *str != '\0'; ++str) {
7573*5c90c05cSAndroid Build Coastguard Worker       if (i >= max_length) {
7574*5c90c05cSAndroid Build Coastguard Worker         printf("...");
7575*5c90c05cSAndroid Build Coastguard Worker         break;
7576*5c90c05cSAndroid Build Coastguard Worker       }
7577*5c90c05cSAndroid Build Coastguard Worker       if (*str == '\n') {
7578*5c90c05cSAndroid Build Coastguard Worker         printf("\\n");
7579*5c90c05cSAndroid Build Coastguard Worker         i += 2;
7580*5c90c05cSAndroid Build Coastguard Worker       } else {
7581*5c90c05cSAndroid Build Coastguard Worker         printf("%c", *str);
7582*5c90c05cSAndroid Build Coastguard Worker         ++i;
7583*5c90c05cSAndroid Build Coastguard Worker       }
7584*5c90c05cSAndroid Build Coastguard Worker     }
7585*5c90c05cSAndroid Build Coastguard Worker   }
7586*5c90c05cSAndroid Build Coastguard Worker }
7587*5c90c05cSAndroid Build Coastguard Worker 
7588*5c90c05cSAndroid Build Coastguard Worker // Prints the names of the tests matching the user-specified filter flag.
ListTestsMatchingFilter()7589*5c90c05cSAndroid Build Coastguard Worker void UnitTestImpl::ListTestsMatchingFilter() {
7590*5c90c05cSAndroid Build Coastguard Worker   // Print at most this many characters for each type/value parameter.
7591*5c90c05cSAndroid Build Coastguard Worker   const int kMaxParamLength = 250;
7592*5c90c05cSAndroid Build Coastguard Worker 
7593*5c90c05cSAndroid Build Coastguard Worker   for (auto* test_suite : test_suites_) {
7594*5c90c05cSAndroid Build Coastguard Worker     bool printed_test_suite_name = false;
7595*5c90c05cSAndroid Build Coastguard Worker 
7596*5c90c05cSAndroid Build Coastguard Worker     for (size_t j = 0; j < test_suite->test_info_list().size(); j++) {
7597*5c90c05cSAndroid Build Coastguard Worker       const TestInfo* const test_info = test_suite->test_info_list()[j];
7598*5c90c05cSAndroid Build Coastguard Worker       if (test_info->matches_filter_) {
7599*5c90c05cSAndroid Build Coastguard Worker         if (!printed_test_suite_name) {
7600*5c90c05cSAndroid Build Coastguard Worker           printed_test_suite_name = true;
7601*5c90c05cSAndroid Build Coastguard Worker           printf("%s.", test_suite->name());
7602*5c90c05cSAndroid Build Coastguard Worker           if (test_suite->type_param() != nullptr) {
7603*5c90c05cSAndroid Build Coastguard Worker             printf("  # %s = ", kTypeParamLabel);
7604*5c90c05cSAndroid Build Coastguard Worker             // We print the type parameter on a single line to make
7605*5c90c05cSAndroid Build Coastguard Worker             // the output easy to parse by a program.
7606*5c90c05cSAndroid Build Coastguard Worker             PrintOnOneLine(test_suite->type_param(), kMaxParamLength);
7607*5c90c05cSAndroid Build Coastguard Worker           }
7608*5c90c05cSAndroid Build Coastguard Worker           printf("\n");
7609*5c90c05cSAndroid Build Coastguard Worker         }
7610*5c90c05cSAndroid Build Coastguard Worker         printf("  %s", test_info->name());
7611*5c90c05cSAndroid Build Coastguard Worker         if (test_info->value_param() != nullptr) {
7612*5c90c05cSAndroid Build Coastguard Worker           printf("  # %s = ", kValueParamLabel);
7613*5c90c05cSAndroid Build Coastguard Worker           // We print the value parameter on a single line to make the
7614*5c90c05cSAndroid Build Coastguard Worker           // output easy to parse by a program.
7615*5c90c05cSAndroid Build Coastguard Worker           PrintOnOneLine(test_info->value_param(), kMaxParamLength);
7616*5c90c05cSAndroid Build Coastguard Worker         }
7617*5c90c05cSAndroid Build Coastguard Worker         printf("\n");
7618*5c90c05cSAndroid Build Coastguard Worker       }
7619*5c90c05cSAndroid Build Coastguard Worker     }
7620*5c90c05cSAndroid Build Coastguard Worker   }
7621*5c90c05cSAndroid Build Coastguard Worker   fflush(stdout);
7622*5c90c05cSAndroid Build Coastguard Worker   const std::string& output_format = UnitTestOptions::GetOutputFormat();
7623*5c90c05cSAndroid Build Coastguard Worker   if (output_format == "xml" || output_format == "json") {
7624*5c90c05cSAndroid Build Coastguard Worker     FILE* fileout = OpenFileForWriting(
7625*5c90c05cSAndroid Build Coastguard Worker         UnitTestOptions::GetAbsolutePathToOutputFile().c_str());
7626*5c90c05cSAndroid Build Coastguard Worker     std::stringstream stream;
7627*5c90c05cSAndroid Build Coastguard Worker     if (output_format == "xml") {
7628*5c90c05cSAndroid Build Coastguard Worker       XmlUnitTestResultPrinter(
7629*5c90c05cSAndroid Build Coastguard Worker           UnitTestOptions::GetAbsolutePathToOutputFile().c_str())
7630*5c90c05cSAndroid Build Coastguard Worker           .PrintXmlTestsList(&stream, test_suites_);
7631*5c90c05cSAndroid Build Coastguard Worker     } else if (output_format == "json") {
7632*5c90c05cSAndroid Build Coastguard Worker       JsonUnitTestResultPrinter(
7633*5c90c05cSAndroid Build Coastguard Worker           UnitTestOptions::GetAbsolutePathToOutputFile().c_str())
7634*5c90c05cSAndroid Build Coastguard Worker           .PrintJsonTestList(&stream, test_suites_);
7635*5c90c05cSAndroid Build Coastguard Worker     }
7636*5c90c05cSAndroid Build Coastguard Worker     fprintf(fileout, "%s", StringStreamToString(&stream).c_str());
7637*5c90c05cSAndroid Build Coastguard Worker     fclose(fileout);
7638*5c90c05cSAndroid Build Coastguard Worker   }
7639*5c90c05cSAndroid Build Coastguard Worker }
7640*5c90c05cSAndroid Build Coastguard Worker 
7641*5c90c05cSAndroid Build Coastguard Worker // Sets the OS stack trace getter.
7642*5c90c05cSAndroid Build Coastguard Worker //
7643*5c90c05cSAndroid Build Coastguard Worker // Does nothing if the input and the current OS stack trace getter are
7644*5c90c05cSAndroid Build Coastguard Worker // the same; otherwise, deletes the old getter and makes the input the
7645*5c90c05cSAndroid Build Coastguard Worker // current getter.
set_os_stack_trace_getter(OsStackTraceGetterInterface * getter)7646*5c90c05cSAndroid Build Coastguard Worker void UnitTestImpl::set_os_stack_trace_getter(
7647*5c90c05cSAndroid Build Coastguard Worker     OsStackTraceGetterInterface* getter) {
7648*5c90c05cSAndroid Build Coastguard Worker   if (os_stack_trace_getter_ != getter) {
7649*5c90c05cSAndroid Build Coastguard Worker     delete os_stack_trace_getter_;
7650*5c90c05cSAndroid Build Coastguard Worker     os_stack_trace_getter_ = getter;
7651*5c90c05cSAndroid Build Coastguard Worker   }
7652*5c90c05cSAndroid Build Coastguard Worker }
7653*5c90c05cSAndroid Build Coastguard Worker 
7654*5c90c05cSAndroid Build Coastguard Worker // Returns the current OS stack trace getter if it is not NULL;
7655*5c90c05cSAndroid Build Coastguard Worker // otherwise, creates an OsStackTraceGetter, makes it the current
7656*5c90c05cSAndroid Build Coastguard Worker // getter, and returns it.
os_stack_trace_getter()7657*5c90c05cSAndroid Build Coastguard Worker OsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() {
7658*5c90c05cSAndroid Build Coastguard Worker   if (os_stack_trace_getter_ == nullptr) {
7659*5c90c05cSAndroid Build Coastguard Worker #ifdef GTEST_OS_STACK_TRACE_GETTER_
7660*5c90c05cSAndroid Build Coastguard Worker     os_stack_trace_getter_ = new GTEST_OS_STACK_TRACE_GETTER_;
7661*5c90c05cSAndroid Build Coastguard Worker #else
7662*5c90c05cSAndroid Build Coastguard Worker     os_stack_trace_getter_ = new OsStackTraceGetter;
7663*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_OS_STACK_TRACE_GETTER_
7664*5c90c05cSAndroid Build Coastguard Worker   }
7665*5c90c05cSAndroid Build Coastguard Worker 
7666*5c90c05cSAndroid Build Coastguard Worker   return os_stack_trace_getter_;
7667*5c90c05cSAndroid Build Coastguard Worker }
7668*5c90c05cSAndroid Build Coastguard Worker 
7669*5c90c05cSAndroid Build Coastguard Worker // Returns the most specific TestResult currently running.
current_test_result()7670*5c90c05cSAndroid Build Coastguard Worker TestResult* UnitTestImpl::current_test_result() {
7671*5c90c05cSAndroid Build Coastguard Worker   if (current_test_info_ != nullptr) {
7672*5c90c05cSAndroid Build Coastguard Worker     return &current_test_info_->result_;
7673*5c90c05cSAndroid Build Coastguard Worker   }
7674*5c90c05cSAndroid Build Coastguard Worker   if (current_test_suite_ != nullptr) {
7675*5c90c05cSAndroid Build Coastguard Worker     return &current_test_suite_->ad_hoc_test_result_;
7676*5c90c05cSAndroid Build Coastguard Worker   }
7677*5c90c05cSAndroid Build Coastguard Worker   return &ad_hoc_test_result_;
7678*5c90c05cSAndroid Build Coastguard Worker }
7679*5c90c05cSAndroid Build Coastguard Worker 
7680*5c90c05cSAndroid Build Coastguard Worker // Shuffles all test suites, and the tests within each test suite,
7681*5c90c05cSAndroid Build Coastguard Worker // making sure that death tests are still run first.
ShuffleTests()7682*5c90c05cSAndroid Build Coastguard Worker void UnitTestImpl::ShuffleTests() {
7683*5c90c05cSAndroid Build Coastguard Worker   // Shuffles the death test suites.
7684*5c90c05cSAndroid Build Coastguard Worker   ShuffleRange(random(), 0, last_death_test_suite_ + 1, &test_suite_indices_);
7685*5c90c05cSAndroid Build Coastguard Worker 
7686*5c90c05cSAndroid Build Coastguard Worker   // Shuffles the non-death test suites.
7687*5c90c05cSAndroid Build Coastguard Worker   ShuffleRange(random(), last_death_test_suite_ + 1,
7688*5c90c05cSAndroid Build Coastguard Worker                static_cast<int>(test_suites_.size()), &test_suite_indices_);
7689*5c90c05cSAndroid Build Coastguard Worker 
7690*5c90c05cSAndroid Build Coastguard Worker   // Shuffles the tests inside each test suite.
7691*5c90c05cSAndroid Build Coastguard Worker   for (auto& test_suite : test_suites_) {
7692*5c90c05cSAndroid Build Coastguard Worker     test_suite->ShuffleTests(random());
7693*5c90c05cSAndroid Build Coastguard Worker   }
7694*5c90c05cSAndroid Build Coastguard Worker }
7695*5c90c05cSAndroid Build Coastguard Worker 
7696*5c90c05cSAndroid Build Coastguard Worker // Restores the test suites and tests to their order before the first shuffle.
UnshuffleTests()7697*5c90c05cSAndroid Build Coastguard Worker void UnitTestImpl::UnshuffleTests() {
7698*5c90c05cSAndroid Build Coastguard Worker   for (size_t i = 0; i < test_suites_.size(); i++) {
7699*5c90c05cSAndroid Build Coastguard Worker     // Unshuffles the tests in each test suite.
7700*5c90c05cSAndroid Build Coastguard Worker     test_suites_[i]->UnshuffleTests();
7701*5c90c05cSAndroid Build Coastguard Worker     // Resets the index of each test suite.
7702*5c90c05cSAndroid Build Coastguard Worker     test_suite_indices_[i] = static_cast<int>(i);
7703*5c90c05cSAndroid Build Coastguard Worker   }
7704*5c90c05cSAndroid Build Coastguard Worker }
7705*5c90c05cSAndroid Build Coastguard Worker 
7706*5c90c05cSAndroid Build Coastguard Worker // Returns the current OS stack trace as an std::string.
7707*5c90c05cSAndroid Build Coastguard Worker //
7708*5c90c05cSAndroid Build Coastguard Worker // The maximum number of stack frames to be included is specified by
7709*5c90c05cSAndroid Build Coastguard Worker // the gtest_stack_trace_depth flag.  The skip_count parameter
7710*5c90c05cSAndroid Build Coastguard Worker // specifies the number of top frames to be skipped, which doesn't
7711*5c90c05cSAndroid Build Coastguard Worker // count against the number of frames to be included.
7712*5c90c05cSAndroid Build Coastguard Worker //
7713*5c90c05cSAndroid Build Coastguard Worker // For example, if Foo() calls Bar(), which in turn calls
7714*5c90c05cSAndroid Build Coastguard Worker // GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
7715*5c90c05cSAndroid Build Coastguard Worker // the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
GetCurrentOsStackTraceExceptTop(UnitTest *,int skip_count)7716*5c90c05cSAndroid Build Coastguard Worker std::string GetCurrentOsStackTraceExceptTop(UnitTest* /*unit_test*/,
7717*5c90c05cSAndroid Build Coastguard Worker                                             int skip_count) {
7718*5c90c05cSAndroid Build Coastguard Worker   // We pass skip_count + 1 to skip this wrapper function in addition
7719*5c90c05cSAndroid Build Coastguard Worker   // to what the user really wants to skip.
7720*5c90c05cSAndroid Build Coastguard Worker   return GetUnitTestImpl()->CurrentOsStackTraceExceptTop(skip_count + 1);
7721*5c90c05cSAndroid Build Coastguard Worker }
7722*5c90c05cSAndroid Build Coastguard Worker 
7723*5c90c05cSAndroid Build Coastguard Worker // Used by the GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_ macro to
7724*5c90c05cSAndroid Build Coastguard Worker // suppress unreachable code warnings.
7725*5c90c05cSAndroid Build Coastguard Worker namespace {
7726*5c90c05cSAndroid Build Coastguard Worker class ClassUniqueToAlwaysTrue {};
7727*5c90c05cSAndroid Build Coastguard Worker }
7728*5c90c05cSAndroid Build Coastguard Worker 
IsTrue(bool condition)7729*5c90c05cSAndroid Build Coastguard Worker bool IsTrue(bool condition) { return condition; }
7730*5c90c05cSAndroid Build Coastguard Worker 
AlwaysTrue()7731*5c90c05cSAndroid Build Coastguard Worker bool AlwaysTrue() {
7732*5c90c05cSAndroid Build Coastguard Worker #if GTEST_HAS_EXCEPTIONS
7733*5c90c05cSAndroid Build Coastguard Worker   // This condition is always false so AlwaysTrue() never actually throws,
7734*5c90c05cSAndroid Build Coastguard Worker   // but it makes the compiler think that it may throw.
7735*5c90c05cSAndroid Build Coastguard Worker   if (IsTrue(false))
7736*5c90c05cSAndroid Build Coastguard Worker     throw ClassUniqueToAlwaysTrue();
7737*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_HAS_EXCEPTIONS
7738*5c90c05cSAndroid Build Coastguard Worker   return true;
7739*5c90c05cSAndroid Build Coastguard Worker }
7740*5c90c05cSAndroid Build Coastguard Worker 
7741*5c90c05cSAndroid Build Coastguard Worker // If *pstr starts with the given prefix, modifies *pstr to be right
7742*5c90c05cSAndroid Build Coastguard Worker // past the prefix and returns true; otherwise leaves *pstr unchanged
7743*5c90c05cSAndroid Build Coastguard Worker // and returns false.  None of pstr, *pstr, and prefix can be NULL.
SkipPrefix(const char * prefix,const char ** pstr)7744*5c90c05cSAndroid Build Coastguard Worker bool SkipPrefix(const char* prefix, const char** pstr) {
7745*5c90c05cSAndroid Build Coastguard Worker   const size_t prefix_len = strlen(prefix);
7746*5c90c05cSAndroid Build Coastguard Worker   if (strncmp(*pstr, prefix, prefix_len) == 0) {
7747*5c90c05cSAndroid Build Coastguard Worker     *pstr += prefix_len;
7748*5c90c05cSAndroid Build Coastguard Worker     return true;
7749*5c90c05cSAndroid Build Coastguard Worker   }
7750*5c90c05cSAndroid Build Coastguard Worker   return false;
7751*5c90c05cSAndroid Build Coastguard Worker }
7752*5c90c05cSAndroid Build Coastguard Worker 
7753*5c90c05cSAndroid Build Coastguard Worker // Parses a string as a command line flag.  The string should have
7754*5c90c05cSAndroid Build Coastguard Worker // the format "--flag=value".  When def_optional is true, the "=value"
7755*5c90c05cSAndroid Build Coastguard Worker // part can be omitted.
7756*5c90c05cSAndroid Build Coastguard Worker //
7757*5c90c05cSAndroid Build Coastguard Worker // Returns the value of the flag, or NULL if the parsing failed.
ParseFlagValue(const char * str,const char * flag,bool def_optional)7758*5c90c05cSAndroid Build Coastguard Worker static const char* ParseFlagValue(const char* str, const char* flag,
7759*5c90c05cSAndroid Build Coastguard Worker                                   bool def_optional) {
7760*5c90c05cSAndroid Build Coastguard Worker   // str and flag must not be NULL.
7761*5c90c05cSAndroid Build Coastguard Worker   if (str == nullptr || flag == nullptr) return nullptr;
7762*5c90c05cSAndroid Build Coastguard Worker 
7763*5c90c05cSAndroid Build Coastguard Worker   // The flag must start with "--" followed by GTEST_FLAG_PREFIX_.
7764*5c90c05cSAndroid Build Coastguard Worker   const std::string flag_str = std::string("--") + GTEST_FLAG_PREFIX_ + flag;
7765*5c90c05cSAndroid Build Coastguard Worker   const size_t flag_len = flag_str.length();
7766*5c90c05cSAndroid Build Coastguard Worker   if (strncmp(str, flag_str.c_str(), flag_len) != 0) return nullptr;
7767*5c90c05cSAndroid Build Coastguard Worker 
7768*5c90c05cSAndroid Build Coastguard Worker   // Skips the flag name.
7769*5c90c05cSAndroid Build Coastguard Worker   const char* flag_end = str + flag_len;
7770*5c90c05cSAndroid Build Coastguard Worker 
7771*5c90c05cSAndroid Build Coastguard Worker   // When def_optional is true, it's OK to not have a "=value" part.
7772*5c90c05cSAndroid Build Coastguard Worker   if (def_optional && (flag_end[0] == '\0')) {
7773*5c90c05cSAndroid Build Coastguard Worker     return flag_end;
7774*5c90c05cSAndroid Build Coastguard Worker   }
7775*5c90c05cSAndroid Build Coastguard Worker 
7776*5c90c05cSAndroid Build Coastguard Worker   // If def_optional is true and there are more characters after the
7777*5c90c05cSAndroid Build Coastguard Worker   // flag name, or if def_optional is false, there must be a '=' after
7778*5c90c05cSAndroid Build Coastguard Worker   // the flag name.
7779*5c90c05cSAndroid Build Coastguard Worker   if (flag_end[0] != '=') return nullptr;
7780*5c90c05cSAndroid Build Coastguard Worker 
7781*5c90c05cSAndroid Build Coastguard Worker   // Returns the string after "=".
7782*5c90c05cSAndroid Build Coastguard Worker   return flag_end + 1;
7783*5c90c05cSAndroid Build Coastguard Worker }
7784*5c90c05cSAndroid Build Coastguard Worker 
7785*5c90c05cSAndroid Build Coastguard Worker // Parses a string for a bool flag, in the form of either
7786*5c90c05cSAndroid Build Coastguard Worker // "--flag=value" or "--flag".
7787*5c90c05cSAndroid Build Coastguard Worker //
7788*5c90c05cSAndroid Build Coastguard Worker // In the former case, the value is taken as true as long as it does
7789*5c90c05cSAndroid Build Coastguard Worker // not start with '0', 'f', or 'F'.
7790*5c90c05cSAndroid Build Coastguard Worker //
7791*5c90c05cSAndroid Build Coastguard Worker // In the latter case, the value is taken as true.
7792*5c90c05cSAndroid Build Coastguard Worker //
7793*5c90c05cSAndroid Build Coastguard Worker // On success, stores the value of the flag in *value, and returns
7794*5c90c05cSAndroid Build Coastguard Worker // true.  On failure, returns false without changing *value.
ParseBoolFlag(const char * str,const char * flag,bool * value)7795*5c90c05cSAndroid Build Coastguard Worker static bool ParseBoolFlag(const char* str, const char* flag, bool* value) {
7796*5c90c05cSAndroid Build Coastguard Worker   // Gets the value of the flag as a string.
7797*5c90c05cSAndroid Build Coastguard Worker   const char* const value_str = ParseFlagValue(str, flag, true);
7798*5c90c05cSAndroid Build Coastguard Worker 
7799*5c90c05cSAndroid Build Coastguard Worker   // Aborts if the parsing failed.
7800*5c90c05cSAndroid Build Coastguard Worker   if (value_str == nullptr) return false;
7801*5c90c05cSAndroid Build Coastguard Worker 
7802*5c90c05cSAndroid Build Coastguard Worker   // Converts the string value to a bool.
7803*5c90c05cSAndroid Build Coastguard Worker   *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F');
7804*5c90c05cSAndroid Build Coastguard Worker   return true;
7805*5c90c05cSAndroid Build Coastguard Worker }
7806*5c90c05cSAndroid Build Coastguard Worker 
7807*5c90c05cSAndroid Build Coastguard Worker // Parses a string for an int32_t flag, in the form of "--flag=value".
7808*5c90c05cSAndroid Build Coastguard Worker //
7809*5c90c05cSAndroid Build Coastguard Worker // On success, stores the value of the flag in *value, and returns
7810*5c90c05cSAndroid Build Coastguard Worker // true.  On failure, returns false without changing *value.
ParseInt32Flag(const char * str,const char * flag,int32_t * value)7811*5c90c05cSAndroid Build Coastguard Worker bool ParseInt32Flag(const char* str, const char* flag, int32_t* value) {
7812*5c90c05cSAndroid Build Coastguard Worker   // Gets the value of the flag as a string.
7813*5c90c05cSAndroid Build Coastguard Worker   const char* const value_str = ParseFlagValue(str, flag, false);
7814*5c90c05cSAndroid Build Coastguard Worker 
7815*5c90c05cSAndroid Build Coastguard Worker   // Aborts if the parsing failed.
7816*5c90c05cSAndroid Build Coastguard Worker   if (value_str == nullptr) return false;
7817*5c90c05cSAndroid Build Coastguard Worker 
7818*5c90c05cSAndroid Build Coastguard Worker   // Sets *value to the value of the flag.
7819*5c90c05cSAndroid Build Coastguard Worker   return ParseInt32(Message() << "The value of flag --" << flag,
7820*5c90c05cSAndroid Build Coastguard Worker                     value_str, value);
7821*5c90c05cSAndroid Build Coastguard Worker }
7822*5c90c05cSAndroid Build Coastguard Worker 
7823*5c90c05cSAndroid Build Coastguard Worker // Parses a string for a string flag, in the form of "--flag=value".
7824*5c90c05cSAndroid Build Coastguard Worker //
7825*5c90c05cSAndroid Build Coastguard Worker // On success, stores the value of the flag in *value, and returns
7826*5c90c05cSAndroid Build Coastguard Worker // true.  On failure, returns false without changing *value.
7827*5c90c05cSAndroid Build Coastguard Worker template <typename String>
ParseStringFlag(const char * str,const char * flag,String * value)7828*5c90c05cSAndroid Build Coastguard Worker static bool ParseStringFlag(const char* str, const char* flag, String* value) {
7829*5c90c05cSAndroid Build Coastguard Worker   // Gets the value of the flag as a string.
7830*5c90c05cSAndroid Build Coastguard Worker   const char* const value_str = ParseFlagValue(str, flag, false);
7831*5c90c05cSAndroid Build Coastguard Worker 
7832*5c90c05cSAndroid Build Coastguard Worker   // Aborts if the parsing failed.
7833*5c90c05cSAndroid Build Coastguard Worker   if (value_str == nullptr) return false;
7834*5c90c05cSAndroid Build Coastguard Worker 
7835*5c90c05cSAndroid Build Coastguard Worker   // Sets *value to the value of the flag.
7836*5c90c05cSAndroid Build Coastguard Worker   *value = value_str;
7837*5c90c05cSAndroid Build Coastguard Worker   return true;
7838*5c90c05cSAndroid Build Coastguard Worker }
7839*5c90c05cSAndroid Build Coastguard Worker 
7840*5c90c05cSAndroid Build Coastguard Worker // Determines whether a string has a prefix that Google Test uses for its
7841*5c90c05cSAndroid Build Coastguard Worker // flags, i.e., starts with GTEST_FLAG_PREFIX_ or GTEST_FLAG_PREFIX_DASH_.
7842*5c90c05cSAndroid Build Coastguard Worker // If Google Test detects that a command line flag has its prefix but is not
7843*5c90c05cSAndroid Build Coastguard Worker // recognized, it will print its help message. Flags starting with
7844*5c90c05cSAndroid Build Coastguard Worker // GTEST_INTERNAL_PREFIX_ followed by "internal_" are considered Google Test
7845*5c90c05cSAndroid Build Coastguard Worker // internal flags and do not trigger the help message.
HasGoogleTestFlagPrefix(const char * str)7846*5c90c05cSAndroid Build Coastguard Worker static bool HasGoogleTestFlagPrefix(const char* str) {
7847*5c90c05cSAndroid Build Coastguard Worker   return (SkipPrefix("--", &str) ||
7848*5c90c05cSAndroid Build Coastguard Worker           SkipPrefix("-", &str) ||
7849*5c90c05cSAndroid Build Coastguard Worker           SkipPrefix("/", &str)) &&
7850*5c90c05cSAndroid Build Coastguard Worker          !SkipPrefix(GTEST_FLAG_PREFIX_ "internal_", &str) &&
7851*5c90c05cSAndroid Build Coastguard Worker          (SkipPrefix(GTEST_FLAG_PREFIX_, &str) ||
7852*5c90c05cSAndroid Build Coastguard Worker           SkipPrefix(GTEST_FLAG_PREFIX_DASH_, &str));
7853*5c90c05cSAndroid Build Coastguard Worker }
7854*5c90c05cSAndroid Build Coastguard Worker 
7855*5c90c05cSAndroid Build Coastguard Worker // Prints a string containing code-encoded text.  The following escape
7856*5c90c05cSAndroid Build Coastguard Worker // sequences can be used in the string to control the text color:
7857*5c90c05cSAndroid Build Coastguard Worker //
7858*5c90c05cSAndroid Build Coastguard Worker //   @@    prints a single '@' character.
7859*5c90c05cSAndroid Build Coastguard Worker //   @R    changes the color to red.
7860*5c90c05cSAndroid Build Coastguard Worker //   @G    changes the color to green.
7861*5c90c05cSAndroid Build Coastguard Worker //   @Y    changes the color to yellow.
7862*5c90c05cSAndroid Build Coastguard Worker //   @D    changes to the default terminal text color.
7863*5c90c05cSAndroid Build Coastguard Worker //
PrintColorEncoded(const char * str)7864*5c90c05cSAndroid Build Coastguard Worker static void PrintColorEncoded(const char* str) {
7865*5c90c05cSAndroid Build Coastguard Worker   GTestColor color = GTestColor::kDefault;  // The current color.
7866*5c90c05cSAndroid Build Coastguard Worker 
7867*5c90c05cSAndroid Build Coastguard Worker   // Conceptually, we split the string into segments divided by escape
7868*5c90c05cSAndroid Build Coastguard Worker   // sequences.  Then we print one segment at a time.  At the end of
7869*5c90c05cSAndroid Build Coastguard Worker   // each iteration, the str pointer advances to the beginning of the
7870*5c90c05cSAndroid Build Coastguard Worker   // next segment.
7871*5c90c05cSAndroid Build Coastguard Worker   for (;;) {
7872*5c90c05cSAndroid Build Coastguard Worker     const char* p = strchr(str, '@');
7873*5c90c05cSAndroid Build Coastguard Worker     if (p == nullptr) {
7874*5c90c05cSAndroid Build Coastguard Worker       ColoredPrintf(color, "%s", str);
7875*5c90c05cSAndroid Build Coastguard Worker       return;
7876*5c90c05cSAndroid Build Coastguard Worker     }
7877*5c90c05cSAndroid Build Coastguard Worker 
7878*5c90c05cSAndroid Build Coastguard Worker     ColoredPrintf(color, "%s", std::string(str, p).c_str());
7879*5c90c05cSAndroid Build Coastguard Worker 
7880*5c90c05cSAndroid Build Coastguard Worker     const char ch = p[1];
7881*5c90c05cSAndroid Build Coastguard Worker     str = p + 2;
7882*5c90c05cSAndroid Build Coastguard Worker     if (ch == '@') {
7883*5c90c05cSAndroid Build Coastguard Worker       ColoredPrintf(color, "@");
7884*5c90c05cSAndroid Build Coastguard Worker     } else if (ch == 'D') {
7885*5c90c05cSAndroid Build Coastguard Worker       color = GTestColor::kDefault;
7886*5c90c05cSAndroid Build Coastguard Worker     } else if (ch == 'R') {
7887*5c90c05cSAndroid Build Coastguard Worker       color = GTestColor::kRed;
7888*5c90c05cSAndroid Build Coastguard Worker     } else if (ch == 'G') {
7889*5c90c05cSAndroid Build Coastguard Worker       color = GTestColor::kGreen;
7890*5c90c05cSAndroid Build Coastguard Worker     } else if (ch == 'Y') {
7891*5c90c05cSAndroid Build Coastguard Worker       color = GTestColor::kYellow;
7892*5c90c05cSAndroid Build Coastguard Worker     } else {
7893*5c90c05cSAndroid Build Coastguard Worker       --str;
7894*5c90c05cSAndroid Build Coastguard Worker     }
7895*5c90c05cSAndroid Build Coastguard Worker   }
7896*5c90c05cSAndroid Build Coastguard Worker }
7897*5c90c05cSAndroid Build Coastguard Worker 
7898*5c90c05cSAndroid Build Coastguard Worker static const char kColorEncodedHelpMessage[] =
7899*5c90c05cSAndroid Build Coastguard Worker     "This program contains tests written using " GTEST_NAME_
7900*5c90c05cSAndroid Build Coastguard Worker     ". You can use the\n"
7901*5c90c05cSAndroid Build Coastguard Worker     "following command line flags to control its behavior:\n"
7902*5c90c05cSAndroid Build Coastguard Worker     "\n"
7903*5c90c05cSAndroid Build Coastguard Worker     "Test Selection:\n"
7904*5c90c05cSAndroid Build Coastguard Worker     "  @G--" GTEST_FLAG_PREFIX_
7905*5c90c05cSAndroid Build Coastguard Worker     "list_tests@D\n"
7906*5c90c05cSAndroid Build Coastguard Worker     "      List the names of all tests instead of running them. The name of\n"
7907*5c90c05cSAndroid Build Coastguard Worker     "      TEST(Foo, Bar) is \"Foo.Bar\".\n"
7908*5c90c05cSAndroid Build Coastguard Worker     "  @G--" GTEST_FLAG_PREFIX_
7909*5c90c05cSAndroid Build Coastguard Worker     "filter=@YPOSITIVE_PATTERNS"
7910*5c90c05cSAndroid Build Coastguard Worker     "[@G-@YNEGATIVE_PATTERNS]@D\n"
7911*5c90c05cSAndroid Build Coastguard Worker     "      Run only the tests whose name matches one of the positive patterns "
7912*5c90c05cSAndroid Build Coastguard Worker     "but\n"
7913*5c90c05cSAndroid Build Coastguard Worker     "      none of the negative patterns. '?' matches any single character; "
7914*5c90c05cSAndroid Build Coastguard Worker     "'*'\n"
7915*5c90c05cSAndroid Build Coastguard Worker     "      matches any substring; ':' separates two patterns.\n"
7916*5c90c05cSAndroid Build Coastguard Worker     "  @G--" GTEST_FLAG_PREFIX_
7917*5c90c05cSAndroid Build Coastguard Worker     "also_run_disabled_tests@D\n"
7918*5c90c05cSAndroid Build Coastguard Worker     "      Run all disabled tests too.\n"
7919*5c90c05cSAndroid Build Coastguard Worker     "\n"
7920*5c90c05cSAndroid Build Coastguard Worker     "Test Execution:\n"
7921*5c90c05cSAndroid Build Coastguard Worker     "  @G--" GTEST_FLAG_PREFIX_
7922*5c90c05cSAndroid Build Coastguard Worker     "repeat=@Y[COUNT]@D\n"
7923*5c90c05cSAndroid Build Coastguard Worker     "      Run the tests repeatedly; use a negative count to repeat forever.\n"
7924*5c90c05cSAndroid Build Coastguard Worker     "  @G--" GTEST_FLAG_PREFIX_
7925*5c90c05cSAndroid Build Coastguard Worker     "shuffle@D\n"
7926*5c90c05cSAndroid Build Coastguard Worker     "      Randomize tests' orders on every iteration.\n"
7927*5c90c05cSAndroid Build Coastguard Worker     "  @G--" GTEST_FLAG_PREFIX_
7928*5c90c05cSAndroid Build Coastguard Worker     "random_seed=@Y[NUMBER]@D\n"
7929*5c90c05cSAndroid Build Coastguard Worker     "      Random number seed to use for shuffling test orders (between 1 and\n"
7930*5c90c05cSAndroid Build Coastguard Worker     "      99999, or 0 to use a seed based on the current time).\n"
7931*5c90c05cSAndroid Build Coastguard Worker     "\n"
7932*5c90c05cSAndroid Build Coastguard Worker     "Test Output:\n"
7933*5c90c05cSAndroid Build Coastguard Worker     "  @G--" GTEST_FLAG_PREFIX_
7934*5c90c05cSAndroid Build Coastguard Worker     "color=@Y(@Gyes@Y|@Gno@Y|@Gauto@Y)@D\n"
7935*5c90c05cSAndroid Build Coastguard Worker     "      Enable/disable colored output. The default is @Gauto@D.\n"
7936*5c90c05cSAndroid Build Coastguard Worker     "  @G--" GTEST_FLAG_PREFIX_
7937*5c90c05cSAndroid Build Coastguard Worker     "brief=1@D\n"
7938*5c90c05cSAndroid Build Coastguard Worker     "      Only print test failures.\n"
7939*5c90c05cSAndroid Build Coastguard Worker     "  @G--" GTEST_FLAG_PREFIX_
7940*5c90c05cSAndroid Build Coastguard Worker     "print_time=0@D\n"
7941*5c90c05cSAndroid Build Coastguard Worker     "      Don't print the elapsed time of each test.\n"
7942*5c90c05cSAndroid Build Coastguard Worker     "  @G--" GTEST_FLAG_PREFIX_
7943*5c90c05cSAndroid Build Coastguard Worker     "output=@Y(@Gjson@Y|@Gxml@Y)[@G:@YDIRECTORY_PATH@G" GTEST_PATH_SEP_
7944*5c90c05cSAndroid Build Coastguard Worker     "@Y|@G:@YFILE_PATH]@D\n"
7945*5c90c05cSAndroid Build Coastguard Worker     "      Generate a JSON or XML report in the given directory or with the "
7946*5c90c05cSAndroid Build Coastguard Worker     "given\n"
7947*5c90c05cSAndroid Build Coastguard Worker     "      file name. @YFILE_PATH@D defaults to @Gtest_detail.xml@D.\n"
7948*5c90c05cSAndroid Build Coastguard Worker # if GTEST_CAN_STREAM_RESULTS_
7949*5c90c05cSAndroid Build Coastguard Worker     "  @G--" GTEST_FLAG_PREFIX_
7950*5c90c05cSAndroid Build Coastguard Worker     "stream_result_to=@YHOST@G:@YPORT@D\n"
7951*5c90c05cSAndroid Build Coastguard Worker     "      Stream test results to the given server.\n"
7952*5c90c05cSAndroid Build Coastguard Worker # endif  // GTEST_CAN_STREAM_RESULTS_
7953*5c90c05cSAndroid Build Coastguard Worker     "\n"
7954*5c90c05cSAndroid Build Coastguard Worker     "Assertion Behavior:\n"
7955*5c90c05cSAndroid Build Coastguard Worker # if GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
7956*5c90c05cSAndroid Build Coastguard Worker     "  @G--" GTEST_FLAG_PREFIX_
7957*5c90c05cSAndroid Build Coastguard Worker     "death_test_style=@Y(@Gfast@Y|@Gthreadsafe@Y)@D\n"
7958*5c90c05cSAndroid Build Coastguard Worker     "      Set the default death test style.\n"
7959*5c90c05cSAndroid Build Coastguard Worker # endif  // GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
7960*5c90c05cSAndroid Build Coastguard Worker     "  @G--" GTEST_FLAG_PREFIX_
7961*5c90c05cSAndroid Build Coastguard Worker     "break_on_failure@D\n"
7962*5c90c05cSAndroid Build Coastguard Worker     "      Turn assertion failures into debugger break-points.\n"
7963*5c90c05cSAndroid Build Coastguard Worker     "  @G--" GTEST_FLAG_PREFIX_
7964*5c90c05cSAndroid Build Coastguard Worker     "throw_on_failure@D\n"
7965*5c90c05cSAndroid Build Coastguard Worker     "      Turn assertion failures into C++ exceptions for use by an external\n"
7966*5c90c05cSAndroid Build Coastguard Worker     "      test framework.\n"
7967*5c90c05cSAndroid Build Coastguard Worker     "  @G--" GTEST_FLAG_PREFIX_
7968*5c90c05cSAndroid Build Coastguard Worker     "catch_exceptions=0@D\n"
7969*5c90c05cSAndroid Build Coastguard Worker     "      Do not report exceptions as test failures. Instead, allow them\n"
7970*5c90c05cSAndroid Build Coastguard Worker     "      to crash the program or throw a pop-up (on Windows).\n"
7971*5c90c05cSAndroid Build Coastguard Worker     "\n"
7972*5c90c05cSAndroid Build Coastguard Worker     "Except for @G--" GTEST_FLAG_PREFIX_
7973*5c90c05cSAndroid Build Coastguard Worker     "list_tests@D, you can alternatively set "
7974*5c90c05cSAndroid Build Coastguard Worker     "the corresponding\n"
7975*5c90c05cSAndroid Build Coastguard Worker     "environment variable of a flag (all letters in upper-case). For example, "
7976*5c90c05cSAndroid Build Coastguard Worker     "to\n"
7977*5c90c05cSAndroid Build Coastguard Worker     "disable colored text output, you can either specify "
7978*5c90c05cSAndroid Build Coastguard Worker     "@G--" GTEST_FLAG_PREFIX_
7979*5c90c05cSAndroid Build Coastguard Worker     "color=no@D or set\n"
7980*5c90c05cSAndroid Build Coastguard Worker     "the @G" GTEST_FLAG_PREFIX_UPPER_
7981*5c90c05cSAndroid Build Coastguard Worker     "COLOR@D environment variable to @Gno@D.\n"
7982*5c90c05cSAndroid Build Coastguard Worker     "\n"
7983*5c90c05cSAndroid Build Coastguard Worker     "For more information, please read the " GTEST_NAME_
7984*5c90c05cSAndroid Build Coastguard Worker     " documentation at\n"
7985*5c90c05cSAndroid Build Coastguard Worker     "@G" GTEST_PROJECT_URL_ "@D. If you find a bug in " GTEST_NAME_
7986*5c90c05cSAndroid Build Coastguard Worker     "\n"
7987*5c90c05cSAndroid Build Coastguard Worker     "(not one in your own code or tests), please report it to\n"
7988*5c90c05cSAndroid Build Coastguard Worker     "@G<" GTEST_DEV_EMAIL_ ">@D.\n";
7989*5c90c05cSAndroid Build Coastguard Worker 
ParseGoogleTestFlag(const char * const arg)7990*5c90c05cSAndroid Build Coastguard Worker static bool ParseGoogleTestFlag(const char* const arg) {
7991*5c90c05cSAndroid Build Coastguard Worker   return ParseBoolFlag(arg, kAlsoRunDisabledTestsFlag,
7992*5c90c05cSAndroid Build Coastguard Worker                        &GTEST_FLAG(also_run_disabled_tests)) ||
7993*5c90c05cSAndroid Build Coastguard Worker          ParseBoolFlag(arg, kBreakOnFailureFlag,
7994*5c90c05cSAndroid Build Coastguard Worker                        &GTEST_FLAG(break_on_failure)) ||
7995*5c90c05cSAndroid Build Coastguard Worker          ParseBoolFlag(arg, kCatchExceptionsFlag,
7996*5c90c05cSAndroid Build Coastguard Worker                        &GTEST_FLAG(catch_exceptions)) ||
7997*5c90c05cSAndroid Build Coastguard Worker          ParseStringFlag(arg, kColorFlag, &GTEST_FLAG(color)) ||
7998*5c90c05cSAndroid Build Coastguard Worker          ParseStringFlag(arg, kDeathTestStyleFlag,
7999*5c90c05cSAndroid Build Coastguard Worker                          &GTEST_FLAG(death_test_style)) ||
8000*5c90c05cSAndroid Build Coastguard Worker          ParseBoolFlag(arg, kDeathTestUseFork,
8001*5c90c05cSAndroid Build Coastguard Worker                        &GTEST_FLAG(death_test_use_fork)) ||
8002*5c90c05cSAndroid Build Coastguard Worker          ParseBoolFlag(arg, kFailFast, &GTEST_FLAG(fail_fast)) ||
8003*5c90c05cSAndroid Build Coastguard Worker          ParseStringFlag(arg, kFilterFlag, &GTEST_FLAG(filter)) ||
8004*5c90c05cSAndroid Build Coastguard Worker          ParseStringFlag(arg, kInternalRunDeathTestFlag,
8005*5c90c05cSAndroid Build Coastguard Worker                          &GTEST_FLAG(internal_run_death_test)) ||
8006*5c90c05cSAndroid Build Coastguard Worker          ParseBoolFlag(arg, kListTestsFlag, &GTEST_FLAG(list_tests)) ||
8007*5c90c05cSAndroid Build Coastguard Worker          ParseStringFlag(arg, kOutputFlag, &GTEST_FLAG(output)) ||
8008*5c90c05cSAndroid Build Coastguard Worker          ParseBoolFlag(arg, kBriefFlag, &GTEST_FLAG(brief)) ||
8009*5c90c05cSAndroid Build Coastguard Worker          ParseBoolFlag(arg, kPrintTimeFlag, &GTEST_FLAG(print_time)) ||
8010*5c90c05cSAndroid Build Coastguard Worker          ParseBoolFlag(arg, kPrintUTF8Flag, &GTEST_FLAG(print_utf8)) ||
8011*5c90c05cSAndroid Build Coastguard Worker          ParseInt32Flag(arg, kRandomSeedFlag, &GTEST_FLAG(random_seed)) ||
8012*5c90c05cSAndroid Build Coastguard Worker          ParseInt32Flag(arg, kRepeatFlag, &GTEST_FLAG(repeat)) ||
8013*5c90c05cSAndroid Build Coastguard Worker          ParseBoolFlag(arg, kShuffleFlag, &GTEST_FLAG(shuffle)) ||
8014*5c90c05cSAndroid Build Coastguard Worker          ParseInt32Flag(arg, kStackTraceDepthFlag,
8015*5c90c05cSAndroid Build Coastguard Worker                         &GTEST_FLAG(stack_trace_depth)) ||
8016*5c90c05cSAndroid Build Coastguard Worker          ParseStringFlag(arg, kStreamResultToFlag,
8017*5c90c05cSAndroid Build Coastguard Worker                          &GTEST_FLAG(stream_result_to)) ||
8018*5c90c05cSAndroid Build Coastguard Worker          ParseBoolFlag(arg, kThrowOnFailureFlag, &GTEST_FLAG(throw_on_failure));
8019*5c90c05cSAndroid Build Coastguard Worker }
8020*5c90c05cSAndroid Build Coastguard Worker 
8021*5c90c05cSAndroid Build Coastguard Worker #if GTEST_USE_OWN_FLAGFILE_FLAG_
LoadFlagsFromFile(const std::string & path)8022*5c90c05cSAndroid Build Coastguard Worker static void LoadFlagsFromFile(const std::string& path) {
8023*5c90c05cSAndroid Build Coastguard Worker   FILE* flagfile = posix::FOpen(path.c_str(), "r");
8024*5c90c05cSAndroid Build Coastguard Worker   if (!flagfile) {
8025*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOG_(FATAL) << "Unable to open file \"" << GTEST_FLAG(flagfile)
8026*5c90c05cSAndroid Build Coastguard Worker                       << "\"";
8027*5c90c05cSAndroid Build Coastguard Worker   }
8028*5c90c05cSAndroid Build Coastguard Worker   std::string contents(ReadEntireFile(flagfile));
8029*5c90c05cSAndroid Build Coastguard Worker   posix::FClose(flagfile);
8030*5c90c05cSAndroid Build Coastguard Worker   std::vector<std::string> lines;
8031*5c90c05cSAndroid Build Coastguard Worker   SplitString(contents, '\n', &lines);
8032*5c90c05cSAndroid Build Coastguard Worker   for (size_t i = 0; i < lines.size(); ++i) {
8033*5c90c05cSAndroid Build Coastguard Worker     if (lines[i].empty())
8034*5c90c05cSAndroid Build Coastguard Worker       continue;
8035*5c90c05cSAndroid Build Coastguard Worker     if (!ParseGoogleTestFlag(lines[i].c_str()))
8036*5c90c05cSAndroid Build Coastguard Worker       g_help_flag = true;
8037*5c90c05cSAndroid Build Coastguard Worker   }
8038*5c90c05cSAndroid Build Coastguard Worker }
8039*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_USE_OWN_FLAGFILE_FLAG_
8040*5c90c05cSAndroid Build Coastguard Worker 
8041*5c90c05cSAndroid Build Coastguard Worker // Parses the command line for Google Test flags, without initializing
8042*5c90c05cSAndroid Build Coastguard Worker // other parts of Google Test.  The type parameter CharType can be
8043*5c90c05cSAndroid Build Coastguard Worker // instantiated to either char or wchar_t.
8044*5c90c05cSAndroid Build Coastguard Worker template <typename CharType>
ParseGoogleTestFlagsOnlyImpl(int * argc,CharType ** argv)8045*5c90c05cSAndroid Build Coastguard Worker void ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) {
8046*5c90c05cSAndroid Build Coastguard Worker   for (int i = 1; i < *argc; i++) {
8047*5c90c05cSAndroid Build Coastguard Worker     const std::string arg_string = StreamableToString(argv[i]);
8048*5c90c05cSAndroid Build Coastguard Worker     const char* const arg = arg_string.c_str();
8049*5c90c05cSAndroid Build Coastguard Worker 
8050*5c90c05cSAndroid Build Coastguard Worker     using internal::ParseBoolFlag;
8051*5c90c05cSAndroid Build Coastguard Worker     using internal::ParseInt32Flag;
8052*5c90c05cSAndroid Build Coastguard Worker     using internal::ParseStringFlag;
8053*5c90c05cSAndroid Build Coastguard Worker 
8054*5c90c05cSAndroid Build Coastguard Worker     bool remove_flag = false;
8055*5c90c05cSAndroid Build Coastguard Worker     if (ParseGoogleTestFlag(arg)) {
8056*5c90c05cSAndroid Build Coastguard Worker       remove_flag = true;
8057*5c90c05cSAndroid Build Coastguard Worker #if GTEST_USE_OWN_FLAGFILE_FLAG_
8058*5c90c05cSAndroid Build Coastguard Worker     } else if (ParseStringFlag(arg, kFlagfileFlag, &GTEST_FLAG(flagfile))) {
8059*5c90c05cSAndroid Build Coastguard Worker       LoadFlagsFromFile(GTEST_FLAG(flagfile));
8060*5c90c05cSAndroid Build Coastguard Worker       remove_flag = true;
8061*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_USE_OWN_FLAGFILE_FLAG_
8062*5c90c05cSAndroid Build Coastguard Worker     } else if (arg_string == "--help" || arg_string == "-h" ||
8063*5c90c05cSAndroid Build Coastguard Worker                arg_string == "-?" || arg_string == "/?" ||
8064*5c90c05cSAndroid Build Coastguard Worker                HasGoogleTestFlagPrefix(arg)) {
8065*5c90c05cSAndroid Build Coastguard Worker       // Both help flag and unrecognized Google Test flags (excluding
8066*5c90c05cSAndroid Build Coastguard Worker       // internal ones) trigger help display.
8067*5c90c05cSAndroid Build Coastguard Worker       g_help_flag = true;
8068*5c90c05cSAndroid Build Coastguard Worker     }
8069*5c90c05cSAndroid Build Coastguard Worker 
8070*5c90c05cSAndroid Build Coastguard Worker     if (remove_flag) {
8071*5c90c05cSAndroid Build Coastguard Worker       // Shift the remainder of the argv list left by one.  Note
8072*5c90c05cSAndroid Build Coastguard Worker       // that argv has (*argc + 1) elements, the last one always being
8073*5c90c05cSAndroid Build Coastguard Worker       // NULL.  The following loop moves the trailing NULL element as
8074*5c90c05cSAndroid Build Coastguard Worker       // well.
8075*5c90c05cSAndroid Build Coastguard Worker       for (int j = i; j != *argc; j++) {
8076*5c90c05cSAndroid Build Coastguard Worker         argv[j] = argv[j + 1];
8077*5c90c05cSAndroid Build Coastguard Worker       }
8078*5c90c05cSAndroid Build Coastguard Worker 
8079*5c90c05cSAndroid Build Coastguard Worker       // Decrements the argument count.
8080*5c90c05cSAndroid Build Coastguard Worker       (*argc)--;
8081*5c90c05cSAndroid Build Coastguard Worker 
8082*5c90c05cSAndroid Build Coastguard Worker       // We also need to decrement the iterator as we just removed
8083*5c90c05cSAndroid Build Coastguard Worker       // an element.
8084*5c90c05cSAndroid Build Coastguard Worker       i--;
8085*5c90c05cSAndroid Build Coastguard Worker     }
8086*5c90c05cSAndroid Build Coastguard Worker   }
8087*5c90c05cSAndroid Build Coastguard Worker 
8088*5c90c05cSAndroid Build Coastguard Worker   if (g_help_flag) {
8089*5c90c05cSAndroid Build Coastguard Worker     // We print the help here instead of in RUN_ALL_TESTS(), as the
8090*5c90c05cSAndroid Build Coastguard Worker     // latter may not be called at all if the user is using Google
8091*5c90c05cSAndroid Build Coastguard Worker     // Test with another testing framework.
8092*5c90c05cSAndroid Build Coastguard Worker     PrintColorEncoded(kColorEncodedHelpMessage);
8093*5c90c05cSAndroid Build Coastguard Worker   }
8094*5c90c05cSAndroid Build Coastguard Worker }
8095*5c90c05cSAndroid Build Coastguard Worker 
8096*5c90c05cSAndroid Build Coastguard Worker // Parses the command line for Google Test flags, without initializing
8097*5c90c05cSAndroid Build Coastguard Worker // other parts of Google Test.
ParseGoogleTestFlagsOnly(int * argc,char ** argv)8098*5c90c05cSAndroid Build Coastguard Worker void ParseGoogleTestFlagsOnly(int* argc, char** argv) {
8099*5c90c05cSAndroid Build Coastguard Worker   ParseGoogleTestFlagsOnlyImpl(argc, argv);
8100*5c90c05cSAndroid Build Coastguard Worker 
8101*5c90c05cSAndroid Build Coastguard Worker   // Fix the value of *_NSGetArgc() on macOS, but if and only if
8102*5c90c05cSAndroid Build Coastguard Worker   // *_NSGetArgv() == argv
8103*5c90c05cSAndroid Build Coastguard Worker   // Only applicable to char** version of argv
8104*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_MAC
8105*5c90c05cSAndroid Build Coastguard Worker #ifndef GTEST_OS_IOS
8106*5c90c05cSAndroid Build Coastguard Worker   if (*_NSGetArgv() == argv) {
8107*5c90c05cSAndroid Build Coastguard Worker     *_NSGetArgc() = *argc;
8108*5c90c05cSAndroid Build Coastguard Worker   }
8109*5c90c05cSAndroid Build Coastguard Worker #endif
8110*5c90c05cSAndroid Build Coastguard Worker #endif
8111*5c90c05cSAndroid Build Coastguard Worker }
ParseGoogleTestFlagsOnly(int * argc,wchar_t ** argv)8112*5c90c05cSAndroid Build Coastguard Worker void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv) {
8113*5c90c05cSAndroid Build Coastguard Worker   ParseGoogleTestFlagsOnlyImpl(argc, argv);
8114*5c90c05cSAndroid Build Coastguard Worker }
8115*5c90c05cSAndroid Build Coastguard Worker 
8116*5c90c05cSAndroid Build Coastguard Worker // The internal implementation of InitGoogleTest().
8117*5c90c05cSAndroid Build Coastguard Worker //
8118*5c90c05cSAndroid Build Coastguard Worker // The type parameter CharType can be instantiated to either char or
8119*5c90c05cSAndroid Build Coastguard Worker // wchar_t.
8120*5c90c05cSAndroid Build Coastguard Worker template <typename CharType>
InitGoogleTestImpl(int * argc,CharType ** argv)8121*5c90c05cSAndroid Build Coastguard Worker void InitGoogleTestImpl(int* argc, CharType** argv) {
8122*5c90c05cSAndroid Build Coastguard Worker   // We don't want to run the initialization code twice.
8123*5c90c05cSAndroid Build Coastguard Worker   if (GTestIsInitialized()) return;
8124*5c90c05cSAndroid Build Coastguard Worker 
8125*5c90c05cSAndroid Build Coastguard Worker   if (*argc <= 0) return;
8126*5c90c05cSAndroid Build Coastguard Worker 
8127*5c90c05cSAndroid Build Coastguard Worker   g_argvs.clear();
8128*5c90c05cSAndroid Build Coastguard Worker   for (int i = 0; i != *argc; i++) {
8129*5c90c05cSAndroid Build Coastguard Worker     g_argvs.push_back(StreamableToString(argv[i]));
8130*5c90c05cSAndroid Build Coastguard Worker   }
8131*5c90c05cSAndroid Build Coastguard Worker 
8132*5c90c05cSAndroid Build Coastguard Worker #if GTEST_HAS_ABSL
8133*5c90c05cSAndroid Build Coastguard Worker   absl::InitializeSymbolizer(g_argvs[0].c_str());
8134*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_HAS_ABSL
8135*5c90c05cSAndroid Build Coastguard Worker 
8136*5c90c05cSAndroid Build Coastguard Worker   ParseGoogleTestFlagsOnly(argc, argv);
8137*5c90c05cSAndroid Build Coastguard Worker   GetUnitTestImpl()->PostFlagParsingInit();
8138*5c90c05cSAndroid Build Coastguard Worker }
8139*5c90c05cSAndroid Build Coastguard Worker 
8140*5c90c05cSAndroid Build Coastguard Worker }  // namespace internal
8141*5c90c05cSAndroid Build Coastguard Worker 
8142*5c90c05cSAndroid Build Coastguard Worker // Initializes Google Test.  This must be called before calling
8143*5c90c05cSAndroid Build Coastguard Worker // RUN_ALL_TESTS().  In particular, it parses a command line for the
8144*5c90c05cSAndroid Build Coastguard Worker // flags that Google Test recognizes.  Whenever a Google Test flag is
8145*5c90c05cSAndroid Build Coastguard Worker // seen, it is removed from argv, and *argc is decremented.
8146*5c90c05cSAndroid Build Coastguard Worker //
8147*5c90c05cSAndroid Build Coastguard Worker // No value is returned.  Instead, the Google Test flag variables are
8148*5c90c05cSAndroid Build Coastguard Worker // updated.
8149*5c90c05cSAndroid Build Coastguard Worker //
8150*5c90c05cSAndroid Build Coastguard Worker // Calling the function for the second time has no user-visible effect.
InitGoogleTest(int * argc,char ** argv)8151*5c90c05cSAndroid Build Coastguard Worker void InitGoogleTest(int* argc, char** argv) {
8152*5c90c05cSAndroid Build Coastguard Worker #if defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)
8153*5c90c05cSAndroid Build Coastguard Worker   GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_(argc, argv);
8154*5c90c05cSAndroid Build Coastguard Worker #else  // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)
8155*5c90c05cSAndroid Build Coastguard Worker   internal::InitGoogleTestImpl(argc, argv);
8156*5c90c05cSAndroid Build Coastguard Worker #endif  // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)
8157*5c90c05cSAndroid Build Coastguard Worker }
8158*5c90c05cSAndroid Build Coastguard Worker 
8159*5c90c05cSAndroid Build Coastguard Worker // This overloaded version can be used in Windows programs compiled in
8160*5c90c05cSAndroid Build Coastguard Worker // UNICODE mode.
InitGoogleTest(int * argc,wchar_t ** argv)8161*5c90c05cSAndroid Build Coastguard Worker void InitGoogleTest(int* argc, wchar_t** argv) {
8162*5c90c05cSAndroid Build Coastguard Worker #if defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)
8163*5c90c05cSAndroid Build Coastguard Worker   GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_(argc, argv);
8164*5c90c05cSAndroid Build Coastguard Worker #else  // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)
8165*5c90c05cSAndroid Build Coastguard Worker   internal::InitGoogleTestImpl(argc, argv);
8166*5c90c05cSAndroid Build Coastguard Worker #endif  // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)
8167*5c90c05cSAndroid Build Coastguard Worker }
8168*5c90c05cSAndroid Build Coastguard Worker 
8169*5c90c05cSAndroid Build Coastguard Worker // This overloaded version can be used on Arduino/embedded platforms where
8170*5c90c05cSAndroid Build Coastguard Worker // there is no argc/argv.
InitGoogleTest()8171*5c90c05cSAndroid Build Coastguard Worker void InitGoogleTest() {
8172*5c90c05cSAndroid Build Coastguard Worker   // Since Arduino doesn't have a command line, fake out the argc/argv arguments
8173*5c90c05cSAndroid Build Coastguard Worker   int argc = 1;
8174*5c90c05cSAndroid Build Coastguard Worker   const auto arg0 = "dummy";
8175*5c90c05cSAndroid Build Coastguard Worker   char* argv0 = const_cast<char*>(arg0);
8176*5c90c05cSAndroid Build Coastguard Worker   char** argv = &argv0;
8177*5c90c05cSAndroid Build Coastguard Worker 
8178*5c90c05cSAndroid Build Coastguard Worker #if defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)
8179*5c90c05cSAndroid Build Coastguard Worker   GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_(&argc, argv);
8180*5c90c05cSAndroid Build Coastguard Worker #else  // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)
8181*5c90c05cSAndroid Build Coastguard Worker   internal::InitGoogleTestImpl(&argc, argv);
8182*5c90c05cSAndroid Build Coastguard Worker #endif  // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)
8183*5c90c05cSAndroid Build Coastguard Worker }
8184*5c90c05cSAndroid Build Coastguard Worker 
TempDir()8185*5c90c05cSAndroid Build Coastguard Worker std::string TempDir() {
8186*5c90c05cSAndroid Build Coastguard Worker #if defined(GTEST_CUSTOM_TEMPDIR_FUNCTION_)
8187*5c90c05cSAndroid Build Coastguard Worker   return GTEST_CUSTOM_TEMPDIR_FUNCTION_();
8188*5c90c05cSAndroid Build Coastguard Worker #elif GTEST_OS_WINDOWS_MOBILE
8189*5c90c05cSAndroid Build Coastguard Worker   return "\\temp\\";
8190*5c90c05cSAndroid Build Coastguard Worker #elif GTEST_OS_WINDOWS
8191*5c90c05cSAndroid Build Coastguard Worker   const char* temp_dir = internal::posix::GetEnv("TEMP");
8192*5c90c05cSAndroid Build Coastguard Worker   if (temp_dir == nullptr || temp_dir[0] == '\0') {
8193*5c90c05cSAndroid Build Coastguard Worker     return "\\temp\\";
8194*5c90c05cSAndroid Build Coastguard Worker   } else if (temp_dir[strlen(temp_dir) - 1] == '\\') {
8195*5c90c05cSAndroid Build Coastguard Worker     return temp_dir;
8196*5c90c05cSAndroid Build Coastguard Worker   } else {
8197*5c90c05cSAndroid Build Coastguard Worker     return std::string(temp_dir) + "\\";
8198*5c90c05cSAndroid Build Coastguard Worker   }
8199*5c90c05cSAndroid Build Coastguard Worker #elif GTEST_OS_LINUX_ANDROID
8200*5c90c05cSAndroid Build Coastguard Worker   const char* temp_dir = internal::posix::GetEnv("TEST_TMPDIR");
8201*5c90c05cSAndroid Build Coastguard Worker   if (temp_dir == nullptr || temp_dir[0] == '\0') {
8202*5c90c05cSAndroid Build Coastguard Worker     return "/data/local/tmp/";
8203*5c90c05cSAndroid Build Coastguard Worker   } else {
8204*5c90c05cSAndroid Build Coastguard Worker     return temp_dir;
8205*5c90c05cSAndroid Build Coastguard Worker   }
8206*5c90c05cSAndroid Build Coastguard Worker #elif GTEST_OS_LINUX
8207*5c90c05cSAndroid Build Coastguard Worker   const char* temp_dir = internal::posix::GetEnv("TEST_TMPDIR");
8208*5c90c05cSAndroid Build Coastguard Worker   if (temp_dir == nullptr || temp_dir[0] == '\0') {
8209*5c90c05cSAndroid Build Coastguard Worker     return "/tmp/";
8210*5c90c05cSAndroid Build Coastguard Worker   } else {
8211*5c90c05cSAndroid Build Coastguard Worker     return temp_dir;
8212*5c90c05cSAndroid Build Coastguard Worker   }
8213*5c90c05cSAndroid Build Coastguard Worker #else
8214*5c90c05cSAndroid Build Coastguard Worker   return "/tmp/";
8215*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_OS_WINDOWS_MOBILE
8216*5c90c05cSAndroid Build Coastguard Worker }
8217*5c90c05cSAndroid Build Coastguard Worker 
8218*5c90c05cSAndroid Build Coastguard Worker // Class ScopedTrace
8219*5c90c05cSAndroid Build Coastguard Worker 
8220*5c90c05cSAndroid Build Coastguard Worker // Pushes the given source file location and message onto a per-thread
8221*5c90c05cSAndroid Build Coastguard Worker // trace stack maintained by Google Test.
PushTrace(const char * file,int line,std::string message)8222*5c90c05cSAndroid Build Coastguard Worker void ScopedTrace::PushTrace(const char* file, int line, std::string message) {
8223*5c90c05cSAndroid Build Coastguard Worker   internal::TraceInfo trace;
8224*5c90c05cSAndroid Build Coastguard Worker   trace.file = file;
8225*5c90c05cSAndroid Build Coastguard Worker   trace.line = line;
8226*5c90c05cSAndroid Build Coastguard Worker   trace.message.swap(message);
8227*5c90c05cSAndroid Build Coastguard Worker 
8228*5c90c05cSAndroid Build Coastguard Worker   UnitTest::GetInstance()->PushGTestTrace(trace);
8229*5c90c05cSAndroid Build Coastguard Worker }
8230*5c90c05cSAndroid Build Coastguard Worker 
8231*5c90c05cSAndroid Build Coastguard Worker // Pops the info pushed by the c'tor.
~ScopedTrace()8232*5c90c05cSAndroid Build Coastguard Worker ScopedTrace::~ScopedTrace()
8233*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOCK_EXCLUDED_(&UnitTest::mutex_) {
8234*5c90c05cSAndroid Build Coastguard Worker   UnitTest::GetInstance()->PopGTestTrace();
8235*5c90c05cSAndroid Build Coastguard Worker }
8236*5c90c05cSAndroid Build Coastguard Worker 
8237*5c90c05cSAndroid Build Coastguard Worker }  // namespace testing
8238*5c90c05cSAndroid Build Coastguard Worker // Copyright 2005, Google Inc.
8239*5c90c05cSAndroid Build Coastguard Worker // All rights reserved.
8240*5c90c05cSAndroid Build Coastguard Worker //
8241*5c90c05cSAndroid Build Coastguard Worker // Redistribution and use in source and binary forms, with or without
8242*5c90c05cSAndroid Build Coastguard Worker // modification, are permitted provided that the following conditions are
8243*5c90c05cSAndroid Build Coastguard Worker // met:
8244*5c90c05cSAndroid Build Coastguard Worker //
8245*5c90c05cSAndroid Build Coastguard Worker //     * Redistributions of source code must retain the above copyright
8246*5c90c05cSAndroid Build Coastguard Worker // notice, this list of conditions and the following disclaimer.
8247*5c90c05cSAndroid Build Coastguard Worker //     * Redistributions in binary form must reproduce the above
8248*5c90c05cSAndroid Build Coastguard Worker // copyright notice, this list of conditions and the following disclaimer
8249*5c90c05cSAndroid Build Coastguard Worker // in the documentation and/or other materials provided with the
8250*5c90c05cSAndroid Build Coastguard Worker // distribution.
8251*5c90c05cSAndroid Build Coastguard Worker //     * Neither the name of Google Inc. nor the names of its
8252*5c90c05cSAndroid Build Coastguard Worker // contributors may be used to endorse or promote products derived from
8253*5c90c05cSAndroid Build Coastguard Worker // this software without specific prior written permission.
8254*5c90c05cSAndroid Build Coastguard Worker //
8255*5c90c05cSAndroid Build Coastguard Worker // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
8256*5c90c05cSAndroid Build Coastguard Worker // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
8257*5c90c05cSAndroid Build Coastguard Worker // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
8258*5c90c05cSAndroid Build Coastguard Worker // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
8259*5c90c05cSAndroid Build Coastguard Worker // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
8260*5c90c05cSAndroid Build Coastguard Worker // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
8261*5c90c05cSAndroid Build Coastguard Worker // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
8262*5c90c05cSAndroid Build Coastguard Worker // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
8263*5c90c05cSAndroid Build Coastguard Worker // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
8264*5c90c05cSAndroid Build Coastguard Worker // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
8265*5c90c05cSAndroid Build Coastguard Worker // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8266*5c90c05cSAndroid Build Coastguard Worker 
8267*5c90c05cSAndroid Build Coastguard Worker //
8268*5c90c05cSAndroid Build Coastguard Worker // This file implements death tests.
8269*5c90c05cSAndroid Build Coastguard Worker 
8270*5c90c05cSAndroid Build Coastguard Worker 
8271*5c90c05cSAndroid Build Coastguard Worker #include <functional>
8272*5c90c05cSAndroid Build Coastguard Worker #include <utility>
8273*5c90c05cSAndroid Build Coastguard Worker 
8274*5c90c05cSAndroid Build Coastguard Worker 
8275*5c90c05cSAndroid Build Coastguard Worker #if GTEST_HAS_DEATH_TEST
8276*5c90c05cSAndroid Build Coastguard Worker 
8277*5c90c05cSAndroid Build Coastguard Worker # if GTEST_OS_MAC
8278*5c90c05cSAndroid Build Coastguard Worker #  include <crt_externs.h>
8279*5c90c05cSAndroid Build Coastguard Worker # endif  // GTEST_OS_MAC
8280*5c90c05cSAndroid Build Coastguard Worker 
8281*5c90c05cSAndroid Build Coastguard Worker # include <errno.h>
8282*5c90c05cSAndroid Build Coastguard Worker # include <fcntl.h>
8283*5c90c05cSAndroid Build Coastguard Worker # include <limits.h>
8284*5c90c05cSAndroid Build Coastguard Worker 
8285*5c90c05cSAndroid Build Coastguard Worker # if GTEST_OS_LINUX
8286*5c90c05cSAndroid Build Coastguard Worker #  include <signal.h>
8287*5c90c05cSAndroid Build Coastguard Worker # endif  // GTEST_OS_LINUX
8288*5c90c05cSAndroid Build Coastguard Worker 
8289*5c90c05cSAndroid Build Coastguard Worker # include <stdarg.h>
8290*5c90c05cSAndroid Build Coastguard Worker 
8291*5c90c05cSAndroid Build Coastguard Worker # if GTEST_OS_WINDOWS
8292*5c90c05cSAndroid Build Coastguard Worker #  include <windows.h>
8293*5c90c05cSAndroid Build Coastguard Worker # else
8294*5c90c05cSAndroid Build Coastguard Worker #  include <sys/mman.h>
8295*5c90c05cSAndroid Build Coastguard Worker #  include <sys/wait.h>
8296*5c90c05cSAndroid Build Coastguard Worker # endif  // GTEST_OS_WINDOWS
8297*5c90c05cSAndroid Build Coastguard Worker 
8298*5c90c05cSAndroid Build Coastguard Worker # if GTEST_OS_QNX
8299*5c90c05cSAndroid Build Coastguard Worker #  include <spawn.h>
8300*5c90c05cSAndroid Build Coastguard Worker # endif  // GTEST_OS_QNX
8301*5c90c05cSAndroid Build Coastguard Worker 
8302*5c90c05cSAndroid Build Coastguard Worker # if GTEST_OS_FUCHSIA
8303*5c90c05cSAndroid Build Coastguard Worker #  include <lib/fdio/fd.h>
8304*5c90c05cSAndroid Build Coastguard Worker #  include <lib/fdio/io.h>
8305*5c90c05cSAndroid Build Coastguard Worker #  include <lib/fdio/spawn.h>
8306*5c90c05cSAndroid Build Coastguard Worker #  include <lib/zx/channel.h>
8307*5c90c05cSAndroid Build Coastguard Worker #  include <lib/zx/port.h>
8308*5c90c05cSAndroid Build Coastguard Worker #  include <lib/zx/process.h>
8309*5c90c05cSAndroid Build Coastguard Worker #  include <lib/zx/socket.h>
8310*5c90c05cSAndroid Build Coastguard Worker #  include <zircon/processargs.h>
8311*5c90c05cSAndroid Build Coastguard Worker #  include <zircon/syscalls.h>
8312*5c90c05cSAndroid Build Coastguard Worker #  include <zircon/syscalls/policy.h>
8313*5c90c05cSAndroid Build Coastguard Worker #  include <zircon/syscalls/port.h>
8314*5c90c05cSAndroid Build Coastguard Worker # endif  // GTEST_OS_FUCHSIA
8315*5c90c05cSAndroid Build Coastguard Worker 
8316*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_HAS_DEATH_TEST
8317*5c90c05cSAndroid Build Coastguard Worker 
8318*5c90c05cSAndroid Build Coastguard Worker 
8319*5c90c05cSAndroid Build Coastguard Worker namespace testing {
8320*5c90c05cSAndroid Build Coastguard Worker 
8321*5c90c05cSAndroid Build Coastguard Worker // Constants.
8322*5c90c05cSAndroid Build Coastguard Worker 
8323*5c90c05cSAndroid Build Coastguard Worker // The default death test style.
8324*5c90c05cSAndroid Build Coastguard Worker //
8325*5c90c05cSAndroid Build Coastguard Worker // This is defined in internal/gtest-port.h as "fast", but can be overridden by
8326*5c90c05cSAndroid Build Coastguard Worker // a definition in internal/custom/gtest-port.h. The recommended value, which is
8327*5c90c05cSAndroid Build Coastguard Worker // used internally at Google, is "threadsafe".
8328*5c90c05cSAndroid Build Coastguard Worker static const char kDefaultDeathTestStyle[] = GTEST_DEFAULT_DEATH_TEST_STYLE;
8329*5c90c05cSAndroid Build Coastguard Worker 
8330*5c90c05cSAndroid Build Coastguard Worker GTEST_DEFINE_string_(
8331*5c90c05cSAndroid Build Coastguard Worker     death_test_style,
8332*5c90c05cSAndroid Build Coastguard Worker     internal::StringFromGTestEnv("death_test_style", kDefaultDeathTestStyle),
8333*5c90c05cSAndroid Build Coastguard Worker     "Indicates how to run a death test in a forked child process: "
8334*5c90c05cSAndroid Build Coastguard Worker     "\"threadsafe\" (child process re-executes the test binary "
8335*5c90c05cSAndroid Build Coastguard Worker     "from the beginning, running only the specific death test) or "
8336*5c90c05cSAndroid Build Coastguard Worker     "\"fast\" (child process runs the death test immediately "
8337*5c90c05cSAndroid Build Coastguard Worker     "after forking).");
8338*5c90c05cSAndroid Build Coastguard Worker 
8339*5c90c05cSAndroid Build Coastguard Worker GTEST_DEFINE_bool_(
8340*5c90c05cSAndroid Build Coastguard Worker     death_test_use_fork,
8341*5c90c05cSAndroid Build Coastguard Worker     internal::BoolFromGTestEnv("death_test_use_fork", false),
8342*5c90c05cSAndroid Build Coastguard Worker     "Instructs to use fork()/_exit() instead of clone() in death tests. "
8343*5c90c05cSAndroid Build Coastguard Worker     "Ignored and always uses fork() on POSIX systems where clone() is not "
8344*5c90c05cSAndroid Build Coastguard Worker     "implemented. Useful when running under valgrind or similar tools if "
8345*5c90c05cSAndroid Build Coastguard Worker     "those do not support clone(). Valgrind 3.3.1 will just fail if "
8346*5c90c05cSAndroid Build Coastguard Worker     "it sees an unsupported combination of clone() flags. "
8347*5c90c05cSAndroid Build Coastguard Worker     "It is not recommended to use this flag w/o valgrind though it will "
8348*5c90c05cSAndroid Build Coastguard Worker     "work in 99% of the cases. Once valgrind is fixed, this flag will "
8349*5c90c05cSAndroid Build Coastguard Worker     "most likely be removed.");
8350*5c90c05cSAndroid Build Coastguard Worker 
8351*5c90c05cSAndroid Build Coastguard Worker namespace internal {
8352*5c90c05cSAndroid Build Coastguard Worker GTEST_DEFINE_string_(
8353*5c90c05cSAndroid Build Coastguard Worker     internal_run_death_test, "",
8354*5c90c05cSAndroid Build Coastguard Worker     "Indicates the file, line number, temporal index of "
8355*5c90c05cSAndroid Build Coastguard Worker     "the single death test to run, and a file descriptor to "
8356*5c90c05cSAndroid Build Coastguard Worker     "which a success code may be sent, all separated by "
8357*5c90c05cSAndroid Build Coastguard Worker     "the '|' characters.  This flag is specified if and only if the "
8358*5c90c05cSAndroid Build Coastguard Worker     "current process is a sub-process launched for running a thread-safe "
8359*5c90c05cSAndroid Build Coastguard Worker     "death test.  FOR INTERNAL USE ONLY.");
8360*5c90c05cSAndroid Build Coastguard Worker }  // namespace internal
8361*5c90c05cSAndroid Build Coastguard Worker 
8362*5c90c05cSAndroid Build Coastguard Worker #if GTEST_HAS_DEATH_TEST
8363*5c90c05cSAndroid Build Coastguard Worker 
8364*5c90c05cSAndroid Build Coastguard Worker namespace internal {
8365*5c90c05cSAndroid Build Coastguard Worker 
8366*5c90c05cSAndroid Build Coastguard Worker // Valid only for fast death tests. Indicates the code is running in the
8367*5c90c05cSAndroid Build Coastguard Worker // child process of a fast style death test.
8368*5c90c05cSAndroid Build Coastguard Worker # if !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA
8369*5c90c05cSAndroid Build Coastguard Worker static bool g_in_fast_death_test_child = false;
8370*5c90c05cSAndroid Build Coastguard Worker # endif
8371*5c90c05cSAndroid Build Coastguard Worker 
8372*5c90c05cSAndroid Build Coastguard Worker // Returns a Boolean value indicating whether the caller is currently
8373*5c90c05cSAndroid Build Coastguard Worker // executing in the context of the death test child process.  Tools such as
8374*5c90c05cSAndroid Build Coastguard Worker // Valgrind heap checkers may need this to modify their behavior in death
8375*5c90c05cSAndroid Build Coastguard Worker // tests.  IMPORTANT: This is an internal utility.  Using it may break the
8376*5c90c05cSAndroid Build Coastguard Worker // implementation of death tests.  User code MUST NOT use it.
InDeathTestChild()8377*5c90c05cSAndroid Build Coastguard Worker bool InDeathTestChild() {
8378*5c90c05cSAndroid Build Coastguard Worker # if GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA
8379*5c90c05cSAndroid Build Coastguard Worker 
8380*5c90c05cSAndroid Build Coastguard Worker   // On Windows and Fuchsia, death tests are thread-safe regardless of the value
8381*5c90c05cSAndroid Build Coastguard Worker   // of the death_test_style flag.
8382*5c90c05cSAndroid Build Coastguard Worker   return !GTEST_FLAG(internal_run_death_test).empty();
8383*5c90c05cSAndroid Build Coastguard Worker 
8384*5c90c05cSAndroid Build Coastguard Worker # else
8385*5c90c05cSAndroid Build Coastguard Worker 
8386*5c90c05cSAndroid Build Coastguard Worker   if (GTEST_FLAG(death_test_style) == "threadsafe")
8387*5c90c05cSAndroid Build Coastguard Worker     return !GTEST_FLAG(internal_run_death_test).empty();
8388*5c90c05cSAndroid Build Coastguard Worker   else
8389*5c90c05cSAndroid Build Coastguard Worker     return g_in_fast_death_test_child;
8390*5c90c05cSAndroid Build Coastguard Worker #endif
8391*5c90c05cSAndroid Build Coastguard Worker }
8392*5c90c05cSAndroid Build Coastguard Worker 
8393*5c90c05cSAndroid Build Coastguard Worker }  // namespace internal
8394*5c90c05cSAndroid Build Coastguard Worker 
8395*5c90c05cSAndroid Build Coastguard Worker // ExitedWithCode constructor.
ExitedWithCode(int exit_code)8396*5c90c05cSAndroid Build Coastguard Worker ExitedWithCode::ExitedWithCode(int exit_code) : exit_code_(exit_code) {
8397*5c90c05cSAndroid Build Coastguard Worker }
8398*5c90c05cSAndroid Build Coastguard Worker 
8399*5c90c05cSAndroid Build Coastguard Worker // ExitedWithCode function-call operator.
operator ()(int exit_status) const8400*5c90c05cSAndroid Build Coastguard Worker bool ExitedWithCode::operator()(int exit_status) const {
8401*5c90c05cSAndroid Build Coastguard Worker # if GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA
8402*5c90c05cSAndroid Build Coastguard Worker 
8403*5c90c05cSAndroid Build Coastguard Worker   return exit_status == exit_code_;
8404*5c90c05cSAndroid Build Coastguard Worker 
8405*5c90c05cSAndroid Build Coastguard Worker # else
8406*5c90c05cSAndroid Build Coastguard Worker 
8407*5c90c05cSAndroid Build Coastguard Worker   return WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == exit_code_;
8408*5c90c05cSAndroid Build Coastguard Worker 
8409*5c90c05cSAndroid Build Coastguard Worker # endif  // GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA
8410*5c90c05cSAndroid Build Coastguard Worker }
8411*5c90c05cSAndroid Build Coastguard Worker 
8412*5c90c05cSAndroid Build Coastguard Worker # if !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA
8413*5c90c05cSAndroid Build Coastguard Worker // KilledBySignal constructor.
KilledBySignal(int signum)8414*5c90c05cSAndroid Build Coastguard Worker KilledBySignal::KilledBySignal(int signum) : signum_(signum) {
8415*5c90c05cSAndroid Build Coastguard Worker }
8416*5c90c05cSAndroid Build Coastguard Worker 
8417*5c90c05cSAndroid Build Coastguard Worker // KilledBySignal function-call operator.
operator ()(int exit_status) const8418*5c90c05cSAndroid Build Coastguard Worker bool KilledBySignal::operator()(int exit_status) const {
8419*5c90c05cSAndroid Build Coastguard Worker #  if defined(GTEST_KILLED_BY_SIGNAL_OVERRIDE_)
8420*5c90c05cSAndroid Build Coastguard Worker   {
8421*5c90c05cSAndroid Build Coastguard Worker     bool result;
8422*5c90c05cSAndroid Build Coastguard Worker     if (GTEST_KILLED_BY_SIGNAL_OVERRIDE_(signum_, exit_status, &result)) {
8423*5c90c05cSAndroid Build Coastguard Worker       return result;
8424*5c90c05cSAndroid Build Coastguard Worker     }
8425*5c90c05cSAndroid Build Coastguard Worker   }
8426*5c90c05cSAndroid Build Coastguard Worker #  endif  // defined(GTEST_KILLED_BY_SIGNAL_OVERRIDE_)
8427*5c90c05cSAndroid Build Coastguard Worker   return WIFSIGNALED(exit_status) && WTERMSIG(exit_status) == signum_;
8428*5c90c05cSAndroid Build Coastguard Worker }
8429*5c90c05cSAndroid Build Coastguard Worker # endif  // !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA
8430*5c90c05cSAndroid Build Coastguard Worker 
8431*5c90c05cSAndroid Build Coastguard Worker namespace internal {
8432*5c90c05cSAndroid Build Coastguard Worker 
8433*5c90c05cSAndroid Build Coastguard Worker // Utilities needed for death tests.
8434*5c90c05cSAndroid Build Coastguard Worker 
8435*5c90c05cSAndroid Build Coastguard Worker // Generates a textual description of a given exit code, in the format
8436*5c90c05cSAndroid Build Coastguard Worker // specified by wait(2).
ExitSummary(int exit_code)8437*5c90c05cSAndroid Build Coastguard Worker static std::string ExitSummary(int exit_code) {
8438*5c90c05cSAndroid Build Coastguard Worker   Message m;
8439*5c90c05cSAndroid Build Coastguard Worker 
8440*5c90c05cSAndroid Build Coastguard Worker # if GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA
8441*5c90c05cSAndroid Build Coastguard Worker 
8442*5c90c05cSAndroid Build Coastguard Worker   m << "Exited with exit status " << exit_code;
8443*5c90c05cSAndroid Build Coastguard Worker 
8444*5c90c05cSAndroid Build Coastguard Worker # else
8445*5c90c05cSAndroid Build Coastguard Worker 
8446*5c90c05cSAndroid Build Coastguard Worker   if (WIFEXITED(exit_code)) {
8447*5c90c05cSAndroid Build Coastguard Worker     m << "Exited with exit status " << WEXITSTATUS(exit_code);
8448*5c90c05cSAndroid Build Coastguard Worker   } else if (WIFSIGNALED(exit_code)) {
8449*5c90c05cSAndroid Build Coastguard Worker     m << "Terminated by signal " << WTERMSIG(exit_code);
8450*5c90c05cSAndroid Build Coastguard Worker   }
8451*5c90c05cSAndroid Build Coastguard Worker #  ifdef WCOREDUMP
8452*5c90c05cSAndroid Build Coastguard Worker   if (WCOREDUMP(exit_code)) {
8453*5c90c05cSAndroid Build Coastguard Worker     m << " (core dumped)";
8454*5c90c05cSAndroid Build Coastguard Worker   }
8455*5c90c05cSAndroid Build Coastguard Worker #  endif
8456*5c90c05cSAndroid Build Coastguard Worker # endif  // GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA
8457*5c90c05cSAndroid Build Coastguard Worker 
8458*5c90c05cSAndroid Build Coastguard Worker   return m.GetString();
8459*5c90c05cSAndroid Build Coastguard Worker }
8460*5c90c05cSAndroid Build Coastguard Worker 
8461*5c90c05cSAndroid Build Coastguard Worker // Returns true if exit_status describes a process that was terminated
8462*5c90c05cSAndroid Build Coastguard Worker // by a signal, or exited normally with a nonzero exit code.
ExitedUnsuccessfully(int exit_status)8463*5c90c05cSAndroid Build Coastguard Worker bool ExitedUnsuccessfully(int exit_status) {
8464*5c90c05cSAndroid Build Coastguard Worker   return !ExitedWithCode(0)(exit_status);
8465*5c90c05cSAndroid Build Coastguard Worker }
8466*5c90c05cSAndroid Build Coastguard Worker 
8467*5c90c05cSAndroid Build Coastguard Worker # if !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA
8468*5c90c05cSAndroid Build Coastguard Worker // Generates a textual failure message when a death test finds more than
8469*5c90c05cSAndroid Build Coastguard Worker // one thread running, or cannot determine the number of threads, prior
8470*5c90c05cSAndroid Build Coastguard Worker // to executing the given statement.  It is the responsibility of the
8471*5c90c05cSAndroid Build Coastguard Worker // caller not to pass a thread_count of 1.
DeathTestThreadWarning(size_t thread_count)8472*5c90c05cSAndroid Build Coastguard Worker static std::string DeathTestThreadWarning(size_t thread_count) {
8473*5c90c05cSAndroid Build Coastguard Worker   Message msg;
8474*5c90c05cSAndroid Build Coastguard Worker   msg << "Death tests use fork(), which is unsafe particularly"
8475*5c90c05cSAndroid Build Coastguard Worker       << " in a threaded context. For this test, " << GTEST_NAME_ << " ";
8476*5c90c05cSAndroid Build Coastguard Worker   if (thread_count == 0) {
8477*5c90c05cSAndroid Build Coastguard Worker     msg << "couldn't detect the number of threads.";
8478*5c90c05cSAndroid Build Coastguard Worker   } else {
8479*5c90c05cSAndroid Build Coastguard Worker     msg << "detected " << thread_count << " threads.";
8480*5c90c05cSAndroid Build Coastguard Worker   }
8481*5c90c05cSAndroid Build Coastguard Worker   msg << " See "
8482*5c90c05cSAndroid Build Coastguard Worker          "https://github.com/google/googletest/blob/master/docs/"
8483*5c90c05cSAndroid Build Coastguard Worker          "advanced.md#death-tests-and-threads"
8484*5c90c05cSAndroid Build Coastguard Worker       << " for more explanation and suggested solutions, especially if"
8485*5c90c05cSAndroid Build Coastguard Worker       << " this is the last message you see before your test times out.";
8486*5c90c05cSAndroid Build Coastguard Worker   return msg.GetString();
8487*5c90c05cSAndroid Build Coastguard Worker }
8488*5c90c05cSAndroid Build Coastguard Worker # endif  // !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA
8489*5c90c05cSAndroid Build Coastguard Worker 
8490*5c90c05cSAndroid Build Coastguard Worker // Flag characters for reporting a death test that did not die.
8491*5c90c05cSAndroid Build Coastguard Worker static const char kDeathTestLived = 'L';
8492*5c90c05cSAndroid Build Coastguard Worker static const char kDeathTestReturned = 'R';
8493*5c90c05cSAndroid Build Coastguard Worker static const char kDeathTestThrew = 'T';
8494*5c90c05cSAndroid Build Coastguard Worker static const char kDeathTestInternalError = 'I';
8495*5c90c05cSAndroid Build Coastguard Worker 
8496*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_FUCHSIA
8497*5c90c05cSAndroid Build Coastguard Worker 
8498*5c90c05cSAndroid Build Coastguard Worker // File descriptor used for the pipe in the child process.
8499*5c90c05cSAndroid Build Coastguard Worker static const int kFuchsiaReadPipeFd = 3;
8500*5c90c05cSAndroid Build Coastguard Worker 
8501*5c90c05cSAndroid Build Coastguard Worker #endif
8502*5c90c05cSAndroid Build Coastguard Worker 
8503*5c90c05cSAndroid Build Coastguard Worker // An enumeration describing all of the possible ways that a death test can
8504*5c90c05cSAndroid Build Coastguard Worker // conclude.  DIED means that the process died while executing the test
8505*5c90c05cSAndroid Build Coastguard Worker // code; LIVED means that process lived beyond the end of the test code;
8506*5c90c05cSAndroid Build Coastguard Worker // RETURNED means that the test statement attempted to execute a return
8507*5c90c05cSAndroid Build Coastguard Worker // statement, which is not allowed; THREW means that the test statement
8508*5c90c05cSAndroid Build Coastguard Worker // returned control by throwing an exception.  IN_PROGRESS means the test
8509*5c90c05cSAndroid Build Coastguard Worker // has not yet concluded.
8510*5c90c05cSAndroid Build Coastguard Worker enum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED, THREW };
8511*5c90c05cSAndroid Build Coastguard Worker 
8512*5c90c05cSAndroid Build Coastguard Worker // Routine for aborting the program which is safe to call from an
8513*5c90c05cSAndroid Build Coastguard Worker // exec-style death test child process, in which case the error
8514*5c90c05cSAndroid Build Coastguard Worker // message is propagated back to the parent process.  Otherwise, the
8515*5c90c05cSAndroid Build Coastguard Worker // message is simply printed to stderr.  In either case, the program
8516*5c90c05cSAndroid Build Coastguard Worker // then exits with status 1.
DeathTestAbort(const std::string & message)8517*5c90c05cSAndroid Build Coastguard Worker static void DeathTestAbort(const std::string& message) {
8518*5c90c05cSAndroid Build Coastguard Worker   // On a POSIX system, this function may be called from a threadsafe-style
8519*5c90c05cSAndroid Build Coastguard Worker   // death test child process, which operates on a very small stack.  Use
8520*5c90c05cSAndroid Build Coastguard Worker   // the heap for any additional non-minuscule memory requirements.
8521*5c90c05cSAndroid Build Coastguard Worker   const InternalRunDeathTestFlag* const flag =
8522*5c90c05cSAndroid Build Coastguard Worker       GetUnitTestImpl()->internal_run_death_test_flag();
8523*5c90c05cSAndroid Build Coastguard Worker   if (flag != nullptr) {
8524*5c90c05cSAndroid Build Coastguard Worker     FILE* parent = posix::FDOpen(flag->write_fd(), "w");
8525*5c90c05cSAndroid Build Coastguard Worker     fputc(kDeathTestInternalError, parent);
8526*5c90c05cSAndroid Build Coastguard Worker     fprintf(parent, "%s", message.c_str());
8527*5c90c05cSAndroid Build Coastguard Worker     fflush(parent);
8528*5c90c05cSAndroid Build Coastguard Worker     _exit(1);
8529*5c90c05cSAndroid Build Coastguard Worker   } else {
8530*5c90c05cSAndroid Build Coastguard Worker     fprintf(stderr, "%s", message.c_str());
8531*5c90c05cSAndroid Build Coastguard Worker     fflush(stderr);
8532*5c90c05cSAndroid Build Coastguard Worker     posix::Abort();
8533*5c90c05cSAndroid Build Coastguard Worker   }
8534*5c90c05cSAndroid Build Coastguard Worker }
8535*5c90c05cSAndroid Build Coastguard Worker 
8536*5c90c05cSAndroid Build Coastguard Worker // A replacement for CHECK that calls DeathTestAbort if the assertion
8537*5c90c05cSAndroid Build Coastguard Worker // fails.
8538*5c90c05cSAndroid Build Coastguard Worker # define GTEST_DEATH_TEST_CHECK_(expression) \
8539*5c90c05cSAndroid Build Coastguard Worker   do { \
8540*5c90c05cSAndroid Build Coastguard Worker     if (!::testing::internal::IsTrue(expression)) { \
8541*5c90c05cSAndroid Build Coastguard Worker       DeathTestAbort( \
8542*5c90c05cSAndroid Build Coastguard Worker           ::std::string("CHECK failed: File ") + __FILE__ +  ", line " \
8543*5c90c05cSAndroid Build Coastguard Worker           + ::testing::internal::StreamableToString(__LINE__) + ": " \
8544*5c90c05cSAndroid Build Coastguard Worker           + #expression); \
8545*5c90c05cSAndroid Build Coastguard Worker     } \
8546*5c90c05cSAndroid Build Coastguard Worker   } while (::testing::internal::AlwaysFalse())
8547*5c90c05cSAndroid Build Coastguard Worker 
8548*5c90c05cSAndroid Build Coastguard Worker // This macro is similar to GTEST_DEATH_TEST_CHECK_, but it is meant for
8549*5c90c05cSAndroid Build Coastguard Worker // evaluating any system call that fulfills two conditions: it must return
8550*5c90c05cSAndroid Build Coastguard Worker // -1 on failure, and set errno to EINTR when it is interrupted and
8551*5c90c05cSAndroid Build Coastguard Worker // should be tried again.  The macro expands to a loop that repeatedly
8552*5c90c05cSAndroid Build Coastguard Worker // evaluates the expression as long as it evaluates to -1 and sets
8553*5c90c05cSAndroid Build Coastguard Worker // errno to EINTR.  If the expression evaluates to -1 but errno is
8554*5c90c05cSAndroid Build Coastguard Worker // something other than EINTR, DeathTestAbort is called.
8555*5c90c05cSAndroid Build Coastguard Worker # define GTEST_DEATH_TEST_CHECK_SYSCALL_(expression) \
8556*5c90c05cSAndroid Build Coastguard Worker   do { \
8557*5c90c05cSAndroid Build Coastguard Worker     int gtest_retval; \
8558*5c90c05cSAndroid Build Coastguard Worker     do { \
8559*5c90c05cSAndroid Build Coastguard Worker       gtest_retval = (expression); \
8560*5c90c05cSAndroid Build Coastguard Worker     } while (gtest_retval == -1 && errno == EINTR); \
8561*5c90c05cSAndroid Build Coastguard Worker     if (gtest_retval == -1) { \
8562*5c90c05cSAndroid Build Coastguard Worker       DeathTestAbort( \
8563*5c90c05cSAndroid Build Coastguard Worker           ::std::string("CHECK failed: File ") + __FILE__ + ", line " \
8564*5c90c05cSAndroid Build Coastguard Worker           + ::testing::internal::StreamableToString(__LINE__) + ": " \
8565*5c90c05cSAndroid Build Coastguard Worker           + #expression + " != -1"); \
8566*5c90c05cSAndroid Build Coastguard Worker     } \
8567*5c90c05cSAndroid Build Coastguard Worker   } while (::testing::internal::AlwaysFalse())
8568*5c90c05cSAndroid Build Coastguard Worker 
8569*5c90c05cSAndroid Build Coastguard Worker // Returns the message describing the last system error in errno.
GetLastErrnoDescription()8570*5c90c05cSAndroid Build Coastguard Worker std::string GetLastErrnoDescription() {
8571*5c90c05cSAndroid Build Coastguard Worker     return errno == 0 ? "" : posix::StrError(errno);
8572*5c90c05cSAndroid Build Coastguard Worker }
8573*5c90c05cSAndroid Build Coastguard Worker 
8574*5c90c05cSAndroid Build Coastguard Worker // This is called from a death test parent process to read a failure
8575*5c90c05cSAndroid Build Coastguard Worker // message from the death test child process and log it with the FATAL
8576*5c90c05cSAndroid Build Coastguard Worker // severity. On Windows, the message is read from a pipe handle. On other
8577*5c90c05cSAndroid Build Coastguard Worker // platforms, it is read from a file descriptor.
FailFromInternalError(int fd)8578*5c90c05cSAndroid Build Coastguard Worker static void FailFromInternalError(int fd) {
8579*5c90c05cSAndroid Build Coastguard Worker   Message error;
8580*5c90c05cSAndroid Build Coastguard Worker   char buffer[256];
8581*5c90c05cSAndroid Build Coastguard Worker   int num_read;
8582*5c90c05cSAndroid Build Coastguard Worker 
8583*5c90c05cSAndroid Build Coastguard Worker   do {
8584*5c90c05cSAndroid Build Coastguard Worker     while ((num_read = posix::Read(fd, buffer, 255)) > 0) {
8585*5c90c05cSAndroid Build Coastguard Worker       buffer[num_read] = '\0';
8586*5c90c05cSAndroid Build Coastguard Worker       error << buffer;
8587*5c90c05cSAndroid Build Coastguard Worker     }
8588*5c90c05cSAndroid Build Coastguard Worker   } while (num_read == -1 && errno == EINTR);
8589*5c90c05cSAndroid Build Coastguard Worker 
8590*5c90c05cSAndroid Build Coastguard Worker   if (num_read == 0) {
8591*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOG_(FATAL) << error.GetString();
8592*5c90c05cSAndroid Build Coastguard Worker   } else {
8593*5c90c05cSAndroid Build Coastguard Worker     const int last_error = errno;
8594*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOG_(FATAL) << "Error while reading death test internal: "
8595*5c90c05cSAndroid Build Coastguard Worker                       << GetLastErrnoDescription() << " [" << last_error << "]";
8596*5c90c05cSAndroid Build Coastguard Worker   }
8597*5c90c05cSAndroid Build Coastguard Worker }
8598*5c90c05cSAndroid Build Coastguard Worker 
8599*5c90c05cSAndroid Build Coastguard Worker // Death test constructor.  Increments the running death test count
8600*5c90c05cSAndroid Build Coastguard Worker // for the current test.
DeathTest()8601*5c90c05cSAndroid Build Coastguard Worker DeathTest::DeathTest() {
8602*5c90c05cSAndroid Build Coastguard Worker   TestInfo* const info = GetUnitTestImpl()->current_test_info();
8603*5c90c05cSAndroid Build Coastguard Worker   if (info == nullptr) {
8604*5c90c05cSAndroid Build Coastguard Worker     DeathTestAbort("Cannot run a death test outside of a TEST or "
8605*5c90c05cSAndroid Build Coastguard Worker                    "TEST_F construct");
8606*5c90c05cSAndroid Build Coastguard Worker   }
8607*5c90c05cSAndroid Build Coastguard Worker }
8608*5c90c05cSAndroid Build Coastguard Worker 
8609*5c90c05cSAndroid Build Coastguard Worker // Creates and returns a death test by dispatching to the current
8610*5c90c05cSAndroid Build Coastguard Worker // death test factory.
Create(const char * statement,Matcher<const std::string &> matcher,const char * file,int line,DeathTest ** test)8611*5c90c05cSAndroid Build Coastguard Worker bool DeathTest::Create(const char* statement,
8612*5c90c05cSAndroid Build Coastguard Worker                        Matcher<const std::string&> matcher, const char* file,
8613*5c90c05cSAndroid Build Coastguard Worker                        int line, DeathTest** test) {
8614*5c90c05cSAndroid Build Coastguard Worker   return GetUnitTestImpl()->death_test_factory()->Create(
8615*5c90c05cSAndroid Build Coastguard Worker       statement, std::move(matcher), file, line, test);
8616*5c90c05cSAndroid Build Coastguard Worker }
8617*5c90c05cSAndroid Build Coastguard Worker 
LastMessage()8618*5c90c05cSAndroid Build Coastguard Worker const char* DeathTest::LastMessage() {
8619*5c90c05cSAndroid Build Coastguard Worker   return last_death_test_message_.c_str();
8620*5c90c05cSAndroid Build Coastguard Worker }
8621*5c90c05cSAndroid Build Coastguard Worker 
set_last_death_test_message(const std::string & message)8622*5c90c05cSAndroid Build Coastguard Worker void DeathTest::set_last_death_test_message(const std::string& message) {
8623*5c90c05cSAndroid Build Coastguard Worker   last_death_test_message_ = message;
8624*5c90c05cSAndroid Build Coastguard Worker }
8625*5c90c05cSAndroid Build Coastguard Worker 
8626*5c90c05cSAndroid Build Coastguard Worker std::string DeathTest::last_death_test_message_;
8627*5c90c05cSAndroid Build Coastguard Worker 
8628*5c90c05cSAndroid Build Coastguard Worker // Provides cross platform implementation for some death functionality.
8629*5c90c05cSAndroid Build Coastguard Worker class DeathTestImpl : public DeathTest {
8630*5c90c05cSAndroid Build Coastguard Worker  protected:
DeathTestImpl(const char * a_statement,Matcher<const std::string &> matcher)8631*5c90c05cSAndroid Build Coastguard Worker   DeathTestImpl(const char* a_statement, Matcher<const std::string&> matcher)
8632*5c90c05cSAndroid Build Coastguard Worker       : statement_(a_statement),
8633*5c90c05cSAndroid Build Coastguard Worker         matcher_(std::move(matcher)),
8634*5c90c05cSAndroid Build Coastguard Worker         spawned_(false),
8635*5c90c05cSAndroid Build Coastguard Worker         status_(-1),
8636*5c90c05cSAndroid Build Coastguard Worker         outcome_(IN_PROGRESS),
8637*5c90c05cSAndroid Build Coastguard Worker         read_fd_(-1),
8638*5c90c05cSAndroid Build Coastguard Worker         write_fd_(-1) {}
8639*5c90c05cSAndroid Build Coastguard Worker 
8640*5c90c05cSAndroid Build Coastguard Worker   // read_fd_ is expected to be closed and cleared by a derived class.
~DeathTestImpl()8641*5c90c05cSAndroid Build Coastguard Worker   ~DeathTestImpl() override { GTEST_DEATH_TEST_CHECK_(read_fd_ == -1); }
8642*5c90c05cSAndroid Build Coastguard Worker 
8643*5c90c05cSAndroid Build Coastguard Worker   void Abort(AbortReason reason) override;
8644*5c90c05cSAndroid Build Coastguard Worker   bool Passed(bool status_ok) override;
8645*5c90c05cSAndroid Build Coastguard Worker 
statement() const8646*5c90c05cSAndroid Build Coastguard Worker   const char* statement() const { return statement_; }
spawned() const8647*5c90c05cSAndroid Build Coastguard Worker   bool spawned() const { return spawned_; }
set_spawned(bool is_spawned)8648*5c90c05cSAndroid Build Coastguard Worker   void set_spawned(bool is_spawned) { spawned_ = is_spawned; }
status() const8649*5c90c05cSAndroid Build Coastguard Worker   int status() const { return status_; }
set_status(int a_status)8650*5c90c05cSAndroid Build Coastguard Worker   void set_status(int a_status) { status_ = a_status; }
outcome() const8651*5c90c05cSAndroid Build Coastguard Worker   DeathTestOutcome outcome() const { return outcome_; }
set_outcome(DeathTestOutcome an_outcome)8652*5c90c05cSAndroid Build Coastguard Worker   void set_outcome(DeathTestOutcome an_outcome) { outcome_ = an_outcome; }
read_fd() const8653*5c90c05cSAndroid Build Coastguard Worker   int read_fd() const { return read_fd_; }
set_read_fd(int fd)8654*5c90c05cSAndroid Build Coastguard Worker   void set_read_fd(int fd) { read_fd_ = fd; }
write_fd() const8655*5c90c05cSAndroid Build Coastguard Worker   int write_fd() const { return write_fd_; }
set_write_fd(int fd)8656*5c90c05cSAndroid Build Coastguard Worker   void set_write_fd(int fd) { write_fd_ = fd; }
8657*5c90c05cSAndroid Build Coastguard Worker 
8658*5c90c05cSAndroid Build Coastguard Worker   // Called in the parent process only. Reads the result code of the death
8659*5c90c05cSAndroid Build Coastguard Worker   // test child process via a pipe, interprets it to set the outcome_
8660*5c90c05cSAndroid Build Coastguard Worker   // member, and closes read_fd_.  Outputs diagnostics and terminates in
8661*5c90c05cSAndroid Build Coastguard Worker   // case of unexpected codes.
8662*5c90c05cSAndroid Build Coastguard Worker   void ReadAndInterpretStatusByte();
8663*5c90c05cSAndroid Build Coastguard Worker 
8664*5c90c05cSAndroid Build Coastguard Worker   // Returns stderr output from the child process.
8665*5c90c05cSAndroid Build Coastguard Worker   virtual std::string GetErrorLogs();
8666*5c90c05cSAndroid Build Coastguard Worker 
8667*5c90c05cSAndroid Build Coastguard Worker  private:
8668*5c90c05cSAndroid Build Coastguard Worker   // The textual content of the code this object is testing.  This class
8669*5c90c05cSAndroid Build Coastguard Worker   // doesn't own this string and should not attempt to delete it.
8670*5c90c05cSAndroid Build Coastguard Worker   const char* const statement_;
8671*5c90c05cSAndroid Build Coastguard Worker   // A matcher that's expected to match the stderr output by the child process.
8672*5c90c05cSAndroid Build Coastguard Worker   Matcher<const std::string&> matcher_;
8673*5c90c05cSAndroid Build Coastguard Worker   // True if the death test child process has been successfully spawned.
8674*5c90c05cSAndroid Build Coastguard Worker   bool spawned_;
8675*5c90c05cSAndroid Build Coastguard Worker   // The exit status of the child process.
8676*5c90c05cSAndroid Build Coastguard Worker   int status_;
8677*5c90c05cSAndroid Build Coastguard Worker   // How the death test concluded.
8678*5c90c05cSAndroid Build Coastguard Worker   DeathTestOutcome outcome_;
8679*5c90c05cSAndroid Build Coastguard Worker   // Descriptor to the read end of the pipe to the child process.  It is
8680*5c90c05cSAndroid Build Coastguard Worker   // always -1 in the child process.  The child keeps its write end of the
8681*5c90c05cSAndroid Build Coastguard Worker   // pipe in write_fd_.
8682*5c90c05cSAndroid Build Coastguard Worker   int read_fd_;
8683*5c90c05cSAndroid Build Coastguard Worker   // Descriptor to the child's write end of the pipe to the parent process.
8684*5c90c05cSAndroid Build Coastguard Worker   // It is always -1 in the parent process.  The parent keeps its end of the
8685*5c90c05cSAndroid Build Coastguard Worker   // pipe in read_fd_.
8686*5c90c05cSAndroid Build Coastguard Worker   int write_fd_;
8687*5c90c05cSAndroid Build Coastguard Worker };
8688*5c90c05cSAndroid Build Coastguard Worker 
8689*5c90c05cSAndroid Build Coastguard Worker // Called in the parent process only. Reads the result code of the death
8690*5c90c05cSAndroid Build Coastguard Worker // test child process via a pipe, interprets it to set the outcome_
8691*5c90c05cSAndroid Build Coastguard Worker // member, and closes read_fd_.  Outputs diagnostics and terminates in
8692*5c90c05cSAndroid Build Coastguard Worker // case of unexpected codes.
ReadAndInterpretStatusByte()8693*5c90c05cSAndroid Build Coastguard Worker void DeathTestImpl::ReadAndInterpretStatusByte() {
8694*5c90c05cSAndroid Build Coastguard Worker   char flag;
8695*5c90c05cSAndroid Build Coastguard Worker   int bytes_read;
8696*5c90c05cSAndroid Build Coastguard Worker 
8697*5c90c05cSAndroid Build Coastguard Worker   // The read() here blocks until data is available (signifying the
8698*5c90c05cSAndroid Build Coastguard Worker   // failure of the death test) or until the pipe is closed (signifying
8699*5c90c05cSAndroid Build Coastguard Worker   // its success), so it's okay to call this in the parent before
8700*5c90c05cSAndroid Build Coastguard Worker   // the child process has exited.
8701*5c90c05cSAndroid Build Coastguard Worker   do {
8702*5c90c05cSAndroid Build Coastguard Worker     bytes_read = posix::Read(read_fd(), &flag, 1);
8703*5c90c05cSAndroid Build Coastguard Worker   } while (bytes_read == -1 && errno == EINTR);
8704*5c90c05cSAndroid Build Coastguard Worker 
8705*5c90c05cSAndroid Build Coastguard Worker   if (bytes_read == 0) {
8706*5c90c05cSAndroid Build Coastguard Worker     set_outcome(DIED);
8707*5c90c05cSAndroid Build Coastguard Worker   } else if (bytes_read == 1) {
8708*5c90c05cSAndroid Build Coastguard Worker     switch (flag) {
8709*5c90c05cSAndroid Build Coastguard Worker       case kDeathTestReturned:
8710*5c90c05cSAndroid Build Coastguard Worker         set_outcome(RETURNED);
8711*5c90c05cSAndroid Build Coastguard Worker         break;
8712*5c90c05cSAndroid Build Coastguard Worker       case kDeathTestThrew:
8713*5c90c05cSAndroid Build Coastguard Worker         set_outcome(THREW);
8714*5c90c05cSAndroid Build Coastguard Worker         break;
8715*5c90c05cSAndroid Build Coastguard Worker       case kDeathTestLived:
8716*5c90c05cSAndroid Build Coastguard Worker         set_outcome(LIVED);
8717*5c90c05cSAndroid Build Coastguard Worker         break;
8718*5c90c05cSAndroid Build Coastguard Worker       case kDeathTestInternalError:
8719*5c90c05cSAndroid Build Coastguard Worker         FailFromInternalError(read_fd());  // Does not return.
8720*5c90c05cSAndroid Build Coastguard Worker         break;
8721*5c90c05cSAndroid Build Coastguard Worker       default:
8722*5c90c05cSAndroid Build Coastguard Worker         GTEST_LOG_(FATAL) << "Death test child process reported "
8723*5c90c05cSAndroid Build Coastguard Worker                           << "unexpected status byte ("
8724*5c90c05cSAndroid Build Coastguard Worker                           << static_cast<unsigned int>(flag) << ")";
8725*5c90c05cSAndroid Build Coastguard Worker     }
8726*5c90c05cSAndroid Build Coastguard Worker   } else {
8727*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOG_(FATAL) << "Read from death test child process failed: "
8728*5c90c05cSAndroid Build Coastguard Worker                       << GetLastErrnoDescription();
8729*5c90c05cSAndroid Build Coastguard Worker   }
8730*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Close(read_fd()));
8731*5c90c05cSAndroid Build Coastguard Worker   set_read_fd(-1);
8732*5c90c05cSAndroid Build Coastguard Worker }
8733*5c90c05cSAndroid Build Coastguard Worker 
GetErrorLogs()8734*5c90c05cSAndroid Build Coastguard Worker std::string DeathTestImpl::GetErrorLogs() {
8735*5c90c05cSAndroid Build Coastguard Worker   return GetCapturedStderr();
8736*5c90c05cSAndroid Build Coastguard Worker }
8737*5c90c05cSAndroid Build Coastguard Worker 
8738*5c90c05cSAndroid Build Coastguard Worker // Signals that the death test code which should have exited, didn't.
8739*5c90c05cSAndroid Build Coastguard Worker // Should be called only in a death test child process.
8740*5c90c05cSAndroid Build Coastguard Worker // Writes a status byte to the child's status file descriptor, then
8741*5c90c05cSAndroid Build Coastguard Worker // calls _exit(1).
Abort(AbortReason reason)8742*5c90c05cSAndroid Build Coastguard Worker void DeathTestImpl::Abort(AbortReason reason) {
8743*5c90c05cSAndroid Build Coastguard Worker   // The parent process considers the death test to be a failure if
8744*5c90c05cSAndroid Build Coastguard Worker   // it finds any data in our pipe.  So, here we write a single flag byte
8745*5c90c05cSAndroid Build Coastguard Worker   // to the pipe, then exit.
8746*5c90c05cSAndroid Build Coastguard Worker   const char status_ch =
8747*5c90c05cSAndroid Build Coastguard Worker       reason == TEST_DID_NOT_DIE ? kDeathTestLived :
8748*5c90c05cSAndroid Build Coastguard Worker       reason == TEST_THREW_EXCEPTION ? kDeathTestThrew : kDeathTestReturned;
8749*5c90c05cSAndroid Build Coastguard Worker 
8750*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Write(write_fd(), &status_ch, 1));
8751*5c90c05cSAndroid Build Coastguard Worker   // We are leaking the descriptor here because on some platforms (i.e.,
8752*5c90c05cSAndroid Build Coastguard Worker   // when built as Windows DLL), destructors of global objects will still
8753*5c90c05cSAndroid Build Coastguard Worker   // run after calling _exit(). On such systems, write_fd_ will be
8754*5c90c05cSAndroid Build Coastguard Worker   // indirectly closed from the destructor of UnitTestImpl, causing double
8755*5c90c05cSAndroid Build Coastguard Worker   // close if it is also closed here. On debug configurations, double close
8756*5c90c05cSAndroid Build Coastguard Worker   // may assert. As there are no in-process buffers to flush here, we are
8757*5c90c05cSAndroid Build Coastguard Worker   // relying on the OS to close the descriptor after the process terminates
8758*5c90c05cSAndroid Build Coastguard Worker   // when the destructors are not run.
8759*5c90c05cSAndroid Build Coastguard Worker   _exit(1);  // Exits w/o any normal exit hooks (we were supposed to crash)
8760*5c90c05cSAndroid Build Coastguard Worker }
8761*5c90c05cSAndroid Build Coastguard Worker 
8762*5c90c05cSAndroid Build Coastguard Worker // Returns an indented copy of stderr output for a death test.
8763*5c90c05cSAndroid Build Coastguard Worker // This makes distinguishing death test output lines from regular log lines
8764*5c90c05cSAndroid Build Coastguard Worker // much easier.
FormatDeathTestOutput(const::std::string & output)8765*5c90c05cSAndroid Build Coastguard Worker static ::std::string FormatDeathTestOutput(const ::std::string& output) {
8766*5c90c05cSAndroid Build Coastguard Worker   ::std::string ret;
8767*5c90c05cSAndroid Build Coastguard Worker   for (size_t at = 0; ; ) {
8768*5c90c05cSAndroid Build Coastguard Worker     const size_t line_end = output.find('\n', at);
8769*5c90c05cSAndroid Build Coastguard Worker     ret += "[  DEATH   ] ";
8770*5c90c05cSAndroid Build Coastguard Worker     if (line_end == ::std::string::npos) {
8771*5c90c05cSAndroid Build Coastguard Worker       ret += output.substr(at);
8772*5c90c05cSAndroid Build Coastguard Worker       break;
8773*5c90c05cSAndroid Build Coastguard Worker     }
8774*5c90c05cSAndroid Build Coastguard Worker     ret += output.substr(at, line_end + 1 - at);
8775*5c90c05cSAndroid Build Coastguard Worker     at = line_end + 1;
8776*5c90c05cSAndroid Build Coastguard Worker   }
8777*5c90c05cSAndroid Build Coastguard Worker   return ret;
8778*5c90c05cSAndroid Build Coastguard Worker }
8779*5c90c05cSAndroid Build Coastguard Worker 
8780*5c90c05cSAndroid Build Coastguard Worker // Assesses the success or failure of a death test, using both private
8781*5c90c05cSAndroid Build Coastguard Worker // members which have previously been set, and one argument:
8782*5c90c05cSAndroid Build Coastguard Worker //
8783*5c90c05cSAndroid Build Coastguard Worker // Private data members:
8784*5c90c05cSAndroid Build Coastguard Worker //   outcome:  An enumeration describing how the death test
8785*5c90c05cSAndroid Build Coastguard Worker //             concluded: DIED, LIVED, THREW, or RETURNED.  The death test
8786*5c90c05cSAndroid Build Coastguard Worker //             fails in the latter three cases.
8787*5c90c05cSAndroid Build Coastguard Worker //   status:   The exit status of the child process. On *nix, it is in the
8788*5c90c05cSAndroid Build Coastguard Worker //             in the format specified by wait(2). On Windows, this is the
8789*5c90c05cSAndroid Build Coastguard Worker //             value supplied to the ExitProcess() API or a numeric code
8790*5c90c05cSAndroid Build Coastguard Worker //             of the exception that terminated the program.
8791*5c90c05cSAndroid Build Coastguard Worker //   matcher_: A matcher that's expected to match the stderr output by the child
8792*5c90c05cSAndroid Build Coastguard Worker //             process.
8793*5c90c05cSAndroid Build Coastguard Worker //
8794*5c90c05cSAndroid Build Coastguard Worker // Argument:
8795*5c90c05cSAndroid Build Coastguard Worker //   status_ok: true if exit_status is acceptable in the context of
8796*5c90c05cSAndroid Build Coastguard Worker //              this particular death test, which fails if it is false
8797*5c90c05cSAndroid Build Coastguard Worker //
8798*5c90c05cSAndroid Build Coastguard Worker // Returns true if and only if all of the above conditions are met.  Otherwise,
8799*5c90c05cSAndroid Build Coastguard Worker // the first failing condition, in the order given above, is the one that is
8800*5c90c05cSAndroid Build Coastguard Worker // reported. Also sets the last death test message string.
Passed(bool status_ok)8801*5c90c05cSAndroid Build Coastguard Worker bool DeathTestImpl::Passed(bool status_ok) {
8802*5c90c05cSAndroid Build Coastguard Worker   if (!spawned())
8803*5c90c05cSAndroid Build Coastguard Worker     return false;
8804*5c90c05cSAndroid Build Coastguard Worker 
8805*5c90c05cSAndroid Build Coastguard Worker   const std::string error_message = GetErrorLogs();
8806*5c90c05cSAndroid Build Coastguard Worker 
8807*5c90c05cSAndroid Build Coastguard Worker   bool success = false;
8808*5c90c05cSAndroid Build Coastguard Worker   Message buffer;
8809*5c90c05cSAndroid Build Coastguard Worker 
8810*5c90c05cSAndroid Build Coastguard Worker   buffer << "Death test: " << statement() << "\n";
8811*5c90c05cSAndroid Build Coastguard Worker   switch (outcome()) {
8812*5c90c05cSAndroid Build Coastguard Worker     case LIVED:
8813*5c90c05cSAndroid Build Coastguard Worker       buffer << "    Result: failed to die.\n"
8814*5c90c05cSAndroid Build Coastguard Worker              << " Error msg:\n" << FormatDeathTestOutput(error_message);
8815*5c90c05cSAndroid Build Coastguard Worker       break;
8816*5c90c05cSAndroid Build Coastguard Worker     case THREW:
8817*5c90c05cSAndroid Build Coastguard Worker       buffer << "    Result: threw an exception.\n"
8818*5c90c05cSAndroid Build Coastguard Worker              << " Error msg:\n" << FormatDeathTestOutput(error_message);
8819*5c90c05cSAndroid Build Coastguard Worker       break;
8820*5c90c05cSAndroid Build Coastguard Worker     case RETURNED:
8821*5c90c05cSAndroid Build Coastguard Worker       buffer << "    Result: illegal return in test statement.\n"
8822*5c90c05cSAndroid Build Coastguard Worker              << " Error msg:\n" << FormatDeathTestOutput(error_message);
8823*5c90c05cSAndroid Build Coastguard Worker       break;
8824*5c90c05cSAndroid Build Coastguard Worker     case DIED:
8825*5c90c05cSAndroid Build Coastguard Worker       if (status_ok) {
8826*5c90c05cSAndroid Build Coastguard Worker         if (matcher_.Matches(error_message)) {
8827*5c90c05cSAndroid Build Coastguard Worker           success = true;
8828*5c90c05cSAndroid Build Coastguard Worker         } else {
8829*5c90c05cSAndroid Build Coastguard Worker           std::ostringstream stream;
8830*5c90c05cSAndroid Build Coastguard Worker           matcher_.DescribeTo(&stream);
8831*5c90c05cSAndroid Build Coastguard Worker           buffer << "    Result: died but not with expected error.\n"
8832*5c90c05cSAndroid Build Coastguard Worker                  << "  Expected: " << stream.str() << "\n"
8833*5c90c05cSAndroid Build Coastguard Worker                  << "Actual msg:\n"
8834*5c90c05cSAndroid Build Coastguard Worker                  << FormatDeathTestOutput(error_message);
8835*5c90c05cSAndroid Build Coastguard Worker         }
8836*5c90c05cSAndroid Build Coastguard Worker       } else {
8837*5c90c05cSAndroid Build Coastguard Worker         buffer << "    Result: died but not with expected exit code:\n"
8838*5c90c05cSAndroid Build Coastguard Worker                << "            " << ExitSummary(status()) << "\n"
8839*5c90c05cSAndroid Build Coastguard Worker                << "Actual msg:\n" << FormatDeathTestOutput(error_message);
8840*5c90c05cSAndroid Build Coastguard Worker       }
8841*5c90c05cSAndroid Build Coastguard Worker       break;
8842*5c90c05cSAndroid Build Coastguard Worker     case IN_PROGRESS:
8843*5c90c05cSAndroid Build Coastguard Worker     default:
8844*5c90c05cSAndroid Build Coastguard Worker       GTEST_LOG_(FATAL)
8845*5c90c05cSAndroid Build Coastguard Worker           << "DeathTest::Passed somehow called before conclusion of test";
8846*5c90c05cSAndroid Build Coastguard Worker   }
8847*5c90c05cSAndroid Build Coastguard Worker 
8848*5c90c05cSAndroid Build Coastguard Worker   DeathTest::set_last_death_test_message(buffer.GetString());
8849*5c90c05cSAndroid Build Coastguard Worker   return success;
8850*5c90c05cSAndroid Build Coastguard Worker }
8851*5c90c05cSAndroid Build Coastguard Worker 
8852*5c90c05cSAndroid Build Coastguard Worker # if GTEST_OS_WINDOWS
8853*5c90c05cSAndroid Build Coastguard Worker // WindowsDeathTest implements death tests on Windows. Due to the
8854*5c90c05cSAndroid Build Coastguard Worker // specifics of starting new processes on Windows, death tests there are
8855*5c90c05cSAndroid Build Coastguard Worker // always threadsafe, and Google Test considers the
8856*5c90c05cSAndroid Build Coastguard Worker // --gtest_death_test_style=fast setting to be equivalent to
8857*5c90c05cSAndroid Build Coastguard Worker // --gtest_death_test_style=threadsafe there.
8858*5c90c05cSAndroid Build Coastguard Worker //
8859*5c90c05cSAndroid Build Coastguard Worker // A few implementation notes:  Like the Linux version, the Windows
8860*5c90c05cSAndroid Build Coastguard Worker // implementation uses pipes for child-to-parent communication. But due to
8861*5c90c05cSAndroid Build Coastguard Worker // the specifics of pipes on Windows, some extra steps are required:
8862*5c90c05cSAndroid Build Coastguard Worker //
8863*5c90c05cSAndroid Build Coastguard Worker // 1. The parent creates a communication pipe and stores handles to both
8864*5c90c05cSAndroid Build Coastguard Worker //    ends of it.
8865*5c90c05cSAndroid Build Coastguard Worker // 2. The parent starts the child and provides it with the information
8866*5c90c05cSAndroid Build Coastguard Worker //    necessary to acquire the handle to the write end of the pipe.
8867*5c90c05cSAndroid Build Coastguard Worker // 3. The child acquires the write end of the pipe and signals the parent
8868*5c90c05cSAndroid Build Coastguard Worker //    using a Windows event.
8869*5c90c05cSAndroid Build Coastguard Worker // 4. Now the parent can release the write end of the pipe on its side. If
8870*5c90c05cSAndroid Build Coastguard Worker //    this is done before step 3, the object's reference count goes down to
8871*5c90c05cSAndroid Build Coastguard Worker //    0 and it is destroyed, preventing the child from acquiring it. The
8872*5c90c05cSAndroid Build Coastguard Worker //    parent now has to release it, or read operations on the read end of
8873*5c90c05cSAndroid Build Coastguard Worker //    the pipe will not return when the child terminates.
8874*5c90c05cSAndroid Build Coastguard Worker // 5. The parent reads child's output through the pipe (outcome code and
8875*5c90c05cSAndroid Build Coastguard Worker //    any possible error messages) from the pipe, and its stderr and then
8876*5c90c05cSAndroid Build Coastguard Worker //    determines whether to fail the test.
8877*5c90c05cSAndroid Build Coastguard Worker //
8878*5c90c05cSAndroid Build Coastguard Worker // Note: to distinguish Win32 API calls from the local method and function
8879*5c90c05cSAndroid Build Coastguard Worker // calls, the former are explicitly resolved in the global namespace.
8880*5c90c05cSAndroid Build Coastguard Worker //
8881*5c90c05cSAndroid Build Coastguard Worker class WindowsDeathTest : public DeathTestImpl {
8882*5c90c05cSAndroid Build Coastguard Worker  public:
WindowsDeathTest(const char * a_statement,Matcher<const std::string &> matcher,const char * file,int line)8883*5c90c05cSAndroid Build Coastguard Worker   WindowsDeathTest(const char* a_statement, Matcher<const std::string&> matcher,
8884*5c90c05cSAndroid Build Coastguard Worker                    const char* file, int line)
8885*5c90c05cSAndroid Build Coastguard Worker       : DeathTestImpl(a_statement, std::move(matcher)),
8886*5c90c05cSAndroid Build Coastguard Worker         file_(file),
8887*5c90c05cSAndroid Build Coastguard Worker         line_(line) {}
8888*5c90c05cSAndroid Build Coastguard Worker 
8889*5c90c05cSAndroid Build Coastguard Worker   // All of these virtual functions are inherited from DeathTest.
8890*5c90c05cSAndroid Build Coastguard Worker   virtual int Wait();
8891*5c90c05cSAndroid Build Coastguard Worker   virtual TestRole AssumeRole();
8892*5c90c05cSAndroid Build Coastguard Worker 
8893*5c90c05cSAndroid Build Coastguard Worker  private:
8894*5c90c05cSAndroid Build Coastguard Worker   // The name of the file in which the death test is located.
8895*5c90c05cSAndroid Build Coastguard Worker   const char* const file_;
8896*5c90c05cSAndroid Build Coastguard Worker   // The line number on which the death test is located.
8897*5c90c05cSAndroid Build Coastguard Worker   const int line_;
8898*5c90c05cSAndroid Build Coastguard Worker   // Handle to the write end of the pipe to the child process.
8899*5c90c05cSAndroid Build Coastguard Worker   AutoHandle write_handle_;
8900*5c90c05cSAndroid Build Coastguard Worker   // Child process handle.
8901*5c90c05cSAndroid Build Coastguard Worker   AutoHandle child_handle_;
8902*5c90c05cSAndroid Build Coastguard Worker   // Event the child process uses to signal the parent that it has
8903*5c90c05cSAndroid Build Coastguard Worker   // acquired the handle to the write end of the pipe. After seeing this
8904*5c90c05cSAndroid Build Coastguard Worker   // event the parent can release its own handles to make sure its
8905*5c90c05cSAndroid Build Coastguard Worker   // ReadFile() calls return when the child terminates.
8906*5c90c05cSAndroid Build Coastguard Worker   AutoHandle event_handle_;
8907*5c90c05cSAndroid Build Coastguard Worker };
8908*5c90c05cSAndroid Build Coastguard Worker 
8909*5c90c05cSAndroid Build Coastguard Worker // Waits for the child in a death test to exit, returning its exit
8910*5c90c05cSAndroid Build Coastguard Worker // status, or 0 if no child process exists.  As a side effect, sets the
8911*5c90c05cSAndroid Build Coastguard Worker // outcome data member.
Wait()8912*5c90c05cSAndroid Build Coastguard Worker int WindowsDeathTest::Wait() {
8913*5c90c05cSAndroid Build Coastguard Worker   if (!spawned())
8914*5c90c05cSAndroid Build Coastguard Worker     return 0;
8915*5c90c05cSAndroid Build Coastguard Worker 
8916*5c90c05cSAndroid Build Coastguard Worker   // Wait until the child either signals that it has acquired the write end
8917*5c90c05cSAndroid Build Coastguard Worker   // of the pipe or it dies.
8918*5c90c05cSAndroid Build Coastguard Worker   const HANDLE wait_handles[2] = { child_handle_.Get(), event_handle_.Get() };
8919*5c90c05cSAndroid Build Coastguard Worker   switch (::WaitForMultipleObjects(2,
8920*5c90c05cSAndroid Build Coastguard Worker                                    wait_handles,
8921*5c90c05cSAndroid Build Coastguard Worker                                    FALSE,  // Waits for any of the handles.
8922*5c90c05cSAndroid Build Coastguard Worker                                    INFINITE)) {
8923*5c90c05cSAndroid Build Coastguard Worker     case WAIT_OBJECT_0:
8924*5c90c05cSAndroid Build Coastguard Worker     case WAIT_OBJECT_0 + 1:
8925*5c90c05cSAndroid Build Coastguard Worker       break;
8926*5c90c05cSAndroid Build Coastguard Worker     default:
8927*5c90c05cSAndroid Build Coastguard Worker       GTEST_DEATH_TEST_CHECK_(false);  // Should not get here.
8928*5c90c05cSAndroid Build Coastguard Worker   }
8929*5c90c05cSAndroid Build Coastguard Worker 
8930*5c90c05cSAndroid Build Coastguard Worker   // The child has acquired the write end of the pipe or exited.
8931*5c90c05cSAndroid Build Coastguard Worker   // We release the handle on our side and continue.
8932*5c90c05cSAndroid Build Coastguard Worker   write_handle_.Reset();
8933*5c90c05cSAndroid Build Coastguard Worker   event_handle_.Reset();
8934*5c90c05cSAndroid Build Coastguard Worker 
8935*5c90c05cSAndroid Build Coastguard Worker   ReadAndInterpretStatusByte();
8936*5c90c05cSAndroid Build Coastguard Worker 
8937*5c90c05cSAndroid Build Coastguard Worker   // Waits for the child process to exit if it haven't already. This
8938*5c90c05cSAndroid Build Coastguard Worker   // returns immediately if the child has already exited, regardless of
8939*5c90c05cSAndroid Build Coastguard Worker   // whether previous calls to WaitForMultipleObjects synchronized on this
8940*5c90c05cSAndroid Build Coastguard Worker   // handle or not.
8941*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_(
8942*5c90c05cSAndroid Build Coastguard Worker       WAIT_OBJECT_0 == ::WaitForSingleObject(child_handle_.Get(),
8943*5c90c05cSAndroid Build Coastguard Worker                                              INFINITE));
8944*5c90c05cSAndroid Build Coastguard Worker   DWORD status_code;
8945*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_(
8946*5c90c05cSAndroid Build Coastguard Worker       ::GetExitCodeProcess(child_handle_.Get(), &status_code) != FALSE);
8947*5c90c05cSAndroid Build Coastguard Worker   child_handle_.Reset();
8948*5c90c05cSAndroid Build Coastguard Worker   set_status(static_cast<int>(status_code));
8949*5c90c05cSAndroid Build Coastguard Worker   return status();
8950*5c90c05cSAndroid Build Coastguard Worker }
8951*5c90c05cSAndroid Build Coastguard Worker 
8952*5c90c05cSAndroid Build Coastguard Worker // The AssumeRole process for a Windows death test.  It creates a child
8953*5c90c05cSAndroid Build Coastguard Worker // process with the same executable as the current process to run the
8954*5c90c05cSAndroid Build Coastguard Worker // death test.  The child process is given the --gtest_filter and
8955*5c90c05cSAndroid Build Coastguard Worker // --gtest_internal_run_death_test flags such that it knows to run the
8956*5c90c05cSAndroid Build Coastguard Worker // current death test only.
AssumeRole()8957*5c90c05cSAndroid Build Coastguard Worker DeathTest::TestRole WindowsDeathTest::AssumeRole() {
8958*5c90c05cSAndroid Build Coastguard Worker   const UnitTestImpl* const impl = GetUnitTestImpl();
8959*5c90c05cSAndroid Build Coastguard Worker   const InternalRunDeathTestFlag* const flag =
8960*5c90c05cSAndroid Build Coastguard Worker       impl->internal_run_death_test_flag();
8961*5c90c05cSAndroid Build Coastguard Worker   const TestInfo* const info = impl->current_test_info();
8962*5c90c05cSAndroid Build Coastguard Worker   const int death_test_index = info->result()->death_test_count();
8963*5c90c05cSAndroid Build Coastguard Worker 
8964*5c90c05cSAndroid Build Coastguard Worker   if (flag != nullptr) {
8965*5c90c05cSAndroid Build Coastguard Worker     // ParseInternalRunDeathTestFlag() has performed all the necessary
8966*5c90c05cSAndroid Build Coastguard Worker     // processing.
8967*5c90c05cSAndroid Build Coastguard Worker     set_write_fd(flag->write_fd());
8968*5c90c05cSAndroid Build Coastguard Worker     return EXECUTE_TEST;
8969*5c90c05cSAndroid Build Coastguard Worker   }
8970*5c90c05cSAndroid Build Coastguard Worker 
8971*5c90c05cSAndroid Build Coastguard Worker   // WindowsDeathTest uses an anonymous pipe to communicate results of
8972*5c90c05cSAndroid Build Coastguard Worker   // a death test.
8973*5c90c05cSAndroid Build Coastguard Worker   SECURITY_ATTRIBUTES handles_are_inheritable = {sizeof(SECURITY_ATTRIBUTES),
8974*5c90c05cSAndroid Build Coastguard Worker                                                  nullptr, TRUE};
8975*5c90c05cSAndroid Build Coastguard Worker   HANDLE read_handle, write_handle;
8976*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_(
8977*5c90c05cSAndroid Build Coastguard Worker       ::CreatePipe(&read_handle, &write_handle, &handles_are_inheritable,
8978*5c90c05cSAndroid Build Coastguard Worker                    0)  // Default buffer size.
8979*5c90c05cSAndroid Build Coastguard Worker       != FALSE);
8980*5c90c05cSAndroid Build Coastguard Worker   set_read_fd(::_open_osfhandle(reinterpret_cast<intptr_t>(read_handle),
8981*5c90c05cSAndroid Build Coastguard Worker                                 O_RDONLY));
8982*5c90c05cSAndroid Build Coastguard Worker   write_handle_.Reset(write_handle);
8983*5c90c05cSAndroid Build Coastguard Worker   event_handle_.Reset(::CreateEvent(
8984*5c90c05cSAndroid Build Coastguard Worker       &handles_are_inheritable,
8985*5c90c05cSAndroid Build Coastguard Worker       TRUE,       // The event will automatically reset to non-signaled state.
8986*5c90c05cSAndroid Build Coastguard Worker       FALSE,      // The initial state is non-signalled.
8987*5c90c05cSAndroid Build Coastguard Worker       nullptr));  // The even is unnamed.
8988*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_(event_handle_.Get() != nullptr);
8989*5c90c05cSAndroid Build Coastguard Worker   const std::string filter_flag = std::string("--") + GTEST_FLAG_PREFIX_ +
8990*5c90c05cSAndroid Build Coastguard Worker                                   kFilterFlag + "=" + info->test_suite_name() +
8991*5c90c05cSAndroid Build Coastguard Worker                                   "." + info->name();
8992*5c90c05cSAndroid Build Coastguard Worker   const std::string internal_flag =
8993*5c90c05cSAndroid Build Coastguard Worker       std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag +
8994*5c90c05cSAndroid Build Coastguard Worker       "=" + file_ + "|" + StreamableToString(line_) + "|" +
8995*5c90c05cSAndroid Build Coastguard Worker       StreamableToString(death_test_index) + "|" +
8996*5c90c05cSAndroid Build Coastguard Worker       StreamableToString(static_cast<unsigned int>(::GetCurrentProcessId())) +
8997*5c90c05cSAndroid Build Coastguard Worker       // size_t has the same width as pointers on both 32-bit and 64-bit
8998*5c90c05cSAndroid Build Coastguard Worker       // Windows platforms.
8999*5c90c05cSAndroid Build Coastguard Worker       // See http://msdn.microsoft.com/en-us/library/tcxf1dw6.aspx.
9000*5c90c05cSAndroid Build Coastguard Worker       "|" + StreamableToString(reinterpret_cast<size_t>(write_handle)) +
9001*5c90c05cSAndroid Build Coastguard Worker       "|" + StreamableToString(reinterpret_cast<size_t>(event_handle_.Get()));
9002*5c90c05cSAndroid Build Coastguard Worker 
9003*5c90c05cSAndroid Build Coastguard Worker   char executable_path[_MAX_PATH + 1];  // NOLINT
9004*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_(_MAX_PATH + 1 != ::GetModuleFileNameA(nullptr,
9005*5c90c05cSAndroid Build Coastguard Worker                                                                 executable_path,
9006*5c90c05cSAndroid Build Coastguard Worker                                                                 _MAX_PATH));
9007*5c90c05cSAndroid Build Coastguard Worker 
9008*5c90c05cSAndroid Build Coastguard Worker   std::string command_line =
9009*5c90c05cSAndroid Build Coastguard Worker       std::string(::GetCommandLineA()) + " " + filter_flag + " \"" +
9010*5c90c05cSAndroid Build Coastguard Worker       internal_flag + "\"";
9011*5c90c05cSAndroid Build Coastguard Worker 
9012*5c90c05cSAndroid Build Coastguard Worker   DeathTest::set_last_death_test_message("");
9013*5c90c05cSAndroid Build Coastguard Worker 
9014*5c90c05cSAndroid Build Coastguard Worker   CaptureStderr();
9015*5c90c05cSAndroid Build Coastguard Worker   // Flush the log buffers since the log streams are shared with the child.
9016*5c90c05cSAndroid Build Coastguard Worker   FlushInfoLog();
9017*5c90c05cSAndroid Build Coastguard Worker 
9018*5c90c05cSAndroid Build Coastguard Worker   // The child process will share the standard handles with the parent.
9019*5c90c05cSAndroid Build Coastguard Worker   STARTUPINFOA startup_info;
9020*5c90c05cSAndroid Build Coastguard Worker   memset(&startup_info, 0, sizeof(STARTUPINFO));
9021*5c90c05cSAndroid Build Coastguard Worker   startup_info.dwFlags = STARTF_USESTDHANDLES;
9022*5c90c05cSAndroid Build Coastguard Worker   startup_info.hStdInput = ::GetStdHandle(STD_INPUT_HANDLE);
9023*5c90c05cSAndroid Build Coastguard Worker   startup_info.hStdOutput = ::GetStdHandle(STD_OUTPUT_HANDLE);
9024*5c90c05cSAndroid Build Coastguard Worker   startup_info.hStdError = ::GetStdHandle(STD_ERROR_HANDLE);
9025*5c90c05cSAndroid Build Coastguard Worker 
9026*5c90c05cSAndroid Build Coastguard Worker   PROCESS_INFORMATION process_info;
9027*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_(
9028*5c90c05cSAndroid Build Coastguard Worker       ::CreateProcessA(
9029*5c90c05cSAndroid Build Coastguard Worker           executable_path, const_cast<char*>(command_line.c_str()),
9030*5c90c05cSAndroid Build Coastguard Worker           nullptr,  // Retuned process handle is not inheritable.
9031*5c90c05cSAndroid Build Coastguard Worker           nullptr,  // Retuned thread handle is not inheritable.
9032*5c90c05cSAndroid Build Coastguard Worker           TRUE,  // Child inherits all inheritable handles (for write_handle_).
9033*5c90c05cSAndroid Build Coastguard Worker           0x0,   // Default creation flags.
9034*5c90c05cSAndroid Build Coastguard Worker           nullptr,  // Inherit the parent's environment.
9035*5c90c05cSAndroid Build Coastguard Worker           UnitTest::GetInstance()->original_working_dir(), &startup_info,
9036*5c90c05cSAndroid Build Coastguard Worker           &process_info) != FALSE);
9037*5c90c05cSAndroid Build Coastguard Worker   child_handle_.Reset(process_info.hProcess);
9038*5c90c05cSAndroid Build Coastguard Worker   ::CloseHandle(process_info.hThread);
9039*5c90c05cSAndroid Build Coastguard Worker   set_spawned(true);
9040*5c90c05cSAndroid Build Coastguard Worker   return OVERSEE_TEST;
9041*5c90c05cSAndroid Build Coastguard Worker }
9042*5c90c05cSAndroid Build Coastguard Worker 
9043*5c90c05cSAndroid Build Coastguard Worker # elif GTEST_OS_FUCHSIA
9044*5c90c05cSAndroid Build Coastguard Worker 
9045*5c90c05cSAndroid Build Coastguard Worker class FuchsiaDeathTest : public DeathTestImpl {
9046*5c90c05cSAndroid Build Coastguard Worker  public:
FuchsiaDeathTest(const char * a_statement,Matcher<const std::string &> matcher,const char * file,int line)9047*5c90c05cSAndroid Build Coastguard Worker   FuchsiaDeathTest(const char* a_statement, Matcher<const std::string&> matcher,
9048*5c90c05cSAndroid Build Coastguard Worker                    const char* file, int line)
9049*5c90c05cSAndroid Build Coastguard Worker       : DeathTestImpl(a_statement, std::move(matcher)),
9050*5c90c05cSAndroid Build Coastguard Worker         file_(file),
9051*5c90c05cSAndroid Build Coastguard Worker         line_(line) {}
9052*5c90c05cSAndroid Build Coastguard Worker 
9053*5c90c05cSAndroid Build Coastguard Worker   // All of these virtual functions are inherited from DeathTest.
9054*5c90c05cSAndroid Build Coastguard Worker   int Wait() override;
9055*5c90c05cSAndroid Build Coastguard Worker   TestRole AssumeRole() override;
9056*5c90c05cSAndroid Build Coastguard Worker   std::string GetErrorLogs() override;
9057*5c90c05cSAndroid Build Coastguard Worker 
9058*5c90c05cSAndroid Build Coastguard Worker  private:
9059*5c90c05cSAndroid Build Coastguard Worker   // The name of the file in which the death test is located.
9060*5c90c05cSAndroid Build Coastguard Worker   const char* const file_;
9061*5c90c05cSAndroid Build Coastguard Worker   // The line number on which the death test is located.
9062*5c90c05cSAndroid Build Coastguard Worker   const int line_;
9063*5c90c05cSAndroid Build Coastguard Worker   // The stderr data captured by the child process.
9064*5c90c05cSAndroid Build Coastguard Worker   std::string captured_stderr_;
9065*5c90c05cSAndroid Build Coastguard Worker 
9066*5c90c05cSAndroid Build Coastguard Worker   zx::process child_process_;
9067*5c90c05cSAndroid Build Coastguard Worker   zx::channel exception_channel_;
9068*5c90c05cSAndroid Build Coastguard Worker   zx::socket stderr_socket_;
9069*5c90c05cSAndroid Build Coastguard Worker };
9070*5c90c05cSAndroid Build Coastguard Worker 
9071*5c90c05cSAndroid Build Coastguard Worker // Utility class for accumulating command-line arguments.
9072*5c90c05cSAndroid Build Coastguard Worker class Arguments {
9073*5c90c05cSAndroid Build Coastguard Worker  public:
Arguments()9074*5c90c05cSAndroid Build Coastguard Worker   Arguments() { args_.push_back(nullptr); }
9075*5c90c05cSAndroid Build Coastguard Worker 
~Arguments()9076*5c90c05cSAndroid Build Coastguard Worker   ~Arguments() {
9077*5c90c05cSAndroid Build Coastguard Worker     for (std::vector<char*>::iterator i = args_.begin(); i != args_.end();
9078*5c90c05cSAndroid Build Coastguard Worker          ++i) {
9079*5c90c05cSAndroid Build Coastguard Worker       free(*i);
9080*5c90c05cSAndroid Build Coastguard Worker     }
9081*5c90c05cSAndroid Build Coastguard Worker   }
AddArgument(const char * argument)9082*5c90c05cSAndroid Build Coastguard Worker   void AddArgument(const char* argument) {
9083*5c90c05cSAndroid Build Coastguard Worker     args_.insert(args_.end() - 1, posix::StrDup(argument));
9084*5c90c05cSAndroid Build Coastguard Worker   }
9085*5c90c05cSAndroid Build Coastguard Worker 
9086*5c90c05cSAndroid Build Coastguard Worker   template <typename Str>
AddArguments(const::std::vector<Str> & arguments)9087*5c90c05cSAndroid Build Coastguard Worker   void AddArguments(const ::std::vector<Str>& arguments) {
9088*5c90c05cSAndroid Build Coastguard Worker     for (typename ::std::vector<Str>::const_iterator i = arguments.begin();
9089*5c90c05cSAndroid Build Coastguard Worker          i != arguments.end();
9090*5c90c05cSAndroid Build Coastguard Worker          ++i) {
9091*5c90c05cSAndroid Build Coastguard Worker       args_.insert(args_.end() - 1, posix::StrDup(i->c_str()));
9092*5c90c05cSAndroid Build Coastguard Worker     }
9093*5c90c05cSAndroid Build Coastguard Worker   }
Argv()9094*5c90c05cSAndroid Build Coastguard Worker   char* const* Argv() {
9095*5c90c05cSAndroid Build Coastguard Worker     return &args_[0];
9096*5c90c05cSAndroid Build Coastguard Worker   }
9097*5c90c05cSAndroid Build Coastguard Worker 
size()9098*5c90c05cSAndroid Build Coastguard Worker   int size() {
9099*5c90c05cSAndroid Build Coastguard Worker     return static_cast<int>(args_.size()) - 1;
9100*5c90c05cSAndroid Build Coastguard Worker   }
9101*5c90c05cSAndroid Build Coastguard Worker 
9102*5c90c05cSAndroid Build Coastguard Worker  private:
9103*5c90c05cSAndroid Build Coastguard Worker   std::vector<char*> args_;
9104*5c90c05cSAndroid Build Coastguard Worker };
9105*5c90c05cSAndroid Build Coastguard Worker 
9106*5c90c05cSAndroid Build Coastguard Worker // Waits for the child in a death test to exit, returning its exit
9107*5c90c05cSAndroid Build Coastguard Worker // status, or 0 if no child process exists.  As a side effect, sets the
9108*5c90c05cSAndroid Build Coastguard Worker // outcome data member.
Wait()9109*5c90c05cSAndroid Build Coastguard Worker int FuchsiaDeathTest::Wait() {
9110*5c90c05cSAndroid Build Coastguard Worker   const int kProcessKey = 0;
9111*5c90c05cSAndroid Build Coastguard Worker   const int kSocketKey = 1;
9112*5c90c05cSAndroid Build Coastguard Worker   const int kExceptionKey = 2;
9113*5c90c05cSAndroid Build Coastguard Worker 
9114*5c90c05cSAndroid Build Coastguard Worker   if (!spawned())
9115*5c90c05cSAndroid Build Coastguard Worker     return 0;
9116*5c90c05cSAndroid Build Coastguard Worker 
9117*5c90c05cSAndroid Build Coastguard Worker   // Create a port to wait for socket/task/exception events.
9118*5c90c05cSAndroid Build Coastguard Worker   zx_status_t status_zx;
9119*5c90c05cSAndroid Build Coastguard Worker   zx::port port;
9120*5c90c05cSAndroid Build Coastguard Worker   status_zx = zx::port::create(0, &port);
9121*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);
9122*5c90c05cSAndroid Build Coastguard Worker 
9123*5c90c05cSAndroid Build Coastguard Worker   // Register to wait for the child process to terminate.
9124*5c90c05cSAndroid Build Coastguard Worker   status_zx = child_process_.wait_async(
9125*5c90c05cSAndroid Build Coastguard Worker       port, kProcessKey, ZX_PROCESS_TERMINATED, 0);
9126*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);
9127*5c90c05cSAndroid Build Coastguard Worker 
9128*5c90c05cSAndroid Build Coastguard Worker   // Register to wait for the socket to be readable or closed.
9129*5c90c05cSAndroid Build Coastguard Worker   status_zx = stderr_socket_.wait_async(
9130*5c90c05cSAndroid Build Coastguard Worker       port, kSocketKey, ZX_SOCKET_READABLE | ZX_SOCKET_PEER_CLOSED, 0);
9131*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);
9132*5c90c05cSAndroid Build Coastguard Worker 
9133*5c90c05cSAndroid Build Coastguard Worker   // Register to wait for an exception.
9134*5c90c05cSAndroid Build Coastguard Worker   status_zx = exception_channel_.wait_async(
9135*5c90c05cSAndroid Build Coastguard Worker       port, kExceptionKey, ZX_CHANNEL_READABLE, 0);
9136*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);
9137*5c90c05cSAndroid Build Coastguard Worker 
9138*5c90c05cSAndroid Build Coastguard Worker   bool process_terminated = false;
9139*5c90c05cSAndroid Build Coastguard Worker   bool socket_closed = false;
9140*5c90c05cSAndroid Build Coastguard Worker   do {
9141*5c90c05cSAndroid Build Coastguard Worker     zx_port_packet_t packet = {};
9142*5c90c05cSAndroid Build Coastguard Worker     status_zx = port.wait(zx::time::infinite(), &packet);
9143*5c90c05cSAndroid Build Coastguard Worker     GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);
9144*5c90c05cSAndroid Build Coastguard Worker 
9145*5c90c05cSAndroid Build Coastguard Worker     if (packet.key == kExceptionKey) {
9146*5c90c05cSAndroid Build Coastguard Worker       // Process encountered an exception. Kill it directly rather than
9147*5c90c05cSAndroid Build Coastguard Worker       // letting other handlers process the event. We will get a kProcessKey
9148*5c90c05cSAndroid Build Coastguard Worker       // event when the process actually terminates.
9149*5c90c05cSAndroid Build Coastguard Worker       status_zx = child_process_.kill();
9150*5c90c05cSAndroid Build Coastguard Worker       GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);
9151*5c90c05cSAndroid Build Coastguard Worker     } else if (packet.key == kProcessKey) {
9152*5c90c05cSAndroid Build Coastguard Worker       // Process terminated.
9153*5c90c05cSAndroid Build Coastguard Worker       GTEST_DEATH_TEST_CHECK_(ZX_PKT_IS_SIGNAL_ONE(packet.type));
9154*5c90c05cSAndroid Build Coastguard Worker       GTEST_DEATH_TEST_CHECK_(packet.signal.observed & ZX_PROCESS_TERMINATED);
9155*5c90c05cSAndroid Build Coastguard Worker       process_terminated = true;
9156*5c90c05cSAndroid Build Coastguard Worker     } else if (packet.key == kSocketKey) {
9157*5c90c05cSAndroid Build Coastguard Worker       GTEST_DEATH_TEST_CHECK_(ZX_PKT_IS_SIGNAL_ONE(packet.type));
9158*5c90c05cSAndroid Build Coastguard Worker       if (packet.signal.observed & ZX_SOCKET_READABLE) {
9159*5c90c05cSAndroid Build Coastguard Worker         // Read data from the socket.
9160*5c90c05cSAndroid Build Coastguard Worker         constexpr size_t kBufferSize = 1024;
9161*5c90c05cSAndroid Build Coastguard Worker         do {
9162*5c90c05cSAndroid Build Coastguard Worker           size_t old_length = captured_stderr_.length();
9163*5c90c05cSAndroid Build Coastguard Worker           size_t bytes_read = 0;
9164*5c90c05cSAndroid Build Coastguard Worker           captured_stderr_.resize(old_length + kBufferSize);
9165*5c90c05cSAndroid Build Coastguard Worker           status_zx = stderr_socket_.read(
9166*5c90c05cSAndroid Build Coastguard Worker               0, &captured_stderr_.front() + old_length, kBufferSize,
9167*5c90c05cSAndroid Build Coastguard Worker               &bytes_read);
9168*5c90c05cSAndroid Build Coastguard Worker           captured_stderr_.resize(old_length + bytes_read);
9169*5c90c05cSAndroid Build Coastguard Worker         } while (status_zx == ZX_OK);
9170*5c90c05cSAndroid Build Coastguard Worker         if (status_zx == ZX_ERR_PEER_CLOSED) {
9171*5c90c05cSAndroid Build Coastguard Worker           socket_closed = true;
9172*5c90c05cSAndroid Build Coastguard Worker         } else {
9173*5c90c05cSAndroid Build Coastguard Worker           GTEST_DEATH_TEST_CHECK_(status_zx == ZX_ERR_SHOULD_WAIT);
9174*5c90c05cSAndroid Build Coastguard Worker           status_zx = stderr_socket_.wait_async(
9175*5c90c05cSAndroid Build Coastguard Worker               port, kSocketKey, ZX_SOCKET_READABLE | ZX_SOCKET_PEER_CLOSED, 0);
9176*5c90c05cSAndroid Build Coastguard Worker           GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);
9177*5c90c05cSAndroid Build Coastguard Worker         }
9178*5c90c05cSAndroid Build Coastguard Worker       } else {
9179*5c90c05cSAndroid Build Coastguard Worker         GTEST_DEATH_TEST_CHECK_(packet.signal.observed & ZX_SOCKET_PEER_CLOSED);
9180*5c90c05cSAndroid Build Coastguard Worker         socket_closed = true;
9181*5c90c05cSAndroid Build Coastguard Worker       }
9182*5c90c05cSAndroid Build Coastguard Worker     }
9183*5c90c05cSAndroid Build Coastguard Worker   } while (!process_terminated && !socket_closed);
9184*5c90c05cSAndroid Build Coastguard Worker 
9185*5c90c05cSAndroid Build Coastguard Worker   ReadAndInterpretStatusByte();
9186*5c90c05cSAndroid Build Coastguard Worker 
9187*5c90c05cSAndroid Build Coastguard Worker   zx_info_process_v2_t buffer;
9188*5c90c05cSAndroid Build Coastguard Worker   status_zx = child_process_.get_info(
9189*5c90c05cSAndroid Build Coastguard Worker       ZX_INFO_PROCESS_V2, &buffer, sizeof(buffer), nullptr, nullptr);
9190*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);
9191*5c90c05cSAndroid Build Coastguard Worker 
9192*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_(buffer.flags & ZX_INFO_PROCESS_FLAG_EXITED);
9193*5c90c05cSAndroid Build Coastguard Worker   set_status(static_cast<int>(buffer.return_code));
9194*5c90c05cSAndroid Build Coastguard Worker   return status();
9195*5c90c05cSAndroid Build Coastguard Worker }
9196*5c90c05cSAndroid Build Coastguard Worker 
9197*5c90c05cSAndroid Build Coastguard Worker // The AssumeRole process for a Fuchsia death test.  It creates a child
9198*5c90c05cSAndroid Build Coastguard Worker // process with the same executable as the current process to run the
9199*5c90c05cSAndroid Build Coastguard Worker // death test.  The child process is given the --gtest_filter and
9200*5c90c05cSAndroid Build Coastguard Worker // --gtest_internal_run_death_test flags such that it knows to run the
9201*5c90c05cSAndroid Build Coastguard Worker // current death test only.
AssumeRole()9202*5c90c05cSAndroid Build Coastguard Worker DeathTest::TestRole FuchsiaDeathTest::AssumeRole() {
9203*5c90c05cSAndroid Build Coastguard Worker   const UnitTestImpl* const impl = GetUnitTestImpl();
9204*5c90c05cSAndroid Build Coastguard Worker   const InternalRunDeathTestFlag* const flag =
9205*5c90c05cSAndroid Build Coastguard Worker       impl->internal_run_death_test_flag();
9206*5c90c05cSAndroid Build Coastguard Worker   const TestInfo* const info = impl->current_test_info();
9207*5c90c05cSAndroid Build Coastguard Worker   const int death_test_index = info->result()->death_test_count();
9208*5c90c05cSAndroid Build Coastguard Worker 
9209*5c90c05cSAndroid Build Coastguard Worker   if (flag != nullptr) {
9210*5c90c05cSAndroid Build Coastguard Worker     // ParseInternalRunDeathTestFlag() has performed all the necessary
9211*5c90c05cSAndroid Build Coastguard Worker     // processing.
9212*5c90c05cSAndroid Build Coastguard Worker     set_write_fd(kFuchsiaReadPipeFd);
9213*5c90c05cSAndroid Build Coastguard Worker     return EXECUTE_TEST;
9214*5c90c05cSAndroid Build Coastguard Worker   }
9215*5c90c05cSAndroid Build Coastguard Worker 
9216*5c90c05cSAndroid Build Coastguard Worker   // Flush the log buffers since the log streams are shared with the child.
9217*5c90c05cSAndroid Build Coastguard Worker   FlushInfoLog();
9218*5c90c05cSAndroid Build Coastguard Worker 
9219*5c90c05cSAndroid Build Coastguard Worker   // Build the child process command line.
9220*5c90c05cSAndroid Build Coastguard Worker   const std::string filter_flag = std::string("--") + GTEST_FLAG_PREFIX_ +
9221*5c90c05cSAndroid Build Coastguard Worker                                   kFilterFlag + "=" + info->test_suite_name() +
9222*5c90c05cSAndroid Build Coastguard Worker                                   "." + info->name();
9223*5c90c05cSAndroid Build Coastguard Worker   const std::string internal_flag =
9224*5c90c05cSAndroid Build Coastguard Worker       std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag + "="
9225*5c90c05cSAndroid Build Coastguard Worker       + file_ + "|"
9226*5c90c05cSAndroid Build Coastguard Worker       + StreamableToString(line_) + "|"
9227*5c90c05cSAndroid Build Coastguard Worker       + StreamableToString(death_test_index);
9228*5c90c05cSAndroid Build Coastguard Worker   Arguments args;
9229*5c90c05cSAndroid Build Coastguard Worker   args.AddArguments(GetInjectableArgvs());
9230*5c90c05cSAndroid Build Coastguard Worker   args.AddArgument(filter_flag.c_str());
9231*5c90c05cSAndroid Build Coastguard Worker   args.AddArgument(internal_flag.c_str());
9232*5c90c05cSAndroid Build Coastguard Worker 
9233*5c90c05cSAndroid Build Coastguard Worker   // Build the pipe for communication with the child.
9234*5c90c05cSAndroid Build Coastguard Worker   zx_status_t status;
9235*5c90c05cSAndroid Build Coastguard Worker   zx_handle_t child_pipe_handle;
9236*5c90c05cSAndroid Build Coastguard Worker   int child_pipe_fd;
9237*5c90c05cSAndroid Build Coastguard Worker   status = fdio_pipe_half(&child_pipe_fd, &child_pipe_handle);
9238*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_(status == ZX_OK);
9239*5c90c05cSAndroid Build Coastguard Worker   set_read_fd(child_pipe_fd);
9240*5c90c05cSAndroid Build Coastguard Worker 
9241*5c90c05cSAndroid Build Coastguard Worker   // Set the pipe handle for the child.
9242*5c90c05cSAndroid Build Coastguard Worker   fdio_spawn_action_t spawn_actions[2] = {};
9243*5c90c05cSAndroid Build Coastguard Worker   fdio_spawn_action_t* add_handle_action = &spawn_actions[0];
9244*5c90c05cSAndroid Build Coastguard Worker   add_handle_action->action = FDIO_SPAWN_ACTION_ADD_HANDLE;
9245*5c90c05cSAndroid Build Coastguard Worker   add_handle_action->h.id = PA_HND(PA_FD, kFuchsiaReadPipeFd);
9246*5c90c05cSAndroid Build Coastguard Worker   add_handle_action->h.handle = child_pipe_handle;
9247*5c90c05cSAndroid Build Coastguard Worker 
9248*5c90c05cSAndroid Build Coastguard Worker   // Create a socket pair will be used to receive the child process' stderr.
9249*5c90c05cSAndroid Build Coastguard Worker   zx::socket stderr_producer_socket;
9250*5c90c05cSAndroid Build Coastguard Worker   status =
9251*5c90c05cSAndroid Build Coastguard Worker       zx::socket::create(0, &stderr_producer_socket, &stderr_socket_);
9252*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_(status >= 0);
9253*5c90c05cSAndroid Build Coastguard Worker   int stderr_producer_fd = -1;
9254*5c90c05cSAndroid Build Coastguard Worker   status =
9255*5c90c05cSAndroid Build Coastguard Worker       fdio_fd_create(stderr_producer_socket.release(), &stderr_producer_fd);
9256*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_(status >= 0);
9257*5c90c05cSAndroid Build Coastguard Worker 
9258*5c90c05cSAndroid Build Coastguard Worker   // Make the stderr socket nonblocking.
9259*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_(fcntl(stderr_producer_fd, F_SETFL, 0) == 0);
9260*5c90c05cSAndroid Build Coastguard Worker 
9261*5c90c05cSAndroid Build Coastguard Worker   fdio_spawn_action_t* add_stderr_action = &spawn_actions[1];
9262*5c90c05cSAndroid Build Coastguard Worker   add_stderr_action->action = FDIO_SPAWN_ACTION_CLONE_FD;
9263*5c90c05cSAndroid Build Coastguard Worker   add_stderr_action->fd.local_fd = stderr_producer_fd;
9264*5c90c05cSAndroid Build Coastguard Worker   add_stderr_action->fd.target_fd = STDERR_FILENO;
9265*5c90c05cSAndroid Build Coastguard Worker 
9266*5c90c05cSAndroid Build Coastguard Worker   // Create a child job.
9267*5c90c05cSAndroid Build Coastguard Worker   zx_handle_t child_job = ZX_HANDLE_INVALID;
9268*5c90c05cSAndroid Build Coastguard Worker   status = zx_job_create(zx_job_default(), 0, & child_job);
9269*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_(status == ZX_OK);
9270*5c90c05cSAndroid Build Coastguard Worker   zx_policy_basic_t policy;
9271*5c90c05cSAndroid Build Coastguard Worker   policy.condition = ZX_POL_NEW_ANY;
9272*5c90c05cSAndroid Build Coastguard Worker   policy.policy = ZX_POL_ACTION_ALLOW;
9273*5c90c05cSAndroid Build Coastguard Worker   status = zx_job_set_policy(
9274*5c90c05cSAndroid Build Coastguard Worker       child_job, ZX_JOB_POL_RELATIVE, ZX_JOB_POL_BASIC, &policy, 1);
9275*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_(status == ZX_OK);
9276*5c90c05cSAndroid Build Coastguard Worker 
9277*5c90c05cSAndroid Build Coastguard Worker   // Create an exception channel attached to the |child_job|, to allow
9278*5c90c05cSAndroid Build Coastguard Worker   // us to suppress the system default exception handler from firing.
9279*5c90c05cSAndroid Build Coastguard Worker   status =
9280*5c90c05cSAndroid Build Coastguard Worker       zx_task_create_exception_channel(
9281*5c90c05cSAndroid Build Coastguard Worker           child_job, 0, exception_channel_.reset_and_get_address());
9282*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_(status == ZX_OK);
9283*5c90c05cSAndroid Build Coastguard Worker 
9284*5c90c05cSAndroid Build Coastguard Worker   // Spawn the child process.
9285*5c90c05cSAndroid Build Coastguard Worker   status = fdio_spawn_etc(
9286*5c90c05cSAndroid Build Coastguard Worker       child_job, FDIO_SPAWN_CLONE_ALL, args.Argv()[0], args.Argv(), nullptr,
9287*5c90c05cSAndroid Build Coastguard Worker       2, spawn_actions, child_process_.reset_and_get_address(), nullptr);
9288*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_(status == ZX_OK);
9289*5c90c05cSAndroid Build Coastguard Worker 
9290*5c90c05cSAndroid Build Coastguard Worker   set_spawned(true);
9291*5c90c05cSAndroid Build Coastguard Worker   return OVERSEE_TEST;
9292*5c90c05cSAndroid Build Coastguard Worker }
9293*5c90c05cSAndroid Build Coastguard Worker 
GetErrorLogs()9294*5c90c05cSAndroid Build Coastguard Worker std::string FuchsiaDeathTest::GetErrorLogs() {
9295*5c90c05cSAndroid Build Coastguard Worker   return captured_stderr_;
9296*5c90c05cSAndroid Build Coastguard Worker }
9297*5c90c05cSAndroid Build Coastguard Worker 
9298*5c90c05cSAndroid Build Coastguard Worker #else  // We are neither on Windows, nor on Fuchsia.
9299*5c90c05cSAndroid Build Coastguard Worker 
9300*5c90c05cSAndroid Build Coastguard Worker // ForkingDeathTest provides implementations for most of the abstract
9301*5c90c05cSAndroid Build Coastguard Worker // methods of the DeathTest interface.  Only the AssumeRole method is
9302*5c90c05cSAndroid Build Coastguard Worker // left undefined.
9303*5c90c05cSAndroid Build Coastguard Worker class ForkingDeathTest : public DeathTestImpl {
9304*5c90c05cSAndroid Build Coastguard Worker  public:
9305*5c90c05cSAndroid Build Coastguard Worker   ForkingDeathTest(const char* statement, Matcher<const std::string&> matcher);
9306*5c90c05cSAndroid Build Coastguard Worker 
9307*5c90c05cSAndroid Build Coastguard Worker   // All of these virtual functions are inherited from DeathTest.
9308*5c90c05cSAndroid Build Coastguard Worker   int Wait() override;
9309*5c90c05cSAndroid Build Coastguard Worker 
9310*5c90c05cSAndroid Build Coastguard Worker  protected:
set_child_pid(pid_t child_pid)9311*5c90c05cSAndroid Build Coastguard Worker   void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; }
9312*5c90c05cSAndroid Build Coastguard Worker 
9313*5c90c05cSAndroid Build Coastguard Worker  private:
9314*5c90c05cSAndroid Build Coastguard Worker   // PID of child process during death test; 0 in the child process itself.
9315*5c90c05cSAndroid Build Coastguard Worker   pid_t child_pid_;
9316*5c90c05cSAndroid Build Coastguard Worker };
9317*5c90c05cSAndroid Build Coastguard Worker 
9318*5c90c05cSAndroid Build Coastguard Worker // Constructs a ForkingDeathTest.
ForkingDeathTest(const char * a_statement,Matcher<const std::string &> matcher)9319*5c90c05cSAndroid Build Coastguard Worker ForkingDeathTest::ForkingDeathTest(const char* a_statement,
9320*5c90c05cSAndroid Build Coastguard Worker                                    Matcher<const std::string&> matcher)
9321*5c90c05cSAndroid Build Coastguard Worker     : DeathTestImpl(a_statement, std::move(matcher)), child_pid_(-1) {}
9322*5c90c05cSAndroid Build Coastguard Worker 
9323*5c90c05cSAndroid Build Coastguard Worker // Waits for the child in a death test to exit, returning its exit
9324*5c90c05cSAndroid Build Coastguard Worker // status, or 0 if no child process exists.  As a side effect, sets the
9325*5c90c05cSAndroid Build Coastguard Worker // outcome data member.
Wait()9326*5c90c05cSAndroid Build Coastguard Worker int ForkingDeathTest::Wait() {
9327*5c90c05cSAndroid Build Coastguard Worker   if (!spawned())
9328*5c90c05cSAndroid Build Coastguard Worker     return 0;
9329*5c90c05cSAndroid Build Coastguard Worker 
9330*5c90c05cSAndroid Build Coastguard Worker   ReadAndInterpretStatusByte();
9331*5c90c05cSAndroid Build Coastguard Worker 
9332*5c90c05cSAndroid Build Coastguard Worker   int status_value;
9333*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_SYSCALL_(waitpid(child_pid_, &status_value, 0));
9334*5c90c05cSAndroid Build Coastguard Worker   set_status(status_value);
9335*5c90c05cSAndroid Build Coastguard Worker   return status_value;
9336*5c90c05cSAndroid Build Coastguard Worker }
9337*5c90c05cSAndroid Build Coastguard Worker 
9338*5c90c05cSAndroid Build Coastguard Worker // A concrete death test class that forks, then immediately runs the test
9339*5c90c05cSAndroid Build Coastguard Worker // in the child process.
9340*5c90c05cSAndroid Build Coastguard Worker class NoExecDeathTest : public ForkingDeathTest {
9341*5c90c05cSAndroid Build Coastguard Worker  public:
NoExecDeathTest(const char * a_statement,Matcher<const std::string &> matcher)9342*5c90c05cSAndroid Build Coastguard Worker   NoExecDeathTest(const char* a_statement, Matcher<const std::string&> matcher)
9343*5c90c05cSAndroid Build Coastguard Worker       : ForkingDeathTest(a_statement, std::move(matcher)) {}
9344*5c90c05cSAndroid Build Coastguard Worker   TestRole AssumeRole() override;
9345*5c90c05cSAndroid Build Coastguard Worker };
9346*5c90c05cSAndroid Build Coastguard Worker 
9347*5c90c05cSAndroid Build Coastguard Worker // The AssumeRole process for a fork-and-run death test.  It implements a
9348*5c90c05cSAndroid Build Coastguard Worker // straightforward fork, with a simple pipe to transmit the status byte.
AssumeRole()9349*5c90c05cSAndroid Build Coastguard Worker DeathTest::TestRole NoExecDeathTest::AssumeRole() {
9350*5c90c05cSAndroid Build Coastguard Worker   const size_t thread_count = GetThreadCount();
9351*5c90c05cSAndroid Build Coastguard Worker   if (thread_count != 1) {
9352*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOG_(WARNING) << DeathTestThreadWarning(thread_count);
9353*5c90c05cSAndroid Build Coastguard Worker   }
9354*5c90c05cSAndroid Build Coastguard Worker 
9355*5c90c05cSAndroid Build Coastguard Worker   int pipe_fd[2];
9356*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
9357*5c90c05cSAndroid Build Coastguard Worker 
9358*5c90c05cSAndroid Build Coastguard Worker   DeathTest::set_last_death_test_message("");
9359*5c90c05cSAndroid Build Coastguard Worker   CaptureStderr();
9360*5c90c05cSAndroid Build Coastguard Worker   // When we fork the process below, the log file buffers are copied, but the
9361*5c90c05cSAndroid Build Coastguard Worker   // file descriptors are shared.  We flush all log files here so that closing
9362*5c90c05cSAndroid Build Coastguard Worker   // the file descriptors in the child process doesn't throw off the
9363*5c90c05cSAndroid Build Coastguard Worker   // synchronization between descriptors and buffers in the parent process.
9364*5c90c05cSAndroid Build Coastguard Worker   // This is as close to the fork as possible to avoid a race condition in case
9365*5c90c05cSAndroid Build Coastguard Worker   // there are multiple threads running before the death test, and another
9366*5c90c05cSAndroid Build Coastguard Worker   // thread writes to the log file.
9367*5c90c05cSAndroid Build Coastguard Worker   FlushInfoLog();
9368*5c90c05cSAndroid Build Coastguard Worker 
9369*5c90c05cSAndroid Build Coastguard Worker   const pid_t child_pid = fork();
9370*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_(child_pid != -1);
9371*5c90c05cSAndroid Build Coastguard Worker   set_child_pid(child_pid);
9372*5c90c05cSAndroid Build Coastguard Worker   if (child_pid == 0) {
9373*5c90c05cSAndroid Build Coastguard Worker     GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[0]));
9374*5c90c05cSAndroid Build Coastguard Worker     set_write_fd(pipe_fd[1]);
9375*5c90c05cSAndroid Build Coastguard Worker     // Redirects all logging to stderr in the child process to prevent
9376*5c90c05cSAndroid Build Coastguard Worker     // concurrent writes to the log files.  We capture stderr in the parent
9377*5c90c05cSAndroid Build Coastguard Worker     // process and append the child process' output to a log.
9378*5c90c05cSAndroid Build Coastguard Worker     LogToStderr();
9379*5c90c05cSAndroid Build Coastguard Worker     // Event forwarding to the listeners of event listener API mush be shut
9380*5c90c05cSAndroid Build Coastguard Worker     // down in death test subprocesses.
9381*5c90c05cSAndroid Build Coastguard Worker     GetUnitTestImpl()->listeners()->SuppressEventForwarding();
9382*5c90c05cSAndroid Build Coastguard Worker     g_in_fast_death_test_child = true;
9383*5c90c05cSAndroid Build Coastguard Worker     return EXECUTE_TEST;
9384*5c90c05cSAndroid Build Coastguard Worker   } else {
9385*5c90c05cSAndroid Build Coastguard Worker     GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
9386*5c90c05cSAndroid Build Coastguard Worker     set_read_fd(pipe_fd[0]);
9387*5c90c05cSAndroid Build Coastguard Worker     set_spawned(true);
9388*5c90c05cSAndroid Build Coastguard Worker     return OVERSEE_TEST;
9389*5c90c05cSAndroid Build Coastguard Worker   }
9390*5c90c05cSAndroid Build Coastguard Worker }
9391*5c90c05cSAndroid Build Coastguard Worker 
9392*5c90c05cSAndroid Build Coastguard Worker // A concrete death test class that forks and re-executes the main
9393*5c90c05cSAndroid Build Coastguard Worker // program from the beginning, with command-line flags set that cause
9394*5c90c05cSAndroid Build Coastguard Worker // only this specific death test to be run.
9395*5c90c05cSAndroid Build Coastguard Worker class ExecDeathTest : public ForkingDeathTest {
9396*5c90c05cSAndroid Build Coastguard Worker  public:
ExecDeathTest(const char * a_statement,Matcher<const std::string &> matcher,const char * file,int line)9397*5c90c05cSAndroid Build Coastguard Worker   ExecDeathTest(const char* a_statement, Matcher<const std::string&> matcher,
9398*5c90c05cSAndroid Build Coastguard Worker                 const char* file, int line)
9399*5c90c05cSAndroid Build Coastguard Worker       : ForkingDeathTest(a_statement, std::move(matcher)),
9400*5c90c05cSAndroid Build Coastguard Worker         file_(file),
9401*5c90c05cSAndroid Build Coastguard Worker         line_(line) {}
9402*5c90c05cSAndroid Build Coastguard Worker   TestRole AssumeRole() override;
9403*5c90c05cSAndroid Build Coastguard Worker 
9404*5c90c05cSAndroid Build Coastguard Worker  private:
GetArgvsForDeathTestChildProcess()9405*5c90c05cSAndroid Build Coastguard Worker   static ::std::vector<std::string> GetArgvsForDeathTestChildProcess() {
9406*5c90c05cSAndroid Build Coastguard Worker     ::std::vector<std::string> args = GetInjectableArgvs();
9407*5c90c05cSAndroid Build Coastguard Worker #  if defined(GTEST_EXTRA_DEATH_TEST_COMMAND_LINE_ARGS_)
9408*5c90c05cSAndroid Build Coastguard Worker     ::std::vector<std::string> extra_args =
9409*5c90c05cSAndroid Build Coastguard Worker         GTEST_EXTRA_DEATH_TEST_COMMAND_LINE_ARGS_();
9410*5c90c05cSAndroid Build Coastguard Worker     args.insert(args.end(), extra_args.begin(), extra_args.end());
9411*5c90c05cSAndroid Build Coastguard Worker #  endif  // defined(GTEST_EXTRA_DEATH_TEST_COMMAND_LINE_ARGS_)
9412*5c90c05cSAndroid Build Coastguard Worker     return args;
9413*5c90c05cSAndroid Build Coastguard Worker   }
9414*5c90c05cSAndroid Build Coastguard Worker   // The name of the file in which the death test is located.
9415*5c90c05cSAndroid Build Coastguard Worker   const char* const file_;
9416*5c90c05cSAndroid Build Coastguard Worker   // The line number on which the death test is located.
9417*5c90c05cSAndroid Build Coastguard Worker   const int line_;
9418*5c90c05cSAndroid Build Coastguard Worker };
9419*5c90c05cSAndroid Build Coastguard Worker 
9420*5c90c05cSAndroid Build Coastguard Worker // Utility class for accumulating command-line arguments.
9421*5c90c05cSAndroid Build Coastguard Worker class Arguments {
9422*5c90c05cSAndroid Build Coastguard Worker  public:
Arguments()9423*5c90c05cSAndroid Build Coastguard Worker   Arguments() { args_.push_back(nullptr); }
9424*5c90c05cSAndroid Build Coastguard Worker 
~Arguments()9425*5c90c05cSAndroid Build Coastguard Worker   ~Arguments() {
9426*5c90c05cSAndroid Build Coastguard Worker     for (std::vector<char*>::iterator i = args_.begin(); i != args_.end();
9427*5c90c05cSAndroid Build Coastguard Worker          ++i) {
9428*5c90c05cSAndroid Build Coastguard Worker       free(*i);
9429*5c90c05cSAndroid Build Coastguard Worker     }
9430*5c90c05cSAndroid Build Coastguard Worker   }
AddArgument(const char * argument)9431*5c90c05cSAndroid Build Coastguard Worker   void AddArgument(const char* argument) {
9432*5c90c05cSAndroid Build Coastguard Worker     args_.insert(args_.end() - 1, posix::StrDup(argument));
9433*5c90c05cSAndroid Build Coastguard Worker   }
9434*5c90c05cSAndroid Build Coastguard Worker 
9435*5c90c05cSAndroid Build Coastguard Worker   template <typename Str>
AddArguments(const::std::vector<Str> & arguments)9436*5c90c05cSAndroid Build Coastguard Worker   void AddArguments(const ::std::vector<Str>& arguments) {
9437*5c90c05cSAndroid Build Coastguard Worker     for (typename ::std::vector<Str>::const_iterator i = arguments.begin();
9438*5c90c05cSAndroid Build Coastguard Worker          i != arguments.end();
9439*5c90c05cSAndroid Build Coastguard Worker          ++i) {
9440*5c90c05cSAndroid Build Coastguard Worker       args_.insert(args_.end() - 1, posix::StrDup(i->c_str()));
9441*5c90c05cSAndroid Build Coastguard Worker     }
9442*5c90c05cSAndroid Build Coastguard Worker   }
Argv()9443*5c90c05cSAndroid Build Coastguard Worker   char* const* Argv() {
9444*5c90c05cSAndroid Build Coastguard Worker     return &args_[0];
9445*5c90c05cSAndroid Build Coastguard Worker   }
9446*5c90c05cSAndroid Build Coastguard Worker 
9447*5c90c05cSAndroid Build Coastguard Worker  private:
9448*5c90c05cSAndroid Build Coastguard Worker   std::vector<char*> args_;
9449*5c90c05cSAndroid Build Coastguard Worker };
9450*5c90c05cSAndroid Build Coastguard Worker 
9451*5c90c05cSAndroid Build Coastguard Worker // A struct that encompasses the arguments to the child process of a
9452*5c90c05cSAndroid Build Coastguard Worker // threadsafe-style death test process.
9453*5c90c05cSAndroid Build Coastguard Worker struct ExecDeathTestArgs {
9454*5c90c05cSAndroid Build Coastguard Worker   char* const* argv;  // Command-line arguments for the child's call to exec
9455*5c90c05cSAndroid Build Coastguard Worker   int close_fd;       // File descriptor to close; the read end of a pipe
9456*5c90c05cSAndroid Build Coastguard Worker };
9457*5c90c05cSAndroid Build Coastguard Worker 
9458*5c90c05cSAndroid Build Coastguard Worker #  if GTEST_OS_QNX
9459*5c90c05cSAndroid Build Coastguard Worker extern "C" char** environ;
9460*5c90c05cSAndroid Build Coastguard Worker #  else  // GTEST_OS_QNX
9461*5c90c05cSAndroid Build Coastguard Worker // The main function for a threadsafe-style death test child process.
9462*5c90c05cSAndroid Build Coastguard Worker // This function is called in a clone()-ed process and thus must avoid
9463*5c90c05cSAndroid Build Coastguard Worker // any potentially unsafe operations like malloc or libc functions.
ExecDeathTestChildMain(void * child_arg)9464*5c90c05cSAndroid Build Coastguard Worker static int ExecDeathTestChildMain(void* child_arg) {
9465*5c90c05cSAndroid Build Coastguard Worker   ExecDeathTestArgs* const args = static_cast<ExecDeathTestArgs*>(child_arg);
9466*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_SYSCALL_(close(args->close_fd));
9467*5c90c05cSAndroid Build Coastguard Worker 
9468*5c90c05cSAndroid Build Coastguard Worker   // We need to execute the test program in the same environment where
9469*5c90c05cSAndroid Build Coastguard Worker   // it was originally invoked.  Therefore we change to the original
9470*5c90c05cSAndroid Build Coastguard Worker   // working directory first.
9471*5c90c05cSAndroid Build Coastguard Worker   const char* const original_dir =
9472*5c90c05cSAndroid Build Coastguard Worker       UnitTest::GetInstance()->original_working_dir();
9473*5c90c05cSAndroid Build Coastguard Worker   // We can safely call chdir() as it's a direct system call.
9474*5c90c05cSAndroid Build Coastguard Worker   if (chdir(original_dir) != 0) {
9475*5c90c05cSAndroid Build Coastguard Worker     DeathTestAbort(std::string("chdir(\"") + original_dir + "\") failed: " +
9476*5c90c05cSAndroid Build Coastguard Worker                    GetLastErrnoDescription());
9477*5c90c05cSAndroid Build Coastguard Worker     return EXIT_FAILURE;
9478*5c90c05cSAndroid Build Coastguard Worker   }
9479*5c90c05cSAndroid Build Coastguard Worker 
9480*5c90c05cSAndroid Build Coastguard Worker   // We can safely call execv() as it's almost a direct system call. We
9481*5c90c05cSAndroid Build Coastguard Worker   // cannot use execvp() as it's a libc function and thus potentially
9482*5c90c05cSAndroid Build Coastguard Worker   // unsafe.  Since execv() doesn't search the PATH, the user must
9483*5c90c05cSAndroid Build Coastguard Worker   // invoke the test program via a valid path that contains at least
9484*5c90c05cSAndroid Build Coastguard Worker   // one path separator.
9485*5c90c05cSAndroid Build Coastguard Worker   execv(args->argv[0], args->argv);
9486*5c90c05cSAndroid Build Coastguard Worker   DeathTestAbort(std::string("execv(") + args->argv[0] + ", ...) in " +
9487*5c90c05cSAndroid Build Coastguard Worker                  original_dir + " failed: " +
9488*5c90c05cSAndroid Build Coastguard Worker                  GetLastErrnoDescription());
9489*5c90c05cSAndroid Build Coastguard Worker   return EXIT_FAILURE;
9490*5c90c05cSAndroid Build Coastguard Worker }
9491*5c90c05cSAndroid Build Coastguard Worker #  endif  // GTEST_OS_QNX
9492*5c90c05cSAndroid Build Coastguard Worker 
9493*5c90c05cSAndroid Build Coastguard Worker #  if GTEST_HAS_CLONE
9494*5c90c05cSAndroid Build Coastguard Worker // Two utility routines that together determine the direction the stack
9495*5c90c05cSAndroid Build Coastguard Worker // grows.
9496*5c90c05cSAndroid Build Coastguard Worker // This could be accomplished more elegantly by a single recursive
9497*5c90c05cSAndroid Build Coastguard Worker // function, but we want to guard against the unlikely possibility of
9498*5c90c05cSAndroid Build Coastguard Worker // a smart compiler optimizing the recursion away.
9499*5c90c05cSAndroid Build Coastguard Worker //
9500*5c90c05cSAndroid Build Coastguard Worker // GTEST_NO_INLINE_ is required to prevent GCC 4.6 from inlining
9501*5c90c05cSAndroid Build Coastguard Worker // StackLowerThanAddress into StackGrowsDown, which then doesn't give
9502*5c90c05cSAndroid Build Coastguard Worker // correct answer.
9503*5c90c05cSAndroid Build Coastguard Worker static void StackLowerThanAddress(const void* ptr,
9504*5c90c05cSAndroid Build Coastguard Worker                                   bool* result) GTEST_NO_INLINE_;
9505*5c90c05cSAndroid Build Coastguard Worker // Make sure sanitizers do not tamper with the stack here.
9506*5c90c05cSAndroid Build Coastguard Worker // Ideally, we want to use `__builtin_frame_address` instead of a local variable
9507*5c90c05cSAndroid Build Coastguard Worker // address with sanitizer disabled, but it does not work when the
9508*5c90c05cSAndroid Build Coastguard Worker // compiler optimizes the stack frame out, which happens on PowerPC targets.
9509*5c90c05cSAndroid Build Coastguard Worker // HWAddressSanitizer add a random tag to the MSB of the local variable address,
9510*5c90c05cSAndroid Build Coastguard Worker // making comparison result unpredictable.
9511*5c90c05cSAndroid Build Coastguard Worker GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_
9512*5c90c05cSAndroid Build Coastguard Worker GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_
StackLowerThanAddress(const void * ptr,bool * result)9513*5c90c05cSAndroid Build Coastguard Worker static void StackLowerThanAddress(const void* ptr, bool* result) {
9514*5c90c05cSAndroid Build Coastguard Worker   int dummy = 0;
9515*5c90c05cSAndroid Build Coastguard Worker   *result = std::less<const void*>()(&dummy, ptr);
9516*5c90c05cSAndroid Build Coastguard Worker }
9517*5c90c05cSAndroid Build Coastguard Worker 
9518*5c90c05cSAndroid Build Coastguard Worker // Make sure AddressSanitizer does not tamper with the stack here.
9519*5c90c05cSAndroid Build Coastguard Worker GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_
9520*5c90c05cSAndroid Build Coastguard Worker GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_
StackGrowsDown()9521*5c90c05cSAndroid Build Coastguard Worker static bool StackGrowsDown() {
9522*5c90c05cSAndroid Build Coastguard Worker   int dummy = 0;
9523*5c90c05cSAndroid Build Coastguard Worker   bool result;
9524*5c90c05cSAndroid Build Coastguard Worker   StackLowerThanAddress(&dummy, &result);
9525*5c90c05cSAndroid Build Coastguard Worker   return result;
9526*5c90c05cSAndroid Build Coastguard Worker }
9527*5c90c05cSAndroid Build Coastguard Worker #  endif  // GTEST_HAS_CLONE
9528*5c90c05cSAndroid Build Coastguard Worker 
9529*5c90c05cSAndroid Build Coastguard Worker // Spawns a child process with the same executable as the current process in
9530*5c90c05cSAndroid Build Coastguard Worker // a thread-safe manner and instructs it to run the death test.  The
9531*5c90c05cSAndroid Build Coastguard Worker // implementation uses fork(2) + exec.  On systems where clone(2) is
9532*5c90c05cSAndroid Build Coastguard Worker // available, it is used instead, being slightly more thread-safe.  On QNX,
9533*5c90c05cSAndroid Build Coastguard Worker // fork supports only single-threaded environments, so this function uses
9534*5c90c05cSAndroid Build Coastguard Worker // spawn(2) there instead.  The function dies with an error message if
9535*5c90c05cSAndroid Build Coastguard Worker // anything goes wrong.
ExecDeathTestSpawnChild(char * const * argv,int close_fd)9536*5c90c05cSAndroid Build Coastguard Worker static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {
9537*5c90c05cSAndroid Build Coastguard Worker   ExecDeathTestArgs args = { argv, close_fd };
9538*5c90c05cSAndroid Build Coastguard Worker   pid_t child_pid = -1;
9539*5c90c05cSAndroid Build Coastguard Worker 
9540*5c90c05cSAndroid Build Coastguard Worker #  if GTEST_OS_QNX
9541*5c90c05cSAndroid Build Coastguard Worker   // Obtains the current directory and sets it to be closed in the child
9542*5c90c05cSAndroid Build Coastguard Worker   // process.
9543*5c90c05cSAndroid Build Coastguard Worker   const int cwd_fd = open(".", O_RDONLY);
9544*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_(cwd_fd != -1);
9545*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(cwd_fd, F_SETFD, FD_CLOEXEC));
9546*5c90c05cSAndroid Build Coastguard Worker   // We need to execute the test program in the same environment where
9547*5c90c05cSAndroid Build Coastguard Worker   // it was originally invoked.  Therefore we change to the original
9548*5c90c05cSAndroid Build Coastguard Worker   // working directory first.
9549*5c90c05cSAndroid Build Coastguard Worker   const char* const original_dir =
9550*5c90c05cSAndroid Build Coastguard Worker       UnitTest::GetInstance()->original_working_dir();
9551*5c90c05cSAndroid Build Coastguard Worker   // We can safely call chdir() as it's a direct system call.
9552*5c90c05cSAndroid Build Coastguard Worker   if (chdir(original_dir) != 0) {
9553*5c90c05cSAndroid Build Coastguard Worker     DeathTestAbort(std::string("chdir(\"") + original_dir + "\") failed: " +
9554*5c90c05cSAndroid Build Coastguard Worker                    GetLastErrnoDescription());
9555*5c90c05cSAndroid Build Coastguard Worker     return EXIT_FAILURE;
9556*5c90c05cSAndroid Build Coastguard Worker   }
9557*5c90c05cSAndroid Build Coastguard Worker 
9558*5c90c05cSAndroid Build Coastguard Worker   int fd_flags;
9559*5c90c05cSAndroid Build Coastguard Worker   // Set close_fd to be closed after spawn.
9560*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_SYSCALL_(fd_flags = fcntl(close_fd, F_GETFD));
9561*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(close_fd, F_SETFD,
9562*5c90c05cSAndroid Build Coastguard Worker                                         fd_flags | FD_CLOEXEC));
9563*5c90c05cSAndroid Build Coastguard Worker   struct inheritance inherit = {0};
9564*5c90c05cSAndroid Build Coastguard Worker   // spawn is a system call.
9565*5c90c05cSAndroid Build Coastguard Worker   child_pid = spawn(args.argv[0], 0, nullptr, &inherit, args.argv, environ);
9566*5c90c05cSAndroid Build Coastguard Worker   // Restores the current working directory.
9567*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_(fchdir(cwd_fd) != -1);
9568*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_SYSCALL_(close(cwd_fd));
9569*5c90c05cSAndroid Build Coastguard Worker 
9570*5c90c05cSAndroid Build Coastguard Worker #  else   // GTEST_OS_QNX
9571*5c90c05cSAndroid Build Coastguard Worker #   if GTEST_OS_LINUX
9572*5c90c05cSAndroid Build Coastguard Worker   // When a SIGPROF signal is received while fork() or clone() are executing,
9573*5c90c05cSAndroid Build Coastguard Worker   // the process may hang. To avoid this, we ignore SIGPROF here and re-enable
9574*5c90c05cSAndroid Build Coastguard Worker   // it after the call to fork()/clone() is complete.
9575*5c90c05cSAndroid Build Coastguard Worker   struct sigaction saved_sigprof_action;
9576*5c90c05cSAndroid Build Coastguard Worker   struct sigaction ignore_sigprof_action;
9577*5c90c05cSAndroid Build Coastguard Worker   memset(&ignore_sigprof_action, 0, sizeof(ignore_sigprof_action));
9578*5c90c05cSAndroid Build Coastguard Worker   sigemptyset(&ignore_sigprof_action.sa_mask);
9579*5c90c05cSAndroid Build Coastguard Worker   ignore_sigprof_action.sa_handler = SIG_IGN;
9580*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_SYSCALL_(sigaction(
9581*5c90c05cSAndroid Build Coastguard Worker       SIGPROF, &ignore_sigprof_action, &saved_sigprof_action));
9582*5c90c05cSAndroid Build Coastguard Worker #   endif  // GTEST_OS_LINUX
9583*5c90c05cSAndroid Build Coastguard Worker 
9584*5c90c05cSAndroid Build Coastguard Worker #   if GTEST_HAS_CLONE
9585*5c90c05cSAndroid Build Coastguard Worker   const bool use_fork = GTEST_FLAG(death_test_use_fork);
9586*5c90c05cSAndroid Build Coastguard Worker 
9587*5c90c05cSAndroid Build Coastguard Worker   if (!use_fork) {
9588*5c90c05cSAndroid Build Coastguard Worker     static const bool stack_grows_down = StackGrowsDown();
9589*5c90c05cSAndroid Build Coastguard Worker     const auto stack_size = static_cast<size_t>(getpagesize() * 2);
9590*5c90c05cSAndroid Build Coastguard Worker     // MMAP_ANONYMOUS is not defined on Mac, so we use MAP_ANON instead.
9591*5c90c05cSAndroid Build Coastguard Worker     void* const stack = mmap(nullptr, stack_size, PROT_READ | PROT_WRITE,
9592*5c90c05cSAndroid Build Coastguard Worker                              MAP_ANON | MAP_PRIVATE, -1, 0);
9593*5c90c05cSAndroid Build Coastguard Worker     GTEST_DEATH_TEST_CHECK_(stack != MAP_FAILED);
9594*5c90c05cSAndroid Build Coastguard Worker 
9595*5c90c05cSAndroid Build Coastguard Worker     // Maximum stack alignment in bytes:  For a downward-growing stack, this
9596*5c90c05cSAndroid Build Coastguard Worker     // amount is subtracted from size of the stack space to get an address
9597*5c90c05cSAndroid Build Coastguard Worker     // that is within the stack space and is aligned on all systems we care
9598*5c90c05cSAndroid Build Coastguard Worker     // about.  As far as I know there is no ABI with stack alignment greater
9599*5c90c05cSAndroid Build Coastguard Worker     // than 64.  We assume stack and stack_size already have alignment of
9600*5c90c05cSAndroid Build Coastguard Worker     // kMaxStackAlignment.
9601*5c90c05cSAndroid Build Coastguard Worker     const size_t kMaxStackAlignment = 64;
9602*5c90c05cSAndroid Build Coastguard Worker     void* const stack_top =
9603*5c90c05cSAndroid Build Coastguard Worker         static_cast<char*>(stack) +
9604*5c90c05cSAndroid Build Coastguard Worker             (stack_grows_down ? stack_size - kMaxStackAlignment : 0);
9605*5c90c05cSAndroid Build Coastguard Worker     GTEST_DEATH_TEST_CHECK_(
9606*5c90c05cSAndroid Build Coastguard Worker         static_cast<size_t>(stack_size) > kMaxStackAlignment &&
9607*5c90c05cSAndroid Build Coastguard Worker         reinterpret_cast<uintptr_t>(stack_top) % kMaxStackAlignment == 0);
9608*5c90c05cSAndroid Build Coastguard Worker 
9609*5c90c05cSAndroid Build Coastguard Worker     child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args);
9610*5c90c05cSAndroid Build Coastguard Worker 
9611*5c90c05cSAndroid Build Coastguard Worker     GTEST_DEATH_TEST_CHECK_(munmap(stack, stack_size) != -1);
9612*5c90c05cSAndroid Build Coastguard Worker   }
9613*5c90c05cSAndroid Build Coastguard Worker #   else
9614*5c90c05cSAndroid Build Coastguard Worker   const bool use_fork = true;
9615*5c90c05cSAndroid Build Coastguard Worker #   endif  // GTEST_HAS_CLONE
9616*5c90c05cSAndroid Build Coastguard Worker 
9617*5c90c05cSAndroid Build Coastguard Worker   if (use_fork && (child_pid = fork()) == 0) {
9618*5c90c05cSAndroid Build Coastguard Worker       ExecDeathTestChildMain(&args);
9619*5c90c05cSAndroid Build Coastguard Worker       _exit(0);
9620*5c90c05cSAndroid Build Coastguard Worker   }
9621*5c90c05cSAndroid Build Coastguard Worker #  endif  // GTEST_OS_QNX
9622*5c90c05cSAndroid Build Coastguard Worker #  if GTEST_OS_LINUX
9623*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_SYSCALL_(
9624*5c90c05cSAndroid Build Coastguard Worker       sigaction(SIGPROF, &saved_sigprof_action, nullptr));
9625*5c90c05cSAndroid Build Coastguard Worker #  endif  // GTEST_OS_LINUX
9626*5c90c05cSAndroid Build Coastguard Worker 
9627*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_(child_pid != -1);
9628*5c90c05cSAndroid Build Coastguard Worker   return child_pid;
9629*5c90c05cSAndroid Build Coastguard Worker }
9630*5c90c05cSAndroid Build Coastguard Worker 
9631*5c90c05cSAndroid Build Coastguard Worker // The AssumeRole process for a fork-and-exec death test.  It re-executes the
9632*5c90c05cSAndroid Build Coastguard Worker // main program from the beginning, setting the --gtest_filter
9633*5c90c05cSAndroid Build Coastguard Worker // and --gtest_internal_run_death_test flags to cause only the current
9634*5c90c05cSAndroid Build Coastguard Worker // death test to be re-run.
AssumeRole()9635*5c90c05cSAndroid Build Coastguard Worker DeathTest::TestRole ExecDeathTest::AssumeRole() {
9636*5c90c05cSAndroid Build Coastguard Worker   const UnitTestImpl* const impl = GetUnitTestImpl();
9637*5c90c05cSAndroid Build Coastguard Worker   const InternalRunDeathTestFlag* const flag =
9638*5c90c05cSAndroid Build Coastguard Worker       impl->internal_run_death_test_flag();
9639*5c90c05cSAndroid Build Coastguard Worker   const TestInfo* const info = impl->current_test_info();
9640*5c90c05cSAndroid Build Coastguard Worker   const int death_test_index = info->result()->death_test_count();
9641*5c90c05cSAndroid Build Coastguard Worker 
9642*5c90c05cSAndroid Build Coastguard Worker   if (flag != nullptr) {
9643*5c90c05cSAndroid Build Coastguard Worker     set_write_fd(flag->write_fd());
9644*5c90c05cSAndroid Build Coastguard Worker     return EXECUTE_TEST;
9645*5c90c05cSAndroid Build Coastguard Worker   }
9646*5c90c05cSAndroid Build Coastguard Worker 
9647*5c90c05cSAndroid Build Coastguard Worker   int pipe_fd[2];
9648*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
9649*5c90c05cSAndroid Build Coastguard Worker   // Clear the close-on-exec flag on the write end of the pipe, lest
9650*5c90c05cSAndroid Build Coastguard Worker   // it be closed when the child process does an exec:
9651*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_(fcntl(pipe_fd[1], F_SETFD, 0) != -1);
9652*5c90c05cSAndroid Build Coastguard Worker 
9653*5c90c05cSAndroid Build Coastguard Worker   const std::string filter_flag = std::string("--") + GTEST_FLAG_PREFIX_ +
9654*5c90c05cSAndroid Build Coastguard Worker                                   kFilterFlag + "=" + info->test_suite_name() +
9655*5c90c05cSAndroid Build Coastguard Worker                                   "." + info->name();
9656*5c90c05cSAndroid Build Coastguard Worker   const std::string internal_flag =
9657*5c90c05cSAndroid Build Coastguard Worker       std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag + "="
9658*5c90c05cSAndroid Build Coastguard Worker       + file_ + "|" + StreamableToString(line_) + "|"
9659*5c90c05cSAndroid Build Coastguard Worker       + StreamableToString(death_test_index) + "|"
9660*5c90c05cSAndroid Build Coastguard Worker       + StreamableToString(pipe_fd[1]);
9661*5c90c05cSAndroid Build Coastguard Worker   Arguments args;
9662*5c90c05cSAndroid Build Coastguard Worker   args.AddArguments(GetArgvsForDeathTestChildProcess());
9663*5c90c05cSAndroid Build Coastguard Worker   args.AddArgument(filter_flag.c_str());
9664*5c90c05cSAndroid Build Coastguard Worker   args.AddArgument(internal_flag.c_str());
9665*5c90c05cSAndroid Build Coastguard Worker 
9666*5c90c05cSAndroid Build Coastguard Worker   DeathTest::set_last_death_test_message("");
9667*5c90c05cSAndroid Build Coastguard Worker 
9668*5c90c05cSAndroid Build Coastguard Worker   CaptureStderr();
9669*5c90c05cSAndroid Build Coastguard Worker   // See the comment in NoExecDeathTest::AssumeRole for why the next line
9670*5c90c05cSAndroid Build Coastguard Worker   // is necessary.
9671*5c90c05cSAndroid Build Coastguard Worker   FlushInfoLog();
9672*5c90c05cSAndroid Build Coastguard Worker 
9673*5c90c05cSAndroid Build Coastguard Worker   const pid_t child_pid = ExecDeathTestSpawnChild(args.Argv(), pipe_fd[0]);
9674*5c90c05cSAndroid Build Coastguard Worker   GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
9675*5c90c05cSAndroid Build Coastguard Worker   set_child_pid(child_pid);
9676*5c90c05cSAndroid Build Coastguard Worker   set_read_fd(pipe_fd[0]);
9677*5c90c05cSAndroid Build Coastguard Worker   set_spawned(true);
9678*5c90c05cSAndroid Build Coastguard Worker   return OVERSEE_TEST;
9679*5c90c05cSAndroid Build Coastguard Worker }
9680*5c90c05cSAndroid Build Coastguard Worker 
9681*5c90c05cSAndroid Build Coastguard Worker # endif  // !GTEST_OS_WINDOWS
9682*5c90c05cSAndroid Build Coastguard Worker 
9683*5c90c05cSAndroid Build Coastguard Worker // Creates a concrete DeathTest-derived class that depends on the
9684*5c90c05cSAndroid Build Coastguard Worker // --gtest_death_test_style flag, and sets the pointer pointed to
9685*5c90c05cSAndroid Build Coastguard Worker // by the "test" argument to its address.  If the test should be
9686*5c90c05cSAndroid Build Coastguard Worker // skipped, sets that pointer to NULL.  Returns true, unless the
9687*5c90c05cSAndroid Build Coastguard Worker // flag is set to an invalid value.
Create(const char * statement,Matcher<const std::string &> matcher,const char * file,int line,DeathTest ** test)9688*5c90c05cSAndroid Build Coastguard Worker bool DefaultDeathTestFactory::Create(const char* statement,
9689*5c90c05cSAndroid Build Coastguard Worker                                      Matcher<const std::string&> matcher,
9690*5c90c05cSAndroid Build Coastguard Worker                                      const char* file, int line,
9691*5c90c05cSAndroid Build Coastguard Worker                                      DeathTest** test) {
9692*5c90c05cSAndroid Build Coastguard Worker   UnitTestImpl* const impl = GetUnitTestImpl();
9693*5c90c05cSAndroid Build Coastguard Worker   const InternalRunDeathTestFlag* const flag =
9694*5c90c05cSAndroid Build Coastguard Worker       impl->internal_run_death_test_flag();
9695*5c90c05cSAndroid Build Coastguard Worker   const int death_test_index = impl->current_test_info()
9696*5c90c05cSAndroid Build Coastguard Worker       ->increment_death_test_count();
9697*5c90c05cSAndroid Build Coastguard Worker 
9698*5c90c05cSAndroid Build Coastguard Worker   if (flag != nullptr) {
9699*5c90c05cSAndroid Build Coastguard Worker     if (death_test_index > flag->index()) {
9700*5c90c05cSAndroid Build Coastguard Worker       DeathTest::set_last_death_test_message(
9701*5c90c05cSAndroid Build Coastguard Worker           "Death test count (" + StreamableToString(death_test_index)
9702*5c90c05cSAndroid Build Coastguard Worker           + ") somehow exceeded expected maximum ("
9703*5c90c05cSAndroid Build Coastguard Worker           + StreamableToString(flag->index()) + ")");
9704*5c90c05cSAndroid Build Coastguard Worker       return false;
9705*5c90c05cSAndroid Build Coastguard Worker     }
9706*5c90c05cSAndroid Build Coastguard Worker 
9707*5c90c05cSAndroid Build Coastguard Worker     if (!(flag->file() == file && flag->line() == line &&
9708*5c90c05cSAndroid Build Coastguard Worker           flag->index() == death_test_index)) {
9709*5c90c05cSAndroid Build Coastguard Worker       *test = nullptr;
9710*5c90c05cSAndroid Build Coastguard Worker       return true;
9711*5c90c05cSAndroid Build Coastguard Worker     }
9712*5c90c05cSAndroid Build Coastguard Worker   }
9713*5c90c05cSAndroid Build Coastguard Worker 
9714*5c90c05cSAndroid Build Coastguard Worker # if GTEST_OS_WINDOWS
9715*5c90c05cSAndroid Build Coastguard Worker 
9716*5c90c05cSAndroid Build Coastguard Worker   if (GTEST_FLAG(death_test_style) == "threadsafe" ||
9717*5c90c05cSAndroid Build Coastguard Worker       GTEST_FLAG(death_test_style) == "fast") {
9718*5c90c05cSAndroid Build Coastguard Worker     *test = new WindowsDeathTest(statement, std::move(matcher), file, line);
9719*5c90c05cSAndroid Build Coastguard Worker   }
9720*5c90c05cSAndroid Build Coastguard Worker 
9721*5c90c05cSAndroid Build Coastguard Worker # elif GTEST_OS_FUCHSIA
9722*5c90c05cSAndroid Build Coastguard Worker 
9723*5c90c05cSAndroid Build Coastguard Worker   if (GTEST_FLAG(death_test_style) == "threadsafe" ||
9724*5c90c05cSAndroid Build Coastguard Worker       GTEST_FLAG(death_test_style) == "fast") {
9725*5c90c05cSAndroid Build Coastguard Worker     *test = new FuchsiaDeathTest(statement, std::move(matcher), file, line);
9726*5c90c05cSAndroid Build Coastguard Worker   }
9727*5c90c05cSAndroid Build Coastguard Worker 
9728*5c90c05cSAndroid Build Coastguard Worker # else
9729*5c90c05cSAndroid Build Coastguard Worker 
9730*5c90c05cSAndroid Build Coastguard Worker   if (GTEST_FLAG(death_test_style) == "threadsafe") {
9731*5c90c05cSAndroid Build Coastguard Worker     *test = new ExecDeathTest(statement, std::move(matcher), file, line);
9732*5c90c05cSAndroid Build Coastguard Worker   } else if (GTEST_FLAG(death_test_style) == "fast") {
9733*5c90c05cSAndroid Build Coastguard Worker     *test = new NoExecDeathTest(statement, std::move(matcher));
9734*5c90c05cSAndroid Build Coastguard Worker   }
9735*5c90c05cSAndroid Build Coastguard Worker 
9736*5c90c05cSAndroid Build Coastguard Worker # endif  // GTEST_OS_WINDOWS
9737*5c90c05cSAndroid Build Coastguard Worker 
9738*5c90c05cSAndroid Build Coastguard Worker   else {  // NOLINT - this is more readable than unbalanced brackets inside #if.
9739*5c90c05cSAndroid Build Coastguard Worker     DeathTest::set_last_death_test_message(
9740*5c90c05cSAndroid Build Coastguard Worker         "Unknown death test style \"" + GTEST_FLAG(death_test_style)
9741*5c90c05cSAndroid Build Coastguard Worker         + "\" encountered");
9742*5c90c05cSAndroid Build Coastguard Worker     return false;
9743*5c90c05cSAndroid Build Coastguard Worker   }
9744*5c90c05cSAndroid Build Coastguard Worker 
9745*5c90c05cSAndroid Build Coastguard Worker   return true;
9746*5c90c05cSAndroid Build Coastguard Worker }
9747*5c90c05cSAndroid Build Coastguard Worker 
9748*5c90c05cSAndroid Build Coastguard Worker # if GTEST_OS_WINDOWS
9749*5c90c05cSAndroid Build Coastguard Worker // Recreates the pipe and event handles from the provided parameters,
9750*5c90c05cSAndroid Build Coastguard Worker // signals the event, and returns a file descriptor wrapped around the pipe
9751*5c90c05cSAndroid Build Coastguard Worker // handle. This function is called in the child process only.
GetStatusFileDescriptor(unsigned int parent_process_id,size_t write_handle_as_size_t,size_t event_handle_as_size_t)9752*5c90c05cSAndroid Build Coastguard Worker static int GetStatusFileDescriptor(unsigned int parent_process_id,
9753*5c90c05cSAndroid Build Coastguard Worker                             size_t write_handle_as_size_t,
9754*5c90c05cSAndroid Build Coastguard Worker                             size_t event_handle_as_size_t) {
9755*5c90c05cSAndroid Build Coastguard Worker   AutoHandle parent_process_handle(::OpenProcess(PROCESS_DUP_HANDLE,
9756*5c90c05cSAndroid Build Coastguard Worker                                                    FALSE,  // Non-inheritable.
9757*5c90c05cSAndroid Build Coastguard Worker                                                    parent_process_id));
9758*5c90c05cSAndroid Build Coastguard Worker   if (parent_process_handle.Get() == INVALID_HANDLE_VALUE) {
9759*5c90c05cSAndroid Build Coastguard Worker     DeathTestAbort("Unable to open parent process " +
9760*5c90c05cSAndroid Build Coastguard Worker                    StreamableToString(parent_process_id));
9761*5c90c05cSAndroid Build Coastguard Worker   }
9762*5c90c05cSAndroid Build Coastguard Worker 
9763*5c90c05cSAndroid Build Coastguard Worker   GTEST_CHECK_(sizeof(HANDLE) <= sizeof(size_t));
9764*5c90c05cSAndroid Build Coastguard Worker 
9765*5c90c05cSAndroid Build Coastguard Worker   const HANDLE write_handle =
9766*5c90c05cSAndroid Build Coastguard Worker       reinterpret_cast<HANDLE>(write_handle_as_size_t);
9767*5c90c05cSAndroid Build Coastguard Worker   HANDLE dup_write_handle;
9768*5c90c05cSAndroid Build Coastguard Worker 
9769*5c90c05cSAndroid Build Coastguard Worker   // The newly initialized handle is accessible only in the parent
9770*5c90c05cSAndroid Build Coastguard Worker   // process. To obtain one accessible within the child, we need to use
9771*5c90c05cSAndroid Build Coastguard Worker   // DuplicateHandle.
9772*5c90c05cSAndroid Build Coastguard Worker   if (!::DuplicateHandle(parent_process_handle.Get(), write_handle,
9773*5c90c05cSAndroid Build Coastguard Worker                          ::GetCurrentProcess(), &dup_write_handle,
9774*5c90c05cSAndroid Build Coastguard Worker                          0x0,    // Requested privileges ignored since
9775*5c90c05cSAndroid Build Coastguard Worker                                  // DUPLICATE_SAME_ACCESS is used.
9776*5c90c05cSAndroid Build Coastguard Worker                          FALSE,  // Request non-inheritable handler.
9777*5c90c05cSAndroid Build Coastguard Worker                          DUPLICATE_SAME_ACCESS)) {
9778*5c90c05cSAndroid Build Coastguard Worker     DeathTestAbort("Unable to duplicate the pipe handle " +
9779*5c90c05cSAndroid Build Coastguard Worker                    StreamableToString(write_handle_as_size_t) +
9780*5c90c05cSAndroid Build Coastguard Worker                    " from the parent process " +
9781*5c90c05cSAndroid Build Coastguard Worker                    StreamableToString(parent_process_id));
9782*5c90c05cSAndroid Build Coastguard Worker   }
9783*5c90c05cSAndroid Build Coastguard Worker 
9784*5c90c05cSAndroid Build Coastguard Worker   const HANDLE event_handle = reinterpret_cast<HANDLE>(event_handle_as_size_t);
9785*5c90c05cSAndroid Build Coastguard Worker   HANDLE dup_event_handle;
9786*5c90c05cSAndroid Build Coastguard Worker 
9787*5c90c05cSAndroid Build Coastguard Worker   if (!::DuplicateHandle(parent_process_handle.Get(), event_handle,
9788*5c90c05cSAndroid Build Coastguard Worker                          ::GetCurrentProcess(), &dup_event_handle,
9789*5c90c05cSAndroid Build Coastguard Worker                          0x0,
9790*5c90c05cSAndroid Build Coastguard Worker                          FALSE,
9791*5c90c05cSAndroid Build Coastguard Worker                          DUPLICATE_SAME_ACCESS)) {
9792*5c90c05cSAndroid Build Coastguard Worker     DeathTestAbort("Unable to duplicate the event handle " +
9793*5c90c05cSAndroid Build Coastguard Worker                    StreamableToString(event_handle_as_size_t) +
9794*5c90c05cSAndroid Build Coastguard Worker                    " from the parent process " +
9795*5c90c05cSAndroid Build Coastguard Worker                    StreamableToString(parent_process_id));
9796*5c90c05cSAndroid Build Coastguard Worker   }
9797*5c90c05cSAndroid Build Coastguard Worker 
9798*5c90c05cSAndroid Build Coastguard Worker   const int write_fd =
9799*5c90c05cSAndroid Build Coastguard Worker       ::_open_osfhandle(reinterpret_cast<intptr_t>(dup_write_handle), O_APPEND);
9800*5c90c05cSAndroid Build Coastguard Worker   if (write_fd == -1) {
9801*5c90c05cSAndroid Build Coastguard Worker     DeathTestAbort("Unable to convert pipe handle " +
9802*5c90c05cSAndroid Build Coastguard Worker                    StreamableToString(write_handle_as_size_t) +
9803*5c90c05cSAndroid Build Coastguard Worker                    " to a file descriptor");
9804*5c90c05cSAndroid Build Coastguard Worker   }
9805*5c90c05cSAndroid Build Coastguard Worker 
9806*5c90c05cSAndroid Build Coastguard Worker   // Signals the parent that the write end of the pipe has been acquired
9807*5c90c05cSAndroid Build Coastguard Worker   // so the parent can release its own write end.
9808*5c90c05cSAndroid Build Coastguard Worker   ::SetEvent(dup_event_handle);
9809*5c90c05cSAndroid Build Coastguard Worker 
9810*5c90c05cSAndroid Build Coastguard Worker   return write_fd;
9811*5c90c05cSAndroid Build Coastguard Worker }
9812*5c90c05cSAndroid Build Coastguard Worker # endif  // GTEST_OS_WINDOWS
9813*5c90c05cSAndroid Build Coastguard Worker 
9814*5c90c05cSAndroid Build Coastguard Worker // Returns a newly created InternalRunDeathTestFlag object with fields
9815*5c90c05cSAndroid Build Coastguard Worker // initialized from the GTEST_FLAG(internal_run_death_test) flag if
9816*5c90c05cSAndroid Build Coastguard Worker // the flag is specified; otherwise returns NULL.
ParseInternalRunDeathTestFlag()9817*5c90c05cSAndroid Build Coastguard Worker InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {
9818*5c90c05cSAndroid Build Coastguard Worker   if (GTEST_FLAG(internal_run_death_test) == "") return nullptr;
9819*5c90c05cSAndroid Build Coastguard Worker 
9820*5c90c05cSAndroid Build Coastguard Worker   // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we
9821*5c90c05cSAndroid Build Coastguard Worker   // can use it here.
9822*5c90c05cSAndroid Build Coastguard Worker   int line = -1;
9823*5c90c05cSAndroid Build Coastguard Worker   int index = -1;
9824*5c90c05cSAndroid Build Coastguard Worker   ::std::vector< ::std::string> fields;
9825*5c90c05cSAndroid Build Coastguard Worker   SplitString(GTEST_FLAG(internal_run_death_test).c_str(), '|', &fields);
9826*5c90c05cSAndroid Build Coastguard Worker   int write_fd = -1;
9827*5c90c05cSAndroid Build Coastguard Worker 
9828*5c90c05cSAndroid Build Coastguard Worker # if GTEST_OS_WINDOWS
9829*5c90c05cSAndroid Build Coastguard Worker 
9830*5c90c05cSAndroid Build Coastguard Worker   unsigned int parent_process_id = 0;
9831*5c90c05cSAndroid Build Coastguard Worker   size_t write_handle_as_size_t = 0;
9832*5c90c05cSAndroid Build Coastguard Worker   size_t event_handle_as_size_t = 0;
9833*5c90c05cSAndroid Build Coastguard Worker 
9834*5c90c05cSAndroid Build Coastguard Worker   if (fields.size() != 6
9835*5c90c05cSAndroid Build Coastguard Worker       || !ParseNaturalNumber(fields[1], &line)
9836*5c90c05cSAndroid Build Coastguard Worker       || !ParseNaturalNumber(fields[2], &index)
9837*5c90c05cSAndroid Build Coastguard Worker       || !ParseNaturalNumber(fields[3], &parent_process_id)
9838*5c90c05cSAndroid Build Coastguard Worker       || !ParseNaturalNumber(fields[4], &write_handle_as_size_t)
9839*5c90c05cSAndroid Build Coastguard Worker       || !ParseNaturalNumber(fields[5], &event_handle_as_size_t)) {
9840*5c90c05cSAndroid Build Coastguard Worker     DeathTestAbort("Bad --gtest_internal_run_death_test flag: " +
9841*5c90c05cSAndroid Build Coastguard Worker                    GTEST_FLAG(internal_run_death_test));
9842*5c90c05cSAndroid Build Coastguard Worker   }
9843*5c90c05cSAndroid Build Coastguard Worker   write_fd = GetStatusFileDescriptor(parent_process_id,
9844*5c90c05cSAndroid Build Coastguard Worker                                      write_handle_as_size_t,
9845*5c90c05cSAndroid Build Coastguard Worker                                      event_handle_as_size_t);
9846*5c90c05cSAndroid Build Coastguard Worker 
9847*5c90c05cSAndroid Build Coastguard Worker # elif GTEST_OS_FUCHSIA
9848*5c90c05cSAndroid Build Coastguard Worker 
9849*5c90c05cSAndroid Build Coastguard Worker   if (fields.size() != 3
9850*5c90c05cSAndroid Build Coastguard Worker       || !ParseNaturalNumber(fields[1], &line)
9851*5c90c05cSAndroid Build Coastguard Worker       || !ParseNaturalNumber(fields[2], &index)) {
9852*5c90c05cSAndroid Build Coastguard Worker     DeathTestAbort("Bad --gtest_internal_run_death_test flag: "
9853*5c90c05cSAndroid Build Coastguard Worker         + GTEST_FLAG(internal_run_death_test));
9854*5c90c05cSAndroid Build Coastguard Worker   }
9855*5c90c05cSAndroid Build Coastguard Worker 
9856*5c90c05cSAndroid Build Coastguard Worker # else
9857*5c90c05cSAndroid Build Coastguard Worker 
9858*5c90c05cSAndroid Build Coastguard Worker   if (fields.size() != 4
9859*5c90c05cSAndroid Build Coastguard Worker       || !ParseNaturalNumber(fields[1], &line)
9860*5c90c05cSAndroid Build Coastguard Worker       || !ParseNaturalNumber(fields[2], &index)
9861*5c90c05cSAndroid Build Coastguard Worker       || !ParseNaturalNumber(fields[3], &write_fd)) {
9862*5c90c05cSAndroid Build Coastguard Worker     DeathTestAbort("Bad --gtest_internal_run_death_test flag: "
9863*5c90c05cSAndroid Build Coastguard Worker         + GTEST_FLAG(internal_run_death_test));
9864*5c90c05cSAndroid Build Coastguard Worker   }
9865*5c90c05cSAndroid Build Coastguard Worker 
9866*5c90c05cSAndroid Build Coastguard Worker # endif  // GTEST_OS_WINDOWS
9867*5c90c05cSAndroid Build Coastguard Worker 
9868*5c90c05cSAndroid Build Coastguard Worker   return new InternalRunDeathTestFlag(fields[0], line, index, write_fd);
9869*5c90c05cSAndroid Build Coastguard Worker }
9870*5c90c05cSAndroid Build Coastguard Worker 
9871*5c90c05cSAndroid Build Coastguard Worker }  // namespace internal
9872*5c90c05cSAndroid Build Coastguard Worker 
9873*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_HAS_DEATH_TEST
9874*5c90c05cSAndroid Build Coastguard Worker 
9875*5c90c05cSAndroid Build Coastguard Worker }  // namespace testing
9876*5c90c05cSAndroid Build Coastguard Worker // Copyright 2008, Google Inc.
9877*5c90c05cSAndroid Build Coastguard Worker // All rights reserved.
9878*5c90c05cSAndroid Build Coastguard Worker //
9879*5c90c05cSAndroid Build Coastguard Worker // Redistribution and use in source and binary forms, with or without
9880*5c90c05cSAndroid Build Coastguard Worker // modification, are permitted provided that the following conditions are
9881*5c90c05cSAndroid Build Coastguard Worker // met:
9882*5c90c05cSAndroid Build Coastguard Worker //
9883*5c90c05cSAndroid Build Coastguard Worker //     * Redistributions of source code must retain the above copyright
9884*5c90c05cSAndroid Build Coastguard Worker // notice, this list of conditions and the following disclaimer.
9885*5c90c05cSAndroid Build Coastguard Worker //     * Redistributions in binary form must reproduce the above
9886*5c90c05cSAndroid Build Coastguard Worker // copyright notice, this list of conditions and the following disclaimer
9887*5c90c05cSAndroid Build Coastguard Worker // in the documentation and/or other materials provided with the
9888*5c90c05cSAndroid Build Coastguard Worker // distribution.
9889*5c90c05cSAndroid Build Coastguard Worker //     * Neither the name of Google Inc. nor the names of its
9890*5c90c05cSAndroid Build Coastguard Worker // contributors may be used to endorse or promote products derived from
9891*5c90c05cSAndroid Build Coastguard Worker // this software without specific prior written permission.
9892*5c90c05cSAndroid Build Coastguard Worker //
9893*5c90c05cSAndroid Build Coastguard Worker // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
9894*5c90c05cSAndroid Build Coastguard Worker // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
9895*5c90c05cSAndroid Build Coastguard Worker // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
9896*5c90c05cSAndroid Build Coastguard Worker // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
9897*5c90c05cSAndroid Build Coastguard Worker // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
9898*5c90c05cSAndroid Build Coastguard Worker // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
9899*5c90c05cSAndroid Build Coastguard Worker // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
9900*5c90c05cSAndroid Build Coastguard Worker // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
9901*5c90c05cSAndroid Build Coastguard Worker // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
9902*5c90c05cSAndroid Build Coastguard Worker // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
9903*5c90c05cSAndroid Build Coastguard Worker // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
9904*5c90c05cSAndroid Build Coastguard Worker 
9905*5c90c05cSAndroid Build Coastguard Worker 
9906*5c90c05cSAndroid Build Coastguard Worker #include <stdlib.h>
9907*5c90c05cSAndroid Build Coastguard Worker 
9908*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_WINDOWS_MOBILE
9909*5c90c05cSAndroid Build Coastguard Worker # include <windows.h>
9910*5c90c05cSAndroid Build Coastguard Worker #elif GTEST_OS_WINDOWS
9911*5c90c05cSAndroid Build Coastguard Worker # include <direct.h>
9912*5c90c05cSAndroid Build Coastguard Worker # include <io.h>
9913*5c90c05cSAndroid Build Coastguard Worker #else
9914*5c90c05cSAndroid Build Coastguard Worker # include <limits.h>
9915*5c90c05cSAndroid Build Coastguard Worker # include <climits>  // Some Linux distributions define PATH_MAX here.
9916*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_OS_WINDOWS_MOBILE
9917*5c90c05cSAndroid Build Coastguard Worker 
9918*5c90c05cSAndroid Build Coastguard Worker 
9919*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_WINDOWS
9920*5c90c05cSAndroid Build Coastguard Worker # define GTEST_PATH_MAX_ _MAX_PATH
9921*5c90c05cSAndroid Build Coastguard Worker #elif defined(PATH_MAX)
9922*5c90c05cSAndroid Build Coastguard Worker # define GTEST_PATH_MAX_ PATH_MAX
9923*5c90c05cSAndroid Build Coastguard Worker #elif defined(_XOPEN_PATH_MAX)
9924*5c90c05cSAndroid Build Coastguard Worker # define GTEST_PATH_MAX_ _XOPEN_PATH_MAX
9925*5c90c05cSAndroid Build Coastguard Worker #else
9926*5c90c05cSAndroid Build Coastguard Worker # define GTEST_PATH_MAX_ _POSIX_PATH_MAX
9927*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_OS_WINDOWS
9928*5c90c05cSAndroid Build Coastguard Worker 
9929*5c90c05cSAndroid Build Coastguard Worker namespace testing {
9930*5c90c05cSAndroid Build Coastguard Worker namespace internal {
9931*5c90c05cSAndroid Build Coastguard Worker 
9932*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_WINDOWS
9933*5c90c05cSAndroid Build Coastguard Worker // On Windows, '\\' is the standard path separator, but many tools and the
9934*5c90c05cSAndroid Build Coastguard Worker // Windows API also accept '/' as an alternate path separator. Unless otherwise
9935*5c90c05cSAndroid Build Coastguard Worker // noted, a file path can contain either kind of path separators, or a mixture
9936*5c90c05cSAndroid Build Coastguard Worker // of them.
9937*5c90c05cSAndroid Build Coastguard Worker const char kPathSeparator = '\\';
9938*5c90c05cSAndroid Build Coastguard Worker const char kAlternatePathSeparator = '/';
9939*5c90c05cSAndroid Build Coastguard Worker const char kAlternatePathSeparatorString[] = "/";
9940*5c90c05cSAndroid Build Coastguard Worker # if GTEST_OS_WINDOWS_MOBILE
9941*5c90c05cSAndroid Build Coastguard Worker // Windows CE doesn't have a current directory. You should not use
9942*5c90c05cSAndroid Build Coastguard Worker // the current directory in tests on Windows CE, but this at least
9943*5c90c05cSAndroid Build Coastguard Worker // provides a reasonable fallback.
9944*5c90c05cSAndroid Build Coastguard Worker const char kCurrentDirectoryString[] = "\\";
9945*5c90c05cSAndroid Build Coastguard Worker // Windows CE doesn't define INVALID_FILE_ATTRIBUTES
9946*5c90c05cSAndroid Build Coastguard Worker const DWORD kInvalidFileAttributes = 0xffffffff;
9947*5c90c05cSAndroid Build Coastguard Worker # else
9948*5c90c05cSAndroid Build Coastguard Worker const char kCurrentDirectoryString[] = ".\\";
9949*5c90c05cSAndroid Build Coastguard Worker # endif  // GTEST_OS_WINDOWS_MOBILE
9950*5c90c05cSAndroid Build Coastguard Worker #else
9951*5c90c05cSAndroid Build Coastguard Worker const char kPathSeparator = '/';
9952*5c90c05cSAndroid Build Coastguard Worker const char kCurrentDirectoryString[] = "./";
9953*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_OS_WINDOWS
9954*5c90c05cSAndroid Build Coastguard Worker 
9955*5c90c05cSAndroid Build Coastguard Worker // Returns whether the given character is a valid path separator.
IsPathSeparator(char c)9956*5c90c05cSAndroid Build Coastguard Worker static bool IsPathSeparator(char c) {
9957*5c90c05cSAndroid Build Coastguard Worker #if GTEST_HAS_ALT_PATH_SEP_
9958*5c90c05cSAndroid Build Coastguard Worker   return (c == kPathSeparator) || (c == kAlternatePathSeparator);
9959*5c90c05cSAndroid Build Coastguard Worker #else
9960*5c90c05cSAndroid Build Coastguard Worker   return c == kPathSeparator;
9961*5c90c05cSAndroid Build Coastguard Worker #endif
9962*5c90c05cSAndroid Build Coastguard Worker }
9963*5c90c05cSAndroid Build Coastguard Worker 
9964*5c90c05cSAndroid Build Coastguard Worker // Returns the current working directory, or "" if unsuccessful.
GetCurrentDir()9965*5c90c05cSAndroid Build Coastguard Worker FilePath FilePath::GetCurrentDir() {
9966*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE ||         \
9967*5c90c05cSAndroid Build Coastguard Worker     GTEST_OS_WINDOWS_RT || GTEST_OS_ESP8266 || GTEST_OS_ESP32 || \
9968*5c90c05cSAndroid Build Coastguard Worker     GTEST_OS_XTENSA
9969*5c90c05cSAndroid Build Coastguard Worker   // These platforms do not have a current directory, so we just return
9970*5c90c05cSAndroid Build Coastguard Worker   // something reasonable.
9971*5c90c05cSAndroid Build Coastguard Worker   return FilePath(kCurrentDirectoryString);
9972*5c90c05cSAndroid Build Coastguard Worker #elif GTEST_OS_WINDOWS
9973*5c90c05cSAndroid Build Coastguard Worker   char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };
9974*5c90c05cSAndroid Build Coastguard Worker   return FilePath(_getcwd(cwd, sizeof(cwd)) == nullptr ? "" : cwd);
9975*5c90c05cSAndroid Build Coastguard Worker #else
9976*5c90c05cSAndroid Build Coastguard Worker   char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };
9977*5c90c05cSAndroid Build Coastguard Worker   char* result = getcwd(cwd, sizeof(cwd));
9978*5c90c05cSAndroid Build Coastguard Worker # if GTEST_OS_NACL
9979*5c90c05cSAndroid Build Coastguard Worker   // getcwd will likely fail in NaCl due to the sandbox, so return something
9980*5c90c05cSAndroid Build Coastguard Worker   // reasonable. The user may have provided a shim implementation for getcwd,
9981*5c90c05cSAndroid Build Coastguard Worker   // however, so fallback only when failure is detected.
9982*5c90c05cSAndroid Build Coastguard Worker   return FilePath(result == nullptr ? kCurrentDirectoryString : cwd);
9983*5c90c05cSAndroid Build Coastguard Worker # endif  // GTEST_OS_NACL
9984*5c90c05cSAndroid Build Coastguard Worker   return FilePath(result == nullptr ? "" : cwd);
9985*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_OS_WINDOWS_MOBILE
9986*5c90c05cSAndroid Build Coastguard Worker }
9987*5c90c05cSAndroid Build Coastguard Worker 
9988*5c90c05cSAndroid Build Coastguard Worker // Returns a copy of the FilePath with the case-insensitive extension removed.
9989*5c90c05cSAndroid Build Coastguard Worker // Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
9990*5c90c05cSAndroid Build Coastguard Worker // FilePath("dir/file"). If a case-insensitive extension is not
9991*5c90c05cSAndroid Build Coastguard Worker // found, returns a copy of the original FilePath.
RemoveExtension(const char * extension) const9992*5c90c05cSAndroid Build Coastguard Worker FilePath FilePath::RemoveExtension(const char* extension) const {
9993*5c90c05cSAndroid Build Coastguard Worker   const std::string dot_extension = std::string(".") + extension;
9994*5c90c05cSAndroid Build Coastguard Worker   if (String::EndsWithCaseInsensitive(pathname_, dot_extension)) {
9995*5c90c05cSAndroid Build Coastguard Worker     return FilePath(pathname_.substr(
9996*5c90c05cSAndroid Build Coastguard Worker         0, pathname_.length() - dot_extension.length()));
9997*5c90c05cSAndroid Build Coastguard Worker   }
9998*5c90c05cSAndroid Build Coastguard Worker   return *this;
9999*5c90c05cSAndroid Build Coastguard Worker }
10000*5c90c05cSAndroid Build Coastguard Worker 
10001*5c90c05cSAndroid Build Coastguard Worker // Returns a pointer to the last occurrence of a valid path separator in
10002*5c90c05cSAndroid Build Coastguard Worker // the FilePath. On Windows, for example, both '/' and '\' are valid path
10003*5c90c05cSAndroid Build Coastguard Worker // separators. Returns NULL if no path separator was found.
FindLastPathSeparator() const10004*5c90c05cSAndroid Build Coastguard Worker const char* FilePath::FindLastPathSeparator() const {
10005*5c90c05cSAndroid Build Coastguard Worker   const char* const last_sep = strrchr(c_str(), kPathSeparator);
10006*5c90c05cSAndroid Build Coastguard Worker #if GTEST_HAS_ALT_PATH_SEP_
10007*5c90c05cSAndroid Build Coastguard Worker   const char* const last_alt_sep = strrchr(c_str(), kAlternatePathSeparator);
10008*5c90c05cSAndroid Build Coastguard Worker   // Comparing two pointers of which only one is NULL is undefined.
10009*5c90c05cSAndroid Build Coastguard Worker   if (last_alt_sep != nullptr &&
10010*5c90c05cSAndroid Build Coastguard Worker       (last_sep == nullptr || last_alt_sep > last_sep)) {
10011*5c90c05cSAndroid Build Coastguard Worker     return last_alt_sep;
10012*5c90c05cSAndroid Build Coastguard Worker   }
10013*5c90c05cSAndroid Build Coastguard Worker #endif
10014*5c90c05cSAndroid Build Coastguard Worker   return last_sep;
10015*5c90c05cSAndroid Build Coastguard Worker }
10016*5c90c05cSAndroid Build Coastguard Worker 
10017*5c90c05cSAndroid Build Coastguard Worker // Returns a copy of the FilePath with the directory part removed.
10018*5c90c05cSAndroid Build Coastguard Worker // Example: FilePath("path/to/file").RemoveDirectoryName() returns
10019*5c90c05cSAndroid Build Coastguard Worker // FilePath("file"). If there is no directory part ("just_a_file"), it returns
10020*5c90c05cSAndroid Build Coastguard Worker // the FilePath unmodified. If there is no file part ("just_a_dir/") it
10021*5c90c05cSAndroid Build Coastguard Worker // returns an empty FilePath ("").
10022*5c90c05cSAndroid Build Coastguard Worker // On Windows platform, '\' is the path separator, otherwise it is '/'.
RemoveDirectoryName() const10023*5c90c05cSAndroid Build Coastguard Worker FilePath FilePath::RemoveDirectoryName() const {
10024*5c90c05cSAndroid Build Coastguard Worker   const char* const last_sep = FindLastPathSeparator();
10025*5c90c05cSAndroid Build Coastguard Worker   return last_sep ? FilePath(last_sep + 1) : *this;
10026*5c90c05cSAndroid Build Coastguard Worker }
10027*5c90c05cSAndroid Build Coastguard Worker 
10028*5c90c05cSAndroid Build Coastguard Worker // RemoveFileName returns the directory path with the filename removed.
10029*5c90c05cSAndroid Build Coastguard Worker // Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
10030*5c90c05cSAndroid Build Coastguard Worker // If the FilePath is "a_file" or "/a_file", RemoveFileName returns
10031*5c90c05cSAndroid Build Coastguard Worker // FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
10032*5c90c05cSAndroid Build Coastguard Worker // not have a file, like "just/a/dir/", it returns the FilePath unmodified.
10033*5c90c05cSAndroid Build Coastguard Worker // On Windows platform, '\' is the path separator, otherwise it is '/'.
RemoveFileName() const10034*5c90c05cSAndroid Build Coastguard Worker FilePath FilePath::RemoveFileName() const {
10035*5c90c05cSAndroid Build Coastguard Worker   const char* const last_sep = FindLastPathSeparator();
10036*5c90c05cSAndroid Build Coastguard Worker   std::string dir;
10037*5c90c05cSAndroid Build Coastguard Worker   if (last_sep) {
10038*5c90c05cSAndroid Build Coastguard Worker     dir = std::string(c_str(), static_cast<size_t>(last_sep + 1 - c_str()));
10039*5c90c05cSAndroid Build Coastguard Worker   } else {
10040*5c90c05cSAndroid Build Coastguard Worker     dir = kCurrentDirectoryString;
10041*5c90c05cSAndroid Build Coastguard Worker   }
10042*5c90c05cSAndroid Build Coastguard Worker   return FilePath(dir);
10043*5c90c05cSAndroid Build Coastguard Worker }
10044*5c90c05cSAndroid Build Coastguard Worker 
10045*5c90c05cSAndroid Build Coastguard Worker // Helper functions for naming files in a directory for xml output.
10046*5c90c05cSAndroid Build Coastguard Worker 
10047*5c90c05cSAndroid Build Coastguard Worker // Given directory = "dir", base_name = "test", number = 0,
10048*5c90c05cSAndroid Build Coastguard Worker // extension = "xml", returns "dir/test.xml". If number is greater
10049*5c90c05cSAndroid Build Coastguard Worker // than zero (e.g., 12), returns "dir/test_12.xml".
10050*5c90c05cSAndroid Build Coastguard Worker // On Windows platform, uses \ as the separator rather than /.
MakeFileName(const FilePath & directory,const FilePath & base_name,int number,const char * extension)10051*5c90c05cSAndroid Build Coastguard Worker FilePath FilePath::MakeFileName(const FilePath& directory,
10052*5c90c05cSAndroid Build Coastguard Worker                                 const FilePath& base_name,
10053*5c90c05cSAndroid Build Coastguard Worker                                 int number,
10054*5c90c05cSAndroid Build Coastguard Worker                                 const char* extension) {
10055*5c90c05cSAndroid Build Coastguard Worker   std::string file;
10056*5c90c05cSAndroid Build Coastguard Worker   if (number == 0) {
10057*5c90c05cSAndroid Build Coastguard Worker     file = base_name.string() + "." + extension;
10058*5c90c05cSAndroid Build Coastguard Worker   } else {
10059*5c90c05cSAndroid Build Coastguard Worker     file = base_name.string() + "_" + StreamableToString(number)
10060*5c90c05cSAndroid Build Coastguard Worker         + "." + extension;
10061*5c90c05cSAndroid Build Coastguard Worker   }
10062*5c90c05cSAndroid Build Coastguard Worker   return ConcatPaths(directory, FilePath(file));
10063*5c90c05cSAndroid Build Coastguard Worker }
10064*5c90c05cSAndroid Build Coastguard Worker 
10065*5c90c05cSAndroid Build Coastguard Worker // Given directory = "dir", relative_path = "test.xml", returns "dir/test.xml".
10066*5c90c05cSAndroid Build Coastguard Worker // On Windows, uses \ as the separator rather than /.
ConcatPaths(const FilePath & directory,const FilePath & relative_path)10067*5c90c05cSAndroid Build Coastguard Worker FilePath FilePath::ConcatPaths(const FilePath& directory,
10068*5c90c05cSAndroid Build Coastguard Worker                                const FilePath& relative_path) {
10069*5c90c05cSAndroid Build Coastguard Worker   if (directory.IsEmpty())
10070*5c90c05cSAndroid Build Coastguard Worker     return relative_path;
10071*5c90c05cSAndroid Build Coastguard Worker   const FilePath dir(directory.RemoveTrailingPathSeparator());
10072*5c90c05cSAndroid Build Coastguard Worker   return FilePath(dir.string() + kPathSeparator + relative_path.string());
10073*5c90c05cSAndroid Build Coastguard Worker }
10074*5c90c05cSAndroid Build Coastguard Worker 
10075*5c90c05cSAndroid Build Coastguard Worker // Returns true if pathname describes something findable in the file-system,
10076*5c90c05cSAndroid Build Coastguard Worker // either a file, directory, or whatever.
FileOrDirectoryExists() const10077*5c90c05cSAndroid Build Coastguard Worker bool FilePath::FileOrDirectoryExists() const {
10078*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_WINDOWS_MOBILE
10079*5c90c05cSAndroid Build Coastguard Worker   LPCWSTR unicode = String::AnsiToUtf16(pathname_.c_str());
10080*5c90c05cSAndroid Build Coastguard Worker   const DWORD attributes = GetFileAttributes(unicode);
10081*5c90c05cSAndroid Build Coastguard Worker   delete [] unicode;
10082*5c90c05cSAndroid Build Coastguard Worker   return attributes != kInvalidFileAttributes;
10083*5c90c05cSAndroid Build Coastguard Worker #else
10084*5c90c05cSAndroid Build Coastguard Worker   posix::StatStruct file_stat;
10085*5c90c05cSAndroid Build Coastguard Worker   return posix::Stat(pathname_.c_str(), &file_stat) == 0;
10086*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_OS_WINDOWS_MOBILE
10087*5c90c05cSAndroid Build Coastguard Worker }
10088*5c90c05cSAndroid Build Coastguard Worker 
10089*5c90c05cSAndroid Build Coastguard Worker // Returns true if pathname describes a directory in the file-system
10090*5c90c05cSAndroid Build Coastguard Worker // that exists.
DirectoryExists() const10091*5c90c05cSAndroid Build Coastguard Worker bool FilePath::DirectoryExists() const {
10092*5c90c05cSAndroid Build Coastguard Worker   bool result = false;
10093*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_WINDOWS
10094*5c90c05cSAndroid Build Coastguard Worker   // Don't strip off trailing separator if path is a root directory on
10095*5c90c05cSAndroid Build Coastguard Worker   // Windows (like "C:\\").
10096*5c90c05cSAndroid Build Coastguard Worker   const FilePath& path(IsRootDirectory() ? *this :
10097*5c90c05cSAndroid Build Coastguard Worker                                            RemoveTrailingPathSeparator());
10098*5c90c05cSAndroid Build Coastguard Worker #else
10099*5c90c05cSAndroid Build Coastguard Worker   const FilePath& path(*this);
10100*5c90c05cSAndroid Build Coastguard Worker #endif
10101*5c90c05cSAndroid Build Coastguard Worker 
10102*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_WINDOWS_MOBILE
10103*5c90c05cSAndroid Build Coastguard Worker   LPCWSTR unicode = String::AnsiToUtf16(path.c_str());
10104*5c90c05cSAndroid Build Coastguard Worker   const DWORD attributes = GetFileAttributes(unicode);
10105*5c90c05cSAndroid Build Coastguard Worker   delete [] unicode;
10106*5c90c05cSAndroid Build Coastguard Worker   if ((attributes != kInvalidFileAttributes) &&
10107*5c90c05cSAndroid Build Coastguard Worker       (attributes & FILE_ATTRIBUTE_DIRECTORY)) {
10108*5c90c05cSAndroid Build Coastguard Worker     result = true;
10109*5c90c05cSAndroid Build Coastguard Worker   }
10110*5c90c05cSAndroid Build Coastguard Worker #else
10111*5c90c05cSAndroid Build Coastguard Worker   posix::StatStruct file_stat;
10112*5c90c05cSAndroid Build Coastguard Worker   result = posix::Stat(path.c_str(), &file_stat) == 0 &&
10113*5c90c05cSAndroid Build Coastguard Worker       posix::IsDir(file_stat);
10114*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_OS_WINDOWS_MOBILE
10115*5c90c05cSAndroid Build Coastguard Worker 
10116*5c90c05cSAndroid Build Coastguard Worker   return result;
10117*5c90c05cSAndroid Build Coastguard Worker }
10118*5c90c05cSAndroid Build Coastguard Worker 
10119*5c90c05cSAndroid Build Coastguard Worker // Returns true if pathname describes a root directory. (Windows has one
10120*5c90c05cSAndroid Build Coastguard Worker // root directory per disk drive.)
IsRootDirectory() const10121*5c90c05cSAndroid Build Coastguard Worker bool FilePath::IsRootDirectory() const {
10122*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_WINDOWS
10123*5c90c05cSAndroid Build Coastguard Worker   return pathname_.length() == 3 && IsAbsolutePath();
10124*5c90c05cSAndroid Build Coastguard Worker #else
10125*5c90c05cSAndroid Build Coastguard Worker   return pathname_.length() == 1 && IsPathSeparator(pathname_.c_str()[0]);
10126*5c90c05cSAndroid Build Coastguard Worker #endif
10127*5c90c05cSAndroid Build Coastguard Worker }
10128*5c90c05cSAndroid Build Coastguard Worker 
10129*5c90c05cSAndroid Build Coastguard Worker // Returns true if pathname describes an absolute path.
IsAbsolutePath() const10130*5c90c05cSAndroid Build Coastguard Worker bool FilePath::IsAbsolutePath() const {
10131*5c90c05cSAndroid Build Coastguard Worker   const char* const name = pathname_.c_str();
10132*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_WINDOWS
10133*5c90c05cSAndroid Build Coastguard Worker   return pathname_.length() >= 3 &&
10134*5c90c05cSAndroid Build Coastguard Worker      ((name[0] >= 'a' && name[0] <= 'z') ||
10135*5c90c05cSAndroid Build Coastguard Worker       (name[0] >= 'A' && name[0] <= 'Z')) &&
10136*5c90c05cSAndroid Build Coastguard Worker      name[1] == ':' &&
10137*5c90c05cSAndroid Build Coastguard Worker      IsPathSeparator(name[2]);
10138*5c90c05cSAndroid Build Coastguard Worker #else
10139*5c90c05cSAndroid Build Coastguard Worker   return IsPathSeparator(name[0]);
10140*5c90c05cSAndroid Build Coastguard Worker #endif
10141*5c90c05cSAndroid Build Coastguard Worker }
10142*5c90c05cSAndroid Build Coastguard Worker 
10143*5c90c05cSAndroid Build Coastguard Worker // Returns a pathname for a file that does not currently exist. The pathname
10144*5c90c05cSAndroid Build Coastguard Worker // will be directory/base_name.extension or
10145*5c90c05cSAndroid Build Coastguard Worker // directory/base_name_<number>.extension if directory/base_name.extension
10146*5c90c05cSAndroid Build Coastguard Worker // already exists. The number will be incremented until a pathname is found
10147*5c90c05cSAndroid Build Coastguard Worker // that does not already exist.
10148*5c90c05cSAndroid Build Coastguard Worker // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
10149*5c90c05cSAndroid Build Coastguard Worker // There could be a race condition if two or more processes are calling this
10150*5c90c05cSAndroid Build Coastguard Worker // function at the same time -- they could both pick the same filename.
GenerateUniqueFileName(const FilePath & directory,const FilePath & base_name,const char * extension)10151*5c90c05cSAndroid Build Coastguard Worker FilePath FilePath::GenerateUniqueFileName(const FilePath& directory,
10152*5c90c05cSAndroid Build Coastguard Worker                                           const FilePath& base_name,
10153*5c90c05cSAndroid Build Coastguard Worker                                           const char* extension) {
10154*5c90c05cSAndroid Build Coastguard Worker   FilePath full_pathname;
10155*5c90c05cSAndroid Build Coastguard Worker   int number = 0;
10156*5c90c05cSAndroid Build Coastguard Worker   do {
10157*5c90c05cSAndroid Build Coastguard Worker     full_pathname.Set(MakeFileName(directory, base_name, number++, extension));
10158*5c90c05cSAndroid Build Coastguard Worker   } while (full_pathname.FileOrDirectoryExists());
10159*5c90c05cSAndroid Build Coastguard Worker   return full_pathname;
10160*5c90c05cSAndroid Build Coastguard Worker }
10161*5c90c05cSAndroid Build Coastguard Worker 
10162*5c90c05cSAndroid Build Coastguard Worker // Returns true if FilePath ends with a path separator, which indicates that
10163*5c90c05cSAndroid Build Coastguard Worker // it is intended to represent a directory. Returns false otherwise.
10164*5c90c05cSAndroid Build Coastguard Worker // This does NOT check that a directory (or file) actually exists.
IsDirectory() const10165*5c90c05cSAndroid Build Coastguard Worker bool FilePath::IsDirectory() const {
10166*5c90c05cSAndroid Build Coastguard Worker   return !pathname_.empty() &&
10167*5c90c05cSAndroid Build Coastguard Worker          IsPathSeparator(pathname_.c_str()[pathname_.length() - 1]);
10168*5c90c05cSAndroid Build Coastguard Worker }
10169*5c90c05cSAndroid Build Coastguard Worker 
10170*5c90c05cSAndroid Build Coastguard Worker // Create directories so that path exists. Returns true if successful or if
10171*5c90c05cSAndroid Build Coastguard Worker // the directories already exist; returns false if unable to create directories
10172*5c90c05cSAndroid Build Coastguard Worker // for any reason.
CreateDirectoriesRecursively() const10173*5c90c05cSAndroid Build Coastguard Worker bool FilePath::CreateDirectoriesRecursively() const {
10174*5c90c05cSAndroid Build Coastguard Worker   if (!this->IsDirectory()) {
10175*5c90c05cSAndroid Build Coastguard Worker     return false;
10176*5c90c05cSAndroid Build Coastguard Worker   }
10177*5c90c05cSAndroid Build Coastguard Worker 
10178*5c90c05cSAndroid Build Coastguard Worker   if (pathname_.length() == 0 || this->DirectoryExists()) {
10179*5c90c05cSAndroid Build Coastguard Worker     return true;
10180*5c90c05cSAndroid Build Coastguard Worker   }
10181*5c90c05cSAndroid Build Coastguard Worker 
10182*5c90c05cSAndroid Build Coastguard Worker   const FilePath parent(this->RemoveTrailingPathSeparator().RemoveFileName());
10183*5c90c05cSAndroid Build Coastguard Worker   return parent.CreateDirectoriesRecursively() && this->CreateFolder();
10184*5c90c05cSAndroid Build Coastguard Worker }
10185*5c90c05cSAndroid Build Coastguard Worker 
10186*5c90c05cSAndroid Build Coastguard Worker // Create the directory so that path exists. Returns true if successful or
10187*5c90c05cSAndroid Build Coastguard Worker // if the directory already exists; returns false if unable to create the
10188*5c90c05cSAndroid Build Coastguard Worker // directory for any reason, including if the parent directory does not
10189*5c90c05cSAndroid Build Coastguard Worker // exist. Not named "CreateDirectory" because that's a macro on Windows.
CreateFolder() const10190*5c90c05cSAndroid Build Coastguard Worker bool FilePath::CreateFolder() const {
10191*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_WINDOWS_MOBILE
10192*5c90c05cSAndroid Build Coastguard Worker   FilePath removed_sep(this->RemoveTrailingPathSeparator());
10193*5c90c05cSAndroid Build Coastguard Worker   LPCWSTR unicode = String::AnsiToUtf16(removed_sep.c_str());
10194*5c90c05cSAndroid Build Coastguard Worker   int result = CreateDirectory(unicode, nullptr) ? 0 : -1;
10195*5c90c05cSAndroid Build Coastguard Worker   delete [] unicode;
10196*5c90c05cSAndroid Build Coastguard Worker #elif GTEST_OS_WINDOWS
10197*5c90c05cSAndroid Build Coastguard Worker   int result = _mkdir(pathname_.c_str());
10198*5c90c05cSAndroid Build Coastguard Worker #elif GTEST_OS_ESP8266 || GTEST_OS_XTENSA
10199*5c90c05cSAndroid Build Coastguard Worker   // do nothing
10200*5c90c05cSAndroid Build Coastguard Worker   int result = 0;
10201*5c90c05cSAndroid Build Coastguard Worker #else
10202*5c90c05cSAndroid Build Coastguard Worker   int result = mkdir(pathname_.c_str(), 0777);
10203*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_OS_WINDOWS_MOBILE
10204*5c90c05cSAndroid Build Coastguard Worker 
10205*5c90c05cSAndroid Build Coastguard Worker   if (result == -1) {
10206*5c90c05cSAndroid Build Coastguard Worker     return this->DirectoryExists();  // An error is OK if the directory exists.
10207*5c90c05cSAndroid Build Coastguard Worker   }
10208*5c90c05cSAndroid Build Coastguard Worker   return true;  // No error.
10209*5c90c05cSAndroid Build Coastguard Worker }
10210*5c90c05cSAndroid Build Coastguard Worker 
10211*5c90c05cSAndroid Build Coastguard Worker // If input name has a trailing separator character, remove it and return the
10212*5c90c05cSAndroid Build Coastguard Worker // name, otherwise return the name string unmodified.
10213*5c90c05cSAndroid Build Coastguard Worker // On Windows platform, uses \ as the separator, other platforms use /.
RemoveTrailingPathSeparator() const10214*5c90c05cSAndroid Build Coastguard Worker FilePath FilePath::RemoveTrailingPathSeparator() const {
10215*5c90c05cSAndroid Build Coastguard Worker   return IsDirectory()
10216*5c90c05cSAndroid Build Coastguard Worker       ? FilePath(pathname_.substr(0, pathname_.length() - 1))
10217*5c90c05cSAndroid Build Coastguard Worker       : *this;
10218*5c90c05cSAndroid Build Coastguard Worker }
10219*5c90c05cSAndroid Build Coastguard Worker 
10220*5c90c05cSAndroid Build Coastguard Worker // Removes any redundant separators that might be in the pathname.
10221*5c90c05cSAndroid Build Coastguard Worker // For example, "bar///foo" becomes "bar/foo". Does not eliminate other
10222*5c90c05cSAndroid Build Coastguard Worker // redundancies that might be in a pathname involving "." or "..".
Normalize()10223*5c90c05cSAndroid Build Coastguard Worker void FilePath::Normalize() {
10224*5c90c05cSAndroid Build Coastguard Worker   auto out = pathname_.begin();
10225*5c90c05cSAndroid Build Coastguard Worker 
10226*5c90c05cSAndroid Build Coastguard Worker   for (const char character : pathname_) {
10227*5c90c05cSAndroid Build Coastguard Worker     if (!IsPathSeparator(character)) {
10228*5c90c05cSAndroid Build Coastguard Worker       *(out++) = character;
10229*5c90c05cSAndroid Build Coastguard Worker     } else if (out == pathname_.begin() || *std::prev(out) != kPathSeparator) {
10230*5c90c05cSAndroid Build Coastguard Worker       *(out++) = kPathSeparator;
10231*5c90c05cSAndroid Build Coastguard Worker     } else {
10232*5c90c05cSAndroid Build Coastguard Worker       continue;
10233*5c90c05cSAndroid Build Coastguard Worker     }
10234*5c90c05cSAndroid Build Coastguard Worker   }
10235*5c90c05cSAndroid Build Coastguard Worker 
10236*5c90c05cSAndroid Build Coastguard Worker   pathname_.erase(out, pathname_.end());
10237*5c90c05cSAndroid Build Coastguard Worker }
10238*5c90c05cSAndroid Build Coastguard Worker 
10239*5c90c05cSAndroid Build Coastguard Worker }  // namespace internal
10240*5c90c05cSAndroid Build Coastguard Worker }  // namespace testing
10241*5c90c05cSAndroid Build Coastguard Worker // Copyright 2007, Google Inc.
10242*5c90c05cSAndroid Build Coastguard Worker // All rights reserved.
10243*5c90c05cSAndroid Build Coastguard Worker //
10244*5c90c05cSAndroid Build Coastguard Worker // Redistribution and use in source and binary forms, with or without
10245*5c90c05cSAndroid Build Coastguard Worker // modification, are permitted provided that the following conditions are
10246*5c90c05cSAndroid Build Coastguard Worker // met:
10247*5c90c05cSAndroid Build Coastguard Worker //
10248*5c90c05cSAndroid Build Coastguard Worker //     * Redistributions of source code must retain the above copyright
10249*5c90c05cSAndroid Build Coastguard Worker // notice, this list of conditions and the following disclaimer.
10250*5c90c05cSAndroid Build Coastguard Worker //     * Redistributions in binary form must reproduce the above
10251*5c90c05cSAndroid Build Coastguard Worker // copyright notice, this list of conditions and the following disclaimer
10252*5c90c05cSAndroid Build Coastguard Worker // in the documentation and/or other materials provided with the
10253*5c90c05cSAndroid Build Coastguard Worker // distribution.
10254*5c90c05cSAndroid Build Coastguard Worker //     * Neither the name of Google Inc. nor the names of its
10255*5c90c05cSAndroid Build Coastguard Worker // contributors may be used to endorse or promote products derived from
10256*5c90c05cSAndroid Build Coastguard Worker // this software without specific prior written permission.
10257*5c90c05cSAndroid Build Coastguard Worker //
10258*5c90c05cSAndroid Build Coastguard Worker // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
10259*5c90c05cSAndroid Build Coastguard Worker // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
10260*5c90c05cSAndroid Build Coastguard Worker // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
10261*5c90c05cSAndroid Build Coastguard Worker // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
10262*5c90c05cSAndroid Build Coastguard Worker // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
10263*5c90c05cSAndroid Build Coastguard Worker // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
10264*5c90c05cSAndroid Build Coastguard Worker // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
10265*5c90c05cSAndroid Build Coastguard Worker // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
10266*5c90c05cSAndroid Build Coastguard Worker // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
10267*5c90c05cSAndroid Build Coastguard Worker // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
10268*5c90c05cSAndroid Build Coastguard Worker // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
10269*5c90c05cSAndroid Build Coastguard Worker 
10270*5c90c05cSAndroid Build Coastguard Worker // The Google C++ Testing and Mocking Framework (Google Test)
10271*5c90c05cSAndroid Build Coastguard Worker //
10272*5c90c05cSAndroid Build Coastguard Worker // This file implements just enough of the matcher interface to allow
10273*5c90c05cSAndroid Build Coastguard Worker // EXPECT_DEATH and friends to accept a matcher argument.
10274*5c90c05cSAndroid Build Coastguard Worker 
10275*5c90c05cSAndroid Build Coastguard Worker 
10276*5c90c05cSAndroid Build Coastguard Worker #include <string>
10277*5c90c05cSAndroid Build Coastguard Worker 
10278*5c90c05cSAndroid Build Coastguard Worker namespace testing {
10279*5c90c05cSAndroid Build Coastguard Worker 
10280*5c90c05cSAndroid Build Coastguard Worker // Constructs a matcher that matches a const std::string& whose value is
10281*5c90c05cSAndroid Build Coastguard Worker // equal to s.
Matcher(const std::string & s)10282*5c90c05cSAndroid Build Coastguard Worker Matcher<const std::string&>::Matcher(const std::string& s) { *this = Eq(s); }
10283*5c90c05cSAndroid Build Coastguard Worker 
10284*5c90c05cSAndroid Build Coastguard Worker // Constructs a matcher that matches a const std::string& whose value is
10285*5c90c05cSAndroid Build Coastguard Worker // equal to s.
Matcher(const char * s)10286*5c90c05cSAndroid Build Coastguard Worker Matcher<const std::string&>::Matcher(const char* s) {
10287*5c90c05cSAndroid Build Coastguard Worker   *this = Eq(std::string(s));
10288*5c90c05cSAndroid Build Coastguard Worker }
10289*5c90c05cSAndroid Build Coastguard Worker 
10290*5c90c05cSAndroid Build Coastguard Worker // Constructs a matcher that matches a std::string whose value is equal to
10291*5c90c05cSAndroid Build Coastguard Worker // s.
Matcher(const std::string & s)10292*5c90c05cSAndroid Build Coastguard Worker Matcher<std::string>::Matcher(const std::string& s) { *this = Eq(s); }
10293*5c90c05cSAndroid Build Coastguard Worker 
10294*5c90c05cSAndroid Build Coastguard Worker // Constructs a matcher that matches a std::string whose value is equal to
10295*5c90c05cSAndroid Build Coastguard Worker // s.
Matcher(const char * s)10296*5c90c05cSAndroid Build Coastguard Worker Matcher<std::string>::Matcher(const char* s) { *this = Eq(std::string(s)); }
10297*5c90c05cSAndroid Build Coastguard Worker 
10298*5c90c05cSAndroid Build Coastguard Worker #if GTEST_INTERNAL_HAS_STRING_VIEW
10299*5c90c05cSAndroid Build Coastguard Worker // Constructs a matcher that matches a const StringView& whose value is
10300*5c90c05cSAndroid Build Coastguard Worker // equal to s.
Matcher(const std::string & s)10301*5c90c05cSAndroid Build Coastguard Worker Matcher<const internal::StringView&>::Matcher(const std::string& s) {
10302*5c90c05cSAndroid Build Coastguard Worker   *this = Eq(s);
10303*5c90c05cSAndroid Build Coastguard Worker }
10304*5c90c05cSAndroid Build Coastguard Worker 
10305*5c90c05cSAndroid Build Coastguard Worker // Constructs a matcher that matches a const StringView& whose value is
10306*5c90c05cSAndroid Build Coastguard Worker // equal to s.
Matcher(const char * s)10307*5c90c05cSAndroid Build Coastguard Worker Matcher<const internal::StringView&>::Matcher(const char* s) {
10308*5c90c05cSAndroid Build Coastguard Worker   *this = Eq(std::string(s));
10309*5c90c05cSAndroid Build Coastguard Worker }
10310*5c90c05cSAndroid Build Coastguard Worker 
10311*5c90c05cSAndroid Build Coastguard Worker // Constructs a matcher that matches a const StringView& whose value is
10312*5c90c05cSAndroid Build Coastguard Worker // equal to s.
Matcher(internal::StringView s)10313*5c90c05cSAndroid Build Coastguard Worker Matcher<const internal::StringView&>::Matcher(internal::StringView s) {
10314*5c90c05cSAndroid Build Coastguard Worker   *this = Eq(std::string(s));
10315*5c90c05cSAndroid Build Coastguard Worker }
10316*5c90c05cSAndroid Build Coastguard Worker 
10317*5c90c05cSAndroid Build Coastguard Worker // Constructs a matcher that matches a StringView whose value is equal to
10318*5c90c05cSAndroid Build Coastguard Worker // s.
Matcher(const std::string & s)10319*5c90c05cSAndroid Build Coastguard Worker Matcher<internal::StringView>::Matcher(const std::string& s) { *this = Eq(s); }
10320*5c90c05cSAndroid Build Coastguard Worker 
10321*5c90c05cSAndroid Build Coastguard Worker // Constructs a matcher that matches a StringView whose value is equal to
10322*5c90c05cSAndroid Build Coastguard Worker // s.
Matcher(const char * s)10323*5c90c05cSAndroid Build Coastguard Worker Matcher<internal::StringView>::Matcher(const char* s) {
10324*5c90c05cSAndroid Build Coastguard Worker   *this = Eq(std::string(s));
10325*5c90c05cSAndroid Build Coastguard Worker }
10326*5c90c05cSAndroid Build Coastguard Worker 
10327*5c90c05cSAndroid Build Coastguard Worker // Constructs a matcher that matches a StringView whose value is equal to
10328*5c90c05cSAndroid Build Coastguard Worker // s.
Matcher(internal::StringView s)10329*5c90c05cSAndroid Build Coastguard Worker Matcher<internal::StringView>::Matcher(internal::StringView s) {
10330*5c90c05cSAndroid Build Coastguard Worker   *this = Eq(std::string(s));
10331*5c90c05cSAndroid Build Coastguard Worker }
10332*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_INTERNAL_HAS_STRING_VIEW
10333*5c90c05cSAndroid Build Coastguard Worker 
10334*5c90c05cSAndroid Build Coastguard Worker }  // namespace testing
10335*5c90c05cSAndroid Build Coastguard Worker // Copyright 2008, Google Inc.
10336*5c90c05cSAndroid Build Coastguard Worker // All rights reserved.
10337*5c90c05cSAndroid Build Coastguard Worker //
10338*5c90c05cSAndroid Build Coastguard Worker // Redistribution and use in source and binary forms, with or without
10339*5c90c05cSAndroid Build Coastguard Worker // modification, are permitted provided that the following conditions are
10340*5c90c05cSAndroid Build Coastguard Worker // met:
10341*5c90c05cSAndroid Build Coastguard Worker //
10342*5c90c05cSAndroid Build Coastguard Worker //     * Redistributions of source code must retain the above copyright
10343*5c90c05cSAndroid Build Coastguard Worker // notice, this list of conditions and the following disclaimer.
10344*5c90c05cSAndroid Build Coastguard Worker //     * Redistributions in binary form must reproduce the above
10345*5c90c05cSAndroid Build Coastguard Worker // copyright notice, this list of conditions and the following disclaimer
10346*5c90c05cSAndroid Build Coastguard Worker // in the documentation and/or other materials provided with the
10347*5c90c05cSAndroid Build Coastguard Worker // distribution.
10348*5c90c05cSAndroid Build Coastguard Worker //     * Neither the name of Google Inc. nor the names of its
10349*5c90c05cSAndroid Build Coastguard Worker // contributors may be used to endorse or promote products derived from
10350*5c90c05cSAndroid Build Coastguard Worker // this software without specific prior written permission.
10351*5c90c05cSAndroid Build Coastguard Worker //
10352*5c90c05cSAndroid Build Coastguard Worker // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
10353*5c90c05cSAndroid Build Coastguard Worker // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
10354*5c90c05cSAndroid Build Coastguard Worker // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
10355*5c90c05cSAndroid Build Coastguard Worker // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
10356*5c90c05cSAndroid Build Coastguard Worker // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
10357*5c90c05cSAndroid Build Coastguard Worker // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
10358*5c90c05cSAndroid Build Coastguard Worker // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
10359*5c90c05cSAndroid Build Coastguard Worker // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
10360*5c90c05cSAndroid Build Coastguard Worker // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
10361*5c90c05cSAndroid Build Coastguard Worker // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
10362*5c90c05cSAndroid Build Coastguard Worker // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
10363*5c90c05cSAndroid Build Coastguard Worker 
10364*5c90c05cSAndroid Build Coastguard Worker 
10365*5c90c05cSAndroid Build Coastguard Worker 
10366*5c90c05cSAndroid Build Coastguard Worker #include <limits.h>
10367*5c90c05cSAndroid Build Coastguard Worker #include <stdio.h>
10368*5c90c05cSAndroid Build Coastguard Worker #include <stdlib.h>
10369*5c90c05cSAndroid Build Coastguard Worker #include <string.h>
10370*5c90c05cSAndroid Build Coastguard Worker #include <cstdint>
10371*5c90c05cSAndroid Build Coastguard Worker #include <fstream>
10372*5c90c05cSAndroid Build Coastguard Worker #include <memory>
10373*5c90c05cSAndroid Build Coastguard Worker 
10374*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_WINDOWS
10375*5c90c05cSAndroid Build Coastguard Worker # include <windows.h>
10376*5c90c05cSAndroid Build Coastguard Worker # include <io.h>
10377*5c90c05cSAndroid Build Coastguard Worker # include <sys/stat.h>
10378*5c90c05cSAndroid Build Coastguard Worker # include <map>  // Used in ThreadLocal.
10379*5c90c05cSAndroid Build Coastguard Worker # ifdef _MSC_VER
10380*5c90c05cSAndroid Build Coastguard Worker #  include <crtdbg.h>
10381*5c90c05cSAndroid Build Coastguard Worker # endif  // _MSC_VER
10382*5c90c05cSAndroid Build Coastguard Worker #else
10383*5c90c05cSAndroid Build Coastguard Worker # include <unistd.h>
10384*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_OS_WINDOWS
10385*5c90c05cSAndroid Build Coastguard Worker 
10386*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_MAC
10387*5c90c05cSAndroid Build Coastguard Worker # include <mach/mach_init.h>
10388*5c90c05cSAndroid Build Coastguard Worker # include <mach/task.h>
10389*5c90c05cSAndroid Build Coastguard Worker # include <mach/vm_map.h>
10390*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_OS_MAC
10391*5c90c05cSAndroid Build Coastguard Worker 
10392*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_DRAGONFLY || GTEST_OS_FREEBSD || GTEST_OS_GNU_KFREEBSD || \
10393*5c90c05cSAndroid Build Coastguard Worker     GTEST_OS_NETBSD || GTEST_OS_OPENBSD
10394*5c90c05cSAndroid Build Coastguard Worker # include <sys/sysctl.h>
10395*5c90c05cSAndroid Build Coastguard Worker # if GTEST_OS_DRAGONFLY || GTEST_OS_FREEBSD || GTEST_OS_GNU_KFREEBSD
10396*5c90c05cSAndroid Build Coastguard Worker #  include <sys/user.h>
10397*5c90c05cSAndroid Build Coastguard Worker # endif
10398*5c90c05cSAndroid Build Coastguard Worker #endif
10399*5c90c05cSAndroid Build Coastguard Worker 
10400*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_QNX
10401*5c90c05cSAndroid Build Coastguard Worker # include <devctl.h>
10402*5c90c05cSAndroid Build Coastguard Worker # include <fcntl.h>
10403*5c90c05cSAndroid Build Coastguard Worker # include <sys/procfs.h>
10404*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_OS_QNX
10405*5c90c05cSAndroid Build Coastguard Worker 
10406*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_AIX
10407*5c90c05cSAndroid Build Coastguard Worker # include <procinfo.h>
10408*5c90c05cSAndroid Build Coastguard Worker # include <sys/types.h>
10409*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_OS_AIX
10410*5c90c05cSAndroid Build Coastguard Worker 
10411*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_FUCHSIA
10412*5c90c05cSAndroid Build Coastguard Worker # include <zircon/process.h>
10413*5c90c05cSAndroid Build Coastguard Worker # include <zircon/syscalls.h>
10414*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_OS_FUCHSIA
10415*5c90c05cSAndroid Build Coastguard Worker 
10416*5c90c05cSAndroid Build Coastguard Worker 
10417*5c90c05cSAndroid Build Coastguard Worker namespace testing {
10418*5c90c05cSAndroid Build Coastguard Worker namespace internal {
10419*5c90c05cSAndroid Build Coastguard Worker 
10420*5c90c05cSAndroid Build Coastguard Worker #if defined(_MSC_VER) || defined(__BORLANDC__)
10421*5c90c05cSAndroid Build Coastguard Worker // MSVC and C++Builder do not provide a definition of STDERR_FILENO.
10422*5c90c05cSAndroid Build Coastguard Worker const int kStdOutFileno = 1;
10423*5c90c05cSAndroid Build Coastguard Worker const int kStdErrFileno = 2;
10424*5c90c05cSAndroid Build Coastguard Worker #else
10425*5c90c05cSAndroid Build Coastguard Worker const int kStdOutFileno = STDOUT_FILENO;
10426*5c90c05cSAndroid Build Coastguard Worker const int kStdErrFileno = STDERR_FILENO;
10427*5c90c05cSAndroid Build Coastguard Worker #endif  // _MSC_VER
10428*5c90c05cSAndroid Build Coastguard Worker 
10429*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_LINUX
10430*5c90c05cSAndroid Build Coastguard Worker 
10431*5c90c05cSAndroid Build Coastguard Worker namespace {
10432*5c90c05cSAndroid Build Coastguard Worker template <typename T>
ReadProcFileField(const std::string & filename,int field)10433*5c90c05cSAndroid Build Coastguard Worker T ReadProcFileField(const std::string& filename, int field) {
10434*5c90c05cSAndroid Build Coastguard Worker   std::string dummy;
10435*5c90c05cSAndroid Build Coastguard Worker   std::ifstream file(filename.c_str());
10436*5c90c05cSAndroid Build Coastguard Worker   while (field-- > 0) {
10437*5c90c05cSAndroid Build Coastguard Worker     file >> dummy;
10438*5c90c05cSAndroid Build Coastguard Worker   }
10439*5c90c05cSAndroid Build Coastguard Worker   T output = 0;
10440*5c90c05cSAndroid Build Coastguard Worker   file >> output;
10441*5c90c05cSAndroid Build Coastguard Worker   return output;
10442*5c90c05cSAndroid Build Coastguard Worker }
10443*5c90c05cSAndroid Build Coastguard Worker }  // namespace
10444*5c90c05cSAndroid Build Coastguard Worker 
10445*5c90c05cSAndroid Build Coastguard Worker // Returns the number of active threads, or 0 when there is an error.
GetThreadCount()10446*5c90c05cSAndroid Build Coastguard Worker size_t GetThreadCount() {
10447*5c90c05cSAndroid Build Coastguard Worker   const std::string filename =
10448*5c90c05cSAndroid Build Coastguard Worker       (Message() << "/proc/" << getpid() << "/stat").GetString();
10449*5c90c05cSAndroid Build Coastguard Worker   return ReadProcFileField<size_t>(filename, 19);
10450*5c90c05cSAndroid Build Coastguard Worker }
10451*5c90c05cSAndroid Build Coastguard Worker 
10452*5c90c05cSAndroid Build Coastguard Worker #elif GTEST_OS_MAC
10453*5c90c05cSAndroid Build Coastguard Worker 
GetThreadCount()10454*5c90c05cSAndroid Build Coastguard Worker size_t GetThreadCount() {
10455*5c90c05cSAndroid Build Coastguard Worker   const task_t task = mach_task_self();
10456*5c90c05cSAndroid Build Coastguard Worker   mach_msg_type_number_t thread_count;
10457*5c90c05cSAndroid Build Coastguard Worker   thread_act_array_t thread_list;
10458*5c90c05cSAndroid Build Coastguard Worker   const kern_return_t status = task_threads(task, &thread_list, &thread_count);
10459*5c90c05cSAndroid Build Coastguard Worker   if (status == KERN_SUCCESS) {
10460*5c90c05cSAndroid Build Coastguard Worker     // task_threads allocates resources in thread_list and we need to free them
10461*5c90c05cSAndroid Build Coastguard Worker     // to avoid leaks.
10462*5c90c05cSAndroid Build Coastguard Worker     vm_deallocate(task,
10463*5c90c05cSAndroid Build Coastguard Worker                   reinterpret_cast<vm_address_t>(thread_list),
10464*5c90c05cSAndroid Build Coastguard Worker                   sizeof(thread_t) * thread_count);
10465*5c90c05cSAndroid Build Coastguard Worker     return static_cast<size_t>(thread_count);
10466*5c90c05cSAndroid Build Coastguard Worker   } else {
10467*5c90c05cSAndroid Build Coastguard Worker     return 0;
10468*5c90c05cSAndroid Build Coastguard Worker   }
10469*5c90c05cSAndroid Build Coastguard Worker }
10470*5c90c05cSAndroid Build Coastguard Worker 
10471*5c90c05cSAndroid Build Coastguard Worker #elif GTEST_OS_DRAGONFLY || GTEST_OS_FREEBSD || GTEST_OS_GNU_KFREEBSD || \
10472*5c90c05cSAndroid Build Coastguard Worker       GTEST_OS_NETBSD
10473*5c90c05cSAndroid Build Coastguard Worker 
10474*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_NETBSD
10475*5c90c05cSAndroid Build Coastguard Worker #undef KERN_PROC
10476*5c90c05cSAndroid Build Coastguard Worker #define KERN_PROC KERN_PROC2
10477*5c90c05cSAndroid Build Coastguard Worker #define kinfo_proc kinfo_proc2
10478*5c90c05cSAndroid Build Coastguard Worker #endif
10479*5c90c05cSAndroid Build Coastguard Worker 
10480*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_DRAGONFLY
10481*5c90c05cSAndroid Build Coastguard Worker #define KP_NLWP(kp) (kp.kp_nthreads)
10482*5c90c05cSAndroid Build Coastguard Worker #elif GTEST_OS_FREEBSD || GTEST_OS_GNU_KFREEBSD
10483*5c90c05cSAndroid Build Coastguard Worker #define KP_NLWP(kp) (kp.ki_numthreads)
10484*5c90c05cSAndroid Build Coastguard Worker #elif GTEST_OS_NETBSD
10485*5c90c05cSAndroid Build Coastguard Worker #define KP_NLWP(kp) (kp.p_nlwps)
10486*5c90c05cSAndroid Build Coastguard Worker #endif
10487*5c90c05cSAndroid Build Coastguard Worker 
10488*5c90c05cSAndroid Build Coastguard Worker // Returns the number of threads running in the process, or 0 to indicate that
10489*5c90c05cSAndroid Build Coastguard Worker // we cannot detect it.
GetThreadCount()10490*5c90c05cSAndroid Build Coastguard Worker size_t GetThreadCount() {
10491*5c90c05cSAndroid Build Coastguard Worker   int mib[] = {
10492*5c90c05cSAndroid Build Coastguard Worker     CTL_KERN,
10493*5c90c05cSAndroid Build Coastguard Worker     KERN_PROC,
10494*5c90c05cSAndroid Build Coastguard Worker     KERN_PROC_PID,
10495*5c90c05cSAndroid Build Coastguard Worker     getpid(),
10496*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_NETBSD
10497*5c90c05cSAndroid Build Coastguard Worker     sizeof(struct kinfo_proc),
10498*5c90c05cSAndroid Build Coastguard Worker     1,
10499*5c90c05cSAndroid Build Coastguard Worker #endif
10500*5c90c05cSAndroid Build Coastguard Worker   };
10501*5c90c05cSAndroid Build Coastguard Worker   u_int miblen = sizeof(mib) / sizeof(mib[0]);
10502*5c90c05cSAndroid Build Coastguard Worker   struct kinfo_proc info;
10503*5c90c05cSAndroid Build Coastguard Worker   size_t size = sizeof(info);
10504*5c90c05cSAndroid Build Coastguard Worker   if (sysctl(mib, miblen, &info, &size, NULL, 0)) {
10505*5c90c05cSAndroid Build Coastguard Worker     return 0;
10506*5c90c05cSAndroid Build Coastguard Worker   }
10507*5c90c05cSAndroid Build Coastguard Worker   return static_cast<size_t>(KP_NLWP(info));
10508*5c90c05cSAndroid Build Coastguard Worker }
10509*5c90c05cSAndroid Build Coastguard Worker #elif GTEST_OS_OPENBSD
10510*5c90c05cSAndroid Build Coastguard Worker 
10511*5c90c05cSAndroid Build Coastguard Worker // Returns the number of threads running in the process, or 0 to indicate that
10512*5c90c05cSAndroid Build Coastguard Worker // we cannot detect it.
GetThreadCount()10513*5c90c05cSAndroid Build Coastguard Worker size_t GetThreadCount() {
10514*5c90c05cSAndroid Build Coastguard Worker   int mib[] = {
10515*5c90c05cSAndroid Build Coastguard Worker     CTL_KERN,
10516*5c90c05cSAndroid Build Coastguard Worker     KERN_PROC,
10517*5c90c05cSAndroid Build Coastguard Worker     KERN_PROC_PID | KERN_PROC_SHOW_THREADS,
10518*5c90c05cSAndroid Build Coastguard Worker     getpid(),
10519*5c90c05cSAndroid Build Coastguard Worker     sizeof(struct kinfo_proc),
10520*5c90c05cSAndroid Build Coastguard Worker     0,
10521*5c90c05cSAndroid Build Coastguard Worker   };
10522*5c90c05cSAndroid Build Coastguard Worker   u_int miblen = sizeof(mib) / sizeof(mib[0]);
10523*5c90c05cSAndroid Build Coastguard Worker 
10524*5c90c05cSAndroid Build Coastguard Worker   // get number of structs
10525*5c90c05cSAndroid Build Coastguard Worker   size_t size;
10526*5c90c05cSAndroid Build Coastguard Worker   if (sysctl(mib, miblen, NULL, &size, NULL, 0)) {
10527*5c90c05cSAndroid Build Coastguard Worker     return 0;
10528*5c90c05cSAndroid Build Coastguard Worker   }
10529*5c90c05cSAndroid Build Coastguard Worker 
10530*5c90c05cSAndroid Build Coastguard Worker   mib[5] = static_cast<int>(size / static_cast<size_t>(mib[4]));
10531*5c90c05cSAndroid Build Coastguard Worker 
10532*5c90c05cSAndroid Build Coastguard Worker   // populate array of structs
10533*5c90c05cSAndroid Build Coastguard Worker   struct kinfo_proc info[mib[5]];
10534*5c90c05cSAndroid Build Coastguard Worker   if (sysctl(mib, miblen, &info, &size, NULL, 0)) {
10535*5c90c05cSAndroid Build Coastguard Worker     return 0;
10536*5c90c05cSAndroid Build Coastguard Worker   }
10537*5c90c05cSAndroid Build Coastguard Worker 
10538*5c90c05cSAndroid Build Coastguard Worker   // exclude empty members
10539*5c90c05cSAndroid Build Coastguard Worker   size_t nthreads = 0;
10540*5c90c05cSAndroid Build Coastguard Worker   for (size_t i = 0; i < size / static_cast<size_t>(mib[4]); i++) {
10541*5c90c05cSAndroid Build Coastguard Worker     if (info[i].p_tid != -1)
10542*5c90c05cSAndroid Build Coastguard Worker       nthreads++;
10543*5c90c05cSAndroid Build Coastguard Worker   }
10544*5c90c05cSAndroid Build Coastguard Worker   return nthreads;
10545*5c90c05cSAndroid Build Coastguard Worker }
10546*5c90c05cSAndroid Build Coastguard Worker 
10547*5c90c05cSAndroid Build Coastguard Worker #elif GTEST_OS_QNX
10548*5c90c05cSAndroid Build Coastguard Worker 
10549*5c90c05cSAndroid Build Coastguard Worker // Returns the number of threads running in the process, or 0 to indicate that
10550*5c90c05cSAndroid Build Coastguard Worker // we cannot detect it.
GetThreadCount()10551*5c90c05cSAndroid Build Coastguard Worker size_t GetThreadCount() {
10552*5c90c05cSAndroid Build Coastguard Worker   const int fd = open("/proc/self/as", O_RDONLY);
10553*5c90c05cSAndroid Build Coastguard Worker   if (fd < 0) {
10554*5c90c05cSAndroid Build Coastguard Worker     return 0;
10555*5c90c05cSAndroid Build Coastguard Worker   }
10556*5c90c05cSAndroid Build Coastguard Worker   procfs_info process_info;
10557*5c90c05cSAndroid Build Coastguard Worker   const int status =
10558*5c90c05cSAndroid Build Coastguard Worker       devctl(fd, DCMD_PROC_INFO, &process_info, sizeof(process_info), nullptr);
10559*5c90c05cSAndroid Build Coastguard Worker   close(fd);
10560*5c90c05cSAndroid Build Coastguard Worker   if (status == EOK) {
10561*5c90c05cSAndroid Build Coastguard Worker     return static_cast<size_t>(process_info.num_threads);
10562*5c90c05cSAndroid Build Coastguard Worker   } else {
10563*5c90c05cSAndroid Build Coastguard Worker     return 0;
10564*5c90c05cSAndroid Build Coastguard Worker   }
10565*5c90c05cSAndroid Build Coastguard Worker }
10566*5c90c05cSAndroid Build Coastguard Worker 
10567*5c90c05cSAndroid Build Coastguard Worker #elif GTEST_OS_AIX
10568*5c90c05cSAndroid Build Coastguard Worker 
GetThreadCount()10569*5c90c05cSAndroid Build Coastguard Worker size_t GetThreadCount() {
10570*5c90c05cSAndroid Build Coastguard Worker   struct procentry64 entry;
10571*5c90c05cSAndroid Build Coastguard Worker   pid_t pid = getpid();
10572*5c90c05cSAndroid Build Coastguard Worker   int status = getprocs64(&entry, sizeof(entry), nullptr, 0, &pid, 1);
10573*5c90c05cSAndroid Build Coastguard Worker   if (status == 1) {
10574*5c90c05cSAndroid Build Coastguard Worker     return entry.pi_thcount;
10575*5c90c05cSAndroid Build Coastguard Worker   } else {
10576*5c90c05cSAndroid Build Coastguard Worker     return 0;
10577*5c90c05cSAndroid Build Coastguard Worker   }
10578*5c90c05cSAndroid Build Coastguard Worker }
10579*5c90c05cSAndroid Build Coastguard Worker 
10580*5c90c05cSAndroid Build Coastguard Worker #elif GTEST_OS_FUCHSIA
10581*5c90c05cSAndroid Build Coastguard Worker 
GetThreadCount()10582*5c90c05cSAndroid Build Coastguard Worker size_t GetThreadCount() {
10583*5c90c05cSAndroid Build Coastguard Worker   int dummy_buffer;
10584*5c90c05cSAndroid Build Coastguard Worker   size_t avail;
10585*5c90c05cSAndroid Build Coastguard Worker   zx_status_t status = zx_object_get_info(
10586*5c90c05cSAndroid Build Coastguard Worker       zx_process_self(),
10587*5c90c05cSAndroid Build Coastguard Worker       ZX_INFO_PROCESS_THREADS,
10588*5c90c05cSAndroid Build Coastguard Worker       &dummy_buffer,
10589*5c90c05cSAndroid Build Coastguard Worker       0,
10590*5c90c05cSAndroid Build Coastguard Worker       nullptr,
10591*5c90c05cSAndroid Build Coastguard Worker       &avail);
10592*5c90c05cSAndroid Build Coastguard Worker   if (status == ZX_OK) {
10593*5c90c05cSAndroid Build Coastguard Worker     return avail;
10594*5c90c05cSAndroid Build Coastguard Worker   } else {
10595*5c90c05cSAndroid Build Coastguard Worker     return 0;
10596*5c90c05cSAndroid Build Coastguard Worker   }
10597*5c90c05cSAndroid Build Coastguard Worker }
10598*5c90c05cSAndroid Build Coastguard Worker 
10599*5c90c05cSAndroid Build Coastguard Worker #else
10600*5c90c05cSAndroid Build Coastguard Worker 
GetThreadCount()10601*5c90c05cSAndroid Build Coastguard Worker size_t GetThreadCount() {
10602*5c90c05cSAndroid Build Coastguard Worker   // There's no portable way to detect the number of threads, so we just
10603*5c90c05cSAndroid Build Coastguard Worker   // return 0 to indicate that we cannot detect it.
10604*5c90c05cSAndroid Build Coastguard Worker   return 0;
10605*5c90c05cSAndroid Build Coastguard Worker }
10606*5c90c05cSAndroid Build Coastguard Worker 
10607*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_OS_LINUX
10608*5c90c05cSAndroid Build Coastguard Worker 
10609*5c90c05cSAndroid Build Coastguard Worker #if GTEST_IS_THREADSAFE && GTEST_OS_WINDOWS
10610*5c90c05cSAndroid Build Coastguard Worker 
SleepMilliseconds(int n)10611*5c90c05cSAndroid Build Coastguard Worker void SleepMilliseconds(int n) {
10612*5c90c05cSAndroid Build Coastguard Worker   ::Sleep(static_cast<DWORD>(n));
10613*5c90c05cSAndroid Build Coastguard Worker }
10614*5c90c05cSAndroid Build Coastguard Worker 
AutoHandle()10615*5c90c05cSAndroid Build Coastguard Worker AutoHandle::AutoHandle()
10616*5c90c05cSAndroid Build Coastguard Worker     : handle_(INVALID_HANDLE_VALUE) {}
10617*5c90c05cSAndroid Build Coastguard Worker 
AutoHandle(Handle handle)10618*5c90c05cSAndroid Build Coastguard Worker AutoHandle::AutoHandle(Handle handle)
10619*5c90c05cSAndroid Build Coastguard Worker     : handle_(handle) {}
10620*5c90c05cSAndroid Build Coastguard Worker 
~AutoHandle()10621*5c90c05cSAndroid Build Coastguard Worker AutoHandle::~AutoHandle() {
10622*5c90c05cSAndroid Build Coastguard Worker   Reset();
10623*5c90c05cSAndroid Build Coastguard Worker }
10624*5c90c05cSAndroid Build Coastguard Worker 
Get() const10625*5c90c05cSAndroid Build Coastguard Worker AutoHandle::Handle AutoHandle::Get() const {
10626*5c90c05cSAndroid Build Coastguard Worker   return handle_;
10627*5c90c05cSAndroid Build Coastguard Worker }
10628*5c90c05cSAndroid Build Coastguard Worker 
Reset()10629*5c90c05cSAndroid Build Coastguard Worker void AutoHandle::Reset() {
10630*5c90c05cSAndroid Build Coastguard Worker   Reset(INVALID_HANDLE_VALUE);
10631*5c90c05cSAndroid Build Coastguard Worker }
10632*5c90c05cSAndroid Build Coastguard Worker 
Reset(HANDLE handle)10633*5c90c05cSAndroid Build Coastguard Worker void AutoHandle::Reset(HANDLE handle) {
10634*5c90c05cSAndroid Build Coastguard Worker   // Resetting with the same handle we already own is invalid.
10635*5c90c05cSAndroid Build Coastguard Worker   if (handle_ != handle) {
10636*5c90c05cSAndroid Build Coastguard Worker     if (IsCloseable()) {
10637*5c90c05cSAndroid Build Coastguard Worker       ::CloseHandle(handle_);
10638*5c90c05cSAndroid Build Coastguard Worker     }
10639*5c90c05cSAndroid Build Coastguard Worker     handle_ = handle;
10640*5c90c05cSAndroid Build Coastguard Worker   } else {
10641*5c90c05cSAndroid Build Coastguard Worker     GTEST_CHECK_(!IsCloseable())
10642*5c90c05cSAndroid Build Coastguard Worker         << "Resetting a valid handle to itself is likely a programmer error "
10643*5c90c05cSAndroid Build Coastguard Worker             "and thus not allowed.";
10644*5c90c05cSAndroid Build Coastguard Worker   }
10645*5c90c05cSAndroid Build Coastguard Worker }
10646*5c90c05cSAndroid Build Coastguard Worker 
IsCloseable() const10647*5c90c05cSAndroid Build Coastguard Worker bool AutoHandle::IsCloseable() const {
10648*5c90c05cSAndroid Build Coastguard Worker   // Different Windows APIs may use either of these values to represent an
10649*5c90c05cSAndroid Build Coastguard Worker   // invalid handle.
10650*5c90c05cSAndroid Build Coastguard Worker   return handle_ != nullptr && handle_ != INVALID_HANDLE_VALUE;
10651*5c90c05cSAndroid Build Coastguard Worker }
10652*5c90c05cSAndroid Build Coastguard Worker 
Notification()10653*5c90c05cSAndroid Build Coastguard Worker Notification::Notification()
10654*5c90c05cSAndroid Build Coastguard Worker     : event_(::CreateEvent(nullptr,     // Default security attributes.
10655*5c90c05cSAndroid Build Coastguard Worker                            TRUE,        // Do not reset automatically.
10656*5c90c05cSAndroid Build Coastguard Worker                            FALSE,       // Initially unset.
10657*5c90c05cSAndroid Build Coastguard Worker                            nullptr)) {  // Anonymous event.
10658*5c90c05cSAndroid Build Coastguard Worker   GTEST_CHECK_(event_.Get() != nullptr);
10659*5c90c05cSAndroid Build Coastguard Worker }
10660*5c90c05cSAndroid Build Coastguard Worker 
Notify()10661*5c90c05cSAndroid Build Coastguard Worker void Notification::Notify() {
10662*5c90c05cSAndroid Build Coastguard Worker   GTEST_CHECK_(::SetEvent(event_.Get()) != FALSE);
10663*5c90c05cSAndroid Build Coastguard Worker }
10664*5c90c05cSAndroid Build Coastguard Worker 
WaitForNotification()10665*5c90c05cSAndroid Build Coastguard Worker void Notification::WaitForNotification() {
10666*5c90c05cSAndroid Build Coastguard Worker   GTEST_CHECK_(
10667*5c90c05cSAndroid Build Coastguard Worker       ::WaitForSingleObject(event_.Get(), INFINITE) == WAIT_OBJECT_0);
10668*5c90c05cSAndroid Build Coastguard Worker }
10669*5c90c05cSAndroid Build Coastguard Worker 
Mutex()10670*5c90c05cSAndroid Build Coastguard Worker Mutex::Mutex()
10671*5c90c05cSAndroid Build Coastguard Worker     : owner_thread_id_(0),
10672*5c90c05cSAndroid Build Coastguard Worker       type_(kDynamic),
10673*5c90c05cSAndroid Build Coastguard Worker       critical_section_init_phase_(0),
10674*5c90c05cSAndroid Build Coastguard Worker       critical_section_(new CRITICAL_SECTION) {
10675*5c90c05cSAndroid Build Coastguard Worker   ::InitializeCriticalSection(critical_section_);
10676*5c90c05cSAndroid Build Coastguard Worker }
10677*5c90c05cSAndroid Build Coastguard Worker 
~Mutex()10678*5c90c05cSAndroid Build Coastguard Worker Mutex::~Mutex() {
10679*5c90c05cSAndroid Build Coastguard Worker   // Static mutexes are leaked intentionally. It is not thread-safe to try
10680*5c90c05cSAndroid Build Coastguard Worker   // to clean them up.
10681*5c90c05cSAndroid Build Coastguard Worker   if (type_ == kDynamic) {
10682*5c90c05cSAndroid Build Coastguard Worker     ::DeleteCriticalSection(critical_section_);
10683*5c90c05cSAndroid Build Coastguard Worker     delete critical_section_;
10684*5c90c05cSAndroid Build Coastguard Worker     critical_section_ = nullptr;
10685*5c90c05cSAndroid Build Coastguard Worker   }
10686*5c90c05cSAndroid Build Coastguard Worker }
10687*5c90c05cSAndroid Build Coastguard Worker 
Lock()10688*5c90c05cSAndroid Build Coastguard Worker void Mutex::Lock() {
10689*5c90c05cSAndroid Build Coastguard Worker   ThreadSafeLazyInit();
10690*5c90c05cSAndroid Build Coastguard Worker   ::EnterCriticalSection(critical_section_);
10691*5c90c05cSAndroid Build Coastguard Worker   owner_thread_id_ = ::GetCurrentThreadId();
10692*5c90c05cSAndroid Build Coastguard Worker }
10693*5c90c05cSAndroid Build Coastguard Worker 
Unlock()10694*5c90c05cSAndroid Build Coastguard Worker void Mutex::Unlock() {
10695*5c90c05cSAndroid Build Coastguard Worker   ThreadSafeLazyInit();
10696*5c90c05cSAndroid Build Coastguard Worker   // We don't protect writing to owner_thread_id_ here, as it's the
10697*5c90c05cSAndroid Build Coastguard Worker   // caller's responsibility to ensure that the current thread holds the
10698*5c90c05cSAndroid Build Coastguard Worker   // mutex when this is called.
10699*5c90c05cSAndroid Build Coastguard Worker   owner_thread_id_ = 0;
10700*5c90c05cSAndroid Build Coastguard Worker   ::LeaveCriticalSection(critical_section_);
10701*5c90c05cSAndroid Build Coastguard Worker }
10702*5c90c05cSAndroid Build Coastguard Worker 
10703*5c90c05cSAndroid Build Coastguard Worker // Does nothing if the current thread holds the mutex. Otherwise, crashes
10704*5c90c05cSAndroid Build Coastguard Worker // with high probability.
AssertHeld()10705*5c90c05cSAndroid Build Coastguard Worker void Mutex::AssertHeld() {
10706*5c90c05cSAndroid Build Coastguard Worker   ThreadSafeLazyInit();
10707*5c90c05cSAndroid Build Coastguard Worker   GTEST_CHECK_(owner_thread_id_ == ::GetCurrentThreadId())
10708*5c90c05cSAndroid Build Coastguard Worker       << "The current thread is not holding the mutex @" << this;
10709*5c90c05cSAndroid Build Coastguard Worker }
10710*5c90c05cSAndroid Build Coastguard Worker 
10711*5c90c05cSAndroid Build Coastguard Worker namespace {
10712*5c90c05cSAndroid Build Coastguard Worker 
10713*5c90c05cSAndroid Build Coastguard Worker #ifdef _MSC_VER
10714*5c90c05cSAndroid Build Coastguard Worker // Use the RAII idiom to flag mem allocs that are intentionally never
10715*5c90c05cSAndroid Build Coastguard Worker // deallocated. The motivation is to silence the false positive mem leaks
10716*5c90c05cSAndroid Build Coastguard Worker // that are reported by the debug version of MS's CRT which can only detect
10717*5c90c05cSAndroid Build Coastguard Worker // if an alloc is missing a matching deallocation.
10718*5c90c05cSAndroid Build Coastguard Worker // Example:
10719*5c90c05cSAndroid Build Coastguard Worker //    MemoryIsNotDeallocated memory_is_not_deallocated;
10720*5c90c05cSAndroid Build Coastguard Worker //    critical_section_ = new CRITICAL_SECTION;
10721*5c90c05cSAndroid Build Coastguard Worker //
10722*5c90c05cSAndroid Build Coastguard Worker class MemoryIsNotDeallocated
10723*5c90c05cSAndroid Build Coastguard Worker {
10724*5c90c05cSAndroid Build Coastguard Worker  public:
MemoryIsNotDeallocated()10725*5c90c05cSAndroid Build Coastguard Worker   MemoryIsNotDeallocated() : old_crtdbg_flag_(0) {
10726*5c90c05cSAndroid Build Coastguard Worker     old_crtdbg_flag_ = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
10727*5c90c05cSAndroid Build Coastguard Worker     // Set heap allocation block type to _IGNORE_BLOCK so that MS debug CRT
10728*5c90c05cSAndroid Build Coastguard Worker     // doesn't report mem leak if there's no matching deallocation.
10729*5c90c05cSAndroid Build Coastguard Worker     _CrtSetDbgFlag(old_crtdbg_flag_ & ~_CRTDBG_ALLOC_MEM_DF);
10730*5c90c05cSAndroid Build Coastguard Worker   }
10731*5c90c05cSAndroid Build Coastguard Worker 
~MemoryIsNotDeallocated()10732*5c90c05cSAndroid Build Coastguard Worker   ~MemoryIsNotDeallocated() {
10733*5c90c05cSAndroid Build Coastguard Worker     // Restore the original _CRTDBG_ALLOC_MEM_DF flag
10734*5c90c05cSAndroid Build Coastguard Worker     _CrtSetDbgFlag(old_crtdbg_flag_);
10735*5c90c05cSAndroid Build Coastguard Worker   }
10736*5c90c05cSAndroid Build Coastguard Worker 
10737*5c90c05cSAndroid Build Coastguard Worker  private:
10738*5c90c05cSAndroid Build Coastguard Worker   int old_crtdbg_flag_;
10739*5c90c05cSAndroid Build Coastguard Worker 
10740*5c90c05cSAndroid Build Coastguard Worker   GTEST_DISALLOW_COPY_AND_ASSIGN_(MemoryIsNotDeallocated);
10741*5c90c05cSAndroid Build Coastguard Worker };
10742*5c90c05cSAndroid Build Coastguard Worker #endif  // _MSC_VER
10743*5c90c05cSAndroid Build Coastguard Worker 
10744*5c90c05cSAndroid Build Coastguard Worker }  // namespace
10745*5c90c05cSAndroid Build Coastguard Worker 
10746*5c90c05cSAndroid Build Coastguard Worker // Initializes owner_thread_id_ and critical_section_ in static mutexes.
ThreadSafeLazyInit()10747*5c90c05cSAndroid Build Coastguard Worker void Mutex::ThreadSafeLazyInit() {
10748*5c90c05cSAndroid Build Coastguard Worker   // Dynamic mutexes are initialized in the constructor.
10749*5c90c05cSAndroid Build Coastguard Worker   if (type_ == kStatic) {
10750*5c90c05cSAndroid Build Coastguard Worker     switch (
10751*5c90c05cSAndroid Build Coastguard Worker         ::InterlockedCompareExchange(&critical_section_init_phase_, 1L, 0L)) {
10752*5c90c05cSAndroid Build Coastguard Worker       case 0:
10753*5c90c05cSAndroid Build Coastguard Worker         // If critical_section_init_phase_ was 0 before the exchange, we
10754*5c90c05cSAndroid Build Coastguard Worker         // are the first to test it and need to perform the initialization.
10755*5c90c05cSAndroid Build Coastguard Worker         owner_thread_id_ = 0;
10756*5c90c05cSAndroid Build Coastguard Worker         {
10757*5c90c05cSAndroid Build Coastguard Worker           // Use RAII to flag that following mem alloc is never deallocated.
10758*5c90c05cSAndroid Build Coastguard Worker #ifdef _MSC_VER
10759*5c90c05cSAndroid Build Coastguard Worker           MemoryIsNotDeallocated memory_is_not_deallocated;
10760*5c90c05cSAndroid Build Coastguard Worker #endif  // _MSC_VER
10761*5c90c05cSAndroid Build Coastguard Worker           critical_section_ = new CRITICAL_SECTION;
10762*5c90c05cSAndroid Build Coastguard Worker         }
10763*5c90c05cSAndroid Build Coastguard Worker         ::InitializeCriticalSection(critical_section_);
10764*5c90c05cSAndroid Build Coastguard Worker         // Updates the critical_section_init_phase_ to 2 to signal
10765*5c90c05cSAndroid Build Coastguard Worker         // initialization complete.
10766*5c90c05cSAndroid Build Coastguard Worker         GTEST_CHECK_(::InterlockedCompareExchange(
10767*5c90c05cSAndroid Build Coastguard Worker                           &critical_section_init_phase_, 2L, 1L) ==
10768*5c90c05cSAndroid Build Coastguard Worker                       1L);
10769*5c90c05cSAndroid Build Coastguard Worker         break;
10770*5c90c05cSAndroid Build Coastguard Worker       case 1:
10771*5c90c05cSAndroid Build Coastguard Worker         // Somebody else is already initializing the mutex; spin until they
10772*5c90c05cSAndroid Build Coastguard Worker         // are done.
10773*5c90c05cSAndroid Build Coastguard Worker         while (::InterlockedCompareExchange(&critical_section_init_phase_,
10774*5c90c05cSAndroid Build Coastguard Worker                                             2L,
10775*5c90c05cSAndroid Build Coastguard Worker                                             2L) != 2L) {
10776*5c90c05cSAndroid Build Coastguard Worker           // Possibly yields the rest of the thread's time slice to other
10777*5c90c05cSAndroid Build Coastguard Worker           // threads.
10778*5c90c05cSAndroid Build Coastguard Worker           ::Sleep(0);
10779*5c90c05cSAndroid Build Coastguard Worker         }
10780*5c90c05cSAndroid Build Coastguard Worker         break;
10781*5c90c05cSAndroid Build Coastguard Worker 
10782*5c90c05cSAndroid Build Coastguard Worker       case 2:
10783*5c90c05cSAndroid Build Coastguard Worker         break;  // The mutex is already initialized and ready for use.
10784*5c90c05cSAndroid Build Coastguard Worker 
10785*5c90c05cSAndroid Build Coastguard Worker       default:
10786*5c90c05cSAndroid Build Coastguard Worker         GTEST_CHECK_(false)
10787*5c90c05cSAndroid Build Coastguard Worker             << "Unexpected value of critical_section_init_phase_ "
10788*5c90c05cSAndroid Build Coastguard Worker             << "while initializing a static mutex.";
10789*5c90c05cSAndroid Build Coastguard Worker     }
10790*5c90c05cSAndroid Build Coastguard Worker   }
10791*5c90c05cSAndroid Build Coastguard Worker }
10792*5c90c05cSAndroid Build Coastguard Worker 
10793*5c90c05cSAndroid Build Coastguard Worker namespace {
10794*5c90c05cSAndroid Build Coastguard Worker 
10795*5c90c05cSAndroid Build Coastguard Worker class ThreadWithParamSupport : public ThreadWithParamBase {
10796*5c90c05cSAndroid Build Coastguard Worker  public:
CreateThread(Runnable * runnable,Notification * thread_can_start)10797*5c90c05cSAndroid Build Coastguard Worker   static HANDLE CreateThread(Runnable* runnable,
10798*5c90c05cSAndroid Build Coastguard Worker                              Notification* thread_can_start) {
10799*5c90c05cSAndroid Build Coastguard Worker     ThreadMainParam* param = new ThreadMainParam(runnable, thread_can_start);
10800*5c90c05cSAndroid Build Coastguard Worker     DWORD thread_id;
10801*5c90c05cSAndroid Build Coastguard Worker     HANDLE thread_handle = ::CreateThread(
10802*5c90c05cSAndroid Build Coastguard Worker         nullptr,  // Default security.
10803*5c90c05cSAndroid Build Coastguard Worker         0,        // Default stack size.
10804*5c90c05cSAndroid Build Coastguard Worker         &ThreadWithParamSupport::ThreadMain,
10805*5c90c05cSAndroid Build Coastguard Worker         param,        // Parameter to ThreadMainStatic
10806*5c90c05cSAndroid Build Coastguard Worker         0x0,          // Default creation flags.
10807*5c90c05cSAndroid Build Coastguard Worker         &thread_id);  // Need a valid pointer for the call to work under Win98.
10808*5c90c05cSAndroid Build Coastguard Worker     GTEST_CHECK_(thread_handle != nullptr)
10809*5c90c05cSAndroid Build Coastguard Worker         << "CreateThread failed with error " << ::GetLastError() << ".";
10810*5c90c05cSAndroid Build Coastguard Worker     if (thread_handle == nullptr) {
10811*5c90c05cSAndroid Build Coastguard Worker       delete param;
10812*5c90c05cSAndroid Build Coastguard Worker     }
10813*5c90c05cSAndroid Build Coastguard Worker     return thread_handle;
10814*5c90c05cSAndroid Build Coastguard Worker   }
10815*5c90c05cSAndroid Build Coastguard Worker 
10816*5c90c05cSAndroid Build Coastguard Worker  private:
10817*5c90c05cSAndroid Build Coastguard Worker   struct ThreadMainParam {
ThreadMainParamtesting::internal::__anon389b48f80e11::ThreadWithParamSupport::ThreadMainParam10818*5c90c05cSAndroid Build Coastguard Worker     ThreadMainParam(Runnable* runnable, Notification* thread_can_start)
10819*5c90c05cSAndroid Build Coastguard Worker         : runnable_(runnable),
10820*5c90c05cSAndroid Build Coastguard Worker           thread_can_start_(thread_can_start) {
10821*5c90c05cSAndroid Build Coastguard Worker     }
10822*5c90c05cSAndroid Build Coastguard Worker     std::unique_ptr<Runnable> runnable_;
10823*5c90c05cSAndroid Build Coastguard Worker     // Does not own.
10824*5c90c05cSAndroid Build Coastguard Worker     Notification* thread_can_start_;
10825*5c90c05cSAndroid Build Coastguard Worker   };
10826*5c90c05cSAndroid Build Coastguard Worker 
ThreadMain(void * ptr)10827*5c90c05cSAndroid Build Coastguard Worker   static DWORD WINAPI ThreadMain(void* ptr) {
10828*5c90c05cSAndroid Build Coastguard Worker     // Transfers ownership.
10829*5c90c05cSAndroid Build Coastguard Worker     std::unique_ptr<ThreadMainParam> param(static_cast<ThreadMainParam*>(ptr));
10830*5c90c05cSAndroid Build Coastguard Worker     if (param->thread_can_start_ != nullptr)
10831*5c90c05cSAndroid Build Coastguard Worker       param->thread_can_start_->WaitForNotification();
10832*5c90c05cSAndroid Build Coastguard Worker     param->runnable_->Run();
10833*5c90c05cSAndroid Build Coastguard Worker     return 0;
10834*5c90c05cSAndroid Build Coastguard Worker   }
10835*5c90c05cSAndroid Build Coastguard Worker 
10836*5c90c05cSAndroid Build Coastguard Worker   // Prohibit instantiation.
10837*5c90c05cSAndroid Build Coastguard Worker   ThreadWithParamSupport();
10838*5c90c05cSAndroid Build Coastguard Worker 
10839*5c90c05cSAndroid Build Coastguard Worker   GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParamSupport);
10840*5c90c05cSAndroid Build Coastguard Worker };
10841*5c90c05cSAndroid Build Coastguard Worker 
10842*5c90c05cSAndroid Build Coastguard Worker }  // namespace
10843*5c90c05cSAndroid Build Coastguard Worker 
ThreadWithParamBase(Runnable * runnable,Notification * thread_can_start)10844*5c90c05cSAndroid Build Coastguard Worker ThreadWithParamBase::ThreadWithParamBase(Runnable *runnable,
10845*5c90c05cSAndroid Build Coastguard Worker                                          Notification* thread_can_start)
10846*5c90c05cSAndroid Build Coastguard Worker       : thread_(ThreadWithParamSupport::CreateThread(runnable,
10847*5c90c05cSAndroid Build Coastguard Worker                                                      thread_can_start)) {
10848*5c90c05cSAndroid Build Coastguard Worker }
10849*5c90c05cSAndroid Build Coastguard Worker 
~ThreadWithParamBase()10850*5c90c05cSAndroid Build Coastguard Worker ThreadWithParamBase::~ThreadWithParamBase() {
10851*5c90c05cSAndroid Build Coastguard Worker   Join();
10852*5c90c05cSAndroid Build Coastguard Worker }
10853*5c90c05cSAndroid Build Coastguard Worker 
Join()10854*5c90c05cSAndroid Build Coastguard Worker void ThreadWithParamBase::Join() {
10855*5c90c05cSAndroid Build Coastguard Worker   GTEST_CHECK_(::WaitForSingleObject(thread_.Get(), INFINITE) == WAIT_OBJECT_0)
10856*5c90c05cSAndroid Build Coastguard Worker       << "Failed to join the thread with error " << ::GetLastError() << ".";
10857*5c90c05cSAndroid Build Coastguard Worker }
10858*5c90c05cSAndroid Build Coastguard Worker 
10859*5c90c05cSAndroid Build Coastguard Worker // Maps a thread to a set of ThreadIdToThreadLocals that have values
10860*5c90c05cSAndroid Build Coastguard Worker // instantiated on that thread and notifies them when the thread exits.  A
10861*5c90c05cSAndroid Build Coastguard Worker // ThreadLocal instance is expected to persist until all threads it has
10862*5c90c05cSAndroid Build Coastguard Worker // values on have terminated.
10863*5c90c05cSAndroid Build Coastguard Worker class ThreadLocalRegistryImpl {
10864*5c90c05cSAndroid Build Coastguard Worker  public:
10865*5c90c05cSAndroid Build Coastguard Worker   // Registers thread_local_instance as having value on the current thread.
10866*5c90c05cSAndroid Build Coastguard Worker   // Returns a value that can be used to identify the thread from other threads.
GetValueOnCurrentThread(const ThreadLocalBase * thread_local_instance)10867*5c90c05cSAndroid Build Coastguard Worker   static ThreadLocalValueHolderBase* GetValueOnCurrentThread(
10868*5c90c05cSAndroid Build Coastguard Worker       const ThreadLocalBase* thread_local_instance) {
10869*5c90c05cSAndroid Build Coastguard Worker #ifdef _MSC_VER
10870*5c90c05cSAndroid Build Coastguard Worker     MemoryIsNotDeallocated memory_is_not_deallocated;
10871*5c90c05cSAndroid Build Coastguard Worker #endif  // _MSC_VER
10872*5c90c05cSAndroid Build Coastguard Worker     DWORD current_thread = ::GetCurrentThreadId();
10873*5c90c05cSAndroid Build Coastguard Worker     MutexLock lock(&mutex_);
10874*5c90c05cSAndroid Build Coastguard Worker     ThreadIdToThreadLocals* const thread_to_thread_locals =
10875*5c90c05cSAndroid Build Coastguard Worker         GetThreadLocalsMapLocked();
10876*5c90c05cSAndroid Build Coastguard Worker     ThreadIdToThreadLocals::iterator thread_local_pos =
10877*5c90c05cSAndroid Build Coastguard Worker         thread_to_thread_locals->find(current_thread);
10878*5c90c05cSAndroid Build Coastguard Worker     if (thread_local_pos == thread_to_thread_locals->end()) {
10879*5c90c05cSAndroid Build Coastguard Worker       thread_local_pos = thread_to_thread_locals->insert(
10880*5c90c05cSAndroid Build Coastguard Worker           std::make_pair(current_thread, ThreadLocalValues())).first;
10881*5c90c05cSAndroid Build Coastguard Worker       StartWatcherThreadFor(current_thread);
10882*5c90c05cSAndroid Build Coastguard Worker     }
10883*5c90c05cSAndroid Build Coastguard Worker     ThreadLocalValues& thread_local_values = thread_local_pos->second;
10884*5c90c05cSAndroid Build Coastguard Worker     ThreadLocalValues::iterator value_pos =
10885*5c90c05cSAndroid Build Coastguard Worker         thread_local_values.find(thread_local_instance);
10886*5c90c05cSAndroid Build Coastguard Worker     if (value_pos == thread_local_values.end()) {
10887*5c90c05cSAndroid Build Coastguard Worker       value_pos =
10888*5c90c05cSAndroid Build Coastguard Worker           thread_local_values
10889*5c90c05cSAndroid Build Coastguard Worker               .insert(std::make_pair(
10890*5c90c05cSAndroid Build Coastguard Worker                   thread_local_instance,
10891*5c90c05cSAndroid Build Coastguard Worker                   std::shared_ptr<ThreadLocalValueHolderBase>(
10892*5c90c05cSAndroid Build Coastguard Worker                       thread_local_instance->NewValueForCurrentThread())))
10893*5c90c05cSAndroid Build Coastguard Worker               .first;
10894*5c90c05cSAndroid Build Coastguard Worker     }
10895*5c90c05cSAndroid Build Coastguard Worker     return value_pos->second.get();
10896*5c90c05cSAndroid Build Coastguard Worker   }
10897*5c90c05cSAndroid Build Coastguard Worker 
OnThreadLocalDestroyed(const ThreadLocalBase * thread_local_instance)10898*5c90c05cSAndroid Build Coastguard Worker   static void OnThreadLocalDestroyed(
10899*5c90c05cSAndroid Build Coastguard Worker       const ThreadLocalBase* thread_local_instance) {
10900*5c90c05cSAndroid Build Coastguard Worker     std::vector<std::shared_ptr<ThreadLocalValueHolderBase> > value_holders;
10901*5c90c05cSAndroid Build Coastguard Worker     // Clean up the ThreadLocalValues data structure while holding the lock, but
10902*5c90c05cSAndroid Build Coastguard Worker     // defer the destruction of the ThreadLocalValueHolderBases.
10903*5c90c05cSAndroid Build Coastguard Worker     {
10904*5c90c05cSAndroid Build Coastguard Worker       MutexLock lock(&mutex_);
10905*5c90c05cSAndroid Build Coastguard Worker       ThreadIdToThreadLocals* const thread_to_thread_locals =
10906*5c90c05cSAndroid Build Coastguard Worker           GetThreadLocalsMapLocked();
10907*5c90c05cSAndroid Build Coastguard Worker       for (ThreadIdToThreadLocals::iterator it =
10908*5c90c05cSAndroid Build Coastguard Worker           thread_to_thread_locals->begin();
10909*5c90c05cSAndroid Build Coastguard Worker           it != thread_to_thread_locals->end();
10910*5c90c05cSAndroid Build Coastguard Worker           ++it) {
10911*5c90c05cSAndroid Build Coastguard Worker         ThreadLocalValues& thread_local_values = it->second;
10912*5c90c05cSAndroid Build Coastguard Worker         ThreadLocalValues::iterator value_pos =
10913*5c90c05cSAndroid Build Coastguard Worker             thread_local_values.find(thread_local_instance);
10914*5c90c05cSAndroid Build Coastguard Worker         if (value_pos != thread_local_values.end()) {
10915*5c90c05cSAndroid Build Coastguard Worker           value_holders.push_back(value_pos->second);
10916*5c90c05cSAndroid Build Coastguard Worker           thread_local_values.erase(value_pos);
10917*5c90c05cSAndroid Build Coastguard Worker           // This 'if' can only be successful at most once, so theoretically we
10918*5c90c05cSAndroid Build Coastguard Worker           // could break out of the loop here, but we don't bother doing so.
10919*5c90c05cSAndroid Build Coastguard Worker         }
10920*5c90c05cSAndroid Build Coastguard Worker       }
10921*5c90c05cSAndroid Build Coastguard Worker     }
10922*5c90c05cSAndroid Build Coastguard Worker     // Outside the lock, let the destructor for 'value_holders' deallocate the
10923*5c90c05cSAndroid Build Coastguard Worker     // ThreadLocalValueHolderBases.
10924*5c90c05cSAndroid Build Coastguard Worker   }
10925*5c90c05cSAndroid Build Coastguard Worker 
OnThreadExit(DWORD thread_id)10926*5c90c05cSAndroid Build Coastguard Worker   static void OnThreadExit(DWORD thread_id) {
10927*5c90c05cSAndroid Build Coastguard Worker     GTEST_CHECK_(thread_id != 0) << ::GetLastError();
10928*5c90c05cSAndroid Build Coastguard Worker     std::vector<std::shared_ptr<ThreadLocalValueHolderBase> > value_holders;
10929*5c90c05cSAndroid Build Coastguard Worker     // Clean up the ThreadIdToThreadLocals data structure while holding the
10930*5c90c05cSAndroid Build Coastguard Worker     // lock, but defer the destruction of the ThreadLocalValueHolderBases.
10931*5c90c05cSAndroid Build Coastguard Worker     {
10932*5c90c05cSAndroid Build Coastguard Worker       MutexLock lock(&mutex_);
10933*5c90c05cSAndroid Build Coastguard Worker       ThreadIdToThreadLocals* const thread_to_thread_locals =
10934*5c90c05cSAndroid Build Coastguard Worker           GetThreadLocalsMapLocked();
10935*5c90c05cSAndroid Build Coastguard Worker       ThreadIdToThreadLocals::iterator thread_local_pos =
10936*5c90c05cSAndroid Build Coastguard Worker           thread_to_thread_locals->find(thread_id);
10937*5c90c05cSAndroid Build Coastguard Worker       if (thread_local_pos != thread_to_thread_locals->end()) {
10938*5c90c05cSAndroid Build Coastguard Worker         ThreadLocalValues& thread_local_values = thread_local_pos->second;
10939*5c90c05cSAndroid Build Coastguard Worker         for (ThreadLocalValues::iterator value_pos =
10940*5c90c05cSAndroid Build Coastguard Worker             thread_local_values.begin();
10941*5c90c05cSAndroid Build Coastguard Worker             value_pos != thread_local_values.end();
10942*5c90c05cSAndroid Build Coastguard Worker             ++value_pos) {
10943*5c90c05cSAndroid Build Coastguard Worker           value_holders.push_back(value_pos->second);
10944*5c90c05cSAndroid Build Coastguard Worker         }
10945*5c90c05cSAndroid Build Coastguard Worker         thread_to_thread_locals->erase(thread_local_pos);
10946*5c90c05cSAndroid Build Coastguard Worker       }
10947*5c90c05cSAndroid Build Coastguard Worker     }
10948*5c90c05cSAndroid Build Coastguard Worker     // Outside the lock, let the destructor for 'value_holders' deallocate the
10949*5c90c05cSAndroid Build Coastguard Worker     // ThreadLocalValueHolderBases.
10950*5c90c05cSAndroid Build Coastguard Worker   }
10951*5c90c05cSAndroid Build Coastguard Worker 
10952*5c90c05cSAndroid Build Coastguard Worker  private:
10953*5c90c05cSAndroid Build Coastguard Worker   // In a particular thread, maps a ThreadLocal object to its value.
10954*5c90c05cSAndroid Build Coastguard Worker   typedef std::map<const ThreadLocalBase*,
10955*5c90c05cSAndroid Build Coastguard Worker                    std::shared_ptr<ThreadLocalValueHolderBase> >
10956*5c90c05cSAndroid Build Coastguard Worker       ThreadLocalValues;
10957*5c90c05cSAndroid Build Coastguard Worker   // Stores all ThreadIdToThreadLocals having values in a thread, indexed by
10958*5c90c05cSAndroid Build Coastguard Worker   // thread's ID.
10959*5c90c05cSAndroid Build Coastguard Worker   typedef std::map<DWORD, ThreadLocalValues> ThreadIdToThreadLocals;
10960*5c90c05cSAndroid Build Coastguard Worker 
10961*5c90c05cSAndroid Build Coastguard Worker   // Holds the thread id and thread handle that we pass from
10962*5c90c05cSAndroid Build Coastguard Worker   // StartWatcherThreadFor to WatcherThreadFunc.
10963*5c90c05cSAndroid Build Coastguard Worker   typedef std::pair<DWORD, HANDLE> ThreadIdAndHandle;
10964*5c90c05cSAndroid Build Coastguard Worker 
StartWatcherThreadFor(DWORD thread_id)10965*5c90c05cSAndroid Build Coastguard Worker   static void StartWatcherThreadFor(DWORD thread_id) {
10966*5c90c05cSAndroid Build Coastguard Worker     // The returned handle will be kept in thread_map and closed by
10967*5c90c05cSAndroid Build Coastguard Worker     // watcher_thread in WatcherThreadFunc.
10968*5c90c05cSAndroid Build Coastguard Worker     HANDLE thread = ::OpenThread(SYNCHRONIZE | THREAD_QUERY_INFORMATION,
10969*5c90c05cSAndroid Build Coastguard Worker                                  FALSE,
10970*5c90c05cSAndroid Build Coastguard Worker                                  thread_id);
10971*5c90c05cSAndroid Build Coastguard Worker     GTEST_CHECK_(thread != nullptr);
10972*5c90c05cSAndroid Build Coastguard Worker     // We need to pass a valid thread ID pointer into CreateThread for it
10973*5c90c05cSAndroid Build Coastguard Worker     // to work correctly under Win98.
10974*5c90c05cSAndroid Build Coastguard Worker     DWORD watcher_thread_id;
10975*5c90c05cSAndroid Build Coastguard Worker     HANDLE watcher_thread = ::CreateThread(
10976*5c90c05cSAndroid Build Coastguard Worker         nullptr,  // Default security.
10977*5c90c05cSAndroid Build Coastguard Worker         0,        // Default stack size
10978*5c90c05cSAndroid Build Coastguard Worker         &ThreadLocalRegistryImpl::WatcherThreadFunc,
10979*5c90c05cSAndroid Build Coastguard Worker         reinterpret_cast<LPVOID>(new ThreadIdAndHandle(thread_id, thread)),
10980*5c90c05cSAndroid Build Coastguard Worker         CREATE_SUSPENDED, &watcher_thread_id);
10981*5c90c05cSAndroid Build Coastguard Worker     GTEST_CHECK_(watcher_thread != nullptr);
10982*5c90c05cSAndroid Build Coastguard Worker     // Give the watcher thread the same priority as ours to avoid being
10983*5c90c05cSAndroid Build Coastguard Worker     // blocked by it.
10984*5c90c05cSAndroid Build Coastguard Worker     ::SetThreadPriority(watcher_thread,
10985*5c90c05cSAndroid Build Coastguard Worker                         ::GetThreadPriority(::GetCurrentThread()));
10986*5c90c05cSAndroid Build Coastguard Worker     ::ResumeThread(watcher_thread);
10987*5c90c05cSAndroid Build Coastguard Worker     ::CloseHandle(watcher_thread);
10988*5c90c05cSAndroid Build Coastguard Worker   }
10989*5c90c05cSAndroid Build Coastguard Worker 
10990*5c90c05cSAndroid Build Coastguard Worker   // Monitors exit from a given thread and notifies those
10991*5c90c05cSAndroid Build Coastguard Worker   // ThreadIdToThreadLocals about thread termination.
WatcherThreadFunc(LPVOID param)10992*5c90c05cSAndroid Build Coastguard Worker   static DWORD WINAPI WatcherThreadFunc(LPVOID param) {
10993*5c90c05cSAndroid Build Coastguard Worker     const ThreadIdAndHandle* tah =
10994*5c90c05cSAndroid Build Coastguard Worker         reinterpret_cast<const ThreadIdAndHandle*>(param);
10995*5c90c05cSAndroid Build Coastguard Worker     GTEST_CHECK_(
10996*5c90c05cSAndroid Build Coastguard Worker         ::WaitForSingleObject(tah->second, INFINITE) == WAIT_OBJECT_0);
10997*5c90c05cSAndroid Build Coastguard Worker     OnThreadExit(tah->first);
10998*5c90c05cSAndroid Build Coastguard Worker     ::CloseHandle(tah->second);
10999*5c90c05cSAndroid Build Coastguard Worker     delete tah;
11000*5c90c05cSAndroid Build Coastguard Worker     return 0;
11001*5c90c05cSAndroid Build Coastguard Worker   }
11002*5c90c05cSAndroid Build Coastguard Worker 
11003*5c90c05cSAndroid Build Coastguard Worker   // Returns map of thread local instances.
GetThreadLocalsMapLocked()11004*5c90c05cSAndroid Build Coastguard Worker   static ThreadIdToThreadLocals* GetThreadLocalsMapLocked() {
11005*5c90c05cSAndroid Build Coastguard Worker     mutex_.AssertHeld();
11006*5c90c05cSAndroid Build Coastguard Worker #ifdef _MSC_VER
11007*5c90c05cSAndroid Build Coastguard Worker     MemoryIsNotDeallocated memory_is_not_deallocated;
11008*5c90c05cSAndroid Build Coastguard Worker #endif  // _MSC_VER
11009*5c90c05cSAndroid Build Coastguard Worker     static ThreadIdToThreadLocals* map = new ThreadIdToThreadLocals();
11010*5c90c05cSAndroid Build Coastguard Worker     return map;
11011*5c90c05cSAndroid Build Coastguard Worker   }
11012*5c90c05cSAndroid Build Coastguard Worker 
11013*5c90c05cSAndroid Build Coastguard Worker   // Protects access to GetThreadLocalsMapLocked() and its return value.
11014*5c90c05cSAndroid Build Coastguard Worker   static Mutex mutex_;
11015*5c90c05cSAndroid Build Coastguard Worker   // Protects access to GetThreadMapLocked() and its return value.
11016*5c90c05cSAndroid Build Coastguard Worker   static Mutex thread_map_mutex_;
11017*5c90c05cSAndroid Build Coastguard Worker };
11018*5c90c05cSAndroid Build Coastguard Worker 
11019*5c90c05cSAndroid Build Coastguard Worker Mutex ThreadLocalRegistryImpl::mutex_(Mutex::kStaticMutex);
11020*5c90c05cSAndroid Build Coastguard Worker Mutex ThreadLocalRegistryImpl::thread_map_mutex_(Mutex::kStaticMutex);
11021*5c90c05cSAndroid Build Coastguard Worker 
GetValueOnCurrentThread(const ThreadLocalBase * thread_local_instance)11022*5c90c05cSAndroid Build Coastguard Worker ThreadLocalValueHolderBase* ThreadLocalRegistry::GetValueOnCurrentThread(
11023*5c90c05cSAndroid Build Coastguard Worker       const ThreadLocalBase* thread_local_instance) {
11024*5c90c05cSAndroid Build Coastguard Worker   return ThreadLocalRegistryImpl::GetValueOnCurrentThread(
11025*5c90c05cSAndroid Build Coastguard Worker       thread_local_instance);
11026*5c90c05cSAndroid Build Coastguard Worker }
11027*5c90c05cSAndroid Build Coastguard Worker 
OnThreadLocalDestroyed(const ThreadLocalBase * thread_local_instance)11028*5c90c05cSAndroid Build Coastguard Worker void ThreadLocalRegistry::OnThreadLocalDestroyed(
11029*5c90c05cSAndroid Build Coastguard Worker       const ThreadLocalBase* thread_local_instance) {
11030*5c90c05cSAndroid Build Coastguard Worker   ThreadLocalRegistryImpl::OnThreadLocalDestroyed(thread_local_instance);
11031*5c90c05cSAndroid Build Coastguard Worker }
11032*5c90c05cSAndroid Build Coastguard Worker 
11033*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_IS_THREADSAFE && GTEST_OS_WINDOWS
11034*5c90c05cSAndroid Build Coastguard Worker 
11035*5c90c05cSAndroid Build Coastguard Worker #if GTEST_USES_POSIX_RE
11036*5c90c05cSAndroid Build Coastguard Worker 
11037*5c90c05cSAndroid Build Coastguard Worker // Implements RE.  Currently only needed for death tests.
11038*5c90c05cSAndroid Build Coastguard Worker 
~RE()11039*5c90c05cSAndroid Build Coastguard Worker RE::~RE() {
11040*5c90c05cSAndroid Build Coastguard Worker   if (is_valid_) {
11041*5c90c05cSAndroid Build Coastguard Worker     // regfree'ing an invalid regex might crash because the content
11042*5c90c05cSAndroid Build Coastguard Worker     // of the regex is undefined. Since the regex's are essentially
11043*5c90c05cSAndroid Build Coastguard Worker     // the same, one cannot be valid (or invalid) without the other
11044*5c90c05cSAndroid Build Coastguard Worker     // being so too.
11045*5c90c05cSAndroid Build Coastguard Worker     regfree(&partial_regex_);
11046*5c90c05cSAndroid Build Coastguard Worker     regfree(&full_regex_);
11047*5c90c05cSAndroid Build Coastguard Worker   }
11048*5c90c05cSAndroid Build Coastguard Worker   free(const_cast<char*>(pattern_));
11049*5c90c05cSAndroid Build Coastguard Worker }
11050*5c90c05cSAndroid Build Coastguard Worker 
11051*5c90c05cSAndroid Build Coastguard Worker // Returns true if and only if regular expression re matches the entire str.
FullMatch(const char * str,const RE & re)11052*5c90c05cSAndroid Build Coastguard Worker bool RE::FullMatch(const char* str, const RE& re) {
11053*5c90c05cSAndroid Build Coastguard Worker   if (!re.is_valid_) return false;
11054*5c90c05cSAndroid Build Coastguard Worker 
11055*5c90c05cSAndroid Build Coastguard Worker   regmatch_t match;
11056*5c90c05cSAndroid Build Coastguard Worker   return regexec(&re.full_regex_, str, 1, &match, 0) == 0;
11057*5c90c05cSAndroid Build Coastguard Worker }
11058*5c90c05cSAndroid Build Coastguard Worker 
11059*5c90c05cSAndroid Build Coastguard Worker // Returns true if and only if regular expression re matches a substring of
11060*5c90c05cSAndroid Build Coastguard Worker // str (including str itself).
PartialMatch(const char * str,const RE & re)11061*5c90c05cSAndroid Build Coastguard Worker bool RE::PartialMatch(const char* str, const RE& re) {
11062*5c90c05cSAndroid Build Coastguard Worker   if (!re.is_valid_) return false;
11063*5c90c05cSAndroid Build Coastguard Worker 
11064*5c90c05cSAndroid Build Coastguard Worker   regmatch_t match;
11065*5c90c05cSAndroid Build Coastguard Worker   return regexec(&re.partial_regex_, str, 1, &match, 0) == 0;
11066*5c90c05cSAndroid Build Coastguard Worker }
11067*5c90c05cSAndroid Build Coastguard Worker 
11068*5c90c05cSAndroid Build Coastguard Worker // Initializes an RE from its string representation.
Init(const char * regex)11069*5c90c05cSAndroid Build Coastguard Worker void RE::Init(const char* regex) {
11070*5c90c05cSAndroid Build Coastguard Worker   pattern_ = posix::StrDup(regex);
11071*5c90c05cSAndroid Build Coastguard Worker 
11072*5c90c05cSAndroid Build Coastguard Worker   // Reserves enough bytes to hold the regular expression used for a
11073*5c90c05cSAndroid Build Coastguard Worker   // full match.
11074*5c90c05cSAndroid Build Coastguard Worker   const size_t full_regex_len = strlen(regex) + 10;
11075*5c90c05cSAndroid Build Coastguard Worker   char* const full_pattern = new char[full_regex_len];
11076*5c90c05cSAndroid Build Coastguard Worker 
11077*5c90c05cSAndroid Build Coastguard Worker   snprintf(full_pattern, full_regex_len, "^(%s)$", regex);
11078*5c90c05cSAndroid Build Coastguard Worker   is_valid_ = regcomp(&full_regex_, full_pattern, REG_EXTENDED) == 0;
11079*5c90c05cSAndroid Build Coastguard Worker   // We want to call regcomp(&partial_regex_, ...) even if the
11080*5c90c05cSAndroid Build Coastguard Worker   // previous expression returns false.  Otherwise partial_regex_ may
11081*5c90c05cSAndroid Build Coastguard Worker   // not be properly initialized can may cause trouble when it's
11082*5c90c05cSAndroid Build Coastguard Worker   // freed.
11083*5c90c05cSAndroid Build Coastguard Worker   //
11084*5c90c05cSAndroid Build Coastguard Worker   // Some implementation of POSIX regex (e.g. on at least some
11085*5c90c05cSAndroid Build Coastguard Worker   // versions of Cygwin) doesn't accept the empty string as a valid
11086*5c90c05cSAndroid Build Coastguard Worker   // regex.  We change it to an equivalent form "()" to be safe.
11087*5c90c05cSAndroid Build Coastguard Worker   if (is_valid_) {
11088*5c90c05cSAndroid Build Coastguard Worker     const char* const partial_regex = (*regex == '\0') ? "()" : regex;
11089*5c90c05cSAndroid Build Coastguard Worker     is_valid_ = regcomp(&partial_regex_, partial_regex, REG_EXTENDED) == 0;
11090*5c90c05cSAndroid Build Coastguard Worker   }
11091*5c90c05cSAndroid Build Coastguard Worker   EXPECT_TRUE(is_valid_)
11092*5c90c05cSAndroid Build Coastguard Worker       << "Regular expression \"" << regex
11093*5c90c05cSAndroid Build Coastguard Worker       << "\" is not a valid POSIX Extended regular expression.";
11094*5c90c05cSAndroid Build Coastguard Worker 
11095*5c90c05cSAndroid Build Coastguard Worker   delete[] full_pattern;
11096*5c90c05cSAndroid Build Coastguard Worker }
11097*5c90c05cSAndroid Build Coastguard Worker 
11098*5c90c05cSAndroid Build Coastguard Worker #elif GTEST_USES_SIMPLE_RE
11099*5c90c05cSAndroid Build Coastguard Worker 
11100*5c90c05cSAndroid Build Coastguard Worker // Returns true if and only if ch appears anywhere in str (excluding the
11101*5c90c05cSAndroid Build Coastguard Worker // terminating '\0' character).
IsInSet(char ch,const char * str)11102*5c90c05cSAndroid Build Coastguard Worker bool IsInSet(char ch, const char* str) {
11103*5c90c05cSAndroid Build Coastguard Worker   return ch != '\0' && strchr(str, ch) != nullptr;
11104*5c90c05cSAndroid Build Coastguard Worker }
11105*5c90c05cSAndroid Build Coastguard Worker 
11106*5c90c05cSAndroid Build Coastguard Worker // Returns true if and only if ch belongs to the given classification.
11107*5c90c05cSAndroid Build Coastguard Worker // Unlike similar functions in <ctype.h>, these aren't affected by the
11108*5c90c05cSAndroid Build Coastguard Worker // current locale.
IsAsciiDigit(char ch)11109*5c90c05cSAndroid Build Coastguard Worker bool IsAsciiDigit(char ch) { return '0' <= ch && ch <= '9'; }
IsAsciiPunct(char ch)11110*5c90c05cSAndroid Build Coastguard Worker bool IsAsciiPunct(char ch) {
11111*5c90c05cSAndroid Build Coastguard Worker   return IsInSet(ch, "^-!\"#$%&'()*+,./:;<=>?@[\\]_`{|}~");
11112*5c90c05cSAndroid Build Coastguard Worker }
IsRepeat(char ch)11113*5c90c05cSAndroid Build Coastguard Worker bool IsRepeat(char ch) { return IsInSet(ch, "?*+"); }
IsAsciiWhiteSpace(char ch)11114*5c90c05cSAndroid Build Coastguard Worker bool IsAsciiWhiteSpace(char ch) { return IsInSet(ch, " \f\n\r\t\v"); }
IsAsciiWordChar(char ch)11115*5c90c05cSAndroid Build Coastguard Worker bool IsAsciiWordChar(char ch) {
11116*5c90c05cSAndroid Build Coastguard Worker   return ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') ||
11117*5c90c05cSAndroid Build Coastguard Worker       ('0' <= ch && ch <= '9') || ch == '_';
11118*5c90c05cSAndroid Build Coastguard Worker }
11119*5c90c05cSAndroid Build Coastguard Worker 
11120*5c90c05cSAndroid Build Coastguard Worker // Returns true if and only if "\\c" is a supported escape sequence.
IsValidEscape(char c)11121*5c90c05cSAndroid Build Coastguard Worker bool IsValidEscape(char c) {
11122*5c90c05cSAndroid Build Coastguard Worker   return (IsAsciiPunct(c) || IsInSet(c, "dDfnrsStvwW"));
11123*5c90c05cSAndroid Build Coastguard Worker }
11124*5c90c05cSAndroid Build Coastguard Worker 
11125*5c90c05cSAndroid Build Coastguard Worker // Returns true if and only if the given atom (specified by escaped and
11126*5c90c05cSAndroid Build Coastguard Worker // pattern) matches ch.  The result is undefined if the atom is invalid.
AtomMatchesChar(bool escaped,char pattern_char,char ch)11127*5c90c05cSAndroid Build Coastguard Worker bool AtomMatchesChar(bool escaped, char pattern_char, char ch) {
11128*5c90c05cSAndroid Build Coastguard Worker   if (escaped) {  // "\\p" where p is pattern_char.
11129*5c90c05cSAndroid Build Coastguard Worker     switch (pattern_char) {
11130*5c90c05cSAndroid Build Coastguard Worker       case 'd': return IsAsciiDigit(ch);
11131*5c90c05cSAndroid Build Coastguard Worker       case 'D': return !IsAsciiDigit(ch);
11132*5c90c05cSAndroid Build Coastguard Worker       case 'f': return ch == '\f';
11133*5c90c05cSAndroid Build Coastguard Worker       case 'n': return ch == '\n';
11134*5c90c05cSAndroid Build Coastguard Worker       case 'r': return ch == '\r';
11135*5c90c05cSAndroid Build Coastguard Worker       case 's': return IsAsciiWhiteSpace(ch);
11136*5c90c05cSAndroid Build Coastguard Worker       case 'S': return !IsAsciiWhiteSpace(ch);
11137*5c90c05cSAndroid Build Coastguard Worker       case 't': return ch == '\t';
11138*5c90c05cSAndroid Build Coastguard Worker       case 'v': return ch == '\v';
11139*5c90c05cSAndroid Build Coastguard Worker       case 'w': return IsAsciiWordChar(ch);
11140*5c90c05cSAndroid Build Coastguard Worker       case 'W': return !IsAsciiWordChar(ch);
11141*5c90c05cSAndroid Build Coastguard Worker     }
11142*5c90c05cSAndroid Build Coastguard Worker     return IsAsciiPunct(pattern_char) && pattern_char == ch;
11143*5c90c05cSAndroid Build Coastguard Worker   }
11144*5c90c05cSAndroid Build Coastguard Worker 
11145*5c90c05cSAndroid Build Coastguard Worker   return (pattern_char == '.' && ch != '\n') || pattern_char == ch;
11146*5c90c05cSAndroid Build Coastguard Worker }
11147*5c90c05cSAndroid Build Coastguard Worker 
11148*5c90c05cSAndroid Build Coastguard Worker // Helper function used by ValidateRegex() to format error messages.
FormatRegexSyntaxError(const char * regex,int index)11149*5c90c05cSAndroid Build Coastguard Worker static std::string FormatRegexSyntaxError(const char* regex, int index) {
11150*5c90c05cSAndroid Build Coastguard Worker   return (Message() << "Syntax error at index " << index
11151*5c90c05cSAndroid Build Coastguard Worker           << " in simple regular expression \"" << regex << "\": ").GetString();
11152*5c90c05cSAndroid Build Coastguard Worker }
11153*5c90c05cSAndroid Build Coastguard Worker 
11154*5c90c05cSAndroid Build Coastguard Worker // Generates non-fatal failures and returns false if regex is invalid;
11155*5c90c05cSAndroid Build Coastguard Worker // otherwise returns true.
ValidateRegex(const char * regex)11156*5c90c05cSAndroid Build Coastguard Worker bool ValidateRegex(const char* regex) {
11157*5c90c05cSAndroid Build Coastguard Worker   if (regex == nullptr) {
11158*5c90c05cSAndroid Build Coastguard Worker     ADD_FAILURE() << "NULL is not a valid simple regular expression.";
11159*5c90c05cSAndroid Build Coastguard Worker     return false;
11160*5c90c05cSAndroid Build Coastguard Worker   }
11161*5c90c05cSAndroid Build Coastguard Worker 
11162*5c90c05cSAndroid Build Coastguard Worker   bool is_valid = true;
11163*5c90c05cSAndroid Build Coastguard Worker 
11164*5c90c05cSAndroid Build Coastguard Worker   // True if and only if ?, *, or + can follow the previous atom.
11165*5c90c05cSAndroid Build Coastguard Worker   bool prev_repeatable = false;
11166*5c90c05cSAndroid Build Coastguard Worker   for (int i = 0; regex[i]; i++) {
11167*5c90c05cSAndroid Build Coastguard Worker     if (regex[i] == '\\') {  // An escape sequence
11168*5c90c05cSAndroid Build Coastguard Worker       i++;
11169*5c90c05cSAndroid Build Coastguard Worker       if (regex[i] == '\0') {
11170*5c90c05cSAndroid Build Coastguard Worker         ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)
11171*5c90c05cSAndroid Build Coastguard Worker                       << "'\\' cannot appear at the end.";
11172*5c90c05cSAndroid Build Coastguard Worker         return false;
11173*5c90c05cSAndroid Build Coastguard Worker       }
11174*5c90c05cSAndroid Build Coastguard Worker 
11175*5c90c05cSAndroid Build Coastguard Worker       if (!IsValidEscape(regex[i])) {
11176*5c90c05cSAndroid Build Coastguard Worker         ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)
11177*5c90c05cSAndroid Build Coastguard Worker                       << "invalid escape sequence \"\\" << regex[i] << "\".";
11178*5c90c05cSAndroid Build Coastguard Worker         is_valid = false;
11179*5c90c05cSAndroid Build Coastguard Worker       }
11180*5c90c05cSAndroid Build Coastguard Worker       prev_repeatable = true;
11181*5c90c05cSAndroid Build Coastguard Worker     } else {  // Not an escape sequence.
11182*5c90c05cSAndroid Build Coastguard Worker       const char ch = regex[i];
11183*5c90c05cSAndroid Build Coastguard Worker 
11184*5c90c05cSAndroid Build Coastguard Worker       if (ch == '^' && i > 0) {
11185*5c90c05cSAndroid Build Coastguard Worker         ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
11186*5c90c05cSAndroid Build Coastguard Worker                       << "'^' can only appear at the beginning.";
11187*5c90c05cSAndroid Build Coastguard Worker         is_valid = false;
11188*5c90c05cSAndroid Build Coastguard Worker       } else if (ch == '$' && regex[i + 1] != '\0') {
11189*5c90c05cSAndroid Build Coastguard Worker         ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
11190*5c90c05cSAndroid Build Coastguard Worker                       << "'$' can only appear at the end.";
11191*5c90c05cSAndroid Build Coastguard Worker         is_valid = false;
11192*5c90c05cSAndroid Build Coastguard Worker       } else if (IsInSet(ch, "()[]{}|")) {
11193*5c90c05cSAndroid Build Coastguard Worker         ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
11194*5c90c05cSAndroid Build Coastguard Worker                       << "'" << ch << "' is unsupported.";
11195*5c90c05cSAndroid Build Coastguard Worker         is_valid = false;
11196*5c90c05cSAndroid Build Coastguard Worker       } else if (IsRepeat(ch) && !prev_repeatable) {
11197*5c90c05cSAndroid Build Coastguard Worker         ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
11198*5c90c05cSAndroid Build Coastguard Worker                       << "'" << ch << "' can only follow a repeatable token.";
11199*5c90c05cSAndroid Build Coastguard Worker         is_valid = false;
11200*5c90c05cSAndroid Build Coastguard Worker       }
11201*5c90c05cSAndroid Build Coastguard Worker 
11202*5c90c05cSAndroid Build Coastguard Worker       prev_repeatable = !IsInSet(ch, "^$?*+");
11203*5c90c05cSAndroid Build Coastguard Worker     }
11204*5c90c05cSAndroid Build Coastguard Worker   }
11205*5c90c05cSAndroid Build Coastguard Worker 
11206*5c90c05cSAndroid Build Coastguard Worker   return is_valid;
11207*5c90c05cSAndroid Build Coastguard Worker }
11208*5c90c05cSAndroid Build Coastguard Worker 
11209*5c90c05cSAndroid Build Coastguard Worker // Matches a repeated regex atom followed by a valid simple regular
11210*5c90c05cSAndroid Build Coastguard Worker // expression.  The regex atom is defined as c if escaped is false,
11211*5c90c05cSAndroid Build Coastguard Worker // or \c otherwise.  repeat is the repetition meta character (?, *,
11212*5c90c05cSAndroid Build Coastguard Worker // or +).  The behavior is undefined if str contains too many
11213*5c90c05cSAndroid Build Coastguard Worker // characters to be indexable by size_t, in which case the test will
11214*5c90c05cSAndroid Build Coastguard Worker // probably time out anyway.  We are fine with this limitation as
11215*5c90c05cSAndroid Build Coastguard Worker // std::string has it too.
MatchRepetitionAndRegexAtHead(bool escaped,char c,char repeat,const char * regex,const char * str)11216*5c90c05cSAndroid Build Coastguard Worker bool MatchRepetitionAndRegexAtHead(
11217*5c90c05cSAndroid Build Coastguard Worker     bool escaped, char c, char repeat, const char* regex,
11218*5c90c05cSAndroid Build Coastguard Worker     const char* str) {
11219*5c90c05cSAndroid Build Coastguard Worker   const size_t min_count = (repeat == '+') ? 1 : 0;
11220*5c90c05cSAndroid Build Coastguard Worker   const size_t max_count = (repeat == '?') ? 1 :
11221*5c90c05cSAndroid Build Coastguard Worker       static_cast<size_t>(-1) - 1;
11222*5c90c05cSAndroid Build Coastguard Worker   // We cannot call numeric_limits::max() as it conflicts with the
11223*5c90c05cSAndroid Build Coastguard Worker   // max() macro on Windows.
11224*5c90c05cSAndroid Build Coastguard Worker 
11225*5c90c05cSAndroid Build Coastguard Worker   for (size_t i = 0; i <= max_count; ++i) {
11226*5c90c05cSAndroid Build Coastguard Worker     // We know that the atom matches each of the first i characters in str.
11227*5c90c05cSAndroid Build Coastguard Worker     if (i >= min_count && MatchRegexAtHead(regex, str + i)) {
11228*5c90c05cSAndroid Build Coastguard Worker       // We have enough matches at the head, and the tail matches too.
11229*5c90c05cSAndroid Build Coastguard Worker       // Since we only care about *whether* the pattern matches str
11230*5c90c05cSAndroid Build Coastguard Worker       // (as opposed to *how* it matches), there is no need to find a
11231*5c90c05cSAndroid Build Coastguard Worker       // greedy match.
11232*5c90c05cSAndroid Build Coastguard Worker       return true;
11233*5c90c05cSAndroid Build Coastguard Worker     }
11234*5c90c05cSAndroid Build Coastguard Worker     if (str[i] == '\0' || !AtomMatchesChar(escaped, c, str[i]))
11235*5c90c05cSAndroid Build Coastguard Worker       return false;
11236*5c90c05cSAndroid Build Coastguard Worker   }
11237*5c90c05cSAndroid Build Coastguard Worker   return false;
11238*5c90c05cSAndroid Build Coastguard Worker }
11239*5c90c05cSAndroid Build Coastguard Worker 
11240*5c90c05cSAndroid Build Coastguard Worker // Returns true if and only if regex matches a prefix of str. regex must
11241*5c90c05cSAndroid Build Coastguard Worker // be a valid simple regular expression and not start with "^", or the
11242*5c90c05cSAndroid Build Coastguard Worker // result is undefined.
MatchRegexAtHead(const char * regex,const char * str)11243*5c90c05cSAndroid Build Coastguard Worker bool MatchRegexAtHead(const char* regex, const char* str) {
11244*5c90c05cSAndroid Build Coastguard Worker   if (*regex == '\0')  // An empty regex matches a prefix of anything.
11245*5c90c05cSAndroid Build Coastguard Worker     return true;
11246*5c90c05cSAndroid Build Coastguard Worker 
11247*5c90c05cSAndroid Build Coastguard Worker   // "$" only matches the end of a string.  Note that regex being
11248*5c90c05cSAndroid Build Coastguard Worker   // valid guarantees that there's nothing after "$" in it.
11249*5c90c05cSAndroid Build Coastguard Worker   if (*regex == '$')
11250*5c90c05cSAndroid Build Coastguard Worker     return *str == '\0';
11251*5c90c05cSAndroid Build Coastguard Worker 
11252*5c90c05cSAndroid Build Coastguard Worker   // Is the first thing in regex an escape sequence?
11253*5c90c05cSAndroid Build Coastguard Worker   const bool escaped = *regex == '\\';
11254*5c90c05cSAndroid Build Coastguard Worker   if (escaped)
11255*5c90c05cSAndroid Build Coastguard Worker     ++regex;
11256*5c90c05cSAndroid Build Coastguard Worker   if (IsRepeat(regex[1])) {
11257*5c90c05cSAndroid Build Coastguard Worker     // MatchRepetitionAndRegexAtHead() calls MatchRegexAtHead(), so
11258*5c90c05cSAndroid Build Coastguard Worker     // here's an indirect recursion.  It terminates as the regex gets
11259*5c90c05cSAndroid Build Coastguard Worker     // shorter in each recursion.
11260*5c90c05cSAndroid Build Coastguard Worker     return MatchRepetitionAndRegexAtHead(
11261*5c90c05cSAndroid Build Coastguard Worker         escaped, regex[0], regex[1], regex + 2, str);
11262*5c90c05cSAndroid Build Coastguard Worker   } else {
11263*5c90c05cSAndroid Build Coastguard Worker     // regex isn't empty, isn't "$", and doesn't start with a
11264*5c90c05cSAndroid Build Coastguard Worker     // repetition.  We match the first atom of regex with the first
11265*5c90c05cSAndroid Build Coastguard Worker     // character of str and recurse.
11266*5c90c05cSAndroid Build Coastguard Worker     return (*str != '\0') && AtomMatchesChar(escaped, *regex, *str) &&
11267*5c90c05cSAndroid Build Coastguard Worker         MatchRegexAtHead(regex + 1, str + 1);
11268*5c90c05cSAndroid Build Coastguard Worker   }
11269*5c90c05cSAndroid Build Coastguard Worker }
11270*5c90c05cSAndroid Build Coastguard Worker 
11271*5c90c05cSAndroid Build Coastguard Worker // Returns true if and only if regex matches any substring of str.  regex must
11272*5c90c05cSAndroid Build Coastguard Worker // be a valid simple regular expression, or the result is undefined.
11273*5c90c05cSAndroid Build Coastguard Worker //
11274*5c90c05cSAndroid Build Coastguard Worker // The algorithm is recursive, but the recursion depth doesn't exceed
11275*5c90c05cSAndroid Build Coastguard Worker // the regex length, so we won't need to worry about running out of
11276*5c90c05cSAndroid Build Coastguard Worker // stack space normally.  In rare cases the time complexity can be
11277*5c90c05cSAndroid Build Coastguard Worker // exponential with respect to the regex length + the string length,
11278*5c90c05cSAndroid Build Coastguard Worker // but usually it's must faster (often close to linear).
MatchRegexAnywhere(const char * regex,const char * str)11279*5c90c05cSAndroid Build Coastguard Worker bool MatchRegexAnywhere(const char* regex, const char* str) {
11280*5c90c05cSAndroid Build Coastguard Worker   if (regex == nullptr || str == nullptr) return false;
11281*5c90c05cSAndroid Build Coastguard Worker 
11282*5c90c05cSAndroid Build Coastguard Worker   if (*regex == '^')
11283*5c90c05cSAndroid Build Coastguard Worker     return MatchRegexAtHead(regex + 1, str);
11284*5c90c05cSAndroid Build Coastguard Worker 
11285*5c90c05cSAndroid Build Coastguard Worker   // A successful match can be anywhere in str.
11286*5c90c05cSAndroid Build Coastguard Worker   do {
11287*5c90c05cSAndroid Build Coastguard Worker     if (MatchRegexAtHead(regex, str))
11288*5c90c05cSAndroid Build Coastguard Worker       return true;
11289*5c90c05cSAndroid Build Coastguard Worker   } while (*str++ != '\0');
11290*5c90c05cSAndroid Build Coastguard Worker   return false;
11291*5c90c05cSAndroid Build Coastguard Worker }
11292*5c90c05cSAndroid Build Coastguard Worker 
11293*5c90c05cSAndroid Build Coastguard Worker // Implements the RE class.
11294*5c90c05cSAndroid Build Coastguard Worker 
~RE()11295*5c90c05cSAndroid Build Coastguard Worker RE::~RE() {
11296*5c90c05cSAndroid Build Coastguard Worker   free(const_cast<char*>(pattern_));
11297*5c90c05cSAndroid Build Coastguard Worker   free(const_cast<char*>(full_pattern_));
11298*5c90c05cSAndroid Build Coastguard Worker }
11299*5c90c05cSAndroid Build Coastguard Worker 
11300*5c90c05cSAndroid Build Coastguard Worker // Returns true if and only if regular expression re matches the entire str.
FullMatch(const char * str,const RE & re)11301*5c90c05cSAndroid Build Coastguard Worker bool RE::FullMatch(const char* str, const RE& re) {
11302*5c90c05cSAndroid Build Coastguard Worker   return re.is_valid_ && MatchRegexAnywhere(re.full_pattern_, str);
11303*5c90c05cSAndroid Build Coastguard Worker }
11304*5c90c05cSAndroid Build Coastguard Worker 
11305*5c90c05cSAndroid Build Coastguard Worker // Returns true if and only if regular expression re matches a substring of
11306*5c90c05cSAndroid Build Coastguard Worker // str (including str itself).
PartialMatch(const char * str,const RE & re)11307*5c90c05cSAndroid Build Coastguard Worker bool RE::PartialMatch(const char* str, const RE& re) {
11308*5c90c05cSAndroid Build Coastguard Worker   return re.is_valid_ && MatchRegexAnywhere(re.pattern_, str);
11309*5c90c05cSAndroid Build Coastguard Worker }
11310*5c90c05cSAndroid Build Coastguard Worker 
11311*5c90c05cSAndroid Build Coastguard Worker // Initializes an RE from its string representation.
Init(const char * regex)11312*5c90c05cSAndroid Build Coastguard Worker void RE::Init(const char* regex) {
11313*5c90c05cSAndroid Build Coastguard Worker   pattern_ = full_pattern_ = nullptr;
11314*5c90c05cSAndroid Build Coastguard Worker   if (regex != nullptr) {
11315*5c90c05cSAndroid Build Coastguard Worker     pattern_ = posix::StrDup(regex);
11316*5c90c05cSAndroid Build Coastguard Worker   }
11317*5c90c05cSAndroid Build Coastguard Worker 
11318*5c90c05cSAndroid Build Coastguard Worker   is_valid_ = ValidateRegex(regex);
11319*5c90c05cSAndroid Build Coastguard Worker   if (!is_valid_) {
11320*5c90c05cSAndroid Build Coastguard Worker     // No need to calculate the full pattern when the regex is invalid.
11321*5c90c05cSAndroid Build Coastguard Worker     return;
11322*5c90c05cSAndroid Build Coastguard Worker   }
11323*5c90c05cSAndroid Build Coastguard Worker 
11324*5c90c05cSAndroid Build Coastguard Worker   const size_t len = strlen(regex);
11325*5c90c05cSAndroid Build Coastguard Worker   // Reserves enough bytes to hold the regular expression used for a
11326*5c90c05cSAndroid Build Coastguard Worker   // full match: we need space to prepend a '^', append a '$', and
11327*5c90c05cSAndroid Build Coastguard Worker   // terminate the string with '\0'.
11328*5c90c05cSAndroid Build Coastguard Worker   char* buffer = static_cast<char*>(malloc(len + 3));
11329*5c90c05cSAndroid Build Coastguard Worker   full_pattern_ = buffer;
11330*5c90c05cSAndroid Build Coastguard Worker 
11331*5c90c05cSAndroid Build Coastguard Worker   if (*regex != '^')
11332*5c90c05cSAndroid Build Coastguard Worker     *buffer++ = '^';  // Makes sure full_pattern_ starts with '^'.
11333*5c90c05cSAndroid Build Coastguard Worker 
11334*5c90c05cSAndroid Build Coastguard Worker   // We don't use snprintf or strncpy, as they trigger a warning when
11335*5c90c05cSAndroid Build Coastguard Worker   // compiled with VC++ 8.0.
11336*5c90c05cSAndroid Build Coastguard Worker   memcpy(buffer, regex, len);
11337*5c90c05cSAndroid Build Coastguard Worker   buffer += len;
11338*5c90c05cSAndroid Build Coastguard Worker 
11339*5c90c05cSAndroid Build Coastguard Worker   if (len == 0 || regex[len - 1] != '$')
11340*5c90c05cSAndroid Build Coastguard Worker     *buffer++ = '$';  // Makes sure full_pattern_ ends with '$'.
11341*5c90c05cSAndroid Build Coastguard Worker 
11342*5c90c05cSAndroid Build Coastguard Worker   *buffer = '\0';
11343*5c90c05cSAndroid Build Coastguard Worker }
11344*5c90c05cSAndroid Build Coastguard Worker 
11345*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_USES_POSIX_RE
11346*5c90c05cSAndroid Build Coastguard Worker 
11347*5c90c05cSAndroid Build Coastguard Worker const char kUnknownFile[] = "unknown file";
11348*5c90c05cSAndroid Build Coastguard Worker 
11349*5c90c05cSAndroid Build Coastguard Worker // Formats a source file path and a line number as they would appear
11350*5c90c05cSAndroid Build Coastguard Worker // in an error message from the compiler used to compile this code.
FormatFileLocation(const char * file,int line)11351*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ ::std::string FormatFileLocation(const char* file, int line) {
11352*5c90c05cSAndroid Build Coastguard Worker   const std::string file_name(file == nullptr ? kUnknownFile : file);
11353*5c90c05cSAndroid Build Coastguard Worker 
11354*5c90c05cSAndroid Build Coastguard Worker   if (line < 0) {
11355*5c90c05cSAndroid Build Coastguard Worker     return file_name + ":";
11356*5c90c05cSAndroid Build Coastguard Worker   }
11357*5c90c05cSAndroid Build Coastguard Worker #ifdef _MSC_VER
11358*5c90c05cSAndroid Build Coastguard Worker   return file_name + "(" + StreamableToString(line) + "):";
11359*5c90c05cSAndroid Build Coastguard Worker #else
11360*5c90c05cSAndroid Build Coastguard Worker   return file_name + ":" + StreamableToString(line) + ":";
11361*5c90c05cSAndroid Build Coastguard Worker #endif  // _MSC_VER
11362*5c90c05cSAndroid Build Coastguard Worker }
11363*5c90c05cSAndroid Build Coastguard Worker 
11364*5c90c05cSAndroid Build Coastguard Worker // Formats a file location for compiler-independent XML output.
11365*5c90c05cSAndroid Build Coastguard Worker // Although this function is not platform dependent, we put it next to
11366*5c90c05cSAndroid Build Coastguard Worker // FormatFileLocation in order to contrast the two functions.
11367*5c90c05cSAndroid Build Coastguard Worker // Note that FormatCompilerIndependentFileLocation() does NOT append colon
11368*5c90c05cSAndroid Build Coastguard Worker // to the file location it produces, unlike FormatFileLocation().
FormatCompilerIndependentFileLocation(const char * file,int line)11369*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(
11370*5c90c05cSAndroid Build Coastguard Worker     const char* file, int line) {
11371*5c90c05cSAndroid Build Coastguard Worker   const std::string file_name(file == nullptr ? kUnknownFile : file);
11372*5c90c05cSAndroid Build Coastguard Worker 
11373*5c90c05cSAndroid Build Coastguard Worker   if (line < 0)
11374*5c90c05cSAndroid Build Coastguard Worker     return file_name;
11375*5c90c05cSAndroid Build Coastguard Worker   else
11376*5c90c05cSAndroid Build Coastguard Worker     return file_name + ":" + StreamableToString(line);
11377*5c90c05cSAndroid Build Coastguard Worker }
11378*5c90c05cSAndroid Build Coastguard Worker 
GTestLog(GTestLogSeverity severity,const char * file,int line)11379*5c90c05cSAndroid Build Coastguard Worker GTestLog::GTestLog(GTestLogSeverity severity, const char* file, int line)
11380*5c90c05cSAndroid Build Coastguard Worker     : severity_(severity) {
11381*5c90c05cSAndroid Build Coastguard Worker   const char* const marker =
11382*5c90c05cSAndroid Build Coastguard Worker       severity == GTEST_INFO ?    "[  INFO ]" :
11383*5c90c05cSAndroid Build Coastguard Worker       severity == GTEST_WARNING ? "[WARNING]" :
11384*5c90c05cSAndroid Build Coastguard Worker       severity == GTEST_ERROR ?   "[ ERROR ]" : "[ FATAL ]";
11385*5c90c05cSAndroid Build Coastguard Worker   GetStream() << ::std::endl << marker << " "
11386*5c90c05cSAndroid Build Coastguard Worker               << FormatFileLocation(file, line).c_str() << ": ";
11387*5c90c05cSAndroid Build Coastguard Worker }
11388*5c90c05cSAndroid Build Coastguard Worker 
11389*5c90c05cSAndroid Build Coastguard Worker // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.
~GTestLog()11390*5c90c05cSAndroid Build Coastguard Worker GTestLog::~GTestLog() {
11391*5c90c05cSAndroid Build Coastguard Worker   GetStream() << ::std::endl;
11392*5c90c05cSAndroid Build Coastguard Worker   if (severity_ == GTEST_FATAL) {
11393*5c90c05cSAndroid Build Coastguard Worker     fflush(stderr);
11394*5c90c05cSAndroid Build Coastguard Worker     posix::Abort();
11395*5c90c05cSAndroid Build Coastguard Worker   }
11396*5c90c05cSAndroid Build Coastguard Worker }
11397*5c90c05cSAndroid Build Coastguard Worker 
11398*5c90c05cSAndroid Build Coastguard Worker // Disable Microsoft deprecation warnings for POSIX functions called from
11399*5c90c05cSAndroid Build Coastguard Worker // this class (creat, dup, dup2, and close)
11400*5c90c05cSAndroid Build Coastguard Worker GTEST_DISABLE_MSC_DEPRECATED_PUSH_()
11401*5c90c05cSAndroid Build Coastguard Worker 
11402*5c90c05cSAndroid Build Coastguard Worker #if GTEST_HAS_STREAM_REDIRECTION
11403*5c90c05cSAndroid Build Coastguard Worker 
11404*5c90c05cSAndroid Build Coastguard Worker // Object that captures an output stream (stdout/stderr).
11405*5c90c05cSAndroid Build Coastguard Worker class CapturedStream {
11406*5c90c05cSAndroid Build Coastguard Worker  public:
11407*5c90c05cSAndroid Build Coastguard Worker   // The ctor redirects the stream to a temporary file.
CapturedStream(int fd)11408*5c90c05cSAndroid Build Coastguard Worker   explicit CapturedStream(int fd) : fd_(fd), uncaptured_fd_(dup(fd)) {
11409*5c90c05cSAndroid Build Coastguard Worker # if GTEST_OS_WINDOWS
11410*5c90c05cSAndroid Build Coastguard Worker     char temp_dir_path[MAX_PATH + 1] = { '\0' };  // NOLINT
11411*5c90c05cSAndroid Build Coastguard Worker     char temp_file_path[MAX_PATH + 1] = { '\0' };  // NOLINT
11412*5c90c05cSAndroid Build Coastguard Worker 
11413*5c90c05cSAndroid Build Coastguard Worker     ::GetTempPathA(sizeof(temp_dir_path), temp_dir_path);
11414*5c90c05cSAndroid Build Coastguard Worker     const UINT success = ::GetTempFileNameA(temp_dir_path,
11415*5c90c05cSAndroid Build Coastguard Worker                                             "gtest_redir",
11416*5c90c05cSAndroid Build Coastguard Worker                                             0,  // Generate unique file name.
11417*5c90c05cSAndroid Build Coastguard Worker                                             temp_file_path);
11418*5c90c05cSAndroid Build Coastguard Worker     GTEST_CHECK_(success != 0)
11419*5c90c05cSAndroid Build Coastguard Worker         << "Unable to create a temporary file in " << temp_dir_path;
11420*5c90c05cSAndroid Build Coastguard Worker     const int captured_fd = creat(temp_file_path, _S_IREAD | _S_IWRITE);
11421*5c90c05cSAndroid Build Coastguard Worker     GTEST_CHECK_(captured_fd != -1) << "Unable to open temporary file "
11422*5c90c05cSAndroid Build Coastguard Worker                                     << temp_file_path;
11423*5c90c05cSAndroid Build Coastguard Worker     filename_ = temp_file_path;
11424*5c90c05cSAndroid Build Coastguard Worker # else
11425*5c90c05cSAndroid Build Coastguard Worker     // There's no guarantee that a test has write access to the current
11426*5c90c05cSAndroid Build Coastguard Worker     // directory, so we create the temporary file in the /tmp directory
11427*5c90c05cSAndroid Build Coastguard Worker     // instead. We use /tmp on most systems, and /sdcard on Android.
11428*5c90c05cSAndroid Build Coastguard Worker     // That's because Android doesn't have /tmp.
11429*5c90c05cSAndroid Build Coastguard Worker #  if GTEST_OS_LINUX_ANDROID
11430*5c90c05cSAndroid Build Coastguard Worker     // Note: Android applications are expected to call the framework's
11431*5c90c05cSAndroid Build Coastguard Worker     // Context.getExternalStorageDirectory() method through JNI to get
11432*5c90c05cSAndroid Build Coastguard Worker     // the location of the world-writable SD Card directory. However,
11433*5c90c05cSAndroid Build Coastguard Worker     // this requires a Context handle, which cannot be retrieved
11434*5c90c05cSAndroid Build Coastguard Worker     // globally from native code. Doing so also precludes running the
11435*5c90c05cSAndroid Build Coastguard Worker     // code as part of a regular standalone executable, which doesn't
11436*5c90c05cSAndroid Build Coastguard Worker     // run in a Dalvik process (e.g. when running it through 'adb shell').
11437*5c90c05cSAndroid Build Coastguard Worker     //
11438*5c90c05cSAndroid Build Coastguard Worker     // The location /data/local/tmp is directly accessible from native code.
11439*5c90c05cSAndroid Build Coastguard Worker     // '/sdcard' and other variants cannot be relied on, as they are not
11440*5c90c05cSAndroid Build Coastguard Worker     // guaranteed to be mounted, or may have a delay in mounting.
11441*5c90c05cSAndroid Build Coastguard Worker     char name_template[] = "/data/local/tmp/gtest_captured_stream.XXXXXX";
11442*5c90c05cSAndroid Build Coastguard Worker #  else
11443*5c90c05cSAndroid Build Coastguard Worker     char name_template[] = "/tmp/captured_stream.XXXXXX";
11444*5c90c05cSAndroid Build Coastguard Worker #  endif  // GTEST_OS_LINUX_ANDROID
11445*5c90c05cSAndroid Build Coastguard Worker     const int captured_fd = mkstemp(name_template);
11446*5c90c05cSAndroid Build Coastguard Worker     if (captured_fd == -1) {
11447*5c90c05cSAndroid Build Coastguard Worker       GTEST_LOG_(WARNING)
11448*5c90c05cSAndroid Build Coastguard Worker           << "Failed to create tmp file " << name_template
11449*5c90c05cSAndroid Build Coastguard Worker           << " for test; does the test have access to the /tmp directory?";
11450*5c90c05cSAndroid Build Coastguard Worker     }
11451*5c90c05cSAndroid Build Coastguard Worker     filename_ = name_template;
11452*5c90c05cSAndroid Build Coastguard Worker # endif  // GTEST_OS_WINDOWS
11453*5c90c05cSAndroid Build Coastguard Worker     fflush(nullptr);
11454*5c90c05cSAndroid Build Coastguard Worker     dup2(captured_fd, fd_);
11455*5c90c05cSAndroid Build Coastguard Worker     close(captured_fd);
11456*5c90c05cSAndroid Build Coastguard Worker   }
11457*5c90c05cSAndroid Build Coastguard Worker 
~CapturedStream()11458*5c90c05cSAndroid Build Coastguard Worker   ~CapturedStream() {
11459*5c90c05cSAndroid Build Coastguard Worker     remove(filename_.c_str());
11460*5c90c05cSAndroid Build Coastguard Worker   }
11461*5c90c05cSAndroid Build Coastguard Worker 
GetCapturedString()11462*5c90c05cSAndroid Build Coastguard Worker   std::string GetCapturedString() {
11463*5c90c05cSAndroid Build Coastguard Worker     if (uncaptured_fd_ != -1) {
11464*5c90c05cSAndroid Build Coastguard Worker       // Restores the original stream.
11465*5c90c05cSAndroid Build Coastguard Worker       fflush(nullptr);
11466*5c90c05cSAndroid Build Coastguard Worker       dup2(uncaptured_fd_, fd_);
11467*5c90c05cSAndroid Build Coastguard Worker       close(uncaptured_fd_);
11468*5c90c05cSAndroid Build Coastguard Worker       uncaptured_fd_ = -1;
11469*5c90c05cSAndroid Build Coastguard Worker     }
11470*5c90c05cSAndroid Build Coastguard Worker 
11471*5c90c05cSAndroid Build Coastguard Worker     FILE* const file = posix::FOpen(filename_.c_str(), "r");
11472*5c90c05cSAndroid Build Coastguard Worker     if (file == nullptr) {
11473*5c90c05cSAndroid Build Coastguard Worker       GTEST_LOG_(FATAL) << "Failed to open tmp file " << filename_
11474*5c90c05cSAndroid Build Coastguard Worker                         << " for capturing stream.";
11475*5c90c05cSAndroid Build Coastguard Worker     }
11476*5c90c05cSAndroid Build Coastguard Worker     const std::string content = ReadEntireFile(file);
11477*5c90c05cSAndroid Build Coastguard Worker     posix::FClose(file);
11478*5c90c05cSAndroid Build Coastguard Worker     return content;
11479*5c90c05cSAndroid Build Coastguard Worker   }
11480*5c90c05cSAndroid Build Coastguard Worker 
11481*5c90c05cSAndroid Build Coastguard Worker  private:
11482*5c90c05cSAndroid Build Coastguard Worker   const int fd_;  // A stream to capture.
11483*5c90c05cSAndroid Build Coastguard Worker   int uncaptured_fd_;
11484*5c90c05cSAndroid Build Coastguard Worker   // Name of the temporary file holding the stderr output.
11485*5c90c05cSAndroid Build Coastguard Worker   ::std::string filename_;
11486*5c90c05cSAndroid Build Coastguard Worker 
11487*5c90c05cSAndroid Build Coastguard Worker   GTEST_DISALLOW_COPY_AND_ASSIGN_(CapturedStream);
11488*5c90c05cSAndroid Build Coastguard Worker };
11489*5c90c05cSAndroid Build Coastguard Worker 
11490*5c90c05cSAndroid Build Coastguard Worker GTEST_DISABLE_MSC_DEPRECATED_POP_()
11491*5c90c05cSAndroid Build Coastguard Worker 
11492*5c90c05cSAndroid Build Coastguard Worker static CapturedStream* g_captured_stderr = nullptr;
11493*5c90c05cSAndroid Build Coastguard Worker static CapturedStream* g_captured_stdout = nullptr;
11494*5c90c05cSAndroid Build Coastguard Worker 
11495*5c90c05cSAndroid Build Coastguard Worker // Starts capturing an output stream (stdout/stderr).
CaptureStream(int fd,const char * stream_name,CapturedStream ** stream)11496*5c90c05cSAndroid Build Coastguard Worker static void CaptureStream(int fd, const char* stream_name,
11497*5c90c05cSAndroid Build Coastguard Worker                           CapturedStream** stream) {
11498*5c90c05cSAndroid Build Coastguard Worker   if (*stream != nullptr) {
11499*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOG_(FATAL) << "Only one " << stream_name
11500*5c90c05cSAndroid Build Coastguard Worker                       << " capturer can exist at a time.";
11501*5c90c05cSAndroid Build Coastguard Worker   }
11502*5c90c05cSAndroid Build Coastguard Worker   *stream = new CapturedStream(fd);
11503*5c90c05cSAndroid Build Coastguard Worker }
11504*5c90c05cSAndroid Build Coastguard Worker 
11505*5c90c05cSAndroid Build Coastguard Worker // Stops capturing the output stream and returns the captured string.
GetCapturedStream(CapturedStream ** captured_stream)11506*5c90c05cSAndroid Build Coastguard Worker static std::string GetCapturedStream(CapturedStream** captured_stream) {
11507*5c90c05cSAndroid Build Coastguard Worker   const std::string content = (*captured_stream)->GetCapturedString();
11508*5c90c05cSAndroid Build Coastguard Worker 
11509*5c90c05cSAndroid Build Coastguard Worker   delete *captured_stream;
11510*5c90c05cSAndroid Build Coastguard Worker   *captured_stream = nullptr;
11511*5c90c05cSAndroid Build Coastguard Worker 
11512*5c90c05cSAndroid Build Coastguard Worker   return content;
11513*5c90c05cSAndroid Build Coastguard Worker }
11514*5c90c05cSAndroid Build Coastguard Worker 
11515*5c90c05cSAndroid Build Coastguard Worker // Starts capturing stdout.
CaptureStdout()11516*5c90c05cSAndroid Build Coastguard Worker void CaptureStdout() {
11517*5c90c05cSAndroid Build Coastguard Worker   CaptureStream(kStdOutFileno, "stdout", &g_captured_stdout);
11518*5c90c05cSAndroid Build Coastguard Worker }
11519*5c90c05cSAndroid Build Coastguard Worker 
11520*5c90c05cSAndroid Build Coastguard Worker // Starts capturing stderr.
CaptureStderr()11521*5c90c05cSAndroid Build Coastguard Worker void CaptureStderr() {
11522*5c90c05cSAndroid Build Coastguard Worker   CaptureStream(kStdErrFileno, "stderr", &g_captured_stderr);
11523*5c90c05cSAndroid Build Coastguard Worker }
11524*5c90c05cSAndroid Build Coastguard Worker 
11525*5c90c05cSAndroid Build Coastguard Worker // Stops capturing stdout and returns the captured string.
GetCapturedStdout()11526*5c90c05cSAndroid Build Coastguard Worker std::string GetCapturedStdout() {
11527*5c90c05cSAndroid Build Coastguard Worker   return GetCapturedStream(&g_captured_stdout);
11528*5c90c05cSAndroid Build Coastguard Worker }
11529*5c90c05cSAndroid Build Coastguard Worker 
11530*5c90c05cSAndroid Build Coastguard Worker // Stops capturing stderr and returns the captured string.
GetCapturedStderr()11531*5c90c05cSAndroid Build Coastguard Worker std::string GetCapturedStderr() {
11532*5c90c05cSAndroid Build Coastguard Worker   return GetCapturedStream(&g_captured_stderr);
11533*5c90c05cSAndroid Build Coastguard Worker }
11534*5c90c05cSAndroid Build Coastguard Worker 
11535*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_HAS_STREAM_REDIRECTION
11536*5c90c05cSAndroid Build Coastguard Worker 
11537*5c90c05cSAndroid Build Coastguard Worker 
11538*5c90c05cSAndroid Build Coastguard Worker 
11539*5c90c05cSAndroid Build Coastguard Worker 
11540*5c90c05cSAndroid Build Coastguard Worker 
GetFileSize(FILE * file)11541*5c90c05cSAndroid Build Coastguard Worker size_t GetFileSize(FILE* file) {
11542*5c90c05cSAndroid Build Coastguard Worker   fseek(file, 0, SEEK_END);
11543*5c90c05cSAndroid Build Coastguard Worker   return static_cast<size_t>(ftell(file));
11544*5c90c05cSAndroid Build Coastguard Worker }
11545*5c90c05cSAndroid Build Coastguard Worker 
ReadEntireFile(FILE * file)11546*5c90c05cSAndroid Build Coastguard Worker std::string ReadEntireFile(FILE* file) {
11547*5c90c05cSAndroid Build Coastguard Worker   const size_t file_size = GetFileSize(file);
11548*5c90c05cSAndroid Build Coastguard Worker   char* const buffer = new char[file_size];
11549*5c90c05cSAndroid Build Coastguard Worker 
11550*5c90c05cSAndroid Build Coastguard Worker   size_t bytes_last_read = 0;  // # of bytes read in the last fread()
11551*5c90c05cSAndroid Build Coastguard Worker   size_t bytes_read = 0;       // # of bytes read so far
11552*5c90c05cSAndroid Build Coastguard Worker 
11553*5c90c05cSAndroid Build Coastguard Worker   fseek(file, 0, SEEK_SET);
11554*5c90c05cSAndroid Build Coastguard Worker 
11555*5c90c05cSAndroid Build Coastguard Worker   // Keeps reading the file until we cannot read further or the
11556*5c90c05cSAndroid Build Coastguard Worker   // pre-determined file size is reached.
11557*5c90c05cSAndroid Build Coastguard Worker   do {
11558*5c90c05cSAndroid Build Coastguard Worker     bytes_last_read = fread(buffer+bytes_read, 1, file_size-bytes_read, file);
11559*5c90c05cSAndroid Build Coastguard Worker     bytes_read += bytes_last_read;
11560*5c90c05cSAndroid Build Coastguard Worker   } while (bytes_last_read > 0 && bytes_read < file_size);
11561*5c90c05cSAndroid Build Coastguard Worker 
11562*5c90c05cSAndroid Build Coastguard Worker   const std::string content(buffer, bytes_read);
11563*5c90c05cSAndroid Build Coastguard Worker   delete[] buffer;
11564*5c90c05cSAndroid Build Coastguard Worker 
11565*5c90c05cSAndroid Build Coastguard Worker   return content;
11566*5c90c05cSAndroid Build Coastguard Worker }
11567*5c90c05cSAndroid Build Coastguard Worker 
11568*5c90c05cSAndroid Build Coastguard Worker #if GTEST_HAS_DEATH_TEST
11569*5c90c05cSAndroid Build Coastguard Worker static const std::vector<std::string>* g_injected_test_argvs =
11570*5c90c05cSAndroid Build Coastguard Worker     nullptr;  // Owned.
11571*5c90c05cSAndroid Build Coastguard Worker 
GetInjectableArgvs()11572*5c90c05cSAndroid Build Coastguard Worker std::vector<std::string> GetInjectableArgvs() {
11573*5c90c05cSAndroid Build Coastguard Worker   if (g_injected_test_argvs != nullptr) {
11574*5c90c05cSAndroid Build Coastguard Worker     return *g_injected_test_argvs;
11575*5c90c05cSAndroid Build Coastguard Worker   }
11576*5c90c05cSAndroid Build Coastguard Worker   return GetArgvs();
11577*5c90c05cSAndroid Build Coastguard Worker }
11578*5c90c05cSAndroid Build Coastguard Worker 
SetInjectableArgvs(const std::vector<std::string> * new_argvs)11579*5c90c05cSAndroid Build Coastguard Worker void SetInjectableArgvs(const std::vector<std::string>* new_argvs) {
11580*5c90c05cSAndroid Build Coastguard Worker   if (g_injected_test_argvs != new_argvs) delete g_injected_test_argvs;
11581*5c90c05cSAndroid Build Coastguard Worker   g_injected_test_argvs = new_argvs;
11582*5c90c05cSAndroid Build Coastguard Worker }
11583*5c90c05cSAndroid Build Coastguard Worker 
SetInjectableArgvs(const std::vector<std::string> & new_argvs)11584*5c90c05cSAndroid Build Coastguard Worker void SetInjectableArgvs(const std::vector<std::string>& new_argvs) {
11585*5c90c05cSAndroid Build Coastguard Worker   SetInjectableArgvs(
11586*5c90c05cSAndroid Build Coastguard Worker       new std::vector<std::string>(new_argvs.begin(), new_argvs.end()));
11587*5c90c05cSAndroid Build Coastguard Worker }
11588*5c90c05cSAndroid Build Coastguard Worker 
ClearInjectableArgvs()11589*5c90c05cSAndroid Build Coastguard Worker void ClearInjectableArgvs() {
11590*5c90c05cSAndroid Build Coastguard Worker   delete g_injected_test_argvs;
11591*5c90c05cSAndroid Build Coastguard Worker   g_injected_test_argvs = nullptr;
11592*5c90c05cSAndroid Build Coastguard Worker }
11593*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_HAS_DEATH_TEST
11594*5c90c05cSAndroid Build Coastguard Worker 
11595*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_WINDOWS_MOBILE
11596*5c90c05cSAndroid Build Coastguard Worker namespace posix {
Abort()11597*5c90c05cSAndroid Build Coastguard Worker void Abort() {
11598*5c90c05cSAndroid Build Coastguard Worker   DebugBreak();
11599*5c90c05cSAndroid Build Coastguard Worker   TerminateProcess(GetCurrentProcess(), 1);
11600*5c90c05cSAndroid Build Coastguard Worker }
11601*5c90c05cSAndroid Build Coastguard Worker }  // namespace posix
11602*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_OS_WINDOWS_MOBILE
11603*5c90c05cSAndroid Build Coastguard Worker 
11604*5c90c05cSAndroid Build Coastguard Worker // Returns the name of the environment variable corresponding to the
11605*5c90c05cSAndroid Build Coastguard Worker // given flag.  For example, FlagToEnvVar("foo") will return
11606*5c90c05cSAndroid Build Coastguard Worker // "GTEST_FOO" in the open-source version.
FlagToEnvVar(const char * flag)11607*5c90c05cSAndroid Build Coastguard Worker static std::string FlagToEnvVar(const char* flag) {
11608*5c90c05cSAndroid Build Coastguard Worker   const std::string full_flag =
11609*5c90c05cSAndroid Build Coastguard Worker       (Message() << GTEST_FLAG_PREFIX_ << flag).GetString();
11610*5c90c05cSAndroid Build Coastguard Worker 
11611*5c90c05cSAndroid Build Coastguard Worker   Message env_var;
11612*5c90c05cSAndroid Build Coastguard Worker   for (size_t i = 0; i != full_flag.length(); i++) {
11613*5c90c05cSAndroid Build Coastguard Worker     env_var << ToUpper(full_flag.c_str()[i]);
11614*5c90c05cSAndroid Build Coastguard Worker   }
11615*5c90c05cSAndroid Build Coastguard Worker 
11616*5c90c05cSAndroid Build Coastguard Worker   return env_var.GetString();
11617*5c90c05cSAndroid Build Coastguard Worker }
11618*5c90c05cSAndroid Build Coastguard Worker 
11619*5c90c05cSAndroid Build Coastguard Worker // Parses 'str' for a 32-bit signed integer.  If successful, writes
11620*5c90c05cSAndroid Build Coastguard Worker // the result to *value and returns true; otherwise leaves *value
11621*5c90c05cSAndroid Build Coastguard Worker // unchanged and returns false.
ParseInt32(const Message & src_text,const char * str,int32_t * value)11622*5c90c05cSAndroid Build Coastguard Worker bool ParseInt32(const Message& src_text, const char* str, int32_t* value) {
11623*5c90c05cSAndroid Build Coastguard Worker   // Parses the environment variable as a decimal integer.
11624*5c90c05cSAndroid Build Coastguard Worker   char* end = nullptr;
11625*5c90c05cSAndroid Build Coastguard Worker   const long long_value = strtol(str, &end, 10);  // NOLINT
11626*5c90c05cSAndroid Build Coastguard Worker 
11627*5c90c05cSAndroid Build Coastguard Worker   // Has strtol() consumed all characters in the string?
11628*5c90c05cSAndroid Build Coastguard Worker   if (*end != '\0') {
11629*5c90c05cSAndroid Build Coastguard Worker     // No - an invalid character was encountered.
11630*5c90c05cSAndroid Build Coastguard Worker     Message msg;
11631*5c90c05cSAndroid Build Coastguard Worker     msg << "WARNING: " << src_text
11632*5c90c05cSAndroid Build Coastguard Worker         << " is expected to be a 32-bit integer, but actually"
11633*5c90c05cSAndroid Build Coastguard Worker         << " has value \"" << str << "\".\n";
11634*5c90c05cSAndroid Build Coastguard Worker     printf("%s", msg.GetString().c_str());
11635*5c90c05cSAndroid Build Coastguard Worker     fflush(stdout);
11636*5c90c05cSAndroid Build Coastguard Worker     return false;
11637*5c90c05cSAndroid Build Coastguard Worker   }
11638*5c90c05cSAndroid Build Coastguard Worker 
11639*5c90c05cSAndroid Build Coastguard Worker   // Is the parsed value in the range of an int32_t?
11640*5c90c05cSAndroid Build Coastguard Worker   const auto result = static_cast<int32_t>(long_value);
11641*5c90c05cSAndroid Build Coastguard Worker   if (long_value == LONG_MAX || long_value == LONG_MIN ||
11642*5c90c05cSAndroid Build Coastguard Worker       // The parsed value overflows as a long.  (strtol() returns
11643*5c90c05cSAndroid Build Coastguard Worker       // LONG_MAX or LONG_MIN when the input overflows.)
11644*5c90c05cSAndroid Build Coastguard Worker       result != long_value
11645*5c90c05cSAndroid Build Coastguard Worker       // The parsed value overflows as an int32_t.
11646*5c90c05cSAndroid Build Coastguard Worker       ) {
11647*5c90c05cSAndroid Build Coastguard Worker     Message msg;
11648*5c90c05cSAndroid Build Coastguard Worker     msg << "WARNING: " << src_text
11649*5c90c05cSAndroid Build Coastguard Worker         << " is expected to be a 32-bit integer, but actually"
11650*5c90c05cSAndroid Build Coastguard Worker         << " has value " << str << ", which overflows.\n";
11651*5c90c05cSAndroid Build Coastguard Worker     printf("%s", msg.GetString().c_str());
11652*5c90c05cSAndroid Build Coastguard Worker     fflush(stdout);
11653*5c90c05cSAndroid Build Coastguard Worker     return false;
11654*5c90c05cSAndroid Build Coastguard Worker   }
11655*5c90c05cSAndroid Build Coastguard Worker 
11656*5c90c05cSAndroid Build Coastguard Worker   *value = result;
11657*5c90c05cSAndroid Build Coastguard Worker   return true;
11658*5c90c05cSAndroid Build Coastguard Worker }
11659*5c90c05cSAndroid Build Coastguard Worker 
11660*5c90c05cSAndroid Build Coastguard Worker // Reads and returns the Boolean environment variable corresponding to
11661*5c90c05cSAndroid Build Coastguard Worker // the given flag; if it's not set, returns default_value.
11662*5c90c05cSAndroid Build Coastguard Worker //
11663*5c90c05cSAndroid Build Coastguard Worker // The value is considered true if and only if it's not "0".
BoolFromGTestEnv(const char * flag,bool default_value)11664*5c90c05cSAndroid Build Coastguard Worker bool BoolFromGTestEnv(const char* flag, bool default_value) {
11665*5c90c05cSAndroid Build Coastguard Worker #if defined(GTEST_GET_BOOL_FROM_ENV_)
11666*5c90c05cSAndroid Build Coastguard Worker   return GTEST_GET_BOOL_FROM_ENV_(flag, default_value);
11667*5c90c05cSAndroid Build Coastguard Worker #else
11668*5c90c05cSAndroid Build Coastguard Worker   const std::string env_var = FlagToEnvVar(flag);
11669*5c90c05cSAndroid Build Coastguard Worker   const char* const string_value = posix::GetEnv(env_var.c_str());
11670*5c90c05cSAndroid Build Coastguard Worker   return string_value == nullptr ? default_value
11671*5c90c05cSAndroid Build Coastguard Worker                                  : strcmp(string_value, "0") != 0;
11672*5c90c05cSAndroid Build Coastguard Worker #endif  // defined(GTEST_GET_BOOL_FROM_ENV_)
11673*5c90c05cSAndroid Build Coastguard Worker }
11674*5c90c05cSAndroid Build Coastguard Worker 
11675*5c90c05cSAndroid Build Coastguard Worker // Reads and returns a 32-bit integer stored in the environment
11676*5c90c05cSAndroid Build Coastguard Worker // variable corresponding to the given flag; if it isn't set or
11677*5c90c05cSAndroid Build Coastguard Worker // doesn't represent a valid 32-bit integer, returns default_value.
Int32FromGTestEnv(const char * flag,int32_t default_value)11678*5c90c05cSAndroid Build Coastguard Worker int32_t Int32FromGTestEnv(const char* flag, int32_t default_value) {
11679*5c90c05cSAndroid Build Coastguard Worker #if defined(GTEST_GET_INT32_FROM_ENV_)
11680*5c90c05cSAndroid Build Coastguard Worker   return GTEST_GET_INT32_FROM_ENV_(flag, default_value);
11681*5c90c05cSAndroid Build Coastguard Worker #else
11682*5c90c05cSAndroid Build Coastguard Worker   const std::string env_var = FlagToEnvVar(flag);
11683*5c90c05cSAndroid Build Coastguard Worker   const char* const string_value = posix::GetEnv(env_var.c_str());
11684*5c90c05cSAndroid Build Coastguard Worker   if (string_value == nullptr) {
11685*5c90c05cSAndroid Build Coastguard Worker     // The environment variable is not set.
11686*5c90c05cSAndroid Build Coastguard Worker     return default_value;
11687*5c90c05cSAndroid Build Coastguard Worker   }
11688*5c90c05cSAndroid Build Coastguard Worker 
11689*5c90c05cSAndroid Build Coastguard Worker   int32_t result = default_value;
11690*5c90c05cSAndroid Build Coastguard Worker   if (!ParseInt32(Message() << "Environment variable " << env_var,
11691*5c90c05cSAndroid Build Coastguard Worker                   string_value, &result)) {
11692*5c90c05cSAndroid Build Coastguard Worker     printf("The default value %s is used.\n",
11693*5c90c05cSAndroid Build Coastguard Worker            (Message() << default_value).GetString().c_str());
11694*5c90c05cSAndroid Build Coastguard Worker     fflush(stdout);
11695*5c90c05cSAndroid Build Coastguard Worker     return default_value;
11696*5c90c05cSAndroid Build Coastguard Worker   }
11697*5c90c05cSAndroid Build Coastguard Worker 
11698*5c90c05cSAndroid Build Coastguard Worker   return result;
11699*5c90c05cSAndroid Build Coastguard Worker #endif  // defined(GTEST_GET_INT32_FROM_ENV_)
11700*5c90c05cSAndroid Build Coastguard Worker }
11701*5c90c05cSAndroid Build Coastguard Worker 
11702*5c90c05cSAndroid Build Coastguard Worker // As a special case for the 'output' flag, if GTEST_OUTPUT is not
11703*5c90c05cSAndroid Build Coastguard Worker // set, we look for XML_OUTPUT_FILE, which is set by the Bazel build
11704*5c90c05cSAndroid Build Coastguard Worker // system.  The value of XML_OUTPUT_FILE is a filename without the
11705*5c90c05cSAndroid Build Coastguard Worker // "xml:" prefix of GTEST_OUTPUT.
11706*5c90c05cSAndroid Build Coastguard Worker // Note that this is meant to be called at the call site so it does
11707*5c90c05cSAndroid Build Coastguard Worker // not check that the flag is 'output'
11708*5c90c05cSAndroid Build Coastguard Worker // In essence this checks an env variable called XML_OUTPUT_FILE
11709*5c90c05cSAndroid Build Coastguard Worker // and if it is set we prepend "xml:" to its value, if it not set we return ""
OutputFlagAlsoCheckEnvVar()11710*5c90c05cSAndroid Build Coastguard Worker std::string OutputFlagAlsoCheckEnvVar(){
11711*5c90c05cSAndroid Build Coastguard Worker   std::string default_value_for_output_flag = "";
11712*5c90c05cSAndroid Build Coastguard Worker   const char* xml_output_file_env = posix::GetEnv("XML_OUTPUT_FILE");
11713*5c90c05cSAndroid Build Coastguard Worker   if (nullptr != xml_output_file_env) {
11714*5c90c05cSAndroid Build Coastguard Worker     default_value_for_output_flag = std::string("xml:") + xml_output_file_env;
11715*5c90c05cSAndroid Build Coastguard Worker   }
11716*5c90c05cSAndroid Build Coastguard Worker   return default_value_for_output_flag;
11717*5c90c05cSAndroid Build Coastguard Worker }
11718*5c90c05cSAndroid Build Coastguard Worker 
11719*5c90c05cSAndroid Build Coastguard Worker // Reads and returns the string environment variable corresponding to
11720*5c90c05cSAndroid Build Coastguard Worker // the given flag; if it's not set, returns default_value.
StringFromGTestEnv(const char * flag,const char * default_value)11721*5c90c05cSAndroid Build Coastguard Worker const char* StringFromGTestEnv(const char* flag, const char* default_value) {
11722*5c90c05cSAndroid Build Coastguard Worker #if defined(GTEST_GET_STRING_FROM_ENV_)
11723*5c90c05cSAndroid Build Coastguard Worker   return GTEST_GET_STRING_FROM_ENV_(flag, default_value);
11724*5c90c05cSAndroid Build Coastguard Worker #else
11725*5c90c05cSAndroid Build Coastguard Worker   const std::string env_var = FlagToEnvVar(flag);
11726*5c90c05cSAndroid Build Coastguard Worker   const char* const value = posix::GetEnv(env_var.c_str());
11727*5c90c05cSAndroid Build Coastguard Worker   return value == nullptr ? default_value : value;
11728*5c90c05cSAndroid Build Coastguard Worker #endif  // defined(GTEST_GET_STRING_FROM_ENV_)
11729*5c90c05cSAndroid Build Coastguard Worker }
11730*5c90c05cSAndroid Build Coastguard Worker 
11731*5c90c05cSAndroid Build Coastguard Worker }  // namespace internal
11732*5c90c05cSAndroid Build Coastguard Worker }  // namespace testing
11733*5c90c05cSAndroid Build Coastguard Worker // Copyright 2007, Google Inc.
11734*5c90c05cSAndroid Build Coastguard Worker // All rights reserved.
11735*5c90c05cSAndroid Build Coastguard Worker //
11736*5c90c05cSAndroid Build Coastguard Worker // Redistribution and use in source and binary forms, with or without
11737*5c90c05cSAndroid Build Coastguard Worker // modification, are permitted provided that the following conditions are
11738*5c90c05cSAndroid Build Coastguard Worker // met:
11739*5c90c05cSAndroid Build Coastguard Worker //
11740*5c90c05cSAndroid Build Coastguard Worker //     * Redistributions of source code must retain the above copyright
11741*5c90c05cSAndroid Build Coastguard Worker // notice, this list of conditions and the following disclaimer.
11742*5c90c05cSAndroid Build Coastguard Worker //     * Redistributions in binary form must reproduce the above
11743*5c90c05cSAndroid Build Coastguard Worker // copyright notice, this list of conditions and the following disclaimer
11744*5c90c05cSAndroid Build Coastguard Worker // in the documentation and/or other materials provided with the
11745*5c90c05cSAndroid Build Coastguard Worker // distribution.
11746*5c90c05cSAndroid Build Coastguard Worker //     * Neither the name of Google Inc. nor the names of its
11747*5c90c05cSAndroid Build Coastguard Worker // contributors may be used to endorse or promote products derived from
11748*5c90c05cSAndroid Build Coastguard Worker // this software without specific prior written permission.
11749*5c90c05cSAndroid Build Coastguard Worker //
11750*5c90c05cSAndroid Build Coastguard Worker // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
11751*5c90c05cSAndroid Build Coastguard Worker // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
11752*5c90c05cSAndroid Build Coastguard Worker // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
11753*5c90c05cSAndroid Build Coastguard Worker // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
11754*5c90c05cSAndroid Build Coastguard Worker // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
11755*5c90c05cSAndroid Build Coastguard Worker // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
11756*5c90c05cSAndroid Build Coastguard Worker // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
11757*5c90c05cSAndroid Build Coastguard Worker // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
11758*5c90c05cSAndroid Build Coastguard Worker // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
11759*5c90c05cSAndroid Build Coastguard Worker // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
11760*5c90c05cSAndroid Build Coastguard Worker // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
11761*5c90c05cSAndroid Build Coastguard Worker 
11762*5c90c05cSAndroid Build Coastguard Worker 
11763*5c90c05cSAndroid Build Coastguard Worker // Google Test - The Google C++ Testing and Mocking Framework
11764*5c90c05cSAndroid Build Coastguard Worker //
11765*5c90c05cSAndroid Build Coastguard Worker // This file implements a universal value printer that can print a
11766*5c90c05cSAndroid Build Coastguard Worker // value of any type T:
11767*5c90c05cSAndroid Build Coastguard Worker //
11768*5c90c05cSAndroid Build Coastguard Worker //   void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
11769*5c90c05cSAndroid Build Coastguard Worker //
11770*5c90c05cSAndroid Build Coastguard Worker // It uses the << operator when possible, and prints the bytes in the
11771*5c90c05cSAndroid Build Coastguard Worker // object otherwise.  A user can override its behavior for a class
11772*5c90c05cSAndroid Build Coastguard Worker // type Foo by defining either operator<<(::std::ostream&, const Foo&)
11773*5c90c05cSAndroid Build Coastguard Worker // or void PrintTo(const Foo&, ::std::ostream*) in the namespace that
11774*5c90c05cSAndroid Build Coastguard Worker // defines Foo.
11775*5c90c05cSAndroid Build Coastguard Worker 
11776*5c90c05cSAndroid Build Coastguard Worker 
11777*5c90c05cSAndroid Build Coastguard Worker #include <stdio.h>
11778*5c90c05cSAndroid Build Coastguard Worker 
11779*5c90c05cSAndroid Build Coastguard Worker #include <cctype>
11780*5c90c05cSAndroid Build Coastguard Worker #include <cstdint>
11781*5c90c05cSAndroid Build Coastguard Worker #include <cwchar>
11782*5c90c05cSAndroid Build Coastguard Worker #include <ostream>  // NOLINT
11783*5c90c05cSAndroid Build Coastguard Worker #include <string>
11784*5c90c05cSAndroid Build Coastguard Worker #include <type_traits>
11785*5c90c05cSAndroid Build Coastguard Worker 
11786*5c90c05cSAndroid Build Coastguard Worker 
11787*5c90c05cSAndroid Build Coastguard Worker namespace testing {
11788*5c90c05cSAndroid Build Coastguard Worker 
11789*5c90c05cSAndroid Build Coastguard Worker namespace {
11790*5c90c05cSAndroid Build Coastguard Worker 
11791*5c90c05cSAndroid Build Coastguard Worker using ::std::ostream;
11792*5c90c05cSAndroid Build Coastguard Worker 
11793*5c90c05cSAndroid Build Coastguard Worker // Prints a segment of bytes in the given object.
11794*5c90c05cSAndroid Build Coastguard Worker GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_
11795*5c90c05cSAndroid Build Coastguard Worker GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_
11796*5c90c05cSAndroid Build Coastguard Worker GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_
11797*5c90c05cSAndroid Build Coastguard Worker GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_
PrintByteSegmentInObjectTo(const unsigned char * obj_bytes,size_t start,size_t count,ostream * os)11798*5c90c05cSAndroid Build Coastguard Worker void PrintByteSegmentInObjectTo(const unsigned char* obj_bytes, size_t start,
11799*5c90c05cSAndroid Build Coastguard Worker                                 size_t count, ostream* os) {
11800*5c90c05cSAndroid Build Coastguard Worker   char text[5] = "";
11801*5c90c05cSAndroid Build Coastguard Worker   for (size_t i = 0; i != count; i++) {
11802*5c90c05cSAndroid Build Coastguard Worker     const size_t j = start + i;
11803*5c90c05cSAndroid Build Coastguard Worker     if (i != 0) {
11804*5c90c05cSAndroid Build Coastguard Worker       // Organizes the bytes into groups of 2 for easy parsing by
11805*5c90c05cSAndroid Build Coastguard Worker       // human.
11806*5c90c05cSAndroid Build Coastguard Worker       if ((j % 2) == 0)
11807*5c90c05cSAndroid Build Coastguard Worker         *os << ' ';
11808*5c90c05cSAndroid Build Coastguard Worker       else
11809*5c90c05cSAndroid Build Coastguard Worker         *os << '-';
11810*5c90c05cSAndroid Build Coastguard Worker     }
11811*5c90c05cSAndroid Build Coastguard Worker     GTEST_SNPRINTF_(text, sizeof(text), "%02X", obj_bytes[j]);
11812*5c90c05cSAndroid Build Coastguard Worker     *os << text;
11813*5c90c05cSAndroid Build Coastguard Worker   }
11814*5c90c05cSAndroid Build Coastguard Worker }
11815*5c90c05cSAndroid Build Coastguard Worker 
11816*5c90c05cSAndroid Build Coastguard Worker // Prints the bytes in the given value to the given ostream.
PrintBytesInObjectToImpl(const unsigned char * obj_bytes,size_t count,ostream * os)11817*5c90c05cSAndroid Build Coastguard Worker void PrintBytesInObjectToImpl(const unsigned char* obj_bytes, size_t count,
11818*5c90c05cSAndroid Build Coastguard Worker                               ostream* os) {
11819*5c90c05cSAndroid Build Coastguard Worker   // Tells the user how big the object is.
11820*5c90c05cSAndroid Build Coastguard Worker   *os << count << "-byte object <";
11821*5c90c05cSAndroid Build Coastguard Worker 
11822*5c90c05cSAndroid Build Coastguard Worker   const size_t kThreshold = 132;
11823*5c90c05cSAndroid Build Coastguard Worker   const size_t kChunkSize = 64;
11824*5c90c05cSAndroid Build Coastguard Worker   // If the object size is bigger than kThreshold, we'll have to omit
11825*5c90c05cSAndroid Build Coastguard Worker   // some details by printing only the first and the last kChunkSize
11826*5c90c05cSAndroid Build Coastguard Worker   // bytes.
11827*5c90c05cSAndroid Build Coastguard Worker   if (count < kThreshold) {
11828*5c90c05cSAndroid Build Coastguard Worker     PrintByteSegmentInObjectTo(obj_bytes, 0, count, os);
11829*5c90c05cSAndroid Build Coastguard Worker   } else {
11830*5c90c05cSAndroid Build Coastguard Worker     PrintByteSegmentInObjectTo(obj_bytes, 0, kChunkSize, os);
11831*5c90c05cSAndroid Build Coastguard Worker     *os << " ... ";
11832*5c90c05cSAndroid Build Coastguard Worker     // Rounds up to 2-byte boundary.
11833*5c90c05cSAndroid Build Coastguard Worker     const size_t resume_pos = (count - kChunkSize + 1)/2*2;
11834*5c90c05cSAndroid Build Coastguard Worker     PrintByteSegmentInObjectTo(obj_bytes, resume_pos, count - resume_pos, os);
11835*5c90c05cSAndroid Build Coastguard Worker   }
11836*5c90c05cSAndroid Build Coastguard Worker   *os << ">";
11837*5c90c05cSAndroid Build Coastguard Worker }
11838*5c90c05cSAndroid Build Coastguard Worker 
11839*5c90c05cSAndroid Build Coastguard Worker // Helpers for widening a character to char32_t. Since the standard does not
11840*5c90c05cSAndroid Build Coastguard Worker // specify if char / wchar_t is signed or unsigned, it is important to first
11841*5c90c05cSAndroid Build Coastguard Worker // convert it to the unsigned type of the same width before widening it to
11842*5c90c05cSAndroid Build Coastguard Worker // char32_t.
11843*5c90c05cSAndroid Build Coastguard Worker template <typename CharType>
ToChar32(CharType in)11844*5c90c05cSAndroid Build Coastguard Worker char32_t ToChar32(CharType in) {
11845*5c90c05cSAndroid Build Coastguard Worker   return static_cast<char32_t>(
11846*5c90c05cSAndroid Build Coastguard Worker       static_cast<typename std::make_unsigned<CharType>::type>(in));
11847*5c90c05cSAndroid Build Coastguard Worker }
11848*5c90c05cSAndroid Build Coastguard Worker 
11849*5c90c05cSAndroid Build Coastguard Worker }  // namespace
11850*5c90c05cSAndroid Build Coastguard Worker 
11851*5c90c05cSAndroid Build Coastguard Worker namespace internal {
11852*5c90c05cSAndroid Build Coastguard Worker 
11853*5c90c05cSAndroid Build Coastguard Worker // Delegates to PrintBytesInObjectToImpl() to print the bytes in the
11854*5c90c05cSAndroid Build Coastguard Worker // given object.  The delegation simplifies the implementation, which
11855*5c90c05cSAndroid Build Coastguard Worker // uses the << operator and thus is easier done outside of the
11856*5c90c05cSAndroid Build Coastguard Worker // ::testing::internal namespace, which contains a << operator that
11857*5c90c05cSAndroid Build Coastguard Worker // sometimes conflicts with the one in STL.
PrintBytesInObjectTo(const unsigned char * obj_bytes,size_t count,ostream * os)11858*5c90c05cSAndroid Build Coastguard Worker void PrintBytesInObjectTo(const unsigned char* obj_bytes, size_t count,
11859*5c90c05cSAndroid Build Coastguard Worker                           ostream* os) {
11860*5c90c05cSAndroid Build Coastguard Worker   PrintBytesInObjectToImpl(obj_bytes, count, os);
11861*5c90c05cSAndroid Build Coastguard Worker }
11862*5c90c05cSAndroid Build Coastguard Worker 
11863*5c90c05cSAndroid Build Coastguard Worker // Depending on the value of a char (or wchar_t), we print it in one
11864*5c90c05cSAndroid Build Coastguard Worker // of three formats:
11865*5c90c05cSAndroid Build Coastguard Worker //   - as is if it's a printable ASCII (e.g. 'a', '2', ' '),
11866*5c90c05cSAndroid Build Coastguard Worker //   - as a hexadecimal escape sequence (e.g. '\x7F'), or
11867*5c90c05cSAndroid Build Coastguard Worker //   - as a special escape sequence (e.g. '\r', '\n').
11868*5c90c05cSAndroid Build Coastguard Worker enum CharFormat {
11869*5c90c05cSAndroid Build Coastguard Worker   kAsIs,
11870*5c90c05cSAndroid Build Coastguard Worker   kHexEscape,
11871*5c90c05cSAndroid Build Coastguard Worker   kSpecialEscape
11872*5c90c05cSAndroid Build Coastguard Worker };
11873*5c90c05cSAndroid Build Coastguard Worker 
11874*5c90c05cSAndroid Build Coastguard Worker // Returns true if c is a printable ASCII character.  We test the
11875*5c90c05cSAndroid Build Coastguard Worker // value of c directly instead of calling isprint(), which is buggy on
11876*5c90c05cSAndroid Build Coastguard Worker // Windows Mobile.
IsPrintableAscii(char32_t c)11877*5c90c05cSAndroid Build Coastguard Worker inline bool IsPrintableAscii(char32_t c) { return 0x20 <= c && c <= 0x7E; }
11878*5c90c05cSAndroid Build Coastguard Worker 
11879*5c90c05cSAndroid Build Coastguard Worker // Prints c (of type char, char8_t, char16_t, char32_t, or wchar_t) as a
11880*5c90c05cSAndroid Build Coastguard Worker // character literal without the quotes, escaping it when necessary; returns how
11881*5c90c05cSAndroid Build Coastguard Worker // c was formatted.
11882*5c90c05cSAndroid Build Coastguard Worker template <typename Char>
PrintAsCharLiteralTo(Char c,ostream * os)11883*5c90c05cSAndroid Build Coastguard Worker static CharFormat PrintAsCharLiteralTo(Char c, ostream* os) {
11884*5c90c05cSAndroid Build Coastguard Worker   const char32_t u_c = ToChar32(c);
11885*5c90c05cSAndroid Build Coastguard Worker   switch (u_c) {
11886*5c90c05cSAndroid Build Coastguard Worker     case L'\0':
11887*5c90c05cSAndroid Build Coastguard Worker       *os << "\\0";
11888*5c90c05cSAndroid Build Coastguard Worker       break;
11889*5c90c05cSAndroid Build Coastguard Worker     case L'\'':
11890*5c90c05cSAndroid Build Coastguard Worker       *os << "\\'";
11891*5c90c05cSAndroid Build Coastguard Worker       break;
11892*5c90c05cSAndroid Build Coastguard Worker     case L'\\':
11893*5c90c05cSAndroid Build Coastguard Worker       *os << "\\\\";
11894*5c90c05cSAndroid Build Coastguard Worker       break;
11895*5c90c05cSAndroid Build Coastguard Worker     case L'\a':
11896*5c90c05cSAndroid Build Coastguard Worker       *os << "\\a";
11897*5c90c05cSAndroid Build Coastguard Worker       break;
11898*5c90c05cSAndroid Build Coastguard Worker     case L'\b':
11899*5c90c05cSAndroid Build Coastguard Worker       *os << "\\b";
11900*5c90c05cSAndroid Build Coastguard Worker       break;
11901*5c90c05cSAndroid Build Coastguard Worker     case L'\f':
11902*5c90c05cSAndroid Build Coastguard Worker       *os << "\\f";
11903*5c90c05cSAndroid Build Coastguard Worker       break;
11904*5c90c05cSAndroid Build Coastguard Worker     case L'\n':
11905*5c90c05cSAndroid Build Coastguard Worker       *os << "\\n";
11906*5c90c05cSAndroid Build Coastguard Worker       break;
11907*5c90c05cSAndroid Build Coastguard Worker     case L'\r':
11908*5c90c05cSAndroid Build Coastguard Worker       *os << "\\r";
11909*5c90c05cSAndroid Build Coastguard Worker       break;
11910*5c90c05cSAndroid Build Coastguard Worker     case L'\t':
11911*5c90c05cSAndroid Build Coastguard Worker       *os << "\\t";
11912*5c90c05cSAndroid Build Coastguard Worker       break;
11913*5c90c05cSAndroid Build Coastguard Worker     case L'\v':
11914*5c90c05cSAndroid Build Coastguard Worker       *os << "\\v";
11915*5c90c05cSAndroid Build Coastguard Worker       break;
11916*5c90c05cSAndroid Build Coastguard Worker     default:
11917*5c90c05cSAndroid Build Coastguard Worker       if (IsPrintableAscii(u_c)) {
11918*5c90c05cSAndroid Build Coastguard Worker         *os << static_cast<char>(c);
11919*5c90c05cSAndroid Build Coastguard Worker         return kAsIs;
11920*5c90c05cSAndroid Build Coastguard Worker       } else {
11921*5c90c05cSAndroid Build Coastguard Worker         ostream::fmtflags flags = os->flags();
11922*5c90c05cSAndroid Build Coastguard Worker         *os << "\\x" << std::hex << std::uppercase << static_cast<int>(u_c);
11923*5c90c05cSAndroid Build Coastguard Worker         os->flags(flags);
11924*5c90c05cSAndroid Build Coastguard Worker         return kHexEscape;
11925*5c90c05cSAndroid Build Coastguard Worker       }
11926*5c90c05cSAndroid Build Coastguard Worker   }
11927*5c90c05cSAndroid Build Coastguard Worker   return kSpecialEscape;
11928*5c90c05cSAndroid Build Coastguard Worker }
11929*5c90c05cSAndroid Build Coastguard Worker 
11930*5c90c05cSAndroid Build Coastguard Worker // Prints a char32_t c as if it's part of a string literal, escaping it when
11931*5c90c05cSAndroid Build Coastguard Worker // necessary; returns how c was formatted.
PrintAsStringLiteralTo(char32_t c,ostream * os)11932*5c90c05cSAndroid Build Coastguard Worker static CharFormat PrintAsStringLiteralTo(char32_t c, ostream* os) {
11933*5c90c05cSAndroid Build Coastguard Worker   switch (c) {
11934*5c90c05cSAndroid Build Coastguard Worker     case L'\'':
11935*5c90c05cSAndroid Build Coastguard Worker       *os << "'";
11936*5c90c05cSAndroid Build Coastguard Worker       return kAsIs;
11937*5c90c05cSAndroid Build Coastguard Worker     case L'"':
11938*5c90c05cSAndroid Build Coastguard Worker       *os << "\\\"";
11939*5c90c05cSAndroid Build Coastguard Worker       return kSpecialEscape;
11940*5c90c05cSAndroid Build Coastguard Worker     default:
11941*5c90c05cSAndroid Build Coastguard Worker       return PrintAsCharLiteralTo(c, os);
11942*5c90c05cSAndroid Build Coastguard Worker   }
11943*5c90c05cSAndroid Build Coastguard Worker }
11944*5c90c05cSAndroid Build Coastguard Worker 
GetCharWidthPrefix(char)11945*5c90c05cSAndroid Build Coastguard Worker static const char* GetCharWidthPrefix(char) {
11946*5c90c05cSAndroid Build Coastguard Worker   return "";
11947*5c90c05cSAndroid Build Coastguard Worker }
11948*5c90c05cSAndroid Build Coastguard Worker 
GetCharWidthPrefix(signed char)11949*5c90c05cSAndroid Build Coastguard Worker static const char* GetCharWidthPrefix(signed char) {
11950*5c90c05cSAndroid Build Coastguard Worker   return "";
11951*5c90c05cSAndroid Build Coastguard Worker }
11952*5c90c05cSAndroid Build Coastguard Worker 
GetCharWidthPrefix(unsigned char)11953*5c90c05cSAndroid Build Coastguard Worker static const char* GetCharWidthPrefix(unsigned char) {
11954*5c90c05cSAndroid Build Coastguard Worker   return "";
11955*5c90c05cSAndroid Build Coastguard Worker }
11956*5c90c05cSAndroid Build Coastguard Worker 
11957*5c90c05cSAndroid Build Coastguard Worker #ifdef __cpp_char8_t
GetCharWidthPrefix(char8_t)11958*5c90c05cSAndroid Build Coastguard Worker static const char* GetCharWidthPrefix(char8_t) {
11959*5c90c05cSAndroid Build Coastguard Worker   return "u8";
11960*5c90c05cSAndroid Build Coastguard Worker }
11961*5c90c05cSAndroid Build Coastguard Worker #endif
11962*5c90c05cSAndroid Build Coastguard Worker 
GetCharWidthPrefix(char16_t)11963*5c90c05cSAndroid Build Coastguard Worker static const char* GetCharWidthPrefix(char16_t) {
11964*5c90c05cSAndroid Build Coastguard Worker   return "u";
11965*5c90c05cSAndroid Build Coastguard Worker }
11966*5c90c05cSAndroid Build Coastguard Worker 
GetCharWidthPrefix(char32_t)11967*5c90c05cSAndroid Build Coastguard Worker static const char* GetCharWidthPrefix(char32_t) {
11968*5c90c05cSAndroid Build Coastguard Worker   return "U";
11969*5c90c05cSAndroid Build Coastguard Worker }
11970*5c90c05cSAndroid Build Coastguard Worker 
GetCharWidthPrefix(wchar_t)11971*5c90c05cSAndroid Build Coastguard Worker static const char* GetCharWidthPrefix(wchar_t) {
11972*5c90c05cSAndroid Build Coastguard Worker   return "L";
11973*5c90c05cSAndroid Build Coastguard Worker }
11974*5c90c05cSAndroid Build Coastguard Worker 
11975*5c90c05cSAndroid Build Coastguard Worker // Prints a char c as if it's part of a string literal, escaping it when
11976*5c90c05cSAndroid Build Coastguard Worker // necessary; returns how c was formatted.
PrintAsStringLiteralTo(char c,ostream * os)11977*5c90c05cSAndroid Build Coastguard Worker static CharFormat PrintAsStringLiteralTo(char c, ostream* os) {
11978*5c90c05cSAndroid Build Coastguard Worker   return PrintAsStringLiteralTo(ToChar32(c), os);
11979*5c90c05cSAndroid Build Coastguard Worker }
11980*5c90c05cSAndroid Build Coastguard Worker 
11981*5c90c05cSAndroid Build Coastguard Worker #ifdef __cpp_char8_t
PrintAsStringLiteralTo(char8_t c,ostream * os)11982*5c90c05cSAndroid Build Coastguard Worker static CharFormat PrintAsStringLiteralTo(char8_t c, ostream* os) {
11983*5c90c05cSAndroid Build Coastguard Worker   return PrintAsStringLiteralTo(ToChar32(c), os);
11984*5c90c05cSAndroid Build Coastguard Worker }
11985*5c90c05cSAndroid Build Coastguard Worker #endif
11986*5c90c05cSAndroid Build Coastguard Worker 
PrintAsStringLiteralTo(char16_t c,ostream * os)11987*5c90c05cSAndroid Build Coastguard Worker static CharFormat PrintAsStringLiteralTo(char16_t c, ostream* os) {
11988*5c90c05cSAndroid Build Coastguard Worker   return PrintAsStringLiteralTo(ToChar32(c), os);
11989*5c90c05cSAndroid Build Coastguard Worker }
11990*5c90c05cSAndroid Build Coastguard Worker 
PrintAsStringLiteralTo(wchar_t c,ostream * os)11991*5c90c05cSAndroid Build Coastguard Worker static CharFormat PrintAsStringLiteralTo(wchar_t c, ostream* os) {
11992*5c90c05cSAndroid Build Coastguard Worker   return PrintAsStringLiteralTo(ToChar32(c), os);
11993*5c90c05cSAndroid Build Coastguard Worker }
11994*5c90c05cSAndroid Build Coastguard Worker 
11995*5c90c05cSAndroid Build Coastguard Worker // Prints a character c (of type char, char8_t, char16_t, char32_t, or wchar_t)
11996*5c90c05cSAndroid Build Coastguard Worker // and its code. '\0' is printed as "'\\0'", other unprintable characters are
11997*5c90c05cSAndroid Build Coastguard Worker // also properly escaped using the standard C++ escape sequence.
11998*5c90c05cSAndroid Build Coastguard Worker template <typename Char>
PrintCharAndCodeTo(Char c,ostream * os)11999*5c90c05cSAndroid Build Coastguard Worker void PrintCharAndCodeTo(Char c, ostream* os) {
12000*5c90c05cSAndroid Build Coastguard Worker   // First, print c as a literal in the most readable form we can find.
12001*5c90c05cSAndroid Build Coastguard Worker   *os << GetCharWidthPrefix(c) << "'";
12002*5c90c05cSAndroid Build Coastguard Worker   const CharFormat format = PrintAsCharLiteralTo(c, os);
12003*5c90c05cSAndroid Build Coastguard Worker   *os << "'";
12004*5c90c05cSAndroid Build Coastguard Worker 
12005*5c90c05cSAndroid Build Coastguard Worker   // To aid user debugging, we also print c's code in decimal, unless
12006*5c90c05cSAndroid Build Coastguard Worker   // it's 0 (in which case c was printed as '\\0', making the code
12007*5c90c05cSAndroid Build Coastguard Worker   // obvious).
12008*5c90c05cSAndroid Build Coastguard Worker   if (c == 0)
12009*5c90c05cSAndroid Build Coastguard Worker     return;
12010*5c90c05cSAndroid Build Coastguard Worker   *os << " (" << static_cast<int>(c);
12011*5c90c05cSAndroid Build Coastguard Worker 
12012*5c90c05cSAndroid Build Coastguard Worker   // For more convenience, we print c's code again in hexadecimal,
12013*5c90c05cSAndroid Build Coastguard Worker   // unless c was already printed in the form '\x##' or the code is in
12014*5c90c05cSAndroid Build Coastguard Worker   // [1, 9].
12015*5c90c05cSAndroid Build Coastguard Worker   if (format == kHexEscape || (1 <= c && c <= 9)) {
12016*5c90c05cSAndroid Build Coastguard Worker     // Do nothing.
12017*5c90c05cSAndroid Build Coastguard Worker   } else {
12018*5c90c05cSAndroid Build Coastguard Worker     *os << ", 0x" << String::FormatHexInt(static_cast<int>(c));
12019*5c90c05cSAndroid Build Coastguard Worker   }
12020*5c90c05cSAndroid Build Coastguard Worker   *os << ")";
12021*5c90c05cSAndroid Build Coastguard Worker }
12022*5c90c05cSAndroid Build Coastguard Worker 
PrintTo(unsigned char c,::std::ostream * os)12023*5c90c05cSAndroid Build Coastguard Worker void PrintTo(unsigned char c, ::std::ostream* os) { PrintCharAndCodeTo(c, os); }
PrintTo(signed char c,::std::ostream * os)12024*5c90c05cSAndroid Build Coastguard Worker void PrintTo(signed char c, ::std::ostream* os) { PrintCharAndCodeTo(c, os); }
12025*5c90c05cSAndroid Build Coastguard Worker 
12026*5c90c05cSAndroid Build Coastguard Worker // Prints a wchar_t as a symbol if it is printable or as its internal
12027*5c90c05cSAndroid Build Coastguard Worker // code otherwise and also as its code.  L'\0' is printed as "L'\\0'".
PrintTo(wchar_t wc,ostream * os)12028*5c90c05cSAndroid Build Coastguard Worker void PrintTo(wchar_t wc, ostream* os) { PrintCharAndCodeTo(wc, os); }
12029*5c90c05cSAndroid Build Coastguard Worker 
12030*5c90c05cSAndroid Build Coastguard Worker // TODO(dcheng): Consider making this delegate to PrintCharAndCodeTo() as well.
PrintTo(char32_t c,::std::ostream * os)12031*5c90c05cSAndroid Build Coastguard Worker void PrintTo(char32_t c, ::std::ostream* os) {
12032*5c90c05cSAndroid Build Coastguard Worker   *os << std::hex << "U+" << std::uppercase << std::setfill('0') << std::setw(4)
12033*5c90c05cSAndroid Build Coastguard Worker       << static_cast<uint32_t>(c);
12034*5c90c05cSAndroid Build Coastguard Worker }
12035*5c90c05cSAndroid Build Coastguard Worker 
12036*5c90c05cSAndroid Build Coastguard Worker // Prints the given array of characters to the ostream.  CharType must be either
12037*5c90c05cSAndroid Build Coastguard Worker // char, char8_t, char16_t, char32_t, or wchar_t.
12038*5c90c05cSAndroid Build Coastguard Worker // The array starts at begin, the length is len, it may include '\0' characters
12039*5c90c05cSAndroid Build Coastguard Worker // and may not be NUL-terminated.
12040*5c90c05cSAndroid Build Coastguard Worker template <typename CharType>
12041*5c90c05cSAndroid Build Coastguard Worker GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_
12042*5c90c05cSAndroid Build Coastguard Worker GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_
12043*5c90c05cSAndroid Build Coastguard Worker GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_
12044*5c90c05cSAndroid Build Coastguard Worker GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_
PrintCharsAsStringTo(const CharType * begin,size_t len,ostream * os)12045*5c90c05cSAndroid Build Coastguard Worker static CharFormat PrintCharsAsStringTo(
12046*5c90c05cSAndroid Build Coastguard Worker     const CharType* begin, size_t len, ostream* os) {
12047*5c90c05cSAndroid Build Coastguard Worker   const char* const quote_prefix = GetCharWidthPrefix(*begin);
12048*5c90c05cSAndroid Build Coastguard Worker   *os << quote_prefix << "\"";
12049*5c90c05cSAndroid Build Coastguard Worker   bool is_previous_hex = false;
12050*5c90c05cSAndroid Build Coastguard Worker   CharFormat print_format = kAsIs;
12051*5c90c05cSAndroid Build Coastguard Worker   for (size_t index = 0; index < len; ++index) {
12052*5c90c05cSAndroid Build Coastguard Worker     const CharType cur = begin[index];
12053*5c90c05cSAndroid Build Coastguard Worker     if (is_previous_hex && IsXDigit(cur)) {
12054*5c90c05cSAndroid Build Coastguard Worker       // Previous character is of '\x..' form and this character can be
12055*5c90c05cSAndroid Build Coastguard Worker       // interpreted as another hexadecimal digit in its number. Break string to
12056*5c90c05cSAndroid Build Coastguard Worker       // disambiguate.
12057*5c90c05cSAndroid Build Coastguard Worker       *os << "\" " << quote_prefix << "\"";
12058*5c90c05cSAndroid Build Coastguard Worker     }
12059*5c90c05cSAndroid Build Coastguard Worker     is_previous_hex = PrintAsStringLiteralTo(cur, os) == kHexEscape;
12060*5c90c05cSAndroid Build Coastguard Worker     // Remember if any characters required hex escaping.
12061*5c90c05cSAndroid Build Coastguard Worker     if (is_previous_hex) {
12062*5c90c05cSAndroid Build Coastguard Worker       print_format = kHexEscape;
12063*5c90c05cSAndroid Build Coastguard Worker     }
12064*5c90c05cSAndroid Build Coastguard Worker   }
12065*5c90c05cSAndroid Build Coastguard Worker   *os << "\"";
12066*5c90c05cSAndroid Build Coastguard Worker   return print_format;
12067*5c90c05cSAndroid Build Coastguard Worker }
12068*5c90c05cSAndroid Build Coastguard Worker 
12069*5c90c05cSAndroid Build Coastguard Worker // Prints a (const) char/wchar_t array of 'len' elements, starting at address
12070*5c90c05cSAndroid Build Coastguard Worker // 'begin'.  CharType must be either char or wchar_t.
12071*5c90c05cSAndroid Build Coastguard Worker template <typename CharType>
12072*5c90c05cSAndroid Build Coastguard Worker GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_
12073*5c90c05cSAndroid Build Coastguard Worker GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_
12074*5c90c05cSAndroid Build Coastguard Worker GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_
12075*5c90c05cSAndroid Build Coastguard Worker GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_
UniversalPrintCharArray(const CharType * begin,size_t len,ostream * os)12076*5c90c05cSAndroid Build Coastguard Worker static void UniversalPrintCharArray(
12077*5c90c05cSAndroid Build Coastguard Worker     const CharType* begin, size_t len, ostream* os) {
12078*5c90c05cSAndroid Build Coastguard Worker   // The code
12079*5c90c05cSAndroid Build Coastguard Worker   //   const char kFoo[] = "foo";
12080*5c90c05cSAndroid Build Coastguard Worker   // generates an array of 4, not 3, elements, with the last one being '\0'.
12081*5c90c05cSAndroid Build Coastguard Worker   //
12082*5c90c05cSAndroid Build Coastguard Worker   // Therefore when printing a char array, we don't print the last element if
12083*5c90c05cSAndroid Build Coastguard Worker   // it's '\0', such that the output matches the string literal as it's
12084*5c90c05cSAndroid Build Coastguard Worker   // written in the source code.
12085*5c90c05cSAndroid Build Coastguard Worker   if (len > 0 && begin[len - 1] == '\0') {
12086*5c90c05cSAndroid Build Coastguard Worker     PrintCharsAsStringTo(begin, len - 1, os);
12087*5c90c05cSAndroid Build Coastguard Worker     return;
12088*5c90c05cSAndroid Build Coastguard Worker   }
12089*5c90c05cSAndroid Build Coastguard Worker 
12090*5c90c05cSAndroid Build Coastguard Worker   // If, however, the last element in the array is not '\0', e.g.
12091*5c90c05cSAndroid Build Coastguard Worker   //    const char kFoo[] = { 'f', 'o', 'o' };
12092*5c90c05cSAndroid Build Coastguard Worker   // we must print the entire array.  We also print a message to indicate
12093*5c90c05cSAndroid Build Coastguard Worker   // that the array is not NUL-terminated.
12094*5c90c05cSAndroid Build Coastguard Worker   PrintCharsAsStringTo(begin, len, os);
12095*5c90c05cSAndroid Build Coastguard Worker   *os << " (no terminating NUL)";
12096*5c90c05cSAndroid Build Coastguard Worker }
12097*5c90c05cSAndroid Build Coastguard Worker 
12098*5c90c05cSAndroid Build Coastguard Worker // Prints a (const) char array of 'len' elements, starting at address 'begin'.
UniversalPrintArray(const char * begin,size_t len,ostream * os)12099*5c90c05cSAndroid Build Coastguard Worker void UniversalPrintArray(const char* begin, size_t len, ostream* os) {
12100*5c90c05cSAndroid Build Coastguard Worker   UniversalPrintCharArray(begin, len, os);
12101*5c90c05cSAndroid Build Coastguard Worker }
12102*5c90c05cSAndroid Build Coastguard Worker 
12103*5c90c05cSAndroid Build Coastguard Worker #ifdef __cpp_char8_t
12104*5c90c05cSAndroid Build Coastguard Worker // Prints a (const) char8_t array of 'len' elements, starting at address
12105*5c90c05cSAndroid Build Coastguard Worker // 'begin'.
UniversalPrintArray(const char8_t * begin,size_t len,ostream * os)12106*5c90c05cSAndroid Build Coastguard Worker void UniversalPrintArray(const char8_t* begin, size_t len, ostream* os) {
12107*5c90c05cSAndroid Build Coastguard Worker   UniversalPrintCharArray(begin, len, os);
12108*5c90c05cSAndroid Build Coastguard Worker }
12109*5c90c05cSAndroid Build Coastguard Worker #endif
12110*5c90c05cSAndroid Build Coastguard Worker 
12111*5c90c05cSAndroid Build Coastguard Worker // Prints a (const) char16_t array of 'len' elements, starting at address
12112*5c90c05cSAndroid Build Coastguard Worker // 'begin'.
UniversalPrintArray(const char16_t * begin,size_t len,ostream * os)12113*5c90c05cSAndroid Build Coastguard Worker void UniversalPrintArray(const char16_t* begin, size_t len, ostream* os) {
12114*5c90c05cSAndroid Build Coastguard Worker   UniversalPrintCharArray(begin, len, os);
12115*5c90c05cSAndroid Build Coastguard Worker }
12116*5c90c05cSAndroid Build Coastguard Worker 
12117*5c90c05cSAndroid Build Coastguard Worker // Prints a (const) char32_t array of 'len' elements, starting at address
12118*5c90c05cSAndroid Build Coastguard Worker // 'begin'.
UniversalPrintArray(const char32_t * begin,size_t len,ostream * os)12119*5c90c05cSAndroid Build Coastguard Worker void UniversalPrintArray(const char32_t* begin, size_t len, ostream* os) {
12120*5c90c05cSAndroid Build Coastguard Worker   UniversalPrintCharArray(begin, len, os);
12121*5c90c05cSAndroid Build Coastguard Worker }
12122*5c90c05cSAndroid Build Coastguard Worker 
12123*5c90c05cSAndroid Build Coastguard Worker // Prints a (const) wchar_t array of 'len' elements, starting at address
12124*5c90c05cSAndroid Build Coastguard Worker // 'begin'.
UniversalPrintArray(const wchar_t * begin,size_t len,ostream * os)12125*5c90c05cSAndroid Build Coastguard Worker void UniversalPrintArray(const wchar_t* begin, size_t len, ostream* os) {
12126*5c90c05cSAndroid Build Coastguard Worker   UniversalPrintCharArray(begin, len, os);
12127*5c90c05cSAndroid Build Coastguard Worker }
12128*5c90c05cSAndroid Build Coastguard Worker 
12129*5c90c05cSAndroid Build Coastguard Worker namespace {
12130*5c90c05cSAndroid Build Coastguard Worker 
12131*5c90c05cSAndroid Build Coastguard Worker // Prints a null-terminated C-style string to the ostream.
12132*5c90c05cSAndroid Build Coastguard Worker template <typename Char>
PrintCStringTo(const Char * s,ostream * os)12133*5c90c05cSAndroid Build Coastguard Worker void PrintCStringTo(const Char* s, ostream* os) {
12134*5c90c05cSAndroid Build Coastguard Worker   if (s == nullptr) {
12135*5c90c05cSAndroid Build Coastguard Worker     *os << "NULL";
12136*5c90c05cSAndroid Build Coastguard Worker   } else {
12137*5c90c05cSAndroid Build Coastguard Worker     *os << ImplicitCast_<const void*>(s) << " pointing to ";
12138*5c90c05cSAndroid Build Coastguard Worker     PrintCharsAsStringTo(s, std::char_traits<Char>::length(s), os);
12139*5c90c05cSAndroid Build Coastguard Worker   }
12140*5c90c05cSAndroid Build Coastguard Worker }
12141*5c90c05cSAndroid Build Coastguard Worker 
12142*5c90c05cSAndroid Build Coastguard Worker }  // anonymous namespace
12143*5c90c05cSAndroid Build Coastguard Worker 
PrintTo(const char * s,ostream * os)12144*5c90c05cSAndroid Build Coastguard Worker void PrintTo(const char* s, ostream* os) { PrintCStringTo(s, os); }
12145*5c90c05cSAndroid Build Coastguard Worker 
12146*5c90c05cSAndroid Build Coastguard Worker #ifdef __cpp_char8_t
PrintTo(const char8_t * s,ostream * os)12147*5c90c05cSAndroid Build Coastguard Worker void PrintTo(const char8_t* s, ostream* os) { PrintCStringTo(s, os); }
12148*5c90c05cSAndroid Build Coastguard Worker #endif
12149*5c90c05cSAndroid Build Coastguard Worker 
PrintTo(const char16_t * s,ostream * os)12150*5c90c05cSAndroid Build Coastguard Worker void PrintTo(const char16_t* s, ostream* os) { PrintCStringTo(s, os); }
12151*5c90c05cSAndroid Build Coastguard Worker 
PrintTo(const char32_t * s,ostream * os)12152*5c90c05cSAndroid Build Coastguard Worker void PrintTo(const char32_t* s, ostream* os) { PrintCStringTo(s, os); }
12153*5c90c05cSAndroid Build Coastguard Worker 
12154*5c90c05cSAndroid Build Coastguard Worker // MSVC compiler can be configured to define whar_t as a typedef
12155*5c90c05cSAndroid Build Coastguard Worker // of unsigned short. Defining an overload for const wchar_t* in that case
12156*5c90c05cSAndroid Build Coastguard Worker // would cause pointers to unsigned shorts be printed as wide strings,
12157*5c90c05cSAndroid Build Coastguard Worker // possibly accessing more memory than intended and causing invalid
12158*5c90c05cSAndroid Build Coastguard Worker // memory accesses. MSVC defines _NATIVE_WCHAR_T_DEFINED symbol when
12159*5c90c05cSAndroid Build Coastguard Worker // wchar_t is implemented as a native type.
12160*5c90c05cSAndroid Build Coastguard Worker #if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
12161*5c90c05cSAndroid Build Coastguard Worker // Prints the given wide C string to the ostream.
PrintTo(const wchar_t * s,ostream * os)12162*5c90c05cSAndroid Build Coastguard Worker void PrintTo(const wchar_t* s, ostream* os) { PrintCStringTo(s, os); }
12163*5c90c05cSAndroid Build Coastguard Worker #endif  // wchar_t is native
12164*5c90c05cSAndroid Build Coastguard Worker 
12165*5c90c05cSAndroid Build Coastguard Worker namespace {
12166*5c90c05cSAndroid Build Coastguard Worker 
ContainsUnprintableControlCodes(const char * str,size_t length)12167*5c90c05cSAndroid Build Coastguard Worker bool ContainsUnprintableControlCodes(const char* str, size_t length) {
12168*5c90c05cSAndroid Build Coastguard Worker   const unsigned char *s = reinterpret_cast<const unsigned char *>(str);
12169*5c90c05cSAndroid Build Coastguard Worker 
12170*5c90c05cSAndroid Build Coastguard Worker   for (size_t i = 0; i < length; i++) {
12171*5c90c05cSAndroid Build Coastguard Worker     unsigned char ch = *s++;
12172*5c90c05cSAndroid Build Coastguard Worker     if (std::iscntrl(ch)) {
12173*5c90c05cSAndroid Build Coastguard Worker         switch (ch) {
12174*5c90c05cSAndroid Build Coastguard Worker         case '\t':
12175*5c90c05cSAndroid Build Coastguard Worker         case '\n':
12176*5c90c05cSAndroid Build Coastguard Worker         case '\r':
12177*5c90c05cSAndroid Build Coastguard Worker           break;
12178*5c90c05cSAndroid Build Coastguard Worker         default:
12179*5c90c05cSAndroid Build Coastguard Worker           return true;
12180*5c90c05cSAndroid Build Coastguard Worker         }
12181*5c90c05cSAndroid Build Coastguard Worker       }
12182*5c90c05cSAndroid Build Coastguard Worker   }
12183*5c90c05cSAndroid Build Coastguard Worker   return false;
12184*5c90c05cSAndroid Build Coastguard Worker }
12185*5c90c05cSAndroid Build Coastguard Worker 
IsUTF8TrailByte(unsigned char t)12186*5c90c05cSAndroid Build Coastguard Worker bool IsUTF8TrailByte(unsigned char t) { return 0x80 <= t && t<= 0xbf; }
12187*5c90c05cSAndroid Build Coastguard Worker 
IsValidUTF8(const char * str,size_t length)12188*5c90c05cSAndroid Build Coastguard Worker bool IsValidUTF8(const char* str, size_t length) {
12189*5c90c05cSAndroid Build Coastguard Worker   const unsigned char *s = reinterpret_cast<const unsigned char *>(str);
12190*5c90c05cSAndroid Build Coastguard Worker 
12191*5c90c05cSAndroid Build Coastguard Worker   for (size_t i = 0; i < length;) {
12192*5c90c05cSAndroid Build Coastguard Worker     unsigned char lead = s[i++];
12193*5c90c05cSAndroid Build Coastguard Worker 
12194*5c90c05cSAndroid Build Coastguard Worker     if (lead <= 0x7f) {
12195*5c90c05cSAndroid Build Coastguard Worker       continue;  // single-byte character (ASCII) 0..7F
12196*5c90c05cSAndroid Build Coastguard Worker     }
12197*5c90c05cSAndroid Build Coastguard Worker     if (lead < 0xc2) {
12198*5c90c05cSAndroid Build Coastguard Worker       return false;  // trail byte or non-shortest form
12199*5c90c05cSAndroid Build Coastguard Worker     } else if (lead <= 0xdf && (i + 1) <= length && IsUTF8TrailByte(s[i])) {
12200*5c90c05cSAndroid Build Coastguard Worker       ++i;  // 2-byte character
12201*5c90c05cSAndroid Build Coastguard Worker     } else if (0xe0 <= lead && lead <= 0xef && (i + 2) <= length &&
12202*5c90c05cSAndroid Build Coastguard Worker                IsUTF8TrailByte(s[i]) &&
12203*5c90c05cSAndroid Build Coastguard Worker                IsUTF8TrailByte(s[i + 1]) &&
12204*5c90c05cSAndroid Build Coastguard Worker                // check for non-shortest form and surrogate
12205*5c90c05cSAndroid Build Coastguard Worker                (lead != 0xe0 || s[i] >= 0xa0) &&
12206*5c90c05cSAndroid Build Coastguard Worker                (lead != 0xed || s[i] < 0xa0)) {
12207*5c90c05cSAndroid Build Coastguard Worker       i += 2;  // 3-byte character
12208*5c90c05cSAndroid Build Coastguard Worker     } else if (0xf0 <= lead && lead <= 0xf4 && (i + 3) <= length &&
12209*5c90c05cSAndroid Build Coastguard Worker                IsUTF8TrailByte(s[i]) &&
12210*5c90c05cSAndroid Build Coastguard Worker                IsUTF8TrailByte(s[i + 1]) &&
12211*5c90c05cSAndroid Build Coastguard Worker                IsUTF8TrailByte(s[i + 2]) &&
12212*5c90c05cSAndroid Build Coastguard Worker                // check for non-shortest form
12213*5c90c05cSAndroid Build Coastguard Worker                (lead != 0xf0 || s[i] >= 0x90) &&
12214*5c90c05cSAndroid Build Coastguard Worker                (lead != 0xf4 || s[i] < 0x90)) {
12215*5c90c05cSAndroid Build Coastguard Worker       i += 3;  // 4-byte character
12216*5c90c05cSAndroid Build Coastguard Worker     } else {
12217*5c90c05cSAndroid Build Coastguard Worker       return false;
12218*5c90c05cSAndroid Build Coastguard Worker     }
12219*5c90c05cSAndroid Build Coastguard Worker   }
12220*5c90c05cSAndroid Build Coastguard Worker   return true;
12221*5c90c05cSAndroid Build Coastguard Worker }
12222*5c90c05cSAndroid Build Coastguard Worker 
ConditionalPrintAsText(const char * str,size_t length,ostream * os)12223*5c90c05cSAndroid Build Coastguard Worker void ConditionalPrintAsText(const char* str, size_t length, ostream* os) {
12224*5c90c05cSAndroid Build Coastguard Worker   if (!ContainsUnprintableControlCodes(str, length) &&
12225*5c90c05cSAndroid Build Coastguard Worker       IsValidUTF8(str, length)) {
12226*5c90c05cSAndroid Build Coastguard Worker     *os << "\n    As Text: \"" << str << "\"";
12227*5c90c05cSAndroid Build Coastguard Worker   }
12228*5c90c05cSAndroid Build Coastguard Worker }
12229*5c90c05cSAndroid Build Coastguard Worker 
12230*5c90c05cSAndroid Build Coastguard Worker }  // anonymous namespace
12231*5c90c05cSAndroid Build Coastguard Worker 
PrintStringTo(const::std::string & s,ostream * os)12232*5c90c05cSAndroid Build Coastguard Worker void PrintStringTo(const ::std::string& s, ostream* os) {
12233*5c90c05cSAndroid Build Coastguard Worker   if (PrintCharsAsStringTo(s.data(), s.size(), os) == kHexEscape) {
12234*5c90c05cSAndroid Build Coastguard Worker     if (GTEST_FLAG(print_utf8)) {
12235*5c90c05cSAndroid Build Coastguard Worker       ConditionalPrintAsText(s.data(), s.size(), os);
12236*5c90c05cSAndroid Build Coastguard Worker     }
12237*5c90c05cSAndroid Build Coastguard Worker   }
12238*5c90c05cSAndroid Build Coastguard Worker }
12239*5c90c05cSAndroid Build Coastguard Worker 
12240*5c90c05cSAndroid Build Coastguard Worker #ifdef __cpp_char8_t
PrintU8StringTo(const::std::u8string & s,ostream * os)12241*5c90c05cSAndroid Build Coastguard Worker void PrintU8StringTo(const ::std::u8string& s, ostream* os) {
12242*5c90c05cSAndroid Build Coastguard Worker   PrintCharsAsStringTo(s.data(), s.size(), os);
12243*5c90c05cSAndroid Build Coastguard Worker }
12244*5c90c05cSAndroid Build Coastguard Worker #endif
12245*5c90c05cSAndroid Build Coastguard Worker 
PrintU16StringTo(const::std::u16string & s,ostream * os)12246*5c90c05cSAndroid Build Coastguard Worker void PrintU16StringTo(const ::std::u16string& s, ostream* os) {
12247*5c90c05cSAndroid Build Coastguard Worker   PrintCharsAsStringTo(s.data(), s.size(), os);
12248*5c90c05cSAndroid Build Coastguard Worker }
12249*5c90c05cSAndroid Build Coastguard Worker 
PrintU32StringTo(const::std::u32string & s,ostream * os)12250*5c90c05cSAndroid Build Coastguard Worker void PrintU32StringTo(const ::std::u32string& s, ostream* os) {
12251*5c90c05cSAndroid Build Coastguard Worker   PrintCharsAsStringTo(s.data(), s.size(), os);
12252*5c90c05cSAndroid Build Coastguard Worker }
12253*5c90c05cSAndroid Build Coastguard Worker 
12254*5c90c05cSAndroid Build Coastguard Worker #if GTEST_HAS_STD_WSTRING
PrintWideStringTo(const::std::wstring & s,ostream * os)12255*5c90c05cSAndroid Build Coastguard Worker void PrintWideStringTo(const ::std::wstring& s, ostream* os) {
12256*5c90c05cSAndroid Build Coastguard Worker   PrintCharsAsStringTo(s.data(), s.size(), os);
12257*5c90c05cSAndroid Build Coastguard Worker }
12258*5c90c05cSAndroid Build Coastguard Worker #endif  // GTEST_HAS_STD_WSTRING
12259*5c90c05cSAndroid Build Coastguard Worker 
12260*5c90c05cSAndroid Build Coastguard Worker }  // namespace internal
12261*5c90c05cSAndroid Build Coastguard Worker 
12262*5c90c05cSAndroid Build Coastguard Worker }  // namespace testing
12263*5c90c05cSAndroid Build Coastguard Worker // Copyright 2008, Google Inc.
12264*5c90c05cSAndroid Build Coastguard Worker // All rights reserved.
12265*5c90c05cSAndroid Build Coastguard Worker //
12266*5c90c05cSAndroid Build Coastguard Worker // Redistribution and use in source and binary forms, with or without
12267*5c90c05cSAndroid Build Coastguard Worker // modification, are permitted provided that the following conditions are
12268*5c90c05cSAndroid Build Coastguard Worker // met:
12269*5c90c05cSAndroid Build Coastguard Worker //
12270*5c90c05cSAndroid Build Coastguard Worker //     * Redistributions of source code must retain the above copyright
12271*5c90c05cSAndroid Build Coastguard Worker // notice, this list of conditions and the following disclaimer.
12272*5c90c05cSAndroid Build Coastguard Worker //     * Redistributions in binary form must reproduce the above
12273*5c90c05cSAndroid Build Coastguard Worker // copyright notice, this list of conditions and the following disclaimer
12274*5c90c05cSAndroid Build Coastguard Worker // in the documentation and/or other materials provided with the
12275*5c90c05cSAndroid Build Coastguard Worker // distribution.
12276*5c90c05cSAndroid Build Coastguard Worker //     * Neither the name of Google Inc. nor the names of its
12277*5c90c05cSAndroid Build Coastguard Worker // contributors may be used to endorse or promote products derived from
12278*5c90c05cSAndroid Build Coastguard Worker // this software without specific prior written permission.
12279*5c90c05cSAndroid Build Coastguard Worker //
12280*5c90c05cSAndroid Build Coastguard Worker // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
12281*5c90c05cSAndroid Build Coastguard Worker // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
12282*5c90c05cSAndroid Build Coastguard Worker // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
12283*5c90c05cSAndroid Build Coastguard Worker // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
12284*5c90c05cSAndroid Build Coastguard Worker // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
12285*5c90c05cSAndroid Build Coastguard Worker // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
12286*5c90c05cSAndroid Build Coastguard Worker // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
12287*5c90c05cSAndroid Build Coastguard Worker // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
12288*5c90c05cSAndroid Build Coastguard Worker // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
12289*5c90c05cSAndroid Build Coastguard Worker // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
12290*5c90c05cSAndroid Build Coastguard Worker // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
12291*5c90c05cSAndroid Build Coastguard Worker 
12292*5c90c05cSAndroid Build Coastguard Worker //
12293*5c90c05cSAndroid Build Coastguard Worker // The Google C++ Testing and Mocking Framework (Google Test)
12294*5c90c05cSAndroid Build Coastguard Worker 
12295*5c90c05cSAndroid Build Coastguard Worker 
12296*5c90c05cSAndroid Build Coastguard Worker 
12297*5c90c05cSAndroid Build Coastguard Worker namespace testing {
12298*5c90c05cSAndroid Build Coastguard Worker 
12299*5c90c05cSAndroid Build Coastguard Worker using internal::GetUnitTestImpl;
12300*5c90c05cSAndroid Build Coastguard Worker 
12301*5c90c05cSAndroid Build Coastguard Worker // Gets the summary of the failure message by omitting the stack trace
12302*5c90c05cSAndroid Build Coastguard Worker // in it.
ExtractSummary(const char * message)12303*5c90c05cSAndroid Build Coastguard Worker std::string TestPartResult::ExtractSummary(const char* message) {
12304*5c90c05cSAndroid Build Coastguard Worker   const char* const stack_trace = strstr(message, internal::kStackTraceMarker);
12305*5c90c05cSAndroid Build Coastguard Worker   return stack_trace == nullptr ? message : std::string(message, stack_trace);
12306*5c90c05cSAndroid Build Coastguard Worker }
12307*5c90c05cSAndroid Build Coastguard Worker 
12308*5c90c05cSAndroid Build Coastguard Worker // Prints a TestPartResult object.
operator <<(std::ostream & os,const TestPartResult & result)12309*5c90c05cSAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& os, const TestPartResult& result) {
12310*5c90c05cSAndroid Build Coastguard Worker   return os << internal::FormatFileLocation(result.file_name(),
12311*5c90c05cSAndroid Build Coastguard Worker                                             result.line_number())
12312*5c90c05cSAndroid Build Coastguard Worker             << " "
12313*5c90c05cSAndroid Build Coastguard Worker             << (result.type() == TestPartResult::kSuccess
12314*5c90c05cSAndroid Build Coastguard Worker                     ? "Success"
12315*5c90c05cSAndroid Build Coastguard Worker                     : result.type() == TestPartResult::kSkip
12316*5c90c05cSAndroid Build Coastguard Worker                           ? "Skipped"
12317*5c90c05cSAndroid Build Coastguard Worker                           : result.type() == TestPartResult::kFatalFailure
12318*5c90c05cSAndroid Build Coastguard Worker                                 ? "Fatal failure"
12319*5c90c05cSAndroid Build Coastguard Worker                                 : "Non-fatal failure")
12320*5c90c05cSAndroid Build Coastguard Worker             << ":\n"
12321*5c90c05cSAndroid Build Coastguard Worker             << result.message() << std::endl;
12322*5c90c05cSAndroid Build Coastguard Worker }
12323*5c90c05cSAndroid Build Coastguard Worker 
12324*5c90c05cSAndroid Build Coastguard Worker // Appends a TestPartResult to the array.
Append(const TestPartResult & result)12325*5c90c05cSAndroid Build Coastguard Worker void TestPartResultArray::Append(const TestPartResult& result) {
12326*5c90c05cSAndroid Build Coastguard Worker   array_.push_back(result);
12327*5c90c05cSAndroid Build Coastguard Worker }
12328*5c90c05cSAndroid Build Coastguard Worker 
12329*5c90c05cSAndroid Build Coastguard Worker // Returns the TestPartResult at the given index (0-based).
GetTestPartResult(int index) const12330*5c90c05cSAndroid Build Coastguard Worker const TestPartResult& TestPartResultArray::GetTestPartResult(int index) const {
12331*5c90c05cSAndroid Build Coastguard Worker   if (index < 0 || index >= size()) {
12332*5c90c05cSAndroid Build Coastguard Worker     printf("\nInvalid index (%d) into TestPartResultArray.\n", index);
12333*5c90c05cSAndroid Build Coastguard Worker     internal::posix::Abort();
12334*5c90c05cSAndroid Build Coastguard Worker   }
12335*5c90c05cSAndroid Build Coastguard Worker 
12336*5c90c05cSAndroid Build Coastguard Worker   return array_[static_cast<size_t>(index)];
12337*5c90c05cSAndroid Build Coastguard Worker }
12338*5c90c05cSAndroid Build Coastguard Worker 
12339*5c90c05cSAndroid Build Coastguard Worker // Returns the number of TestPartResult objects in the array.
size() const12340*5c90c05cSAndroid Build Coastguard Worker int TestPartResultArray::size() const {
12341*5c90c05cSAndroid Build Coastguard Worker   return static_cast<int>(array_.size());
12342*5c90c05cSAndroid Build Coastguard Worker }
12343*5c90c05cSAndroid Build Coastguard Worker 
12344*5c90c05cSAndroid Build Coastguard Worker namespace internal {
12345*5c90c05cSAndroid Build Coastguard Worker 
HasNewFatalFailureHelper()12346*5c90c05cSAndroid Build Coastguard Worker HasNewFatalFailureHelper::HasNewFatalFailureHelper()
12347*5c90c05cSAndroid Build Coastguard Worker     : has_new_fatal_failure_(false),
12348*5c90c05cSAndroid Build Coastguard Worker       original_reporter_(GetUnitTestImpl()->
12349*5c90c05cSAndroid Build Coastguard Worker                          GetTestPartResultReporterForCurrentThread()) {
12350*5c90c05cSAndroid Build Coastguard Worker   GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(this);
12351*5c90c05cSAndroid Build Coastguard Worker }
12352*5c90c05cSAndroid Build Coastguard Worker 
~HasNewFatalFailureHelper()12353*5c90c05cSAndroid Build Coastguard Worker HasNewFatalFailureHelper::~HasNewFatalFailureHelper() {
12354*5c90c05cSAndroid Build Coastguard Worker   GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(
12355*5c90c05cSAndroid Build Coastguard Worker       original_reporter_);
12356*5c90c05cSAndroid Build Coastguard Worker }
12357*5c90c05cSAndroid Build Coastguard Worker 
ReportTestPartResult(const TestPartResult & result)12358*5c90c05cSAndroid Build Coastguard Worker void HasNewFatalFailureHelper::ReportTestPartResult(
12359*5c90c05cSAndroid Build Coastguard Worker     const TestPartResult& result) {
12360*5c90c05cSAndroid Build Coastguard Worker   if (result.fatally_failed())
12361*5c90c05cSAndroid Build Coastguard Worker     has_new_fatal_failure_ = true;
12362*5c90c05cSAndroid Build Coastguard Worker   original_reporter_->ReportTestPartResult(result);
12363*5c90c05cSAndroid Build Coastguard Worker }
12364*5c90c05cSAndroid Build Coastguard Worker 
12365*5c90c05cSAndroid Build Coastguard Worker }  // namespace internal
12366*5c90c05cSAndroid Build Coastguard Worker 
12367*5c90c05cSAndroid Build Coastguard Worker }  // namespace testing
12368*5c90c05cSAndroid Build Coastguard Worker // Copyright 2008 Google Inc.
12369*5c90c05cSAndroid Build Coastguard Worker // All Rights Reserved.
12370*5c90c05cSAndroid Build Coastguard Worker //
12371*5c90c05cSAndroid Build Coastguard Worker // Redistribution and use in source and binary forms, with or without
12372*5c90c05cSAndroid Build Coastguard Worker // modification, are permitted provided that the following conditions are
12373*5c90c05cSAndroid Build Coastguard Worker // met:
12374*5c90c05cSAndroid Build Coastguard Worker //
12375*5c90c05cSAndroid Build Coastguard Worker //     * Redistributions of source code must retain the above copyright
12376*5c90c05cSAndroid Build Coastguard Worker // notice, this list of conditions and the following disclaimer.
12377*5c90c05cSAndroid Build Coastguard Worker //     * Redistributions in binary form must reproduce the above
12378*5c90c05cSAndroid Build Coastguard Worker // copyright notice, this list of conditions and the following disclaimer
12379*5c90c05cSAndroid Build Coastguard Worker // in the documentation and/or other materials provided with the
12380*5c90c05cSAndroid Build Coastguard Worker // distribution.
12381*5c90c05cSAndroid Build Coastguard Worker //     * Neither the name of Google Inc. nor the names of its
12382*5c90c05cSAndroid Build Coastguard Worker // contributors may be used to endorse or promote products derived from
12383*5c90c05cSAndroid Build Coastguard Worker // this software without specific prior written permission.
12384*5c90c05cSAndroid Build Coastguard Worker //
12385*5c90c05cSAndroid Build Coastguard Worker // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
12386*5c90c05cSAndroid Build Coastguard Worker // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
12387*5c90c05cSAndroid Build Coastguard Worker // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
12388*5c90c05cSAndroid Build Coastguard Worker // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
12389*5c90c05cSAndroid Build Coastguard Worker // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
12390*5c90c05cSAndroid Build Coastguard Worker // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
12391*5c90c05cSAndroid Build Coastguard Worker // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
12392*5c90c05cSAndroid Build Coastguard Worker // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
12393*5c90c05cSAndroid Build Coastguard Worker // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
12394*5c90c05cSAndroid Build Coastguard Worker // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
12395*5c90c05cSAndroid Build Coastguard Worker // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
12396*5c90c05cSAndroid Build Coastguard Worker 
12397*5c90c05cSAndroid Build Coastguard Worker 
12398*5c90c05cSAndroid Build Coastguard Worker 
12399*5c90c05cSAndroid Build Coastguard Worker 
12400*5c90c05cSAndroid Build Coastguard Worker namespace testing {
12401*5c90c05cSAndroid Build Coastguard Worker namespace internal {
12402*5c90c05cSAndroid Build Coastguard Worker 
12403*5c90c05cSAndroid Build Coastguard Worker // Skips to the first non-space char in str. Returns an empty string if str
12404*5c90c05cSAndroid Build Coastguard Worker // contains only whitespace characters.
SkipSpaces(const char * str)12405*5c90c05cSAndroid Build Coastguard Worker static const char* SkipSpaces(const char* str) {
12406*5c90c05cSAndroid Build Coastguard Worker   while (IsSpace(*str))
12407*5c90c05cSAndroid Build Coastguard Worker     str++;
12408*5c90c05cSAndroid Build Coastguard Worker   return str;
12409*5c90c05cSAndroid Build Coastguard Worker }
12410*5c90c05cSAndroid Build Coastguard Worker 
SplitIntoTestNames(const char * src)12411*5c90c05cSAndroid Build Coastguard Worker static std::vector<std::string> SplitIntoTestNames(const char* src) {
12412*5c90c05cSAndroid Build Coastguard Worker   std::vector<std::string> name_vec;
12413*5c90c05cSAndroid Build Coastguard Worker   src = SkipSpaces(src);
12414*5c90c05cSAndroid Build Coastguard Worker   for (; src != nullptr; src = SkipComma(src)) {
12415*5c90c05cSAndroid Build Coastguard Worker     name_vec.push_back(StripTrailingSpaces(GetPrefixUntilComma(src)));
12416*5c90c05cSAndroid Build Coastguard Worker   }
12417*5c90c05cSAndroid Build Coastguard Worker   return name_vec;
12418*5c90c05cSAndroid Build Coastguard Worker }
12419*5c90c05cSAndroid Build Coastguard Worker 
12420*5c90c05cSAndroid Build Coastguard Worker // Verifies that registered_tests match the test names in
12421*5c90c05cSAndroid Build Coastguard Worker // registered_tests_; returns registered_tests if successful, or
12422*5c90c05cSAndroid Build Coastguard Worker // aborts the program otherwise.
VerifyRegisteredTestNames(const char * test_suite_name,const char * file,int line,const char * registered_tests)12423*5c90c05cSAndroid Build Coastguard Worker const char* TypedTestSuitePState::VerifyRegisteredTestNames(
12424*5c90c05cSAndroid Build Coastguard Worker     const char* test_suite_name, const char* file, int line,
12425*5c90c05cSAndroid Build Coastguard Worker     const char* registered_tests) {
12426*5c90c05cSAndroid Build Coastguard Worker   RegisterTypeParameterizedTestSuite(test_suite_name, CodeLocation(file, line));
12427*5c90c05cSAndroid Build Coastguard Worker 
12428*5c90c05cSAndroid Build Coastguard Worker   typedef RegisteredTestsMap::const_iterator RegisteredTestIter;
12429*5c90c05cSAndroid Build Coastguard Worker   registered_ = true;
12430*5c90c05cSAndroid Build Coastguard Worker 
12431*5c90c05cSAndroid Build Coastguard Worker   std::vector<std::string> name_vec = SplitIntoTestNames(registered_tests);
12432*5c90c05cSAndroid Build Coastguard Worker 
12433*5c90c05cSAndroid Build Coastguard Worker   Message errors;
12434*5c90c05cSAndroid Build Coastguard Worker 
12435*5c90c05cSAndroid Build Coastguard Worker   std::set<std::string> tests;
12436*5c90c05cSAndroid Build Coastguard Worker   for (std::vector<std::string>::const_iterator name_it = name_vec.begin();
12437*5c90c05cSAndroid Build Coastguard Worker        name_it != name_vec.end(); ++name_it) {
12438*5c90c05cSAndroid Build Coastguard Worker     const std::string& name = *name_it;
12439*5c90c05cSAndroid Build Coastguard Worker     if (tests.count(name) != 0) {
12440*5c90c05cSAndroid Build Coastguard Worker       errors << "Test " << name << " is listed more than once.\n";
12441*5c90c05cSAndroid Build Coastguard Worker       continue;
12442*5c90c05cSAndroid Build Coastguard Worker     }
12443*5c90c05cSAndroid Build Coastguard Worker 
12444*5c90c05cSAndroid Build Coastguard Worker     if (registered_tests_.count(name) != 0) {
12445*5c90c05cSAndroid Build Coastguard Worker       tests.insert(name);
12446*5c90c05cSAndroid Build Coastguard Worker     } else {
12447*5c90c05cSAndroid Build Coastguard Worker       errors << "No test named " << name
12448*5c90c05cSAndroid Build Coastguard Worker              << " can be found in this test suite.\n";
12449*5c90c05cSAndroid Build Coastguard Worker     }
12450*5c90c05cSAndroid Build Coastguard Worker   }
12451*5c90c05cSAndroid Build Coastguard Worker 
12452*5c90c05cSAndroid Build Coastguard Worker   for (RegisteredTestIter it = registered_tests_.begin();
12453*5c90c05cSAndroid Build Coastguard Worker        it != registered_tests_.end();
12454*5c90c05cSAndroid Build Coastguard Worker        ++it) {
12455*5c90c05cSAndroid Build Coastguard Worker     if (tests.count(it->first) == 0) {
12456*5c90c05cSAndroid Build Coastguard Worker       errors << "You forgot to list test " << it->first << ".\n";
12457*5c90c05cSAndroid Build Coastguard Worker     }
12458*5c90c05cSAndroid Build Coastguard Worker   }
12459*5c90c05cSAndroid Build Coastguard Worker 
12460*5c90c05cSAndroid Build Coastguard Worker   const std::string& errors_str = errors.GetString();
12461*5c90c05cSAndroid Build Coastguard Worker   if (errors_str != "") {
12462*5c90c05cSAndroid Build Coastguard Worker     fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(),
12463*5c90c05cSAndroid Build Coastguard Worker             errors_str.c_str());
12464*5c90c05cSAndroid Build Coastguard Worker     fflush(stderr);
12465*5c90c05cSAndroid Build Coastguard Worker     posix::Abort();
12466*5c90c05cSAndroid Build Coastguard Worker   }
12467*5c90c05cSAndroid Build Coastguard Worker 
12468*5c90c05cSAndroid Build Coastguard Worker   return registered_tests;
12469*5c90c05cSAndroid Build Coastguard Worker }
12470*5c90c05cSAndroid Build Coastguard Worker 
12471*5c90c05cSAndroid Build Coastguard Worker }  // namespace internal
12472*5c90c05cSAndroid Build Coastguard Worker }  // namespace testing
12473*5c90c05cSAndroid Build Coastguard Worker // Copyright 2008, Google Inc.
12474*5c90c05cSAndroid Build Coastguard Worker // All rights reserved.
12475*5c90c05cSAndroid Build Coastguard Worker //
12476*5c90c05cSAndroid Build Coastguard Worker // Redistribution and use in source and binary forms, with or without
12477*5c90c05cSAndroid Build Coastguard Worker // modification, are permitted provided that the following conditions are
12478*5c90c05cSAndroid Build Coastguard Worker // met:
12479*5c90c05cSAndroid Build Coastguard Worker //
12480*5c90c05cSAndroid Build Coastguard Worker //     * Redistributions of source code must retain the above copyright
12481*5c90c05cSAndroid Build Coastguard Worker // notice, this list of conditions and the following disclaimer.
12482*5c90c05cSAndroid Build Coastguard Worker //     * Redistributions in binary form must reproduce the above
12483*5c90c05cSAndroid Build Coastguard Worker // copyright notice, this list of conditions and the following disclaimer
12484*5c90c05cSAndroid Build Coastguard Worker // in the documentation and/or other materials provided with the
12485*5c90c05cSAndroid Build Coastguard Worker // distribution.
12486*5c90c05cSAndroid Build Coastguard Worker //     * Neither the name of Google Inc. nor the names of its
12487*5c90c05cSAndroid Build Coastguard Worker // contributors may be used to endorse or promote products derived from
12488*5c90c05cSAndroid Build Coastguard Worker // this software without specific prior written permission.
12489*5c90c05cSAndroid Build Coastguard Worker //
12490*5c90c05cSAndroid Build Coastguard Worker // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
12491*5c90c05cSAndroid Build Coastguard Worker // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
12492*5c90c05cSAndroid Build Coastguard Worker // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
12493*5c90c05cSAndroid Build Coastguard Worker // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
12494*5c90c05cSAndroid Build Coastguard Worker // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
12495*5c90c05cSAndroid Build Coastguard Worker // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
12496*5c90c05cSAndroid Build Coastguard Worker // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
12497*5c90c05cSAndroid Build Coastguard Worker // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
12498*5c90c05cSAndroid Build Coastguard Worker // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
12499*5c90c05cSAndroid Build Coastguard Worker // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
12500*5c90c05cSAndroid Build Coastguard Worker // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
12501*5c90c05cSAndroid Build Coastguard Worker 
12502*5c90c05cSAndroid Build Coastguard Worker //
12503*5c90c05cSAndroid Build Coastguard Worker // Google C++ Mocking Framework (Google Mock)
12504*5c90c05cSAndroid Build Coastguard Worker //
12505*5c90c05cSAndroid Build Coastguard Worker // This file #includes all Google Mock implementation .cc files.  The
12506*5c90c05cSAndroid Build Coastguard Worker // purpose is to allow a user to build Google Mock by compiling this
12507*5c90c05cSAndroid Build Coastguard Worker // file alone.
12508*5c90c05cSAndroid Build Coastguard Worker 
12509*5c90c05cSAndroid Build Coastguard Worker // This line ensures that gmock.h can be compiled on its own, even
12510*5c90c05cSAndroid Build Coastguard Worker // when it's fused.
12511*5c90c05cSAndroid Build Coastguard Worker #include "gmock/gmock.h"
12512*5c90c05cSAndroid Build Coastguard Worker 
12513*5c90c05cSAndroid Build Coastguard Worker // The following lines pull in the real gmock *.cc files.
12514*5c90c05cSAndroid Build Coastguard Worker // Copyright 2007, Google Inc.
12515*5c90c05cSAndroid Build Coastguard Worker // All rights reserved.
12516*5c90c05cSAndroid Build Coastguard Worker //
12517*5c90c05cSAndroid Build Coastguard Worker // Redistribution and use in source and binary forms, with or without
12518*5c90c05cSAndroid Build Coastguard Worker // modification, are permitted provided that the following conditions are
12519*5c90c05cSAndroid Build Coastguard Worker // met:
12520*5c90c05cSAndroid Build Coastguard Worker //
12521*5c90c05cSAndroid Build Coastguard Worker //     * Redistributions of source code must retain the above copyright
12522*5c90c05cSAndroid Build Coastguard Worker // notice, this list of conditions and the following disclaimer.
12523*5c90c05cSAndroid Build Coastguard Worker //     * Redistributions in binary form must reproduce the above
12524*5c90c05cSAndroid Build Coastguard Worker // copyright notice, this list of conditions and the following disclaimer
12525*5c90c05cSAndroid Build Coastguard Worker // in the documentation and/or other materials provided with the
12526*5c90c05cSAndroid Build Coastguard Worker // distribution.
12527*5c90c05cSAndroid Build Coastguard Worker //     * Neither the name of Google Inc. nor the names of its
12528*5c90c05cSAndroid Build Coastguard Worker // contributors may be used to endorse or promote products derived from
12529*5c90c05cSAndroid Build Coastguard Worker // this software without specific prior written permission.
12530*5c90c05cSAndroid Build Coastguard Worker //
12531*5c90c05cSAndroid Build Coastguard Worker // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
12532*5c90c05cSAndroid Build Coastguard Worker // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
12533*5c90c05cSAndroid Build Coastguard Worker // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
12534*5c90c05cSAndroid Build Coastguard Worker // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
12535*5c90c05cSAndroid Build Coastguard Worker // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
12536*5c90c05cSAndroid Build Coastguard Worker // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
12537*5c90c05cSAndroid Build Coastguard Worker // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
12538*5c90c05cSAndroid Build Coastguard Worker // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
12539*5c90c05cSAndroid Build Coastguard Worker // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
12540*5c90c05cSAndroid Build Coastguard Worker // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
12541*5c90c05cSAndroid Build Coastguard Worker // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
12542*5c90c05cSAndroid Build Coastguard Worker 
12543*5c90c05cSAndroid Build Coastguard Worker 
12544*5c90c05cSAndroid Build Coastguard Worker // Google Mock - a framework for writing C++ mock classes.
12545*5c90c05cSAndroid Build Coastguard Worker //
12546*5c90c05cSAndroid Build Coastguard Worker // This file implements cardinalities.
12547*5c90c05cSAndroid Build Coastguard Worker 
12548*5c90c05cSAndroid Build Coastguard Worker 
12549*5c90c05cSAndroid Build Coastguard Worker #include <limits.h>
12550*5c90c05cSAndroid Build Coastguard Worker #include <ostream>  // NOLINT
12551*5c90c05cSAndroid Build Coastguard Worker #include <sstream>
12552*5c90c05cSAndroid Build Coastguard Worker #include <string>
12553*5c90c05cSAndroid Build Coastguard Worker 
12554*5c90c05cSAndroid Build Coastguard Worker namespace testing {
12555*5c90c05cSAndroid Build Coastguard Worker 
12556*5c90c05cSAndroid Build Coastguard Worker namespace {
12557*5c90c05cSAndroid Build Coastguard Worker 
12558*5c90c05cSAndroid Build Coastguard Worker // Implements the Between(m, n) cardinality.
12559*5c90c05cSAndroid Build Coastguard Worker class BetweenCardinalityImpl : public CardinalityInterface {
12560*5c90c05cSAndroid Build Coastguard Worker  public:
BetweenCardinalityImpl(int min,int max)12561*5c90c05cSAndroid Build Coastguard Worker   BetweenCardinalityImpl(int min, int max)
12562*5c90c05cSAndroid Build Coastguard Worker       : min_(min >= 0 ? min : 0),
12563*5c90c05cSAndroid Build Coastguard Worker         max_(max >= min_ ? max : min_) {
12564*5c90c05cSAndroid Build Coastguard Worker     std::stringstream ss;
12565*5c90c05cSAndroid Build Coastguard Worker     if (min < 0) {
12566*5c90c05cSAndroid Build Coastguard Worker       ss << "The invocation lower bound must be >= 0, "
12567*5c90c05cSAndroid Build Coastguard Worker          << "but is actually " << min << ".";
12568*5c90c05cSAndroid Build Coastguard Worker       internal::Expect(false, __FILE__, __LINE__, ss.str());
12569*5c90c05cSAndroid Build Coastguard Worker     } else if (max < 0) {
12570*5c90c05cSAndroid Build Coastguard Worker       ss << "The invocation upper bound must be >= 0, "
12571*5c90c05cSAndroid Build Coastguard Worker          << "but is actually " << max << ".";
12572*5c90c05cSAndroid Build Coastguard Worker       internal::Expect(false, __FILE__, __LINE__, ss.str());
12573*5c90c05cSAndroid Build Coastguard Worker     } else if (min > max) {
12574*5c90c05cSAndroid Build Coastguard Worker       ss << "The invocation upper bound (" << max
12575*5c90c05cSAndroid Build Coastguard Worker          << ") must be >= the invocation lower bound (" << min
12576*5c90c05cSAndroid Build Coastguard Worker          << ").";
12577*5c90c05cSAndroid Build Coastguard Worker       internal::Expect(false, __FILE__, __LINE__, ss.str());
12578*5c90c05cSAndroid Build Coastguard Worker     }
12579*5c90c05cSAndroid Build Coastguard Worker   }
12580*5c90c05cSAndroid Build Coastguard Worker 
12581*5c90c05cSAndroid Build Coastguard Worker   // Conservative estimate on the lower/upper bound of the number of
12582*5c90c05cSAndroid Build Coastguard Worker   // calls allowed.
ConservativeLowerBound() const12583*5c90c05cSAndroid Build Coastguard Worker   int ConservativeLowerBound() const override { return min_; }
ConservativeUpperBound() const12584*5c90c05cSAndroid Build Coastguard Worker   int ConservativeUpperBound() const override { return max_; }
12585*5c90c05cSAndroid Build Coastguard Worker 
IsSatisfiedByCallCount(int call_count) const12586*5c90c05cSAndroid Build Coastguard Worker   bool IsSatisfiedByCallCount(int call_count) const override {
12587*5c90c05cSAndroid Build Coastguard Worker     return min_ <= call_count && call_count <= max_;
12588*5c90c05cSAndroid Build Coastguard Worker   }
12589*5c90c05cSAndroid Build Coastguard Worker 
IsSaturatedByCallCount(int call_count) const12590*5c90c05cSAndroid Build Coastguard Worker   bool IsSaturatedByCallCount(int call_count) const override {
12591*5c90c05cSAndroid Build Coastguard Worker     return call_count >= max_;
12592*5c90c05cSAndroid Build Coastguard Worker   }
12593*5c90c05cSAndroid Build Coastguard Worker 
12594*5c90c05cSAndroid Build Coastguard Worker   void DescribeTo(::std::ostream* os) const override;
12595*5c90c05cSAndroid Build Coastguard Worker 
12596*5c90c05cSAndroid Build Coastguard Worker  private:
12597*5c90c05cSAndroid Build Coastguard Worker   const int min_;
12598*5c90c05cSAndroid Build Coastguard Worker   const int max_;
12599*5c90c05cSAndroid Build Coastguard Worker 
12600*5c90c05cSAndroid Build Coastguard Worker   GTEST_DISALLOW_COPY_AND_ASSIGN_(BetweenCardinalityImpl);
12601*5c90c05cSAndroid Build Coastguard Worker };
12602*5c90c05cSAndroid Build Coastguard Worker 
12603*5c90c05cSAndroid Build Coastguard Worker // Formats "n times" in a human-friendly way.
FormatTimes(int n)12604*5c90c05cSAndroid Build Coastguard Worker inline std::string FormatTimes(int n) {
12605*5c90c05cSAndroid Build Coastguard Worker   if (n == 1) {
12606*5c90c05cSAndroid Build Coastguard Worker     return "once";
12607*5c90c05cSAndroid Build Coastguard Worker   } else if (n == 2) {
12608*5c90c05cSAndroid Build Coastguard Worker     return "twice";
12609*5c90c05cSAndroid Build Coastguard Worker   } else {
12610*5c90c05cSAndroid Build Coastguard Worker     std::stringstream ss;
12611*5c90c05cSAndroid Build Coastguard Worker     ss << n << " times";
12612*5c90c05cSAndroid Build Coastguard Worker     return ss.str();
12613*5c90c05cSAndroid Build Coastguard Worker   }
12614*5c90c05cSAndroid Build Coastguard Worker }
12615*5c90c05cSAndroid Build Coastguard Worker 
12616*5c90c05cSAndroid Build Coastguard Worker // Describes the Between(m, n) cardinality in human-friendly text.
DescribeTo(::std::ostream * os) const12617*5c90c05cSAndroid Build Coastguard Worker void BetweenCardinalityImpl::DescribeTo(::std::ostream* os) const {
12618*5c90c05cSAndroid Build Coastguard Worker   if (min_ == 0) {
12619*5c90c05cSAndroid Build Coastguard Worker     if (max_ == 0) {
12620*5c90c05cSAndroid Build Coastguard Worker       *os << "never called";
12621*5c90c05cSAndroid Build Coastguard Worker     } else if (max_ == INT_MAX) {
12622*5c90c05cSAndroid Build Coastguard Worker       *os << "called any number of times";
12623*5c90c05cSAndroid Build Coastguard Worker     } else {
12624*5c90c05cSAndroid Build Coastguard Worker       *os << "called at most " << FormatTimes(max_);
12625*5c90c05cSAndroid Build Coastguard Worker     }
12626*5c90c05cSAndroid Build Coastguard Worker   } else if (min_ == max_) {
12627*5c90c05cSAndroid Build Coastguard Worker     *os << "called " << FormatTimes(min_);
12628*5c90c05cSAndroid Build Coastguard Worker   } else if (max_ == INT_MAX) {
12629*5c90c05cSAndroid Build Coastguard Worker     *os << "called at least " << FormatTimes(min_);
12630*5c90c05cSAndroid Build Coastguard Worker   } else {
12631*5c90c05cSAndroid Build Coastguard Worker     // 0 < min_ < max_ < INT_MAX
12632*5c90c05cSAndroid Build Coastguard Worker     *os << "called between " << min_ << " and " << max_ << " times";
12633*5c90c05cSAndroid Build Coastguard Worker   }
12634*5c90c05cSAndroid Build Coastguard Worker }
12635*5c90c05cSAndroid Build Coastguard Worker 
12636*5c90c05cSAndroid Build Coastguard Worker }  // Unnamed namespace
12637*5c90c05cSAndroid Build Coastguard Worker 
12638*5c90c05cSAndroid Build Coastguard Worker // Describes the given call count to an ostream.
DescribeActualCallCountTo(int actual_call_count,::std::ostream * os)12639*5c90c05cSAndroid Build Coastguard Worker void Cardinality::DescribeActualCallCountTo(int actual_call_count,
12640*5c90c05cSAndroid Build Coastguard Worker                                             ::std::ostream* os) {
12641*5c90c05cSAndroid Build Coastguard Worker   if (actual_call_count > 0) {
12642*5c90c05cSAndroid Build Coastguard Worker     *os << "called " << FormatTimes(actual_call_count);
12643*5c90c05cSAndroid Build Coastguard Worker   } else {
12644*5c90c05cSAndroid Build Coastguard Worker     *os << "never called";
12645*5c90c05cSAndroid Build Coastguard Worker   }
12646*5c90c05cSAndroid Build Coastguard Worker }
12647*5c90c05cSAndroid Build Coastguard Worker 
12648*5c90c05cSAndroid Build Coastguard Worker // Creates a cardinality that allows at least n calls.
AtLeast(int n)12649*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ Cardinality AtLeast(int n) { return Between(n, INT_MAX); }
12650*5c90c05cSAndroid Build Coastguard Worker 
12651*5c90c05cSAndroid Build Coastguard Worker // Creates a cardinality that allows at most n calls.
AtMost(int n)12652*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ Cardinality AtMost(int n) { return Between(0, n); }
12653*5c90c05cSAndroid Build Coastguard Worker 
12654*5c90c05cSAndroid Build Coastguard Worker // Creates a cardinality that allows any number of calls.
AnyNumber()12655*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ Cardinality AnyNumber() { return AtLeast(0); }
12656*5c90c05cSAndroid Build Coastguard Worker 
12657*5c90c05cSAndroid Build Coastguard Worker // Creates a cardinality that allows between min and max calls.
Between(int min,int max)12658*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ Cardinality Between(int min, int max) {
12659*5c90c05cSAndroid Build Coastguard Worker   return Cardinality(new BetweenCardinalityImpl(min, max));
12660*5c90c05cSAndroid Build Coastguard Worker }
12661*5c90c05cSAndroid Build Coastguard Worker 
12662*5c90c05cSAndroid Build Coastguard Worker // Creates a cardinality that allows exactly n calls.
Exactly(int n)12663*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ Cardinality Exactly(int n) { return Between(n, n); }
12664*5c90c05cSAndroid Build Coastguard Worker 
12665*5c90c05cSAndroid Build Coastguard Worker }  // namespace testing
12666*5c90c05cSAndroid Build Coastguard Worker // Copyright 2007, Google Inc.
12667*5c90c05cSAndroid Build Coastguard Worker // All rights reserved.
12668*5c90c05cSAndroid Build Coastguard Worker //
12669*5c90c05cSAndroid Build Coastguard Worker // Redistribution and use in source and binary forms, with or without
12670*5c90c05cSAndroid Build Coastguard Worker // modification, are permitted provided that the following conditions are
12671*5c90c05cSAndroid Build Coastguard Worker // met:
12672*5c90c05cSAndroid Build Coastguard Worker //
12673*5c90c05cSAndroid Build Coastguard Worker //     * Redistributions of source code must retain the above copyright
12674*5c90c05cSAndroid Build Coastguard Worker // notice, this list of conditions and the following disclaimer.
12675*5c90c05cSAndroid Build Coastguard Worker //     * Redistributions in binary form must reproduce the above
12676*5c90c05cSAndroid Build Coastguard Worker // copyright notice, this list of conditions and the following disclaimer
12677*5c90c05cSAndroid Build Coastguard Worker // in the documentation and/or other materials provided with the
12678*5c90c05cSAndroid Build Coastguard Worker // distribution.
12679*5c90c05cSAndroid Build Coastguard Worker //     * Neither the name of Google Inc. nor the names of its
12680*5c90c05cSAndroid Build Coastguard Worker // contributors may be used to endorse or promote products derived from
12681*5c90c05cSAndroid Build Coastguard Worker // this software without specific prior written permission.
12682*5c90c05cSAndroid Build Coastguard Worker //
12683*5c90c05cSAndroid Build Coastguard Worker // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
12684*5c90c05cSAndroid Build Coastguard Worker // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
12685*5c90c05cSAndroid Build Coastguard Worker // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
12686*5c90c05cSAndroid Build Coastguard Worker // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
12687*5c90c05cSAndroid Build Coastguard Worker // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
12688*5c90c05cSAndroid Build Coastguard Worker // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
12689*5c90c05cSAndroid Build Coastguard Worker // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
12690*5c90c05cSAndroid Build Coastguard Worker // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
12691*5c90c05cSAndroid Build Coastguard Worker // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
12692*5c90c05cSAndroid Build Coastguard Worker // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
12693*5c90c05cSAndroid Build Coastguard Worker // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
12694*5c90c05cSAndroid Build Coastguard Worker 
12695*5c90c05cSAndroid Build Coastguard Worker 
12696*5c90c05cSAndroid Build Coastguard Worker // Google Mock - a framework for writing C++ mock classes.
12697*5c90c05cSAndroid Build Coastguard Worker //
12698*5c90c05cSAndroid Build Coastguard Worker // This file defines some utilities useful for implementing Google
12699*5c90c05cSAndroid Build Coastguard Worker // Mock.  They are subject to change without notice, so please DO NOT
12700*5c90c05cSAndroid Build Coastguard Worker // USE THEM IN USER CODE.
12701*5c90c05cSAndroid Build Coastguard Worker 
12702*5c90c05cSAndroid Build Coastguard Worker 
12703*5c90c05cSAndroid Build Coastguard Worker #include <ctype.h>
12704*5c90c05cSAndroid Build Coastguard Worker #include <ostream>  // NOLINT
12705*5c90c05cSAndroid Build Coastguard Worker #include <string>
12706*5c90c05cSAndroid Build Coastguard Worker 
12707*5c90c05cSAndroid Build Coastguard Worker namespace testing {
12708*5c90c05cSAndroid Build Coastguard Worker namespace internal {
12709*5c90c05cSAndroid Build Coastguard Worker 
12710*5c90c05cSAndroid Build Coastguard Worker // Joins a vector of strings as if they are fields of a tuple; returns
12711*5c90c05cSAndroid Build Coastguard Worker // the joined string.
JoinAsTuple(const Strings & fields)12712*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ std::string JoinAsTuple(const Strings& fields) {
12713*5c90c05cSAndroid Build Coastguard Worker   switch (fields.size()) {
12714*5c90c05cSAndroid Build Coastguard Worker     case 0:
12715*5c90c05cSAndroid Build Coastguard Worker       return "";
12716*5c90c05cSAndroid Build Coastguard Worker     case 1:
12717*5c90c05cSAndroid Build Coastguard Worker       return fields[0];
12718*5c90c05cSAndroid Build Coastguard Worker     default:
12719*5c90c05cSAndroid Build Coastguard Worker       std::string result = "(" + fields[0];
12720*5c90c05cSAndroid Build Coastguard Worker       for (size_t i = 1; i < fields.size(); i++) {
12721*5c90c05cSAndroid Build Coastguard Worker         result += ", ";
12722*5c90c05cSAndroid Build Coastguard Worker         result += fields[i];
12723*5c90c05cSAndroid Build Coastguard Worker       }
12724*5c90c05cSAndroid Build Coastguard Worker       result += ")";
12725*5c90c05cSAndroid Build Coastguard Worker       return result;
12726*5c90c05cSAndroid Build Coastguard Worker   }
12727*5c90c05cSAndroid Build Coastguard Worker }
12728*5c90c05cSAndroid Build Coastguard Worker 
12729*5c90c05cSAndroid Build Coastguard Worker // Converts an identifier name to a space-separated list of lower-case
12730*5c90c05cSAndroid Build Coastguard Worker // words.  Each maximum substring of the form [A-Za-z][a-z]*|\d+ is
12731*5c90c05cSAndroid Build Coastguard Worker // treated as one word.  For example, both "FooBar123" and
12732*5c90c05cSAndroid Build Coastguard Worker // "foo_bar_123" are converted to "foo bar 123".
ConvertIdentifierNameToWords(const char * id_name)12733*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ std::string ConvertIdentifierNameToWords(const char* id_name) {
12734*5c90c05cSAndroid Build Coastguard Worker   std::string result;
12735*5c90c05cSAndroid Build Coastguard Worker   char prev_char = '\0';
12736*5c90c05cSAndroid Build Coastguard Worker   for (const char* p = id_name; *p != '\0'; prev_char = *(p++)) {
12737*5c90c05cSAndroid Build Coastguard Worker     // We don't care about the current locale as the input is
12738*5c90c05cSAndroid Build Coastguard Worker     // guaranteed to be a valid C++ identifier name.
12739*5c90c05cSAndroid Build Coastguard Worker     const bool starts_new_word = IsUpper(*p) ||
12740*5c90c05cSAndroid Build Coastguard Worker         (!IsAlpha(prev_char) && IsLower(*p)) ||
12741*5c90c05cSAndroid Build Coastguard Worker         (!IsDigit(prev_char) && IsDigit(*p));
12742*5c90c05cSAndroid Build Coastguard Worker 
12743*5c90c05cSAndroid Build Coastguard Worker     if (IsAlNum(*p)) {
12744*5c90c05cSAndroid Build Coastguard Worker       if (starts_new_word && result != "")
12745*5c90c05cSAndroid Build Coastguard Worker         result += ' ';
12746*5c90c05cSAndroid Build Coastguard Worker       result += ToLower(*p);
12747*5c90c05cSAndroid Build Coastguard Worker     }
12748*5c90c05cSAndroid Build Coastguard Worker   }
12749*5c90c05cSAndroid Build Coastguard Worker   return result;
12750*5c90c05cSAndroid Build Coastguard Worker }
12751*5c90c05cSAndroid Build Coastguard Worker 
12752*5c90c05cSAndroid Build Coastguard Worker // This class reports Google Mock failures as Google Test failures.  A
12753*5c90c05cSAndroid Build Coastguard Worker // user can define another class in a similar fashion if they intend to
12754*5c90c05cSAndroid Build Coastguard Worker // use Google Mock with a testing framework other than Google Test.
12755*5c90c05cSAndroid Build Coastguard Worker class GoogleTestFailureReporter : public FailureReporterInterface {
12756*5c90c05cSAndroid Build Coastguard Worker  public:
ReportFailure(FailureType type,const char * file,int line,const std::string & message)12757*5c90c05cSAndroid Build Coastguard Worker   void ReportFailure(FailureType type, const char* file, int line,
12758*5c90c05cSAndroid Build Coastguard Worker                      const std::string& message) override {
12759*5c90c05cSAndroid Build Coastguard Worker     AssertHelper(type == kFatal ?
12760*5c90c05cSAndroid Build Coastguard Worker                  TestPartResult::kFatalFailure :
12761*5c90c05cSAndroid Build Coastguard Worker                  TestPartResult::kNonFatalFailure,
12762*5c90c05cSAndroid Build Coastguard Worker                  file,
12763*5c90c05cSAndroid Build Coastguard Worker                  line,
12764*5c90c05cSAndroid Build Coastguard Worker                  message.c_str()) = Message();
12765*5c90c05cSAndroid Build Coastguard Worker     if (type == kFatal) {
12766*5c90c05cSAndroid Build Coastguard Worker       posix::Abort();
12767*5c90c05cSAndroid Build Coastguard Worker     }
12768*5c90c05cSAndroid Build Coastguard Worker   }
12769*5c90c05cSAndroid Build Coastguard Worker };
12770*5c90c05cSAndroid Build Coastguard Worker 
12771*5c90c05cSAndroid Build Coastguard Worker // Returns the global failure reporter.  Will create a
12772*5c90c05cSAndroid Build Coastguard Worker // GoogleTestFailureReporter and return it the first time called.
GetFailureReporter()12773*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ FailureReporterInterface* GetFailureReporter() {
12774*5c90c05cSAndroid Build Coastguard Worker   // Points to the global failure reporter used by Google Mock.  gcc
12775*5c90c05cSAndroid Build Coastguard Worker   // guarantees that the following use of failure_reporter is
12776*5c90c05cSAndroid Build Coastguard Worker   // thread-safe.  We may need to add additional synchronization to
12777*5c90c05cSAndroid Build Coastguard Worker   // protect failure_reporter if we port Google Mock to other
12778*5c90c05cSAndroid Build Coastguard Worker   // compilers.
12779*5c90c05cSAndroid Build Coastguard Worker   static FailureReporterInterface* const failure_reporter =
12780*5c90c05cSAndroid Build Coastguard Worker       new GoogleTestFailureReporter();
12781*5c90c05cSAndroid Build Coastguard Worker   return failure_reporter;
12782*5c90c05cSAndroid Build Coastguard Worker }
12783*5c90c05cSAndroid Build Coastguard Worker 
12784*5c90c05cSAndroid Build Coastguard Worker // Protects global resources (stdout in particular) used by Log().
12785*5c90c05cSAndroid Build Coastguard Worker static GTEST_DEFINE_STATIC_MUTEX_(g_log_mutex);
12786*5c90c05cSAndroid Build Coastguard Worker 
12787*5c90c05cSAndroid Build Coastguard Worker // Returns true if and only if a log with the given severity is visible
12788*5c90c05cSAndroid Build Coastguard Worker // according to the --gmock_verbose flag.
LogIsVisible(LogSeverity severity)12789*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ bool LogIsVisible(LogSeverity severity) {
12790*5c90c05cSAndroid Build Coastguard Worker   if (GMOCK_FLAG(verbose) == kInfoVerbosity) {
12791*5c90c05cSAndroid Build Coastguard Worker     // Always show the log if --gmock_verbose=info.
12792*5c90c05cSAndroid Build Coastguard Worker     return true;
12793*5c90c05cSAndroid Build Coastguard Worker   } else if (GMOCK_FLAG(verbose) == kErrorVerbosity) {
12794*5c90c05cSAndroid Build Coastguard Worker     // Always hide it if --gmock_verbose=error.
12795*5c90c05cSAndroid Build Coastguard Worker     return false;
12796*5c90c05cSAndroid Build Coastguard Worker   } else {
12797*5c90c05cSAndroid Build Coastguard Worker     // If --gmock_verbose is neither "info" nor "error", we treat it
12798*5c90c05cSAndroid Build Coastguard Worker     // as "warning" (its default value).
12799*5c90c05cSAndroid Build Coastguard Worker     return severity == kWarning;
12800*5c90c05cSAndroid Build Coastguard Worker   }
12801*5c90c05cSAndroid Build Coastguard Worker }
12802*5c90c05cSAndroid Build Coastguard Worker 
12803*5c90c05cSAndroid Build Coastguard Worker // Prints the given message to stdout if and only if 'severity' >= the level
12804*5c90c05cSAndroid Build Coastguard Worker // specified by the --gmock_verbose flag.  If stack_frames_to_skip >=
12805*5c90c05cSAndroid Build Coastguard Worker // 0, also prints the stack trace excluding the top
12806*5c90c05cSAndroid Build Coastguard Worker // stack_frames_to_skip frames.  In opt mode, any positive
12807*5c90c05cSAndroid Build Coastguard Worker // stack_frames_to_skip is treated as 0, since we don't know which
12808*5c90c05cSAndroid Build Coastguard Worker // function calls will be inlined by the compiler and need to be
12809*5c90c05cSAndroid Build Coastguard Worker // conservative.
Log(LogSeverity severity,const std::string & message,int stack_frames_to_skip)12810*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ void Log(LogSeverity severity, const std::string& message,
12811*5c90c05cSAndroid Build Coastguard Worker                     int stack_frames_to_skip) {
12812*5c90c05cSAndroid Build Coastguard Worker   if (!LogIsVisible(severity))
12813*5c90c05cSAndroid Build Coastguard Worker     return;
12814*5c90c05cSAndroid Build Coastguard Worker 
12815*5c90c05cSAndroid Build Coastguard Worker   // Ensures that logs from different threads don't interleave.
12816*5c90c05cSAndroid Build Coastguard Worker   MutexLock l(&g_log_mutex);
12817*5c90c05cSAndroid Build Coastguard Worker 
12818*5c90c05cSAndroid Build Coastguard Worker   if (severity == kWarning) {
12819*5c90c05cSAndroid Build Coastguard Worker     // Prints a GMOCK WARNING marker to make the warnings easily searchable.
12820*5c90c05cSAndroid Build Coastguard Worker     std::cout << "\nGMOCK WARNING:";
12821*5c90c05cSAndroid Build Coastguard Worker   }
12822*5c90c05cSAndroid Build Coastguard Worker   // Pre-pends a new-line to message if it doesn't start with one.
12823*5c90c05cSAndroid Build Coastguard Worker   if (message.empty() || message[0] != '\n') {
12824*5c90c05cSAndroid Build Coastguard Worker     std::cout << "\n";
12825*5c90c05cSAndroid Build Coastguard Worker   }
12826*5c90c05cSAndroid Build Coastguard Worker   std::cout << message;
12827*5c90c05cSAndroid Build Coastguard Worker   if (stack_frames_to_skip >= 0) {
12828*5c90c05cSAndroid Build Coastguard Worker #ifdef NDEBUG
12829*5c90c05cSAndroid Build Coastguard Worker     // In opt mode, we have to be conservative and skip no stack frame.
12830*5c90c05cSAndroid Build Coastguard Worker     const int actual_to_skip = 0;
12831*5c90c05cSAndroid Build Coastguard Worker #else
12832*5c90c05cSAndroid Build Coastguard Worker     // In dbg mode, we can do what the caller tell us to do (plus one
12833*5c90c05cSAndroid Build Coastguard Worker     // for skipping this function's stack frame).
12834*5c90c05cSAndroid Build Coastguard Worker     const int actual_to_skip = stack_frames_to_skip + 1;
12835*5c90c05cSAndroid Build Coastguard Worker #endif  // NDEBUG
12836*5c90c05cSAndroid Build Coastguard Worker 
12837*5c90c05cSAndroid Build Coastguard Worker     // Appends a new-line to message if it doesn't end with one.
12838*5c90c05cSAndroid Build Coastguard Worker     if (!message.empty() && *message.rbegin() != '\n') {
12839*5c90c05cSAndroid Build Coastguard Worker       std::cout << "\n";
12840*5c90c05cSAndroid Build Coastguard Worker     }
12841*5c90c05cSAndroid Build Coastguard Worker     std::cout << "Stack trace:\n"
12842*5c90c05cSAndroid Build Coastguard Worker          << ::testing::internal::GetCurrentOsStackTraceExceptTop(
12843*5c90c05cSAndroid Build Coastguard Worker              ::testing::UnitTest::GetInstance(), actual_to_skip);
12844*5c90c05cSAndroid Build Coastguard Worker   }
12845*5c90c05cSAndroid Build Coastguard Worker   std::cout << ::std::flush;
12846*5c90c05cSAndroid Build Coastguard Worker }
12847*5c90c05cSAndroid Build Coastguard Worker 
GetWithoutMatchers()12848*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ WithoutMatchers GetWithoutMatchers() { return WithoutMatchers(); }
12849*5c90c05cSAndroid Build Coastguard Worker 
IllegalDoDefault(const char * file,int line)12850*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ void IllegalDoDefault(const char* file, int line) {
12851*5c90c05cSAndroid Build Coastguard Worker   internal::Assert(
12852*5c90c05cSAndroid Build Coastguard Worker       false, file, line,
12853*5c90c05cSAndroid Build Coastguard Worker       "You are using DoDefault() inside a composite action like "
12854*5c90c05cSAndroid Build Coastguard Worker       "DoAll() or WithArgs().  This is not supported for technical "
12855*5c90c05cSAndroid Build Coastguard Worker       "reasons.  Please instead spell out the default action, or "
12856*5c90c05cSAndroid Build Coastguard Worker       "assign the default action to an Action variable and use "
12857*5c90c05cSAndroid Build Coastguard Worker       "the variable in various places.");
12858*5c90c05cSAndroid Build Coastguard Worker }
12859*5c90c05cSAndroid Build Coastguard Worker 
12860*5c90c05cSAndroid Build Coastguard Worker }  // namespace internal
12861*5c90c05cSAndroid Build Coastguard Worker }  // namespace testing
12862*5c90c05cSAndroid Build Coastguard Worker // Copyright 2007, Google Inc.
12863*5c90c05cSAndroid Build Coastguard Worker // All rights reserved.
12864*5c90c05cSAndroid Build Coastguard Worker //
12865*5c90c05cSAndroid Build Coastguard Worker // Redistribution and use in source and binary forms, with or without
12866*5c90c05cSAndroid Build Coastguard Worker // modification, are permitted provided that the following conditions are
12867*5c90c05cSAndroid Build Coastguard Worker // met:
12868*5c90c05cSAndroid Build Coastguard Worker //
12869*5c90c05cSAndroid Build Coastguard Worker //     * Redistributions of source code must retain the above copyright
12870*5c90c05cSAndroid Build Coastguard Worker // notice, this list of conditions and the following disclaimer.
12871*5c90c05cSAndroid Build Coastguard Worker //     * Redistributions in binary form must reproduce the above
12872*5c90c05cSAndroid Build Coastguard Worker // copyright notice, this list of conditions and the following disclaimer
12873*5c90c05cSAndroid Build Coastguard Worker // in the documentation and/or other materials provided with the
12874*5c90c05cSAndroid Build Coastguard Worker // distribution.
12875*5c90c05cSAndroid Build Coastguard Worker //     * Neither the name of Google Inc. nor the names of its
12876*5c90c05cSAndroid Build Coastguard Worker // contributors may be used to endorse or promote products derived from
12877*5c90c05cSAndroid Build Coastguard Worker // this software without specific prior written permission.
12878*5c90c05cSAndroid Build Coastguard Worker //
12879*5c90c05cSAndroid Build Coastguard Worker // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
12880*5c90c05cSAndroid Build Coastguard Worker // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
12881*5c90c05cSAndroid Build Coastguard Worker // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
12882*5c90c05cSAndroid Build Coastguard Worker // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
12883*5c90c05cSAndroid Build Coastguard Worker // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
12884*5c90c05cSAndroid Build Coastguard Worker // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
12885*5c90c05cSAndroid Build Coastguard Worker // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
12886*5c90c05cSAndroid Build Coastguard Worker // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
12887*5c90c05cSAndroid Build Coastguard Worker // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
12888*5c90c05cSAndroid Build Coastguard Worker // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
12889*5c90c05cSAndroid Build Coastguard Worker // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
12890*5c90c05cSAndroid Build Coastguard Worker 
12891*5c90c05cSAndroid Build Coastguard Worker 
12892*5c90c05cSAndroid Build Coastguard Worker // Google Mock - a framework for writing C++ mock classes.
12893*5c90c05cSAndroid Build Coastguard Worker //
12894*5c90c05cSAndroid Build Coastguard Worker // This file implements Matcher<const string&>, Matcher<string>, and
12895*5c90c05cSAndroid Build Coastguard Worker // utilities for defining matchers.
12896*5c90c05cSAndroid Build Coastguard Worker 
12897*5c90c05cSAndroid Build Coastguard Worker 
12898*5c90c05cSAndroid Build Coastguard Worker #include <string.h>
12899*5c90c05cSAndroid Build Coastguard Worker #include <iostream>
12900*5c90c05cSAndroid Build Coastguard Worker #include <sstream>
12901*5c90c05cSAndroid Build Coastguard Worker #include <string>
12902*5c90c05cSAndroid Build Coastguard Worker 
12903*5c90c05cSAndroid Build Coastguard Worker namespace testing {
12904*5c90c05cSAndroid Build Coastguard Worker namespace internal {
12905*5c90c05cSAndroid Build Coastguard Worker 
12906*5c90c05cSAndroid Build Coastguard Worker // Returns the description for a matcher defined using the MATCHER*()
12907*5c90c05cSAndroid Build Coastguard Worker // macro where the user-supplied description string is "", if
12908*5c90c05cSAndroid Build Coastguard Worker // 'negation' is false; otherwise returns the description of the
12909*5c90c05cSAndroid Build Coastguard Worker // negation of the matcher.  'param_values' contains a list of strings
12910*5c90c05cSAndroid Build Coastguard Worker // that are the print-out of the matcher's parameters.
FormatMatcherDescription(bool negation,const char * matcher_name,const Strings & param_values)12911*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ std::string FormatMatcherDescription(bool negation,
12912*5c90c05cSAndroid Build Coastguard Worker                                                 const char* matcher_name,
12913*5c90c05cSAndroid Build Coastguard Worker                                                 const Strings& param_values) {
12914*5c90c05cSAndroid Build Coastguard Worker   std::string result = ConvertIdentifierNameToWords(matcher_name);
12915*5c90c05cSAndroid Build Coastguard Worker   if (param_values.size() >= 1) result += " " + JoinAsTuple(param_values);
12916*5c90c05cSAndroid Build Coastguard Worker   return negation ? "not (" + result + ")" : result;
12917*5c90c05cSAndroid Build Coastguard Worker }
12918*5c90c05cSAndroid Build Coastguard Worker 
12919*5c90c05cSAndroid Build Coastguard Worker // FindMaxBipartiteMatching and its helper class.
12920*5c90c05cSAndroid Build Coastguard Worker //
12921*5c90c05cSAndroid Build Coastguard Worker // Uses the well-known Ford-Fulkerson max flow method to find a maximum
12922*5c90c05cSAndroid Build Coastguard Worker // bipartite matching. Flow is considered to be from left to right.
12923*5c90c05cSAndroid Build Coastguard Worker // There is an implicit source node that is connected to all of the left
12924*5c90c05cSAndroid Build Coastguard Worker // nodes, and an implicit sink node that is connected to all of the
12925*5c90c05cSAndroid Build Coastguard Worker // right nodes. All edges have unit capacity.
12926*5c90c05cSAndroid Build Coastguard Worker //
12927*5c90c05cSAndroid Build Coastguard Worker // Neither the flow graph nor the residual flow graph are represented
12928*5c90c05cSAndroid Build Coastguard Worker // explicitly. Instead, they are implied by the information in 'graph' and
12929*5c90c05cSAndroid Build Coastguard Worker // a vector<int> called 'left_' whose elements are initialized to the
12930*5c90c05cSAndroid Build Coastguard Worker // value kUnused. This represents the initial state of the algorithm,
12931*5c90c05cSAndroid Build Coastguard Worker // where the flow graph is empty, and the residual flow graph has the
12932*5c90c05cSAndroid Build Coastguard Worker // following edges:
12933*5c90c05cSAndroid Build Coastguard Worker //   - An edge from source to each left_ node
12934*5c90c05cSAndroid Build Coastguard Worker //   - An edge from each right_ node to sink
12935*5c90c05cSAndroid Build Coastguard Worker //   - An edge from each left_ node to each right_ node, if the
12936*5c90c05cSAndroid Build Coastguard Worker //     corresponding edge exists in 'graph'.
12937*5c90c05cSAndroid Build Coastguard Worker //
12938*5c90c05cSAndroid Build Coastguard Worker // When the TryAugment() method adds a flow, it sets left_[l] = r for some
12939*5c90c05cSAndroid Build Coastguard Worker // nodes l and r. This induces the following changes:
12940*5c90c05cSAndroid Build Coastguard Worker //   - The edges (source, l), (l, r), and (r, sink) are added to the
12941*5c90c05cSAndroid Build Coastguard Worker //     flow graph.
12942*5c90c05cSAndroid Build Coastguard Worker //   - The same three edges are removed from the residual flow graph.
12943*5c90c05cSAndroid Build Coastguard Worker //   - The reverse edges (l, source), (r, l), and (sink, r) are added
12944*5c90c05cSAndroid Build Coastguard Worker //     to the residual flow graph, which is a directional graph
12945*5c90c05cSAndroid Build Coastguard Worker //     representing unused flow capacity.
12946*5c90c05cSAndroid Build Coastguard Worker //
12947*5c90c05cSAndroid Build Coastguard Worker // When the method augments a flow (moving left_[l] from some r1 to some
12948*5c90c05cSAndroid Build Coastguard Worker // other r2), this can be thought of as "undoing" the above steps with
12949*5c90c05cSAndroid Build Coastguard Worker // respect to r1 and "redoing" them with respect to r2.
12950*5c90c05cSAndroid Build Coastguard Worker //
12951*5c90c05cSAndroid Build Coastguard Worker // It bears repeating that the flow graph and residual flow graph are
12952*5c90c05cSAndroid Build Coastguard Worker // never represented explicitly, but can be derived by looking at the
12953*5c90c05cSAndroid Build Coastguard Worker // information in 'graph' and in left_.
12954*5c90c05cSAndroid Build Coastguard Worker //
12955*5c90c05cSAndroid Build Coastguard Worker // As an optimization, there is a second vector<int> called right_ which
12956*5c90c05cSAndroid Build Coastguard Worker // does not provide any new information. Instead, it enables more
12957*5c90c05cSAndroid Build Coastguard Worker // efficient queries about edges entering or leaving the right-side nodes
12958*5c90c05cSAndroid Build Coastguard Worker // of the flow or residual flow graphs. The following invariants are
12959*5c90c05cSAndroid Build Coastguard Worker // maintained:
12960*5c90c05cSAndroid Build Coastguard Worker //
12961*5c90c05cSAndroid Build Coastguard Worker // left[l] == kUnused or right[left[l]] == l
12962*5c90c05cSAndroid Build Coastguard Worker // right[r] == kUnused or left[right[r]] == r
12963*5c90c05cSAndroid Build Coastguard Worker //
12964*5c90c05cSAndroid Build Coastguard Worker // . [ source ]                                        .
12965*5c90c05cSAndroid Build Coastguard Worker // .   |||                                             .
12966*5c90c05cSAndroid Build Coastguard Worker // .   |||                                             .
12967*5c90c05cSAndroid Build Coastguard Worker // .   ||\--> left[0]=1  ---\    right[0]=-1 ----\     .
12968*5c90c05cSAndroid Build Coastguard Worker // .   ||                   |                    |     .
12969*5c90c05cSAndroid Build Coastguard Worker // .   |\---> left[1]=-1    \--> right[1]=0  ---\|     .
12970*5c90c05cSAndroid Build Coastguard Worker // .   |                                        ||     .
12971*5c90c05cSAndroid Build Coastguard Worker // .   \----> left[2]=2  ------> right[2]=2  --\||     .
12972*5c90c05cSAndroid Build Coastguard Worker // .                                           |||     .
12973*5c90c05cSAndroid Build Coastguard Worker // .         elements           matchers       vvv     .
12974*5c90c05cSAndroid Build Coastguard Worker // .                                         [ sink ]  .
12975*5c90c05cSAndroid Build Coastguard Worker //
12976*5c90c05cSAndroid Build Coastguard Worker // See Also:
12977*5c90c05cSAndroid Build Coastguard Worker //   [1] Cormen, et al (2001). "Section 26.2: The Ford-Fulkerson method".
12978*5c90c05cSAndroid Build Coastguard Worker //       "Introduction to Algorithms (Second ed.)", pp. 651-664.
12979*5c90c05cSAndroid Build Coastguard Worker //   [2] "Ford-Fulkerson algorithm", Wikipedia,
12980*5c90c05cSAndroid Build Coastguard Worker //       'http://en.wikipedia.org/wiki/Ford%E2%80%93Fulkerson_algorithm'
12981*5c90c05cSAndroid Build Coastguard Worker class MaxBipartiteMatchState {
12982*5c90c05cSAndroid Build Coastguard Worker  public:
MaxBipartiteMatchState(const MatchMatrix & graph)12983*5c90c05cSAndroid Build Coastguard Worker   explicit MaxBipartiteMatchState(const MatchMatrix& graph)
12984*5c90c05cSAndroid Build Coastguard Worker       : graph_(&graph),
12985*5c90c05cSAndroid Build Coastguard Worker         left_(graph_->LhsSize(), kUnused),
12986*5c90c05cSAndroid Build Coastguard Worker         right_(graph_->RhsSize(), kUnused) {}
12987*5c90c05cSAndroid Build Coastguard Worker 
12988*5c90c05cSAndroid Build Coastguard Worker   // Returns the edges of a maximal match, each in the form {left, right}.
Compute()12989*5c90c05cSAndroid Build Coastguard Worker   ElementMatcherPairs Compute() {
12990*5c90c05cSAndroid Build Coastguard Worker     // 'seen' is used for path finding { 0: unseen, 1: seen }.
12991*5c90c05cSAndroid Build Coastguard Worker     ::std::vector<char> seen;
12992*5c90c05cSAndroid Build Coastguard Worker     // Searches the residual flow graph for a path from each left node to
12993*5c90c05cSAndroid Build Coastguard Worker     // the sink in the residual flow graph, and if one is found, add flow
12994*5c90c05cSAndroid Build Coastguard Worker     // to the graph. It's okay to search through the left nodes once. The
12995*5c90c05cSAndroid Build Coastguard Worker     // edge from the implicit source node to each previously-visited left
12996*5c90c05cSAndroid Build Coastguard Worker     // node will have flow if that left node has any path to the sink
12997*5c90c05cSAndroid Build Coastguard Worker     // whatsoever. Subsequent augmentations can only add flow to the
12998*5c90c05cSAndroid Build Coastguard Worker     // network, and cannot take away that previous flow unit from the source.
12999*5c90c05cSAndroid Build Coastguard Worker     // Since the source-to-left edge can only carry one flow unit (or,
13000*5c90c05cSAndroid Build Coastguard Worker     // each element can be matched to only one matcher), there is no need
13001*5c90c05cSAndroid Build Coastguard Worker     // to visit the left nodes more than once looking for augmented paths.
13002*5c90c05cSAndroid Build Coastguard Worker     // The flow is known to be possible or impossible by looking at the
13003*5c90c05cSAndroid Build Coastguard Worker     // node once.
13004*5c90c05cSAndroid Build Coastguard Worker     for (size_t ilhs = 0; ilhs < graph_->LhsSize(); ++ilhs) {
13005*5c90c05cSAndroid Build Coastguard Worker       // Reset the path-marking vector and try to find a path from
13006*5c90c05cSAndroid Build Coastguard Worker       // source to sink starting at the left_[ilhs] node.
13007*5c90c05cSAndroid Build Coastguard Worker       GTEST_CHECK_(left_[ilhs] == kUnused)
13008*5c90c05cSAndroid Build Coastguard Worker           << "ilhs: " << ilhs << ", left_[ilhs]: " << left_[ilhs];
13009*5c90c05cSAndroid Build Coastguard Worker       // 'seen' initialized to 'graph_->RhsSize()' copies of 0.
13010*5c90c05cSAndroid Build Coastguard Worker       seen.assign(graph_->RhsSize(), 0);
13011*5c90c05cSAndroid Build Coastguard Worker       TryAugment(ilhs, &seen);
13012*5c90c05cSAndroid Build Coastguard Worker     }
13013*5c90c05cSAndroid Build Coastguard Worker     ElementMatcherPairs result;
13014*5c90c05cSAndroid Build Coastguard Worker     for (size_t ilhs = 0; ilhs < left_.size(); ++ilhs) {
13015*5c90c05cSAndroid Build Coastguard Worker       size_t irhs = left_[ilhs];
13016*5c90c05cSAndroid Build Coastguard Worker       if (irhs == kUnused) continue;
13017*5c90c05cSAndroid Build Coastguard Worker       result.push_back(ElementMatcherPair(ilhs, irhs));
13018*5c90c05cSAndroid Build Coastguard Worker     }
13019*5c90c05cSAndroid Build Coastguard Worker     return result;
13020*5c90c05cSAndroid Build Coastguard Worker   }
13021*5c90c05cSAndroid Build Coastguard Worker 
13022*5c90c05cSAndroid Build Coastguard Worker  private:
13023*5c90c05cSAndroid Build Coastguard Worker   static const size_t kUnused = static_cast<size_t>(-1);
13024*5c90c05cSAndroid Build Coastguard Worker 
13025*5c90c05cSAndroid Build Coastguard Worker   // Perform a depth-first search from left node ilhs to the sink.  If a
13026*5c90c05cSAndroid Build Coastguard Worker   // path is found, flow is added to the network by linking the left and
13027*5c90c05cSAndroid Build Coastguard Worker   // right vector elements corresponding each segment of the path.
13028*5c90c05cSAndroid Build Coastguard Worker   // Returns true if a path to sink was found, which means that a unit of
13029*5c90c05cSAndroid Build Coastguard Worker   // flow was added to the network. The 'seen' vector elements correspond
13030*5c90c05cSAndroid Build Coastguard Worker   // to right nodes and are marked to eliminate cycles from the search.
13031*5c90c05cSAndroid Build Coastguard Worker   //
13032*5c90c05cSAndroid Build Coastguard Worker   // Left nodes will only be explored at most once because they
13033*5c90c05cSAndroid Build Coastguard Worker   // are accessible from at most one right node in the residual flow
13034*5c90c05cSAndroid Build Coastguard Worker   // graph.
13035*5c90c05cSAndroid Build Coastguard Worker   //
13036*5c90c05cSAndroid Build Coastguard Worker   // Note that left_[ilhs] is the only element of left_ that TryAugment will
13037*5c90c05cSAndroid Build Coastguard Worker   // potentially transition from kUnused to another value. Any other
13038*5c90c05cSAndroid Build Coastguard Worker   // left_ element holding kUnused before TryAugment will be holding it
13039*5c90c05cSAndroid Build Coastguard Worker   // when TryAugment returns.
13040*5c90c05cSAndroid Build Coastguard Worker   //
TryAugment(size_t ilhs,::std::vector<char> * seen)13041*5c90c05cSAndroid Build Coastguard Worker   bool TryAugment(size_t ilhs, ::std::vector<char>* seen) {
13042*5c90c05cSAndroid Build Coastguard Worker     for (size_t irhs = 0; irhs < graph_->RhsSize(); ++irhs) {
13043*5c90c05cSAndroid Build Coastguard Worker       if ((*seen)[irhs]) continue;
13044*5c90c05cSAndroid Build Coastguard Worker       if (!graph_->HasEdge(ilhs, irhs)) continue;
13045*5c90c05cSAndroid Build Coastguard Worker       // There's an available edge from ilhs to irhs.
13046*5c90c05cSAndroid Build Coastguard Worker       (*seen)[irhs] = 1;
13047*5c90c05cSAndroid Build Coastguard Worker       // Next a search is performed to determine whether
13048*5c90c05cSAndroid Build Coastguard Worker       // this edge is a dead end or leads to the sink.
13049*5c90c05cSAndroid Build Coastguard Worker       //
13050*5c90c05cSAndroid Build Coastguard Worker       // right_[irhs] == kUnused means that there is residual flow from
13051*5c90c05cSAndroid Build Coastguard Worker       // right node irhs to the sink, so we can use that to finish this
13052*5c90c05cSAndroid Build Coastguard Worker       // flow path and return success.
13053*5c90c05cSAndroid Build Coastguard Worker       //
13054*5c90c05cSAndroid Build Coastguard Worker       // Otherwise there is residual flow to some ilhs. We push flow
13055*5c90c05cSAndroid Build Coastguard Worker       // along that path and call ourselves recursively to see if this
13056*5c90c05cSAndroid Build Coastguard Worker       // ultimately leads to sink.
13057*5c90c05cSAndroid Build Coastguard Worker       if (right_[irhs] == kUnused || TryAugment(right_[irhs], seen)) {
13058*5c90c05cSAndroid Build Coastguard Worker         // Add flow from left_[ilhs] to right_[irhs].
13059*5c90c05cSAndroid Build Coastguard Worker         left_[ilhs] = irhs;
13060*5c90c05cSAndroid Build Coastguard Worker         right_[irhs] = ilhs;
13061*5c90c05cSAndroid Build Coastguard Worker         return true;
13062*5c90c05cSAndroid Build Coastguard Worker       }
13063*5c90c05cSAndroid Build Coastguard Worker     }
13064*5c90c05cSAndroid Build Coastguard Worker     return false;
13065*5c90c05cSAndroid Build Coastguard Worker   }
13066*5c90c05cSAndroid Build Coastguard Worker 
13067*5c90c05cSAndroid Build Coastguard Worker   const MatchMatrix* graph_;  // not owned
13068*5c90c05cSAndroid Build Coastguard Worker   // Each element of the left_ vector represents a left hand side node
13069*5c90c05cSAndroid Build Coastguard Worker   // (i.e. an element) and each element of right_ is a right hand side
13070*5c90c05cSAndroid Build Coastguard Worker   // node (i.e. a matcher). The values in the left_ vector indicate
13071*5c90c05cSAndroid Build Coastguard Worker   // outflow from that node to a node on the right_ side. The values
13072*5c90c05cSAndroid Build Coastguard Worker   // in the right_ indicate inflow, and specify which left_ node is
13073*5c90c05cSAndroid Build Coastguard Worker   // feeding that right_ node, if any. For example, left_[3] == 1 means
13074*5c90c05cSAndroid Build Coastguard Worker   // there's a flow from element #3 to matcher #1. Such a flow would also
13075*5c90c05cSAndroid Build Coastguard Worker   // be redundantly represented in the right_ vector as right_[1] == 3.
13076*5c90c05cSAndroid Build Coastguard Worker   // Elements of left_ and right_ are either kUnused or mutually
13077*5c90c05cSAndroid Build Coastguard Worker   // referent. Mutually referent means that left_[right_[i]] = i and
13078*5c90c05cSAndroid Build Coastguard Worker   // right_[left_[i]] = i.
13079*5c90c05cSAndroid Build Coastguard Worker   ::std::vector<size_t> left_;
13080*5c90c05cSAndroid Build Coastguard Worker   ::std::vector<size_t> right_;
13081*5c90c05cSAndroid Build Coastguard Worker };
13082*5c90c05cSAndroid Build Coastguard Worker 
13083*5c90c05cSAndroid Build Coastguard Worker const size_t MaxBipartiteMatchState::kUnused;
13084*5c90c05cSAndroid Build Coastguard Worker 
FindMaxBipartiteMatching(const MatchMatrix & g)13085*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ ElementMatcherPairs FindMaxBipartiteMatching(const MatchMatrix& g) {
13086*5c90c05cSAndroid Build Coastguard Worker   return MaxBipartiteMatchState(g).Compute();
13087*5c90c05cSAndroid Build Coastguard Worker }
13088*5c90c05cSAndroid Build Coastguard Worker 
LogElementMatcherPairVec(const ElementMatcherPairs & pairs,::std::ostream * stream)13089*5c90c05cSAndroid Build Coastguard Worker static void LogElementMatcherPairVec(const ElementMatcherPairs& pairs,
13090*5c90c05cSAndroid Build Coastguard Worker                                      ::std::ostream* stream) {
13091*5c90c05cSAndroid Build Coastguard Worker   typedef ElementMatcherPairs::const_iterator Iter;
13092*5c90c05cSAndroid Build Coastguard Worker   ::std::ostream& os = *stream;
13093*5c90c05cSAndroid Build Coastguard Worker   os << "{";
13094*5c90c05cSAndroid Build Coastguard Worker   const char* sep = "";
13095*5c90c05cSAndroid Build Coastguard Worker   for (Iter it = pairs.begin(); it != pairs.end(); ++it) {
13096*5c90c05cSAndroid Build Coastguard Worker     os << sep << "\n  ("
13097*5c90c05cSAndroid Build Coastguard Worker        << "element #" << it->first << ", "
13098*5c90c05cSAndroid Build Coastguard Worker        << "matcher #" << it->second << ")";
13099*5c90c05cSAndroid Build Coastguard Worker     sep = ",";
13100*5c90c05cSAndroid Build Coastguard Worker   }
13101*5c90c05cSAndroid Build Coastguard Worker   os << "\n}";
13102*5c90c05cSAndroid Build Coastguard Worker }
13103*5c90c05cSAndroid Build Coastguard Worker 
NextGraph()13104*5c90c05cSAndroid Build Coastguard Worker bool MatchMatrix::NextGraph() {
13105*5c90c05cSAndroid Build Coastguard Worker   for (size_t ilhs = 0; ilhs < LhsSize(); ++ilhs) {
13106*5c90c05cSAndroid Build Coastguard Worker     for (size_t irhs = 0; irhs < RhsSize(); ++irhs) {
13107*5c90c05cSAndroid Build Coastguard Worker       char& b = matched_[SpaceIndex(ilhs, irhs)];
13108*5c90c05cSAndroid Build Coastguard Worker       if (!b) {
13109*5c90c05cSAndroid Build Coastguard Worker         b = 1;
13110*5c90c05cSAndroid Build Coastguard Worker         return true;
13111*5c90c05cSAndroid Build Coastguard Worker       }
13112*5c90c05cSAndroid Build Coastguard Worker       b = 0;
13113*5c90c05cSAndroid Build Coastguard Worker     }
13114*5c90c05cSAndroid Build Coastguard Worker   }
13115*5c90c05cSAndroid Build Coastguard Worker   return false;
13116*5c90c05cSAndroid Build Coastguard Worker }
13117*5c90c05cSAndroid Build Coastguard Worker 
Randomize()13118*5c90c05cSAndroid Build Coastguard Worker void MatchMatrix::Randomize() {
13119*5c90c05cSAndroid Build Coastguard Worker   for (size_t ilhs = 0; ilhs < LhsSize(); ++ilhs) {
13120*5c90c05cSAndroid Build Coastguard Worker     for (size_t irhs = 0; irhs < RhsSize(); ++irhs) {
13121*5c90c05cSAndroid Build Coastguard Worker       char& b = matched_[SpaceIndex(ilhs, irhs)];
13122*5c90c05cSAndroid Build Coastguard Worker       b = static_cast<char>(rand() & 1);  // NOLINT
13123*5c90c05cSAndroid Build Coastguard Worker     }
13124*5c90c05cSAndroid Build Coastguard Worker   }
13125*5c90c05cSAndroid Build Coastguard Worker }
13126*5c90c05cSAndroid Build Coastguard Worker 
DebugString() const13127*5c90c05cSAndroid Build Coastguard Worker std::string MatchMatrix::DebugString() const {
13128*5c90c05cSAndroid Build Coastguard Worker   ::std::stringstream ss;
13129*5c90c05cSAndroid Build Coastguard Worker   const char* sep = "";
13130*5c90c05cSAndroid Build Coastguard Worker   for (size_t i = 0; i < LhsSize(); ++i) {
13131*5c90c05cSAndroid Build Coastguard Worker     ss << sep;
13132*5c90c05cSAndroid Build Coastguard Worker     for (size_t j = 0; j < RhsSize(); ++j) {
13133*5c90c05cSAndroid Build Coastguard Worker       ss << HasEdge(i, j);
13134*5c90c05cSAndroid Build Coastguard Worker     }
13135*5c90c05cSAndroid Build Coastguard Worker     sep = ";";
13136*5c90c05cSAndroid Build Coastguard Worker   }
13137*5c90c05cSAndroid Build Coastguard Worker   return ss.str();
13138*5c90c05cSAndroid Build Coastguard Worker }
13139*5c90c05cSAndroid Build Coastguard Worker 
DescribeToImpl(::std::ostream * os) const13140*5c90c05cSAndroid Build Coastguard Worker void UnorderedElementsAreMatcherImplBase::DescribeToImpl(
13141*5c90c05cSAndroid Build Coastguard Worker     ::std::ostream* os) const {
13142*5c90c05cSAndroid Build Coastguard Worker   switch (match_flags()) {
13143*5c90c05cSAndroid Build Coastguard Worker     case UnorderedMatcherRequire::ExactMatch:
13144*5c90c05cSAndroid Build Coastguard Worker       if (matcher_describers_.empty()) {
13145*5c90c05cSAndroid Build Coastguard Worker         *os << "is empty";
13146*5c90c05cSAndroid Build Coastguard Worker         return;
13147*5c90c05cSAndroid Build Coastguard Worker       }
13148*5c90c05cSAndroid Build Coastguard Worker       if (matcher_describers_.size() == 1) {
13149*5c90c05cSAndroid Build Coastguard Worker         *os << "has " << Elements(1) << " and that element ";
13150*5c90c05cSAndroid Build Coastguard Worker         matcher_describers_[0]->DescribeTo(os);
13151*5c90c05cSAndroid Build Coastguard Worker         return;
13152*5c90c05cSAndroid Build Coastguard Worker       }
13153*5c90c05cSAndroid Build Coastguard Worker       *os << "has " << Elements(matcher_describers_.size())
13154*5c90c05cSAndroid Build Coastguard Worker           << " and there exists some permutation of elements such that:\n";
13155*5c90c05cSAndroid Build Coastguard Worker       break;
13156*5c90c05cSAndroid Build Coastguard Worker     case UnorderedMatcherRequire::Superset:
13157*5c90c05cSAndroid Build Coastguard Worker       *os << "a surjection from elements to requirements exists such that:\n";
13158*5c90c05cSAndroid Build Coastguard Worker       break;
13159*5c90c05cSAndroid Build Coastguard Worker     case UnorderedMatcherRequire::Subset:
13160*5c90c05cSAndroid Build Coastguard Worker       *os << "an injection from elements to requirements exists such that:\n";
13161*5c90c05cSAndroid Build Coastguard Worker       break;
13162*5c90c05cSAndroid Build Coastguard Worker   }
13163*5c90c05cSAndroid Build Coastguard Worker 
13164*5c90c05cSAndroid Build Coastguard Worker   const char* sep = "";
13165*5c90c05cSAndroid Build Coastguard Worker   for (size_t i = 0; i != matcher_describers_.size(); ++i) {
13166*5c90c05cSAndroid Build Coastguard Worker     *os << sep;
13167*5c90c05cSAndroid Build Coastguard Worker     if (match_flags() == UnorderedMatcherRequire::ExactMatch) {
13168*5c90c05cSAndroid Build Coastguard Worker       *os << " - element #" << i << " ";
13169*5c90c05cSAndroid Build Coastguard Worker     } else {
13170*5c90c05cSAndroid Build Coastguard Worker       *os << " - an element ";
13171*5c90c05cSAndroid Build Coastguard Worker     }
13172*5c90c05cSAndroid Build Coastguard Worker     matcher_describers_[i]->DescribeTo(os);
13173*5c90c05cSAndroid Build Coastguard Worker     if (match_flags() == UnorderedMatcherRequire::ExactMatch) {
13174*5c90c05cSAndroid Build Coastguard Worker       sep = ", and\n";
13175*5c90c05cSAndroid Build Coastguard Worker     } else {
13176*5c90c05cSAndroid Build Coastguard Worker       sep = "\n";
13177*5c90c05cSAndroid Build Coastguard Worker     }
13178*5c90c05cSAndroid Build Coastguard Worker   }
13179*5c90c05cSAndroid Build Coastguard Worker }
13180*5c90c05cSAndroid Build Coastguard Worker 
DescribeNegationToImpl(::std::ostream * os) const13181*5c90c05cSAndroid Build Coastguard Worker void UnorderedElementsAreMatcherImplBase::DescribeNegationToImpl(
13182*5c90c05cSAndroid Build Coastguard Worker     ::std::ostream* os) const {
13183*5c90c05cSAndroid Build Coastguard Worker   switch (match_flags()) {
13184*5c90c05cSAndroid Build Coastguard Worker     case UnorderedMatcherRequire::ExactMatch:
13185*5c90c05cSAndroid Build Coastguard Worker       if (matcher_describers_.empty()) {
13186*5c90c05cSAndroid Build Coastguard Worker         *os << "isn't empty";
13187*5c90c05cSAndroid Build Coastguard Worker         return;
13188*5c90c05cSAndroid Build Coastguard Worker       }
13189*5c90c05cSAndroid Build Coastguard Worker       if (matcher_describers_.size() == 1) {
13190*5c90c05cSAndroid Build Coastguard Worker         *os << "doesn't have " << Elements(1) << ", or has " << Elements(1)
13191*5c90c05cSAndroid Build Coastguard Worker             << " that ";
13192*5c90c05cSAndroid Build Coastguard Worker         matcher_describers_[0]->DescribeNegationTo(os);
13193*5c90c05cSAndroid Build Coastguard Worker         return;
13194*5c90c05cSAndroid Build Coastguard Worker       }
13195*5c90c05cSAndroid Build Coastguard Worker       *os << "doesn't have " << Elements(matcher_describers_.size())
13196*5c90c05cSAndroid Build Coastguard Worker           << ", or there exists no permutation of elements such that:\n";
13197*5c90c05cSAndroid Build Coastguard Worker       break;
13198*5c90c05cSAndroid Build Coastguard Worker     case UnorderedMatcherRequire::Superset:
13199*5c90c05cSAndroid Build Coastguard Worker       *os << "no surjection from elements to requirements exists such that:\n";
13200*5c90c05cSAndroid Build Coastguard Worker       break;
13201*5c90c05cSAndroid Build Coastguard Worker     case UnorderedMatcherRequire::Subset:
13202*5c90c05cSAndroid Build Coastguard Worker       *os << "no injection from elements to requirements exists such that:\n";
13203*5c90c05cSAndroid Build Coastguard Worker       break;
13204*5c90c05cSAndroid Build Coastguard Worker   }
13205*5c90c05cSAndroid Build Coastguard Worker   const char* sep = "";
13206*5c90c05cSAndroid Build Coastguard Worker   for (size_t i = 0; i != matcher_describers_.size(); ++i) {
13207*5c90c05cSAndroid Build Coastguard Worker     *os << sep;
13208*5c90c05cSAndroid Build Coastguard Worker     if (match_flags() == UnorderedMatcherRequire::ExactMatch) {
13209*5c90c05cSAndroid Build Coastguard Worker       *os << " - element #" << i << " ";
13210*5c90c05cSAndroid Build Coastguard Worker     } else {
13211*5c90c05cSAndroid Build Coastguard Worker       *os << " - an element ";
13212*5c90c05cSAndroid Build Coastguard Worker     }
13213*5c90c05cSAndroid Build Coastguard Worker     matcher_describers_[i]->DescribeTo(os);
13214*5c90c05cSAndroid Build Coastguard Worker     if (match_flags() == UnorderedMatcherRequire::ExactMatch) {
13215*5c90c05cSAndroid Build Coastguard Worker       sep = ", and\n";
13216*5c90c05cSAndroid Build Coastguard Worker     } else {
13217*5c90c05cSAndroid Build Coastguard Worker       sep = "\n";
13218*5c90c05cSAndroid Build Coastguard Worker     }
13219*5c90c05cSAndroid Build Coastguard Worker   }
13220*5c90c05cSAndroid Build Coastguard Worker }
13221*5c90c05cSAndroid Build Coastguard Worker 
13222*5c90c05cSAndroid Build Coastguard Worker // Checks that all matchers match at least one element, and that all
13223*5c90c05cSAndroid Build Coastguard Worker // elements match at least one matcher. This enables faster matching
13224*5c90c05cSAndroid Build Coastguard Worker // and better error reporting.
13225*5c90c05cSAndroid Build Coastguard Worker // Returns false, writing an explanation to 'listener', if and only
13226*5c90c05cSAndroid Build Coastguard Worker // if the success criteria are not met.
VerifyMatchMatrix(const::std::vector<std::string> & element_printouts,const MatchMatrix & matrix,MatchResultListener * listener) const13227*5c90c05cSAndroid Build Coastguard Worker bool UnorderedElementsAreMatcherImplBase::VerifyMatchMatrix(
13228*5c90c05cSAndroid Build Coastguard Worker     const ::std::vector<std::string>& element_printouts,
13229*5c90c05cSAndroid Build Coastguard Worker     const MatchMatrix& matrix, MatchResultListener* listener) const {
13230*5c90c05cSAndroid Build Coastguard Worker   bool result = true;
13231*5c90c05cSAndroid Build Coastguard Worker   ::std::vector<char> element_matched(matrix.LhsSize(), 0);
13232*5c90c05cSAndroid Build Coastguard Worker   ::std::vector<char> matcher_matched(matrix.RhsSize(), 0);
13233*5c90c05cSAndroid Build Coastguard Worker 
13234*5c90c05cSAndroid Build Coastguard Worker   for (size_t ilhs = 0; ilhs < matrix.LhsSize(); ilhs++) {
13235*5c90c05cSAndroid Build Coastguard Worker     for (size_t irhs = 0; irhs < matrix.RhsSize(); irhs++) {
13236*5c90c05cSAndroid Build Coastguard Worker       char matched = matrix.HasEdge(ilhs, irhs);
13237*5c90c05cSAndroid Build Coastguard Worker       element_matched[ilhs] |= matched;
13238*5c90c05cSAndroid Build Coastguard Worker       matcher_matched[irhs] |= matched;
13239*5c90c05cSAndroid Build Coastguard Worker     }
13240*5c90c05cSAndroid Build Coastguard Worker   }
13241*5c90c05cSAndroid Build Coastguard Worker 
13242*5c90c05cSAndroid Build Coastguard Worker   if (match_flags() & UnorderedMatcherRequire::Superset) {
13243*5c90c05cSAndroid Build Coastguard Worker     const char* sep =
13244*5c90c05cSAndroid Build Coastguard Worker         "where the following matchers don't match any elements:\n";
13245*5c90c05cSAndroid Build Coastguard Worker     for (size_t mi = 0; mi < matcher_matched.size(); ++mi) {
13246*5c90c05cSAndroid Build Coastguard Worker       if (matcher_matched[mi]) continue;
13247*5c90c05cSAndroid Build Coastguard Worker       result = false;
13248*5c90c05cSAndroid Build Coastguard Worker       if (listener->IsInterested()) {
13249*5c90c05cSAndroid Build Coastguard Worker         *listener << sep << "matcher #" << mi << ": ";
13250*5c90c05cSAndroid Build Coastguard Worker         matcher_describers_[mi]->DescribeTo(listener->stream());
13251*5c90c05cSAndroid Build Coastguard Worker         sep = ",\n";
13252*5c90c05cSAndroid Build Coastguard Worker       }
13253*5c90c05cSAndroid Build Coastguard Worker     }
13254*5c90c05cSAndroid Build Coastguard Worker   }
13255*5c90c05cSAndroid Build Coastguard Worker 
13256*5c90c05cSAndroid Build Coastguard Worker   if (match_flags() & UnorderedMatcherRequire::Subset) {
13257*5c90c05cSAndroid Build Coastguard Worker     const char* sep =
13258*5c90c05cSAndroid Build Coastguard Worker         "where the following elements don't match any matchers:\n";
13259*5c90c05cSAndroid Build Coastguard Worker     const char* outer_sep = "";
13260*5c90c05cSAndroid Build Coastguard Worker     if (!result) {
13261*5c90c05cSAndroid Build Coastguard Worker       outer_sep = "\nand ";
13262*5c90c05cSAndroid Build Coastguard Worker     }
13263*5c90c05cSAndroid Build Coastguard Worker     for (size_t ei = 0; ei < element_matched.size(); ++ei) {
13264*5c90c05cSAndroid Build Coastguard Worker       if (element_matched[ei]) continue;
13265*5c90c05cSAndroid Build Coastguard Worker       result = false;
13266*5c90c05cSAndroid Build Coastguard Worker       if (listener->IsInterested()) {
13267*5c90c05cSAndroid Build Coastguard Worker         *listener << outer_sep << sep << "element #" << ei << ": "
13268*5c90c05cSAndroid Build Coastguard Worker                   << element_printouts[ei];
13269*5c90c05cSAndroid Build Coastguard Worker         sep = ",\n";
13270*5c90c05cSAndroid Build Coastguard Worker         outer_sep = "";
13271*5c90c05cSAndroid Build Coastguard Worker       }
13272*5c90c05cSAndroid Build Coastguard Worker     }
13273*5c90c05cSAndroid Build Coastguard Worker   }
13274*5c90c05cSAndroid Build Coastguard Worker   return result;
13275*5c90c05cSAndroid Build Coastguard Worker }
13276*5c90c05cSAndroid Build Coastguard Worker 
FindPairing(const MatchMatrix & matrix,MatchResultListener * listener) const13277*5c90c05cSAndroid Build Coastguard Worker bool UnorderedElementsAreMatcherImplBase::FindPairing(
13278*5c90c05cSAndroid Build Coastguard Worker     const MatchMatrix& matrix, MatchResultListener* listener) const {
13279*5c90c05cSAndroid Build Coastguard Worker   ElementMatcherPairs matches = FindMaxBipartiteMatching(matrix);
13280*5c90c05cSAndroid Build Coastguard Worker 
13281*5c90c05cSAndroid Build Coastguard Worker   size_t max_flow = matches.size();
13282*5c90c05cSAndroid Build Coastguard Worker   if ((match_flags() & UnorderedMatcherRequire::Superset) &&
13283*5c90c05cSAndroid Build Coastguard Worker       max_flow < matrix.RhsSize()) {
13284*5c90c05cSAndroid Build Coastguard Worker     if (listener->IsInterested()) {
13285*5c90c05cSAndroid Build Coastguard Worker       *listener << "where no permutation of the elements can satisfy all "
13286*5c90c05cSAndroid Build Coastguard Worker                    "matchers, and the closest match is "
13287*5c90c05cSAndroid Build Coastguard Worker                 << max_flow << " of " << matrix.RhsSize()
13288*5c90c05cSAndroid Build Coastguard Worker                 << " matchers with the pairings:\n";
13289*5c90c05cSAndroid Build Coastguard Worker       LogElementMatcherPairVec(matches, listener->stream());
13290*5c90c05cSAndroid Build Coastguard Worker     }
13291*5c90c05cSAndroid Build Coastguard Worker     return false;
13292*5c90c05cSAndroid Build Coastguard Worker   }
13293*5c90c05cSAndroid Build Coastguard Worker   if ((match_flags() & UnorderedMatcherRequire::Subset) &&
13294*5c90c05cSAndroid Build Coastguard Worker       max_flow < matrix.LhsSize()) {
13295*5c90c05cSAndroid Build Coastguard Worker     if (listener->IsInterested()) {
13296*5c90c05cSAndroid Build Coastguard Worker       *listener
13297*5c90c05cSAndroid Build Coastguard Worker           << "where not all elements can be matched, and the closest match is "
13298*5c90c05cSAndroid Build Coastguard Worker           << max_flow << " of " << matrix.RhsSize()
13299*5c90c05cSAndroid Build Coastguard Worker           << " matchers with the pairings:\n";
13300*5c90c05cSAndroid Build Coastguard Worker       LogElementMatcherPairVec(matches, listener->stream());
13301*5c90c05cSAndroid Build Coastguard Worker     }
13302*5c90c05cSAndroid Build Coastguard Worker     return false;
13303*5c90c05cSAndroid Build Coastguard Worker   }
13304*5c90c05cSAndroid Build Coastguard Worker 
13305*5c90c05cSAndroid Build Coastguard Worker   if (matches.size() > 1) {
13306*5c90c05cSAndroid Build Coastguard Worker     if (listener->IsInterested()) {
13307*5c90c05cSAndroid Build Coastguard Worker       const char* sep = "where:\n";
13308*5c90c05cSAndroid Build Coastguard Worker       for (size_t mi = 0; mi < matches.size(); ++mi) {
13309*5c90c05cSAndroid Build Coastguard Worker         *listener << sep << " - element #" << matches[mi].first
13310*5c90c05cSAndroid Build Coastguard Worker                   << " is matched by matcher #" << matches[mi].second;
13311*5c90c05cSAndroid Build Coastguard Worker         sep = ",\n";
13312*5c90c05cSAndroid Build Coastguard Worker       }
13313*5c90c05cSAndroid Build Coastguard Worker     }
13314*5c90c05cSAndroid Build Coastguard Worker   }
13315*5c90c05cSAndroid Build Coastguard Worker   return true;
13316*5c90c05cSAndroid Build Coastguard Worker }
13317*5c90c05cSAndroid Build Coastguard Worker 
13318*5c90c05cSAndroid Build Coastguard Worker }  // namespace internal
13319*5c90c05cSAndroid Build Coastguard Worker }  // namespace testing
13320*5c90c05cSAndroid Build Coastguard Worker // Copyright 2007, Google Inc.
13321*5c90c05cSAndroid Build Coastguard Worker // All rights reserved.
13322*5c90c05cSAndroid Build Coastguard Worker //
13323*5c90c05cSAndroid Build Coastguard Worker // Redistribution and use in source and binary forms, with or without
13324*5c90c05cSAndroid Build Coastguard Worker // modification, are permitted provided that the following conditions are
13325*5c90c05cSAndroid Build Coastguard Worker // met:
13326*5c90c05cSAndroid Build Coastguard Worker //
13327*5c90c05cSAndroid Build Coastguard Worker //     * Redistributions of source code must retain the above copyright
13328*5c90c05cSAndroid Build Coastguard Worker // notice, this list of conditions and the following disclaimer.
13329*5c90c05cSAndroid Build Coastguard Worker //     * Redistributions in binary form must reproduce the above
13330*5c90c05cSAndroid Build Coastguard Worker // copyright notice, this list of conditions and the following disclaimer
13331*5c90c05cSAndroid Build Coastguard Worker // in the documentation and/or other materials provided with the
13332*5c90c05cSAndroid Build Coastguard Worker // distribution.
13333*5c90c05cSAndroid Build Coastguard Worker //     * Neither the name of Google Inc. nor the names of its
13334*5c90c05cSAndroid Build Coastguard Worker // contributors may be used to endorse or promote products derived from
13335*5c90c05cSAndroid Build Coastguard Worker // this software without specific prior written permission.
13336*5c90c05cSAndroid Build Coastguard Worker //
13337*5c90c05cSAndroid Build Coastguard Worker // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
13338*5c90c05cSAndroid Build Coastguard Worker // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
13339*5c90c05cSAndroid Build Coastguard Worker // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
13340*5c90c05cSAndroid Build Coastguard Worker // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
13341*5c90c05cSAndroid Build Coastguard Worker // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
13342*5c90c05cSAndroid Build Coastguard Worker // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
13343*5c90c05cSAndroid Build Coastguard Worker // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
13344*5c90c05cSAndroid Build Coastguard Worker // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
13345*5c90c05cSAndroid Build Coastguard Worker // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
13346*5c90c05cSAndroid Build Coastguard Worker // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
13347*5c90c05cSAndroid Build Coastguard Worker // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
13348*5c90c05cSAndroid Build Coastguard Worker 
13349*5c90c05cSAndroid Build Coastguard Worker 
13350*5c90c05cSAndroid Build Coastguard Worker // Google Mock - a framework for writing C++ mock classes.
13351*5c90c05cSAndroid Build Coastguard Worker //
13352*5c90c05cSAndroid Build Coastguard Worker // This file implements the spec builder syntax (ON_CALL and
13353*5c90c05cSAndroid Build Coastguard Worker // EXPECT_CALL).
13354*5c90c05cSAndroid Build Coastguard Worker 
13355*5c90c05cSAndroid Build Coastguard Worker 
13356*5c90c05cSAndroid Build Coastguard Worker #include <stdlib.h>
13357*5c90c05cSAndroid Build Coastguard Worker 
13358*5c90c05cSAndroid Build Coastguard Worker #include <iostream>  // NOLINT
13359*5c90c05cSAndroid Build Coastguard Worker #include <map>
13360*5c90c05cSAndroid Build Coastguard Worker #include <memory>
13361*5c90c05cSAndroid Build Coastguard Worker #include <set>
13362*5c90c05cSAndroid Build Coastguard Worker #include <string>
13363*5c90c05cSAndroid Build Coastguard Worker #include <unordered_map>
13364*5c90c05cSAndroid Build Coastguard Worker #include <vector>
13365*5c90c05cSAndroid Build Coastguard Worker 
13366*5c90c05cSAndroid Build Coastguard Worker 
13367*5c90c05cSAndroid Build Coastguard Worker #if GTEST_OS_CYGWIN || GTEST_OS_LINUX || GTEST_OS_MAC
13368*5c90c05cSAndroid Build Coastguard Worker # include <unistd.h>  // NOLINT
13369*5c90c05cSAndroid Build Coastguard Worker #endif
13370*5c90c05cSAndroid Build Coastguard Worker 
13371*5c90c05cSAndroid Build Coastguard Worker // Silence C4800 (C4800: 'int *const ': forcing value
13372*5c90c05cSAndroid Build Coastguard Worker // to bool 'true' or 'false') for MSVC 15
13373*5c90c05cSAndroid Build Coastguard Worker #ifdef _MSC_VER
13374*5c90c05cSAndroid Build Coastguard Worker #if _MSC_VER == 1900
13375*5c90c05cSAndroid Build Coastguard Worker #  pragma warning(push)
13376*5c90c05cSAndroid Build Coastguard Worker #  pragma warning(disable:4800)
13377*5c90c05cSAndroid Build Coastguard Worker #endif
13378*5c90c05cSAndroid Build Coastguard Worker #endif
13379*5c90c05cSAndroid Build Coastguard Worker 
13380*5c90c05cSAndroid Build Coastguard Worker namespace testing {
13381*5c90c05cSAndroid Build Coastguard Worker namespace internal {
13382*5c90c05cSAndroid Build Coastguard Worker 
13383*5c90c05cSAndroid Build Coastguard Worker // Protects the mock object registry (in class Mock), all function
13384*5c90c05cSAndroid Build Coastguard Worker // mockers, and all expectations.
13385*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ GTEST_DEFINE_STATIC_MUTEX_(g_gmock_mutex);
13386*5c90c05cSAndroid Build Coastguard Worker 
13387*5c90c05cSAndroid Build Coastguard Worker // Logs a message including file and line number information.
LogWithLocation(testing::internal::LogSeverity severity,const char * file,int line,const std::string & message)13388*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ void LogWithLocation(testing::internal::LogSeverity severity,
13389*5c90c05cSAndroid Build Coastguard Worker                                 const char* file, int line,
13390*5c90c05cSAndroid Build Coastguard Worker                                 const std::string& message) {
13391*5c90c05cSAndroid Build Coastguard Worker   ::std::ostringstream s;
13392*5c90c05cSAndroid Build Coastguard Worker   s << internal::FormatFileLocation(file, line) << " " << message
13393*5c90c05cSAndroid Build Coastguard Worker     << ::std::endl;
13394*5c90c05cSAndroid Build Coastguard Worker   Log(severity, s.str(), 0);
13395*5c90c05cSAndroid Build Coastguard Worker }
13396*5c90c05cSAndroid Build Coastguard Worker 
13397*5c90c05cSAndroid Build Coastguard Worker // Constructs an ExpectationBase object.
ExpectationBase(const char * a_file,int a_line,const std::string & a_source_text)13398*5c90c05cSAndroid Build Coastguard Worker ExpectationBase::ExpectationBase(const char* a_file, int a_line,
13399*5c90c05cSAndroid Build Coastguard Worker                                  const std::string& a_source_text)
13400*5c90c05cSAndroid Build Coastguard Worker     : file_(a_file),
13401*5c90c05cSAndroid Build Coastguard Worker       line_(a_line),
13402*5c90c05cSAndroid Build Coastguard Worker       source_text_(a_source_text),
13403*5c90c05cSAndroid Build Coastguard Worker       cardinality_specified_(false),
13404*5c90c05cSAndroid Build Coastguard Worker       cardinality_(Exactly(1)),
13405*5c90c05cSAndroid Build Coastguard Worker       call_count_(0),
13406*5c90c05cSAndroid Build Coastguard Worker       retired_(false),
13407*5c90c05cSAndroid Build Coastguard Worker       extra_matcher_specified_(false),
13408*5c90c05cSAndroid Build Coastguard Worker       repeated_action_specified_(false),
13409*5c90c05cSAndroid Build Coastguard Worker       retires_on_saturation_(false),
13410*5c90c05cSAndroid Build Coastguard Worker       last_clause_(kNone),
13411*5c90c05cSAndroid Build Coastguard Worker       action_count_checked_(false) {}
13412*5c90c05cSAndroid Build Coastguard Worker 
13413*5c90c05cSAndroid Build Coastguard Worker // Destructs an ExpectationBase object.
~ExpectationBase()13414*5c90c05cSAndroid Build Coastguard Worker ExpectationBase::~ExpectationBase() {}
13415*5c90c05cSAndroid Build Coastguard Worker 
13416*5c90c05cSAndroid Build Coastguard Worker // Explicitly specifies the cardinality of this expectation.  Used by
13417*5c90c05cSAndroid Build Coastguard Worker // the subclasses to implement the .Times() clause.
SpecifyCardinality(const Cardinality & a_cardinality)13418*5c90c05cSAndroid Build Coastguard Worker void ExpectationBase::SpecifyCardinality(const Cardinality& a_cardinality) {
13419*5c90c05cSAndroid Build Coastguard Worker   cardinality_specified_ = true;
13420*5c90c05cSAndroid Build Coastguard Worker   cardinality_ = a_cardinality;
13421*5c90c05cSAndroid Build Coastguard Worker }
13422*5c90c05cSAndroid Build Coastguard Worker 
13423*5c90c05cSAndroid Build Coastguard Worker // Retires all pre-requisites of this expectation.
RetireAllPreRequisites()13424*5c90c05cSAndroid Build Coastguard Worker void ExpectationBase::RetireAllPreRequisites()
13425*5c90c05cSAndroid Build Coastguard Worker     GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
13426*5c90c05cSAndroid Build Coastguard Worker   if (is_retired()) {
13427*5c90c05cSAndroid Build Coastguard Worker     // We can take this short-cut as we never retire an expectation
13428*5c90c05cSAndroid Build Coastguard Worker     // until we have retired all its pre-requisites.
13429*5c90c05cSAndroid Build Coastguard Worker     return;
13430*5c90c05cSAndroid Build Coastguard Worker   }
13431*5c90c05cSAndroid Build Coastguard Worker 
13432*5c90c05cSAndroid Build Coastguard Worker   ::std::vector<ExpectationBase*> expectations(1, this);
13433*5c90c05cSAndroid Build Coastguard Worker   while (!expectations.empty()) {
13434*5c90c05cSAndroid Build Coastguard Worker     ExpectationBase* exp = expectations.back();
13435*5c90c05cSAndroid Build Coastguard Worker     expectations.pop_back();
13436*5c90c05cSAndroid Build Coastguard Worker 
13437*5c90c05cSAndroid Build Coastguard Worker     for (ExpectationSet::const_iterator it =
13438*5c90c05cSAndroid Build Coastguard Worker              exp->immediate_prerequisites_.begin();
13439*5c90c05cSAndroid Build Coastguard Worker          it != exp->immediate_prerequisites_.end(); ++it) {
13440*5c90c05cSAndroid Build Coastguard Worker       ExpectationBase* next = it->expectation_base().get();
13441*5c90c05cSAndroid Build Coastguard Worker       if (!next->is_retired()) {
13442*5c90c05cSAndroid Build Coastguard Worker         next->Retire();
13443*5c90c05cSAndroid Build Coastguard Worker         expectations.push_back(next);
13444*5c90c05cSAndroid Build Coastguard Worker       }
13445*5c90c05cSAndroid Build Coastguard Worker     }
13446*5c90c05cSAndroid Build Coastguard Worker   }
13447*5c90c05cSAndroid Build Coastguard Worker }
13448*5c90c05cSAndroid Build Coastguard Worker 
13449*5c90c05cSAndroid Build Coastguard Worker // Returns true if and only if all pre-requisites of this expectation
13450*5c90c05cSAndroid Build Coastguard Worker // have been satisfied.
AllPrerequisitesAreSatisfied() const13451*5c90c05cSAndroid Build Coastguard Worker bool ExpectationBase::AllPrerequisitesAreSatisfied() const
13452*5c90c05cSAndroid Build Coastguard Worker     GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
13453*5c90c05cSAndroid Build Coastguard Worker   g_gmock_mutex.AssertHeld();
13454*5c90c05cSAndroid Build Coastguard Worker   ::std::vector<const ExpectationBase*> expectations(1, this);
13455*5c90c05cSAndroid Build Coastguard Worker   while (!expectations.empty()) {
13456*5c90c05cSAndroid Build Coastguard Worker     const ExpectationBase* exp = expectations.back();
13457*5c90c05cSAndroid Build Coastguard Worker     expectations.pop_back();
13458*5c90c05cSAndroid Build Coastguard Worker 
13459*5c90c05cSAndroid Build Coastguard Worker     for (ExpectationSet::const_iterator it =
13460*5c90c05cSAndroid Build Coastguard Worker              exp->immediate_prerequisites_.begin();
13461*5c90c05cSAndroid Build Coastguard Worker          it != exp->immediate_prerequisites_.end(); ++it) {
13462*5c90c05cSAndroid Build Coastguard Worker       const ExpectationBase* next = it->expectation_base().get();
13463*5c90c05cSAndroid Build Coastguard Worker       if (!next->IsSatisfied()) return false;
13464*5c90c05cSAndroid Build Coastguard Worker       expectations.push_back(next);
13465*5c90c05cSAndroid Build Coastguard Worker     }
13466*5c90c05cSAndroid Build Coastguard Worker   }
13467*5c90c05cSAndroid Build Coastguard Worker   return true;
13468*5c90c05cSAndroid Build Coastguard Worker }
13469*5c90c05cSAndroid Build Coastguard Worker 
13470*5c90c05cSAndroid Build Coastguard Worker // Adds unsatisfied pre-requisites of this expectation to 'result'.
FindUnsatisfiedPrerequisites(ExpectationSet * result) const13471*5c90c05cSAndroid Build Coastguard Worker void ExpectationBase::FindUnsatisfiedPrerequisites(ExpectationSet* result) const
13472*5c90c05cSAndroid Build Coastguard Worker     GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
13473*5c90c05cSAndroid Build Coastguard Worker   g_gmock_mutex.AssertHeld();
13474*5c90c05cSAndroid Build Coastguard Worker   ::std::vector<const ExpectationBase*> expectations(1, this);
13475*5c90c05cSAndroid Build Coastguard Worker   while (!expectations.empty()) {
13476*5c90c05cSAndroid Build Coastguard Worker     const ExpectationBase* exp = expectations.back();
13477*5c90c05cSAndroid Build Coastguard Worker     expectations.pop_back();
13478*5c90c05cSAndroid Build Coastguard Worker 
13479*5c90c05cSAndroid Build Coastguard Worker     for (ExpectationSet::const_iterator it =
13480*5c90c05cSAndroid Build Coastguard Worker              exp->immediate_prerequisites_.begin();
13481*5c90c05cSAndroid Build Coastguard Worker          it != exp->immediate_prerequisites_.end(); ++it) {
13482*5c90c05cSAndroid Build Coastguard Worker       const ExpectationBase* next = it->expectation_base().get();
13483*5c90c05cSAndroid Build Coastguard Worker 
13484*5c90c05cSAndroid Build Coastguard Worker       if (next->IsSatisfied()) {
13485*5c90c05cSAndroid Build Coastguard Worker         // If *it is satisfied and has a call count of 0, some of its
13486*5c90c05cSAndroid Build Coastguard Worker         // pre-requisites may not be satisfied yet.
13487*5c90c05cSAndroid Build Coastguard Worker         if (next->call_count_ == 0) {
13488*5c90c05cSAndroid Build Coastguard Worker           expectations.push_back(next);
13489*5c90c05cSAndroid Build Coastguard Worker         }
13490*5c90c05cSAndroid Build Coastguard Worker       } else {
13491*5c90c05cSAndroid Build Coastguard Worker         // Now that we know next is unsatisfied, we are not so interested
13492*5c90c05cSAndroid Build Coastguard Worker         // in whether its pre-requisites are satisfied.  Therefore we
13493*5c90c05cSAndroid Build Coastguard Worker         // don't iterate into it here.
13494*5c90c05cSAndroid Build Coastguard Worker         *result += *it;
13495*5c90c05cSAndroid Build Coastguard Worker       }
13496*5c90c05cSAndroid Build Coastguard Worker     }
13497*5c90c05cSAndroid Build Coastguard Worker   }
13498*5c90c05cSAndroid Build Coastguard Worker }
13499*5c90c05cSAndroid Build Coastguard Worker 
13500*5c90c05cSAndroid Build Coastguard Worker // Describes how many times a function call matching this
13501*5c90c05cSAndroid Build Coastguard Worker // expectation has occurred.
DescribeCallCountTo(::std::ostream * os) const13502*5c90c05cSAndroid Build Coastguard Worker void ExpectationBase::DescribeCallCountTo(::std::ostream* os) const
13503*5c90c05cSAndroid Build Coastguard Worker     GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
13504*5c90c05cSAndroid Build Coastguard Worker   g_gmock_mutex.AssertHeld();
13505*5c90c05cSAndroid Build Coastguard Worker 
13506*5c90c05cSAndroid Build Coastguard Worker   // Describes how many times the function is expected to be called.
13507*5c90c05cSAndroid Build Coastguard Worker   *os << "         Expected: to be ";
13508*5c90c05cSAndroid Build Coastguard Worker   cardinality().DescribeTo(os);
13509*5c90c05cSAndroid Build Coastguard Worker   *os << "\n           Actual: ";
13510*5c90c05cSAndroid Build Coastguard Worker   Cardinality::DescribeActualCallCountTo(call_count(), os);
13511*5c90c05cSAndroid Build Coastguard Worker 
13512*5c90c05cSAndroid Build Coastguard Worker   // Describes the state of the expectation (e.g. is it satisfied?
13513*5c90c05cSAndroid Build Coastguard Worker   // is it active?).
13514*5c90c05cSAndroid Build Coastguard Worker   *os << " - " << (IsOverSaturated() ? "over-saturated" :
13515*5c90c05cSAndroid Build Coastguard Worker                    IsSaturated() ? "saturated" :
13516*5c90c05cSAndroid Build Coastguard Worker                    IsSatisfied() ? "satisfied" : "unsatisfied")
13517*5c90c05cSAndroid Build Coastguard Worker       << " and "
13518*5c90c05cSAndroid Build Coastguard Worker       << (is_retired() ? "retired" : "active");
13519*5c90c05cSAndroid Build Coastguard Worker }
13520*5c90c05cSAndroid Build Coastguard Worker 
13521*5c90c05cSAndroid Build Coastguard Worker // Checks the action count (i.e. the number of WillOnce() and
13522*5c90c05cSAndroid Build Coastguard Worker // WillRepeatedly() clauses) against the cardinality if this hasn't
13523*5c90c05cSAndroid Build Coastguard Worker // been done before.  Prints a warning if there are too many or too
13524*5c90c05cSAndroid Build Coastguard Worker // few actions.
CheckActionCountIfNotDone() const13525*5c90c05cSAndroid Build Coastguard Worker void ExpectationBase::CheckActionCountIfNotDone() const
13526*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOCK_EXCLUDED_(mutex_) {
13527*5c90c05cSAndroid Build Coastguard Worker   bool should_check = false;
13528*5c90c05cSAndroid Build Coastguard Worker   {
13529*5c90c05cSAndroid Build Coastguard Worker     MutexLock l(&mutex_);
13530*5c90c05cSAndroid Build Coastguard Worker     if (!action_count_checked_) {
13531*5c90c05cSAndroid Build Coastguard Worker       action_count_checked_ = true;
13532*5c90c05cSAndroid Build Coastguard Worker       should_check = true;
13533*5c90c05cSAndroid Build Coastguard Worker     }
13534*5c90c05cSAndroid Build Coastguard Worker   }
13535*5c90c05cSAndroid Build Coastguard Worker 
13536*5c90c05cSAndroid Build Coastguard Worker   if (should_check) {
13537*5c90c05cSAndroid Build Coastguard Worker     if (!cardinality_specified_) {
13538*5c90c05cSAndroid Build Coastguard Worker       // The cardinality was inferred - no need to check the action
13539*5c90c05cSAndroid Build Coastguard Worker       // count against it.
13540*5c90c05cSAndroid Build Coastguard Worker       return;
13541*5c90c05cSAndroid Build Coastguard Worker     }
13542*5c90c05cSAndroid Build Coastguard Worker 
13543*5c90c05cSAndroid Build Coastguard Worker     // The cardinality was explicitly specified.
13544*5c90c05cSAndroid Build Coastguard Worker     const int action_count = static_cast<int>(untyped_actions_.size());
13545*5c90c05cSAndroid Build Coastguard Worker     const int upper_bound = cardinality().ConservativeUpperBound();
13546*5c90c05cSAndroid Build Coastguard Worker     const int lower_bound = cardinality().ConservativeLowerBound();
13547*5c90c05cSAndroid Build Coastguard Worker     bool too_many;  // True if there are too many actions, or false
13548*5c90c05cSAndroid Build Coastguard Worker     // if there are too few.
13549*5c90c05cSAndroid Build Coastguard Worker     if (action_count > upper_bound ||
13550*5c90c05cSAndroid Build Coastguard Worker         (action_count == upper_bound && repeated_action_specified_)) {
13551*5c90c05cSAndroid Build Coastguard Worker       too_many = true;
13552*5c90c05cSAndroid Build Coastguard Worker     } else if (0 < action_count && action_count < lower_bound &&
13553*5c90c05cSAndroid Build Coastguard Worker                !repeated_action_specified_) {
13554*5c90c05cSAndroid Build Coastguard Worker       too_many = false;
13555*5c90c05cSAndroid Build Coastguard Worker     } else {
13556*5c90c05cSAndroid Build Coastguard Worker       return;
13557*5c90c05cSAndroid Build Coastguard Worker     }
13558*5c90c05cSAndroid Build Coastguard Worker 
13559*5c90c05cSAndroid Build Coastguard Worker     ::std::stringstream ss;
13560*5c90c05cSAndroid Build Coastguard Worker     DescribeLocationTo(&ss);
13561*5c90c05cSAndroid Build Coastguard Worker     ss << "Too " << (too_many ? "many" : "few")
13562*5c90c05cSAndroid Build Coastguard Worker        << " actions specified in " << source_text() << "...\n"
13563*5c90c05cSAndroid Build Coastguard Worker        << "Expected to be ";
13564*5c90c05cSAndroid Build Coastguard Worker     cardinality().DescribeTo(&ss);
13565*5c90c05cSAndroid Build Coastguard Worker     ss << ", but has " << (too_many ? "" : "only ")
13566*5c90c05cSAndroid Build Coastguard Worker        << action_count << " WillOnce()"
13567*5c90c05cSAndroid Build Coastguard Worker        << (action_count == 1 ? "" : "s");
13568*5c90c05cSAndroid Build Coastguard Worker     if (repeated_action_specified_) {
13569*5c90c05cSAndroid Build Coastguard Worker       ss << " and a WillRepeatedly()";
13570*5c90c05cSAndroid Build Coastguard Worker     }
13571*5c90c05cSAndroid Build Coastguard Worker     ss << ".";
13572*5c90c05cSAndroid Build Coastguard Worker     Log(kWarning, ss.str(), -1);  // -1 means "don't print stack trace".
13573*5c90c05cSAndroid Build Coastguard Worker   }
13574*5c90c05cSAndroid Build Coastguard Worker }
13575*5c90c05cSAndroid Build Coastguard Worker 
13576*5c90c05cSAndroid Build Coastguard Worker // Implements the .Times() clause.
UntypedTimes(const Cardinality & a_cardinality)13577*5c90c05cSAndroid Build Coastguard Worker void ExpectationBase::UntypedTimes(const Cardinality& a_cardinality) {
13578*5c90c05cSAndroid Build Coastguard Worker   if (last_clause_ == kTimes) {
13579*5c90c05cSAndroid Build Coastguard Worker     ExpectSpecProperty(false,
13580*5c90c05cSAndroid Build Coastguard Worker                        ".Times() cannot appear "
13581*5c90c05cSAndroid Build Coastguard Worker                        "more than once in an EXPECT_CALL().");
13582*5c90c05cSAndroid Build Coastguard Worker   } else {
13583*5c90c05cSAndroid Build Coastguard Worker     ExpectSpecProperty(last_clause_ < kTimes,
13584*5c90c05cSAndroid Build Coastguard Worker                        ".Times() cannot appear after "
13585*5c90c05cSAndroid Build Coastguard Worker                        ".InSequence(), .WillOnce(), .WillRepeatedly(), "
13586*5c90c05cSAndroid Build Coastguard Worker                        "or .RetiresOnSaturation().");
13587*5c90c05cSAndroid Build Coastguard Worker   }
13588*5c90c05cSAndroid Build Coastguard Worker   last_clause_ = kTimes;
13589*5c90c05cSAndroid Build Coastguard Worker 
13590*5c90c05cSAndroid Build Coastguard Worker   SpecifyCardinality(a_cardinality);
13591*5c90c05cSAndroid Build Coastguard Worker }
13592*5c90c05cSAndroid Build Coastguard Worker 
13593*5c90c05cSAndroid Build Coastguard Worker // Points to the implicit sequence introduced by a living InSequence
13594*5c90c05cSAndroid Build Coastguard Worker // object (if any) in the current thread or NULL.
13595*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ ThreadLocal<Sequence*> g_gmock_implicit_sequence;
13596*5c90c05cSAndroid Build Coastguard Worker 
13597*5c90c05cSAndroid Build Coastguard Worker // Reports an uninteresting call (whose description is in msg) in the
13598*5c90c05cSAndroid Build Coastguard Worker // manner specified by 'reaction'.
ReportUninterestingCall(CallReaction reaction,const std::string & msg)13599*5c90c05cSAndroid Build Coastguard Worker void ReportUninterestingCall(CallReaction reaction, const std::string& msg) {
13600*5c90c05cSAndroid Build Coastguard Worker   // Include a stack trace only if --gmock_verbose=info is specified.
13601*5c90c05cSAndroid Build Coastguard Worker   const int stack_frames_to_skip =
13602*5c90c05cSAndroid Build Coastguard Worker       GMOCK_FLAG(verbose) == kInfoVerbosity ? 3 : -1;
13603*5c90c05cSAndroid Build Coastguard Worker   switch (reaction) {
13604*5c90c05cSAndroid Build Coastguard Worker     case kAllow:
13605*5c90c05cSAndroid Build Coastguard Worker       Log(kInfo, msg, stack_frames_to_skip);
13606*5c90c05cSAndroid Build Coastguard Worker       break;
13607*5c90c05cSAndroid Build Coastguard Worker     case kWarn:
13608*5c90c05cSAndroid Build Coastguard Worker       Log(kWarning,
13609*5c90c05cSAndroid Build Coastguard Worker           msg +
13610*5c90c05cSAndroid Build Coastguard Worker               "\nNOTE: You can safely ignore the above warning unless this "
13611*5c90c05cSAndroid Build Coastguard Worker               "call should not happen.  Do not suppress it by blindly adding "
13612*5c90c05cSAndroid Build Coastguard Worker               "an EXPECT_CALL() if you don't mean to enforce the call.  "
13613*5c90c05cSAndroid Build Coastguard Worker               "See "
13614*5c90c05cSAndroid Build Coastguard Worker               "https://github.com/google/googletest/blob/master/docs/"
13615*5c90c05cSAndroid Build Coastguard Worker               "gmock_cook_book.md#"
13616*5c90c05cSAndroid Build Coastguard Worker               "knowing-when-to-expect for details.\n",
13617*5c90c05cSAndroid Build Coastguard Worker           stack_frames_to_skip);
13618*5c90c05cSAndroid Build Coastguard Worker       break;
13619*5c90c05cSAndroid Build Coastguard Worker     default:  // FAIL
13620*5c90c05cSAndroid Build Coastguard Worker       Expect(false, nullptr, -1, msg);
13621*5c90c05cSAndroid Build Coastguard Worker   }
13622*5c90c05cSAndroid Build Coastguard Worker }
13623*5c90c05cSAndroid Build Coastguard Worker 
UntypedFunctionMockerBase()13624*5c90c05cSAndroid Build Coastguard Worker UntypedFunctionMockerBase::UntypedFunctionMockerBase()
13625*5c90c05cSAndroid Build Coastguard Worker     : mock_obj_(nullptr), name_("") {}
13626*5c90c05cSAndroid Build Coastguard Worker 
~UntypedFunctionMockerBase()13627*5c90c05cSAndroid Build Coastguard Worker UntypedFunctionMockerBase::~UntypedFunctionMockerBase() {}
13628*5c90c05cSAndroid Build Coastguard Worker 
13629*5c90c05cSAndroid Build Coastguard Worker // Sets the mock object this mock method belongs to, and registers
13630*5c90c05cSAndroid Build Coastguard Worker // this information in the global mock registry.  Will be called
13631*5c90c05cSAndroid Build Coastguard Worker // whenever an EXPECT_CALL() or ON_CALL() is executed on this mock
13632*5c90c05cSAndroid Build Coastguard Worker // method.
RegisterOwner(const void * mock_obj)13633*5c90c05cSAndroid Build Coastguard Worker void UntypedFunctionMockerBase::RegisterOwner(const void* mock_obj)
13634*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
13635*5c90c05cSAndroid Build Coastguard Worker   {
13636*5c90c05cSAndroid Build Coastguard Worker     MutexLock l(&g_gmock_mutex);
13637*5c90c05cSAndroid Build Coastguard Worker     mock_obj_ = mock_obj;
13638*5c90c05cSAndroid Build Coastguard Worker   }
13639*5c90c05cSAndroid Build Coastguard Worker   Mock::Register(mock_obj, this);
13640*5c90c05cSAndroid Build Coastguard Worker }
13641*5c90c05cSAndroid Build Coastguard Worker 
13642*5c90c05cSAndroid Build Coastguard Worker // Sets the mock object this mock method belongs to, and sets the name
13643*5c90c05cSAndroid Build Coastguard Worker // of the mock function.  Will be called upon each invocation of this
13644*5c90c05cSAndroid Build Coastguard Worker // mock function.
SetOwnerAndName(const void * mock_obj,const char * name)13645*5c90c05cSAndroid Build Coastguard Worker void UntypedFunctionMockerBase::SetOwnerAndName(const void* mock_obj,
13646*5c90c05cSAndroid Build Coastguard Worker                                                 const char* name)
13647*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
13648*5c90c05cSAndroid Build Coastguard Worker   // We protect name_ under g_gmock_mutex in case this mock function
13649*5c90c05cSAndroid Build Coastguard Worker   // is called from two threads concurrently.
13650*5c90c05cSAndroid Build Coastguard Worker   MutexLock l(&g_gmock_mutex);
13651*5c90c05cSAndroid Build Coastguard Worker   mock_obj_ = mock_obj;
13652*5c90c05cSAndroid Build Coastguard Worker   name_ = name;
13653*5c90c05cSAndroid Build Coastguard Worker }
13654*5c90c05cSAndroid Build Coastguard Worker 
13655*5c90c05cSAndroid Build Coastguard Worker // Returns the name of the function being mocked.  Must be called
13656*5c90c05cSAndroid Build Coastguard Worker // after RegisterOwner() or SetOwnerAndName() has been called.
MockObject() const13657*5c90c05cSAndroid Build Coastguard Worker const void* UntypedFunctionMockerBase::MockObject() const
13658*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
13659*5c90c05cSAndroid Build Coastguard Worker   const void* mock_obj;
13660*5c90c05cSAndroid Build Coastguard Worker   {
13661*5c90c05cSAndroid Build Coastguard Worker     // We protect mock_obj_ under g_gmock_mutex in case this mock
13662*5c90c05cSAndroid Build Coastguard Worker     // function is called from two threads concurrently.
13663*5c90c05cSAndroid Build Coastguard Worker     MutexLock l(&g_gmock_mutex);
13664*5c90c05cSAndroid Build Coastguard Worker     Assert(mock_obj_ != nullptr, __FILE__, __LINE__,
13665*5c90c05cSAndroid Build Coastguard Worker            "MockObject() must not be called before RegisterOwner() or "
13666*5c90c05cSAndroid Build Coastguard Worker            "SetOwnerAndName() has been called.");
13667*5c90c05cSAndroid Build Coastguard Worker     mock_obj = mock_obj_;
13668*5c90c05cSAndroid Build Coastguard Worker   }
13669*5c90c05cSAndroid Build Coastguard Worker   return mock_obj;
13670*5c90c05cSAndroid Build Coastguard Worker }
13671*5c90c05cSAndroid Build Coastguard Worker 
13672*5c90c05cSAndroid Build Coastguard Worker // Returns the name of this mock method.  Must be called after
13673*5c90c05cSAndroid Build Coastguard Worker // SetOwnerAndName() has been called.
Name() const13674*5c90c05cSAndroid Build Coastguard Worker const char* UntypedFunctionMockerBase::Name() const
13675*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
13676*5c90c05cSAndroid Build Coastguard Worker   const char* name;
13677*5c90c05cSAndroid Build Coastguard Worker   {
13678*5c90c05cSAndroid Build Coastguard Worker     // We protect name_ under g_gmock_mutex in case this mock
13679*5c90c05cSAndroid Build Coastguard Worker     // function is called from two threads concurrently.
13680*5c90c05cSAndroid Build Coastguard Worker     MutexLock l(&g_gmock_mutex);
13681*5c90c05cSAndroid Build Coastguard Worker     Assert(name_ != nullptr, __FILE__, __LINE__,
13682*5c90c05cSAndroid Build Coastguard Worker            "Name() must not be called before SetOwnerAndName() has "
13683*5c90c05cSAndroid Build Coastguard Worker            "been called.");
13684*5c90c05cSAndroid Build Coastguard Worker     name = name_;
13685*5c90c05cSAndroid Build Coastguard Worker   }
13686*5c90c05cSAndroid Build Coastguard Worker   return name;
13687*5c90c05cSAndroid Build Coastguard Worker }
13688*5c90c05cSAndroid Build Coastguard Worker 
13689*5c90c05cSAndroid Build Coastguard Worker // Calculates the result of invoking this mock function with the given
13690*5c90c05cSAndroid Build Coastguard Worker // arguments, prints it, and returns it.  The caller is responsible
13691*5c90c05cSAndroid Build Coastguard Worker // for deleting the result.
UntypedInvokeWith(void * const untyped_args)13692*5c90c05cSAndroid Build Coastguard Worker UntypedActionResultHolderBase* UntypedFunctionMockerBase::UntypedInvokeWith(
13693*5c90c05cSAndroid Build Coastguard Worker     void* const untyped_args) GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
13694*5c90c05cSAndroid Build Coastguard Worker   // See the definition of untyped_expectations_ for why access to it
13695*5c90c05cSAndroid Build Coastguard Worker   // is unprotected here.
13696*5c90c05cSAndroid Build Coastguard Worker   if (untyped_expectations_.size() == 0) {
13697*5c90c05cSAndroid Build Coastguard Worker     // No expectation is set on this mock method - we have an
13698*5c90c05cSAndroid Build Coastguard Worker     // uninteresting call.
13699*5c90c05cSAndroid Build Coastguard Worker 
13700*5c90c05cSAndroid Build Coastguard Worker     // We must get Google Mock's reaction on uninteresting calls
13701*5c90c05cSAndroid Build Coastguard Worker     // made on this mock object BEFORE performing the action,
13702*5c90c05cSAndroid Build Coastguard Worker     // because the action may DELETE the mock object and make the
13703*5c90c05cSAndroid Build Coastguard Worker     // following expression meaningless.
13704*5c90c05cSAndroid Build Coastguard Worker     const CallReaction reaction =
13705*5c90c05cSAndroid Build Coastguard Worker         Mock::GetReactionOnUninterestingCalls(MockObject());
13706*5c90c05cSAndroid Build Coastguard Worker 
13707*5c90c05cSAndroid Build Coastguard Worker     // True if and only if we need to print this call's arguments and return
13708*5c90c05cSAndroid Build Coastguard Worker     // value.  This definition must be kept in sync with
13709*5c90c05cSAndroid Build Coastguard Worker     // the behavior of ReportUninterestingCall().
13710*5c90c05cSAndroid Build Coastguard Worker     const bool need_to_report_uninteresting_call =
13711*5c90c05cSAndroid Build Coastguard Worker         // If the user allows this uninteresting call, we print it
13712*5c90c05cSAndroid Build Coastguard Worker         // only when they want informational messages.
13713*5c90c05cSAndroid Build Coastguard Worker         reaction == kAllow ? LogIsVisible(kInfo) :
13714*5c90c05cSAndroid Build Coastguard Worker                            // If the user wants this to be a warning, we print
13715*5c90c05cSAndroid Build Coastguard Worker                            // it only when they want to see warnings.
13716*5c90c05cSAndroid Build Coastguard Worker             reaction == kWarn
13717*5c90c05cSAndroid Build Coastguard Worker                 ? LogIsVisible(kWarning)
13718*5c90c05cSAndroid Build Coastguard Worker                 :
13719*5c90c05cSAndroid Build Coastguard Worker                 // Otherwise, the user wants this to be an error, and we
13720*5c90c05cSAndroid Build Coastguard Worker                 // should always print detailed information in the error.
13721*5c90c05cSAndroid Build Coastguard Worker                 true;
13722*5c90c05cSAndroid Build Coastguard Worker 
13723*5c90c05cSAndroid Build Coastguard Worker     if (!need_to_report_uninteresting_call) {
13724*5c90c05cSAndroid Build Coastguard Worker       // Perform the action without printing the call information.
13725*5c90c05cSAndroid Build Coastguard Worker       return this->UntypedPerformDefaultAction(
13726*5c90c05cSAndroid Build Coastguard Worker           untyped_args, "Function call: " + std::string(Name()));
13727*5c90c05cSAndroid Build Coastguard Worker     }
13728*5c90c05cSAndroid Build Coastguard Worker 
13729*5c90c05cSAndroid Build Coastguard Worker     // Warns about the uninteresting call.
13730*5c90c05cSAndroid Build Coastguard Worker     ::std::stringstream ss;
13731*5c90c05cSAndroid Build Coastguard Worker     this->UntypedDescribeUninterestingCall(untyped_args, &ss);
13732*5c90c05cSAndroid Build Coastguard Worker 
13733*5c90c05cSAndroid Build Coastguard Worker     // Calculates the function result.
13734*5c90c05cSAndroid Build Coastguard Worker     UntypedActionResultHolderBase* const result =
13735*5c90c05cSAndroid Build Coastguard Worker         this->UntypedPerformDefaultAction(untyped_args, ss.str());
13736*5c90c05cSAndroid Build Coastguard Worker 
13737*5c90c05cSAndroid Build Coastguard Worker     // Prints the function result.
13738*5c90c05cSAndroid Build Coastguard Worker     if (result != nullptr) result->PrintAsActionResult(&ss);
13739*5c90c05cSAndroid Build Coastguard Worker 
13740*5c90c05cSAndroid Build Coastguard Worker     ReportUninterestingCall(reaction, ss.str());
13741*5c90c05cSAndroid Build Coastguard Worker     return result;
13742*5c90c05cSAndroid Build Coastguard Worker   }
13743*5c90c05cSAndroid Build Coastguard Worker 
13744*5c90c05cSAndroid Build Coastguard Worker   bool is_excessive = false;
13745*5c90c05cSAndroid Build Coastguard Worker   ::std::stringstream ss;
13746*5c90c05cSAndroid Build Coastguard Worker   ::std::stringstream why;
13747*5c90c05cSAndroid Build Coastguard Worker   ::std::stringstream loc;
13748*5c90c05cSAndroid Build Coastguard Worker   const void* untyped_action = nullptr;
13749*5c90c05cSAndroid Build Coastguard Worker 
13750*5c90c05cSAndroid Build Coastguard Worker   // The UntypedFindMatchingExpectation() function acquires and
13751*5c90c05cSAndroid Build Coastguard Worker   // releases g_gmock_mutex.
13752*5c90c05cSAndroid Build Coastguard Worker 
13753*5c90c05cSAndroid Build Coastguard Worker   const ExpectationBase* const untyped_expectation =
13754*5c90c05cSAndroid Build Coastguard Worker       this->UntypedFindMatchingExpectation(untyped_args, &untyped_action,
13755*5c90c05cSAndroid Build Coastguard Worker                                            &is_excessive, &ss, &why);
13756*5c90c05cSAndroid Build Coastguard Worker   const bool found = untyped_expectation != nullptr;
13757*5c90c05cSAndroid Build Coastguard Worker 
13758*5c90c05cSAndroid Build Coastguard Worker   // True if and only if we need to print the call's arguments
13759*5c90c05cSAndroid Build Coastguard Worker   // and return value.
13760*5c90c05cSAndroid Build Coastguard Worker   // This definition must be kept in sync with the uses of Expect()
13761*5c90c05cSAndroid Build Coastguard Worker   // and Log() in this function.
13762*5c90c05cSAndroid Build Coastguard Worker   const bool need_to_report_call =
13763*5c90c05cSAndroid Build Coastguard Worker       !found || is_excessive || LogIsVisible(kInfo);
13764*5c90c05cSAndroid Build Coastguard Worker   if (!need_to_report_call) {
13765*5c90c05cSAndroid Build Coastguard Worker     // Perform the action without printing the call information.
13766*5c90c05cSAndroid Build Coastguard Worker     return untyped_action == nullptr
13767*5c90c05cSAndroid Build Coastguard Worker                ? this->UntypedPerformDefaultAction(untyped_args, "")
13768*5c90c05cSAndroid Build Coastguard Worker                : this->UntypedPerformAction(untyped_action, untyped_args);
13769*5c90c05cSAndroid Build Coastguard Worker   }
13770*5c90c05cSAndroid Build Coastguard Worker 
13771*5c90c05cSAndroid Build Coastguard Worker   ss << "    Function call: " << Name();
13772*5c90c05cSAndroid Build Coastguard Worker   this->UntypedPrintArgs(untyped_args, &ss);
13773*5c90c05cSAndroid Build Coastguard Worker 
13774*5c90c05cSAndroid Build Coastguard Worker   // In case the action deletes a piece of the expectation, we
13775*5c90c05cSAndroid Build Coastguard Worker   // generate the message beforehand.
13776*5c90c05cSAndroid Build Coastguard Worker   if (found && !is_excessive) {
13777*5c90c05cSAndroid Build Coastguard Worker     untyped_expectation->DescribeLocationTo(&loc);
13778*5c90c05cSAndroid Build Coastguard Worker   }
13779*5c90c05cSAndroid Build Coastguard Worker 
13780*5c90c05cSAndroid Build Coastguard Worker   UntypedActionResultHolderBase* result = nullptr;
13781*5c90c05cSAndroid Build Coastguard Worker 
13782*5c90c05cSAndroid Build Coastguard Worker   auto perform_action = [&, this] {
13783*5c90c05cSAndroid Build Coastguard Worker     return untyped_action == nullptr
13784*5c90c05cSAndroid Build Coastguard Worker                ? this->UntypedPerformDefaultAction(untyped_args, ss.str())
13785*5c90c05cSAndroid Build Coastguard Worker                : this->UntypedPerformAction(untyped_action, untyped_args);
13786*5c90c05cSAndroid Build Coastguard Worker   };
13787*5c90c05cSAndroid Build Coastguard Worker   auto handle_failures = [&] {
13788*5c90c05cSAndroid Build Coastguard Worker     ss << "\n" << why.str();
13789*5c90c05cSAndroid Build Coastguard Worker 
13790*5c90c05cSAndroid Build Coastguard Worker     if (!found) {
13791*5c90c05cSAndroid Build Coastguard Worker       // No expectation matches this call - reports a failure.
13792*5c90c05cSAndroid Build Coastguard Worker       Expect(false, nullptr, -1, ss.str());
13793*5c90c05cSAndroid Build Coastguard Worker     } else if (is_excessive) {
13794*5c90c05cSAndroid Build Coastguard Worker       // We had an upper-bound violation and the failure message is in ss.
13795*5c90c05cSAndroid Build Coastguard Worker       Expect(false, untyped_expectation->file(), untyped_expectation->line(),
13796*5c90c05cSAndroid Build Coastguard Worker              ss.str());
13797*5c90c05cSAndroid Build Coastguard Worker     } else {
13798*5c90c05cSAndroid Build Coastguard Worker       // We had an expected call and the matching expectation is
13799*5c90c05cSAndroid Build Coastguard Worker       // described in ss.
13800*5c90c05cSAndroid Build Coastguard Worker       Log(kInfo, loc.str() + ss.str(), 2);
13801*5c90c05cSAndroid Build Coastguard Worker     }
13802*5c90c05cSAndroid Build Coastguard Worker   };
13803*5c90c05cSAndroid Build Coastguard Worker #if GTEST_HAS_EXCEPTIONS
13804*5c90c05cSAndroid Build Coastguard Worker   try {
13805*5c90c05cSAndroid Build Coastguard Worker     result = perform_action();
13806*5c90c05cSAndroid Build Coastguard Worker   } catch (...) {
13807*5c90c05cSAndroid Build Coastguard Worker     handle_failures();
13808*5c90c05cSAndroid Build Coastguard Worker     throw;
13809*5c90c05cSAndroid Build Coastguard Worker   }
13810*5c90c05cSAndroid Build Coastguard Worker #else
13811*5c90c05cSAndroid Build Coastguard Worker   result = perform_action();
13812*5c90c05cSAndroid Build Coastguard Worker #endif
13813*5c90c05cSAndroid Build Coastguard Worker 
13814*5c90c05cSAndroid Build Coastguard Worker   if (result != nullptr) result->PrintAsActionResult(&ss);
13815*5c90c05cSAndroid Build Coastguard Worker   handle_failures();
13816*5c90c05cSAndroid Build Coastguard Worker   return result;
13817*5c90c05cSAndroid Build Coastguard Worker }
13818*5c90c05cSAndroid Build Coastguard Worker 
13819*5c90c05cSAndroid Build Coastguard Worker // Returns an Expectation object that references and co-owns exp,
13820*5c90c05cSAndroid Build Coastguard Worker // which must be an expectation on this mock function.
GetHandleOf(ExpectationBase * exp)13821*5c90c05cSAndroid Build Coastguard Worker Expectation UntypedFunctionMockerBase::GetHandleOf(ExpectationBase* exp) {
13822*5c90c05cSAndroid Build Coastguard Worker   // See the definition of untyped_expectations_ for why access to it
13823*5c90c05cSAndroid Build Coastguard Worker   // is unprotected here.
13824*5c90c05cSAndroid Build Coastguard Worker   for (UntypedExpectations::const_iterator it =
13825*5c90c05cSAndroid Build Coastguard Worker            untyped_expectations_.begin();
13826*5c90c05cSAndroid Build Coastguard Worker        it != untyped_expectations_.end(); ++it) {
13827*5c90c05cSAndroid Build Coastguard Worker     if (it->get() == exp) {
13828*5c90c05cSAndroid Build Coastguard Worker       return Expectation(*it);
13829*5c90c05cSAndroid Build Coastguard Worker     }
13830*5c90c05cSAndroid Build Coastguard Worker   }
13831*5c90c05cSAndroid Build Coastguard Worker 
13832*5c90c05cSAndroid Build Coastguard Worker   Assert(false, __FILE__, __LINE__, "Cannot find expectation.");
13833*5c90c05cSAndroid Build Coastguard Worker   return Expectation();
13834*5c90c05cSAndroid Build Coastguard Worker   // The above statement is just to make the code compile, and will
13835*5c90c05cSAndroid Build Coastguard Worker   // never be executed.
13836*5c90c05cSAndroid Build Coastguard Worker }
13837*5c90c05cSAndroid Build Coastguard Worker 
13838*5c90c05cSAndroid Build Coastguard Worker // Verifies that all expectations on this mock function have been
13839*5c90c05cSAndroid Build Coastguard Worker // satisfied.  Reports one or more Google Test non-fatal failures
13840*5c90c05cSAndroid Build Coastguard Worker // and returns false if not.
VerifyAndClearExpectationsLocked()13841*5c90c05cSAndroid Build Coastguard Worker bool UntypedFunctionMockerBase::VerifyAndClearExpectationsLocked()
13842*5c90c05cSAndroid Build Coastguard Worker     GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
13843*5c90c05cSAndroid Build Coastguard Worker   g_gmock_mutex.AssertHeld();
13844*5c90c05cSAndroid Build Coastguard Worker   bool expectations_met = true;
13845*5c90c05cSAndroid Build Coastguard Worker   for (UntypedExpectations::const_iterator it =
13846*5c90c05cSAndroid Build Coastguard Worker            untyped_expectations_.begin();
13847*5c90c05cSAndroid Build Coastguard Worker        it != untyped_expectations_.end(); ++it) {
13848*5c90c05cSAndroid Build Coastguard Worker     ExpectationBase* const untyped_expectation = it->get();
13849*5c90c05cSAndroid Build Coastguard Worker     if (untyped_expectation->IsOverSaturated()) {
13850*5c90c05cSAndroid Build Coastguard Worker       // There was an upper-bound violation.  Since the error was
13851*5c90c05cSAndroid Build Coastguard Worker       // already reported when it occurred, there is no need to do
13852*5c90c05cSAndroid Build Coastguard Worker       // anything here.
13853*5c90c05cSAndroid Build Coastguard Worker       expectations_met = false;
13854*5c90c05cSAndroid Build Coastguard Worker     } else if (!untyped_expectation->IsSatisfied()) {
13855*5c90c05cSAndroid Build Coastguard Worker       expectations_met = false;
13856*5c90c05cSAndroid Build Coastguard Worker       ::std::stringstream ss;
13857*5c90c05cSAndroid Build Coastguard Worker       ss  << "Actual function call count doesn't match "
13858*5c90c05cSAndroid Build Coastguard Worker           << untyped_expectation->source_text() << "...\n";
13859*5c90c05cSAndroid Build Coastguard Worker       // No need to show the source file location of the expectation
13860*5c90c05cSAndroid Build Coastguard Worker       // in the description, as the Expect() call that follows already
13861*5c90c05cSAndroid Build Coastguard Worker       // takes care of it.
13862*5c90c05cSAndroid Build Coastguard Worker       untyped_expectation->MaybeDescribeExtraMatcherTo(&ss);
13863*5c90c05cSAndroid Build Coastguard Worker       untyped_expectation->DescribeCallCountTo(&ss);
13864*5c90c05cSAndroid Build Coastguard Worker       Expect(false, untyped_expectation->file(),
13865*5c90c05cSAndroid Build Coastguard Worker              untyped_expectation->line(), ss.str());
13866*5c90c05cSAndroid Build Coastguard Worker     }
13867*5c90c05cSAndroid Build Coastguard Worker   }
13868*5c90c05cSAndroid Build Coastguard Worker 
13869*5c90c05cSAndroid Build Coastguard Worker   // Deleting our expectations may trigger other mock objects to be deleted, for
13870*5c90c05cSAndroid Build Coastguard Worker   // example if an action contains a reference counted smart pointer to that
13871*5c90c05cSAndroid Build Coastguard Worker   // mock object, and that is the last reference. So if we delete our
13872*5c90c05cSAndroid Build Coastguard Worker   // expectations within the context of the global mutex we may deadlock when
13873*5c90c05cSAndroid Build Coastguard Worker   // this method is called again. Instead, make a copy of the set of
13874*5c90c05cSAndroid Build Coastguard Worker   // expectations to delete, clear our set within the mutex, and then clear the
13875*5c90c05cSAndroid Build Coastguard Worker   // copied set outside of it.
13876*5c90c05cSAndroid Build Coastguard Worker   UntypedExpectations expectations_to_delete;
13877*5c90c05cSAndroid Build Coastguard Worker   untyped_expectations_.swap(expectations_to_delete);
13878*5c90c05cSAndroid Build Coastguard Worker 
13879*5c90c05cSAndroid Build Coastguard Worker   g_gmock_mutex.Unlock();
13880*5c90c05cSAndroid Build Coastguard Worker   expectations_to_delete.clear();
13881*5c90c05cSAndroid Build Coastguard Worker   g_gmock_mutex.Lock();
13882*5c90c05cSAndroid Build Coastguard Worker 
13883*5c90c05cSAndroid Build Coastguard Worker   return expectations_met;
13884*5c90c05cSAndroid Build Coastguard Worker }
13885*5c90c05cSAndroid Build Coastguard Worker 
intToCallReaction(int mock_behavior)13886*5c90c05cSAndroid Build Coastguard Worker CallReaction intToCallReaction(int mock_behavior) {
13887*5c90c05cSAndroid Build Coastguard Worker   if (mock_behavior >= kAllow && mock_behavior <= kFail) {
13888*5c90c05cSAndroid Build Coastguard Worker     return static_cast<internal::CallReaction>(mock_behavior);
13889*5c90c05cSAndroid Build Coastguard Worker   }
13890*5c90c05cSAndroid Build Coastguard Worker   return kWarn;
13891*5c90c05cSAndroid Build Coastguard Worker }
13892*5c90c05cSAndroid Build Coastguard Worker 
13893*5c90c05cSAndroid Build Coastguard Worker }  // namespace internal
13894*5c90c05cSAndroid Build Coastguard Worker 
13895*5c90c05cSAndroid Build Coastguard Worker // Class Mock.
13896*5c90c05cSAndroid Build Coastguard Worker 
13897*5c90c05cSAndroid Build Coastguard Worker namespace {
13898*5c90c05cSAndroid Build Coastguard Worker 
13899*5c90c05cSAndroid Build Coastguard Worker typedef std::set<internal::UntypedFunctionMockerBase*> FunctionMockers;
13900*5c90c05cSAndroid Build Coastguard Worker 
13901*5c90c05cSAndroid Build Coastguard Worker // The current state of a mock object.  Such information is needed for
13902*5c90c05cSAndroid Build Coastguard Worker // detecting leaked mock objects and explicitly verifying a mock's
13903*5c90c05cSAndroid Build Coastguard Worker // expectations.
13904*5c90c05cSAndroid Build Coastguard Worker struct MockObjectState {
MockObjectStatetesting::__anon389b48f81511::MockObjectState13905*5c90c05cSAndroid Build Coastguard Worker   MockObjectState()
13906*5c90c05cSAndroid Build Coastguard Worker       : first_used_file(nullptr), first_used_line(-1), leakable(false) {}
13907*5c90c05cSAndroid Build Coastguard Worker 
13908*5c90c05cSAndroid Build Coastguard Worker   // Where in the source file an ON_CALL or EXPECT_CALL is first
13909*5c90c05cSAndroid Build Coastguard Worker   // invoked on this mock object.
13910*5c90c05cSAndroid Build Coastguard Worker   const char* first_used_file;
13911*5c90c05cSAndroid Build Coastguard Worker   int first_used_line;
13912*5c90c05cSAndroid Build Coastguard Worker   ::std::string first_used_test_suite;
13913*5c90c05cSAndroid Build Coastguard Worker   ::std::string first_used_test;
13914*5c90c05cSAndroid Build Coastguard Worker   bool leakable;  // true if and only if it's OK to leak the object.
13915*5c90c05cSAndroid Build Coastguard Worker   FunctionMockers function_mockers;  // All registered methods of the object.
13916*5c90c05cSAndroid Build Coastguard Worker };
13917*5c90c05cSAndroid Build Coastguard Worker 
13918*5c90c05cSAndroid Build Coastguard Worker // A global registry holding the state of all mock objects that are
13919*5c90c05cSAndroid Build Coastguard Worker // alive.  A mock object is added to this registry the first time
13920*5c90c05cSAndroid Build Coastguard Worker // Mock::AllowLeak(), ON_CALL(), or EXPECT_CALL() is called on it.  It
13921*5c90c05cSAndroid Build Coastguard Worker // is removed from the registry in the mock object's destructor.
13922*5c90c05cSAndroid Build Coastguard Worker class MockObjectRegistry {
13923*5c90c05cSAndroid Build Coastguard Worker  public:
13924*5c90c05cSAndroid Build Coastguard Worker   // Maps a mock object (identified by its address) to its state.
13925*5c90c05cSAndroid Build Coastguard Worker   typedef std::map<const void*, MockObjectState> StateMap;
13926*5c90c05cSAndroid Build Coastguard Worker 
13927*5c90c05cSAndroid Build Coastguard Worker   // This destructor will be called when a program exits, after all
13928*5c90c05cSAndroid Build Coastguard Worker   // tests in it have been run.  By then, there should be no mock
13929*5c90c05cSAndroid Build Coastguard Worker   // object alive.  Therefore we report any living object as test
13930*5c90c05cSAndroid Build Coastguard Worker   // failure, unless the user explicitly asked us to ignore it.
~MockObjectRegistry()13931*5c90c05cSAndroid Build Coastguard Worker   ~MockObjectRegistry() {
13932*5c90c05cSAndroid Build Coastguard Worker     if (!GMOCK_FLAG(catch_leaked_mocks))
13933*5c90c05cSAndroid Build Coastguard Worker       return;
13934*5c90c05cSAndroid Build Coastguard Worker 
13935*5c90c05cSAndroid Build Coastguard Worker     int leaked_count = 0;
13936*5c90c05cSAndroid Build Coastguard Worker     for (StateMap::const_iterator it = states_.begin(); it != states_.end();
13937*5c90c05cSAndroid Build Coastguard Worker          ++it) {
13938*5c90c05cSAndroid Build Coastguard Worker       if (it->second.leakable)  // The user said it's fine to leak this object.
13939*5c90c05cSAndroid Build Coastguard Worker         continue;
13940*5c90c05cSAndroid Build Coastguard Worker 
13941*5c90c05cSAndroid Build Coastguard Worker       // FIXME: Print the type of the leaked object.
13942*5c90c05cSAndroid Build Coastguard Worker       // This can help the user identify the leaked object.
13943*5c90c05cSAndroid Build Coastguard Worker       std::cout << "\n";
13944*5c90c05cSAndroid Build Coastguard Worker       const MockObjectState& state = it->second;
13945*5c90c05cSAndroid Build Coastguard Worker       std::cout << internal::FormatFileLocation(state.first_used_file,
13946*5c90c05cSAndroid Build Coastguard Worker                                                 state.first_used_line);
13947*5c90c05cSAndroid Build Coastguard Worker       std::cout << " ERROR: this mock object";
13948*5c90c05cSAndroid Build Coastguard Worker       if (state.first_used_test != "") {
13949*5c90c05cSAndroid Build Coastguard Worker         std::cout << " (used in test " << state.first_used_test_suite << "."
13950*5c90c05cSAndroid Build Coastguard Worker                   << state.first_used_test << ")";
13951*5c90c05cSAndroid Build Coastguard Worker       }
13952*5c90c05cSAndroid Build Coastguard Worker       std::cout << " should be deleted but never is. Its address is @"
13953*5c90c05cSAndroid Build Coastguard Worker            << it->first << ".";
13954*5c90c05cSAndroid Build Coastguard Worker       leaked_count++;
13955*5c90c05cSAndroid Build Coastguard Worker     }
13956*5c90c05cSAndroid Build Coastguard Worker     if (leaked_count > 0) {
13957*5c90c05cSAndroid Build Coastguard Worker       std::cout << "\nERROR: " << leaked_count << " leaked mock "
13958*5c90c05cSAndroid Build Coastguard Worker                 << (leaked_count == 1 ? "object" : "objects")
13959*5c90c05cSAndroid Build Coastguard Worker                 << " found at program exit. Expectations on a mock object are "
13960*5c90c05cSAndroid Build Coastguard Worker                    "verified when the object is destructed. Leaking a mock "
13961*5c90c05cSAndroid Build Coastguard Worker                    "means that its expectations aren't verified, which is "
13962*5c90c05cSAndroid Build Coastguard Worker                    "usually a test bug. If you really intend to leak a mock, "
13963*5c90c05cSAndroid Build Coastguard Worker                    "you can suppress this error using "
13964*5c90c05cSAndroid Build Coastguard Worker                    "testing::Mock::AllowLeak(mock_object), or you may use a "
13965*5c90c05cSAndroid Build Coastguard Worker                    "fake or stub instead of a mock.\n";
13966*5c90c05cSAndroid Build Coastguard Worker       std::cout.flush();
13967*5c90c05cSAndroid Build Coastguard Worker       ::std::cerr.flush();
13968*5c90c05cSAndroid Build Coastguard Worker       // RUN_ALL_TESTS() has already returned when this destructor is
13969*5c90c05cSAndroid Build Coastguard Worker       // called.  Therefore we cannot use the normal Google Test
13970*5c90c05cSAndroid Build Coastguard Worker       // failure reporting mechanism.
13971*5c90c05cSAndroid Build Coastguard Worker       _exit(1);  // We cannot call exit() as it is not reentrant and
13972*5c90c05cSAndroid Build Coastguard Worker                  // may already have been called.
13973*5c90c05cSAndroid Build Coastguard Worker     }
13974*5c90c05cSAndroid Build Coastguard Worker   }
13975*5c90c05cSAndroid Build Coastguard Worker 
states()13976*5c90c05cSAndroid Build Coastguard Worker   StateMap& states() { return states_; }
13977*5c90c05cSAndroid Build Coastguard Worker 
13978*5c90c05cSAndroid Build Coastguard Worker  private:
13979*5c90c05cSAndroid Build Coastguard Worker   StateMap states_;
13980*5c90c05cSAndroid Build Coastguard Worker };
13981*5c90c05cSAndroid Build Coastguard Worker 
13982*5c90c05cSAndroid Build Coastguard Worker // Protected by g_gmock_mutex.
13983*5c90c05cSAndroid Build Coastguard Worker MockObjectRegistry g_mock_object_registry;
13984*5c90c05cSAndroid Build Coastguard Worker 
13985*5c90c05cSAndroid Build Coastguard Worker // Maps a mock object to the reaction Google Mock should have when an
13986*5c90c05cSAndroid Build Coastguard Worker // uninteresting method is called.  Protected by g_gmock_mutex.
13987*5c90c05cSAndroid Build Coastguard Worker std::unordered_map<uintptr_t, internal::CallReaction>&
UninterestingCallReactionMap()13988*5c90c05cSAndroid Build Coastguard Worker UninterestingCallReactionMap() {
13989*5c90c05cSAndroid Build Coastguard Worker   static auto* map = new std::unordered_map<uintptr_t, internal::CallReaction>;
13990*5c90c05cSAndroid Build Coastguard Worker   return *map;
13991*5c90c05cSAndroid Build Coastguard Worker }
13992*5c90c05cSAndroid Build Coastguard Worker 
13993*5c90c05cSAndroid Build Coastguard Worker // Sets the reaction Google Mock should have when an uninteresting
13994*5c90c05cSAndroid Build Coastguard Worker // method of the given mock object is called.
SetReactionOnUninterestingCalls(uintptr_t mock_obj,internal::CallReaction reaction)13995*5c90c05cSAndroid Build Coastguard Worker void SetReactionOnUninterestingCalls(uintptr_t mock_obj,
13996*5c90c05cSAndroid Build Coastguard Worker                                      internal::CallReaction reaction)
13997*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {
13998*5c90c05cSAndroid Build Coastguard Worker   internal::MutexLock l(&internal::g_gmock_mutex);
13999*5c90c05cSAndroid Build Coastguard Worker   UninterestingCallReactionMap()[mock_obj] = reaction;
14000*5c90c05cSAndroid Build Coastguard Worker }
14001*5c90c05cSAndroid Build Coastguard Worker 
14002*5c90c05cSAndroid Build Coastguard Worker }  // namespace
14003*5c90c05cSAndroid Build Coastguard Worker 
14004*5c90c05cSAndroid Build Coastguard Worker // Tells Google Mock to allow uninteresting calls on the given mock
14005*5c90c05cSAndroid Build Coastguard Worker // object.
AllowUninterestingCalls(uintptr_t mock_obj)14006*5c90c05cSAndroid Build Coastguard Worker void Mock::AllowUninterestingCalls(uintptr_t mock_obj)
14007*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {
14008*5c90c05cSAndroid Build Coastguard Worker   SetReactionOnUninterestingCalls(mock_obj, internal::kAllow);
14009*5c90c05cSAndroid Build Coastguard Worker }
14010*5c90c05cSAndroid Build Coastguard Worker 
14011*5c90c05cSAndroid Build Coastguard Worker // Tells Google Mock to warn the user about uninteresting calls on the
14012*5c90c05cSAndroid Build Coastguard Worker // given mock object.
WarnUninterestingCalls(uintptr_t mock_obj)14013*5c90c05cSAndroid Build Coastguard Worker void Mock::WarnUninterestingCalls(uintptr_t mock_obj)
14014*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {
14015*5c90c05cSAndroid Build Coastguard Worker   SetReactionOnUninterestingCalls(mock_obj, internal::kWarn);
14016*5c90c05cSAndroid Build Coastguard Worker }
14017*5c90c05cSAndroid Build Coastguard Worker 
14018*5c90c05cSAndroid Build Coastguard Worker // Tells Google Mock to fail uninteresting calls on the given mock
14019*5c90c05cSAndroid Build Coastguard Worker // object.
FailUninterestingCalls(uintptr_t mock_obj)14020*5c90c05cSAndroid Build Coastguard Worker void Mock::FailUninterestingCalls(uintptr_t mock_obj)
14021*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {
14022*5c90c05cSAndroid Build Coastguard Worker   SetReactionOnUninterestingCalls(mock_obj, internal::kFail);
14023*5c90c05cSAndroid Build Coastguard Worker }
14024*5c90c05cSAndroid Build Coastguard Worker 
14025*5c90c05cSAndroid Build Coastguard Worker // Tells Google Mock the given mock object is being destroyed and its
14026*5c90c05cSAndroid Build Coastguard Worker // entry in the call-reaction table should be removed.
UnregisterCallReaction(uintptr_t mock_obj)14027*5c90c05cSAndroid Build Coastguard Worker void Mock::UnregisterCallReaction(uintptr_t mock_obj)
14028*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {
14029*5c90c05cSAndroid Build Coastguard Worker   internal::MutexLock l(&internal::g_gmock_mutex);
14030*5c90c05cSAndroid Build Coastguard Worker   UninterestingCallReactionMap().erase(static_cast<uintptr_t>(mock_obj));
14031*5c90c05cSAndroid Build Coastguard Worker }
14032*5c90c05cSAndroid Build Coastguard Worker 
14033*5c90c05cSAndroid Build Coastguard Worker // Returns the reaction Google Mock will have on uninteresting calls
14034*5c90c05cSAndroid Build Coastguard Worker // made on the given mock object.
GetReactionOnUninterestingCalls(const void * mock_obj)14035*5c90c05cSAndroid Build Coastguard Worker internal::CallReaction Mock::GetReactionOnUninterestingCalls(
14036*5c90c05cSAndroid Build Coastguard Worker     const void* mock_obj)
14037*5c90c05cSAndroid Build Coastguard Worker         GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {
14038*5c90c05cSAndroid Build Coastguard Worker   internal::MutexLock l(&internal::g_gmock_mutex);
14039*5c90c05cSAndroid Build Coastguard Worker   return (UninterestingCallReactionMap().count(
14040*5c90c05cSAndroid Build Coastguard Worker               reinterpret_cast<uintptr_t>(mock_obj)) == 0)
14041*5c90c05cSAndroid Build Coastguard Worker              ? internal::intToCallReaction(
14042*5c90c05cSAndroid Build Coastguard Worker                    GMOCK_FLAG(default_mock_behavior))
14043*5c90c05cSAndroid Build Coastguard Worker              : UninterestingCallReactionMap()[reinterpret_cast<uintptr_t>(
14044*5c90c05cSAndroid Build Coastguard Worker                    mock_obj)];
14045*5c90c05cSAndroid Build Coastguard Worker }
14046*5c90c05cSAndroid Build Coastguard Worker 
14047*5c90c05cSAndroid Build Coastguard Worker // Tells Google Mock to ignore mock_obj when checking for leaked mock
14048*5c90c05cSAndroid Build Coastguard Worker // objects.
AllowLeak(const void * mock_obj)14049*5c90c05cSAndroid Build Coastguard Worker void Mock::AllowLeak(const void* mock_obj)
14050*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {
14051*5c90c05cSAndroid Build Coastguard Worker   internal::MutexLock l(&internal::g_gmock_mutex);
14052*5c90c05cSAndroid Build Coastguard Worker   g_mock_object_registry.states()[mock_obj].leakable = true;
14053*5c90c05cSAndroid Build Coastguard Worker }
14054*5c90c05cSAndroid Build Coastguard Worker 
14055*5c90c05cSAndroid Build Coastguard Worker // Verifies and clears all expectations on the given mock object.  If
14056*5c90c05cSAndroid Build Coastguard Worker // the expectations aren't satisfied, generates one or more Google
14057*5c90c05cSAndroid Build Coastguard Worker // Test non-fatal failures and returns false.
VerifyAndClearExpectations(void * mock_obj)14058*5c90c05cSAndroid Build Coastguard Worker bool Mock::VerifyAndClearExpectations(void* mock_obj)
14059*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {
14060*5c90c05cSAndroid Build Coastguard Worker   internal::MutexLock l(&internal::g_gmock_mutex);
14061*5c90c05cSAndroid Build Coastguard Worker   return VerifyAndClearExpectationsLocked(mock_obj);
14062*5c90c05cSAndroid Build Coastguard Worker }
14063*5c90c05cSAndroid Build Coastguard Worker 
14064*5c90c05cSAndroid Build Coastguard Worker // Verifies all expectations on the given mock object and clears its
14065*5c90c05cSAndroid Build Coastguard Worker // default actions and expectations.  Returns true if and only if the
14066*5c90c05cSAndroid Build Coastguard Worker // verification was successful.
VerifyAndClear(void * mock_obj)14067*5c90c05cSAndroid Build Coastguard Worker bool Mock::VerifyAndClear(void* mock_obj)
14068*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {
14069*5c90c05cSAndroid Build Coastguard Worker   internal::MutexLock l(&internal::g_gmock_mutex);
14070*5c90c05cSAndroid Build Coastguard Worker   ClearDefaultActionsLocked(mock_obj);
14071*5c90c05cSAndroid Build Coastguard Worker   return VerifyAndClearExpectationsLocked(mock_obj);
14072*5c90c05cSAndroid Build Coastguard Worker }
14073*5c90c05cSAndroid Build Coastguard Worker 
14074*5c90c05cSAndroid Build Coastguard Worker // Verifies and clears all expectations on the given mock object.  If
14075*5c90c05cSAndroid Build Coastguard Worker // the expectations aren't satisfied, generates one or more Google
14076*5c90c05cSAndroid Build Coastguard Worker // Test non-fatal failures and returns false.
VerifyAndClearExpectationsLocked(void * mock_obj)14077*5c90c05cSAndroid Build Coastguard Worker bool Mock::VerifyAndClearExpectationsLocked(void* mock_obj)
14078*5c90c05cSAndroid Build Coastguard Worker     GTEST_EXCLUSIVE_LOCK_REQUIRED_(internal::g_gmock_mutex) {
14079*5c90c05cSAndroid Build Coastguard Worker   internal::g_gmock_mutex.AssertHeld();
14080*5c90c05cSAndroid Build Coastguard Worker   if (g_mock_object_registry.states().count(mock_obj) == 0) {
14081*5c90c05cSAndroid Build Coastguard Worker     // No EXPECT_CALL() was set on the given mock object.
14082*5c90c05cSAndroid Build Coastguard Worker     return true;
14083*5c90c05cSAndroid Build Coastguard Worker   }
14084*5c90c05cSAndroid Build Coastguard Worker 
14085*5c90c05cSAndroid Build Coastguard Worker   // Verifies and clears the expectations on each mock method in the
14086*5c90c05cSAndroid Build Coastguard Worker   // given mock object.
14087*5c90c05cSAndroid Build Coastguard Worker   bool expectations_met = true;
14088*5c90c05cSAndroid Build Coastguard Worker   FunctionMockers& mockers =
14089*5c90c05cSAndroid Build Coastguard Worker       g_mock_object_registry.states()[mock_obj].function_mockers;
14090*5c90c05cSAndroid Build Coastguard Worker   for (FunctionMockers::const_iterator it = mockers.begin();
14091*5c90c05cSAndroid Build Coastguard Worker        it != mockers.end(); ++it) {
14092*5c90c05cSAndroid Build Coastguard Worker     if (!(*it)->VerifyAndClearExpectationsLocked()) {
14093*5c90c05cSAndroid Build Coastguard Worker       expectations_met = false;
14094*5c90c05cSAndroid Build Coastguard Worker     }
14095*5c90c05cSAndroid Build Coastguard Worker   }
14096*5c90c05cSAndroid Build Coastguard Worker 
14097*5c90c05cSAndroid Build Coastguard Worker   // We don't clear the content of mockers, as they may still be
14098*5c90c05cSAndroid Build Coastguard Worker   // needed by ClearDefaultActionsLocked().
14099*5c90c05cSAndroid Build Coastguard Worker   return expectations_met;
14100*5c90c05cSAndroid Build Coastguard Worker }
14101*5c90c05cSAndroid Build Coastguard Worker 
IsNaggy(void * mock_obj)14102*5c90c05cSAndroid Build Coastguard Worker bool Mock::IsNaggy(void* mock_obj)
14103*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {
14104*5c90c05cSAndroid Build Coastguard Worker   return Mock::GetReactionOnUninterestingCalls(mock_obj) == internal::kWarn;
14105*5c90c05cSAndroid Build Coastguard Worker }
IsNice(void * mock_obj)14106*5c90c05cSAndroid Build Coastguard Worker bool Mock::IsNice(void* mock_obj)
14107*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {
14108*5c90c05cSAndroid Build Coastguard Worker   return Mock::GetReactionOnUninterestingCalls(mock_obj) == internal::kAllow;
14109*5c90c05cSAndroid Build Coastguard Worker }
IsStrict(void * mock_obj)14110*5c90c05cSAndroid Build Coastguard Worker bool Mock::IsStrict(void* mock_obj)
14111*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {
14112*5c90c05cSAndroid Build Coastguard Worker   return Mock::GetReactionOnUninterestingCalls(mock_obj) == internal::kFail;
14113*5c90c05cSAndroid Build Coastguard Worker }
14114*5c90c05cSAndroid Build Coastguard Worker 
14115*5c90c05cSAndroid Build Coastguard Worker // Registers a mock object and a mock method it owns.
Register(const void * mock_obj,internal::UntypedFunctionMockerBase * mocker)14116*5c90c05cSAndroid Build Coastguard Worker void Mock::Register(const void* mock_obj,
14117*5c90c05cSAndroid Build Coastguard Worker                     internal::UntypedFunctionMockerBase* mocker)
14118*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {
14119*5c90c05cSAndroid Build Coastguard Worker   internal::MutexLock l(&internal::g_gmock_mutex);
14120*5c90c05cSAndroid Build Coastguard Worker   g_mock_object_registry.states()[mock_obj].function_mockers.insert(mocker);
14121*5c90c05cSAndroid Build Coastguard Worker }
14122*5c90c05cSAndroid Build Coastguard Worker 
14123*5c90c05cSAndroid Build Coastguard Worker // Tells Google Mock where in the source code mock_obj is used in an
14124*5c90c05cSAndroid Build Coastguard Worker // ON_CALL or EXPECT_CALL.  In case mock_obj is leaked, this
14125*5c90c05cSAndroid Build Coastguard Worker // information helps the user identify which object it is.
RegisterUseByOnCallOrExpectCall(const void * mock_obj,const char * file,int line)14126*5c90c05cSAndroid Build Coastguard Worker void Mock::RegisterUseByOnCallOrExpectCall(const void* mock_obj,
14127*5c90c05cSAndroid Build Coastguard Worker                                            const char* file, int line)
14128*5c90c05cSAndroid Build Coastguard Worker     GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {
14129*5c90c05cSAndroid Build Coastguard Worker   internal::MutexLock l(&internal::g_gmock_mutex);
14130*5c90c05cSAndroid Build Coastguard Worker   MockObjectState& state = g_mock_object_registry.states()[mock_obj];
14131*5c90c05cSAndroid Build Coastguard Worker   if (state.first_used_file == nullptr) {
14132*5c90c05cSAndroid Build Coastguard Worker     state.first_used_file = file;
14133*5c90c05cSAndroid Build Coastguard Worker     state.first_used_line = line;
14134*5c90c05cSAndroid Build Coastguard Worker     const TestInfo* const test_info =
14135*5c90c05cSAndroid Build Coastguard Worker         UnitTest::GetInstance()->current_test_info();
14136*5c90c05cSAndroid Build Coastguard Worker     if (test_info != nullptr) {
14137*5c90c05cSAndroid Build Coastguard Worker       state.first_used_test_suite = test_info->test_suite_name();
14138*5c90c05cSAndroid Build Coastguard Worker       state.first_used_test = test_info->name();
14139*5c90c05cSAndroid Build Coastguard Worker     }
14140*5c90c05cSAndroid Build Coastguard Worker   }
14141*5c90c05cSAndroid Build Coastguard Worker }
14142*5c90c05cSAndroid Build Coastguard Worker 
14143*5c90c05cSAndroid Build Coastguard Worker // Unregisters a mock method; removes the owning mock object from the
14144*5c90c05cSAndroid Build Coastguard Worker // registry when the last mock method associated with it has been
14145*5c90c05cSAndroid Build Coastguard Worker // unregistered.  This is called only in the destructor of
14146*5c90c05cSAndroid Build Coastguard Worker // FunctionMockerBase.
UnregisterLocked(internal::UntypedFunctionMockerBase * mocker)14147*5c90c05cSAndroid Build Coastguard Worker void Mock::UnregisterLocked(internal::UntypedFunctionMockerBase* mocker)
14148*5c90c05cSAndroid Build Coastguard Worker     GTEST_EXCLUSIVE_LOCK_REQUIRED_(internal::g_gmock_mutex) {
14149*5c90c05cSAndroid Build Coastguard Worker   internal::g_gmock_mutex.AssertHeld();
14150*5c90c05cSAndroid Build Coastguard Worker   for (MockObjectRegistry::StateMap::iterator it =
14151*5c90c05cSAndroid Build Coastguard Worker            g_mock_object_registry.states().begin();
14152*5c90c05cSAndroid Build Coastguard Worker        it != g_mock_object_registry.states().end(); ++it) {
14153*5c90c05cSAndroid Build Coastguard Worker     FunctionMockers& mockers = it->second.function_mockers;
14154*5c90c05cSAndroid Build Coastguard Worker     if (mockers.erase(mocker) > 0) {
14155*5c90c05cSAndroid Build Coastguard Worker       // mocker was in mockers and has been just removed.
14156*5c90c05cSAndroid Build Coastguard Worker       if (mockers.empty()) {
14157*5c90c05cSAndroid Build Coastguard Worker         g_mock_object_registry.states().erase(it);
14158*5c90c05cSAndroid Build Coastguard Worker       }
14159*5c90c05cSAndroid Build Coastguard Worker       return;
14160*5c90c05cSAndroid Build Coastguard Worker     }
14161*5c90c05cSAndroid Build Coastguard Worker   }
14162*5c90c05cSAndroid Build Coastguard Worker }
14163*5c90c05cSAndroid Build Coastguard Worker 
14164*5c90c05cSAndroid Build Coastguard Worker // Clears all ON_CALL()s set on the given mock object.
ClearDefaultActionsLocked(void * mock_obj)14165*5c90c05cSAndroid Build Coastguard Worker void Mock::ClearDefaultActionsLocked(void* mock_obj)
14166*5c90c05cSAndroid Build Coastguard Worker     GTEST_EXCLUSIVE_LOCK_REQUIRED_(internal::g_gmock_mutex) {
14167*5c90c05cSAndroid Build Coastguard Worker   internal::g_gmock_mutex.AssertHeld();
14168*5c90c05cSAndroid Build Coastguard Worker 
14169*5c90c05cSAndroid Build Coastguard Worker   if (g_mock_object_registry.states().count(mock_obj) == 0) {
14170*5c90c05cSAndroid Build Coastguard Worker     // No ON_CALL() was set on the given mock object.
14171*5c90c05cSAndroid Build Coastguard Worker     return;
14172*5c90c05cSAndroid Build Coastguard Worker   }
14173*5c90c05cSAndroid Build Coastguard Worker 
14174*5c90c05cSAndroid Build Coastguard Worker   // Clears the default actions for each mock method in the given mock
14175*5c90c05cSAndroid Build Coastguard Worker   // object.
14176*5c90c05cSAndroid Build Coastguard Worker   FunctionMockers& mockers =
14177*5c90c05cSAndroid Build Coastguard Worker       g_mock_object_registry.states()[mock_obj].function_mockers;
14178*5c90c05cSAndroid Build Coastguard Worker   for (FunctionMockers::const_iterator it = mockers.begin();
14179*5c90c05cSAndroid Build Coastguard Worker        it != mockers.end(); ++it) {
14180*5c90c05cSAndroid Build Coastguard Worker     (*it)->ClearDefaultActionsLocked();
14181*5c90c05cSAndroid Build Coastguard Worker   }
14182*5c90c05cSAndroid Build Coastguard Worker 
14183*5c90c05cSAndroid Build Coastguard Worker   // We don't clear the content of mockers, as they may still be
14184*5c90c05cSAndroid Build Coastguard Worker   // needed by VerifyAndClearExpectationsLocked().
14185*5c90c05cSAndroid Build Coastguard Worker }
14186*5c90c05cSAndroid Build Coastguard Worker 
Expectation()14187*5c90c05cSAndroid Build Coastguard Worker Expectation::Expectation() {}
14188*5c90c05cSAndroid Build Coastguard Worker 
Expectation(const std::shared_ptr<internal::ExpectationBase> & an_expectation_base)14189*5c90c05cSAndroid Build Coastguard Worker Expectation::Expectation(
14190*5c90c05cSAndroid Build Coastguard Worker     const std::shared_ptr<internal::ExpectationBase>& an_expectation_base)
14191*5c90c05cSAndroid Build Coastguard Worker     : expectation_base_(an_expectation_base) {}
14192*5c90c05cSAndroid Build Coastguard Worker 
~Expectation()14193*5c90c05cSAndroid Build Coastguard Worker Expectation::~Expectation() {}
14194*5c90c05cSAndroid Build Coastguard Worker 
14195*5c90c05cSAndroid Build Coastguard Worker // Adds an expectation to a sequence.
AddExpectation(const Expectation & expectation) const14196*5c90c05cSAndroid Build Coastguard Worker void Sequence::AddExpectation(const Expectation& expectation) const {
14197*5c90c05cSAndroid Build Coastguard Worker   if (*last_expectation_ != expectation) {
14198*5c90c05cSAndroid Build Coastguard Worker     if (last_expectation_->expectation_base() != nullptr) {
14199*5c90c05cSAndroid Build Coastguard Worker       expectation.expectation_base()->immediate_prerequisites_
14200*5c90c05cSAndroid Build Coastguard Worker           += *last_expectation_;
14201*5c90c05cSAndroid Build Coastguard Worker     }
14202*5c90c05cSAndroid Build Coastguard Worker     *last_expectation_ = expectation;
14203*5c90c05cSAndroid Build Coastguard Worker   }
14204*5c90c05cSAndroid Build Coastguard Worker }
14205*5c90c05cSAndroid Build Coastguard Worker 
14206*5c90c05cSAndroid Build Coastguard Worker // Creates the implicit sequence if there isn't one.
InSequence()14207*5c90c05cSAndroid Build Coastguard Worker InSequence::InSequence() {
14208*5c90c05cSAndroid Build Coastguard Worker   if (internal::g_gmock_implicit_sequence.get() == nullptr) {
14209*5c90c05cSAndroid Build Coastguard Worker     internal::g_gmock_implicit_sequence.set(new Sequence);
14210*5c90c05cSAndroid Build Coastguard Worker     sequence_created_ = true;
14211*5c90c05cSAndroid Build Coastguard Worker   } else {
14212*5c90c05cSAndroid Build Coastguard Worker     sequence_created_ = false;
14213*5c90c05cSAndroid Build Coastguard Worker   }
14214*5c90c05cSAndroid Build Coastguard Worker }
14215*5c90c05cSAndroid Build Coastguard Worker 
14216*5c90c05cSAndroid Build Coastguard Worker // Deletes the implicit sequence if it was created by the constructor
14217*5c90c05cSAndroid Build Coastguard Worker // of this object.
~InSequence()14218*5c90c05cSAndroid Build Coastguard Worker InSequence::~InSequence() {
14219*5c90c05cSAndroid Build Coastguard Worker   if (sequence_created_) {
14220*5c90c05cSAndroid Build Coastguard Worker     delete internal::g_gmock_implicit_sequence.get();
14221*5c90c05cSAndroid Build Coastguard Worker     internal::g_gmock_implicit_sequence.set(nullptr);
14222*5c90c05cSAndroid Build Coastguard Worker   }
14223*5c90c05cSAndroid Build Coastguard Worker }
14224*5c90c05cSAndroid Build Coastguard Worker 
14225*5c90c05cSAndroid Build Coastguard Worker }  // namespace testing
14226*5c90c05cSAndroid Build Coastguard Worker 
14227*5c90c05cSAndroid Build Coastguard Worker #ifdef _MSC_VER
14228*5c90c05cSAndroid Build Coastguard Worker #if _MSC_VER == 1900
14229*5c90c05cSAndroid Build Coastguard Worker #  pragma warning(pop)
14230*5c90c05cSAndroid Build Coastguard Worker #endif
14231*5c90c05cSAndroid Build Coastguard Worker #endif
14232*5c90c05cSAndroid Build Coastguard Worker // Copyright 2008, Google Inc.
14233*5c90c05cSAndroid Build Coastguard Worker // All rights reserved.
14234*5c90c05cSAndroid Build Coastguard Worker //
14235*5c90c05cSAndroid Build Coastguard Worker // Redistribution and use in source and binary forms, with or without
14236*5c90c05cSAndroid Build Coastguard Worker // modification, are permitted provided that the following conditions are
14237*5c90c05cSAndroid Build Coastguard Worker // met:
14238*5c90c05cSAndroid Build Coastguard Worker //
14239*5c90c05cSAndroid Build Coastguard Worker //     * Redistributions of source code must retain the above copyright
14240*5c90c05cSAndroid Build Coastguard Worker // notice, this list of conditions and the following disclaimer.
14241*5c90c05cSAndroid Build Coastguard Worker //     * Redistributions in binary form must reproduce the above
14242*5c90c05cSAndroid Build Coastguard Worker // copyright notice, this list of conditions and the following disclaimer
14243*5c90c05cSAndroid Build Coastguard Worker // in the documentation and/or other materials provided with the
14244*5c90c05cSAndroid Build Coastguard Worker // distribution.
14245*5c90c05cSAndroid Build Coastguard Worker //     * Neither the name of Google Inc. nor the names of its
14246*5c90c05cSAndroid Build Coastguard Worker // contributors may be used to endorse or promote products derived from
14247*5c90c05cSAndroid Build Coastguard Worker // this software without specific prior written permission.
14248*5c90c05cSAndroid Build Coastguard Worker //
14249*5c90c05cSAndroid Build Coastguard Worker // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
14250*5c90c05cSAndroid Build Coastguard Worker // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
14251*5c90c05cSAndroid Build Coastguard Worker // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
14252*5c90c05cSAndroid Build Coastguard Worker // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
14253*5c90c05cSAndroid Build Coastguard Worker // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
14254*5c90c05cSAndroid Build Coastguard Worker // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
14255*5c90c05cSAndroid Build Coastguard Worker // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
14256*5c90c05cSAndroid Build Coastguard Worker // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
14257*5c90c05cSAndroid Build Coastguard Worker // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
14258*5c90c05cSAndroid Build Coastguard Worker // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
14259*5c90c05cSAndroid Build Coastguard Worker // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
14260*5c90c05cSAndroid Build Coastguard Worker 
14261*5c90c05cSAndroid Build Coastguard Worker 
14262*5c90c05cSAndroid Build Coastguard Worker 
14263*5c90c05cSAndroid Build Coastguard Worker namespace testing {
14264*5c90c05cSAndroid Build Coastguard Worker 
14265*5c90c05cSAndroid Build Coastguard Worker GMOCK_DEFINE_bool_(catch_leaked_mocks, true,
14266*5c90c05cSAndroid Build Coastguard Worker                    "true if and only if Google Mock should report leaked "
14267*5c90c05cSAndroid Build Coastguard Worker                    "mock objects as failures.");
14268*5c90c05cSAndroid Build Coastguard Worker 
14269*5c90c05cSAndroid Build Coastguard Worker GMOCK_DEFINE_string_(verbose, internal::kWarningVerbosity,
14270*5c90c05cSAndroid Build Coastguard Worker                      "Controls how verbose Google Mock's output is."
14271*5c90c05cSAndroid Build Coastguard Worker                      "  Valid values:\n"
14272*5c90c05cSAndroid Build Coastguard Worker                      "  info    - prints all messages.\n"
14273*5c90c05cSAndroid Build Coastguard Worker                      "  warning - prints warnings and errors.\n"
14274*5c90c05cSAndroid Build Coastguard Worker                      "  error   - prints errors only.");
14275*5c90c05cSAndroid Build Coastguard Worker 
14276*5c90c05cSAndroid Build Coastguard Worker GMOCK_DEFINE_int32_(default_mock_behavior, 1,
14277*5c90c05cSAndroid Build Coastguard Worker                     "Controls the default behavior of mocks."
14278*5c90c05cSAndroid Build Coastguard Worker                     "  Valid values:\n"
14279*5c90c05cSAndroid Build Coastguard Worker                     "  0 - by default, mocks act as NiceMocks.\n"
14280*5c90c05cSAndroid Build Coastguard Worker                     "  1 - by default, mocks act as NaggyMocks.\n"
14281*5c90c05cSAndroid Build Coastguard Worker                     "  2 - by default, mocks act as StrictMocks.");
14282*5c90c05cSAndroid Build Coastguard Worker 
14283*5c90c05cSAndroid Build Coastguard Worker namespace internal {
14284*5c90c05cSAndroid Build Coastguard Worker 
14285*5c90c05cSAndroid Build Coastguard Worker // Parses a string as a command line flag.  The string should have the
14286*5c90c05cSAndroid Build Coastguard Worker // format "--gmock_flag=value".  When def_optional is true, the
14287*5c90c05cSAndroid Build Coastguard Worker // "=value" part can be omitted.
14288*5c90c05cSAndroid Build Coastguard Worker //
14289*5c90c05cSAndroid Build Coastguard Worker // Returns the value of the flag, or NULL if the parsing failed.
ParseGoogleMockFlagValue(const char * str,const char * flag,bool def_optional)14290*5c90c05cSAndroid Build Coastguard Worker static const char* ParseGoogleMockFlagValue(const char* str,
14291*5c90c05cSAndroid Build Coastguard Worker                                             const char* flag,
14292*5c90c05cSAndroid Build Coastguard Worker                                             bool def_optional) {
14293*5c90c05cSAndroid Build Coastguard Worker   // str and flag must not be NULL.
14294*5c90c05cSAndroid Build Coastguard Worker   if (str == nullptr || flag == nullptr) return nullptr;
14295*5c90c05cSAndroid Build Coastguard Worker 
14296*5c90c05cSAndroid Build Coastguard Worker   // The flag must start with "--gmock_".
14297*5c90c05cSAndroid Build Coastguard Worker   const std::string flag_str = std::string("--gmock_") + flag;
14298*5c90c05cSAndroid Build Coastguard Worker   const size_t flag_len = flag_str.length();
14299*5c90c05cSAndroid Build Coastguard Worker   if (strncmp(str, flag_str.c_str(), flag_len) != 0) return nullptr;
14300*5c90c05cSAndroid Build Coastguard Worker 
14301*5c90c05cSAndroid Build Coastguard Worker   // Skips the flag name.
14302*5c90c05cSAndroid Build Coastguard Worker   const char* flag_end = str + flag_len;
14303*5c90c05cSAndroid Build Coastguard Worker 
14304*5c90c05cSAndroid Build Coastguard Worker   // When def_optional is true, it's OK to not have a "=value" part.
14305*5c90c05cSAndroid Build Coastguard Worker   if (def_optional && (flag_end[0] == '\0')) {
14306*5c90c05cSAndroid Build Coastguard Worker     return flag_end;
14307*5c90c05cSAndroid Build Coastguard Worker   }
14308*5c90c05cSAndroid Build Coastguard Worker 
14309*5c90c05cSAndroid Build Coastguard Worker   // If def_optional is true and there are more characters after the
14310*5c90c05cSAndroid Build Coastguard Worker   // flag name, or if def_optional is false, there must be a '=' after
14311*5c90c05cSAndroid Build Coastguard Worker   // the flag name.
14312*5c90c05cSAndroid Build Coastguard Worker   if (flag_end[0] != '=') return nullptr;
14313*5c90c05cSAndroid Build Coastguard Worker 
14314*5c90c05cSAndroid Build Coastguard Worker   // Returns the string after "=".
14315*5c90c05cSAndroid Build Coastguard Worker   return flag_end + 1;
14316*5c90c05cSAndroid Build Coastguard Worker }
14317*5c90c05cSAndroid Build Coastguard Worker 
14318*5c90c05cSAndroid Build Coastguard Worker // Parses a string for a Google Mock bool flag, in the form of
14319*5c90c05cSAndroid Build Coastguard Worker // "--gmock_flag=value".
14320*5c90c05cSAndroid Build Coastguard Worker //
14321*5c90c05cSAndroid Build Coastguard Worker // On success, stores the value of the flag in *value, and returns
14322*5c90c05cSAndroid Build Coastguard Worker // true.  On failure, returns false without changing *value.
ParseGoogleMockBoolFlag(const char * str,const char * flag,bool * value)14323*5c90c05cSAndroid Build Coastguard Worker static bool ParseGoogleMockBoolFlag(const char* str, const char* flag,
14324*5c90c05cSAndroid Build Coastguard Worker                                     bool* value) {
14325*5c90c05cSAndroid Build Coastguard Worker   // Gets the value of the flag as a string.
14326*5c90c05cSAndroid Build Coastguard Worker   const char* const value_str = ParseGoogleMockFlagValue(str, flag, true);
14327*5c90c05cSAndroid Build Coastguard Worker 
14328*5c90c05cSAndroid Build Coastguard Worker   // Aborts if the parsing failed.
14329*5c90c05cSAndroid Build Coastguard Worker   if (value_str == nullptr) return false;
14330*5c90c05cSAndroid Build Coastguard Worker 
14331*5c90c05cSAndroid Build Coastguard Worker   // Converts the string value to a bool.
14332*5c90c05cSAndroid Build Coastguard Worker   *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F');
14333*5c90c05cSAndroid Build Coastguard Worker   return true;
14334*5c90c05cSAndroid Build Coastguard Worker }
14335*5c90c05cSAndroid Build Coastguard Worker 
14336*5c90c05cSAndroid Build Coastguard Worker // Parses a string for a Google Mock string flag, in the form of
14337*5c90c05cSAndroid Build Coastguard Worker // "--gmock_flag=value".
14338*5c90c05cSAndroid Build Coastguard Worker //
14339*5c90c05cSAndroid Build Coastguard Worker // On success, stores the value of the flag in *value, and returns
14340*5c90c05cSAndroid Build Coastguard Worker // true.  On failure, returns false without changing *value.
14341*5c90c05cSAndroid Build Coastguard Worker template <typename String>
ParseGoogleMockStringFlag(const char * str,const char * flag,String * value)14342*5c90c05cSAndroid Build Coastguard Worker static bool ParseGoogleMockStringFlag(const char* str, const char* flag,
14343*5c90c05cSAndroid Build Coastguard Worker                                       String* value) {
14344*5c90c05cSAndroid Build Coastguard Worker   // Gets the value of the flag as a string.
14345*5c90c05cSAndroid Build Coastguard Worker   const char* const value_str = ParseGoogleMockFlagValue(str, flag, false);
14346*5c90c05cSAndroid Build Coastguard Worker 
14347*5c90c05cSAndroid Build Coastguard Worker   // Aborts if the parsing failed.
14348*5c90c05cSAndroid Build Coastguard Worker   if (value_str == nullptr) return false;
14349*5c90c05cSAndroid Build Coastguard Worker 
14350*5c90c05cSAndroid Build Coastguard Worker   // Sets *value to the value of the flag.
14351*5c90c05cSAndroid Build Coastguard Worker   *value = value_str;
14352*5c90c05cSAndroid Build Coastguard Worker   return true;
14353*5c90c05cSAndroid Build Coastguard Worker }
14354*5c90c05cSAndroid Build Coastguard Worker 
ParseGoogleMockIntFlag(const char * str,const char * flag,int32_t * value)14355*5c90c05cSAndroid Build Coastguard Worker static bool ParseGoogleMockIntFlag(const char* str, const char* flag,
14356*5c90c05cSAndroid Build Coastguard Worker                                    int32_t* value) {
14357*5c90c05cSAndroid Build Coastguard Worker   // Gets the value of the flag as a string.
14358*5c90c05cSAndroid Build Coastguard Worker   const char* const value_str = ParseGoogleMockFlagValue(str, flag, true);
14359*5c90c05cSAndroid Build Coastguard Worker 
14360*5c90c05cSAndroid Build Coastguard Worker   // Aborts if the parsing failed.
14361*5c90c05cSAndroid Build Coastguard Worker   if (value_str == nullptr) return false;
14362*5c90c05cSAndroid Build Coastguard Worker 
14363*5c90c05cSAndroid Build Coastguard Worker   // Sets *value to the value of the flag.
14364*5c90c05cSAndroid Build Coastguard Worker   return ParseInt32(Message() << "The value of flag --" << flag,
14365*5c90c05cSAndroid Build Coastguard Worker                     value_str, value);
14366*5c90c05cSAndroid Build Coastguard Worker }
14367*5c90c05cSAndroid Build Coastguard Worker 
14368*5c90c05cSAndroid Build Coastguard Worker // The internal implementation of InitGoogleMock().
14369*5c90c05cSAndroid Build Coastguard Worker //
14370*5c90c05cSAndroid Build Coastguard Worker // The type parameter CharType can be instantiated to either char or
14371*5c90c05cSAndroid Build Coastguard Worker // wchar_t.
14372*5c90c05cSAndroid Build Coastguard Worker template <typename CharType>
InitGoogleMockImpl(int * argc,CharType ** argv)14373*5c90c05cSAndroid Build Coastguard Worker void InitGoogleMockImpl(int* argc, CharType** argv) {
14374*5c90c05cSAndroid Build Coastguard Worker   // Makes sure Google Test is initialized.  InitGoogleTest() is
14375*5c90c05cSAndroid Build Coastguard Worker   // idempotent, so it's fine if the user has already called it.
14376*5c90c05cSAndroid Build Coastguard Worker   InitGoogleTest(argc, argv);
14377*5c90c05cSAndroid Build Coastguard Worker   if (*argc <= 0) return;
14378*5c90c05cSAndroid Build Coastguard Worker 
14379*5c90c05cSAndroid Build Coastguard Worker   for (int i = 1; i != *argc; i++) {
14380*5c90c05cSAndroid Build Coastguard Worker     const std::string arg_string = StreamableToString(argv[i]);
14381*5c90c05cSAndroid Build Coastguard Worker     const char* const arg = arg_string.c_str();
14382*5c90c05cSAndroid Build Coastguard Worker 
14383*5c90c05cSAndroid Build Coastguard Worker     // Do we see a Google Mock flag?
14384*5c90c05cSAndroid Build Coastguard Worker     if (ParseGoogleMockBoolFlag(arg, "catch_leaked_mocks",
14385*5c90c05cSAndroid Build Coastguard Worker                                 &GMOCK_FLAG(catch_leaked_mocks)) ||
14386*5c90c05cSAndroid Build Coastguard Worker         ParseGoogleMockStringFlag(arg, "verbose", &GMOCK_FLAG(verbose)) ||
14387*5c90c05cSAndroid Build Coastguard Worker         ParseGoogleMockIntFlag(arg, "default_mock_behavior",
14388*5c90c05cSAndroid Build Coastguard Worker                                &GMOCK_FLAG(default_mock_behavior))) {
14389*5c90c05cSAndroid Build Coastguard Worker       // Yes.  Shift the remainder of the argv list left by one.  Note
14390*5c90c05cSAndroid Build Coastguard Worker       // that argv has (*argc + 1) elements, the last one always being
14391*5c90c05cSAndroid Build Coastguard Worker       // NULL.  The following loop moves the trailing NULL element as
14392*5c90c05cSAndroid Build Coastguard Worker       // well.
14393*5c90c05cSAndroid Build Coastguard Worker       for (int j = i; j != *argc; j++) {
14394*5c90c05cSAndroid Build Coastguard Worker         argv[j] = argv[j + 1];
14395*5c90c05cSAndroid Build Coastguard Worker       }
14396*5c90c05cSAndroid Build Coastguard Worker 
14397*5c90c05cSAndroid Build Coastguard Worker       // Decrements the argument count.
14398*5c90c05cSAndroid Build Coastguard Worker       (*argc)--;
14399*5c90c05cSAndroid Build Coastguard Worker 
14400*5c90c05cSAndroid Build Coastguard Worker       // We also need to decrement the iterator as we just removed
14401*5c90c05cSAndroid Build Coastguard Worker       // an element.
14402*5c90c05cSAndroid Build Coastguard Worker       i--;
14403*5c90c05cSAndroid Build Coastguard Worker     }
14404*5c90c05cSAndroid Build Coastguard Worker   }
14405*5c90c05cSAndroid Build Coastguard Worker }
14406*5c90c05cSAndroid Build Coastguard Worker 
14407*5c90c05cSAndroid Build Coastguard Worker }  // namespace internal
14408*5c90c05cSAndroid Build Coastguard Worker 
14409*5c90c05cSAndroid Build Coastguard Worker // Initializes Google Mock.  This must be called before running the
14410*5c90c05cSAndroid Build Coastguard Worker // tests.  In particular, it parses a command line for the flags that
14411*5c90c05cSAndroid Build Coastguard Worker // Google Mock recognizes.  Whenever a Google Mock flag is seen, it is
14412*5c90c05cSAndroid Build Coastguard Worker // removed from argv, and *argc is decremented.
14413*5c90c05cSAndroid Build Coastguard Worker //
14414*5c90c05cSAndroid Build Coastguard Worker // No value is returned.  Instead, the Google Mock flag variables are
14415*5c90c05cSAndroid Build Coastguard Worker // updated.
14416*5c90c05cSAndroid Build Coastguard Worker //
14417*5c90c05cSAndroid Build Coastguard Worker // Since Google Test is needed for Google Mock to work, this function
14418*5c90c05cSAndroid Build Coastguard Worker // also initializes Google Test and parses its flags, if that hasn't
14419*5c90c05cSAndroid Build Coastguard Worker // been done.
InitGoogleMock(int * argc,char ** argv)14420*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ void InitGoogleMock(int* argc, char** argv) {
14421*5c90c05cSAndroid Build Coastguard Worker   internal::InitGoogleMockImpl(argc, argv);
14422*5c90c05cSAndroid Build Coastguard Worker }
14423*5c90c05cSAndroid Build Coastguard Worker 
14424*5c90c05cSAndroid Build Coastguard Worker // This overloaded version can be used in Windows programs compiled in
14425*5c90c05cSAndroid Build Coastguard Worker // UNICODE mode.
InitGoogleMock(int * argc,wchar_t ** argv)14426*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ void InitGoogleMock(int* argc, wchar_t** argv) {
14427*5c90c05cSAndroid Build Coastguard Worker   internal::InitGoogleMockImpl(argc, argv);
14428*5c90c05cSAndroid Build Coastguard Worker }
14429*5c90c05cSAndroid Build Coastguard Worker 
14430*5c90c05cSAndroid Build Coastguard Worker // This overloaded version can be used on Arduino/embedded platforms where
14431*5c90c05cSAndroid Build Coastguard Worker // there is no argc/argv.
InitGoogleMock()14432*5c90c05cSAndroid Build Coastguard Worker GTEST_API_ void InitGoogleMock() {
14433*5c90c05cSAndroid Build Coastguard Worker   // Since Arduino doesn't have a command line, fake out the argc/argv arguments
14434*5c90c05cSAndroid Build Coastguard Worker   int argc = 1;
14435*5c90c05cSAndroid Build Coastguard Worker   const auto arg0 = "dummy";
14436*5c90c05cSAndroid Build Coastguard Worker   char* argv0 = const_cast<char*>(arg0);
14437*5c90c05cSAndroid Build Coastguard Worker   char** argv = &argv0;
14438*5c90c05cSAndroid Build Coastguard Worker 
14439*5c90c05cSAndroid Build Coastguard Worker   internal::InitGoogleMockImpl(&argc, argv);
14440*5c90c05cSAndroid Build Coastguard Worker }
14441*5c90c05cSAndroid Build Coastguard Worker 
14442*5c90c05cSAndroid Build Coastguard Worker }  // namespace testing
14443