Index: mojo/common/handle_watcher_unittest.cc |
diff --git a/mojo/common/handle_watcher_unittest.cc b/mojo/common/handle_watcher_unittest.cc |
index b734e99b7fc9564a5390c6dc418adada04da5616..61913cdd71bd6f68b674d708ec6bee583c60aa42 100644 |
--- a/mojo/common/handle_watcher_unittest.cc |
+++ b/mojo/common/handle_watcher_unittest.cc |
@@ -13,6 +13,7 @@ |
#include "base/run_loop.h" |
#include "base/test/simple_test_tick_clock.h" |
#include "base/threading/thread.h" |
+#include "mojo/common/message_pump_mojo.h" |
#include "mojo/common/time_helper.h" |
#include "mojo/public/cpp/system/core.h" |
#include "mojo/public/cpp/test_support/test_utils.h" |
@@ -22,6 +23,11 @@ namespace mojo { |
namespace common { |
namespace test { |
+enum MessageLoopConfig { |
+ MESSAGE_LOOP_CONFIG_DEFAULT = 0, |
+ MESSAGE_LOOP_CONFIG_MOJO = 1 |
+}; |
+ |
void ObserveCallback(bool* was_signaled, |
MojoResult* result_observed, |
MojoResult result) { |
@@ -42,6 +48,15 @@ void DeleteWatcherAndForwardResult( |
next_callback.Run(result); |
} |
+scoped_ptr<base::MessageLoop> CreateMessageLoop(MessageLoopConfig config) { |
+ scoped_ptr<base::MessageLoop> loop; |
+ if (config == MESSAGE_LOOP_CONFIG_DEFAULT) |
+ loop.reset(new base::MessageLoop()); |
+ else |
+ loop.reset(new base::MessageLoop(MessagePumpMojo::Create())); |
+ return loop.Pass(); |
+} |
+ |
// Helper class to manage the callback and running the message loop waiting for |
// message to be received. Typical usage is something like: |
// Schedule callback returned from GetCallback(). |
@@ -103,14 +118,18 @@ class CallbackHelper { |
DISALLOW_COPY_AND_ASSIGN(CallbackHelper); |
}; |
-class HandleWatcherTest : public testing::Test { |
+class HandleWatcherTest : public testing::TestWithParam<MessageLoopConfig> { |
public: |
- HandleWatcherTest() {} |
+ HandleWatcherTest() : message_loop_(CreateMessageLoop(GetParam())) {} |
virtual ~HandleWatcherTest() { |
test::SetTickClockForTest(NULL); |
} |
protected: |
+ void TearDownMessageLoop() { |
+ message_loop_.reset(); |
+ } |
+ |
void InstallTickClock() { |
test::SetTickClockForTest(&tick_clock_); |
} |
@@ -119,13 +138,17 @@ class HandleWatcherTest : public testing::Test { |
private: |
base::ShadowingAtExitManager at_exit_; |
- base::MessageLoop message_loop_; |
+ scoped_ptr<base::MessageLoop> message_loop_; |
DISALLOW_COPY_AND_ASSIGN(HandleWatcherTest); |
}; |
+INSTANTIATE_TEST_CASE_P( |
+ MultipleMessageLoopConfigs, HandleWatcherTest, |
+ testing::Values(MESSAGE_LOOP_CONFIG_DEFAULT, MESSAGE_LOOP_CONFIG_MOJO)); |
+ |
// Trivial test case with a single handle to watch. |
-TEST_F(HandleWatcherTest, SingleHandler) { |
+TEST_P(HandleWatcherTest, SingleHandler) { |
MessagePipe test_pipe; |
ASSERT_TRUE(test_pipe.handle0.is_valid()); |
CallbackHelper callback_helper; |
@@ -141,7 +164,7 @@ TEST_F(HandleWatcherTest, SingleHandler) { |
// Creates three handles and notfies them in reverse order ensuring each one is |
// notified appropriately. |
-TEST_F(HandleWatcherTest, ThreeHandles) { |
+TEST_P(HandleWatcherTest, ThreeHandles) { |
MessagePipe test_pipe1; |
MessagePipe test_pipe2; |
MessagePipe test_pipe3; |
@@ -206,7 +229,7 @@ TEST_F(HandleWatcherTest, ThreeHandles) { |
} |
// Verifies Start() invoked a second time works. |
-TEST_F(HandleWatcherTest, Restart) { |
+TEST_P(HandleWatcherTest, Restart) { |
MessagePipe test_pipe1; |
MessagePipe test_pipe2; |
CallbackHelper callback_helper1; |
@@ -258,7 +281,7 @@ TEST_F(HandleWatcherTest, Restart) { |
} |
// Verifies deadline is honored. |
-TEST_F(HandleWatcherTest, Deadline) { |
+TEST_P(HandleWatcherTest, Deadline) { |
InstallTickClock(); |
MessagePipe test_pipe1; |
@@ -301,7 +324,7 @@ TEST_F(HandleWatcherTest, Deadline) { |
EXPECT_FALSE(callback_helper3.got_callback()); |
} |
-TEST_F(HandleWatcherTest, DeleteInCallback) { |
+TEST_P(HandleWatcherTest, DeleteInCallback) { |
MessagePipe test_pipe; |
CallbackHelper callback_helper; |
@@ -316,23 +339,19 @@ TEST_F(HandleWatcherTest, DeleteInCallback) { |
EXPECT_TRUE(callback_helper.got_callback()); |
} |
-TEST(HandleWatcherCleanEnvironmentTest, AbortedOnMessageLoopDestruction) { |
+TEST_P(HandleWatcherTest, AbortedOnMessageLoopDestruction) { |
bool was_signaled = false; |
MojoResult result = MOJO_RESULT_OK; |
- base::ShadowingAtExitManager at_exit; |
MessagePipe pipe; |
HandleWatcher watcher; |
- { |
- base::MessageLoop loop; |
- |
- watcher.Start(pipe.handle0.get(), |
- MOJO_HANDLE_SIGNAL_READABLE, |
- MOJO_DEADLINE_INDEFINITE, |
- base::Bind(&ObserveCallback, &was_signaled, &result)); |
+ watcher.Start(pipe.handle0.get(), |
+ MOJO_HANDLE_SIGNAL_READABLE, |
+ MOJO_DEADLINE_INDEFINITE, |
+ base::Bind(&ObserveCallback, &was_signaled, &result)); |
- // Now, let the MessageLoop get torn down. We expect our callback to run. |
- } |
+ // Now, let the MessageLoop get torn down. We expect our callback to run. |
+ TearDownMessageLoop(); |
EXPECT_TRUE(was_signaled); |
EXPECT_EQ(MOJO_RESULT_ABORTED, result); |
@@ -423,7 +442,14 @@ TEST(HandleWatcherCleanEnvironmentTest, StressTest) { |
// threads running at once. |
for (int i = 0; i < kThreadCount; ++i) { |
scoped_ptr<base::Thread> thread(new base::Thread("test thread")); |
- thread->Start(); |
+ if (i % 2) { |
+ base::Thread::Options thread_options; |
+ thread_options.message_pump_factory = |
+ base::Bind(&MessagePumpMojo::Create); |
+ thread->StartWithOptions(thread_options); |
+ } else { |
+ thread->Start(); |
+ } |
threads.push_back(thread.release()); |
} |
for (int i = 0; i < kThreadCount; ++i) { |