Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(300)

Side by Side Diff: mojo/edk/system/message_pipe_dispatcher_unittest.cc

Issue 741503003: Adding MOJO_HANDLE_SIGNAL_PEER_CLOSED to be notified when a peer is closed. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Fix go formatting Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // NOTE(vtl): Some of these tests are inherently flaky (e.g., if run on a 5 // NOTE(vtl): Some of these tests are inherently flaky (e.g., if run on a
6 // heavily-loaded system). Sorry. |test::EpsilonTimeout()| may be increased to 6 // heavily-loaded system). Sorry. |test::EpsilonTimeout()| may be increased to
7 // increase tolerance and reduce observed flakiness (though doing so reduces the 7 // increase tolerance and reduce observed flakiness (though doing so reduces the
8 // meaningfulness of the test). 8 // meaningfulness of the test).
9 9
10 #include "mojo/edk/system/message_pipe_dispatcher.h" 10 #include "mojo/edk/system/message_pipe_dispatcher.h"
(...skipping 11 matching lines...) Expand all
22 #include "mojo/edk/system/message_pipe.h" 22 #include "mojo/edk/system/message_pipe.h"
23 #include "mojo/edk/system/test_utils.h" 23 #include "mojo/edk/system/test_utils.h"
24 #include "mojo/edk/system/waiter.h" 24 #include "mojo/edk/system/waiter.h"
25 #include "mojo/edk/system/waiter_test_utils.h" 25 #include "mojo/edk/system/waiter_test_utils.h"
26 #include "testing/gtest/include/gtest/gtest.h" 26 #include "testing/gtest/include/gtest/gtest.h"
27 27
28 namespace mojo { 28 namespace mojo {
29 namespace system { 29 namespace system {
30 namespace { 30 namespace {
31 31
32 const MojoHandleSignals kAllSignals = MOJO_HANDLE_SIGNAL_READABLE |
33 MOJO_HANDLE_SIGNAL_WRITABLE |
34 MOJO_HANDLE_SIGNAL_PEER_CLOSED;
35
32 TEST(MessagePipeDispatcherTest, Basic) { 36 TEST(MessagePipeDispatcherTest, Basic) {
33 test::Stopwatch stopwatch; 37 test::Stopwatch stopwatch;
34 int32_t buffer[1]; 38 int32_t buffer[1];
35 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); 39 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer));
36 uint32_t buffer_size; 40 uint32_t buffer_size;
37 41
38 // Run this test both with |d0| as port 0, |d1| as port 1 and vice versa. 42 // Run this test both with |d0| as port 0, |d1| as port 1 and vice versa.
39 for (unsigned i = 0; i < 2; i++) { 43 for (unsigned i = 0; i < 2; i++) {
40 scoped_refptr<MessagePipeDispatcher> d0(new MessagePipeDispatcher( 44 scoped_refptr<MessagePipeDispatcher> d0(new MessagePipeDispatcher(
41 MessagePipeDispatcher::kDefaultCreateOptions)); 45 MessagePipeDispatcher::kDefaultCreateOptions));
42 EXPECT_EQ(Dispatcher::kTypeMessagePipe, d0->GetType()); 46 EXPECT_EQ(Dispatcher::kTypeMessagePipe, d0->GetType());
43 scoped_refptr<MessagePipeDispatcher> d1(new MessagePipeDispatcher( 47 scoped_refptr<MessagePipeDispatcher> d1(new MessagePipeDispatcher(
44 MessagePipeDispatcher::kDefaultCreateOptions)); 48 MessagePipeDispatcher::kDefaultCreateOptions));
45 { 49 {
46 scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalLocal()); 50 scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalLocal());
47 d0->Init(mp, i); // 0, 1. 51 d0->Init(mp, i); // 0, 1.
48 d1->Init(mp, i ^ 1); // 1, 0. 52 d1->Init(mp, i ^ 1); // 1, 0.
49 } 53 }
50 Waiter w; 54 Waiter w;
51 uint32_t context = 0; 55 uint32_t context = 0;
52 HandleSignalsState hss; 56 HandleSignalsState hss;
53 57
54 // Try adding a writable waiter when already writable. 58 // Try adding a writable waiter when already writable.
55 w.Init(); 59 w.Init();
56 hss = HandleSignalsState(); 60 hss = HandleSignalsState();
57 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, 61 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
58 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss)); 62 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss));
59 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 63 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
60 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 64 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
61 hss.satisfiable_signals);
62 // Shouldn't need to remove the waiter (it was not added). 65 // Shouldn't need to remove the waiter (it was not added).
63 66
64 // Add a readable waiter to |d0|, then make it readable (by writing to 67 // Add a readable waiter to |d0|, then make it readable (by writing to
65 // |d1|), then wait. 68 // |d1|), then wait.
66 w.Init(); 69 w.Init();
67 ASSERT_EQ(MOJO_RESULT_OK, 70 ASSERT_EQ(MOJO_RESULT_OK,
68 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 1, nullptr)); 71 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 1, nullptr));
69 buffer[0] = 123456789; 72 buffer[0] = 123456789;
70 EXPECT_EQ(MOJO_RESULT_OK, 73 EXPECT_EQ(MOJO_RESULT_OK,
71 d1->WriteMessage(UserPointer<const void>(buffer), kBufferSize, 74 d1->WriteMessage(UserPointer<const void>(buffer), kBufferSize,
72 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); 75 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE));
73 stopwatch.Start(); 76 stopwatch.Start();
74 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, &context)); 77 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, &context));
75 EXPECT_EQ(1u, context); 78 EXPECT_EQ(1u, context);
76 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); 79 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout());
77 hss = HandleSignalsState(); 80 hss = HandleSignalsState();
78 d0->RemoveWaiter(&w, &hss); 81 d0->RemoveWaiter(&w, &hss);
79 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 82 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
80 hss.satisfied_signals); 83 hss.satisfied_signals);
81 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 84 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
82 hss.satisfiable_signals);
83 85
84 // Try adding a readable waiter when already readable (from above). 86 // Try adding a readable waiter when already readable (from above).
85 w.Init(); 87 w.Init();
86 hss = HandleSignalsState(); 88 hss = HandleSignalsState();
87 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, 89 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
88 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 2, &hss)); 90 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 2, &hss));
89 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 91 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
90 hss.satisfied_signals); 92 hss.satisfied_signals);
91 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 93 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
92 hss.satisfiable_signals);
93 // Shouldn't need to remove the waiter (it was not added). 94 // Shouldn't need to remove the waiter (it was not added).
94 95
95 // Make |d0| no longer readable (by reading from it). 96 // Make |d0| no longer readable (by reading from it).
96 buffer[0] = 0; 97 buffer[0] = 0;
97 buffer_size = kBufferSize; 98 buffer_size = kBufferSize;
98 EXPECT_EQ(MOJO_RESULT_OK, 99 EXPECT_EQ(MOJO_RESULT_OK,
99 d0->ReadMessage(UserPointer<void>(buffer), 100 d0->ReadMessage(UserPointer<void>(buffer),
100 MakeUserPointer(&buffer_size), 0, nullptr, 101 MakeUserPointer(&buffer_size), 0, nullptr,
101 MOJO_READ_MESSAGE_FLAG_NONE)); 102 MOJO_READ_MESSAGE_FLAG_NONE));
102 EXPECT_EQ(kBufferSize, buffer_size); 103 EXPECT_EQ(kBufferSize, buffer_size);
103 EXPECT_EQ(123456789, buffer[0]); 104 EXPECT_EQ(123456789, buffer[0]);
104 105
105 // Wait for zero time for readability on |d0| (will time out). 106 // Wait for zero time for readability on |d0| (will time out).
106 w.Init(); 107 w.Init();
107 ASSERT_EQ(MOJO_RESULT_OK, 108 ASSERT_EQ(MOJO_RESULT_OK,
108 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 3, nullptr)); 109 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 3, nullptr));
109 stopwatch.Start(); 110 stopwatch.Start();
110 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr)); 111 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr));
111 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); 112 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout());
112 hss = HandleSignalsState(); 113 hss = HandleSignalsState();
113 d0->RemoveWaiter(&w, &hss); 114 d0->RemoveWaiter(&w, &hss);
114 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 115 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
115 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 116 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
116 hss.satisfiable_signals);
117 117
118 // Wait for non-zero, finite time for readability on |d0| (will time out). 118 // Wait for non-zero, finite time for readability on |d0| (will time out).
119 w.Init(); 119 w.Init();
120 ASSERT_EQ(MOJO_RESULT_OK, 120 ASSERT_EQ(MOJO_RESULT_OK,
121 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 3, nullptr)); 121 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 3, nullptr));
122 stopwatch.Start(); 122 stopwatch.Start();
123 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, 123 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED,
124 w.Wait(2 * test::EpsilonTimeout().InMicroseconds(), nullptr)); 124 w.Wait(2 * test::EpsilonTimeout().InMicroseconds(), nullptr));
125 base::TimeDelta elapsed = stopwatch.Elapsed(); 125 base::TimeDelta elapsed = stopwatch.Elapsed();
126 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); 126 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout());
127 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); 127 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout());
128 hss = HandleSignalsState(); 128 hss = HandleSignalsState();
129 d0->RemoveWaiter(&w, &hss); 129 d0->RemoveWaiter(&w, &hss);
130 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 130 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
131 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 131 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
132 hss.satisfiable_signals); 132
133 // Check the peer closed signal.
134 w.Init();
135 ASSERT_EQ(MOJO_RESULT_OK,
136 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 12, nullptr));
137
138 // Close the peer.
139 EXPECT_EQ(MOJO_RESULT_OK, d1->Close());
140
141 // It should be signaled.
142 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(1000, &context));
143 EXPECT_EQ(12u, context);
144 hss = HandleSignalsState();
145 d0->RemoveWaiter(&w, &hss);
146 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
147 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
133 148
134 EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); 149 EXPECT_EQ(MOJO_RESULT_OK, d0->Close());
135 EXPECT_EQ(MOJO_RESULT_OK, d1->Close());
136 } 150 }
137 } 151 }
138 152
139 TEST(MessagePipeDispatcherTest, InvalidParams) { 153 TEST(MessagePipeDispatcherTest, InvalidParams) {
140 char buffer[1]; 154 char buffer[1];
141 155
142 scoped_refptr<MessagePipeDispatcher> d0( 156 scoped_refptr<MessagePipeDispatcher> d0(
143 new MessagePipeDispatcher(MessagePipeDispatcher::kDefaultCreateOptions)); 157 new MessagePipeDispatcher(MessagePipeDispatcher::kDefaultCreateOptions));
144 scoped_refptr<MessagePipeDispatcher> d1( 158 scoped_refptr<MessagePipeDispatcher> d1(
145 new MessagePipeDispatcher(MessagePipeDispatcher::kDefaultCreateOptions)); 159 new MessagePipeDispatcher(MessagePipeDispatcher::kDefaultCreateOptions));
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
231 d1->WriteMessage(UserPointer<const void>(buffer), kBufferSize, 245 d1->WriteMessage(UserPointer<const void>(buffer), kBufferSize,
232 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); 246 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE));
233 247
234 // Try waiting for readable on |d0|; should fail (already satisfied). 248 // Try waiting for readable on |d0|; should fail (already satisfied).
235 w.Init(); 249 w.Init();
236 hss = HandleSignalsState(); 250 hss = HandleSignalsState();
237 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, 251 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
238 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); 252 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss));
239 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 253 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
240 hss.satisfied_signals); 254 hss.satisfied_signals);
241 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 255 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
242 hss.satisfiable_signals);
243 256
244 // Try reading from |d1|; should fail (nothing to read). 257 // Try reading from |d1|; should fail (nothing to read).
245 buffer[0] = 0; 258 buffer[0] = 0;
246 buffer_size = kBufferSize; 259 buffer_size = kBufferSize;
247 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, 260 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT,
248 d1->ReadMessage(UserPointer<void>(buffer), 261 d1->ReadMessage(UserPointer<void>(buffer),
249 MakeUserPointer(&buffer_size), 0, nullptr, 262 MakeUserPointer(&buffer_size), 0, nullptr,
250 MOJO_READ_MESSAGE_FLAG_NONE)); 263 MOJO_READ_MESSAGE_FLAG_NONE));
251 264
252 // Close |d1|. 265 // Close |d1|.
253 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); 266 EXPECT_EQ(MOJO_RESULT_OK, d1->Close());
254 267
255 // Try waiting for readable on |d0|; should fail (already satisfied). 268 // Try waiting for readable on |d0|; should fail (already satisfied).
256 w.Init(); 269 w.Init();
257 hss = HandleSignalsState(); 270 hss = HandleSignalsState();
258 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, 271 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
259 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 1, &hss)); 272 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 1, &hss));
260 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 273 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
261 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 274 hss.satisfied_signals);
275 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
276 hss.satisfiable_signals);
262 277
263 // Read from |d0|. 278 // Read from |d0|.
264 buffer[0] = 0; 279 buffer[0] = 0;
265 buffer_size = kBufferSize; 280 buffer_size = kBufferSize;
266 EXPECT_EQ(MOJO_RESULT_OK, 281 EXPECT_EQ(MOJO_RESULT_OK,
267 d0->ReadMessage(UserPointer<void>(buffer), 282 d0->ReadMessage(UserPointer<void>(buffer),
268 MakeUserPointer(&buffer_size), 0, nullptr, 283 MakeUserPointer(&buffer_size), 0, nullptr,
269 MOJO_READ_MESSAGE_FLAG_NONE)); 284 MOJO_READ_MESSAGE_FLAG_NONE));
270 EXPECT_EQ(kBufferSize, buffer_size); 285 EXPECT_EQ(kBufferSize, buffer_size);
271 EXPECT_EQ(123456789, buffer[0]); 286 EXPECT_EQ(123456789, buffer[0]);
272 287
273 // Try waiting for readable on |d0|; should fail (already satisfied). 288 // Try waiting for readable on |d0|; should fail (already satisfied).
274 w.Init(); 289 w.Init();
275 hss = HandleSignalsState(); 290 hss = HandleSignalsState();
276 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, 291 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
277 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 2, &hss)); 292 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 2, &hss));
278 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 293 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
279 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 294 hss.satisfied_signals);
295 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
296 hss.satisfiable_signals);
280 297
281 // Read again from |d0|. 298 // Read again from |d0|.
282 buffer[0] = 0; 299 buffer[0] = 0;
283 buffer_size = kBufferSize; 300 buffer_size = kBufferSize;
284 EXPECT_EQ(MOJO_RESULT_OK, 301 EXPECT_EQ(MOJO_RESULT_OK,
285 d0->ReadMessage(UserPointer<void>(buffer), 302 d0->ReadMessage(UserPointer<void>(buffer),
286 MakeUserPointer(&buffer_size), 0, nullptr, 303 MakeUserPointer(&buffer_size), 0, nullptr,
287 MOJO_READ_MESSAGE_FLAG_NONE)); 304 MOJO_READ_MESSAGE_FLAG_NONE));
288 EXPECT_EQ(kBufferSize, buffer_size); 305 EXPECT_EQ(kBufferSize, buffer_size);
289 EXPECT_EQ(234567890, buffer[0]); 306 EXPECT_EQ(234567890, buffer[0]);
290 307
291 // Try waiting for readable on |d0|; should fail (unsatisfiable). 308 // Try waiting for readable on |d0|; should fail (unsatisfiable).
292 w.Init(); 309 w.Init();
293 hss = HandleSignalsState(); 310 hss = HandleSignalsState();
294 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 311 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
295 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 3, &hss)); 312 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 3, &hss));
296 EXPECT_EQ(0u, hss.satisfied_signals); 313 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
297 EXPECT_EQ(0u, hss.satisfiable_signals); 314 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
298 315
299 // Try waiting for writable on |d0|; should fail (unsatisfiable). 316 // Try waiting for writable on |d0|; should fail (unsatisfiable).
300 w.Init(); 317 w.Init();
301 hss = HandleSignalsState(); 318 hss = HandleSignalsState();
302 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 319 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
303 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 4, &hss)); 320 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 4, &hss));
304 EXPECT_EQ(0u, hss.satisfied_signals); 321 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
305 EXPECT_EQ(0u, hss.satisfiable_signals); 322 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
306 323
307 // Try reading from |d0|; should fail (nothing to read and other end 324 // Try reading from |d0|; should fail (nothing to read and other end
308 // closed). 325 // closed).
309 buffer[0] = 0; 326 buffer[0] = 0;
310 buffer_size = kBufferSize; 327 buffer_size = kBufferSize;
311 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 328 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
312 d0->ReadMessage(UserPointer<void>(buffer), 329 d0->ReadMessage(UserPointer<void>(buffer),
313 MakeUserPointer(&buffer_size), 0, nullptr, 330 MakeUserPointer(&buffer_size), 0, nullptr,
314 MOJO_READ_MESSAGE_FLAG_NONE)); 331 MOJO_READ_MESSAGE_FLAG_NONE));
315 332
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
367 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); 384 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE));
368 } // Joins the thread. 385 } // Joins the thread.
369 elapsed = stopwatch.Elapsed(); 386 elapsed = stopwatch.Elapsed();
370 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); 387 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout());
371 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); 388 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout());
372 EXPECT_TRUE(did_wait); 389 EXPECT_TRUE(did_wait);
373 EXPECT_EQ(MOJO_RESULT_OK, result); 390 EXPECT_EQ(MOJO_RESULT_OK, result);
374 EXPECT_EQ(1u, context); 391 EXPECT_EQ(1u, context);
375 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 392 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
376 hss.satisfied_signals); 393 hss.satisfied_signals);
377 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 394 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
378 hss.satisfiable_signals);
379 395
380 // Now |d1| is already readable. Try waiting for it again. 396 // Now |d1| is already readable. Try waiting for it again.
381 { 397 {
382 test::WaiterThread thread(d1, MOJO_HANDLE_SIGNAL_READABLE, 398 test::WaiterThread thread(d1, MOJO_HANDLE_SIGNAL_READABLE,
383 MOJO_DEADLINE_INDEFINITE, 2, &did_wait, &result, 399 MOJO_DEADLINE_INDEFINITE, 2, &did_wait, &result,
384 &context, &hss); 400 &context, &hss);
385 stopwatch.Start(); 401 stopwatch.Start();
386 thread.Start(); 402 thread.Start();
387 } // Joins the thread. 403 } // Joins the thread.
388 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); 404 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout());
389 EXPECT_FALSE(did_wait); 405 EXPECT_FALSE(did_wait);
390 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, result); 406 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, result);
391 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 407 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
392 hss.satisfied_signals); 408 hss.satisfied_signals);
393 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 409 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
394 hss.satisfiable_signals);
395 410
396 // Consume what we wrote to |d0|. 411 // Consume what we wrote to |d0|.
397 buffer[0] = 0; 412 buffer[0] = 0;
398 buffer_size = kBufferSize; 413 buffer_size = kBufferSize;
399 EXPECT_EQ(MOJO_RESULT_OK, 414 EXPECT_EQ(MOJO_RESULT_OK,
400 d1->ReadMessage(UserPointer<void>(buffer), 415 d1->ReadMessage(UserPointer<void>(buffer),
401 MakeUserPointer(&buffer_size), 0, nullptr, 416 MakeUserPointer(&buffer_size), 0, nullptr,
402 MOJO_READ_MESSAGE_FLAG_NONE)); 417 MOJO_READ_MESSAGE_FLAG_NONE));
403 EXPECT_EQ(kBufferSize, buffer_size); 418 EXPECT_EQ(kBufferSize, buffer_size);
404 EXPECT_EQ(123456789, buffer[0]); 419 EXPECT_EQ(123456789, buffer[0]);
405 420
406 // Wait for readable on |d1| and close |d0| after some time, which should 421 // Wait for readable on |d1| and close |d0| after some time, which should
407 // cancel that wait. 422 // cancel that wait.
408 { 423 {
409 test::WaiterThread thread(d1, MOJO_HANDLE_SIGNAL_READABLE, 424 test::WaiterThread thread(d1, MOJO_HANDLE_SIGNAL_READABLE,
410 MOJO_DEADLINE_INDEFINITE, 3, &did_wait, &result, 425 MOJO_DEADLINE_INDEFINITE, 3, &did_wait, &result,
411 &context, &hss); 426 &context, &hss);
412 stopwatch.Start(); 427 stopwatch.Start();
413 thread.Start(); 428 thread.Start();
414 base::PlatformThread::Sleep(2 * test::EpsilonTimeout()); 429 base::PlatformThread::Sleep(2 * test::EpsilonTimeout());
415 EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); 430 EXPECT_EQ(MOJO_RESULT_OK, d0->Close());
416 } // Joins the thread. 431 } // Joins the thread.
417 elapsed = stopwatch.Elapsed(); 432 elapsed = stopwatch.Elapsed();
418 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); 433 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout());
419 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); 434 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout());
420 EXPECT_TRUE(did_wait); 435 EXPECT_TRUE(did_wait);
421 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); 436 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
422 EXPECT_EQ(3u, context); 437 EXPECT_EQ(3u, context);
423 EXPECT_EQ(0u, hss.satisfied_signals); 438 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
424 EXPECT_EQ(0u, hss.satisfiable_signals); 439 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
425 440
426 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); 441 EXPECT_EQ(MOJO_RESULT_OK, d1->Close());
427 } 442 }
428 443
429 for (unsigned i = 0; i < 2; i++) { 444 for (unsigned i = 0; i < 2; i++) {
430 scoped_refptr<MessagePipeDispatcher> d0(new MessagePipeDispatcher( 445 scoped_refptr<MessagePipeDispatcher> d0(new MessagePipeDispatcher(
431 MessagePipeDispatcher::kDefaultCreateOptions)); 446 MessagePipeDispatcher::kDefaultCreateOptions));
432 scoped_refptr<MessagePipeDispatcher> d1(new MessagePipeDispatcher( 447 scoped_refptr<MessagePipeDispatcher> d1(new MessagePipeDispatcher(
433 MessagePipeDispatcher::kDefaultCreateOptions)); 448 MessagePipeDispatcher::kDefaultCreateOptions));
434 { 449 {
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
667 EXPECT_EQ(total_messages_written, total_messages_read); 682 EXPECT_EQ(total_messages_written, total_messages_read);
668 EXPECT_EQ(total_bytes_written, total_bytes_read); 683 EXPECT_EQ(total_bytes_written, total_bytes_read);
669 684
670 EXPECT_EQ(MOJO_RESULT_OK, d_write->Close()); 685 EXPECT_EQ(MOJO_RESULT_OK, d_write->Close());
671 EXPECT_EQ(MOJO_RESULT_OK, d_read->Close()); 686 EXPECT_EQ(MOJO_RESULT_OK, d_read->Close());
672 } 687 }
673 688
674 } // namespace 689 } // namespace
675 } // namespace system 690 } // namespace system
676 } // namespace mojo 691 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/edk/system/local_message_pipe_endpoint.cc ('k') | mojo/edk/system/message_pipe_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698