Index: base/process/process_unittest.cc |
diff --git a/base/process/process_unittest.cc b/base/process/process_unittest.cc |
index 853f1fe8fff4895d6a749333b6818651861c6312..90bb95a0fe9b04964cedb716629bb42e3058741f 100644 |
--- a/base/process/process_unittest.cc |
+++ b/base/process/process_unittest.cc |
@@ -22,6 +22,16 @@ const int kExpectedStillRunningExitCode = 0x102; |
const int kExpectedStillRunningExitCode = 0; |
#endif |
+#if defined(OS_MACOSX) |
+// Fake port provider that returns the calling process's |
+// task port, ignoring its argument. |
+class FakePortProvider : public base::PortProvider { |
+ mach_port_t TaskForPid(base::ProcessHandle process) const override { |
+ return mach_task_self(); |
+ } |
+}; |
+#endif |
+ |
} // namespace |
namespace base { |
@@ -171,6 +181,8 @@ TEST_F(ProcessTest, WaitForExitWithTimeout) { |
// Note: a platform may not be willing or able to lower the priority of |
// a process. The calls to SetProcessBackground should be noops then. |
TEST_F(ProcessTest, SetProcessBackgrounded) { |
+ if (!Process::CanBackgroundProcesses()) |
+ return; |
Process process(SpawnChild("SimpleChildProcess")); |
int old_priority = process.GetPriority(); |
#if defined(OS_WIN) |
@@ -178,11 +190,22 @@ TEST_F(ProcessTest, SetProcessBackgrounded) { |
EXPECT_TRUE(process.IsProcessBackgrounded()); |
EXPECT_TRUE(process.SetProcessBackgrounded(false)); |
EXPECT_FALSE(process.IsProcessBackgrounded()); |
+#elif defined(OS_MACOSX) |
+ // On the Mac, backgrounding a process requires a port to that process. |
+ // In the browser it's available through the MachBroker class, which is not |
+ // part of base. Additionally, there is an indefinite amount of time between |
+ // spawning a process and receiving its port. Because this test just checks |
+ // the ability to background/foreground a process, we can use the current |
+ // process's port instead. |
+ FakePortProvider provider; |
+ EXPECT_TRUE(process.SetProcessBackgrounded(&provider, true)); |
+ EXPECT_TRUE(process.IsProcessBackgrounded(&provider)); |
+ EXPECT_TRUE(process.SetProcessBackgrounded(&provider, false)); |
+ EXPECT_FALSE(process.IsProcessBackgrounded(&provider)); |
+ |
#else |
- if (process.CanBackgroundProcesses()) { |
- process.SetProcessBackgrounded(true); |
- process.SetProcessBackgrounded(false); |
- } |
+ process.SetProcessBackgrounded(true); |
+ process.SetProcessBackgrounded(false); |
#endif |
int new_priority = process.GetPriority(); |
EXPECT_EQ(old_priority, new_priority); |
@@ -191,6 +214,8 @@ TEST_F(ProcessTest, SetProcessBackgrounded) { |
// Same as SetProcessBackgrounded but to this very process. It uses |
// a different code path at least for Windows. |
TEST_F(ProcessTest, SetProcessBackgroundedSelf) { |
+ if (!Process::CanBackgroundProcesses()) |
+ return; |
Process process = Process::Current(); |
int old_priority = process.GetPriority(); |
#if defined(OS_WIN) |
@@ -198,6 +223,12 @@ TEST_F(ProcessTest, SetProcessBackgroundedSelf) { |
EXPECT_TRUE(process.IsProcessBackgrounded()); |
EXPECT_TRUE(process.SetProcessBackgrounded(false)); |
EXPECT_FALSE(process.IsProcessBackgrounded()); |
+#elif defined(OS_MACOSX) |
+ FakePortProvider provider; |
+ EXPECT_TRUE(process.SetProcessBackgrounded(&provider, true)); |
+ EXPECT_TRUE(process.IsProcessBackgrounded(&provider)); |
+ EXPECT_TRUE(process.SetProcessBackgrounded(&provider, false)); |
+ EXPECT_FALSE(process.IsProcessBackgrounded(&provider)); |
#else |
process.SetProcessBackgrounded(true); |
process.SetProcessBackgrounded(false); |