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 <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <limits> | 10 #include <limits> |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
153 return tmp_dir.value(); | 153 return tmp_dir.value(); |
154 #endif | 154 #endif |
155 } | 155 } |
156 | 156 |
157 MULTIPROCESS_TEST_MAIN(SimpleChildProcess) { | 157 MULTIPROCESS_TEST_MAIN(SimpleChildProcess) { |
158 return kSuccess; | 158 return kSuccess; |
159 } | 159 } |
160 | 160 |
161 // TODO(viettrungluu): This should be in a "MultiProcessTestTest". | 161 // TODO(viettrungluu): This should be in a "MultiProcessTestTest". |
162 TEST_F(ProcessUtilTest, SpawnChild) { | 162 TEST_F(ProcessUtilTest, SpawnChild) { |
163 base::Process process = SpawnChild("SimpleChildProcess"); | 163 base::SpawnChildResult spawn_result = SpawnChild("SimpleChildProcess"); |
| 164 base::Process process = std::move(spawn_result.process); |
164 ASSERT_TRUE(process.IsValid()); | 165 ASSERT_TRUE(process.IsValid()); |
165 int exit_code; | 166 int exit_code; |
166 EXPECT_TRUE(process.WaitForExitWithTimeout( | 167 EXPECT_TRUE(process.WaitForExitWithTimeout( |
167 TestTimeouts::action_max_timeout(), &exit_code)); | 168 TestTimeouts::action_max_timeout(), &exit_code)); |
168 } | 169 } |
169 | 170 |
170 MULTIPROCESS_TEST_MAIN(SlowChildProcess) { | 171 MULTIPROCESS_TEST_MAIN(SlowChildProcess) { |
171 WaitToDie(ProcessUtilTest::GetSignalFilePath(kSignalFileSlow).c_str()); | 172 WaitToDie(ProcessUtilTest::GetSignalFilePath(kSignalFileSlow).c_str()); |
172 return kSuccess; | 173 return kSuccess; |
173 } | 174 } |
174 | 175 |
175 TEST_F(ProcessUtilTest, KillSlowChild) { | 176 TEST_F(ProcessUtilTest, KillSlowChild) { |
176 const std::string signal_file = | 177 const std::string signal_file = |
177 ProcessUtilTest::GetSignalFilePath(kSignalFileSlow); | 178 ProcessUtilTest::GetSignalFilePath(kSignalFileSlow); |
178 remove(signal_file.c_str()); | 179 remove(signal_file.c_str()); |
179 base::Process process = SpawnChild("SlowChildProcess"); | 180 base::SpawnChildResult spawn_result = SpawnChild("SlowChildProcess"); |
| 181 base::Process process = std::move(spawn_result.process); |
180 ASSERT_TRUE(process.IsValid()); | 182 ASSERT_TRUE(process.IsValid()); |
181 SignalChildren(signal_file.c_str()); | 183 SignalChildren(signal_file.c_str()); |
182 int exit_code; | 184 int exit_code; |
183 EXPECT_TRUE(process.WaitForExitWithTimeout( | 185 EXPECT_TRUE(process.WaitForExitWithTimeout( |
184 TestTimeouts::action_max_timeout(), &exit_code)); | 186 TestTimeouts::action_max_timeout(), &exit_code)); |
185 remove(signal_file.c_str()); | 187 remove(signal_file.c_str()); |
186 } | 188 } |
187 | 189 |
188 // Times out on Linux and Win, flakes on other platforms, http://crbug.com/95058 | 190 // Times out on Linux and Win, flakes on other platforms, http://crbug.com/95058 |
189 TEST_F(ProcessUtilTest, DISABLED_GetTerminationStatusExit) { | 191 TEST_F(ProcessUtilTest, DISABLED_GetTerminationStatusExit) { |
190 const std::string signal_file = | 192 const std::string signal_file = |
191 ProcessUtilTest::GetSignalFilePath(kSignalFileSlow); | 193 ProcessUtilTest::GetSignalFilePath(kSignalFileSlow); |
192 remove(signal_file.c_str()); | 194 remove(signal_file.c_str()); |
193 base::Process process = SpawnChild("SlowChildProcess"); | 195 base::SpawnChildResult spawn_result = SpawnChild("SlowChildProcess"); |
| 196 base::Process process = std::move(spawn_result.process); |
194 ASSERT_TRUE(process.IsValid()); | 197 ASSERT_TRUE(process.IsValid()); |
195 | 198 |
196 int exit_code = 42; | 199 int exit_code = 42; |
197 EXPECT_EQ(base::TERMINATION_STATUS_STILL_RUNNING, | 200 EXPECT_EQ(base::TERMINATION_STATUS_STILL_RUNNING, |
198 base::GetTerminationStatus(process.Handle(), &exit_code)); | 201 base::GetTerminationStatus(process.Handle(), &exit_code)); |
199 EXPECT_EQ(kExpectedStillRunningExitCode, exit_code); | 202 EXPECT_EQ(kExpectedStillRunningExitCode, exit_code); |
200 | 203 |
201 SignalChildren(signal_file.c_str()); | 204 SignalChildren(signal_file.c_str()); |
202 exit_code = 42; | 205 exit_code = 42; |
203 base::TerminationStatus status = | 206 base::TerminationStatus status = |
(...skipping 24 matching lines...) Expand all Loading... |
228 | 231 |
229 TEST_F(ProcessUtilTest, CurrentDirectory) { | 232 TEST_F(ProcessUtilTest, CurrentDirectory) { |
230 // TODO(rickyz): Add support for passing arguments to multiprocess children, | 233 // TODO(rickyz): Add support for passing arguments to multiprocess children, |
231 // then create a special directory for this test. | 234 // then create a special directory for this test. |
232 base::FilePath tmp_dir; | 235 base::FilePath tmp_dir; |
233 ASSERT_TRUE(base::GetTempDir(&tmp_dir)); | 236 ASSERT_TRUE(base::GetTempDir(&tmp_dir)); |
234 | 237 |
235 base::LaunchOptions options; | 238 base::LaunchOptions options; |
236 options.current_directory = tmp_dir; | 239 options.current_directory = tmp_dir; |
237 | 240 |
238 base::Process process(SpawnChildWithOptions("CheckCwdProcess", options)); | 241 base::SpawnChildResult spawn_result = |
| 242 SpawnChildWithOptions("CheckCwdProcess", options); |
| 243 base::Process process = std::move(spawn_result.process); |
239 ASSERT_TRUE(process.IsValid()); | 244 ASSERT_TRUE(process.IsValid()); |
240 | 245 |
241 int exit_code = 42; | 246 int exit_code = 42; |
242 EXPECT_TRUE(process.WaitForExit(&exit_code)); | 247 EXPECT_TRUE(process.WaitForExit(&exit_code)); |
243 EXPECT_EQ(kSuccess, exit_code); | 248 EXPECT_EQ(kSuccess, exit_code); |
244 } | 249 } |
245 #endif // !defined(OS_ANDROID) | 250 #endif // !defined(OS_ANDROID) |
246 | 251 |
247 #if defined(OS_WIN) | 252 #if defined(OS_WIN) |
248 // TODO(cpu): figure out how to test this in other platforms. | 253 // TODO(cpu): figure out how to test this in other platforms. |
249 TEST_F(ProcessUtilTest, GetProcId) { | 254 TEST_F(ProcessUtilTest, GetProcId) { |
250 base::ProcessId id1 = base::GetProcId(GetCurrentProcess()); | 255 base::ProcessId id1 = base::GetProcId(GetCurrentProcess()); |
251 EXPECT_NE(0ul, id1); | 256 EXPECT_NE(0ul, id1); |
252 base::Process process = SpawnChild("SimpleChildProcess"); | 257 base::SpawnChildResult spawn_result = SpawnChild("SimpleChildProcess"); |
| 258 base::Process process = std::move(spawn_result.process); |
253 ASSERT_TRUE(process.IsValid()); | 259 ASSERT_TRUE(process.IsValid()); |
254 base::ProcessId id2 = process.Pid(); | 260 base::ProcessId id2 = process.Pid(); |
255 EXPECT_NE(0ul, id2); | 261 EXPECT_NE(0ul, id2); |
256 EXPECT_NE(id1, id2); | 262 EXPECT_NE(id1, id2); |
257 } | 263 } |
258 #endif // defined(OS_WIN) | 264 #endif // defined(OS_WIN) |
259 | 265 |
260 #if !defined(OS_MACOSX) && !defined(OS_ANDROID) | 266 #if !defined(OS_MACOSX) && !defined(OS_ANDROID) |
261 // This test is disabled on Mac, since it's flaky due to ReportCrash | 267 // This test is disabled on Mac, since it's flaky due to ReportCrash |
262 // taking a variable amount of time to parse and load the debug and | 268 // taking a variable amount of time to parse and load the debug and |
(...skipping 25 matching lines...) Expand all Loading... |
288 // AddressSanitizer. | 294 // AddressSanitizer. |
289 #if defined(ADDRESS_SANITIZER) || defined(SYZYASAN) | 295 #if defined(ADDRESS_SANITIZER) || defined(SYZYASAN) |
290 #define MAYBE_GetTerminationStatusCrash DISABLED_GetTerminationStatusCrash | 296 #define MAYBE_GetTerminationStatusCrash DISABLED_GetTerminationStatusCrash |
291 #else | 297 #else |
292 #define MAYBE_GetTerminationStatusCrash GetTerminationStatusCrash | 298 #define MAYBE_GetTerminationStatusCrash GetTerminationStatusCrash |
293 #endif | 299 #endif |
294 TEST_F(ProcessUtilTest, MAYBE_GetTerminationStatusCrash) { | 300 TEST_F(ProcessUtilTest, MAYBE_GetTerminationStatusCrash) { |
295 const std::string signal_file = | 301 const std::string signal_file = |
296 ProcessUtilTest::GetSignalFilePath(kSignalFileCrash); | 302 ProcessUtilTest::GetSignalFilePath(kSignalFileCrash); |
297 remove(signal_file.c_str()); | 303 remove(signal_file.c_str()); |
298 base::Process process = SpawnChild("CrashingChildProcess"); | 304 base::SpawnChildResult spawn_result = SpawnChild("CrashingChildProcess"); |
| 305 base::Process process = std::move(spawn_result.process); |
299 ASSERT_TRUE(process.IsValid()); | 306 ASSERT_TRUE(process.IsValid()); |
300 | 307 |
301 int exit_code = 42; | 308 int exit_code = 42; |
302 EXPECT_EQ(base::TERMINATION_STATUS_STILL_RUNNING, | 309 EXPECT_EQ(base::TERMINATION_STATUS_STILL_RUNNING, |
303 base::GetTerminationStatus(process.Handle(), &exit_code)); | 310 base::GetTerminationStatus(process.Handle(), &exit_code)); |
304 EXPECT_EQ(kExpectedStillRunningExitCode, exit_code); | 311 EXPECT_EQ(kExpectedStillRunningExitCode, exit_code); |
305 | 312 |
306 SignalChildren(signal_file.c_str()); | 313 SignalChildren(signal_file.c_str()); |
307 exit_code = 42; | 314 exit_code = 42; |
308 base::TerminationStatus status = | 315 base::TerminationStatus status = |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
343 // Send a SIGTERM to this process. | 350 // Send a SIGTERM to this process. |
344 ::kill(getpid(), SIGTERM); | 351 ::kill(getpid(), SIGTERM); |
345 return 1; | 352 return 1; |
346 } | 353 } |
347 #endif // defined(OS_POSIX) | 354 #endif // defined(OS_POSIX) |
348 | 355 |
349 TEST_F(ProcessUtilTest, GetTerminationStatusSigKill) { | 356 TEST_F(ProcessUtilTest, GetTerminationStatusSigKill) { |
350 const std::string signal_file = | 357 const std::string signal_file = |
351 ProcessUtilTest::GetSignalFilePath(kSignalFileKill); | 358 ProcessUtilTest::GetSignalFilePath(kSignalFileKill); |
352 remove(signal_file.c_str()); | 359 remove(signal_file.c_str()); |
353 base::Process process = SpawnChild("KilledChildProcess"); | 360 base::SpawnChildResult spawn_result = SpawnChild("KilledChildProcess"); |
| 361 base::Process process = std::move(spawn_result.process); |
354 ASSERT_TRUE(process.IsValid()); | 362 ASSERT_TRUE(process.IsValid()); |
355 | 363 |
356 int exit_code = 42; | 364 int exit_code = 42; |
357 EXPECT_EQ(base::TERMINATION_STATUS_STILL_RUNNING, | 365 EXPECT_EQ(base::TERMINATION_STATUS_STILL_RUNNING, |
358 base::GetTerminationStatus(process.Handle(), &exit_code)); | 366 base::GetTerminationStatus(process.Handle(), &exit_code)); |
359 EXPECT_EQ(kExpectedStillRunningExitCode, exit_code); | 367 EXPECT_EQ(kExpectedStillRunningExitCode, exit_code); |
360 | 368 |
361 SignalChildren(signal_file.c_str()); | 369 SignalChildren(signal_file.c_str()); |
362 exit_code = 42; | 370 exit_code = 42; |
363 base::TerminationStatus status = | 371 base::TerminationStatus status = |
(...skipping 13 matching lines...) Expand all Loading... |
377 EXPECT_EQ(SIGKILL, signal); | 385 EXPECT_EQ(SIGKILL, signal); |
378 #endif | 386 #endif |
379 remove(signal_file.c_str()); | 387 remove(signal_file.c_str()); |
380 } | 388 } |
381 | 389 |
382 #if defined(OS_POSIX) | 390 #if defined(OS_POSIX) |
383 TEST_F(ProcessUtilTest, GetTerminationStatusSigTerm) { | 391 TEST_F(ProcessUtilTest, GetTerminationStatusSigTerm) { |
384 const std::string signal_file = | 392 const std::string signal_file = |
385 ProcessUtilTest::GetSignalFilePath(kSignalFileTerm); | 393 ProcessUtilTest::GetSignalFilePath(kSignalFileTerm); |
386 remove(signal_file.c_str()); | 394 remove(signal_file.c_str()); |
387 base::Process process = SpawnChild("TerminatedChildProcess"); | 395 base::SpawnChildResult spawn_result = SpawnChild("TerminatedChildProcess"); |
| 396 base::Process process = std::move(spawn_result.process); |
388 ASSERT_TRUE(process.IsValid()); | 397 ASSERT_TRUE(process.IsValid()); |
389 | 398 |
390 int exit_code = 42; | 399 int exit_code = 42; |
391 EXPECT_EQ(base::TERMINATION_STATUS_STILL_RUNNING, | 400 EXPECT_EQ(base::TERMINATION_STATUS_STILL_RUNNING, |
392 base::GetTerminationStatus(process.Handle(), &exit_code)); | 401 base::GetTerminationStatus(process.Handle(), &exit_code)); |
393 EXPECT_EQ(kExpectedStillRunningExitCode, exit_code); | 402 EXPECT_EQ(kExpectedStillRunningExitCode, exit_code); |
394 | 403 |
395 SignalChildren(signal_file.c_str()); | 404 SignalChildren(signal_file.c_str()); |
396 exit_code = 42; | 405 exit_code = 42; |
397 base::TerminationStatus status = | 406 base::TerminationStatus status = |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
620 | 629 |
621 int ProcessUtilTest::CountOpenFDsInChild() { | 630 int ProcessUtilTest::CountOpenFDsInChild() { |
622 int fds[2]; | 631 int fds[2]; |
623 if (pipe(fds) < 0) | 632 if (pipe(fds) < 0) |
624 NOTREACHED(); | 633 NOTREACHED(); |
625 | 634 |
626 base::FileHandleMappingVector fd_mapping_vec; | 635 base::FileHandleMappingVector fd_mapping_vec; |
627 fd_mapping_vec.push_back(std::pair<int, int>(fds[1], kChildPipe)); | 636 fd_mapping_vec.push_back(std::pair<int, int>(fds[1], kChildPipe)); |
628 base::LaunchOptions options; | 637 base::LaunchOptions options; |
629 options.fds_to_remap = &fd_mapping_vec; | 638 options.fds_to_remap = &fd_mapping_vec; |
630 base::Process process = | 639 base::SpawnChildResult spawn_result = |
631 SpawnChildWithOptions("ProcessUtilsLeakFDChildProcess", options); | 640 SpawnChildWithOptions("ProcessUtilsLeakFDChildProcess", options); |
| 641 base::Process process = std::move(spawn_result.process); |
632 CHECK(process.IsValid()); | 642 CHECK(process.IsValid()); |
633 int ret = IGNORE_EINTR(close(fds[1])); | 643 int ret = IGNORE_EINTR(close(fds[1])); |
634 DPCHECK(ret == 0); | 644 DPCHECK(ret == 0); |
635 | 645 |
636 // Read number of open files in client process from pipe; | 646 // Read number of open files in client process from pipe; |
637 int num_open_files = -1; | 647 int num_open_files = -1; |
638 ssize_t bytes_read = | 648 ssize_t bytes_read = |
639 HANDLE_EINTR(read(fds[0], &num_open_files, sizeof(num_open_files))); | 649 HANDLE_EINTR(read(fds[0], &num_open_files, sizeof(num_open_files))); |
640 CHECK_EQ(bytes_read, static_cast<ssize_t>(sizeof(num_open_files))); | 650 CHECK_EQ(bytes_read, static_cast<ssize_t>(sizeof(num_open_files))); |
641 | 651 |
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
862 // TODO(port): port those unit tests. | 872 // TODO(port): port those unit tests. |
863 bool IsProcessDead(base::ProcessHandle child) { | 873 bool IsProcessDead(base::ProcessHandle child) { |
864 // waitpid() will actually reap the process which is exactly NOT what we | 874 // waitpid() will actually reap the process which is exactly NOT what we |
865 // want to test for. The good thing is that if it can't find the process | 875 // want to test for. The good thing is that if it can't find the process |
866 // we'll get a nice value for errno which we can test for. | 876 // we'll get a nice value for errno which we can test for. |
867 const pid_t result = HANDLE_EINTR(waitpid(child, NULL, WNOHANG)); | 877 const pid_t result = HANDLE_EINTR(waitpid(child, NULL, WNOHANG)); |
868 return result == -1 && errno == ECHILD; | 878 return result == -1 && errno == ECHILD; |
869 } | 879 } |
870 | 880 |
871 TEST_F(ProcessUtilTest, DelayedTermination) { | 881 TEST_F(ProcessUtilTest, DelayedTermination) { |
872 base::Process child_process = SpawnChild("process_util_test_never_die"); | 882 base::SpawnChildResult spawn_result = |
| 883 SpawnChild("process_util_test_never_die"); |
| 884 base::Process child_process = std::move(spawn_result.process); |
873 ASSERT_TRUE(child_process.IsValid()); | 885 ASSERT_TRUE(child_process.IsValid()); |
874 base::EnsureProcessTerminated(child_process.Duplicate()); | 886 base::EnsureProcessTerminated(child_process.Duplicate()); |
875 int exit_code; | 887 int exit_code; |
876 child_process.WaitForExitWithTimeout(base::TimeDelta::FromSeconds(5), | 888 child_process.WaitForExitWithTimeout(base::TimeDelta::FromSeconds(5), |
877 &exit_code); | 889 &exit_code); |
878 | 890 |
879 // Check that process was really killed. | 891 // Check that process was really killed. |
880 EXPECT_TRUE(IsProcessDead(child_process.Handle())); | 892 EXPECT_TRUE(IsProcessDead(child_process.Handle())); |
881 } | 893 } |
882 | 894 |
883 MULTIPROCESS_TEST_MAIN(process_util_test_never_die) { | 895 MULTIPROCESS_TEST_MAIN(process_util_test_never_die) { |
884 while (1) { | 896 while (1) { |
885 sleep(500); | 897 sleep(500); |
886 } | 898 } |
887 return kSuccess; | 899 return kSuccess; |
888 } | 900 } |
889 | 901 |
890 TEST_F(ProcessUtilTest, ImmediateTermination) { | 902 TEST_F(ProcessUtilTest, ImmediateTermination) { |
891 base::Process child_process = SpawnChild("process_util_test_die_immediately"); | 903 base::SpawnChildResult spawn_result = |
| 904 SpawnChild("process_util_test_die_immediately"); |
| 905 base::Process child_process = std::move(spawn_result.process); |
892 ASSERT_TRUE(child_process.IsValid()); | 906 ASSERT_TRUE(child_process.IsValid()); |
893 // Give it time to die. | 907 // Give it time to die. |
894 sleep(2); | 908 sleep(2); |
895 base::EnsureProcessTerminated(child_process.Duplicate()); | 909 base::EnsureProcessTerminated(child_process.Duplicate()); |
896 | 910 |
897 // Check that process was really killed. | 911 // Check that process was really killed. |
898 EXPECT_TRUE(IsProcessDead(child_process.Handle())); | 912 EXPECT_TRUE(IsProcessDead(child_process.Handle())); |
899 } | 913 } |
900 | 914 |
901 MULTIPROCESS_TEST_MAIN(process_util_test_die_immediately) { | 915 MULTIPROCESS_TEST_MAIN(process_util_test_die_immediately) { |
(...skipping 25 matching lines...) Expand all Loading... |
927 | 941 |
928 base::ScopedFD read_fd(pipe_fds[0]); | 942 base::ScopedFD read_fd(pipe_fds[0]); |
929 base::ScopedFD write_fd(pipe_fds[1]); | 943 base::ScopedFD write_fd(pipe_fds[1]); |
930 base::FileHandleMappingVector fds_to_remap; | 944 base::FileHandleMappingVector fds_to_remap; |
931 fds_to_remap.push_back(std::make_pair(read_fd.get(), read_fd.get())); | 945 fds_to_remap.push_back(std::make_pair(read_fd.get(), read_fd.get())); |
932 | 946 |
933 ReadFromPipeDelegate read_from_pipe_delegate(read_fd.get()); | 947 ReadFromPipeDelegate read_from_pipe_delegate(read_fd.get()); |
934 base::LaunchOptions options; | 948 base::LaunchOptions options; |
935 options.fds_to_remap = &fds_to_remap; | 949 options.fds_to_remap = &fds_to_remap; |
936 options.pre_exec_delegate = &read_from_pipe_delegate; | 950 options.pre_exec_delegate = &read_from_pipe_delegate; |
937 base::Process process(SpawnChildWithOptions("SimpleChildProcess", options)); | 951 base::SpawnChildResult spawn_result = |
| 952 SpawnChildWithOptions("SimpleChildProcess", options); |
| 953 base::Process process(std::move(spawn_result.process)); |
938 ASSERT_TRUE(process.IsValid()); | 954 ASSERT_TRUE(process.IsValid()); |
939 | 955 |
940 read_fd.reset(); | 956 read_fd.reset(); |
941 ASSERT_EQ(1, HANDLE_EINTR(write(write_fd.get(), &kPipeValue, 1))); | 957 ASSERT_EQ(1, HANDLE_EINTR(write(write_fd.get(), &kPipeValue, 1))); |
942 | 958 |
943 int exit_code = 42; | 959 int exit_code = 42; |
944 EXPECT_TRUE(process.WaitForExit(&exit_code)); | 960 EXPECT_TRUE(process.WaitForExit(&exit_code)); |
945 EXPECT_EQ(0, exit_code); | 961 EXPECT_EQ(0, exit_code); |
946 } | 962 } |
947 #endif // !defined(OS_ANDROID) | 963 #endif // !defined(OS_ANDROID) |
(...skipping 14 matching lines...) Expand all Loading... |
962 if (RunningOnValgrind() || | 978 if (RunningOnValgrind() || |
963 !base::PathExists(FilePath("/proc/self/ns/user")) || | 979 !base::PathExists(FilePath("/proc/self/ns/user")) || |
964 !base::PathExists(FilePath("/proc/self/ns/pid"))) { | 980 !base::PathExists(FilePath("/proc/self/ns/pid"))) { |
965 // User or PID namespaces are not supported. | 981 // User or PID namespaces are not supported. |
966 return; | 982 return; |
967 } | 983 } |
968 | 984 |
969 base::LaunchOptions options; | 985 base::LaunchOptions options; |
970 options.clone_flags = CLONE_NEWUSER | CLONE_NEWPID; | 986 options.clone_flags = CLONE_NEWUSER | CLONE_NEWPID; |
971 | 987 |
972 base::Process process(SpawnChildWithOptions("CheckPidProcess", options)); | 988 base::SpawnChildResult spawn_result = |
| 989 SpawnChildWithOptions("CheckPidProcess", options); |
| 990 base::Process process = std::move(spawn_result.process); |
973 ASSERT_TRUE(process.IsValid()); | 991 ASSERT_TRUE(process.IsValid()); |
974 | 992 |
975 int exit_code = 42; | 993 int exit_code = 42; |
976 EXPECT_TRUE(process.WaitForExit(&exit_code)); | 994 EXPECT_TRUE(process.WaitForExit(&exit_code)); |
977 EXPECT_EQ(kSuccess, exit_code); | 995 EXPECT_EQ(kSuccess, exit_code); |
978 } | 996 } |
979 #endif // defined(CLONE_NEWUSER) && defined(CLONE_NEWPID) | 997 #endif // defined(CLONE_NEWUSER) && defined(CLONE_NEWPID) |
980 | 998 |
981 TEST(ForkWithFlagsTest, UpdatesPidCache) { | 999 TEST(ForkWithFlagsTest, UpdatesPidCache) { |
982 // The libc clone function, which allows ForkWithFlags to keep the pid cache | 1000 // The libc clone function, which allows ForkWithFlags to keep the pid cache |
(...skipping 20 matching lines...) Expand all Loading... |
1003 int status = 42; | 1021 int status = 42; |
1004 ASSERT_EQ(pid, HANDLE_EINTR(waitpid(pid, &status, 0))); | 1022 ASSERT_EQ(pid, HANDLE_EINTR(waitpid(pid, &status, 0))); |
1005 ASSERT_TRUE(WIFEXITED(status)); | 1023 ASSERT_TRUE(WIFEXITED(status)); |
1006 EXPECT_EQ(kSuccess, WEXITSTATUS(status)); | 1024 EXPECT_EQ(kSuccess, WEXITSTATUS(status)); |
1007 } | 1025 } |
1008 | 1026 |
1009 TEST_F(ProcessUtilTest, InvalidCurrentDirectory) { | 1027 TEST_F(ProcessUtilTest, InvalidCurrentDirectory) { |
1010 base::LaunchOptions options; | 1028 base::LaunchOptions options; |
1011 options.current_directory = base::FilePath("/dev/null"); | 1029 options.current_directory = base::FilePath("/dev/null"); |
1012 | 1030 |
1013 base::Process process(SpawnChildWithOptions("SimpleChildProcess", options)); | 1031 base::SpawnChildResult spawn_result = |
| 1032 SpawnChildWithOptions("SimpleChildProcess", options); |
| 1033 base::Process process = std::move(spawn_result.process); |
1014 ASSERT_TRUE(process.IsValid()); | 1034 ASSERT_TRUE(process.IsValid()); |
1015 | 1035 |
1016 int exit_code = kSuccess; | 1036 int exit_code = kSuccess; |
1017 EXPECT_TRUE(process.WaitForExit(&exit_code)); | 1037 EXPECT_TRUE(process.WaitForExit(&exit_code)); |
1018 EXPECT_NE(kSuccess, exit_code); | 1038 EXPECT_NE(kSuccess, exit_code); |
1019 } | 1039 } |
1020 #endif // defined(OS_LINUX) | 1040 #endif // defined(OS_LINUX) |
OLD | NEW |