jieba-rb 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (117) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/.gitmodules +3 -0
  4. data/.travis.yml +19 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +85 -0
  8. data/Rakefile +15 -0
  9. data/ext/cppjieba/.gitignore +17 -0
  10. data/ext/cppjieba/.travis.yml +22 -0
  11. data/ext/cppjieba/CMakeLists.txt +28 -0
  12. data/ext/cppjieba/ChangeLog.md +236 -0
  13. data/ext/cppjieba/README.md +285 -0
  14. data/ext/cppjieba/README_EN.md +111 -0
  15. data/ext/cppjieba/appveyor.yml +32 -0
  16. data/ext/cppjieba/deps/CMakeLists.txt +1 -0
  17. data/ext/cppjieba/deps/gtest/CMakeLists.txt +5 -0
  18. data/ext/cppjieba/deps/gtest/include/gtest/gtest-death-test.h +283 -0
  19. data/ext/cppjieba/deps/gtest/include/gtest/gtest-message.h +230 -0
  20. data/ext/cppjieba/deps/gtest/include/gtest/gtest-param-test.h +1421 -0
  21. data/ext/cppjieba/deps/gtest/include/gtest/gtest-param-test.h.pump +487 -0
  22. data/ext/cppjieba/deps/gtest/include/gtest/gtest-printers.h +796 -0
  23. data/ext/cppjieba/deps/gtest/include/gtest/gtest-spi.h +232 -0
  24. data/ext/cppjieba/deps/gtest/include/gtest/gtest-test-part.h +176 -0
  25. data/ext/cppjieba/deps/gtest/include/gtest/gtest-typed-test.h +259 -0
  26. data/ext/cppjieba/deps/gtest/include/gtest/gtest.h +2155 -0
  27. data/ext/cppjieba/deps/gtest/include/gtest/gtest_pred_impl.h +358 -0
  28. data/ext/cppjieba/deps/gtest/include/gtest/gtest_prod.h +58 -0
  29. data/ext/cppjieba/deps/gtest/include/gtest/internal/gtest-death-test-internal.h +308 -0
  30. data/ext/cppjieba/deps/gtest/include/gtest/internal/gtest-filepath.h +210 -0
  31. data/ext/cppjieba/deps/gtest/include/gtest/internal/gtest-internal.h +1226 -0
  32. data/ext/cppjieba/deps/gtest/include/gtest/internal/gtest-linked_ptr.h +233 -0
  33. data/ext/cppjieba/deps/gtest/include/gtest/internal/gtest-param-util-generated.h +4822 -0
  34. data/ext/cppjieba/deps/gtest/include/gtest/internal/gtest-param-util-generated.h.pump +301 -0
  35. data/ext/cppjieba/deps/gtest/include/gtest/internal/gtest-param-util.h +619 -0
  36. data/ext/cppjieba/deps/gtest/include/gtest/internal/gtest-port.h +1788 -0
  37. data/ext/cppjieba/deps/gtest/include/gtest/internal/gtest-string.h +350 -0
  38. data/ext/cppjieba/deps/gtest/include/gtest/internal/gtest-tuple.h +968 -0
  39. data/ext/cppjieba/deps/gtest/include/gtest/internal/gtest-tuple.h.pump +336 -0
  40. data/ext/cppjieba/deps/gtest/include/gtest/internal/gtest-type-util.h +3330 -0
  41. data/ext/cppjieba/deps/gtest/include/gtest/internal/gtest-type-util.h.pump +296 -0
  42. data/ext/cppjieba/deps/gtest/src/.deps/.dirstamp +0 -0
  43. data/ext/cppjieba/deps/gtest/src/.deps/gtest-all.Plo +681 -0
  44. data/ext/cppjieba/deps/gtest/src/.deps/gtest_main.Plo +509 -0
  45. data/ext/cppjieba/deps/gtest/src/.dirstamp +0 -0
  46. data/ext/cppjieba/deps/gtest/src/gtest-all.cc +48 -0
  47. data/ext/cppjieba/deps/gtest/src/gtest-death-test.cc +1234 -0
  48. data/ext/cppjieba/deps/gtest/src/gtest-filepath.cc +380 -0
  49. data/ext/cppjieba/deps/gtest/src/gtest-internal-inl.h +1038 -0
  50. data/ext/cppjieba/deps/gtest/src/gtest-port.cc +746 -0
  51. data/ext/cppjieba/deps/gtest/src/gtest-printers.cc +356 -0
  52. data/ext/cppjieba/deps/gtest/src/gtest-test-part.cc +110 -0
  53. data/ext/cppjieba/deps/gtest/src/gtest-typed-test.cc +110 -0
  54. data/ext/cppjieba/deps/gtest/src/gtest.cc +4898 -0
  55. data/ext/cppjieba/deps/gtest/src/gtest_main.cc +39 -0
  56. data/ext/cppjieba/deps/limonp/ArgvContext.hpp +70 -0
  57. data/ext/cppjieba/deps/limonp/BlockingQueue.hpp +49 -0
  58. data/ext/cppjieba/deps/limonp/BoundedBlockingQueue.hpp +67 -0
  59. data/ext/cppjieba/deps/limonp/BoundedQueue.hpp +65 -0
  60. data/ext/cppjieba/deps/limonp/Closure.hpp +206 -0
  61. data/ext/cppjieba/deps/limonp/Colors.hpp +31 -0
  62. data/ext/cppjieba/deps/limonp/Condition.hpp +38 -0
  63. data/ext/cppjieba/deps/limonp/Config.hpp +103 -0
  64. data/ext/cppjieba/deps/limonp/FileLock.hpp +74 -0
  65. data/ext/cppjieba/deps/limonp/ForcePublic.hpp +7 -0
  66. data/ext/cppjieba/deps/limonp/LocalVector.hpp +139 -0
  67. data/ext/cppjieba/deps/limonp/Logging.hpp +76 -0
  68. data/ext/cppjieba/deps/limonp/Md5.hpp +411 -0
  69. data/ext/cppjieba/deps/limonp/MutexLock.hpp +51 -0
  70. data/ext/cppjieba/deps/limonp/NonCopyable.hpp +21 -0
  71. data/ext/cppjieba/deps/limonp/StdExtension.hpp +159 -0
  72. data/ext/cppjieba/deps/limonp/StringUtil.hpp +365 -0
  73. data/ext/cppjieba/deps/limonp/Thread.hpp +44 -0
  74. data/ext/cppjieba/deps/limonp/ThreadPool.hpp +86 -0
  75. data/ext/cppjieba/dict/README.md +31 -0
  76. data/ext/cppjieba/dict/hmm_model.utf8 +34 -0
  77. data/ext/cppjieba/dict/idf.utf8 +258826 -0
  78. data/ext/cppjieba/dict/jieba.dict.utf8 +348982 -0
  79. data/ext/cppjieba/dict/pos_dict/char_state_tab.utf8 +6653 -0
  80. data/ext/cppjieba/dict/pos_dict/prob_emit.utf8 +166 -0
  81. data/ext/cppjieba/dict/pos_dict/prob_start.utf8 +259 -0
  82. data/ext/cppjieba/dict/pos_dict/prob_trans.utf8 +5222 -0
  83. data/ext/cppjieba/dict/stop_words.utf8 +1534 -0
  84. data/ext/cppjieba/dict/user.dict.utf8 +4 -0
  85. data/ext/cppjieba/include/cppjieba/DictTrie.hpp +227 -0
  86. data/ext/cppjieba/include/cppjieba/FullSegment.hpp +93 -0
  87. data/ext/cppjieba/include/cppjieba/HMMModel.hpp +129 -0
  88. data/ext/cppjieba/include/cppjieba/HMMSegment.hpp +190 -0
  89. data/ext/cppjieba/include/cppjieba/Jieba.hpp +108 -0
  90. data/ext/cppjieba/include/cppjieba/KeywordExtractor.hpp +153 -0
  91. data/ext/cppjieba/include/cppjieba/MPSegment.hpp +137 -0
  92. data/ext/cppjieba/include/cppjieba/MixSegment.hpp +109 -0
  93. data/ext/cppjieba/include/cppjieba/PosTagger.hpp +77 -0
  94. data/ext/cppjieba/include/cppjieba/PreFilter.hpp +54 -0
  95. data/ext/cppjieba/include/cppjieba/QuerySegment.hpp +90 -0
  96. data/ext/cppjieba/include/cppjieba/SegmentBase.hpp +46 -0
  97. data/ext/cppjieba/include/cppjieba/SegmentTagged.hpp +24 -0
  98. data/ext/cppjieba/include/cppjieba/TextRankExtractor.hpp +190 -0
  99. data/ext/cppjieba/include/cppjieba/Trie.hpp +174 -0
  100. data/ext/cppjieba/include/cppjieba/Unicode.hpp +215 -0
  101. data/ext/jieba/extconf.rb +28 -0
  102. data/ext/jieba/jieba.c +11 -0
  103. data/ext/jieba/jieba.h +11 -0
  104. data/ext/jieba/keyword.cc +92 -0
  105. data/ext/jieba/keyword.h +17 -0
  106. data/ext/jieba/segment.cc +107 -0
  107. data/ext/jieba/segment.h +17 -0
  108. data/ext/jieba/tagging.cc +76 -0
  109. data/ext/jieba/tagging.h +17 -0
  110. data/jieba_rb.gemspec +51 -0
  111. data/lib/jieba-rb.rb +66 -0
  112. data/lib/jieba_rb/version.rb +3 -0
  113. data/test/test_keyword.rb +17 -0
  114. data/test/test_segment.rb +32 -0
  115. data/test/test_tagging.rb +22 -0
  116. data/test/user.dict.utf8 +23 -0
  117. metadata +219 -0
