1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "mojo/public/environment/default_async_waiter.h"
9 #include "mojo/public/environment/environment.h"
10 #include "mojo/public/system/core_cpp.h"
11 #include "mojo/public/system/macros.h"
12 #include "mojo/public/tests/test_utils.h"
13 #include "mojo/public/utility/run_loop.h"
14 #include "testing/gtest/include/gtest/gtest.h"
19 class TestAsyncWaitCallback {
21 TestAsyncWaitCallback() : result_count_(0), last_result_(MOJO_RESULT_OK) {
23 virtual ~TestAsyncWaitCallback() {}
25 int result_count() const { return result_count_; }
27 MojoResult last_result() const { return last_result_; }
29 // MojoAsyncWaitCallback:
30 static void OnHandleReady(void* closure, MojoResult result) {
31 TestAsyncWaitCallback* self = static_cast<TestAsyncWaitCallback*>(closure);
32 self->result_count_++;
33 self->last_result_ = result;
38 MojoResult last_result_;
40 MOJO_DISALLOW_COPY_AND_ASSIGN(TestAsyncWaitCallback);
43 MojoAsyncWaitID CallAsyncWait(const Handle& handle,
45 TestAsyncWaitCallback* callback) {
46 MojoAsyncWaiter* waiter = GetDefaultAsyncWaiter();
47 return waiter->AsyncWait(waiter,
50 MOJO_DEADLINE_INDEFINITE,
51 &TestAsyncWaitCallback::OnHandleReady,
55 void CallCancelWait(MojoAsyncWaitID wait_id) {
56 MojoAsyncWaiter* waiter = GetDefaultAsyncWaiter();
57 waiter->CancelWait(waiter, wait_id);
60 class AsyncWaiterTest : public testing::Test {
65 Environment environment_;
68 MOJO_DISALLOW_COPY_AND_ASSIGN(AsyncWaiterTest);
71 // Verifies AsyncWaitCallback is notified when pipe is ready.
72 TEST_F(AsyncWaiterTest, CallbackNotified) {
73 TestAsyncWaitCallback callback;
74 MessagePipe test_pipe;
75 EXPECT_TRUE(test::WriteTextMessage(test_pipe.handle1.get(), std::string()));
77 CallAsyncWait(test_pipe.handle0.get(),
78 MOJO_WAIT_FLAG_READABLE,
80 RunLoop::current()->Run();
81 EXPECT_EQ(1, callback.result_count());
82 EXPECT_EQ(MOJO_RESULT_OK, callback.last_result());
85 // Verifies 2 AsyncWaitCallbacks are notified when there pipes are ready.
86 TEST_F(AsyncWaiterTest, TwoCallbacksNotified) {
87 TestAsyncWaitCallback callback1;
88 TestAsyncWaitCallback callback2;
89 MessagePipe test_pipe1;
90 MessagePipe test_pipe2;
91 EXPECT_TRUE(test::WriteTextMessage(test_pipe1.handle1.get(), std::string()));
92 EXPECT_TRUE(test::WriteTextMessage(test_pipe2.handle1.get(), std::string()));
94 CallAsyncWait(test_pipe1.handle0.get(), MOJO_WAIT_FLAG_READABLE, &callback1);
95 CallAsyncWait(test_pipe2.handle0.get(), MOJO_WAIT_FLAG_READABLE, &callback2);
97 RunLoop::current()->Run();
98 EXPECT_EQ(1, callback1.result_count());
99 EXPECT_EQ(MOJO_RESULT_OK, callback1.last_result());
100 EXPECT_EQ(1, callback2.result_count());
101 EXPECT_EQ(MOJO_RESULT_OK, callback2.last_result());
104 // Verifies cancel works.
105 TEST_F(AsyncWaiterTest, CancelCallback) {
106 TestAsyncWaitCallback callback;
107 MessagePipe test_pipe;
108 EXPECT_TRUE(test::WriteTextMessage(test_pipe.handle1.get(), std::string()));
111 CallAsyncWait(test_pipe.handle0.get(),
112 MOJO_WAIT_FLAG_READABLE,
114 RunLoop::current()->Run();
115 EXPECT_EQ(0, callback.result_count());