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

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: 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_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);
133 132
134 EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); 133 EXPECT_EQ(MOJO_RESULT_OK, d0->Close());
135 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); 134 EXPECT_EQ(MOJO_RESULT_OK, d1->Close());
136 } 135 }
137 } 136 }
138 137
139 TEST(MessagePipeDispatcherTest, InvalidParams) { 138 TEST(MessagePipeDispatcherTest, InvalidParams) {
140 char buffer[1]; 139 char buffer[1];
141 140
142 scoped_refptr<MessagePipeDispatcher> d0( 141 scoped_refptr<MessagePipeDispatcher> d0(
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
231 d1->WriteMessage(UserPointer<const void>(buffer), kBufferSize, 230 d1->WriteMessage(UserPointer<const void>(buffer), kBufferSize,
232 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); 231 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE));
233 232
234 // Try waiting for readable on |d0|; should fail (already satisfied). 233 // Try waiting for readable on |d0|; should fail (already satisfied).
235 w.Init(); 234 w.Init();
236 hss = HandleSignalsState(); 235 hss = HandleSignalsState();
237 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, 236 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
238 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); 237 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss));
239 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 238 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
240 hss.satisfied_signals); 239 hss.satisfied_signals);
241 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 240 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
242 hss.satisfiable_signals);
243 241
244 // Try reading from |d1|; should fail (nothing to read). 242 // Try reading from |d1|; should fail (nothing to read).
245 buffer[0] = 0; 243 buffer[0] = 0;
246 buffer_size = kBufferSize; 244 buffer_size = kBufferSize;
247 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, 245 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT,
248 d1->ReadMessage(UserPointer<void>(buffer), 246 d1->ReadMessage(UserPointer<void>(buffer),
249 MakeUserPointer(&buffer_size), 0, nullptr, 247 MakeUserPointer(&buffer_size), 0, nullptr,
250 MOJO_READ_MESSAGE_FLAG_NONE)); 248 MOJO_READ_MESSAGE_FLAG_NONE));
251 249
252 // Close |d1|. 250 // Close |d1|.
253 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); 251 EXPECT_EQ(MOJO_RESULT_OK, d1->Close());
254 252
255 // Try waiting for readable on |d0|; should fail (already satisfied). 253 // Try waiting for readable on |d0|; should fail (already satisfied).
256 w.Init(); 254 w.Init();
257 hss = HandleSignalsState(); 255 hss = HandleSignalsState();
258 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, 256 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
259 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 1, &hss)); 257 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 1, &hss));
260 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 258 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED,
261 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 259 hss.satisfied_signals);
260 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED,
261 hss.satisfiable_signals);
262 262
263 // Read from |d0|. 263 // Read from |d0|.
264 buffer[0] = 0; 264 buffer[0] = 0;
265 buffer_size = kBufferSize; 265 buffer_size = kBufferSize;
266 EXPECT_EQ(MOJO_RESULT_OK, 266 EXPECT_EQ(MOJO_RESULT_OK,
267 d0->ReadMessage(UserPointer<void>(buffer), 267 d0->ReadMessage(UserPointer<void>(buffer),
268 MakeUserPointer(&buffer_size), 0, nullptr, 268 MakeUserPointer(&buffer_size), 0, nullptr,
269 MOJO_READ_MESSAGE_FLAG_NONE)); 269 MOJO_READ_MESSAGE_FLAG_NONE));
270 EXPECT_EQ(kBufferSize, buffer_size); 270 EXPECT_EQ(kBufferSize, buffer_size);
271 EXPECT_EQ(123456789, buffer[0]); 271 EXPECT_EQ(123456789, buffer[0]);
272 272
273 // Try waiting for readable on |d0|; should fail (already satisfied). 273 // Try waiting for readable on |d0|; should fail (already satisfied).
274 w.Init(); 274 w.Init();
275 hss = HandleSignalsState(); 275 hss = HandleSignalsState();
276 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, 276 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
277 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 2, &hss)); 277 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 2, &hss));
278 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 278 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED,
279 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 279 hss.satisfied_signals);
280 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED,
281 hss.satisfiable_signals);
280 282
281 // Read again from |d0|. 283 // Read again from |d0|.
282 buffer[0] = 0; 284 buffer[0] = 0;
283 buffer_size = kBufferSize; 285 buffer_size = kBufferSize;
284 EXPECT_EQ(MOJO_RESULT_OK, 286 EXPECT_EQ(MOJO_RESULT_OK,
285 d0->ReadMessage(UserPointer<void>(buffer), 287 d0->ReadMessage(UserPointer<void>(buffer),
286 MakeUserPointer(&buffer_size), 0, nullptr, 288 MakeUserPointer(&buffer_size), 0, nullptr,
287 MOJO_READ_MESSAGE_FLAG_NONE)); 289 MOJO_READ_MESSAGE_FLAG_NONE));
288 EXPECT_EQ(kBufferSize, buffer_size); 290 EXPECT_EQ(kBufferSize, buffer_size);
289 EXPECT_EQ(234567890, buffer[0]); 291 EXPECT_EQ(234567890, buffer[0]);
290 292
291 // Try waiting for readable on |d0|; should fail (unsatisfiable). 293 // Try waiting for readable on |d0|; should fail (unsatisfiable).
292 w.Init(); 294 w.Init();
293 hss = HandleSignalsState(); 295 hss = HandleSignalsState();
294 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 296 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
295 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 3, &hss)); 297 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 3, &hss));
296 EXPECT_EQ(0u, hss.satisfied_signals); 298 EXPECT_EQ(MOJO_HANDLE_SIGNAL_CLOSED, hss.satisfied_signals);
297 EXPECT_EQ(0u, hss.satisfiable_signals); 299 EXPECT_EQ(MOJO_HANDLE_SIGNAL_CLOSED, hss.satisfiable_signals);
298 300
299 // Try waiting for writable on |d0|; should fail (unsatisfiable). 301 // Try waiting for writable on |d0|; should fail (unsatisfiable).
300 w.Init(); 302 w.Init();
301 hss = HandleSignalsState(); 303 hss = HandleSignalsState();
302 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 304 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
303 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 4, &hss)); 305 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 4, &hss));
304 EXPECT_EQ(0u, hss.satisfied_signals); 306 EXPECT_EQ(MOJO_HANDLE_SIGNAL_CLOSED, hss.satisfied_signals);
305 EXPECT_EQ(0u, hss.satisfiable_signals); 307 EXPECT_EQ(MOJO_HANDLE_SIGNAL_CLOSED, hss.satisfiable_signals);
306 308
307 // Try reading from |d0|; should fail (nothing to read and other end 309 // Try reading from |d0|; should fail (nothing to read and other end
308 // closed). 310 // closed).
309 buffer[0] = 0; 311 buffer[0] = 0;
310 buffer_size = kBufferSize; 312 buffer_size = kBufferSize;
311 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 313 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
312 d0->ReadMessage(UserPointer<void>(buffer), 314 d0->ReadMessage(UserPointer<void>(buffer),
313 MakeUserPointer(&buffer_size), 0, nullptr, 315 MakeUserPointer(&buffer_size), 0, nullptr,
314 MOJO_READ_MESSAGE_FLAG_NONE)); 316 MOJO_READ_MESSAGE_FLAG_NONE));
315 317
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
367 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); 369 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE));
368 } // Joins the thread. 370 } // Joins the thread.
369 elapsed = stopwatch.Elapsed(); 371 elapsed = stopwatch.Elapsed();
370 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); 372 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout());
371 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); 373 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout());
372 EXPECT_TRUE(did_wait); 374 EXPECT_TRUE(did_wait);
373 EXPECT_EQ(MOJO_RESULT_OK, result); 375 EXPECT_EQ(MOJO_RESULT_OK, result);
374 EXPECT_EQ(1u, context); 376 EXPECT_EQ(1u, context);
375 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 377 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
376 hss.satisfied_signals); 378 hss.satisfied_signals);
377 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 379 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
378 hss.satisfiable_signals);
379 380
380 // Now |d1| is already readable. Try waiting for it again. 381 // Now |d1| is already readable. Try waiting for it again.
381 { 382 {
382 test::WaiterThread thread(d1, MOJO_HANDLE_SIGNAL_READABLE, 383 test::WaiterThread thread(d1, MOJO_HANDLE_SIGNAL_READABLE,
383 MOJO_DEADLINE_INDEFINITE, 2, &did_wait, &result, 384 MOJO_DEADLINE_INDEFINITE, 2, &did_wait, &result,
384 &context, &hss); 385 &context, &hss);
385 stopwatch.Start(); 386 stopwatch.Start();
386 thread.Start(); 387 thread.Start();
387 } // Joins the thread. 388 } // Joins the thread.
388 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); 389 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout());
389 EXPECT_FALSE(did_wait); 390 EXPECT_FALSE(did_wait);
390 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, result); 391 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, result);
391 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 392 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
392 hss.satisfied_signals); 393 hss.satisfied_signals);
393 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 394 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
394 hss.satisfiable_signals);
395 395
396 // Consume what we wrote to |d0|. 396 // Consume what we wrote to |d0|.
397 buffer[0] = 0; 397 buffer[0] = 0;
398 buffer_size = kBufferSize; 398 buffer_size = kBufferSize;
399 EXPECT_EQ(MOJO_RESULT_OK, 399 EXPECT_EQ(MOJO_RESULT_OK,
400 d1->ReadMessage(UserPointer<void>(buffer), 400 d1->ReadMessage(UserPointer<void>(buffer),
401 MakeUserPointer(&buffer_size), 0, nullptr, 401 MakeUserPointer(&buffer_size), 0, nullptr,
402 MOJO_READ_MESSAGE_FLAG_NONE)); 402 MOJO_READ_MESSAGE_FLAG_NONE));
403 EXPECT_EQ(kBufferSize, buffer_size); 403 EXPECT_EQ(kBufferSize, buffer_size);
404 EXPECT_EQ(123456789, buffer[0]); 404 EXPECT_EQ(123456789, buffer[0]);
405 405
406 // Wait for readable on |d1| and close |d0| after some time, which should 406 // Wait for readable on |d1| and close |d0| after some time, which should
407 // cancel that wait. 407 // cancel that wait.
408 { 408 {
409 test::WaiterThread thread(d1, MOJO_HANDLE_SIGNAL_READABLE, 409 test::WaiterThread thread(d1, MOJO_HANDLE_SIGNAL_READABLE,
410 MOJO_DEADLINE_INDEFINITE, 3, &did_wait, &result, 410 MOJO_DEADLINE_INDEFINITE, 3, &did_wait, &result,
411 &context, &hss); 411 &context, &hss);
412 stopwatch.Start(); 412 stopwatch.Start();
413 thread.Start(); 413 thread.Start();
414 base::PlatformThread::Sleep(2 * test::EpsilonTimeout()); 414 base::PlatformThread::Sleep(2 * test::EpsilonTimeout());
415 EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); 415 EXPECT_EQ(MOJO_RESULT_OK, d0->Close());
416 } // Joins the thread. 416 } // Joins the thread.
417 elapsed = stopwatch.Elapsed(); 417 elapsed = stopwatch.Elapsed();
418 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); 418 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout());
419 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); 419 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout());
420 EXPECT_TRUE(did_wait); 420 EXPECT_TRUE(did_wait);
421 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); 421 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
422 EXPECT_EQ(3u, context); 422 EXPECT_EQ(3u, context);
423 EXPECT_EQ(0u, hss.satisfied_signals); 423 EXPECT_EQ(MOJO_HANDLE_SIGNAL_CLOSED, hss.satisfied_signals);
424 EXPECT_EQ(0u, hss.satisfiable_signals); 424 EXPECT_EQ(MOJO_HANDLE_SIGNAL_CLOSED, hss.satisfiable_signals);
425 425
426 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); 426 EXPECT_EQ(MOJO_RESULT_OK, d1->Close());
427 } 427 }
428 428
429 for (unsigned i = 0; i < 2; i++) { 429 for (unsigned i = 0; i < 2; i++) {
430 scoped_refptr<MessagePipeDispatcher> d0(new MessagePipeDispatcher( 430 scoped_refptr<MessagePipeDispatcher> d0(new MessagePipeDispatcher(
431 MessagePipeDispatcher::kDefaultCreateOptions)); 431 MessagePipeDispatcher::kDefaultCreateOptions));
432 scoped_refptr<MessagePipeDispatcher> d1(new MessagePipeDispatcher( 432 scoped_refptr<MessagePipeDispatcher> d1(new MessagePipeDispatcher(
433 MessagePipeDispatcher::kDefaultCreateOptions)); 433 MessagePipeDispatcher::kDefaultCreateOptions));
434 { 434 {
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
667 EXPECT_EQ(total_messages_written, total_messages_read); 667 EXPECT_EQ(total_messages_written, total_messages_read);
668 EXPECT_EQ(total_bytes_written, total_bytes_read); 668 EXPECT_EQ(total_bytes_written, total_bytes_read);
669 669
670 EXPECT_EQ(MOJO_RESULT_OK, d_write->Close()); 670 EXPECT_EQ(MOJO_RESULT_OK, d_write->Close());
671 EXPECT_EQ(MOJO_RESULT_OK, d_read->Close()); 671 EXPECT_EQ(MOJO_RESULT_OK, d_read->Close());
672 } 672 }
673 673
674 } // namespace 674 } // namespace
675 } // namespace system 675 } // namespace system
676 } // namespace mojo 676 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698