• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
4 
5 #include <string>
6 
7 #include "mojo/public/c/environment/async_waiter.h"
8 #include "mojo/public/cpp/environment/environment.h"
9 #include "mojo/public/cpp/system/core.h"
10 #include "mojo/public/cpp/system/macros.h"
11 #include "mojo/public/cpp/test_support/test_utils.h"
12 #include "mojo/public/cpp/utility/run_loop.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14 
15 namespace mojo {
16 namespace {
17 
18 class TestAsyncWaitCallback {
19  public:
TestAsyncWaitCallback()20   TestAsyncWaitCallback() : result_count_(0), last_result_(MOJO_RESULT_OK) {
21   }
~TestAsyncWaitCallback()22   virtual ~TestAsyncWaitCallback() {}
23 
result_count() const24   int result_count() const { return result_count_; }
25 
last_result() const26   MojoResult last_result() const { return last_result_; }
27 
28   // MojoAsyncWaitCallback:
OnHandleReady(void * closure,MojoResult result)29   static void OnHandleReady(void* closure, MojoResult result) {
30     TestAsyncWaitCallback* self = static_cast<TestAsyncWaitCallback*>(closure);
31     self->result_count_++;
32     self->last_result_ = result;
33   }
34 
35  private:
36   int result_count_;
37   MojoResult last_result_;
38 
39   MOJO_DISALLOW_COPY_AND_ASSIGN(TestAsyncWaitCallback);
40 };
41 
CallAsyncWait(const Handle & handle,MojoHandleSignals signals,TestAsyncWaitCallback * callback)42 MojoAsyncWaitID CallAsyncWait(const Handle& handle,
43                               MojoHandleSignals signals,
44                               TestAsyncWaitCallback* callback) {
45   return Environment::GetDefaultAsyncWaiter()->AsyncWait(
46       handle.value(),
47       signals,
48       MOJO_DEADLINE_INDEFINITE,
49       &TestAsyncWaitCallback::OnHandleReady,
50       callback);
51 }
52 
CallCancelWait(MojoAsyncWaitID wait_id)53 void CallCancelWait(MojoAsyncWaitID wait_id) {
54   Environment::GetDefaultAsyncWaiter()->CancelWait(wait_id);
55 }
56 
57 class AsyncWaiterTest : public testing::Test {
58  public:
AsyncWaiterTest()59   AsyncWaiterTest() {}
60 
61  private:
62   Environment environment_;
63   RunLoop run_loop_;
64 
65   MOJO_DISALLOW_COPY_AND_ASSIGN(AsyncWaiterTest);
66 };
67 
68 // Verifies AsyncWaitCallback is notified when pipe is ready.
TEST_F(AsyncWaiterTest,CallbackNotified)69 TEST_F(AsyncWaiterTest, CallbackNotified) {
70   TestAsyncWaitCallback callback;
71   MessagePipe test_pipe;
72   EXPECT_TRUE(test::WriteTextMessage(test_pipe.handle1.get(), std::string()));
73 
74   CallAsyncWait(test_pipe.handle0.get(),
75                 MOJO_HANDLE_SIGNAL_READABLE,
76                 &callback);
77   RunLoop::current()->Run();
78   EXPECT_EQ(1, callback.result_count());
79   EXPECT_EQ(MOJO_RESULT_OK, callback.last_result());
80 }
81 
82 // Verifies 2 AsyncWaitCallbacks are notified when there pipes are ready.
TEST_F(AsyncWaiterTest,TwoCallbacksNotified)83 TEST_F(AsyncWaiterTest, TwoCallbacksNotified) {
84   TestAsyncWaitCallback callback1;
85   TestAsyncWaitCallback callback2;
86   MessagePipe test_pipe1;
87   MessagePipe test_pipe2;
88   EXPECT_TRUE(test::WriteTextMessage(test_pipe1.handle1.get(), std::string()));
89   EXPECT_TRUE(test::WriteTextMessage(test_pipe2.handle1.get(), std::string()));
90 
91   CallAsyncWait(test_pipe1.handle0.get(),
92                 MOJO_HANDLE_SIGNAL_READABLE,
93                 &callback1);
94   CallAsyncWait(test_pipe2.handle0.get(),
95                 MOJO_HANDLE_SIGNAL_READABLE,
96                 &callback2);
97 
98   RunLoop::current()->Run();
99   EXPECT_EQ(1, callback1.result_count());
100   EXPECT_EQ(MOJO_RESULT_OK, callback1.last_result());
101   EXPECT_EQ(1, callback2.result_count());
102   EXPECT_EQ(MOJO_RESULT_OK, callback2.last_result());
103 }
104 
105 // Verifies cancel works.
TEST_F(AsyncWaiterTest,CancelCallback)106 TEST_F(AsyncWaiterTest, CancelCallback) {
107   TestAsyncWaitCallback callback;
108   MessagePipe test_pipe;
109   EXPECT_TRUE(test::WriteTextMessage(test_pipe.handle1.get(), std::string()));
110 
111   CallCancelWait(
112       CallAsyncWait(test_pipe.handle0.get(),
113                     MOJO_HANDLE_SIGNAL_READABLE,
114                     &callback));
115   RunLoop::current()->Run();
116   EXPECT_EQ(0, callback.result_count());
117 }
118 
119 }  // namespace
120 }  // namespace mojo
121