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)
31 //
32 // Tests for death tests.
33
34 #include <gtest/gtest-death-test.h>
35 #include <gtest/gtest.h>
36 #include <gtest/internal/gtest-filepath.h>
37
38 #if GTEST_HAS_DEATH_TEST
39
40 #if GTEST_OS_WINDOWS
41 #include <direct.h> // For chdir().
42 #else
43 #include <unistd.h>
44 #include <sys/wait.h> // For waitpid.
45 #include <limits> // For std::numeric_limits.
46 #endif // GTEST_OS_WINDOWS
47
48 #include <limits.h>
49 #include <signal.h>
50 #include <stdio.h>
51
52 #include <gtest/gtest-spi.h>
53
54 // Indicates that this translation unit is part of Google Test's
55 // implementation. It must come before gtest-internal-inl.h is
56 // included, or there will be a compiler error. This trick is to
57 // prevent a user from accidentally including gtest-internal-inl.h in
58 // his code.
59 #define GTEST_IMPLEMENTATION_ 1
60 #include "src/gtest-internal-inl.h"
61 #undef GTEST_IMPLEMENTATION_
62
63 using testing::Message;
64
65 using testing::internal::DeathTest;
66 using testing::internal::DeathTestFactory;
67 using testing::internal::FilePath;
68 using testing::internal::GetLastSystemErrorMessage;
69 using testing::internal::ParseNaturalNumber;
70 using testing::internal::String;
71
72 namespace testing {
73 namespace internal {
74
75 // A helper class whose objects replace the death test factory for a
76 // single UnitTest object during their lifetimes.
77 class ReplaceDeathTestFactory {
78 public:
ReplaceDeathTestFactory(UnitTest * parent,DeathTestFactory * new_factory)79 ReplaceDeathTestFactory(UnitTest* parent, DeathTestFactory* new_factory)
80 : parent_impl_(parent->impl()) {
81 old_factory_ = parent_impl_->death_test_factory_.release();
82 parent_impl_->death_test_factory_.reset(new_factory);
83 }
84
~ReplaceDeathTestFactory()85 ~ReplaceDeathTestFactory() {
86 parent_impl_->death_test_factory_.release();
87 parent_impl_->death_test_factory_.reset(old_factory_);
88 }
89 private:
90 // Prevents copying ReplaceDeathTestFactory objects.
91 ReplaceDeathTestFactory(const ReplaceDeathTestFactory&);
92 void operator=(const ReplaceDeathTestFactory&);
93
94 UnitTestImpl* parent_impl_;
95 DeathTestFactory* old_factory_;
96 };
97
98 } // namespace internal
99 } // namespace testing
100
101 // Tests that death tests work.
102
103 class TestForDeathTest : public testing::Test {
104 protected:
TestForDeathTest()105 TestForDeathTest() : original_dir_(FilePath::GetCurrentDir()) {}
106
~TestForDeathTest()107 virtual ~TestForDeathTest() {
108 #if GTEST_OS_WINDOWS
109 _chdir(original_dir_.c_str());
110 #else
111 chdir(original_dir_.c_str());
112 #endif
113 }
114
115 // A static member function that's expected to die.
StaticMemberFunction()116 static void StaticMemberFunction() {
117 fprintf(stderr, "%s", "death inside StaticMemberFunction().");
118 fflush(stderr);
119 // We call _exit() instead of exit(), as the former is a direct
120 // system call and thus safer in the presence of threads. exit()
121 // will invoke user-defined exit-hooks, which may do dangerous
122 // things that conflict with death tests.
123 _exit(1);
124 }
125
126 // A method of the test fixture that may die.
MemberFunction()127 void MemberFunction() {
128 if (should_die_) {
129 fprintf(stderr, "%s", "death inside MemberFunction().");
130 fflush(stderr);
131 _exit(1);
132 }
133 }
134
135 // True iff MemberFunction() should die.
136 bool should_die_;
137 const FilePath original_dir_;
138 };
139
140 // A class with a member function that may die.
141 class MayDie {
142 public:
MayDie(bool should_die)143 explicit MayDie(bool should_die) : should_die_(should_die) {}
144
145 // A member function that may die.
MemberFunction() const146 void MemberFunction() const {
147 if (should_die_) {
148 GTEST_LOG_(FATAL, "death inside MayDie::MemberFunction().");
149 }
150 }
151
152 private:
153 // True iff MemberFunction() should die.
154 bool should_die_;
155 };
156
157 // A global function that's expected to die.
GlobalFunction()158 void GlobalFunction() {
159 GTEST_LOG_(FATAL, "death inside GlobalFunction().");
160 }
161
162 // A non-void function that's expected to die.
NonVoidFunction()163 int NonVoidFunction() {
164 GTEST_LOG_(FATAL, "death inside NonVoidFunction().");
165 return 1;
166 }
167
168 // A unary function that may die.
DieIf(bool should_die)169 void DieIf(bool should_die) {
170 if (should_die) {
171 GTEST_LOG_(FATAL, "death inside DieIf().");
172 }
173 }
174
175 // A binary function that may die.
DieIfLessThan(int x,int y)176 bool DieIfLessThan(int x, int y) {
177 if (x < y) {
178 GTEST_LOG_(FATAL, "death inside DieIfLessThan().");
179 }
180 return true;
181 }
182
183 // Tests that ASSERT_DEATH can be used outside a TEST, TEST_F, or test fixture.
DeathTestSubroutine()184 void DeathTestSubroutine() {
185 EXPECT_DEATH(GlobalFunction(), "death.*GlobalFunction");
186 ASSERT_DEATH(GlobalFunction(), "death.*GlobalFunction");
187 }
188
189 // Death in dbg, not opt.
DieInDebugElse12(int * sideeffect)190 int DieInDebugElse12(int* sideeffect) {
191 if (sideeffect) *sideeffect = 12;
192 #ifndef NDEBUG
193 GTEST_LOG_(FATAL, "debug death inside DieInDebugElse12()");
194 #endif // NDEBUG
195 return 12;
196 }
197
198 #if GTEST_OS_WINDOWS
199
200 // Tests the ExitedWithCode predicate.
TEST(ExitStatusPredicateTest,ExitedWithCode)201 TEST(ExitStatusPredicateTest, ExitedWithCode) {
202 // On Windows, the process's exit code is the same as its exit status,
203 // so the predicate just compares the its input with its parameter.
204 EXPECT_TRUE(testing::ExitedWithCode(0)(0));
205 EXPECT_TRUE(testing::ExitedWithCode(1)(1));
206 EXPECT_TRUE(testing::ExitedWithCode(42)(42));
207 EXPECT_FALSE(testing::ExitedWithCode(0)(1));
208 EXPECT_FALSE(testing::ExitedWithCode(1)(0));
209 }
210
211 #else
212
213 // Returns the exit status of a process that calls _exit(2) with a
214 // given exit code. This is a helper function for the
215 // ExitStatusPredicateTest test suite.
NormalExitStatus(int exit_code)216 static int NormalExitStatus(int exit_code) {
217 pid_t child_pid = fork();
218 if (child_pid == 0) {
219 _exit(exit_code);
220 }
221 int status;
222 waitpid(child_pid, &status, 0);
223 return status;
224 }
225
226 // Returns the exit status of a process that raises a given signal.
227 // If the signal does not cause the process to die, then it returns
228 // instead the exit status of a process that exits normally with exit
229 // code 1. This is a helper function for the ExitStatusPredicateTest
230 // test suite.
KilledExitStatus(int signum)231 static int KilledExitStatus(int signum) {
232 pid_t child_pid = fork();
233 if (child_pid == 0) {
234 raise(signum);
235 _exit(1);
236 }
237 int status;
238 waitpid(child_pid, &status, 0);
239 return status;
240 }
241
242 // Tests the ExitedWithCode predicate.
TEST(ExitStatusPredicateTest,ExitedWithCode)243 TEST(ExitStatusPredicateTest, ExitedWithCode) {
244 const int status0 = NormalExitStatus(0);
245 const int status1 = NormalExitStatus(1);
246 const int status42 = NormalExitStatus(42);
247 const testing::ExitedWithCode pred0(0);
248 const testing::ExitedWithCode pred1(1);
249 const testing::ExitedWithCode pred42(42);
250 EXPECT_PRED1(pred0, status0);
251 EXPECT_PRED1(pred1, status1);
252 EXPECT_PRED1(pred42, status42);
253 EXPECT_FALSE(pred0(status1));
254 EXPECT_FALSE(pred42(status0));
255 EXPECT_FALSE(pred1(status42));
256 }
257
258 // Tests the KilledBySignal predicate.
TEST(ExitStatusPredicateTest,KilledBySignal)259 TEST(ExitStatusPredicateTest, KilledBySignal) {
260 const int status_segv = KilledExitStatus(SIGSEGV);
261 const int status_kill = KilledExitStatus(SIGKILL);
262 const testing::KilledBySignal pred_segv(SIGSEGV);
263 const testing::KilledBySignal pred_kill(SIGKILL);
264 EXPECT_PRED1(pred_segv, status_segv);
265 EXPECT_PRED1(pred_kill, status_kill);
266 EXPECT_FALSE(pred_segv(status_kill));
267 EXPECT_FALSE(pred_kill(status_segv));
268 }
269
270 #endif // GTEST_OS_WINDOWS
271
272 // Tests that the death test macros expand to code which may or may not
273 // be followed by operator<<, and that in either case the complete text
274 // comprises only a single C++ statement.
TEST_F(TestForDeathTest,SingleStatement)275 TEST_F(TestForDeathTest, SingleStatement) {
276 if (false)
277 // This would fail if executed; this is a compilation test only
278 ASSERT_DEATH(return, "");
279
280 if (true)
281 EXPECT_DEATH(_exit(1), "");
282 else
283 // This empty "else" branch is meant to ensure that EXPECT_DEATH
284 // doesn't expand into an "if" statement without an "else"
285 ;
286
287 if (false)
288 ASSERT_DEATH(return, "") << "did not die";
289
290 if (false)
291 ;
292 else
293 EXPECT_DEATH(_exit(1), "") << 1 << 2 << 3;
294 }
295
DieWithEmbeddedNul()296 void DieWithEmbeddedNul() {
297 fprintf(stderr, "Hello%cworld.\n", '\0');
298 fflush(stderr);
299 _exit(1);
300 }
301
302 #if GTEST_USES_PCRE
303 // Tests that EXPECT_DEATH and ASSERT_DEATH work when the error
304 // message has a NUL character in it.
TEST_F(TestForDeathTest,EmbeddedNulInMessage)305 TEST_F(TestForDeathTest, EmbeddedNulInMessage) {
306 // TODO(wan@google.com): <regex.h> doesn't support matching strings
307 // with embedded NUL characters - find a way to workaround it.
308 EXPECT_DEATH(DieWithEmbeddedNul(), "w.*ld");
309 ASSERT_DEATH(DieWithEmbeddedNul(), "w.*ld");
310 }
311 #endif // GTEST_USES_PCRE
312
313 // Tests that death test macros expand to code which interacts well with switch
314 // statements.
TEST_F(TestForDeathTest,SwitchStatement)315 TEST_F(TestForDeathTest, SwitchStatement) {
316 // Microsoft compiler usually complains about switch statements without
317 // case labels. We suppress that warning for this test.
318 #ifdef _MSC_VER
319 #pragma warning(push)
320 #pragma warning(disable: 4065)
321 #endif // _MSC_VER
322
323 switch (0)
324 default:
325 ASSERT_DEATH(_exit(1), "") << "exit in default switch handler";
326
327 switch (0)
328 case 0:
329 EXPECT_DEATH(_exit(1), "") << "exit in switch case";
330
331 #ifdef _MSC_VER
332 #pragma warning(pop)
333 #endif // _MSC_VER
334 }
335
336 // Tests that a static member function can be used in a "fast" style
337 // death test.
TEST_F(TestForDeathTest,StaticMemberFunctionFastStyle)338 TEST_F(TestForDeathTest, StaticMemberFunctionFastStyle) {
339 testing::GTEST_FLAG(death_test_style) = "fast";
340 ASSERT_DEATH(StaticMemberFunction(), "death.*StaticMember");
341 }
342
343 // Tests that a method of the test fixture can be used in a "fast"
344 // style death test.
TEST_F(TestForDeathTest,MemberFunctionFastStyle)345 TEST_F(TestForDeathTest, MemberFunctionFastStyle) {
346 testing::GTEST_FLAG(death_test_style) = "fast";
347 should_die_ = true;
348 EXPECT_DEATH(MemberFunction(), "inside.*MemberFunction");
349 }
350
ChangeToRootDir()351 void ChangeToRootDir() {
352 #if GTEST_OS_WINDOWS
353 _chdir("\\");
354 #else
355 chdir("/");
356 #endif // GTEST_OS_WINDOWS
357 }
358
359 // Tests that death tests work even if the current directory has been
360 // changed.
TEST_F(TestForDeathTest,FastDeathTestInChangedDir)361 TEST_F(TestForDeathTest, FastDeathTestInChangedDir) {
362 testing::GTEST_FLAG(death_test_style) = "fast";
363
364 ChangeToRootDir();
365 EXPECT_EXIT(_exit(1), testing::ExitedWithCode(1), "");
366
367 ChangeToRootDir();
368 ASSERT_DEATH(_exit(1), "");
369 }
370
371 // Repeats a representative sample of death tests in the "threadsafe" style:
372
TEST_F(TestForDeathTest,StaticMemberFunctionThreadsafeStyle)373 TEST_F(TestForDeathTest, StaticMemberFunctionThreadsafeStyle) {
374 testing::GTEST_FLAG(death_test_style) = "threadsafe";
375 ASSERT_DEATH(StaticMemberFunction(), "death.*StaticMember");
376 }
377
TEST_F(TestForDeathTest,MemberFunctionThreadsafeStyle)378 TEST_F(TestForDeathTest, MemberFunctionThreadsafeStyle) {
379 testing::GTEST_FLAG(death_test_style) = "threadsafe";
380 should_die_ = true;
381 EXPECT_DEATH(MemberFunction(), "inside.*MemberFunction");
382 }
383
TEST_F(TestForDeathTest,ThreadsafeDeathTestInLoop)384 TEST_F(TestForDeathTest, ThreadsafeDeathTestInLoop) {
385 testing::GTEST_FLAG(death_test_style) = "threadsafe";
386
387 for (int i = 0; i < 3; ++i)
388 EXPECT_EXIT(_exit(i), testing::ExitedWithCode(i), "") << ": i = " << i;
389 }
390
TEST_F(TestForDeathTest,ThreadsafeDeathTestInChangedDir)391 TEST_F(TestForDeathTest, ThreadsafeDeathTestInChangedDir) {
392 testing::GTEST_FLAG(death_test_style) = "threadsafe";
393
394 ChangeToRootDir();
395 EXPECT_EXIT(_exit(1), testing::ExitedWithCode(1), "");
396
397 ChangeToRootDir();
398 ASSERT_DEATH(_exit(1), "");
399 }
400
TEST_F(TestForDeathTest,MixedStyles)401 TEST_F(TestForDeathTest, MixedStyles) {
402 testing::GTEST_FLAG(death_test_style) = "threadsafe";
403 EXPECT_DEATH(_exit(1), "");
404 testing::GTEST_FLAG(death_test_style) = "fast";
405 EXPECT_DEATH(_exit(1), "");
406 }
407
408 namespace {
409
410 bool pthread_flag;
411
SetPthreadFlag()412 void SetPthreadFlag() {
413 pthread_flag = true;
414 }
415
416 } // namespace
417
418 #if GTEST_HAS_CLONE
419
TEST_F(TestForDeathTest,DoesNotExecuteAtforkHooks)420 TEST_F(TestForDeathTest, DoesNotExecuteAtforkHooks) {
421 if (!testing::GTEST_FLAG(death_test_use_fork)) {
422 testing::GTEST_FLAG(death_test_style) = "threadsafe";
423 pthread_flag = false;
424 ASSERT_EQ(0, pthread_atfork(&SetPthreadFlag, NULL, NULL));
425 ASSERT_DEATH(_exit(1), "");
426 ASSERT_FALSE(pthread_flag);
427 }
428 }
429
430 #endif // GTEST_HAS_CLONE
431
432 // Tests that a method of another class can be used in a death test.
TEST_F(TestForDeathTest,MethodOfAnotherClass)433 TEST_F(TestForDeathTest, MethodOfAnotherClass) {
434 const MayDie x(true);
435 ASSERT_DEATH(x.MemberFunction(), "MayDie\\:\\:MemberFunction");
436 }
437
438 // Tests that a global function can be used in a death test.
TEST_F(TestForDeathTest,GlobalFunction)439 TEST_F(TestForDeathTest, GlobalFunction) {
440 EXPECT_DEATH(GlobalFunction(), "GlobalFunction");
441 }
442
443 // Tests that any value convertible to an RE works as a second
444 // argument to EXPECT_DEATH.
TEST_F(TestForDeathTest,AcceptsAnythingConvertibleToRE)445 TEST_F(TestForDeathTest, AcceptsAnythingConvertibleToRE) {
446 static const char regex_c_str[] = "GlobalFunction";
447 EXPECT_DEATH(GlobalFunction(), regex_c_str);
448
449 const testing::internal::RE regex(regex_c_str);
450 EXPECT_DEATH(GlobalFunction(), regex);
451
452 #if GTEST_HAS_GLOBAL_STRING
453 const string regex_str(regex_c_str);
454 EXPECT_DEATH(GlobalFunction(), regex_str);
455 #endif // GTEST_HAS_GLOBAL_STRING
456
457 #if GTEST_HAS_STD_STRING
458 const ::std::string regex_std_str(regex_c_str);
459 EXPECT_DEATH(GlobalFunction(), regex_std_str);
460 #endif // GTEST_HAS_STD_STRING
461 }
462
463 // Tests that a non-void function can be used in a death test.
TEST_F(TestForDeathTest,NonVoidFunction)464 TEST_F(TestForDeathTest, NonVoidFunction) {
465 ASSERT_DEATH(NonVoidFunction(), "NonVoidFunction");
466 }
467
468 // Tests that functions that take parameter(s) can be used in a death test.
TEST_F(TestForDeathTest,FunctionWithParameter)469 TEST_F(TestForDeathTest, FunctionWithParameter) {
470 EXPECT_DEATH(DieIf(true), "DieIf\\(\\)");
471 EXPECT_DEATH(DieIfLessThan(2, 3), "DieIfLessThan");
472 }
473
474 // Tests that ASSERT_DEATH can be used outside a TEST, TEST_F, or test fixture.
TEST_F(TestForDeathTest,OutsideFixture)475 TEST_F(TestForDeathTest, OutsideFixture) {
476 DeathTestSubroutine();
477 }
478
479 // Tests that death tests can be done inside a loop.
TEST_F(TestForDeathTest,InsideLoop)480 TEST_F(TestForDeathTest, InsideLoop) {
481 for (int i = 0; i < 5; i++) {
482 EXPECT_DEATH(DieIfLessThan(-1, i), "DieIfLessThan") << "where i == " << i;
483 }
484 }
485
486 // Tests that a compound statement can be used in a death test.
TEST_F(TestForDeathTest,CompoundStatement)487 TEST_F(TestForDeathTest, CompoundStatement) {
488 EXPECT_DEATH({ // NOLINT
489 const int x = 2;
490 const int y = x + 1;
491 DieIfLessThan(x, y);
492 },
493 "DieIfLessThan");
494 }
495
496 // Tests that code that doesn't die causes a death test to fail.
TEST_F(TestForDeathTest,DoesNotDie)497 TEST_F(TestForDeathTest, DoesNotDie) {
498 EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(DieIf(false), "DieIf"),
499 "failed to die");
500 }
501
502 // Tests that a death test fails when the error message isn't expected.
TEST_F(TestForDeathTest,ErrorMessageMismatch)503 TEST_F(TestForDeathTest, ErrorMessageMismatch) {
504 EXPECT_NONFATAL_FAILURE({ // NOLINT
505 EXPECT_DEATH(DieIf(true), "DieIfLessThan") << "End of death test message.";
506 }, "died but not with expected error");
507 }
508
509 // On exit, *aborted will be true iff the EXPECT_DEATH() statement
510 // aborted the function.
ExpectDeathTestHelper(bool * aborted)511 void ExpectDeathTestHelper(bool* aborted) {
512 *aborted = true;
513 EXPECT_DEATH(DieIf(false), "DieIf"); // This assertion should fail.
514 *aborted = false;
515 }
516
517 // Tests that EXPECT_DEATH doesn't abort the test on failure.
TEST_F(TestForDeathTest,EXPECT_DEATH)518 TEST_F(TestForDeathTest, EXPECT_DEATH) {
519 bool aborted = true;
520 EXPECT_NONFATAL_FAILURE(ExpectDeathTestHelper(&aborted),
521 "failed to die");
522 EXPECT_FALSE(aborted);
523 }
524
525 // Tests that ASSERT_DEATH does abort the test on failure.
TEST_F(TestForDeathTest,ASSERT_DEATH)526 TEST_F(TestForDeathTest, ASSERT_DEATH) {
527 static bool aborted;
528 EXPECT_FATAL_FAILURE({ // NOLINT
529 aborted = true;
530 ASSERT_DEATH(DieIf(false), "DieIf"); // This assertion should fail.
531 aborted = false;
532 }, "failed to die");
533 EXPECT_TRUE(aborted);
534 }
535
536 // Tests that EXPECT_DEATH evaluates the arguments exactly once.
TEST_F(TestForDeathTest,SingleEvaluation)537 TEST_F(TestForDeathTest, SingleEvaluation) {
538 int x = 3;
539 EXPECT_DEATH(DieIf((++x) == 4), "DieIf");
540
541 const char* regex = "DieIf";
542 const char* regex_save = regex;
543 EXPECT_DEATH(DieIfLessThan(3, 4), regex++);
544 EXPECT_EQ(regex_save + 1, regex);
545 }
546
547 // Tests that run-away death tests are reported as failures.
TEST_F(TestForDeathTest,Runaway)548 TEST_F(TestForDeathTest, Runaway) {
549 EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(static_cast<void>(0), "Foo"),
550 "failed to die.");
551
552 EXPECT_FATAL_FAILURE(ASSERT_DEATH(return, "Bar"),
553 "illegal return in test statement.");
554 }
555
556
557 // Tests that EXPECT_DEBUG_DEATH works as expected,
558 // that is, in debug mode, it:
559 // 1. Asserts on death.
560 // 2. Has no side effect.
561 //
562 // And in opt mode, it:
563 // 1. Has side effects but does not assert.
TEST_F(TestForDeathTest,TestExpectDebugDeath)564 TEST_F(TestForDeathTest, TestExpectDebugDeath) {
565 int sideeffect = 0;
566
567 EXPECT_DEBUG_DEATH(DieInDebugElse12(&sideeffect),
568 "death.*DieInDebugElse12");
569
570 #ifdef NDEBUG
571 // Checks that the assignment occurs in opt mode (sideeffect).
572 EXPECT_EQ(12, sideeffect);
573 #else
574 // Checks that the assignment does not occur in dbg mode (no sideeffect).
575 EXPECT_EQ(0, sideeffect);
576 #endif
577 }
578
579 // Tests that ASSERT_DEBUG_DEATH works as expected
580 // In debug mode:
581 // 1. Asserts on debug death.
582 // 2. Has no side effect.
583 //
584 // In opt mode:
585 // 1. Has side effects and returns the expected value (12).
TEST_F(TestForDeathTest,TestAssertDebugDeath)586 TEST_F(TestForDeathTest, TestAssertDebugDeath) {
587 int sideeffect = 0;
588
589 ASSERT_DEBUG_DEATH({ // NOLINT
590 // Tests that the return value is 12 in opt mode.
591 EXPECT_EQ(12, DieInDebugElse12(&sideeffect));
592 // Tests that the side effect occurred in opt mode.
593 EXPECT_EQ(12, sideeffect);
594 }, "death.*DieInDebugElse12");
595
596 #ifdef NDEBUG
597 // Checks that the assignment occurs in opt mode (sideeffect).
598 EXPECT_EQ(12, sideeffect);
599 #else
600 // Checks that the assignment does not occur in dbg mode (no sideeffect).
601 EXPECT_EQ(0, sideeffect);
602 #endif
603 }
604
605 #ifndef NDEBUG
606
ExpectDebugDeathHelper(bool * aborted)607 void ExpectDebugDeathHelper(bool* aborted) {
608 *aborted = true;
609 EXPECT_DEBUG_DEATH(return, "") << "This is expected to fail.";
610 *aborted = false;
611 }
612
613 #if GTEST_OS_WINDOWS
TEST(PopUpDeathTest,DoesNotShowPopUpOnAbort)614 TEST(PopUpDeathTest, DoesNotShowPopUpOnAbort) {
615 printf("This test should be considered failing if it shows "
616 "any pop-up dialogs.\n");
617 fflush(stdout);
618
619 EXPECT_DEATH({
620 testing::GTEST_FLAG(catch_exceptions) = false;
621 abort();
622 }, "");
623 }
624
TEST(PopUpDeathTest,DoesNotShowPopUpOnThrow)625 TEST(PopUpDeathTest, DoesNotShowPopUpOnThrow) {
626 printf("This test should be considered failing if it shows "
627 "any pop-up dialogs.\n");
628 fflush(stdout);
629
630 EXPECT_DEATH({
631 testing::GTEST_FLAG(catch_exceptions) = false;
632 throw 1;
633 }, "");
634 }
635 #endif // GTEST_OS_WINDOWS
636
637 // Tests that EXPECT_DEBUG_DEATH in debug mode does not abort
638 // the function.
TEST_F(TestForDeathTest,ExpectDebugDeathDoesNotAbort)639 TEST_F(TestForDeathTest, ExpectDebugDeathDoesNotAbort) {
640 bool aborted = true;
641 EXPECT_NONFATAL_FAILURE(ExpectDebugDeathHelper(&aborted), "");
642 EXPECT_FALSE(aborted);
643 }
644
AssertDebugDeathHelper(bool * aborted)645 void AssertDebugDeathHelper(bool* aborted) {
646 *aborted = true;
647 ASSERT_DEBUG_DEATH(return, "") << "This is expected to fail.";
648 *aborted = false;
649 }
650
651 // Tests that ASSERT_DEBUG_DEATH in debug mode aborts the function on
652 // failure.
TEST_F(TestForDeathTest,AssertDebugDeathAborts)653 TEST_F(TestForDeathTest, AssertDebugDeathAborts) {
654 static bool aborted;
655 aborted = false;
656 EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), "");
657 EXPECT_TRUE(aborted);
658 }
659
660 #endif // _NDEBUG
661
662 // Tests the *_EXIT family of macros, using a variety of predicates.
TestExitMacros()663 static void TestExitMacros() {
664 EXPECT_EXIT(_exit(1), testing::ExitedWithCode(1), "");
665 ASSERT_EXIT(_exit(42), testing::ExitedWithCode(42), "");
666
667 #if GTEST_OS_WINDOWS
668 EXPECT_EXIT({
669 testing::GTEST_FLAG(catch_exceptions) = false;
670 *static_cast<int*>(NULL) = 1;
671 }, testing::ExitedWithCode(0xC0000005), "") << "foo";
672
673 EXPECT_NONFATAL_FAILURE({ // NOLINT
674 EXPECT_EXIT({
675 testing::GTEST_FLAG(catch_exceptions) = false;
676 *static_cast<int*>(NULL) = 1;
677 }, testing::ExitedWithCode(0), "") << "This failure is expected.";
678 }, "This failure is expected.");
679
680 // Of all signals effects on the process exit code, only those of SIGABRT
681 // are documented on Windows.
682 // See http://msdn.microsoft.com/en-us/library/dwwzkt4c(VS.71).aspx.
683 EXPECT_EXIT(raise(SIGABRT), testing::ExitedWithCode(3), "");
684 #else
685 EXPECT_EXIT(raise(SIGKILL), testing::KilledBySignal(SIGKILL), "") << "foo";
686 ASSERT_EXIT(raise(SIGUSR2), testing::KilledBySignal(SIGUSR2), "") << "bar";
687
688 EXPECT_FATAL_FAILURE({ // NOLINT
689 ASSERT_EXIT(_exit(0), testing::KilledBySignal(SIGSEGV), "")
690 << "This failure is expected, too.";
691 }, "This failure is expected, too.");
692 #endif // GTEST_OS_WINDOWS
693
694 EXPECT_NONFATAL_FAILURE({ // NOLINT
695 EXPECT_EXIT(raise(SIGSEGV), testing::ExitedWithCode(0), "")
696 << "This failure is expected.";
697 }, "This failure is expected.");
698 }
699
TEST_F(TestForDeathTest,ExitMacros)700 TEST_F(TestForDeathTest, ExitMacros) {
701 TestExitMacros();
702 }
703
TEST_F(TestForDeathTest,ExitMacrosUsingFork)704 TEST_F(TestForDeathTest, ExitMacrosUsingFork) {
705 testing::GTEST_FLAG(death_test_use_fork) = true;
706 TestExitMacros();
707 }
708
TEST_F(TestForDeathTest,InvalidStyle)709 TEST_F(TestForDeathTest, InvalidStyle) {
710 testing::GTEST_FLAG(death_test_style) = "rococo";
711 EXPECT_NONFATAL_FAILURE({ // NOLINT
712 EXPECT_DEATH(_exit(0), "") << "This failure is expected.";
713 }, "This failure is expected.");
714 }
715
716 // A DeathTestFactory that returns MockDeathTests.
717 class MockDeathTestFactory : public DeathTestFactory {
718 public:
719 MockDeathTestFactory();
720 virtual bool Create(const char* statement,
721 const ::testing::internal::RE* regex,
722 const char* file, int line, DeathTest** test);
723
724 // Sets the parameters for subsequent calls to Create.
725 void SetParameters(bool create, DeathTest::TestRole role,
726 int status, bool passed);
727
728 // Accessors.
AssumeRoleCalls() const729 int AssumeRoleCalls() const { return assume_role_calls_; }
WaitCalls() const730 int WaitCalls() const { return wait_calls_; }
PassedCalls() const731 int PassedCalls() const { return passed_args_.size(); }
PassedArgument(int n) const732 bool PassedArgument(int n) const { return passed_args_[n]; }
AbortCalls() const733 int AbortCalls() const { return abort_args_.size(); }
AbortArgument(int n) const734 DeathTest::AbortReason AbortArgument(int n) const {
735 return abort_args_[n];
736 }
TestDeleted() const737 bool TestDeleted() const { return test_deleted_; }
738
739 private:
740 friend class MockDeathTest;
741 // If true, Create will return a MockDeathTest; otherwise it returns
742 // NULL.
743 bool create_;
744 // The value a MockDeathTest will return from its AssumeRole method.
745 DeathTest::TestRole role_;
746 // The value a MockDeathTest will return from its Wait method.
747 int status_;
748 // The value a MockDeathTest will return from its Passed method.
749 bool passed_;
750
751 // Number of times AssumeRole was called.
752 int assume_role_calls_;
753 // Number of times Wait was called.
754 int wait_calls_;
755 // The arguments to the calls to Passed since the last call to
756 // SetParameters.
757 std::vector<bool> passed_args_;
758 // The arguments to the calls to Abort since the last call to
759 // SetParameters.
760 std::vector<DeathTest::AbortReason> abort_args_;
761 // True if the last MockDeathTest returned by Create has been
762 // deleted.
763 bool test_deleted_;
764 };
765
766
767 // A DeathTest implementation useful in testing. It returns values set
768 // at its creation from its various inherited DeathTest methods, and
769 // reports calls to those methods to its parent MockDeathTestFactory
770 // object.
771 class MockDeathTest : public DeathTest {
772 public:
MockDeathTest(MockDeathTestFactory * parent,TestRole role,int status,bool passed)773 MockDeathTest(MockDeathTestFactory *parent,
774 TestRole role, int status, bool passed) :
775 parent_(parent), role_(role), status_(status), passed_(passed) {
776 }
~MockDeathTest()777 virtual ~MockDeathTest() {
778 parent_->test_deleted_ = true;
779 }
AssumeRole()780 virtual TestRole AssumeRole() {
781 ++parent_->assume_role_calls_;
782 return role_;
783 }
Wait()784 virtual int Wait() {
785 ++parent_->wait_calls_;
786 return status_;
787 }
Passed(bool exit_status_ok)788 virtual bool Passed(bool exit_status_ok) {
789 parent_->passed_args_.push_back(exit_status_ok);
790 return passed_;
791 }
Abort(AbortReason reason)792 virtual void Abort(AbortReason reason) {
793 parent_->abort_args_.push_back(reason);
794 }
795 private:
796 MockDeathTestFactory* const parent_;
797 const TestRole role_;
798 const int status_;
799 const bool passed_;
800 };
801
802
803 // MockDeathTestFactory constructor.
MockDeathTestFactory()804 MockDeathTestFactory::MockDeathTestFactory()
805 : create_(true),
806 role_(DeathTest::OVERSEE_TEST),
807 status_(0),
808 passed_(true),
809 assume_role_calls_(0),
810 wait_calls_(0),
811 passed_args_(),
812 abort_args_() {
813 }
814
815
816 // Sets the parameters for subsequent calls to Create.
SetParameters(bool create,DeathTest::TestRole role,int status,bool passed)817 void MockDeathTestFactory::SetParameters(bool create,
818 DeathTest::TestRole role,
819 int status, bool passed) {
820 create_ = create;
821 role_ = role;
822 status_ = status;
823 passed_ = passed;
824
825 assume_role_calls_ = 0;
826 wait_calls_ = 0;
827 passed_args_.clear();
828 abort_args_.clear();
829 }
830
831
832 // Sets test to NULL (if create_ is false) or to the address of a new
833 // MockDeathTest object with parameters taken from the last call
834 // to SetParameters (if create_ is true). Always returns true.
Create(const char * statement,const::testing::internal::RE * regex,const char * file,int line,DeathTest ** test)835 bool MockDeathTestFactory::Create(const char* statement,
836 const ::testing::internal::RE* regex,
837 const char* file, int line,
838 DeathTest** test) {
839 test_deleted_ = false;
840 if (create_) {
841 *test = new MockDeathTest(this, role_, status_, passed_);
842 } else {
843 *test = NULL;
844 }
845 return true;
846 }
847
848 // A test fixture for testing the logic of the GTEST_DEATH_TEST_ macro.
849 // It installs a MockDeathTestFactory that is used for the duration
850 // of the test case.
851 class MacroLogicDeathTest : public testing::Test {
852 protected:
853 static testing::internal::ReplaceDeathTestFactory* replacer_;
854 static MockDeathTestFactory* factory_;
855
SetUpTestCase()856 static void SetUpTestCase() {
857 factory_ = new MockDeathTestFactory;
858 replacer_ = new testing::internal::ReplaceDeathTestFactory(
859 testing::UnitTest::GetInstance(), factory_);
860 }
861
TearDownTestCase()862 static void TearDownTestCase() {
863 delete replacer_;
864 replacer_ = NULL;
865 delete factory_;
866 factory_ = NULL;
867 }
868
869 // Runs a death test that breaks the rules by returning. Such a death
870 // test cannot be run directly from a test routine that uses a
871 // MockDeathTest, or the remainder of the routine will not be executed.
RunReturningDeathTest(bool * flag)872 static void RunReturningDeathTest(bool* flag) {
873 ASSERT_DEATH({ // NOLINT
874 *flag = true;
875 return;
876 }, "");
877 }
878 };
879
880 testing::internal::ReplaceDeathTestFactory* MacroLogicDeathTest::replacer_
881 = NULL;
882 MockDeathTestFactory* MacroLogicDeathTest::factory_ = NULL;
883
884
885 // Test that nothing happens when the factory doesn't return a DeathTest:
TEST_F(MacroLogicDeathTest,NothingHappens)886 TEST_F(MacroLogicDeathTest, NothingHappens) {
887 bool flag = false;
888 factory_->SetParameters(false, DeathTest::OVERSEE_TEST, 0, true);
889 EXPECT_DEATH(flag = true, "");
890 EXPECT_FALSE(flag);
891 EXPECT_EQ(0, factory_->AssumeRoleCalls());
892 EXPECT_EQ(0, factory_->WaitCalls());
893 EXPECT_EQ(0, factory_->PassedCalls());
894 EXPECT_EQ(0, factory_->AbortCalls());
895 EXPECT_FALSE(factory_->TestDeleted());
896 }
897
898 // Test that the parent process doesn't run the death test code,
899 // and that the Passed method returns false when the (simulated)
900 // child process exits with status 0:
TEST_F(MacroLogicDeathTest,ChildExitsSuccessfully)901 TEST_F(MacroLogicDeathTest, ChildExitsSuccessfully) {
902 bool flag = false;
903 factory_->SetParameters(true, DeathTest::OVERSEE_TEST, 0, true);
904 EXPECT_DEATH(flag = true, "");
905 EXPECT_FALSE(flag);
906 EXPECT_EQ(1, factory_->AssumeRoleCalls());
907 EXPECT_EQ(1, factory_->WaitCalls());
908 ASSERT_EQ(1, factory_->PassedCalls());
909 EXPECT_FALSE(factory_->PassedArgument(0));
910 EXPECT_EQ(0, factory_->AbortCalls());
911 EXPECT_TRUE(factory_->TestDeleted());
912 }
913
914 // Tests that the Passed method was given the argument "true" when
915 // the (simulated) child process exits with status 1:
TEST_F(MacroLogicDeathTest,ChildExitsUnsuccessfully)916 TEST_F(MacroLogicDeathTest, ChildExitsUnsuccessfully) {
917 bool flag = false;
918 factory_->SetParameters(true, DeathTest::OVERSEE_TEST, 1, true);
919 EXPECT_DEATH(flag = true, "");
920 EXPECT_FALSE(flag);
921 EXPECT_EQ(1, factory_->AssumeRoleCalls());
922 EXPECT_EQ(1, factory_->WaitCalls());
923 ASSERT_EQ(1, factory_->PassedCalls());
924 EXPECT_TRUE(factory_->PassedArgument(0));
925 EXPECT_EQ(0, factory_->AbortCalls());
926 EXPECT_TRUE(factory_->TestDeleted());
927 }
928
929 // Tests that the (simulated) child process executes the death test
930 // code, and is aborted with the correct AbortReason if it
931 // executes a return statement.
TEST_F(MacroLogicDeathTest,ChildPerformsReturn)932 TEST_F(MacroLogicDeathTest, ChildPerformsReturn) {
933 bool flag = false;
934 factory_->SetParameters(true, DeathTest::EXECUTE_TEST, 0, true);
935 RunReturningDeathTest(&flag);
936 EXPECT_TRUE(flag);
937 EXPECT_EQ(1, factory_->AssumeRoleCalls());
938 EXPECT_EQ(0, factory_->WaitCalls());
939 EXPECT_EQ(0, factory_->PassedCalls());
940 EXPECT_EQ(1, factory_->AbortCalls());
941 EXPECT_EQ(DeathTest::TEST_ENCOUNTERED_RETURN_STATEMENT,
942 factory_->AbortArgument(0));
943 EXPECT_TRUE(factory_->TestDeleted());
944 }
945
946 // Tests that the (simulated) child process is aborted with the
947 // correct AbortReason if it does not die.
TEST_F(MacroLogicDeathTest,ChildDoesNotDie)948 TEST_F(MacroLogicDeathTest, ChildDoesNotDie) {
949 bool flag = false;
950 factory_->SetParameters(true, DeathTest::EXECUTE_TEST, 0, true);
951 EXPECT_DEATH(flag = true, "");
952 EXPECT_TRUE(flag);
953 EXPECT_EQ(1, factory_->AssumeRoleCalls());
954 EXPECT_EQ(0, factory_->WaitCalls());
955 EXPECT_EQ(0, factory_->PassedCalls());
956 // This time there are two calls to Abort: one since the test didn't
957 // die, and another from the ReturnSentinel when it's destroyed. The
958 // sentinel normally isn't destroyed if a test doesn't die, since
959 // _exit(2) is called in that case by ForkingDeathTest, but not by
960 // our MockDeathTest.
961 ASSERT_EQ(2, factory_->AbortCalls());
962 EXPECT_EQ(DeathTest::TEST_DID_NOT_DIE,
963 factory_->AbortArgument(0));
964 EXPECT_EQ(DeathTest::TEST_ENCOUNTERED_RETURN_STATEMENT,
965 factory_->AbortArgument(1));
966 EXPECT_TRUE(factory_->TestDeleted());
967 }
968
969 // Returns the number of successful parts in the current test.
GetSuccessfulTestPartCount()970 static size_t GetSuccessfulTestPartCount() {
971 return testing::UnitTest::GetInstance()->impl()->current_test_result()->
972 successful_part_count();
973 }
974
975 // Tests that a successful death test does not register a successful
976 // test part.
TEST(SuccessRegistrationDeathTest,NoSuccessPart)977 TEST(SuccessRegistrationDeathTest, NoSuccessPart) {
978 EXPECT_DEATH(_exit(1), "");
979 EXPECT_EQ(0u, GetSuccessfulTestPartCount());
980 }
981
TEST(StreamingAssertionsDeathTest,DeathTest)982 TEST(StreamingAssertionsDeathTest, DeathTest) {
983 EXPECT_DEATH(_exit(1), "") << "unexpected failure";
984 ASSERT_DEATH(_exit(1), "") << "unexpected failure";
985 EXPECT_NONFATAL_FAILURE({ // NOLINT
986 EXPECT_DEATH(_exit(0), "") << "expected failure";
987 }, "expected failure");
988 EXPECT_FATAL_FAILURE({ // NOLINT
989 ASSERT_DEATH(_exit(0), "") << "expected failure";
990 }, "expected failure");
991 }
992
993 // Tests that GetLastSystemErrorMessage returns an empty string when the
994 // last error is 0 and non-empty string when it is non-zero.
TEST(GetLastSystemErrorMessageTest,GetLastSystemErrorMessageWorks)995 TEST(GetLastSystemErrorMessageTest, GetLastSystemErrorMessageWorks) {
996 #if GTEST_OS_WINDOWS
997 ::SetLastError(ERROR_FILE_NOT_FOUND);
998 EXPECT_STRNE("", GetLastSystemErrorMessage().c_str());
999 ::SetLastError(0);
1000 EXPECT_STREQ("", GetLastSystemErrorMessage().c_str());
1001 #else
1002 errno = ENOENT;
1003 EXPECT_STRNE("", GetLastSystemErrorMessage().c_str());
1004 errno = 0;
1005 EXPECT_STREQ("", GetLastSystemErrorMessage().c_str());
1006 #endif
1007 }
1008
1009 #if GTEST_OS_WINDOWS
TEST(AutoHandleTest,AutoHandleWorks)1010 TEST(AutoHandleTest, AutoHandleWorks) {
1011 HANDLE handle = ::CreateEvent(NULL, FALSE, FALSE, NULL);
1012 ASSERT_NE(INVALID_HANDLE_VALUE, handle);
1013
1014 // Tests that the AutoHandle is correctly initialized with a handle.
1015 testing::internal::AutoHandle auto_handle(handle);
1016 EXPECT_EQ(handle, auto_handle.Get());
1017
1018 // Tests that Reset assigns INVALID_HANDLE_VALUE.
1019 // Note that this cannot verify whether the original handle is closed.
1020 auto_handle.Reset();
1021 EXPECT_EQ(INVALID_HANDLE_VALUE, auto_handle.Get());
1022
1023 // Tests that Reset assigns the new handle.
1024 // Note that this cannot verify whether the original handle is closed.
1025 handle = ::CreateEvent(NULL, FALSE, FALSE, NULL);
1026 ASSERT_NE(INVALID_HANDLE_VALUE, handle);
1027 auto_handle.Reset(handle);
1028 EXPECT_EQ(handle, auto_handle.Get());
1029
1030 // Tests that AutoHandle contains INVALID_HANDLE_VALUE by default.
1031 testing::internal::AutoHandle auto_handle2;
1032 EXPECT_EQ(INVALID_HANDLE_VALUE, auto_handle2.Get());
1033 }
1034 #endif // GTEST_OS_WINDOWS
1035
1036 #if GTEST_OS_WINDOWS
1037 typedef unsigned __int64 BiggestParsable;
1038 typedef signed __int64 BiggestSignedParsable;
1039 const BiggestParsable kBiggestParsableMax = ULLONG_MAX;
1040 const BiggestParsable kBiggestSignedParsableMax = LLONG_MAX;
1041 #else
1042 typedef unsigned long long BiggestParsable;
1043 typedef signed long long BiggestSignedParsable;
1044 const BiggestParsable kBiggestParsableMax =
1045 ::std::numeric_limits<BiggestParsable>::max();
1046 const BiggestSignedParsable kBiggestSignedParsableMax =
1047 ::std::numeric_limits<BiggestSignedParsable>::max();
1048 #endif // GTEST_OS_WINDOWS
1049
TEST(ParseNaturalNumberTest,RejectsInvalidFormat)1050 TEST(ParseNaturalNumberTest, RejectsInvalidFormat) {
1051 BiggestParsable result = 0;
1052
1053 // Rejects non-numbers.
1054 EXPECT_FALSE(ParseNaturalNumber(String("non-number string"), &result));
1055
1056 // Rejects numbers with whitespace prefix.
1057 EXPECT_FALSE(ParseNaturalNumber(String(" 123"), &result));
1058
1059 // Rejects negative numbers.
1060 EXPECT_FALSE(ParseNaturalNumber(String("-123"), &result));
1061
1062 // Rejects numbers starting with a plus sign.
1063 EXPECT_FALSE(ParseNaturalNumber(String("+123"), &result));
1064 errno = 0;
1065 }
1066
TEST(ParseNaturalNumberTest,RejectsOverflownNumbers)1067 TEST(ParseNaturalNumberTest, RejectsOverflownNumbers) {
1068 BiggestParsable result = 0;
1069
1070 EXPECT_FALSE(ParseNaturalNumber(String("99999999999999999999999"), &result));
1071
1072 signed char char_result = 0;
1073 EXPECT_FALSE(ParseNaturalNumber(String("200"), &char_result));
1074 errno = 0;
1075 }
1076
TEST(ParseNaturalNumberTest,AcceptsValidNumbers)1077 TEST(ParseNaturalNumberTest, AcceptsValidNumbers) {
1078 BiggestParsable result = 0;
1079
1080 result = 0;
1081 ASSERT_TRUE(ParseNaturalNumber(String("123"), &result));
1082 EXPECT_EQ(123, result);
1083
1084 // Check 0 as an edge case.
1085 result = 1;
1086 ASSERT_TRUE(ParseNaturalNumber(String("0"), &result));
1087 EXPECT_EQ(0, result);
1088
1089 result = 1;
1090 ASSERT_TRUE(ParseNaturalNumber(String("00000"), &result));
1091 EXPECT_EQ(0, result);
1092 }
1093
TEST(ParseNaturalNumberTest,AcceptsTypeLimits)1094 TEST(ParseNaturalNumberTest, AcceptsTypeLimits) {
1095 Message msg;
1096 msg << kBiggestParsableMax;
1097
1098 BiggestParsable result = 0;
1099 EXPECT_TRUE(ParseNaturalNumber(msg.GetString(), &result));
1100 EXPECT_EQ(kBiggestParsableMax, result);
1101
1102 Message msg2;
1103 msg2 << kBiggestSignedParsableMax;
1104
1105 BiggestSignedParsable signed_result = 0;
1106 EXPECT_TRUE(ParseNaturalNumber(msg2.GetString(), &signed_result));
1107 EXPECT_EQ(kBiggestSignedParsableMax, signed_result);
1108
1109 Message msg3;
1110 msg3 << INT_MAX;
1111
1112 int int_result = 0;
1113 EXPECT_TRUE(ParseNaturalNumber(msg3.GetString(), &int_result));
1114 EXPECT_EQ(INT_MAX, int_result);
1115
1116 Message msg4;
1117 msg4 << UINT_MAX;
1118
1119 unsigned int uint_result = 0;
1120 EXPECT_TRUE(ParseNaturalNumber(msg4.GetString(), &uint_result));
1121 EXPECT_EQ(UINT_MAX, uint_result);
1122 }
1123
TEST(ParseNaturalNumberTest,WorksForShorterIntegers)1124 TEST(ParseNaturalNumberTest, WorksForShorterIntegers) {
1125 short short_result = 0;
1126 ASSERT_TRUE(ParseNaturalNumber(String("123"), &short_result));
1127 EXPECT_EQ(123, short_result);
1128
1129 signed char char_result = 0;
1130 ASSERT_TRUE(ParseNaturalNumber(String("123"), &char_result));
1131 EXPECT_EQ(123, char_result);
1132 }
1133
1134 #if GTEST_OS_WINDOWS
TEST(EnvironmentTest,HandleFitsIntoSizeT)1135 TEST(EnvironmentTest, HandleFitsIntoSizeT) {
1136 // TODO(vladl@google.com): Remove this test after this condition is verified
1137 // in a static assertion in gtest-death-test.cc in the function
1138 // GetStatusFileDescriptor.
1139 ASSERT_TRUE(sizeof(HANDLE) <= sizeof(size_t));
1140 }
1141 #endif // GTEST_OS_WINDOWS
1142
1143 #endif // GTEST_HAS_DEATH_TEST
1144
1145 // Tests that a test case whose name ends with "DeathTest" works fine
1146 // on Windows.
TEST(NotADeathTest,Test)1147 TEST(NotADeathTest, Test) {
1148 SUCCEED();
1149 }
1150