Index: mojo/public/cpp/system/tests/watcher_unittest.cc |
diff --git a/mojo/public/cpp/system/tests/watcher_unittest.cc b/mojo/public/cpp/system/tests/watcher_unittest.cc |
index 9b59240c5dcdf82b865ed07f53a5c06ee79af17d..5a8cc08e79d85bc3b86b51d2c4c589b05b46175c 100644 |
--- a/mojo/public/cpp/system/tests/watcher_unittest.cc |
+++ b/mojo/public/cpp/system/tests/watcher_unittest.cc |
@@ -48,7 +48,7 @@ TEST_F(WatcherTest, WatchBasic) { |
bool notified = false; |
base::RunLoop run_loop; |
- Watcher b_watcher(FROM_HERE); |
+ Watcher b_watcher(FROM_HERE, Watcher::ArmingPolicy::AUTOMATIC); |
EXPECT_EQ(MOJO_RESULT_OK, |
b_watcher.Start(b.get(), MOJO_HANDLE_SIGNAL_READABLE, |
OnReady([&] (MojoResult result) { |
@@ -71,7 +71,7 @@ TEST_F(WatcherTest, WatchUnsatisfiable) { |
CreateMessagePipe(nullptr, &a, &b); |
a.reset(); |
- Watcher b_watcher(FROM_HERE); |
+ Watcher b_watcher(FROM_HERE, Watcher::ArmingPolicy::AUTOMATIC); |
EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
b_watcher.Start(b.get(), MOJO_HANDLE_SIGNAL_READABLE, |
NotReached())); |
@@ -84,7 +84,7 @@ TEST_F(WatcherTest, WatchInvalidHandle) { |
a.reset(); |
b.reset(); |
- Watcher b_watcher(FROM_HERE); |
+ Watcher b_watcher(FROM_HERE, Watcher::ArmingPolicy::AUTOMATIC); |
EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
b_watcher.Start(b.get(), MOJO_HANDLE_SIGNAL_READABLE, |
NotReached())); |
@@ -96,7 +96,7 @@ TEST_F(WatcherTest, Cancel) { |
CreateMessagePipe(nullptr, &a, &b); |
base::RunLoop run_loop; |
- Watcher b_watcher(FROM_HERE); |
+ Watcher b_watcher(FROM_HERE, Watcher::ArmingPolicy::AUTOMATIC); |
EXPECT_EQ(MOJO_RESULT_OK, |
b_watcher.Start(b.get(), MOJO_HANDLE_SIGNAL_READABLE, |
NotReached())); |
@@ -118,7 +118,7 @@ TEST_F(WatcherTest, CancelOnClose) { |
CreateMessagePipe(nullptr, &a, &b); |
base::RunLoop run_loop; |
- Watcher b_watcher(FROM_HERE); |
+ Watcher b_watcher(FROM_HERE, Watcher::ArmingPolicy::AUTOMATIC); |
EXPECT_EQ(MOJO_RESULT_OK, |
b_watcher.Start(b.get(), MOJO_HANDLE_SIGNAL_READABLE, |
OnReady([&] (MojoResult result) { |
@@ -140,7 +140,7 @@ TEST_F(WatcherTest, CancelOnDestruction) { |
CreateMessagePipe(nullptr, &a, &b); |
base::RunLoop run_loop; |
{ |
- Watcher b_watcher(FROM_HERE); |
+ Watcher b_watcher(FROM_HERE, Watcher::ArmingPolicy::AUTOMATIC); |
EXPECT_EQ(MOJO_RESULT_OK, |
b_watcher.Start(b.get(), MOJO_HANDLE_SIGNAL_READABLE, |
NotReached())); |
@@ -161,7 +161,7 @@ TEST_F(WatcherTest, CloseAndCancel) { |
ScopedMessagePipeHandle a, b; |
CreateMessagePipe(nullptr, &a, &b); |
- Watcher b_watcher(FROM_HERE); |
+ Watcher b_watcher(FROM_HERE, Watcher::ArmingPolicy::AUTOMATIC); |
EXPECT_EQ(MOJO_RESULT_OK, |
b_watcher.Start(b.get(), MOJO_HANDLE_SIGNAL_READABLE, |
OnReady([](MojoResult result) { FAIL(); }))); |
@@ -177,5 +177,99 @@ TEST_F(WatcherTest, CloseAndCancel) { |
base::RunLoop().RunUntilIdle(); |
} |
+TEST_F(WatcherTest, UnarmedCancel) { |
+ ScopedMessagePipeHandle a, b; |
+ CreateMessagePipe(nullptr, &a, &b); |
+ |
+ Watcher b_watcher(FROM_HERE, Watcher::ArmingPolicy::MANUAL); |
+ base::RunLoop loop; |
+ EXPECT_EQ(MOJO_RESULT_OK, |
+ b_watcher.Start(b.get(), MOJO_HANDLE_SIGNAL_READABLE, |
+ base::Bind( |
+ [](base::RunLoop* loop, MojoResult result) { |
+ EXPECT_EQ(result, MOJO_RESULT_CANCELLED); |
+ loop->Quit(); |
+ }, |
+ &loop))); |
+ |
+ // This message write will not wake up the watcher since the watcher isn't |
+ // armed. Instead, the cancellation will dispatch due to the reset below. |
+ EXPECT_EQ(MOJO_RESULT_OK, WriteMessageRaw(a.get(), "hello", 5, nullptr, 0, |
+ MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ b.reset(); |
+ loop.Run(); |
+} |
+ |
+TEST_F(WatcherTest, ManualArming) { |
+ ScopedMessagePipeHandle a, b; |
+ CreateMessagePipe(nullptr, &a, &b); |
+ |
+ Watcher b_watcher(FROM_HERE, Watcher::ArmingPolicy::MANUAL); |
+ base::RunLoop loop; |
+ EXPECT_EQ(MOJO_RESULT_OK, |
+ b_watcher.Start(b.get(), MOJO_HANDLE_SIGNAL_READABLE, |
+ base::Bind( |
+ [](base::RunLoop* loop, MojoResult result) { |
+ EXPECT_EQ(result, MOJO_RESULT_OK); |
+ loop->Quit(); |
+ }, |
+ &loop))); |
+ EXPECT_EQ(MOJO_RESULT_OK, b_watcher.Arm()); |
+ |
+ EXPECT_EQ(MOJO_RESULT_OK, WriteMessageRaw(a.get(), "hello", 5, nullptr, 0, |
+ MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ loop.Run(); |
+} |
+ |
+TEST_F(WatcherTest, ManualArmOrNotifyWhileSignaled) { |
+ ScopedMessagePipeHandle a, b; |
+ CreateMessagePipe(nullptr, &a, &b); |
+ |
+ base::RunLoop loop1; |
+ Watcher b_watcher1(FROM_HERE, Watcher::ArmingPolicy::MANUAL); |
+ bool notified1 = false; |
+ EXPECT_EQ(MOJO_RESULT_OK, |
+ b_watcher1.Start( |
+ b.get(), MOJO_HANDLE_SIGNAL_READABLE, |
+ base::Bind( |
+ [](base::RunLoop* loop, bool* notified, MojoResult result) { |
+ EXPECT_EQ(result, MOJO_RESULT_OK); |
+ *notified = true; |
+ loop->Quit(); |
+ }, |
+ &loop1, ¬ified1))); |
+ |
+ base::RunLoop loop2; |
+ Watcher b_watcher2(FROM_HERE, Watcher::ArmingPolicy::MANUAL); |
+ bool notified2 = false; |
+ EXPECT_EQ(MOJO_RESULT_OK, |
+ b_watcher2.Start( |
+ b.get(), MOJO_HANDLE_SIGNAL_READABLE, |
+ base::Bind( |
+ [](base::RunLoop* loop, bool* notified, MojoResult result) { |
+ EXPECT_EQ(result, MOJO_RESULT_OK); |
+ *notified = true; |
+ loop->Quit(); |
+ }, |
+ &loop2, ¬ified2))); |
+ |
+ // First ensure that |b| is readable. |
+ EXPECT_EQ(MOJO_RESULT_OK, b_watcher1.Arm()); |
+ EXPECT_EQ(MOJO_RESULT_OK, WriteMessageRaw(a.get(), "hello", 5, nullptr, 0, |
+ MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ loop1.Run(); |
+ |
+ EXPECT_TRUE(notified1); |
+ EXPECT_FALSE(notified2); |
+ notified1 = false; |
+ |
+ // Now verify that ArmOrNotify results in a notification. |
+ b_watcher2.ArmOrNotify(); |
+ loop2.Run(); |
+ |
+ EXPECT_FALSE(notified1); |
+ EXPECT_TRUE(notified2); |
+} |
+ |
} // namespace |
} // namespace mojo |