Index: content/browser/mach_broker_mac_unittest.cc |
diff --git a/content/browser/mach_broker_mac_unittest.cc b/content/browser/mach_broker_mac_unittest.cc |
index 9ba50c3109022be8757370123d8e38c2ba819fde..21a4c4d58f2ad401aa4b58b7aaca2b7eb34b9bc2 100644 |
--- a/content/browser/mach_broker_mac_unittest.cc |
+++ b/content/browser/mach_broker_mac_unittest.cc |
@@ -4,8 +4,13 @@ |
#include "content/browser/mach_broker_mac.h" |
+#include "base/command_line.h" |
#include "base/synchronization/lock.h" |
+#include "base/test/multiprocess_test.h" |
+#include "base/test/test_timeouts.h" |
+#include "content/public/test/test_browser_thread_bundle.h" |
#include "testing/gtest/include/gtest/gtest.h" |
+#include "testing/multiprocess_func_list.h" |
namespace content { |
@@ -25,59 +30,58 @@ class MachBrokerTest : public testing::Test { |
return broker_.child_process_id_map_.count(child_process_id); |
} |
- // Helper function to acquire/release locks and call |FinalizePid()|. |
- void FinalizePid(base::ProcessHandle pid, |
- mach_port_t task_port) { |
+ base::Process LaunchTestChild(const std::string& function, |
+ int child_process_id) { |
base::AutoLock lock(broker_.GetLock()); |
- broker_.FinalizePid(pid, task_port); |
+ base::Process test_child_process = base::SpawnMultiProcessTestChild( |
+ function, base::GetMultiProcessTestChildBaseCommandLine(), |
+ base::LaunchOptions()); |
+ broker_.AddPlaceholderForPid(test_child_process.Handle(), child_process_id); |
+ return test_child_process; |
+ } |
+ |
+ void WaitForChildExit(base::Process& process) { |
+ int rv = -1; |
+ ASSERT_TRUE(process.WaitForExitWithTimeout( |
+ TestTimeouts::action_timeout(), &rv)); |
+ EXPECT_EQ(0, rv); |
} |
protected: |
MachBroker broker_; |
+ TestBrowserThreadBundle thread_bundle_; |
}; |
+MULTIPROCESS_TEST_MAIN(MachBrokerTestChild) { |
+ CHECK(MachBroker::ChildSendTaskPortToParent()); |
+ return 0; |
+} |
+ |
TEST_F(MachBrokerTest, Locks) { |
// Acquire and release the locks. Nothing bad should happen. |
base::AutoLock lock(broker_.GetLock()); |
} |
-TEST_F(MachBrokerTest, AddPlaceholderAndFinalize) { |
- // Add a placeholder for PID 1. |
- AddPlaceholderForPid(1, 1); |
- EXPECT_EQ(0u, broker_.TaskForPid(1)); |
- |
- // Finalize PID 1. |
- FinalizePid(1, 100u); |
- EXPECT_EQ(100u, broker_.TaskForPid(1)); |
- |
- // Should be no entry for PID 2. |
- EXPECT_EQ(0u, broker_.TaskForPid(2)); |
-} |
- |
-TEST_F(MachBrokerTest, InvalidateChildProcessId) { |
- // Add a placeholder for PID 1 and child process id 50. |
- AddPlaceholderForPid(1, 50); |
- FinalizePid(1, 100u); |
- |
- EXPECT_EQ(100u, broker_.TaskForPid(1)); |
- InvalidateChildProcessId(50); |
- EXPECT_EQ(0u, broker_.TaskForPid(1)); |
-} |
+TEST_F(MachBrokerTest, AddChildProcess) { |
+ { |
+ base::AutoLock lock(broker_.GetLock()); |
+ broker_.EnsureRunning(); |
+ } |
+ base::Process child_process = LaunchTestChild("MachBrokerTestChild", 7); |
+ WaitForChildExit(child_process); |
-TEST_F(MachBrokerTest, ValidateChildProcessIdMap) { |
- // Add a placeholder for PID 1 and child process id 50. |
- AddPlaceholderForPid(1, 50); |
- FinalizePid(1, 100u); |
+ EXPECT_NE(static_cast<mach_port_t>(MACH_PORT_NULL), |
+ broker_.TaskForPid(child_process.Handle())); |
+ EXPECT_EQ(1, GetChildProcessCount(7)); |
- EXPECT_EQ(1, GetChildProcessCount(50)); |
- InvalidateChildProcessId(50); |
- EXPECT_EQ(0, GetChildProcessCount(50)); |
-} |
+ // Should be no entry for any other PID. |
+ EXPECT_EQ(static_cast<mach_port_t>(MACH_PORT_NULL), |
+ broker_.TaskForPid(child_process.Handle() + 1)); |
-TEST_F(MachBrokerTest, FinalizeUnknownPid) { |
- // Finalizing an entry for an unknown pid should not add it to the map. |
- FinalizePid(1u, 100u); |
- EXPECT_EQ(0u, broker_.TaskForPid(1u)); |
+ InvalidateChildProcessId(7); |
+ EXPECT_EQ(static_cast<mach_port_t>(MACH_PORT_NULL), |
+ broker_.TaskForPid(child_process.Handle())); |
+ EXPECT_EQ(0, GetChildProcessCount(7)); |
} |
} // namespace content |