Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(999)

Side by Side Diff: base/process/process_util_unittest.cc

Issue 843113003: MultiProcessTest: Update SpawnChild* to return a Process. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « base/metrics/stats_table_unittest.cc ('k') | base/test/multiprocess_test.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
135 return tmp_dir.value(); 135 return tmp_dir.value();
136 #endif 136 #endif
137 } 137 }
138 138
139 MULTIPROCESS_TEST_MAIN(SimpleChildProcess) { 139 MULTIPROCESS_TEST_MAIN(SimpleChildProcess) {
140 return 0; 140 return 0;
141 } 141 }
142 142
143 // TODO(viettrungluu): This should be in a "MultiProcessTestTest". 143 // TODO(viettrungluu): This should be in a "MultiProcessTestTest".
144 TEST_F(ProcessUtilTest, SpawnChild) { 144 TEST_F(ProcessUtilTest, SpawnChild) {
145 base::ProcessHandle handle = SpawnChild("SimpleChildProcess"); 145 base::Process process = SpawnChild("SimpleChildProcess");
146 ASSERT_NE(base::kNullProcessHandle, handle); 146 ASSERT_TRUE(process.IsValid());
147 EXPECT_TRUE(base::WaitForSingleProcess( 147 EXPECT_TRUE(base::WaitForSingleProcess(process.Handle(),
148 handle, TestTimeouts::action_max_timeout())); 148 TestTimeouts::action_max_timeout()));
149 base::CloseProcessHandle(handle);
150 } 149 }
151 150
152 MULTIPROCESS_TEST_MAIN(SlowChildProcess) { 151 MULTIPROCESS_TEST_MAIN(SlowChildProcess) {
153 WaitToDie(ProcessUtilTest::GetSignalFilePath(kSignalFileSlow).c_str()); 152 WaitToDie(ProcessUtilTest::GetSignalFilePath(kSignalFileSlow).c_str());
154 return 0; 153 return 0;
155 } 154 }
156 155
157 TEST_F(ProcessUtilTest, KillSlowChild) { 156 TEST_F(ProcessUtilTest, KillSlowChild) {
158 const std::string signal_file = 157 const std::string signal_file =
159 ProcessUtilTest::GetSignalFilePath(kSignalFileSlow); 158 ProcessUtilTest::GetSignalFilePath(kSignalFileSlow);
160 remove(signal_file.c_str()); 159 remove(signal_file.c_str());
161 base::ProcessHandle handle = SpawnChild("SlowChildProcess"); 160 base::Process process = SpawnChild("SlowChildProcess");
162 ASSERT_NE(base::kNullProcessHandle, handle); 161 ASSERT_TRUE(process.IsValid());
163 SignalChildren(signal_file.c_str()); 162 SignalChildren(signal_file.c_str());
164 EXPECT_TRUE(base::WaitForSingleProcess( 163 EXPECT_TRUE(base::WaitForSingleProcess(process.Handle(),
165 handle, TestTimeouts::action_max_timeout())); 164 TestTimeouts::action_max_timeout()));
166 base::CloseProcessHandle(handle);
167 remove(signal_file.c_str()); 165 remove(signal_file.c_str());
168 } 166 }
169 167
170 // Times out on Linux and Win, flakes on other platforms, http://crbug.com/95058 168 // Times out on Linux and Win, flakes on other platforms, http://crbug.com/95058
171 TEST_F(ProcessUtilTest, DISABLED_GetTerminationStatusExit) { 169 TEST_F(ProcessUtilTest, DISABLED_GetTerminationStatusExit) {
172 const std::string signal_file = 170 const std::string signal_file =
173 ProcessUtilTest::GetSignalFilePath(kSignalFileSlow); 171 ProcessUtilTest::GetSignalFilePath(kSignalFileSlow);
174 remove(signal_file.c_str()); 172 remove(signal_file.c_str());
175 base::ProcessHandle handle = SpawnChild("SlowChildProcess"); 173 base::Process process = SpawnChild("SlowChildProcess");
176 ASSERT_NE(base::kNullProcessHandle, handle); 174 ASSERT_TRUE(process.IsValid());
177 175
178 int exit_code = 42; 176 int exit_code = 42;
179 EXPECT_EQ(base::TERMINATION_STATUS_STILL_RUNNING, 177 EXPECT_EQ(base::TERMINATION_STATUS_STILL_RUNNING,
180 base::GetTerminationStatus(handle, &exit_code)); 178 base::GetTerminationStatus(process.Handle(), &exit_code));
181 EXPECT_EQ(kExpectedStillRunningExitCode, exit_code); 179 EXPECT_EQ(kExpectedStillRunningExitCode, exit_code);
182 180
183 SignalChildren(signal_file.c_str()); 181 SignalChildren(signal_file.c_str());
184 exit_code = 42; 182 exit_code = 42;
185 base::TerminationStatus status = 183 base::TerminationStatus status =
186 WaitForChildTermination(handle, &exit_code); 184 WaitForChildTermination(process.Handle(), &exit_code);
187 EXPECT_EQ(base::TERMINATION_STATUS_NORMAL_TERMINATION, status); 185 EXPECT_EQ(base::TERMINATION_STATUS_NORMAL_TERMINATION, status);
188 EXPECT_EQ(0, exit_code); 186 EXPECT_EQ(0, exit_code);
189 base::CloseProcessHandle(handle);
190 remove(signal_file.c_str()); 187 remove(signal_file.c_str());
191 } 188 }
192 189
193 #if defined(OS_WIN) 190 #if defined(OS_WIN)
194 // TODO(cpu): figure out how to test this in other platforms. 191 // TODO(cpu): figure out how to test this in other platforms.
195 TEST_F(ProcessUtilTest, GetProcId) { 192 TEST_F(ProcessUtilTest, GetProcId) {
196 base::ProcessId id1 = base::GetProcId(GetCurrentProcess()); 193 base::ProcessId id1 = base::GetProcId(GetCurrentProcess());
197 EXPECT_NE(0ul, id1); 194 EXPECT_NE(0ul, id1);
198 base::ProcessHandle handle = SpawnChild("SimpleChildProcess"); 195 base::Process process = SpawnChild("SimpleChildProcess");
199 ASSERT_NE(base::kNullProcessHandle, handle); 196 ASSERT_TRUE(process.IsValid());
200 base::ProcessId id2 = base::GetProcId(handle); 197 base::ProcessId id2 = process.pid();
201 EXPECT_NE(0ul, id2); 198 EXPECT_NE(0ul, id2);
202 EXPECT_NE(id1, id2); 199 EXPECT_NE(id1, id2);
203 base::CloseProcessHandle(handle);
204 } 200 }
205 #endif 201 #endif
206 202
207 #if !defined(OS_MACOSX) 203 #if !defined(OS_MACOSX)
208 // This test is disabled on Mac, since it's flaky due to ReportCrash 204 // This test is disabled on Mac, since it's flaky due to ReportCrash
209 // taking a variable amount of time to parse and load the debug and 205 // taking a variable amount of time to parse and load the debug and
210 // symbol data for this unit test's executable before firing the 206 // symbol data for this unit test's executable before firing the
211 // signal handler. 207 // signal handler.
212 // 208 //
213 // TODO(gspencer): turn this test process into a very small program 209 // TODO(gspencer): turn this test process into a very small program
(...skipping 18 matching lines...) Expand all
232 // AddressSanitizer. 228 // AddressSanitizer.
233 #if defined(ADDRESS_SANITIZER) || defined(SYZYASAN) 229 #if defined(ADDRESS_SANITIZER) || defined(SYZYASAN)
234 #define MAYBE_GetTerminationStatusCrash DISABLED_GetTerminationStatusCrash 230 #define MAYBE_GetTerminationStatusCrash DISABLED_GetTerminationStatusCrash
235 #else 231 #else
236 #define MAYBE_GetTerminationStatusCrash GetTerminationStatusCrash 232 #define MAYBE_GetTerminationStatusCrash GetTerminationStatusCrash
237 #endif 233 #endif
238 TEST_F(ProcessUtilTest, MAYBE_GetTerminationStatusCrash) { 234 TEST_F(ProcessUtilTest, MAYBE_GetTerminationStatusCrash) {
239 const std::string signal_file = 235 const std::string signal_file =
240 ProcessUtilTest::GetSignalFilePath(kSignalFileCrash); 236 ProcessUtilTest::GetSignalFilePath(kSignalFileCrash);
241 remove(signal_file.c_str()); 237 remove(signal_file.c_str());
242 base::ProcessHandle handle = SpawnChild("CrashingChildProcess"); 238 base::Process process = SpawnChild("CrashingChildProcess");
243 ASSERT_NE(base::kNullProcessHandle, handle); 239 ASSERT_TRUE(process.IsValid());
244 240
245 int exit_code = 42; 241 int exit_code = 42;
246 EXPECT_EQ(base::TERMINATION_STATUS_STILL_RUNNING, 242 EXPECT_EQ(base::TERMINATION_STATUS_STILL_RUNNING,
247 base::GetTerminationStatus(handle, &exit_code)); 243 base::GetTerminationStatus(process.Handle(), &exit_code));
248 EXPECT_EQ(kExpectedStillRunningExitCode, exit_code); 244 EXPECT_EQ(kExpectedStillRunningExitCode, exit_code);
249 245
250 SignalChildren(signal_file.c_str()); 246 SignalChildren(signal_file.c_str());
251 exit_code = 42; 247 exit_code = 42;
252 base::TerminationStatus status = 248 base::TerminationStatus status =
253 WaitForChildTermination(handle, &exit_code); 249 WaitForChildTermination(process.Handle(), &exit_code);
254 EXPECT_EQ(base::TERMINATION_STATUS_PROCESS_CRASHED, status); 250 EXPECT_EQ(base::TERMINATION_STATUS_PROCESS_CRASHED, status);
255 251
256 #if defined(OS_WIN) 252 #if defined(OS_WIN)
257 EXPECT_EQ(0xc0000005, exit_code); 253 EXPECT_EQ(0xc0000005, exit_code);
258 #elif defined(OS_POSIX) 254 #elif defined(OS_POSIX)
259 int signaled = WIFSIGNALED(exit_code); 255 int signaled = WIFSIGNALED(exit_code);
260 EXPECT_NE(0, signaled); 256 EXPECT_NE(0, signaled);
261 int signal = WTERMSIG(exit_code); 257 int signal = WTERMSIG(exit_code);
262 EXPECT_EQ(SIGSEGV, signal); 258 EXPECT_EQ(SIGSEGV, signal);
263 #endif 259 #endif
264 base::CloseProcessHandle(handle);
265 260
266 // Reset signal handlers back to "normal". 261 // Reset signal handlers back to "normal".
267 base::debug::EnableInProcessStackDumping(); 262 base::debug::EnableInProcessStackDumping();
268 remove(signal_file.c_str()); 263 remove(signal_file.c_str());
269 } 264 }
270 #endif // !defined(OS_MACOSX) 265 #endif // !defined(OS_MACOSX)
271 266
272 MULTIPROCESS_TEST_MAIN(KilledChildProcess) { 267 MULTIPROCESS_TEST_MAIN(KilledChildProcess) {
273 WaitToDie(ProcessUtilTest::GetSignalFilePath(kSignalFileKill).c_str()); 268 WaitToDie(ProcessUtilTest::GetSignalFilePath(kSignalFileKill).c_str());
274 #if defined(OS_WIN) 269 #if defined(OS_WIN)
275 // Kill ourselves. 270 // Kill ourselves.
276 HANDLE handle = ::OpenProcess(PROCESS_ALL_ACCESS, 0, ::GetCurrentProcessId()); 271 HANDLE handle = ::OpenProcess(PROCESS_ALL_ACCESS, 0, ::GetCurrentProcessId());
277 ::TerminateProcess(handle, kExpectedKilledExitCode); 272 ::TerminateProcess(handle, kExpectedKilledExitCode);
278 #elif defined(OS_POSIX) 273 #elif defined(OS_POSIX)
279 // 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.
280 ::kill(getpid(), SIGKILL); 275 ::kill(getpid(), SIGKILL);
281 #endif 276 #endif
282 return 1; 277 return 1;
283 } 278 }
284 279
285 TEST_F(ProcessUtilTest, GetTerminationStatusKill) { 280 TEST_F(ProcessUtilTest, GetTerminationStatusKill) {
286 const std::string signal_file = 281 const std::string signal_file =
287 ProcessUtilTest::GetSignalFilePath(kSignalFileKill); 282 ProcessUtilTest::GetSignalFilePath(kSignalFileKill);
288 remove(signal_file.c_str()); 283 remove(signal_file.c_str());
289 base::ProcessHandle handle = SpawnChild("KilledChildProcess"); 284 base::Process process = SpawnChild("KilledChildProcess");
290 ASSERT_NE(base::kNullProcessHandle, handle); 285 ASSERT_TRUE(process.IsValid());
291 286
292 int exit_code = 42; 287 int exit_code = 42;
293 EXPECT_EQ(base::TERMINATION_STATUS_STILL_RUNNING, 288 EXPECT_EQ(base::TERMINATION_STATUS_STILL_RUNNING,
294 base::GetTerminationStatus(handle, &exit_code)); 289 base::GetTerminationStatus(process.Handle(), &exit_code));
295 EXPECT_EQ(kExpectedStillRunningExitCode, exit_code); 290 EXPECT_EQ(kExpectedStillRunningExitCode, exit_code);
296 291
297 SignalChildren(signal_file.c_str()); 292 SignalChildren(signal_file.c_str());
298 exit_code = 42; 293 exit_code = 42;
299 base::TerminationStatus status = 294 base::TerminationStatus status =
300 WaitForChildTermination(handle, &exit_code); 295 WaitForChildTermination(process.Handle(), &exit_code);
301 EXPECT_EQ(base::TERMINATION_STATUS_PROCESS_WAS_KILLED, status); 296 EXPECT_EQ(base::TERMINATION_STATUS_PROCESS_WAS_KILLED, status);
302 #if defined(OS_WIN) 297 #if defined(OS_WIN)
303 EXPECT_EQ(kExpectedKilledExitCode, exit_code); 298 EXPECT_EQ(kExpectedKilledExitCode, exit_code);
304 #elif defined(OS_POSIX) 299 #elif defined(OS_POSIX)
305 int signaled = WIFSIGNALED(exit_code); 300 int signaled = WIFSIGNALED(exit_code);
306 EXPECT_NE(0, signaled); 301 EXPECT_NE(0, signaled);
307 int signal = WTERMSIG(exit_code); 302 int signal = WTERMSIG(exit_code);
308 EXPECT_EQ(SIGKILL, signal); 303 EXPECT_EQ(SIGKILL, signal);
309 #endif 304 #endif
310 base::CloseProcessHandle(handle);
311 remove(signal_file.c_str()); 305 remove(signal_file.c_str());
312 } 306 }
313 307
314 #if defined(OS_WIN) 308 #if defined(OS_WIN)
315 // TODO(estade): if possible, port this test. 309 // TODO(estade): if possible, port this test.
316 TEST_F(ProcessUtilTest, GetAppOutput) { 310 TEST_F(ProcessUtilTest, GetAppOutput) {
317 // Let's create a decently long message. 311 // Let's create a decently long message.
318 std::string message; 312 std::string message;
319 for (int i = 0; i < 1025; i++) { // 1025 so it does not end on a kilo-byte 313 for (int i = 0; i < 1025; i++) { // 1025 so it does not end on a kilo-byte
320 // boundary. 314 // boundary.
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
528 522
529 int ProcessUtilTest::CountOpenFDsInChild() { 523 int ProcessUtilTest::CountOpenFDsInChild() {
530 int fds[2]; 524 int fds[2];
531 if (pipe(fds) < 0) 525 if (pipe(fds) < 0)
532 NOTREACHED(); 526 NOTREACHED();
533 527
534 base::FileHandleMappingVector fd_mapping_vec; 528 base::FileHandleMappingVector fd_mapping_vec;
535 fd_mapping_vec.push_back(std::pair<int, int>(fds[1], kChildPipe)); 529 fd_mapping_vec.push_back(std::pair<int, int>(fds[1], kChildPipe));
536 base::LaunchOptions options; 530 base::LaunchOptions options;
537 options.fds_to_remap = &fd_mapping_vec; 531 options.fds_to_remap = &fd_mapping_vec;
538 base::ProcessHandle handle = 532 base::Process process =
539 SpawnChildWithOptions("ProcessUtilsLeakFDChildProcess", options); 533 SpawnChildWithOptions("ProcessUtilsLeakFDChildProcess", options);
540 CHECK(handle); 534 CHECK(process.IsValid());
541 int ret = IGNORE_EINTR(close(fds[1])); 535 int ret = IGNORE_EINTR(close(fds[1]));
542 DPCHECK(ret == 0); 536 DPCHECK(ret == 0);
543 537
544 // Read number of open files in client process from pipe; 538 // Read number of open files in client process from pipe;
545 int num_open_files = -1; 539 int num_open_files = -1;
546 ssize_t bytes_read = 540 ssize_t bytes_read =
547 HANDLE_EINTR(read(fds[0], &num_open_files, sizeof(num_open_files))); 541 HANDLE_EINTR(read(fds[0], &num_open_files, sizeof(num_open_files)));
548 CHECK_EQ(bytes_read, static_cast<ssize_t>(sizeof(num_open_files))); 542 CHECK_EQ(bytes_read, static_cast<ssize_t>(sizeof(num_open_files)));
549 543
550 #if defined(THREAD_SANITIZER) 544 #if defined(THREAD_SANITIZER)
551 // Compiler-based ThreadSanitizer makes this test slow. 545 // Compiler-based ThreadSanitizer makes this test slow.
552 CHECK(base::WaitForSingleProcess(handle, base::TimeDelta::FromSeconds(3))); 546 CHECK(base::WaitForSingleProcess(process.Handle(),
547 base::TimeDelta::FromSeconds(3)));
553 #else 548 #else
554 CHECK(base::WaitForSingleProcess(handle, base::TimeDelta::FromSeconds(1))); 549 CHECK(base::WaitForSingleProcess(process.Handle(),
550 base::TimeDelta::FromSeconds(1)));
555 #endif 551 #endif
556 base::CloseProcessHandle(handle);
557 ret = IGNORE_EINTR(close(fds[0])); 552 ret = IGNORE_EINTR(close(fds[0]));
558 DPCHECK(ret == 0); 553 DPCHECK(ret == 0);
559 554
560 return num_open_files; 555 return num_open_files;
561 } 556 }
562 557
563 #if defined(ADDRESS_SANITIZER) || defined(THREAD_SANITIZER) 558 #if defined(ADDRESS_SANITIZER) || defined(THREAD_SANITIZER)
564 // ProcessUtilTest.FDRemapping is flaky when ran under xvfb-run on Precise. 559 // ProcessUtilTest.FDRemapping is flaky when ran under xvfb-run on Precise.
565 // The problem is 100% reproducible with both ASan and TSan. 560 // The problem is 100% reproducible with both ASan and TSan.
566 // See http://crbug.com/136720. 561 // See http://crbug.com/136720.
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after
881 // TODO(port): port those unit tests. 876 // TODO(port): port those unit tests.
882 bool IsProcessDead(base::ProcessHandle child) { 877 bool IsProcessDead(base::ProcessHandle child) {
883 // waitpid() will actually reap the process which is exactly NOT what we 878 // waitpid() will actually reap the process which is exactly NOT what we
884 // want to test for. The good thing is that if it can't find the process 879 // want to test for. The good thing is that if it can't find the process
885 // we'll get a nice value for errno which we can test for. 880 // we'll get a nice value for errno which we can test for.
886 const pid_t result = HANDLE_EINTR(waitpid(child, NULL, WNOHANG)); 881 const pid_t result = HANDLE_EINTR(waitpid(child, NULL, WNOHANG));
887 return result == -1 && errno == ECHILD; 882 return result == -1 && errno == ECHILD;
888 } 883 }
889 884
890 TEST_F(ProcessUtilTest, DelayedTermination) { 885 TEST_F(ProcessUtilTest, DelayedTermination) {
891 base::Process child_process(SpawnChild("process_util_test_never_die")); 886 base::Process child_process = SpawnChild("process_util_test_never_die");
892 ASSERT_TRUE(child_process.IsValid()); 887 ASSERT_TRUE(child_process.IsValid());
893 base::EnsureProcessTerminated(child_process.Duplicate()); 888 base::EnsureProcessTerminated(child_process.Duplicate());
894 base::WaitForSingleProcess(child_process.Handle(), 889 base::WaitForSingleProcess(child_process.Handle(),
895 base::TimeDelta::FromSeconds(5)); 890 base::TimeDelta::FromSeconds(5));
896 891
897 // Check that process was really killed. 892 // Check that process was really killed.
898 EXPECT_TRUE(IsProcessDead(child_process.Handle())); 893 EXPECT_TRUE(IsProcessDead(child_process.Handle()));
899 } 894 }
900 895
901 MULTIPROCESS_TEST_MAIN(process_util_test_never_die) { 896 MULTIPROCESS_TEST_MAIN(process_util_test_never_die) {
902 while (1) { 897 while (1) {
903 sleep(500); 898 sleep(500);
904 } 899 }
905 return 0; 900 return 0;
906 } 901 }
907 902
908 TEST_F(ProcessUtilTest, ImmediateTermination) { 903 TEST_F(ProcessUtilTest, ImmediateTermination) {
909 base::Process child_process(SpawnChild("process_util_test_die_immediately")); 904 base::Process child_process = SpawnChild("process_util_test_die_immediately");
910 ASSERT_TRUE(child_process.IsValid()); 905 ASSERT_TRUE(child_process.IsValid());
911 // Give it time to die. 906 // Give it time to die.
912 sleep(2); 907 sleep(2);
913 base::EnsureProcessTerminated(child_process.Duplicate()); 908 base::EnsureProcessTerminated(child_process.Duplicate());
914 909
915 // Check that process was really killed. 910 // Check that process was really killed.
916 EXPECT_TRUE(IsProcessDead(child_process.Handle())); 911 EXPECT_TRUE(IsProcessDead(child_process.Handle()));
917 } 912 }
918 913
919 MULTIPROCESS_TEST_MAIN(process_util_test_die_immediately) { 914 MULTIPROCESS_TEST_MAIN(process_util_test_die_immediately) {
920 return 0; 915 return 0;
921 } 916 }
922 917
923 #endif // defined(OS_POSIX) 918 #endif // defined(OS_POSIX)
OLDNEW
« no previous file with comments | « base/metrics/stats_table_unittest.cc ('k') | base/test/multiprocess_test.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698