OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #define _CRT_SECURE_NO_WARNINGS | 5 #define _CRT_SECURE_NO_WARNINGS |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/debug/alias.h" | 10 #include "base/debug/alias.h" |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
112 } // namespace | 112 } // namespace |
113 | 113 |
114 class ProcessUtilTest : public base::MultiProcessTest { | 114 class ProcessUtilTest : public base::MultiProcessTest { |
115 #if defined(OS_POSIX) | 115 #if defined(OS_POSIX) |
116 public: | 116 public: |
117 // Spawn a child process that counts how many file descriptors are open. | 117 // Spawn a child process that counts how many file descriptors are open. |
118 int CountOpenFDsInChild(); | 118 int CountOpenFDsInChild(); |
119 #endif | 119 #endif |
120 }; | 120 }; |
121 | 121 |
122 MULTIPROCESS_TEST_MAIN(SimpleChildProcess) { | 122 MULTIPROCESS_TEST_MAIN(SimpleChildProcess, NULL) { |
123 return 0; | 123 return 0; |
124 } | 124 } |
125 | 125 |
126 TEST_F(ProcessUtilTest, SpawnChild) { | 126 TEST_F(ProcessUtilTest, SpawnChild) { |
127 base::ProcessHandle handle = this->SpawnChild("SimpleChildProcess", false); | 127 base::ProcessHandle handle = this->SpawnChild("SimpleChildProcess", false); |
128 ASSERT_NE(base::kNullProcessHandle, handle); | 128 ASSERT_NE(base::kNullProcessHandle, handle); |
129 EXPECT_TRUE(base::WaitForSingleProcess( | 129 EXPECT_TRUE(base::WaitForSingleProcess( |
130 handle, TestTimeouts::action_max_timeout_ms())); | 130 handle, TestTimeouts::action_max_timeout_ms())); |
131 base::CloseProcessHandle(handle); | 131 base::CloseProcessHandle(handle); |
132 } | 132 } |
133 | 133 |
134 MULTIPROCESS_TEST_MAIN(SlowChildProcess) { | 134 MULTIPROCESS_TEST_MAIN(SlowChildProcess, NULL) { |
135 WaitToDie(kSignalFileSlow); | 135 WaitToDie(kSignalFileSlow); |
136 return 0; | 136 return 0; |
137 } | 137 } |
138 | 138 |
139 TEST_F(ProcessUtilTest, KillSlowChild) { | 139 TEST_F(ProcessUtilTest, KillSlowChild) { |
140 remove(kSignalFileSlow); | 140 remove(kSignalFileSlow); |
141 base::ProcessHandle handle = this->SpawnChild("SlowChildProcess", false); | 141 base::ProcessHandle handle = this->SpawnChild("SlowChildProcess", false); |
142 ASSERT_NE(base::kNullProcessHandle, handle); | 142 ASSERT_NE(base::kNullProcessHandle, handle); |
143 SignalChildren(kSignalFileSlow); | 143 SignalChildren(kSignalFileSlow); |
144 EXPECT_TRUE(base::WaitForSingleProcess( | 144 EXPECT_TRUE(base::WaitForSingleProcess( |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
204 #if !defined(OS_MACOSX) | 204 #if !defined(OS_MACOSX) |
205 // This test is disabled on Mac, since it's flaky due to ReportCrash | 205 // This test is disabled on Mac, since it's flaky due to ReportCrash |
206 // taking a variable amount of time to parse and load the debug and | 206 // taking a variable amount of time to parse and load the debug and |
207 // symbol data for this unit test's executable before firing the | 207 // symbol data for this unit test's executable before firing the |
208 // signal handler. | 208 // signal handler. |
209 // | 209 // |
210 // TODO(gspencer): turn this test process into a very small program | 210 // TODO(gspencer): turn this test process into a very small program |
211 // with no symbols (instead of using the multiprocess testing | 211 // with no symbols (instead of using the multiprocess testing |
212 // framework) to reduce the ReportCrash overhead. | 212 // framework) to reduce the ReportCrash overhead. |
213 | 213 |
214 MULTIPROCESS_TEST_MAIN(CrashingChildProcess) { | 214 MULTIPROCESS_TEST_MAIN(CrashingChildProcess, NULL) { |
215 WaitToDie(kSignalFileCrash); | 215 WaitToDie(kSignalFileCrash); |
216 #if defined(OS_POSIX) | 216 #if defined(OS_POSIX) |
217 // Have to disable to signal handler for segv so we can get a crash | 217 // Have to disable to signal handler for segv so we can get a crash |
218 // instead of an abnormal termination through the crash dump handler. | 218 // instead of an abnormal termination through the crash dump handler. |
219 ::signal(SIGSEGV, SIG_DFL); | 219 ::signal(SIGSEGV, SIG_DFL); |
220 #endif | 220 #endif |
221 // Make this process have a segmentation fault. | 221 // Make this process have a segmentation fault. |
222 volatile int* oops = NULL; | 222 volatile int* oops = NULL; |
223 *oops = 0xDEAD; | 223 *oops = 0xDEAD; |
224 return 1; | 224 return 1; |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
257 EXPECT_EQ(SIGSEGV, signal); | 257 EXPECT_EQ(SIGSEGV, signal); |
258 #endif | 258 #endif |
259 base::CloseProcessHandle(handle); | 259 base::CloseProcessHandle(handle); |
260 | 260 |
261 // Reset signal handlers back to "normal". | 261 // Reset signal handlers back to "normal". |
262 base::EnableInProcessStackDumping(); | 262 base::EnableInProcessStackDumping(); |
263 remove(kSignalFileCrash); | 263 remove(kSignalFileCrash); |
264 } | 264 } |
265 #endif // !defined(OS_MACOSX) | 265 #endif // !defined(OS_MACOSX) |
266 | 266 |
267 MULTIPROCESS_TEST_MAIN(KilledChildProcess) { | 267 MULTIPROCESS_TEST_MAIN(KilledChildProcess, NULL) { |
268 WaitToDie(kSignalFileKill); | 268 WaitToDie(kSignalFileKill); |
269 #if defined(OS_WIN) | 269 #if defined(OS_WIN) |
270 // Kill ourselves. | 270 // Kill ourselves. |
271 HANDLE handle = ::OpenProcess(PROCESS_ALL_ACCESS, 0, ::GetCurrentProcessId()); | 271 HANDLE handle = ::OpenProcess(PROCESS_ALL_ACCESS, 0, ::GetCurrentProcessId()); |
272 ::TerminateProcess(handle, kExpectedKilledExitCode); | 272 ::TerminateProcess(handle, kExpectedKilledExitCode); |
273 #elif defined(OS_POSIX) | 273 #elif defined(OS_POSIX) |
274 // Send a SIGKILL to this process, just like the OOM killer would. | 274 // Send a SIGKILL to this process, just like the OOM killer would. |
275 ::kill(getpid(), SIGKILL); | 275 ::kill(getpid(), SIGKILL); |
276 #endif | 276 #endif |
277 return 1; | 277 return 1; |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
515 return max_int; | 515 return max_int; |
516 } | 516 } |
517 | 517 |
518 return rlim.rlim_cur; | 518 return rlim.rlim_cur; |
519 } | 519 } |
520 | 520 |
521 const int kChildPipe = 20; // FD # for write end of pipe in child process. | 521 const int kChildPipe = 20; // FD # for write end of pipe in child process. |
522 | 522 |
523 } // namespace | 523 } // namespace |
524 | 524 |
525 MULTIPROCESS_TEST_MAIN(ProcessUtilsLeakFDChildProcess) { | 525 MULTIPROCESS_TEST_MAIN(ProcessUtilsLeakFDChildProcess, NULL) { |
526 // This child process counts the number of open FDs, it then writes that | 526 // This child process counts the number of open FDs, it then writes that |
527 // number out to a pipe connected to the parent. | 527 // number out to a pipe connected to the parent. |
528 int num_open_files = 0; | 528 int num_open_files = 0; |
529 int write_pipe = kChildPipe; | 529 int write_pipe = kChildPipe; |
530 int max_files = GetMaxFilesOpenInProcess(); | 530 int max_files = GetMaxFilesOpenInProcess(); |
531 for (int i = STDERR_FILENO + 1; i < max_files; i++) { | 531 for (int i = STDERR_FILENO + 1; i < max_files; i++) { |
532 if (i != kChildPipe) { | 532 if (i != kChildPipe) { |
533 int fd; | 533 int fd; |
534 if ((fd = HANDLE_EINTR(dup(i))) != -1) { | 534 if ((fd = HANDLE_EINTR(dup(i))) != -1) { |
535 close(fd); | 535 close(fd); |
(...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
908 SpawnChild("process_util_test_never_die", false); | 908 SpawnChild("process_util_test_never_die", false); |
909 ASSERT_TRUE(child_process); | 909 ASSERT_TRUE(child_process); |
910 base::EnsureProcessTerminated(child_process); | 910 base::EnsureProcessTerminated(child_process); |
911 base::WaitForSingleProcess(child_process, 5000); | 911 base::WaitForSingleProcess(child_process, 5000); |
912 | 912 |
913 // Check that process was really killed. | 913 // Check that process was really killed. |
914 EXPECT_TRUE(IsProcessDead(child_process)); | 914 EXPECT_TRUE(IsProcessDead(child_process)); |
915 base::CloseProcessHandle(child_process); | 915 base::CloseProcessHandle(child_process); |
916 } | 916 } |
917 | 917 |
918 MULTIPROCESS_TEST_MAIN(process_util_test_never_die) { | 918 MULTIPROCESS_TEST_MAIN(process_util_test_never_die, NULL) { |
919 while (1) { | 919 while (1) { |
920 sleep(500); | 920 sleep(500); |
921 } | 921 } |
922 return 0; | 922 return 0; |
923 } | 923 } |
924 | 924 |
925 TEST_F(ProcessUtilTest, ImmediateTermination) { | 925 TEST_F(ProcessUtilTest, ImmediateTermination) { |
926 base::ProcessHandle child_process = | 926 base::ProcessHandle child_process = |
927 SpawnChild("process_util_test_die_immediately", false); | 927 SpawnChild("process_util_test_die_immediately", false); |
928 ASSERT_TRUE(child_process); | 928 ASSERT_TRUE(child_process); |
929 // Give it time to die. | 929 // Give it time to die. |
930 sleep(2); | 930 sleep(2); |
931 base::EnsureProcessTerminated(child_process); | 931 base::EnsureProcessTerminated(child_process); |
932 | 932 |
933 // Check that process was really killed. | 933 // Check that process was really killed. |
934 EXPECT_TRUE(IsProcessDead(child_process)); | 934 EXPECT_TRUE(IsProcessDead(child_process)); |
935 base::CloseProcessHandle(child_process); | 935 base::CloseProcessHandle(child_process); |
936 } | 936 } |
937 | 937 |
938 MULTIPROCESS_TEST_MAIN(process_util_test_die_immediately) { | 938 MULTIPROCESS_TEST_MAIN(process_util_test_die_immediately, NULL) { |
939 return 0; | 939 return 0; |
940 } | 940 } |
941 | 941 |
942 #endif // defined(OS_POSIX) | 942 #endif // defined(OS_POSIX) |
943 | 943 |
944 // Android doesn't implement set_new_handler, so we can't use the | 944 // Android doesn't implement set_new_handler, so we can't use the |
945 // OutOfMemoryTest cases. | 945 // OutOfMemoryTest cases. |
946 // OpenBSD does not support these tests either. | 946 // OpenBSD does not support these tests either. |
947 // AddressSanitizer defines the malloc()/free()/etc. functions so that they | 947 // AddressSanitizer defines the malloc()/free()/etc. functions so that they |
948 // don't crash if the program is out of memory, so the OOM tests aren't supposed | 948 // don't crash if the program is out of memory, so the OOM tests aren't supposed |
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1184 SetUpInDeathAssert(); | 1184 SetUpInDeathAssert(); |
1185 while ((value_ = base::AllocatePsychoticallyBigObjCObject())) {} | 1185 while ((value_ = base::AllocatePsychoticallyBigObjCObject())) {} |
1186 }, ""); | 1186 }, ""); |
1187 } | 1187 } |
1188 | 1188 |
1189 #endif // !ARCH_CPU_64_BITS | 1189 #endif // !ARCH_CPU_64_BITS |
1190 #endif // OS_MACOSX | 1190 #endif // OS_MACOSX |
1191 | 1191 |
1192 #endif // !defined(OS_ANDROID) && !defined(OS_OPENBSD) && | 1192 #endif // !defined(OS_ANDROID) && !defined(OS_OPENBSD) && |
1193 // !defined(OS_WIN) && !defined(ADDRESS_SANITIZER) | 1193 // !defined(OS_WIN) && !defined(ADDRESS_SANITIZER) |
OLD | NEW |