| 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 346 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 357   std::string message; | 357   std::string message; | 
| 358   for (int i = 0; i < 1025; i++) {  // 1025 so it does not end on a kilo-byte | 358   for (int i = 0; i < 1025; i++) {  // 1025 so it does not end on a kilo-byte | 
| 359                                     // boundary. | 359                                     // boundary. | 
| 360     message += "Hello!"; | 360     message += "Hello!"; | 
| 361   } | 361   } | 
| 362   // cmd.exe's echo always adds a \r\n to its output. | 362   // cmd.exe's echo always adds a \r\n to its output. | 
| 363   std::string expected(message); | 363   std::string expected(message); | 
| 364   expected += "\r\n"; | 364   expected += "\r\n"; | 
| 365 | 365 | 
| 366   FilePath cmd(L"cmd.exe"); | 366   FilePath cmd(L"cmd.exe"); | 
| 367   CommandLine cmd_line(cmd); | 367   base::CommandLine cmd_line(cmd); | 
| 368   cmd_line.AppendArg("/c"); | 368   cmd_line.AppendArg("/c"); | 
| 369   cmd_line.AppendArg("echo " + message + ""); | 369   cmd_line.AppendArg("echo " + message + ""); | 
| 370   std::string output; | 370   std::string output; | 
| 371   ASSERT_TRUE(base::GetAppOutput(cmd_line, &output)); | 371   ASSERT_TRUE(base::GetAppOutput(cmd_line, &output)); | 
| 372   EXPECT_EQ(expected, output); | 372   EXPECT_EQ(expected, output); | 
| 373 | 373 | 
| 374   // Let's make sure stderr is ignored. | 374   // Let's make sure stderr is ignored. | 
| 375   CommandLine other_cmd_line(cmd); | 375   base::CommandLine other_cmd_line(cmd); | 
| 376   other_cmd_line.AppendArg("/c"); | 376   other_cmd_line.AppendArg("/c"); | 
| 377   // http://msdn.microsoft.com/library/cc772622.aspx | 377   // http://msdn.microsoft.com/library/cc772622.aspx | 
| 378   cmd_line.AppendArg("echo " + message + " >&2"); | 378   cmd_line.AppendArg("echo " + message + " >&2"); | 
| 379   output.clear(); | 379   output.clear(); | 
| 380   ASSERT_TRUE(base::GetAppOutput(other_cmd_line, &output)); | 380   ASSERT_TRUE(base::GetAppOutput(other_cmd_line, &output)); | 
| 381   EXPECT_EQ("", output); | 381   EXPECT_EQ("", output); | 
| 382 } | 382 } | 
| 383 | 383 | 
| 384 // TODO(estade): if possible, port this test. | 384 // TODO(estade): if possible, port this test. | 
| 385 TEST_F(ProcessUtilTest, LaunchAsUser) { | 385 TEST_F(ProcessUtilTest, LaunchAsUser) { | 
| 386   base::UserTokenHandle token; | 386   base::UserTokenHandle token; | 
| 387   ASSERT_TRUE(OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &token)); | 387   ASSERT_TRUE(OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &token)); | 
| 388   base::LaunchOptions options; | 388   base::LaunchOptions options; | 
| 389   options.as_user = token; | 389   options.as_user = token; | 
| 390   EXPECT_TRUE(base::LaunchProcess(MakeCmdLine("SimpleChildProcess"), options, | 390   EXPECT_TRUE(base::LaunchProcess(MakeCmdLine("SimpleChildProcess"), options, | 
| 391                                   NULL)); | 391                                   NULL)); | 
| 392 } | 392 } | 
| 393 | 393 | 
| 394 static const char kEventToTriggerHandleSwitch[] = "event-to-trigger-handle"; | 394 static const char kEventToTriggerHandleSwitch[] = "event-to-trigger-handle"; | 
| 395 | 395 | 
| 396 MULTIPROCESS_TEST_MAIN(TriggerEventChildProcess) { | 396 MULTIPROCESS_TEST_MAIN(TriggerEventChildProcess) { | 
| 397   std::string handle_value_string = | 397   std::string handle_value_string = | 
| 398       CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | 398       base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | 
| 399           kEventToTriggerHandleSwitch); | 399           kEventToTriggerHandleSwitch); | 
| 400   CHECK(!handle_value_string.empty()); | 400   CHECK(!handle_value_string.empty()); | 
| 401 | 401 | 
| 402   uint64 handle_value_uint64; | 402   uint64 handle_value_uint64; | 
| 403   CHECK(base::StringToUint64(handle_value_string, &handle_value_uint64)); | 403   CHECK(base::StringToUint64(handle_value_string, &handle_value_uint64)); | 
| 404   // Give ownership of the handle to |event|. | 404   // Give ownership of the handle to |event|. | 
| 405   base::WaitableEvent event(reinterpret_cast<HANDLE>(handle_value_uint64)); | 405   base::WaitableEvent event(reinterpret_cast<HANDLE>(handle_value_uint64)); | 
| 406 | 406 | 
| 407   event.Signal(); | 407   event.Signal(); | 
| 408 | 408 | 
| 409   return 0; | 409   return 0; | 
| 410 } | 410 } | 
| 411 | 411 | 
| 412 TEST_F(ProcessUtilTest, InheritSpecifiedHandles) { | 412 TEST_F(ProcessUtilTest, InheritSpecifiedHandles) { | 
| 413   // Manually create the event, so that it can be inheritable. | 413   // Manually create the event, so that it can be inheritable. | 
| 414   SECURITY_ATTRIBUTES security_attributes = {}; | 414   SECURITY_ATTRIBUTES security_attributes = {}; | 
| 415   security_attributes.nLength = static_cast<DWORD>(sizeof(security_attributes)); | 415   security_attributes.nLength = static_cast<DWORD>(sizeof(security_attributes)); | 
| 416   security_attributes.lpSecurityDescriptor = NULL; | 416   security_attributes.lpSecurityDescriptor = NULL; | 
| 417   security_attributes.bInheritHandle = true; | 417   security_attributes.bInheritHandle = true; | 
| 418 | 418 | 
| 419   // Takes ownership of the event handle. | 419   // Takes ownership of the event handle. | 
| 420   base::WaitableEvent event( | 420   base::WaitableEvent event( | 
| 421       CreateEvent(&security_attributes, true, false, NULL)); | 421       CreateEvent(&security_attributes, true, false, NULL)); | 
| 422   base::HandlesToInheritVector handles_to_inherit; | 422   base::HandlesToInheritVector handles_to_inherit; | 
| 423   handles_to_inherit.push_back(event.handle()); | 423   handles_to_inherit.push_back(event.handle()); | 
| 424   base::LaunchOptions options; | 424   base::LaunchOptions options; | 
| 425   options.handles_to_inherit = &handles_to_inherit; | 425   options.handles_to_inherit = &handles_to_inherit; | 
| 426 | 426 | 
| 427   CommandLine cmd_line = MakeCmdLine("TriggerEventChildProcess"); | 427   base::CommandLine cmd_line = MakeCmdLine("TriggerEventChildProcess"); | 
| 428   cmd_line.AppendSwitchASCII(kEventToTriggerHandleSwitch, | 428   cmd_line.AppendSwitchASCII(kEventToTriggerHandleSwitch, | 
| 429       base::Uint64ToString(reinterpret_cast<uint64>(event.handle()))); | 429       base::Uint64ToString(reinterpret_cast<uint64>(event.handle()))); | 
| 430 | 430 | 
| 431   // This functionality actually requires Vista or later. Make sure that it | 431   // This functionality actually requires Vista or later. Make sure that it | 
| 432   // fails properly on XP. | 432   // fails properly on XP. | 
| 433   if (base::win::GetVersion() < base::win::VERSION_VISTA) { | 433   if (base::win::GetVersion() < base::win::VERSION_VISTA) { | 
| 434     EXPECT_FALSE(base::LaunchProcess(cmd_line, options, NULL)); | 434     EXPECT_FALSE(base::LaunchProcess(cmd_line, options, NULL)); | 
| 435     return; | 435     return; | 
| 436   } | 436   } | 
| 437 | 437 | 
| (...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 742 | 742 | 
| 743 TEST_F(ProcessUtilTest, GetAppOutput) { | 743 TEST_F(ProcessUtilTest, GetAppOutput) { | 
| 744   std::string output; | 744   std::string output; | 
| 745 | 745 | 
| 746 #if defined(OS_ANDROID) | 746 #if defined(OS_ANDROID) | 
| 747   std::vector<std::string> argv; | 747   std::vector<std::string> argv; | 
| 748   argv.push_back("sh");  // Instead of /bin/sh, force path search to find it. | 748   argv.push_back("sh");  // Instead of /bin/sh, force path search to find it. | 
| 749   argv.push_back("-c"); | 749   argv.push_back("-c"); | 
| 750 | 750 | 
| 751   argv.push_back("exit 0"); | 751   argv.push_back("exit 0"); | 
| 752   EXPECT_TRUE(base::GetAppOutput(CommandLine(argv), &output)); | 752   EXPECT_TRUE(base::GetAppOutput(base::CommandLine(argv), &output)); | 
| 753   EXPECT_STREQ("", output.c_str()); | 753   EXPECT_STREQ("", output.c_str()); | 
| 754 | 754 | 
| 755   argv[2] = "exit 1"; | 755   argv[2] = "exit 1"; | 
| 756   EXPECT_FALSE(base::GetAppOutput(CommandLine(argv), &output)); | 756   EXPECT_FALSE(base::GetAppOutput(base::CommandLine(argv), &output)); | 
| 757   EXPECT_STREQ("", output.c_str()); | 757   EXPECT_STREQ("", output.c_str()); | 
| 758 | 758 | 
| 759   argv[2] = "echo foobar42"; | 759   argv[2] = "echo foobar42"; | 
| 760   EXPECT_TRUE(base::GetAppOutput(CommandLine(argv), &output)); | 760   EXPECT_TRUE(base::GetAppOutput(base::CommandLine(argv), &output)); | 
| 761   EXPECT_STREQ("foobar42\n", output.c_str()); | 761   EXPECT_STREQ("foobar42\n", output.c_str()); | 
| 762 #else | 762 #else | 
| 763   EXPECT_TRUE(base::GetAppOutput(CommandLine(FilePath("true")), &output)); | 763   EXPECT_TRUE(base::GetAppOutput(base::CommandLine(FilePath("true")), | 
|  | 764                                  &output)); | 
| 764   EXPECT_STREQ("", output.c_str()); | 765   EXPECT_STREQ("", output.c_str()); | 
| 765 | 766 | 
| 766   EXPECT_FALSE(base::GetAppOutput(CommandLine(FilePath("false")), &output)); | 767   EXPECT_FALSE(base::GetAppOutput(base::CommandLine(FilePath("false")), | 
|  | 768                                   &output)); | 
| 767 | 769 | 
| 768   std::vector<std::string> argv; | 770   std::vector<std::string> argv; | 
| 769   argv.push_back("/bin/echo"); | 771   argv.push_back("/bin/echo"); | 
| 770   argv.push_back("-n"); | 772   argv.push_back("-n"); | 
| 771   argv.push_back("foobar42"); | 773   argv.push_back("foobar42"); | 
| 772   EXPECT_TRUE(base::GetAppOutput(CommandLine(argv), &output)); | 774   EXPECT_TRUE(base::GetAppOutput(base::CommandLine(argv), &output)); | 
| 773   EXPECT_STREQ("foobar42", output.c_str()); | 775   EXPECT_STREQ("foobar42", output.c_str()); | 
| 774 #endif  // defined(OS_ANDROID) | 776 #endif  // defined(OS_ANDROID) | 
| 775 } | 777 } | 
| 776 | 778 | 
| 777 // Flakes on Android, crbug.com/375840 | 779 // Flakes on Android, crbug.com/375840 | 
| 778 #if defined(OS_ANDROID) | 780 #if defined(OS_ANDROID) | 
| 779 #define MAYBE_GetAppOutputRestricted DISABLED_GetAppOutputRestricted | 781 #define MAYBE_GetAppOutputRestricted DISABLED_GetAppOutputRestricted | 
| 780 #else | 782 #else | 
| 781 #define MAYBE_GetAppOutputRestricted GetAppOutputRestricted | 783 #define MAYBE_GetAppOutputRestricted GetAppOutputRestricted | 
| 782 #endif | 784 #endif | 
| 783 TEST_F(ProcessUtilTest, MAYBE_GetAppOutputRestricted) { | 785 TEST_F(ProcessUtilTest, MAYBE_GetAppOutputRestricted) { | 
| 784   // Unfortunately, since we can't rely on the path, we need to know where | 786   // Unfortunately, since we can't rely on the path, we need to know where | 
| 785   // everything is. So let's use /bin/sh, which is on every POSIX system, and | 787   // everything is. So let's use /bin/sh, which is on every POSIX system, and | 
| 786   // its built-ins. | 788   // its built-ins. | 
| 787   std::vector<std::string> argv; | 789   std::vector<std::string> argv; | 
| 788   argv.push_back(std::string(kShellPath));  // argv[0] | 790   argv.push_back(std::string(kShellPath));  // argv[0] | 
| 789   argv.push_back("-c");  // argv[1] | 791   argv.push_back("-c");  // argv[1] | 
| 790 | 792 | 
| 791   // On success, should set |output|. We use |/bin/sh -c 'exit 0'| instead of | 793   // On success, should set |output|. We use |/bin/sh -c 'exit 0'| instead of | 
| 792   // |true| since the location of the latter may be |/bin| or |/usr/bin| (and we | 794   // |true| since the location of the latter may be |/bin| or |/usr/bin| (and we | 
| 793   // need absolute paths). | 795   // need absolute paths). | 
| 794   argv.push_back("exit 0");   // argv[2]; equivalent to "true" | 796   argv.push_back("exit 0");   // argv[2]; equivalent to "true" | 
| 795   std::string output = "abc"; | 797   std::string output = "abc"; | 
| 796   EXPECT_TRUE(base::GetAppOutputRestricted(CommandLine(argv), &output, 100)); | 798   EXPECT_TRUE(base::GetAppOutputRestricted(base::CommandLine(argv), &output, | 
|  | 799                                            100)); | 
| 797   EXPECT_STREQ("", output.c_str()); | 800   EXPECT_STREQ("", output.c_str()); | 
| 798 | 801 | 
| 799   argv[2] = "exit 1";  // equivalent to "false" | 802   argv[2] = "exit 1";  // equivalent to "false" | 
| 800   output = "before"; | 803   output = "before"; | 
| 801   EXPECT_FALSE(base::GetAppOutputRestricted(CommandLine(argv), | 804   EXPECT_FALSE(base::GetAppOutputRestricted(base::CommandLine(argv), &output, | 
| 802                                             &output, 100)); | 805                                             100)); | 
| 803   EXPECT_STREQ("", output.c_str()); | 806   EXPECT_STREQ("", output.c_str()); | 
| 804 | 807 | 
| 805   // Amount of output exactly equal to space allowed. | 808   // Amount of output exactly equal to space allowed. | 
| 806   argv[2] = "echo 123456789";  // (the sh built-in doesn't take "-n") | 809   argv[2] = "echo 123456789";  // (the sh built-in doesn't take "-n") | 
| 807   output.clear(); | 810   output.clear(); | 
| 808   EXPECT_TRUE(base::GetAppOutputRestricted(CommandLine(argv), &output, 10)); | 811   EXPECT_TRUE(base::GetAppOutputRestricted(base::CommandLine(argv), &output, | 
|  | 812                                            10)); | 
| 809   EXPECT_STREQ("123456789\n", output.c_str()); | 813   EXPECT_STREQ("123456789\n", output.c_str()); | 
| 810 | 814 | 
| 811   // Amount of output greater than space allowed. | 815   // Amount of output greater than space allowed. | 
| 812   output.clear(); | 816   output.clear(); | 
| 813   EXPECT_TRUE(base::GetAppOutputRestricted(CommandLine(argv), &output, 5)); | 817   EXPECT_TRUE(base::GetAppOutputRestricted(base::CommandLine(argv), &output, | 
|  | 818                                            5)); | 
| 814   EXPECT_STREQ("12345", output.c_str()); | 819   EXPECT_STREQ("12345", output.c_str()); | 
| 815 | 820 | 
| 816   // Amount of output less than space allowed. | 821   // Amount of output less than space allowed. | 
| 817   output.clear(); | 822   output.clear(); | 
| 818   EXPECT_TRUE(base::GetAppOutputRestricted(CommandLine(argv), &output, 15)); | 823   EXPECT_TRUE(base::GetAppOutputRestricted(base::CommandLine(argv), &output, | 
|  | 824                                            15)); | 
| 819   EXPECT_STREQ("123456789\n", output.c_str()); | 825   EXPECT_STREQ("123456789\n", output.c_str()); | 
| 820 | 826 | 
| 821   // Zero space allowed. | 827   // Zero space allowed. | 
| 822   output = "abc"; | 828   output = "abc"; | 
| 823   EXPECT_TRUE(base::GetAppOutputRestricted(CommandLine(argv), &output, 0)); | 829   EXPECT_TRUE(base::GetAppOutputRestricted(base::CommandLine(argv), &output, | 
|  | 830                                            0)); | 
| 824   EXPECT_STREQ("", output.c_str()); | 831   EXPECT_STREQ("", output.c_str()); | 
| 825 } | 832 } | 
| 826 | 833 | 
| 827 #if !defined(OS_MACOSX) && !defined(OS_OPENBSD) | 834 #if !defined(OS_MACOSX) && !defined(OS_OPENBSD) | 
| 828 // TODO(benwells): GetAppOutputRestricted should terminate applications | 835 // TODO(benwells): GetAppOutputRestricted should terminate applications | 
| 829 // with SIGPIPE when we have enough output. http://crbug.com/88502 | 836 // with SIGPIPE when we have enough output. http://crbug.com/88502 | 
| 830 TEST_F(ProcessUtilTest, GetAppOutputRestrictedSIGPIPE) { | 837 TEST_F(ProcessUtilTest, GetAppOutputRestrictedSIGPIPE) { | 
| 831   std::vector<std::string> argv; | 838   std::vector<std::string> argv; | 
| 832   std::string output; | 839   std::string output; | 
| 833 | 840 | 
| 834   argv.push_back(std::string(kShellPath));  // argv[0] | 841   argv.push_back(std::string(kShellPath));  // argv[0] | 
| 835   argv.push_back("-c"); | 842   argv.push_back("-c"); | 
| 836 #if defined(OS_ANDROID) | 843 #if defined(OS_ANDROID) | 
| 837   argv.push_back("while echo 12345678901234567890; do :; done"); | 844   argv.push_back("while echo 12345678901234567890; do :; done"); | 
| 838   EXPECT_TRUE(base::GetAppOutputRestricted(CommandLine(argv), &output, 10)); | 845   EXPECT_TRUE(base::GetAppOutputRestricted(base::CommandLine(argv), &output, | 
|  | 846                                            10)); | 
| 839   EXPECT_STREQ("1234567890", output.c_str()); | 847   EXPECT_STREQ("1234567890", output.c_str()); | 
| 840 #else | 848 #else | 
| 841   argv.push_back("yes"); | 849   argv.push_back("yes"); | 
| 842   EXPECT_TRUE(base::GetAppOutputRestricted(CommandLine(argv), &output, 10)); | 850   EXPECT_TRUE(base::GetAppOutputRestricted(base::CommandLine(argv), &output, | 
|  | 851                                            10)); | 
| 843   EXPECT_STREQ("y\ny\ny\ny\ny\n", output.c_str()); | 852   EXPECT_STREQ("y\ny\ny\ny\ny\n", output.c_str()); | 
| 844 #endif | 853 #endif | 
| 845 } | 854 } | 
| 846 #endif | 855 #endif | 
| 847 | 856 | 
| 848 #if defined(ADDRESS_SANITIZER) && defined(OS_MACOSX) && \ | 857 #if defined(ADDRESS_SANITIZER) && defined(OS_MACOSX) && \ | 
| 849     defined(ARCH_CPU_64_BITS) | 858     defined(ARCH_CPU_64_BITS) | 
| 850 // Times out under AddressSanitizer on 64-bit OS X, see | 859 // Times out under AddressSanitizer on 64-bit OS X, see | 
| 851 // http://crbug.com/298197. | 860 // http://crbug.com/298197. | 
| 852 #define MAYBE_GetAppOutputRestrictedNoZombies \ | 861 #define MAYBE_GetAppOutputRestrictedNoZombies \ | 
| 853     DISABLED_GetAppOutputRestrictedNoZombies | 862     DISABLED_GetAppOutputRestrictedNoZombies | 
| 854 #else | 863 #else | 
| 855 #define MAYBE_GetAppOutputRestrictedNoZombies GetAppOutputRestrictedNoZombies | 864 #define MAYBE_GetAppOutputRestrictedNoZombies GetAppOutputRestrictedNoZombies | 
| 856 #endif | 865 #endif | 
| 857 TEST_F(ProcessUtilTest, MAYBE_GetAppOutputRestrictedNoZombies) { | 866 TEST_F(ProcessUtilTest, MAYBE_GetAppOutputRestrictedNoZombies) { | 
| 858   std::vector<std::string> argv; | 867   std::vector<std::string> argv; | 
| 859 | 868 | 
| 860   argv.push_back(std::string(kShellPath));  // argv[0] | 869   argv.push_back(std::string(kShellPath));  // argv[0] | 
| 861   argv.push_back("-c");  // argv[1] | 870   argv.push_back("-c");  // argv[1] | 
| 862   argv.push_back("echo 123456789012345678901234567890");  // argv[2] | 871   argv.push_back("echo 123456789012345678901234567890");  // argv[2] | 
| 863 | 872 | 
| 864   // Run |GetAppOutputRestricted()| 300 (> default per-user processes on Mac OS | 873   // Run |GetAppOutputRestricted()| 300 (> default per-user processes on Mac OS | 
| 865   // 10.5) times with an output buffer big enough to capture all output. | 874   // 10.5) times with an output buffer big enough to capture all output. | 
| 866   for (int i = 0; i < 300; i++) { | 875   for (int i = 0; i < 300; i++) { | 
| 867     std::string output; | 876     std::string output; | 
| 868     EXPECT_TRUE(base::GetAppOutputRestricted(CommandLine(argv), &output, 100)); | 877     EXPECT_TRUE(base::GetAppOutputRestricted(base::CommandLine(argv), &output, | 
|  | 878                                              100)); | 
| 869     EXPECT_STREQ("123456789012345678901234567890\n", output.c_str()); | 879     EXPECT_STREQ("123456789012345678901234567890\n", output.c_str()); | 
| 870   } | 880   } | 
| 871 | 881 | 
| 872   // Ditto, but with an output buffer too small to capture all output. | 882   // Ditto, but with an output buffer too small to capture all output. | 
| 873   for (int i = 0; i < 300; i++) { | 883   for (int i = 0; i < 300; i++) { | 
| 874     std::string output; | 884     std::string output; | 
| 875     EXPECT_TRUE(base::GetAppOutputRestricted(CommandLine(argv), &output, 10)); | 885     EXPECT_TRUE(base::GetAppOutputRestricted(base::CommandLine(argv), &output, | 
|  | 886                                              10)); | 
| 876     EXPECT_STREQ("1234567890", output.c_str()); | 887     EXPECT_STREQ("1234567890", output.c_str()); | 
| 877   } | 888   } | 
| 878 } | 889 } | 
| 879 | 890 | 
| 880 TEST_F(ProcessUtilTest, GetAppOutputWithExitCode) { | 891 TEST_F(ProcessUtilTest, GetAppOutputWithExitCode) { | 
| 881   // Test getting output from a successful application. | 892   // Test getting output from a successful application. | 
| 882   std::vector<std::string> argv; | 893   std::vector<std::string> argv; | 
| 883   std::string output; | 894   std::string output; | 
| 884   int exit_code; | 895   int exit_code; | 
| 885   argv.push_back(std::string(kShellPath));  // argv[0] | 896   argv.push_back(std::string(kShellPath));  // argv[0] | 
| 886   argv.push_back("-c");  // argv[1] | 897   argv.push_back("-c");  // argv[1] | 
| 887   argv.push_back("echo foo");  // argv[2]; | 898   argv.push_back("echo foo");  // argv[2]; | 
| 888   EXPECT_TRUE(base::GetAppOutputWithExitCode(CommandLine(argv), &output, | 899   EXPECT_TRUE(base::GetAppOutputWithExitCode(base::CommandLine(argv), &output, | 
| 889                                              &exit_code)); | 900                                              &exit_code)); | 
| 890   EXPECT_STREQ("foo\n", output.c_str()); | 901   EXPECT_STREQ("foo\n", output.c_str()); | 
| 891   EXPECT_EQ(exit_code, 0); | 902   EXPECT_EQ(exit_code, 0); | 
| 892 | 903 | 
| 893   // Test getting output from an application which fails with a specific exit | 904   // Test getting output from an application which fails with a specific exit | 
| 894   // code. | 905   // code. | 
| 895   output.clear(); | 906   output.clear(); | 
| 896   argv[2] = "echo foo; exit 2"; | 907   argv[2] = "echo foo; exit 2"; | 
| 897   EXPECT_TRUE(base::GetAppOutputWithExitCode(CommandLine(argv), &output, | 908   EXPECT_TRUE(base::GetAppOutputWithExitCode(base::CommandLine(argv), &output, | 
| 898                                              &exit_code)); | 909                                              &exit_code)); | 
| 899   EXPECT_STREQ("foo\n", output.c_str()); | 910   EXPECT_STREQ("foo\n", output.c_str()); | 
| 900   EXPECT_EQ(exit_code, 2); | 911   EXPECT_EQ(exit_code, 2); | 
| 901 } | 912 } | 
| 902 | 913 | 
| 903 TEST_F(ProcessUtilTest, GetParentProcessId) { | 914 TEST_F(ProcessUtilTest, GetParentProcessId) { | 
| 904   base::ProcessId ppid = base::GetParentProcessId(base::GetCurrentProcId()); | 915   base::ProcessId ppid = base::GetParentProcessId(base::GetCurrentProcId()); | 
| 905   EXPECT_EQ(ppid, getppid()); | 916   EXPECT_EQ(ppid, getppid()); | 
| 906 } | 917 } | 
| 907 | 918 | 
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 943   // Check that process was really killed. | 954   // Check that process was really killed. | 
| 944   EXPECT_TRUE(IsProcessDead(child_process)); | 955   EXPECT_TRUE(IsProcessDead(child_process)); | 
| 945   base::CloseProcessHandle(child_process); | 956   base::CloseProcessHandle(child_process); | 
| 946 } | 957 } | 
| 947 | 958 | 
| 948 MULTIPROCESS_TEST_MAIN(process_util_test_die_immediately) { | 959 MULTIPROCESS_TEST_MAIN(process_util_test_die_immediately) { | 
| 949   return 0; | 960   return 0; | 
| 950 } | 961 } | 
| 951 | 962 | 
| 952 #endif  // defined(OS_POSIX) | 963 #endif  // defined(OS_POSIX) | 
| OLD | NEW | 
|---|