File without changes
@@ -0,0 +1,48 @@
1
+ // Copyright 2008, Google Inc.
2
+ // All rights reserved.
3
+ //
4
+ // Redistribution and use in source and binary forms, with or without
5
+ // modification, are permitted provided that the following conditions are
6
+ // met:
7
+ //
8
+ // * Redistributions of source code must retain the above copyright
9
+ // notice, this list of conditions and the following disclaimer.
10
+ // * Redistributions in binary form must reproduce the above
11
+ // copyright notice, this list of conditions and the following disclaimer
12
+ // in the documentation and/or other materials provided with the
13
+ // distribution.
14
+ // * Neither the name of Google Inc. nor the names of its
15
+ // contributors may be used to endorse or promote products derived from
16
+ // this software without specific prior written permission.
17
+ //
18
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19
+ // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20
+ // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21
+ // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22
+ // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23
+ // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24
+ // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26
+ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
+ //
30
+ // Author: mheule@google.com (Markus Heule)
31
+ //
32
+ // Google C++ Testing Framework (Google Test)
33
+ //
34
+ // Sometimes it's desirable to build Google Test by compiling a single file.
35
+ // This file serves this purpose.
36
+
37
+ // This line ensures that gtest.h can be compiled on its own, even
38
+ // when it's fused.
39
+ #include "gtest/gtest.h"
40
+
41
+ // The following lines pull in the real gtest *.cc files.
42
+ #include "src/gtest.cc"
43
+ #include "src/gtest-death-test.cc"
44
+ #include "src/gtest-filepath.cc"
45
+ #include "src/gtest-port.cc"
46
+ #include "src/gtest-printers.cc"
47
+ #include "src/gtest-test-part.cc"
48
+ #include "src/gtest-typed-test.cc"
@@ -0,0 +1,1234 @@
1
+ // Copyright 2005, Google Inc.
2
+ // All rights reserved.
3
+ //
4
+ // Redistribution and use in source and binary forms, with or without
5
+ // modification, are permitted provided that the following conditions are
6
+ // met:
7
+ //
8
+ // * Redistributions of source code must retain the above copyright
9
+ // notice, this list of conditions and the following disclaimer.
10
+ // * Redistributions in binary form must reproduce the above
11
+ // copyright notice, this list of conditions and the following disclaimer
12
+ // in the documentation and/or other materials provided with the
13
+ // distribution.
14
+ // * Neither the name of Google Inc. nor the names of its
15
+ // contributors may be used to endorse or promote products derived from
16
+ // this software without specific prior written permission.
17
+ //
18
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19
+ // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20
+ // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21
+ // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22
+ // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23
+ // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24
+ // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26
+ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
+ //
30
+ // Author: wan@google.com (Zhanyong Wan), vladl@google.com (Vlad Losev)
31
+ //
32
+ // This file implements death tests.
33
+
34
+ #include "gtest/gtest-death-test.h"
35
+ #include "gtest/internal/gtest-port.h"
36
+
37
+ #if GTEST_HAS_DEATH_TEST
38
+
39
+ # if GTEST_OS_MAC
40
+ # include <crt_externs.h>
41
+ # endif // GTEST_OS_MAC
42
+
43
+ # include <errno.h>
44
+ # include <fcntl.h>
45
+ # include <limits.h>
46
+ # include <stdarg.h>
47
+
48
+ # if GTEST_OS_WINDOWS
49
+ # include <windows.h>
50
+ # else
51
+ # include <sys/mman.h>
52
+ # include <sys/wait.h>
53
+ # endif // GTEST_OS_WINDOWS
54
+
55
+ #endif // GTEST_HAS_DEATH_TEST
56
+
57
+ #include "gtest/gtest-message.h"
58
+ #include "gtest/internal/gtest-string.h"
59
+
60
+ // Indicates that this translation unit is part of Google Test's
61
+ // implementation. It must come before gtest-internal-inl.h is
62
+ // included, or there will be a compiler error. This trick is to
63
+ // prevent a user from accidentally including gtest-internal-inl.h in
64
+ // his code.
65
+ #define GTEST_IMPLEMENTATION_ 1
66
+ #include "src/gtest-internal-inl.h"
67
+ #undef GTEST_IMPLEMENTATION_
68
+
69
+ namespace testing {
70
+
71
+ // Constants.
72
+
73
+ // The default death test style.
74
+ static const char kDefaultDeathTestStyle[] = "fast";
75
+
76
+ GTEST_DEFINE_string_(
77
+ death_test_style,
78
+ internal::StringFromGTestEnv("death_test_style", kDefaultDeathTestStyle),
79
+ "Indicates how to run a death test in a forked child process: "
80
+ "\"threadsafe\" (child process re-executes the test binary "
81
+ "from the beginning, running only the specific death test) or "
82
+ "\"fast\" (child process runs the death test immediately "
83
+ "after forking).");
84
+
85
+ GTEST_DEFINE_bool_(
86
+ death_test_use_fork,
87
+ internal::BoolFromGTestEnv("death_test_use_fork", false),
88
+ "Instructs to use fork()/_exit() instead of clone() in death tests. "
89
+ "Ignored and always uses fork() on POSIX systems where clone() is not "
90
+ "implemented. Useful when running under valgrind or similar tools if "
91
+ "those do not support clone(). Valgrind 3.3.1 will just fail if "
92
+ "it sees an unsupported combination of clone() flags. "
93
+ "It is not recommended to use this flag w/o valgrind though it will "
94
+ "work in 99% of the cases. Once valgrind is fixed, this flag will "
95
+ "most likely be removed.");
96
+
97
+ namespace internal {
98
+ GTEST_DEFINE_string_(
99
+ internal_run_death_test, "",
100
+ "Indicates the file, line number, temporal index of "
101
+ "the single death test to run, and a file descriptor to "
102
+ "which a success code may be sent, all separated by "
103
+ "colons. This flag is specified if and only if the current "
104
+ "process is a sub-process launched for running a thread-safe "
105
+ "death test. FOR INTERNAL USE ONLY.");
106
+ } // namespace internal
107
+
108
+ #if GTEST_HAS_DEATH_TEST
109
+
110
+ // ExitedWithCode constructor.
111
+ ExitedWithCode::ExitedWithCode(int exit_code) : exit_code_(exit_code) {
112
+ }
113
+
114
+ // ExitedWithCode function-call operator.
115
+ bool ExitedWithCode::operator()(int exit_status) const {
116
+ # if GTEST_OS_WINDOWS
117
+
118
+ return exit_status == exit_code_;
119
+
120
+ # else
121
+
122
+ return WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == exit_code_;
123
+
124
+ # endif // GTEST_OS_WINDOWS
125
+ }
126
+
127
+ # if !GTEST_OS_WINDOWS
128
+ // KilledBySignal constructor.
129
+ KilledBySignal::KilledBySignal(int signum) : signum_(signum) {
130
+ }
131
+
132
+ // KilledBySignal function-call operator.
133
+ bool KilledBySignal::operator()(int exit_status) const {
134
+ return WIFSIGNALED(exit_status) && WTERMSIG(exit_status) == signum_;
135
+ }
136
+ # endif // !GTEST_OS_WINDOWS
137
+
138
+ namespace internal {
139
+
140
+ // Utilities needed for death tests.
141
+
142
+ // Generates a textual description of a given exit code, in the format
143
+ // specified by wait(2).
144
+ static String ExitSummary(int exit_code) {
145
+ Message m;
146
+
147
+ # if GTEST_OS_WINDOWS
148
+
149
+ m << "Exited with exit status " << exit_code;
150
+
151
+ # else
152
+
153
+ if (WIFEXITED(exit_code)) {
154
+ m << "Exited with exit status " << WEXITSTATUS(exit_code);
155
+ } else if (WIFSIGNALED(exit_code)) {
156
+ m << "Terminated by signal " << WTERMSIG(exit_code);
157
+ }
158
+ # ifdef WCOREDUMP
159
+ if (WCOREDUMP(exit_code)) {
160
+ m << " (core dumped)";
161
+ }
162
+ # endif
163
+ # endif // GTEST_OS_WINDOWS
164
+
165
+ return m.GetString();
166
+ }
167
+
168
+ // Returns true if exit_status describes a process that was terminated
169
+ // by a signal, or exited normally with a nonzero exit code.
170
+ bool ExitedUnsuccessfully(int exit_status) {
171
+ return !ExitedWithCode(0)(exit_status);
172
+ }
173
+
174
+ # if !GTEST_OS_WINDOWS
175
+ // Generates a textual failure message when a death test finds more than
176
+ // one thread running, or cannot determine the number of threads, prior
177
+ // to executing the given statement. It is the responsibility of the
178
+ // caller not to pass a thread_count of 1.
179
+ static String DeathTestThreadWarning(size_t thread_count) {
180
+ Message msg;
181
+ msg << "Death tests use fork(), which is unsafe particularly"
182
+ << " in a threaded context. For this test, " << GTEST_NAME_ << " ";
183
+ if (thread_count == 0)
184
+ msg << "couldn't detect the number of threads.";
185
+ else
186
+ msg << "detected " << thread_count << " threads.";
187
+ return msg.GetString();
188
+ }
189
+ # endif // !GTEST_OS_WINDOWS
190
+
191
+ // Flag characters for reporting a death test that did not die.
192
+ static const char kDeathTestLived = 'L';
193
+ static const char kDeathTestReturned = 'R';
194
+ static const char kDeathTestThrew = 'T';
195
+ static const char kDeathTestInternalError = 'I';
196
+
197
+ // An enumeration describing all of the possible ways that a death test can
198
+ // conclude. DIED means that the process died while executing the test
199
+ // code; LIVED means that process lived beyond the end of the test code;
200
+ // RETURNED means that the test statement attempted to execute a return
201
+ // statement, which is not allowed; THREW means that the test statement
202
+ // returned control by throwing an exception. IN_PROGRESS means the test
203
+ // has not yet concluded.
204
+ // TODO(vladl@google.com): Unify names and possibly values for
205
+ // AbortReason, DeathTestOutcome, and flag characters above.
206
+ enum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED, THREW };
207
+
208
+ // Routine for aborting the program which is safe to call from an
209
+ // exec-style death test child process, in which case the error
210
+ // message is propagated back to the parent process. Otherwise, the
211
+ // message is simply printed to stderr. In either case, the program
212
+ // then exits with status 1.
213
+ void DeathTestAbort(const String& message) {
214
+ // On a POSIX system, this function may be called from a threadsafe-style
215
+ // death test child process, which operates on a very small stack. Use
216
+ // the heap for any additional non-minuscule memory requirements.
217
+ const InternalRunDeathTestFlag* const flag =
218
+ GetUnitTestImpl()->internal_run_death_test_flag();
219
+ if (flag != NULL) {
220
+ FILE* parent = posix::FDOpen(flag->write_fd(), "w");
221
+ fputc(kDeathTestInternalError, parent);
222
+ fprintf(parent, "%s", message.c_str());
223
+ fflush(parent);
224
+ _exit(1);
225
+ } else {
226
+ fprintf(stderr, "%s", message.c_str());
227
+ fflush(stderr);
228
+ posix::Abort();
229
+ }
230
+ }
231
+
232
+ // A replacement for CHECK that calls DeathTestAbort if the assertion
233
+ // fails.
234
+ # define GTEST_DEATH_TEST_CHECK_(expression) \
235
+ do { \
236
+ if (!::testing::internal::IsTrue(expression)) { \
237
+ DeathTestAbort(::testing::internal::String::Format( \
238
+ "CHECK failed: File %s, line %d: %s", \
239
+ __FILE__, __LINE__, #expression)); \
240
+ } \
241
+ } while (::testing::internal::AlwaysFalse())
242
+
243
+ // This macro is similar to GTEST_DEATH_TEST_CHECK_, but it is meant for
244
+ // evaluating any system call that fulfills two conditions: it must return
245
+ // -1 on failure, and set errno to EINTR when it is interrupted and
246
+ // should be tried again. The macro expands to a loop that repeatedly
247
+ // evaluates the expression as long as it evaluates to -1 and sets
248
+ // errno to EINTR. If the expression evaluates to -1 but errno is
249
+ // something other than EINTR, DeathTestAbort is called.
250
+ # define GTEST_DEATH_TEST_CHECK_SYSCALL_(expression) \
251
+ do { \
252
+ int gtest_retval; \
253
+ do { \
254
+ gtest_retval = (expression); \
255
+ } while (gtest_retval == -1 && errno == EINTR); \
256
+ if (gtest_retval == -1) { \
257
+ DeathTestAbort(::testing::internal::String::Format( \
258
+ "CHECK failed: File %s, line %d: %s != -1", \
259
+ __FILE__, __LINE__, #expression)); \
260
+ } \
261
+ } while (::testing::internal::AlwaysFalse())
262
+
263
+ // Returns the message describing the last system error in errno.
264
+ String GetLastErrnoDescription() {
265
+ return String(errno == 0 ? "" : posix::StrError(errno));
266
+ }
267
+
268
+ // This is called from a death test parent process to read a failure
269
+ // message from the death test child process and log it with the FATAL
270
+ // severity. On Windows, the message is read from a pipe handle. On other
271
+ // platforms, it is read from a file descriptor.
272
+ static void FailFromInternalError(int fd) {
273
+ Message error;
274
+ char buffer[256];
275
+ int num_read;
276
+
277
+ do {
278
+ while ((num_read = posix::Read(fd, buffer, 255)) > 0) {
279
+ buffer[num_read] = '\0';
280
+ error << buffer;
281
+ }
282
+ } while (num_read == -1 && errno == EINTR);
283
+
284
+ if (num_read == 0) {
285
+ GTEST_LOG_(FATAL) << error.GetString();
286
+ } else {
287
+ const int last_error = errno;
288
+ GTEST_LOG_(FATAL) << "Error while reading death test internal: "
289
+ << GetLastErrnoDescription() << " [" << last_error << "]";
290
+ }
291
+ }
292
+
293
+ // Death test constructor. Increments the running death test count
294
+ // for the current test.
295
+ DeathTest::DeathTest() {
296
+ TestInfo* const info = GetUnitTestImpl()->current_test_info();
297
+ if (info == NULL) {
298
+ DeathTestAbort("Cannot run a death test outside of a TEST or "
299
+ "TEST_F construct");
300
+ }
301
+ }
302
+
303
+ // Creates and returns a death test by dispatching to the current
304
+ // death test factory.
305
+ bool DeathTest::Create(const char* statement, const RE* regex,
306
+ const char* file, int line, DeathTest** test) {
307
+ return GetUnitTestImpl()->death_test_factory()->Create(
308
+ statement, regex, file, line, test);
309
+ }
310
+
311
+ const char* DeathTest::LastMessage() {
312
+ return last_death_test_message_.c_str();
313
+ }
314
+
315
+ void DeathTest::set_last_death_test_message(const String& message) {
316
+ last_death_test_message_ = message;
317
+ }
318
+
319
+ String DeathTest::last_death_test_message_;
320
+
321
+ // Provides cross platform implementation for some death functionality.
322
+ class DeathTestImpl : public DeathTest {
323
+ protected:
324
+ DeathTestImpl(const char* a_statement, const RE* a_regex)
325
+ : statement_(a_statement),
326
+ regex_(a_regex),
327
+ spawned_(false),
328
+ status_(-1),
329
+ outcome_(IN_PROGRESS),
330
+ read_fd_(-1),
331
+ write_fd_(-1) {}
332
+
333
+ // read_fd_ is expected to be closed and cleared by a derived class.
334
+ ~DeathTestImpl() { GTEST_DEATH_TEST_CHECK_(read_fd_ == -1); }
335
+
336
+ void Abort(AbortReason reason);
337
+ virtual bool Passed(bool status_ok);
338
+
339
+ const char* statement() const { return statement_; }
340
+ const RE* regex() const { return regex_; }
341
+ bool spawned() const { return spawned_; }
342
+ void set_spawned(bool is_spawned) { spawned_ = is_spawned; }
343
+ int status() const { return status_; }
344
+ void set_status(int a_status) { status_ = a_status; }
345
+ DeathTestOutcome outcome() const { return outcome_; }
346
+ void set_outcome(DeathTestOutcome an_outcome) { outcome_ = an_outcome; }
347
+ int read_fd() const { return read_fd_; }
348
+ void set_read_fd(int fd) { read_fd_ = fd; }
349
+ int write_fd() const { return write_fd_; }
350
+ void set_write_fd(int fd) { write_fd_ = fd; }
351
+
352
+ // Called in the parent process only. Reads the result code of the death
353
+ // test child process via a pipe, interprets it to set the outcome_
354
+ // member, and closes read_fd_. Outputs diagnostics and terminates in
355
+ // case of unexpected codes.
356
+ void ReadAndInterpretStatusByte();
357
+
358
+ private:
359
+ // The textual content of the code this object is testing. This class
360
+ // doesn't own this string and should not attempt to delete it.
361
+ const char* const statement_;
362
+ // The regular expression which test output must match. DeathTestImpl
363
+ // doesn't own this object and should not attempt to delete it.
364
+ const RE* const regex_;
365
+ // True if the death test child process has been successfully spawned.
366
+ bool spawned_;
367
+ // The exit status of the child process.
368
+ int status_;
369
+ // How the death test concluded.
370
+ DeathTestOutcome outcome_;
371
+ // Descriptor to the read end of the pipe to the child process. It is
372
+ // always -1 in the child process. The child keeps its write end of the
373
+ // pipe in write_fd_.
374
+ int read_fd_;
375
+ // Descriptor to the child's write end of the pipe to the parent process.
376
+ // It is always -1 in the parent process. The parent keeps its end of the
377
+ // pipe in read_fd_.
378
+ int write_fd_;
379
+ };
380
+
381
+ // Called in the parent process only. Reads the result code of the death
382
+ // test child process via a pipe, interprets it to set the outcome_
383
+ // member, and closes read_fd_. Outputs diagnostics and terminates in
384
+ // case of unexpected codes.
385
+ void DeathTestImpl::ReadAndInterpretStatusByte() {
386
+ char flag;
387
+ int bytes_read;
388
+
389
+ // The read() here blocks until data is available (signifying the
390
+ // failure of the death test) or until the pipe is closed (signifying
391
+ // its success), so it's okay to call this in the parent before
392
+ // the child process has exited.
393
+ do {
394
+ bytes_read = posix::Read(read_fd(), &flag, 1);
395
+ } while (bytes_read == -1 && errno == EINTR);
396
+
397
+ if (bytes_read == 0) {
398
+ set_outcome(DIED);
399
+ } else if (bytes_read == 1) {
400
+ switch (flag) {
401
+ case kDeathTestReturned:
402
+ set_outcome(RETURNED);
403
+ break;
404
+ case kDeathTestThrew:
405
+ set_outcome(THREW);
406
+ break;
407
+ case kDeathTestLived:
408
+ set_outcome(LIVED);
409
+ break;
410
+ case kDeathTestInternalError:
411
+ FailFromInternalError(read_fd()); // Does not return.
412
+ break;
413
+ default:
414
+ GTEST_LOG_(FATAL) << "Death test child process reported "
415
+ << "unexpected status byte ("
416
+ << static_cast<unsigned int>(flag) << ")";
417
+ }
418
+ } else {
419
+ GTEST_LOG_(FATAL) << "Read from death test child process failed: "
420
+ << GetLastErrnoDescription();
421
+ }
422
+ GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Close(read_fd()));
423
+ set_read_fd(-1);
424
+ }
425
+
426
+ // Signals that the death test code which should have exited, didn't.
427
+ // Should be called only in a death test child process.
428
+ // Writes a status byte to the child's status file descriptor, then
429
+ // calls _exit(1).
430
+ void DeathTestImpl::Abort(AbortReason reason) {
431
+ // The parent process considers the death test to be a failure if
432
+ // it finds any data in our pipe. So, here we write a single flag byte
433
+ // to the pipe, then exit.
434
+ const char status_ch =
435
+ reason == TEST_DID_NOT_DIE ? kDeathTestLived :
436
+ reason == TEST_THREW_EXCEPTION ? kDeathTestThrew : kDeathTestReturned;
437
+
438
+ GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Write(write_fd(), &status_ch, 1));
439
+ // We are leaking the descriptor here because on some platforms (i.e.,
440
+ // when built as Windows DLL), destructors of global objects will still
441
+ // run after calling _exit(). On such systems, write_fd_ will be
442
+ // indirectly closed from the destructor of UnitTestImpl, causing double
443
+ // close if it is also closed here. On debug configurations, double close
444
+ // may assert. As there are no in-process buffers to flush here, we are
445
+ // relying on the OS to close the descriptor after the process terminates
446
+ // when the destructors are not run.
447
+ _exit(1); // Exits w/o any normal exit hooks (we were supposed to crash)
448
+ }
449
+
450
+ // Returns an indented copy of stderr output for a death test.
451
+ // This makes distinguishing death test output lines from regular log lines
452
+ // much easier.
453
+ static ::std::string FormatDeathTestOutput(const ::std::string& output) {
454
+ ::std::string ret;
455
+ for (size_t at = 0; ; ) {
456
+ const size_t line_end = output.find('\n', at);
457
+ ret += "[ DEATH ] ";
458
+ if (line_end == ::std::string::npos) {
459
+ ret += output.substr(at);
460
+ break;
461
+ }
462
+ ret += output.substr(at, line_end + 1 - at);
463
+ at = line_end + 1;
464
+ }
465
+ return ret;
466
+ }
467
+
468
+ // Assesses the success or failure of a death test, using both private
469
+ // members which have previously been set, and one argument:
470
+ //
471
+ // Private data members:
472
+ // outcome: An enumeration describing how the death test
473
+ // concluded: DIED, LIVED, THREW, or RETURNED. The death test
474
+ // fails in the latter three cases.
475
+ // status: The exit status of the child process. On *nix, it is in the
476
+ // in the format specified by wait(2). On Windows, this is the
477
+ // value supplied to the ExitProcess() API or a numeric code
478
+ // of the exception that terminated the program.
479
+ // regex: A regular expression object to be applied to
480
+ // the test's captured standard error output; the death test
481
+ // fails if it does not match.
482
+ //
483
+ // Argument:
484
+ // status_ok: true if exit_status is acceptable in the context of
485
+ // this particular death test, which fails if it is false
486
+ //
487
+ // Returns true iff all of the above conditions are met. Otherwise, the
488
+ // first failing condition, in the order given above, is the one that is
489
+ // reported. Also sets the last death test message string.
490
+ bool DeathTestImpl::Passed(bool status_ok) {
491
+ if (!spawned())
492
+ return false;
493
+
494
+ const String error_message = GetCapturedStderr();
495
+
496
+ bool success = false;
497
+ Message buffer;
498
+
499
+ buffer << "Death test: " << statement() << "\n";
500
+ switch (outcome()) {
501
+ case LIVED:
502
+ buffer << " Result: failed to die.\n"
503
+ << " Error msg:\n" << FormatDeathTestOutput(error_message);
504
+ break;
505
+ case THREW:
506
+ buffer << " Result: threw an exception.\n"
507
+ << " Error msg:\n" << FormatDeathTestOutput(error_message);
508
+ break;
509
+ case RETURNED:
510
+ buffer << " Result: illegal return in test statement.\n"
511
+ << " Error msg:\n" << FormatDeathTestOutput(error_message);
512
+ break;
513
+ case DIED:
514
+ if (status_ok) {
515
+ const bool matched = RE::PartialMatch(error_message.c_str(), *regex());
516
+ if (matched) {
517
+ success = true;
518
+ } else {
519
+ buffer << " Result: died but not with expected error.\n"
520
+ << " Expected: " << regex()->pattern() << "\n"
521
+ << "Actual msg:\n" << FormatDeathTestOutput(error_message);
522
+ }
523
+ } else {
524
+ buffer << " Result: died but not with expected exit code:\n"
525
+ << " " << ExitSummary(status()) << "\n"
526
+ << "Actual msg:\n" << FormatDeathTestOutput(error_message);
527
+ }
528
+ break;
529
+ case IN_PROGRESS:
530
+ default:
531
+ GTEST_LOG_(FATAL)
532
+ << "DeathTest::Passed somehow called before conclusion of test";
533
+ }
534
+
535
+ DeathTest::set_last_death_test_message(buffer.GetString());
536
+ return success;
537
+ }
538
+
539
+ # if GTEST_OS_WINDOWS
540
+ // WindowsDeathTest implements death tests on Windows. Due to the
541
+ // specifics of starting new processes on Windows, death tests there are
542
+ // always threadsafe, and Google Test considers the
543
+ // --gtest_death_test_style=fast setting to be equivalent to
544
+ // --gtest_death_test_style=threadsafe there.
545
+ //
546
+ // A few implementation notes: Like the Linux version, the Windows
547
+ // implementation uses pipes for child-to-parent communication. But due to
548
+ // the specifics of pipes on Windows, some extra steps are required:
549
+ //
550
+ // 1. The parent creates a communication pipe and stores handles to both
551
+ // ends of it.
552
+ // 2. The parent starts the child and provides it with the information
553
+ // necessary to acquire the handle to the write end of the pipe.
554
+ // 3. The child acquires the write end of the pipe and signals the parent
555
+ // using a Windows event.
556
+ // 4. Now the parent can release the write end of the pipe on its side. If
557
+ // this is done before step 3, the object's reference count goes down to
558
+ // 0 and it is destroyed, preventing the child from acquiring it. The
559
+ // parent now has to release it, or read operations on the read end of
560
+ // the pipe will not return when the child terminates.
561
+ // 5. The parent reads child's output through the pipe (outcome code and
562
+ // any possible error messages) from the pipe, and its stderr and then
563
+ // determines whether to fail the test.
564
+ //
565
+ // Note: to distinguish Win32 API calls from the local method and function
566
+ // calls, the former are explicitly resolved in the global namespace.
567
+ //
568
+ class WindowsDeathTest : public DeathTestImpl {
569
+ public:
570
+ WindowsDeathTest(const char* a_statement,
571
+ const RE* a_regex,
572
+ const char* file,
573
+ int line)
574
+ : DeathTestImpl(a_statement, a_regex), file_(file), line_(line) {}
575
+
576
+ // All of these virtual functions are inherited from DeathTest.
577
+ virtual int Wait();
578
+ virtual TestRole AssumeRole();
579
+
580
+ private:
581
+ // The name of the file in which the death test is located.
582
+ const char* const file_;
583
+ // The line number on which the death test is located.
584
+ const int line_;
585
+ // Handle to the write end of the pipe to the child process.
586
+ AutoHandle write_handle_;
587
+ // Child process handle.
588
+ AutoHandle child_handle_;
589
+ // Event the child process uses to signal the parent that it has
590
+ // acquired the handle to the write end of the pipe. After seeing this
591
+ // event the parent can release its own handles to make sure its
592
+ // ReadFile() calls return when the child terminates.
593
+ AutoHandle event_handle_;
594
+ };
595
+
596
+ // Waits for the child in a death test to exit, returning its exit
597
+ // status, or 0 if no child process exists. As a side effect, sets the
598
+ // outcome data member.
599
+ int WindowsDeathTest::Wait() {
600
+ if (!spawned())
601
+ return 0;
602
+
603
+ // Wait until the child either signals that it has acquired the write end
604
+ // of the pipe or it dies.
605
+ const HANDLE wait_handles[2] = { child_handle_.Get(), event_handle_.Get() };
606
+ switch (::WaitForMultipleObjects(2,
607
+ wait_handles,
608
+ FALSE, // Waits for any of the handles.
609
+ INFINITE)) {
610
+ case WAIT_OBJECT_0:
611
+ case WAIT_OBJECT_0 + 1:
612
+ break;
613
+ default:
614
+ GTEST_DEATH_TEST_CHECK_(false); // Should not get here.
615
+ }
616
+
617
+ // The child has acquired the write end of the pipe or exited.
618
+ // We release the handle on our side and continue.
619
+ write_handle_.Reset();
620
+ event_handle_.Reset();
621
+
622
+ ReadAndInterpretStatusByte();
623
+
624
+ // Waits for the child process to exit if it haven't already. This
625
+ // returns immediately if the child has already exited, regardless of
626
+ // whether previous calls to WaitForMultipleObjects synchronized on this
627
+ // handle or not.
628
+ GTEST_DEATH_TEST_CHECK_(
629
+ WAIT_OBJECT_0 == ::WaitForSingleObject(child_handle_.Get(),
630
+ INFINITE));
631
+ DWORD status_code;
632
+ GTEST_DEATH_TEST_CHECK_(
633
+ ::GetExitCodeProcess(child_handle_.Get(), &status_code) != FALSE);
634
+ child_handle_.Reset();
635
+ set_status(static_cast<int>(status_code));
636
+ return status();
637
+ }
638
+
639
+ // The AssumeRole process for a Windows death test. It creates a child
640
+ // process with the same executable as the current process to run the
641
+ // death test. The child process is given the --gtest_filter and
642
+ // --gtest_internal_run_death_test flags such that it knows to run the
643
+ // current death test only.
644
+ DeathTest::TestRole WindowsDeathTest::AssumeRole() {
645
+ const UnitTestImpl* const impl = GetUnitTestImpl();
646
+ const InternalRunDeathTestFlag* const flag =
647
+ impl->internal_run_death_test_flag();
648
+ const TestInfo* const info = impl->current_test_info();
649
+ const int death_test_index = info->result()->death_test_count();
650
+
651
+ if (flag != NULL) {
652
+ // ParseInternalRunDeathTestFlag() has performed all the necessary
653
+ // processing.
654
+ set_write_fd(flag->write_fd());
655
+ return EXECUTE_TEST;
656
+ }
657
+
658
+ // WindowsDeathTest uses an anonymous pipe to communicate results of
659
+ // a death test.
660
+ SECURITY_ATTRIBUTES handles_are_inheritable = {
661
+ sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };
662
+ HANDLE read_handle, write_handle;
663
+ GTEST_DEATH_TEST_CHECK_(
664
+ ::CreatePipe(&read_handle, &write_handle, &handles_are_inheritable,
665
+ 0) // Default buffer size.
666
+ != FALSE);
667
+ set_read_fd(::_open_osfhandle(reinterpret_cast<intptr_t>(read_handle),
668
+ O_RDONLY));
669
+ write_handle_.Reset(write_handle);
670
+ event_handle_.Reset(::CreateEvent(
671
+ &handles_are_inheritable,
672
+ TRUE, // The event will automatically reset to non-signaled state.
673
+ FALSE, // The initial state is non-signalled.
674
+ NULL)); // The even is unnamed.
675
+ GTEST_DEATH_TEST_CHECK_(event_handle_.Get() != NULL);
676
+ const String filter_flag = String::Format("--%s%s=%s.%s",
677
+ GTEST_FLAG_PREFIX_, kFilterFlag,
678
+ info->test_case_name(),
679
+ info->name());
680
+ const String internal_flag = String::Format(
681
+ "--%s%s=%s|%d|%d|%u|%Iu|%Iu",
682
+ GTEST_FLAG_PREFIX_,
683
+ kInternalRunDeathTestFlag,
684
+ file_, line_,
685
+ death_test_index,
686
+ static_cast<unsigned int>(::GetCurrentProcessId()),
687
+ // size_t has the same with as pointers on both 32-bit and 64-bit
688
+ // Windows platforms.
689
+ // See http://msdn.microsoft.com/en-us/library/tcxf1dw6.aspx.
690
+ reinterpret_cast<size_t>(write_handle),
691
+ reinterpret_cast<size_t>(event_handle_.Get()));
692
+
693
+ char executable_path[_MAX_PATH + 1]; // NOLINT
694
+ GTEST_DEATH_TEST_CHECK_(
695
+ _MAX_PATH + 1 != ::GetModuleFileNameA(NULL,
696
+ executable_path,
697
+ _MAX_PATH));
698
+
699
+ String command_line = String::Format("%s %s \"%s\"",
700
+ ::GetCommandLineA(),
701
+ filter_flag.c_str(),
702
+ internal_flag.c_str());
703
+
704
+ DeathTest::set_last_death_test_message("");
705
+
706
+ CaptureStderr();
707
+ // Flush the log buffers since the log streams are shared with the child.
708
+ FlushInfoLog();
709
+
710
+ // The child process will share the standard handles with the parent.
711
+ STARTUPINFOA startup_info;
712
+ memset(&startup_info, 0, sizeof(STARTUPINFO));
713
+ startup_info.dwFlags = STARTF_USESTDHANDLES;
714
+ startup_info.hStdInput = ::GetStdHandle(STD_INPUT_HANDLE);
715
+ startup_info.hStdOutput = ::GetStdHandle(STD_OUTPUT_HANDLE);
716
+ startup_info.hStdError = ::GetStdHandle(STD_ERROR_HANDLE);
717
+
718
+ PROCESS_INFORMATION process_info;
719
+ GTEST_DEATH_TEST_CHECK_(::CreateProcessA(
720
+ executable_path,
721
+ const_cast<char*>(command_line.c_str()),
722
+ NULL, // Retuned process handle is not inheritable.
723
+ NULL, // Retuned thread handle is not inheritable.
724
+ TRUE, // Child inherits all inheritable handles (for write_handle_).
725
+ 0x0, // Default creation flags.
726
+ NULL, // Inherit the parent's environment.
727
+ UnitTest::GetInstance()->original_working_dir(),
728
+ &startup_info,
729
+ &process_info) != FALSE);
730
+ child_handle_.Reset(process_info.hProcess);
731
+ ::CloseHandle(process_info.hThread);
732
+ set_spawned(true);
733
+ return OVERSEE_TEST;
734
+ }
735
+ # else // We are not on Windows.
736
+
737
+ // ForkingDeathTest provides implementations for most of the abstract
738
+ // methods of the DeathTest interface. Only the AssumeRole method is
739
+ // left undefined.
740
+ class ForkingDeathTest : public DeathTestImpl {
741
+ public:
742
+ ForkingDeathTest(const char* statement, const RE* regex);
743
+
744
+ // All of these virtual functions are inherited from DeathTest.
745
+ virtual int Wait();
746
+
747
+ protected:
748
+ void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; }
749
+
750
+ private:
751
+ // PID of child process during death test; 0 in the child process itself.
752
+ pid_t child_pid_;
753
+ };
754
+
755
+ // Constructs a ForkingDeathTest.
756
+ ForkingDeathTest::ForkingDeathTest(const char* a_statement, const RE* a_regex)
757
+ : DeathTestImpl(a_statement, a_regex),
758
+ child_pid_(-1) {}
759
+
760
+ // Waits for the child in a death test to exit, returning its exit
761
+ // status, or 0 if no child process exists. As a side effect, sets the
762
+ // outcome data member.
763
+ int ForkingDeathTest::Wait() {
764
+ if (!spawned())
765
+ return 0;
766
+
767
+ ReadAndInterpretStatusByte();
768
+
769
+ int status_value;
770
+ GTEST_DEATH_TEST_CHECK_SYSCALL_(waitpid(child_pid_, &status_value, 0));
771
+ set_status(status_value);
772
+ return status_value;
773
+ }
774
+
775
+ // A concrete death test class that forks, then immediately runs the test
776
+ // in the child process.
777
+ class NoExecDeathTest : public ForkingDeathTest {
778
+ public:
779
+ NoExecDeathTest(const char* a_statement, const RE* a_regex) :
780
+ ForkingDeathTest(a_statement, a_regex) { }
781
+ virtual TestRole AssumeRole();
782
+ };
783
+
784
+ // The AssumeRole process for a fork-and-run death test. It implements a
785
+ // straightforward fork, with a simple pipe to transmit the status byte.
786
+ DeathTest::TestRole NoExecDeathTest::AssumeRole() {
787
+ const size_t thread_count = GetThreadCount();
788
+ if (thread_count != 1) {
789
+ GTEST_LOG_(WARNING) << DeathTestThreadWarning(thread_count);
790
+ }
791
+
792
+ int pipe_fd[2];
793
+ GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
794
+
795
+ DeathTest::set_last_death_test_message("");
796
+ CaptureStderr();
797
+ // When we fork the process below, the log file buffers are copied, but the
798
+ // file descriptors are shared. We flush all log files here so that closing
799
+ // the file descriptors in the child process doesn't throw off the
800
+ // synchronization between descriptors and buffers in the parent process.
801
+ // This is as close to the fork as possible to avoid a race condition in case
802
+ // there are multiple threads running before the death test, and another
803
+ // thread writes to the log file.
804
+ FlushInfoLog();
805
+
806
+ const pid_t child_pid = fork();
807
+ GTEST_DEATH_TEST_CHECK_(child_pid != -1);
808
+ set_child_pid(child_pid);
809
+ if (child_pid == 0) {
810
+ GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[0]));
811
+ set_write_fd(pipe_fd[1]);
812
+ // Redirects all logging to stderr in the child process to prevent
813
+ // concurrent writes to the log files. We capture stderr in the parent
814
+ // process and append the child process' output to a log.
815
+ LogToStderr();
816
+ // Event forwarding to the listeners of event listener API mush be shut
817
+ // down in death test subprocesses.
818
+ GetUnitTestImpl()->listeners()->SuppressEventForwarding();
819
+ return EXECUTE_TEST;
820
+ } else {
821
+ GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
822
+ set_read_fd(pipe_fd[0]);
823
+ set_spawned(true);
824
+ return OVERSEE_TEST;
825
+ }
826
+ }
827
+
828
+ // A concrete death test class that forks and re-executes the main
829
+ // program from the beginning, with command-line flags set that cause
830
+ // only this specific death test to be run.
831
+ class ExecDeathTest : public ForkingDeathTest {
832
+ public:
833
+ ExecDeathTest(const char* a_statement, const RE* a_regex,
834
+ const char* file, int line) :
835
+ ForkingDeathTest(a_statement, a_regex), file_(file), line_(line) { }
836
+ virtual TestRole AssumeRole();
837
+ private:
838
+ // The name of the file in which the death test is located.
839
+ const char* const file_;
840
+ // The line number on which the death test is located.
841
+ const int line_;
842
+ };
843
+
844
+ // Utility class for accumulating command-line arguments.
845
+ class Arguments {
846
+ public:
847
+ Arguments() {
848
+ args_.push_back(NULL);
849
+ }
850
+
851
+ ~Arguments() {
852
+ for (std::vector<char*>::iterator i = args_.begin(); i != args_.end();
853
+ ++i) {
854
+ free(*i);
855
+ }
856
+ }
857
+ void AddArgument(const char* argument) {
858
+ args_.insert(args_.end() - 1, posix::StrDup(argument));
859
+ }
860
+
861
+ template <typename Str>
862
+ void AddArguments(const ::std::vector<Str>& arguments) {
863
+ for (typename ::std::vector<Str>::const_iterator i = arguments.begin();
864
+ i != arguments.end();
865
+ ++i) {
866
+ args_.insert(args_.end() - 1, posix::StrDup(i->c_str()));
867
+ }
868
+ }
869
+ char* const* Argv() {
870
+ return &args_[0];
871
+ }
872
+ private:
873
+ std::vector<char*> args_;
874
+ };
875
+
876
+ // A struct that encompasses the arguments to the child process of a
877
+ // threadsafe-style death test process.
878
+ struct ExecDeathTestArgs {
879
+ char* const* argv; // Command-line arguments for the child's call to exec
880
+ int close_fd; // File descriptor to close; the read end of a pipe
881
+ };
882
+
883
+ # if GTEST_OS_MAC
884
+ inline char** GetEnviron() {
885
+ // When Google Test is built as a framework on MacOS X, the environ variable
886
+ // is unavailable. Apple's documentation (man environ) recommends using
887
+ // _NSGetEnviron() instead.
888
+ return *_NSGetEnviron();
889
+ }
890
+ # else
891
+ // Some POSIX platforms expect you to declare environ. extern "C" makes
892
+ // it reside in the global namespace.
893
+ extern "C" char** environ;
894
+ inline char** GetEnviron() { return environ; }
895
+ # endif // GTEST_OS_MAC
896
+
897
+ // The main function for a threadsafe-style death test child process.
898
+ // This function is called in a clone()-ed process and thus must avoid
899
+ // any potentially unsafe operations like malloc or libc functions.
900
+ static int ExecDeathTestChildMain(void* child_arg) {
901
+ ExecDeathTestArgs* const args = static_cast<ExecDeathTestArgs*>(child_arg);
902
+ GTEST_DEATH_TEST_CHECK_SYSCALL_(close(args->close_fd));
903
+
904
+ // We need to execute the test program in the same environment where
905
+ // it was originally invoked. Therefore we change to the original
906
+ // working directory first.
907
+ const char* const original_dir =
908
+ UnitTest::GetInstance()->original_working_dir();
909
+ // We can safely call chdir() as it's a direct system call.
910
+ if (chdir(original_dir) != 0) {
911
+ DeathTestAbort(String::Format("chdir(\"%s\") failed: %s",
912
+ original_dir,
913
+ GetLastErrnoDescription().c_str()));
914
+ return EXIT_FAILURE;
915
+ }
916
+
917
+ // We can safely call execve() as it's a direct system call. We
918
+ // cannot use execvp() as it's a libc function and thus potentially
919
+ // unsafe. Since execve() doesn't search the PATH, the user must
920
+ // invoke the test program via a valid path that contains at least
921
+ // one path separator.
922
+ execve(args->argv[0], args->argv, GetEnviron());
923
+ DeathTestAbort(String::Format("execve(%s, ...) in %s failed: %s",
924
+ args->argv[0],
925
+ original_dir,
926
+ GetLastErrnoDescription().c_str()));
927
+ return EXIT_FAILURE;
928
+ }
929
+
930
+ // Two utility routines that together determine the direction the stack
931
+ // grows.
932
+ // This could be accomplished more elegantly by a single recursive
933
+ // function, but we want to guard against the unlikely possibility of
934
+ // a smart compiler optimizing the recursion away.
935
+ //
936
+ // GTEST_NO_INLINE_ is required to prevent GCC 4.6 from inlining
937
+ // StackLowerThanAddress into StackGrowsDown, which then doesn't give
938
+ // correct answer.
939
+ bool StackLowerThanAddress(const void* ptr) GTEST_NO_INLINE_;
940
+ bool StackLowerThanAddress(const void* ptr) {
941
+ int dummy;
942
+ return &dummy < ptr;
943
+ }
944
+
945
+ bool StackGrowsDown() {
946
+ int dummy;
947
+ return StackLowerThanAddress(&dummy);
948
+ }
949
+
950
+ // A threadsafe implementation of fork(2) for threadsafe-style death tests
951
+ // that uses clone(2). It dies with an error message if anything goes
952
+ // wrong.
953
+ static pid_t ExecDeathTestFork(char* const* argv, int close_fd) {
954
+ ExecDeathTestArgs args = { argv, close_fd };
955
+ pid_t child_pid = -1;
956
+
957
+ # if GTEST_HAS_CLONE
958
+ const bool use_fork = GTEST_FLAG(death_test_use_fork);
959
+
960
+ if (!use_fork) {
961
+ static const bool stack_grows_down = StackGrowsDown();
962
+ const size_t stack_size = getpagesize();
963
+ // MMAP_ANONYMOUS is not defined on Mac, so we use MAP_ANON instead.
964
+ void* const stack = mmap(NULL, stack_size, PROT_READ | PROT_WRITE,
965
+ MAP_ANON | MAP_PRIVATE, -1, 0);
966
+ GTEST_DEATH_TEST_CHECK_(stack != MAP_FAILED);
967
+ void* const stack_top =
968
+ static_cast<char*>(stack) + (stack_grows_down ? stack_size : 0);
969
+
970
+ child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args);
971
+
972
+ GTEST_DEATH_TEST_CHECK_(munmap(stack, stack_size) != -1);
973
+ }
974
+ # else
975
+ const bool use_fork = true;
976
+ # endif // GTEST_HAS_CLONE
977
+
978
+ if (use_fork && (child_pid = fork()) == 0) {
979
+ ExecDeathTestChildMain(&args);
980
+ _exit(0);
981
+ }
982
+
983
+ GTEST_DEATH_TEST_CHECK_(child_pid != -1);
984
+ return child_pid;
985
+ }
986
+
987
+ // The AssumeRole process for a fork-and-exec death test. It re-executes the
988
+ // main program from the beginning, setting the --gtest_filter
989
+ // and --gtest_internal_run_death_test flags to cause only the current
990
+ // death test to be re-run.
991
+ DeathTest::TestRole ExecDeathTest::AssumeRole() {
992
+ const UnitTestImpl* const impl = GetUnitTestImpl();
993
+ const InternalRunDeathTestFlag* const flag =
994
+ impl->internal_run_death_test_flag();
995
+ const TestInfo* const info = impl->current_test_info();
996
+ const int death_test_index = info->result()->death_test_count();
997
+
998
+ if (flag != NULL) {
999
+ set_write_fd(flag->write_fd());
1000
+ return EXECUTE_TEST;
1001
+ }
1002
+
1003
+ int pipe_fd[2];
1004
+ GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
1005
+ // Clear the close-on-exec flag on the write end of the pipe, lest
1006
+ // it be closed when the child process does an exec:
1007
+ GTEST_DEATH_TEST_CHECK_(fcntl(pipe_fd[1], F_SETFD, 0) != -1);
1008
+
1009
+ const String filter_flag =
1010
+ String::Format("--%s%s=%s.%s",
1011
+ GTEST_FLAG_PREFIX_, kFilterFlag,
1012
+ info->test_case_name(), info->name());
1013
+ const String internal_flag =
1014
+ String::Format("--%s%s=%s|%d|%d|%d",
1015
+ GTEST_FLAG_PREFIX_, kInternalRunDeathTestFlag,
1016
+ file_, line_, death_test_index, pipe_fd[1]);
1017
+ Arguments args;
1018
+ args.AddArguments(GetArgvs());
1019
+ args.AddArgument(filter_flag.c_str());
1020
+ args.AddArgument(internal_flag.c_str());
1021
+
1022
+ DeathTest::set_last_death_test_message("");
1023
+
1024
+ CaptureStderr();
1025
+ // See the comment in NoExecDeathTest::AssumeRole for why the next line
1026
+ // is necessary.
1027
+ FlushInfoLog();
1028
+
1029
+ const pid_t child_pid = ExecDeathTestFork(args.Argv(), pipe_fd[0]);
1030
+ GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
1031
+ set_child_pid(child_pid);
1032
+ set_read_fd(pipe_fd[0]);
1033
+ set_spawned(true);
1034
+ return OVERSEE_TEST;
1035
+ }
1036
+
1037
+ # endif // !GTEST_OS_WINDOWS
1038
+
1039
+ // Creates a concrete DeathTest-derived class that depends on the
1040
+ // --gtest_death_test_style flag, and sets the pointer pointed to
1041
+ // by the "test" argument to its address. If the test should be
1042
+ // skipped, sets that pointer to NULL. Returns true, unless the
1043
+ // flag is set to an invalid value.
1044
+ bool DefaultDeathTestFactory::Create(const char* statement, const RE* regex,
1045
+ const char* file, int line,
1046
+ DeathTest** test) {
1047
+ UnitTestImpl* const impl = GetUnitTestImpl();
1048
+ const InternalRunDeathTestFlag* const flag =
1049
+ impl->internal_run_death_test_flag();
1050
+ const int death_test_index = impl->current_test_info()
1051
+ ->increment_death_test_count();
1052
+
1053
+ if (flag != NULL) {
1054
+ if (death_test_index > flag->index()) {
1055
+ DeathTest::set_last_death_test_message(String::Format(
1056
+ "Death test count (%d) somehow exceeded expected maximum (%d)",
1057
+ death_test_index, flag->index()));
1058
+ return false;
1059
+ }
1060
+
1061
+ if (!(flag->file() == file && flag->line() == line &&
1062
+ flag->index() == death_test_index)) {
1063
+ *test = NULL;
1064
+ return true;
1065
+ }
1066
+ }
1067
+
1068
+ # if GTEST_OS_WINDOWS
1069
+
1070
+ if (GTEST_FLAG(death_test_style) == "threadsafe" ||
1071
+ GTEST_FLAG(death_test_style) == "fast") {
1072
+ *test = new WindowsDeathTest(statement, regex, file, line);
1073
+ }
1074
+
1075
+ # else
1076
+
1077
+ if (GTEST_FLAG(death_test_style) == "threadsafe") {
1078
+ *test = new ExecDeathTest(statement, regex, file, line);
1079
+ } else if (GTEST_FLAG(death_test_style) == "fast") {
1080
+ *test = new NoExecDeathTest(statement, regex);
1081
+ }
1082
+
1083
+ # endif // GTEST_OS_WINDOWS
1084
+
1085
+ else { // NOLINT - this is more readable than unbalanced brackets inside #if.
1086
+ DeathTest::set_last_death_test_message(String::Format(
1087
+ "Unknown death test style \"%s\" encountered",
1088
+ GTEST_FLAG(death_test_style).c_str()));
1089
+ return false;
1090
+ }
1091
+
1092
+ return true;
1093
+ }
1094
+
1095
+ // Splits a given string on a given delimiter, populating a given
1096
+ // vector with the fields. GTEST_HAS_DEATH_TEST implies that we have
1097
+ // ::std::string, so we can use it here.
1098
+ static void SplitString(const ::std::string& str, char delimiter,
1099
+ ::std::vector< ::std::string>* dest) {
1100
+ ::std::vector< ::std::string> parsed;
1101
+ ::std::string::size_type pos = 0;
1102
+ while (::testing::internal::AlwaysTrue()) {
1103
+ const ::std::string::size_type colon = str.find(delimiter, pos);
1104
+ if (colon == ::std::string::npos) {
1105
+ parsed.push_back(str.substr(pos));
1106
+ break;
1107
+ } else {
1108
+ parsed.push_back(str.substr(pos, colon - pos));
1109
+ pos = colon + 1;
1110
+ }
1111
+ }
1112
+ dest->swap(parsed);
1113
+ }
1114
+
1115
+ # if GTEST_OS_WINDOWS
1116
+ // Recreates the pipe and event handles from the provided parameters,
1117
+ // signals the event, and returns a file descriptor wrapped around the pipe
1118
+ // handle. This function is called in the child process only.
1119
+ int GetStatusFileDescriptor(unsigned int parent_process_id,
1120
+ size_t write_handle_as_size_t,
1121
+ size_t event_handle_as_size_t) {
1122
+ AutoHandle parent_process_handle(::OpenProcess(PROCESS_DUP_HANDLE,
1123
+ FALSE, // Non-inheritable.
1124
+ parent_process_id));
1125
+ if (parent_process_handle.Get() == INVALID_HANDLE_VALUE) {
1126
+ DeathTestAbort(String::Format("Unable to open parent process %u",
1127
+ parent_process_id));
1128
+ }
1129
+
1130
+ // TODO(vladl@google.com): Replace the following check with a
1131
+ // compile-time assertion when available.
1132
+ GTEST_CHECK_(sizeof(HANDLE) <= sizeof(size_t));
1133
+
1134
+ const HANDLE write_handle =
1135
+ reinterpret_cast<HANDLE>(write_handle_as_size_t);
1136
+ HANDLE dup_write_handle;
1137
+
1138
+ // The newly initialized handle is accessible only in in the parent
1139
+ // process. To obtain one accessible within the child, we need to use
1140
+ // DuplicateHandle.
1141
+ if (!::DuplicateHandle(parent_process_handle.Get(), write_handle,
1142
+ ::GetCurrentProcess(), &dup_write_handle,
1143
+ 0x0, // Requested privileges ignored since
1144
+ // DUPLICATE_SAME_ACCESS is used.
1145
+ FALSE, // Request non-inheritable handler.
1146
+ DUPLICATE_SAME_ACCESS)) {
1147
+ DeathTestAbort(String::Format(
1148
+ "Unable to duplicate the pipe handle %Iu from the parent process %u",
1149
+ write_handle_as_size_t, parent_process_id));
1150
+ }
1151
+
1152
+ const HANDLE event_handle = reinterpret_cast<HANDLE>(event_handle_as_size_t);
1153
+ HANDLE dup_event_handle;
1154
+
1155
+ if (!::DuplicateHandle(parent_process_handle.Get(), event_handle,
1156
+ ::GetCurrentProcess(), &dup_event_handle,
1157
+ 0x0,
1158
+ FALSE,
1159
+ DUPLICATE_SAME_ACCESS)) {
1160
+ DeathTestAbort(String::Format(
1161
+ "Unable to duplicate the event handle %Iu from the parent process %u",
1162
+ event_handle_as_size_t, parent_process_id));
1163
+ }
1164
+
1165
+ const int write_fd =
1166
+ ::_open_osfhandle(reinterpret_cast<intptr_t>(dup_write_handle), O_APPEND);
1167
+ if (write_fd == -1) {
1168
+ DeathTestAbort(String::Format(
1169
+ "Unable to convert pipe handle %Iu to a file descriptor",
1170
+ write_handle_as_size_t));
1171
+ }
1172
+
1173
+ // Signals the parent that the write end of the pipe has been acquired
1174
+ // so the parent can release its own write end.
1175
+ ::SetEvent(dup_event_handle);
1176
+
1177
+ return write_fd;
1178
+ }
1179
+ # endif // GTEST_OS_WINDOWS
1180
+
1181
+ // Returns a newly created InternalRunDeathTestFlag object with fields
1182
+ // initialized from the GTEST_FLAG(internal_run_death_test) flag if
1183
+ // the flag is specified; otherwise returns NULL.
1184
+ InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {
1185
+ if (GTEST_FLAG(internal_run_death_test) == "") return NULL;
1186
+
1187
+ // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we
1188
+ // can use it here.
1189
+ int line = -1;
1190
+ int index = -1;
1191
+ ::std::vector< ::std::string> fields;
1192
+ SplitString(GTEST_FLAG(internal_run_death_test).c_str(), '|', &fields);
1193
+ int write_fd = -1;
1194
+
1195
+ # if GTEST_OS_WINDOWS
1196
+
1197
+ unsigned int parent_process_id = 0;
1198
+ size_t write_handle_as_size_t = 0;
1199
+ size_t event_handle_as_size_t = 0;
1200
+
1201
+ if (fields.size() != 6
1202
+ || !ParseNaturalNumber(fields[1], &line)
1203
+ || !ParseNaturalNumber(fields[2], &index)
1204
+ || !ParseNaturalNumber(fields[3], &parent_process_id)
1205
+ || !ParseNaturalNumber(fields[4], &write_handle_as_size_t)
1206
+ || !ParseNaturalNumber(fields[5], &event_handle_as_size_t)) {
1207
+ DeathTestAbort(String::Format(
1208
+ "Bad --gtest_internal_run_death_test flag: %s",
1209
+ GTEST_FLAG(internal_run_death_test).c_str()));
1210
+ }
1211
+ write_fd = GetStatusFileDescriptor(parent_process_id,
1212
+ write_handle_as_size_t,
1213
+ event_handle_as_size_t);
1214
+ # else
1215
+
1216
+ if (fields.size() != 4
1217
+ || !ParseNaturalNumber(fields[1], &line)
1218
+ || !ParseNaturalNumber(fields[2], &index)
1219
+ || !ParseNaturalNumber(fields[3], &write_fd)) {
1220
+ DeathTestAbort(String::Format(
1221
+ "Bad --gtest_internal_run_death_test flag: %s",
1222
+ GTEST_FLAG(internal_run_death_test).c_str()));
1223
+ }
1224
+
1225
+ # endif // GTEST_OS_WINDOWS
1226
+
1227
+ return new InternalRunDeathTestFlag(fields[0], line, index, write_fd);
1228
+ }
1229
+
1230
+ } // namespace internal
1231
+
1232
+ #endif // GTEST_HAS_DEATH_TEST
1233
+
1234
+ } // namespace testing