Index: chrome/browser/process_info_snapshot_mac_unittest.cc |
=================================================================== |
--- chrome/browser/process_info_snapshot_mac_unittest.cc (revision 71029) |
+++ chrome/browser/process_info_snapshot_mac_unittest.cc (working copy) |
@@ -10,7 +10,9 @@ |
#include <vector> |
#include "base/command_line.h" |
+#include "base/eintr_wrapper.h" |
#include "base/file_path.h" |
+#include "base/logging.h" |
#include "base/process_util.h" |
#include "testing/gtest/include/gtest/gtest.h" |
@@ -77,6 +79,8 @@ |
// should occupy at least 100 kilobytes. |
EXPECT_GE(proc_info.vsize, 1024u); // Sanity check: our |vsize| is presumably |
// at least a megabyte. |
+ EXPECT_GE(proc_info.rshrd, 1024u); // Shared memory should also > 1 MB. |
+ EXPECT_GE(proc_info.rprvt, 1024u); // Same with private memory. |
// Find our parent. |
ASSERT_TRUE(snapshot.GetProcInfo(ppid, &proc_info)); |
@@ -88,12 +92,33 @@ |
EXPECT_GT(proc_info.vsize, 0u); // Its |vsize| should be nonzero though. |
} |
+// To verify that ProcessInfoSnapshot is getting the actual uid and effective |
+// uid, this test runs top. top should have a uid of the caller and effective |
+// uid of 0 (root). |
TEST_F(ProcessInfoSnapshotMacTest, EffectiveVsRealUserIDTest) { |
- // Run top which has a uid of the caller and effective uid of 0. |
+ // Create a pipe to be able to read top's output. |
+ int fds[2]; |
+ PCHECK(pipe(fds) == 0); |
+ base::file_handle_mapping_vector fds_to_remap; |
+ fds_to_remap.push_back(std::make_pair(fds[1], 1)); |
+ |
+ // Hook up top's stderr to the test process' stderr. |
+ fds_to_remap.push_back(std::make_pair(fileno(stderr), 2)); |
+ |
+ std::vector<std::string> argv; |
+ argv.push_back("/usr/bin/top"); |
+ argv.push_back("-l"); |
+ argv.push_back("0"); |
+ |
base::ProcessHandle process_handle; |
- ASSERT_TRUE(base::LaunchApp(CommandLine(FilePath("/usr/bin/top")), |
- false, false, &process_handle)); |
+ ASSERT_TRUE(base::LaunchApp(argv, fds_to_remap, false, &process_handle)); |
+ PCHECK(HANDLE_EINTR(close(fds[1])) == 0); |
+ // Wait until there's some output form top. This is an easy way to tell that |
+ // the exec() call is done and top is actually running. |
+ char buf[1]; |
+ PCHECK(HANDLE_EINTR(read(fds[0], buf, 1)) == 1); |
+ |
std::vector<base::ProcessId> pid_list; |
pid_list.push_back(process_handle); |
ProcessInfoSnapshot snapshot; |
@@ -107,4 +132,5 @@ |
EXPECT_EQ(proc_info.uid, geteuid()); |
ASSERT_TRUE(base::KillProcess(process_handle, 0, true)); |
+ PCHECK(HANDLE_EINTR(close(fds[0])) == 0); |
} |