OLD | NEW |
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/system/message_pipe_dispatcher.h" | 10 #include "mojo/system/message_pipe_dispatcher.h" |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
75 // Try adding a readable waiter when already readable (from above). | 75 // Try adding a readable waiter when already readable (from above). |
76 w.Init(); | 76 w.Init(); |
77 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 77 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
78 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 2)); | 78 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 2)); |
79 // Shouldn't need to remove the waiter (it was not added). | 79 // Shouldn't need to remove the waiter (it was not added). |
80 | 80 |
81 // Make |d0| no longer readable (by reading from it). | 81 // Make |d0| no longer readable (by reading from it). |
82 buffer[0] = 0; | 82 buffer[0] = 0; |
83 buffer_size = kBufferSize; | 83 buffer_size = kBufferSize; |
84 EXPECT_EQ(MOJO_RESULT_OK, | 84 EXPECT_EQ(MOJO_RESULT_OK, |
85 d0->ReadMessage(buffer, &buffer_size, | 85 d0->ReadMessage(UserPointer<void>(buffer), |
86 0, NULL, | 86 MakeUserPointer(&buffer_size), 0, NULL, |
87 MOJO_READ_MESSAGE_FLAG_NONE)); | 87 MOJO_READ_MESSAGE_FLAG_NONE)); |
88 EXPECT_EQ(kBufferSize, buffer_size); | 88 EXPECT_EQ(kBufferSize, buffer_size); |
89 EXPECT_EQ(123456789, buffer[0]); | 89 EXPECT_EQ(123456789, buffer[0]); |
90 | 90 |
91 // Wait for zero time for readability on |d0| (will time out). | 91 // Wait for zero time for readability on |d0| (will time out). |
92 w.Init(); | 92 w.Init(); |
93 ASSERT_EQ(MOJO_RESULT_OK, | 93 ASSERT_EQ(MOJO_RESULT_OK, |
94 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 3)); | 94 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 3)); |
95 stopwatch.Start(); | 95 stopwatch.Start(); |
96 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, NULL)); | 96 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, NULL)); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
132 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 132 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
133 d0->WriteMessage(NULL, 1, | 133 d0->WriteMessage(NULL, 1, |
134 NULL, | 134 NULL, |
135 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 135 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
136 // Huge buffer size. | 136 // Huge buffer size. |
137 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, | 137 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, |
138 d0->WriteMessage(buffer, std::numeric_limits<uint32_t>::max(), | 138 d0->WriteMessage(buffer, std::numeric_limits<uint32_t>::max(), |
139 NULL, | 139 NULL, |
140 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 140 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
141 | 141 |
142 // |ReadMessage|: | |
143 // Null buffer with nonzero buffer size. | |
144 uint32_t buffer_size = 1; | |
145 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | |
146 d0->ReadMessage(NULL, &buffer_size, | |
147 0, NULL, | |
148 MOJO_READ_MESSAGE_FLAG_NONE)); | |
149 | |
150 EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); | 142 EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); |
151 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); | 143 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); |
152 } | 144 } |
153 | 145 |
154 // Test what happens when one end is closed (single-threaded test). | 146 // Test what happens when one end is closed (single-threaded test). |
155 TEST(MessagePipeDispatcherTest, BasicClosed) { | 147 TEST(MessagePipeDispatcherTest, BasicClosed) { |
156 int32_t buffer[1]; | 148 int32_t buffer[1]; |
157 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); | 149 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); |
158 uint32_t buffer_size; | 150 uint32_t buffer_size; |
159 | 151 |
(...skipping 24 matching lines...) Expand all Loading... |
184 | 176 |
185 // Try waiting for readable on |d0|; should fail (already satisfied). | 177 // Try waiting for readable on |d0|; should fail (already satisfied). |
186 w.Init(); | 178 w.Init(); |
187 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 179 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
188 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 0)); | 180 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 0)); |
189 | 181 |
190 // Try reading from |d1|; should fail (nothing to read). | 182 // Try reading from |d1|; should fail (nothing to read). |
191 buffer[0] = 0; | 183 buffer[0] = 0; |
192 buffer_size = kBufferSize; | 184 buffer_size = kBufferSize; |
193 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 185 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
194 d1->ReadMessage(buffer, &buffer_size, | 186 d1->ReadMessage(UserPointer<void>(buffer), |
195 0, NULL, | 187 MakeUserPointer(&buffer_size), 0, NULL, |
196 MOJO_READ_MESSAGE_FLAG_NONE)); | 188 MOJO_READ_MESSAGE_FLAG_NONE)); |
197 | 189 |
198 // Close |d1|. | 190 // Close |d1|. |
199 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); | 191 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); |
200 | 192 |
201 // Try waiting for readable on |d0|; should fail (already satisfied). | 193 // Try waiting for readable on |d0|; should fail (already satisfied). |
202 w.Init(); | 194 w.Init(); |
203 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 195 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
204 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 1)); | 196 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 1)); |
205 | 197 |
206 // Read from |d0|. | 198 // Read from |d0|. |
207 buffer[0] = 0; | 199 buffer[0] = 0; |
208 buffer_size = kBufferSize; | 200 buffer_size = kBufferSize; |
209 EXPECT_EQ(MOJO_RESULT_OK, | 201 EXPECT_EQ(MOJO_RESULT_OK, |
210 d0->ReadMessage(buffer, &buffer_size, | 202 d0->ReadMessage(UserPointer<void>(buffer), |
211 0, NULL, | 203 MakeUserPointer(&buffer_size), 0, NULL, |
212 MOJO_READ_MESSAGE_FLAG_NONE)); | 204 MOJO_READ_MESSAGE_FLAG_NONE)); |
213 EXPECT_EQ(kBufferSize, buffer_size); | 205 EXPECT_EQ(kBufferSize, buffer_size); |
214 EXPECT_EQ(123456789, buffer[0]); | 206 EXPECT_EQ(123456789, buffer[0]); |
215 | 207 |
216 // Try waiting for readable on |d0|; should fail (already satisfied). | 208 // Try waiting for readable on |d0|; should fail (already satisfied). |
217 w.Init(); | 209 w.Init(); |
218 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 210 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
219 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 2)); | 211 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 2)); |
220 | 212 |
221 // Read again from |d0|. | 213 // Read again from |d0|. |
222 buffer[0] = 0; | 214 buffer[0] = 0; |
223 buffer_size = kBufferSize; | 215 buffer_size = kBufferSize; |
224 EXPECT_EQ(MOJO_RESULT_OK, | 216 EXPECT_EQ(MOJO_RESULT_OK, |
225 d0->ReadMessage(buffer, &buffer_size, | 217 d0->ReadMessage(UserPointer<void>(buffer), |
226 0, NULL, | 218 MakeUserPointer(&buffer_size), 0, NULL, |
227 MOJO_READ_MESSAGE_FLAG_NONE)); | 219 MOJO_READ_MESSAGE_FLAG_NONE)); |
228 EXPECT_EQ(kBufferSize, buffer_size); | 220 EXPECT_EQ(kBufferSize, buffer_size); |
229 EXPECT_EQ(234567890, buffer[0]); | 221 EXPECT_EQ(234567890, buffer[0]); |
230 | 222 |
231 // Try waiting for readable on |d0|; should fail (unsatisfiable). | 223 // Try waiting for readable on |d0|; should fail (unsatisfiable). |
232 w.Init(); | 224 w.Init(); |
233 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 225 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
234 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 3)); | 226 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 3)); |
235 | 227 |
236 // Try waiting for writable on |d0|; should fail (unsatisfiable). | 228 // Try waiting for writable on |d0|; should fail (unsatisfiable). |
237 w.Init(); | 229 w.Init(); |
238 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 230 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
239 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 4)); | 231 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 4)); |
240 | 232 |
241 // Try reading from |d0|; should fail (nothing to read and other end | 233 // Try reading from |d0|; should fail (nothing to read and other end |
242 // closed). | 234 // closed). |
243 buffer[0] = 0; | 235 buffer[0] = 0; |
244 buffer_size = kBufferSize; | 236 buffer_size = kBufferSize; |
245 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 237 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
246 d0->ReadMessage(buffer, &buffer_size, | 238 d0->ReadMessage(UserPointer<void>(buffer), |
247 0, NULL, | 239 MakeUserPointer(&buffer_size), 0, NULL, |
248 MOJO_READ_MESSAGE_FLAG_NONE)); | 240 MOJO_READ_MESSAGE_FLAG_NONE)); |
249 | 241 |
250 // Try writing to |d0|; should fail (other end closed). | 242 // Try writing to |d0|; should fail (other end closed). |
251 buffer[0] = 345678901; | 243 buffer[0] = 345678901; |
252 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 244 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
253 d0->WriteMessage(buffer, kBufferSize, | 245 d0->WriteMessage(buffer, kBufferSize, |
254 NULL, | 246 NULL, |
255 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 247 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
256 | 248 |
257 EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); | 249 EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
321 thread.Start(); | 313 thread.Start(); |
322 } // Joins the thread. | 314 } // Joins the thread. |
323 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); | 315 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); |
324 EXPECT_FALSE(did_wait); | 316 EXPECT_FALSE(did_wait); |
325 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, result); | 317 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, result); |
326 | 318 |
327 // Consume what we wrote to |d0|. | 319 // Consume what we wrote to |d0|. |
328 buffer[0] = 0; | 320 buffer[0] = 0; |
329 buffer_size = kBufferSize; | 321 buffer_size = kBufferSize; |
330 EXPECT_EQ(MOJO_RESULT_OK, | 322 EXPECT_EQ(MOJO_RESULT_OK, |
331 d1->ReadMessage(buffer, &buffer_size, | 323 d1->ReadMessage(UserPointer<void>(buffer), |
332 0, NULL, | 324 MakeUserPointer(&buffer_size), 0, NULL, |
333 MOJO_READ_MESSAGE_FLAG_NONE)); | 325 MOJO_READ_MESSAGE_FLAG_NONE)); |
334 EXPECT_EQ(kBufferSize, buffer_size); | 326 EXPECT_EQ(kBufferSize, buffer_size); |
335 EXPECT_EQ(123456789, buffer[0]); | 327 EXPECT_EQ(123456789, buffer[0]); |
336 | 328 |
337 // Wait for readable on |d1| and close |d0| after some time, which should | 329 // Wait for readable on |d1| and close |d0| after some time, which should |
338 // cancel that wait. | 330 // cancel that wait. |
339 { | 331 { |
340 test::WaiterThread thread(d1, | 332 test::WaiterThread thread(d1, |
341 MOJO_HANDLE_SIGNAL_READABLE, | 333 MOJO_HANDLE_SIGNAL_READABLE, |
342 MOJO_DEADLINE_INDEFINITE, | 334 MOJO_DEADLINE_INDEFINITE, |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
482 if (result == MOJO_RESULT_OK) { | 474 if (result == MOJO_RESULT_OK) { |
483 // Actually need to wait. | 475 // Actually need to wait. |
484 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, NULL)); | 476 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, NULL)); |
485 read_dispatcher_->RemoveWaiter(&w); | 477 read_dispatcher_->RemoveWaiter(&w); |
486 } | 478 } |
487 | 479 |
488 // Now, try to do the read. | 480 // Now, try to do the read. |
489 // Clear the buffer so that we can check the result. | 481 // Clear the buffer so that we can check the result. |
490 memset(buffer, 0, sizeof(buffer)); | 482 memset(buffer, 0, sizeof(buffer)); |
491 uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer)); | 483 uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer)); |
492 result = read_dispatcher_->ReadMessage(buffer, &buffer_size, | 484 result = read_dispatcher_->ReadMessage(UserPointer<void>(buffer), |
493 0, NULL, | 485 MakeUserPointer(&buffer_size), 0, |
494 MOJO_READ_MESSAGE_FLAG_NONE); | 486 NULL, MOJO_READ_MESSAGE_FLAG_NONE); |
495 EXPECT_TRUE(result == MOJO_RESULT_OK || | 487 EXPECT_TRUE(result == MOJO_RESULT_OK || |
496 result == MOJO_RESULT_SHOULD_WAIT) << "result: " << result; | 488 result == MOJO_RESULT_SHOULD_WAIT) << "result: " << result; |
497 // We're racing with others to read, so maybe we failed. | 489 // We're racing with others to read, so maybe we failed. |
498 if (result == MOJO_RESULT_SHOULD_WAIT) | 490 if (result == MOJO_RESULT_SHOULD_WAIT) |
499 continue; // In which case, try again. | 491 continue; // In which case, try again. |
500 // Check for quit. | 492 // Check for quit. |
501 if (buffer_size == 4 && memcmp("quit", buffer, 4) == 0) | 493 if (buffer_size == 4 && memcmp("quit", buffer, 4) == 0) |
502 return; | 494 return; |
503 EXPECT_GE(buffer_size, 1u); | 495 EXPECT_GE(buffer_size, 1u); |
504 EXPECT_LE(buffer_size, kMaxMessageSize); | 496 EXPECT_LE(buffer_size, kMaxMessageSize); |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
595 EXPECT_EQ(total_messages_written, total_messages_read); | 587 EXPECT_EQ(total_messages_written, total_messages_read); |
596 EXPECT_EQ(total_bytes_written, total_bytes_read); | 588 EXPECT_EQ(total_bytes_written, total_bytes_read); |
597 | 589 |
598 EXPECT_EQ(MOJO_RESULT_OK, d_write->Close()); | 590 EXPECT_EQ(MOJO_RESULT_OK, d_write->Close()); |
599 EXPECT_EQ(MOJO_RESULT_OK, d_read->Close()); | 591 EXPECT_EQ(MOJO_RESULT_OK, d_read->Close()); |
600 } | 592 } |
601 | 593 |
602 } // namespace | 594 } // namespace |
603 } // namespace system | 595 } // namespace system |
604 } // namespace mojo | 596 } // namespace mojo |
OLD | NEW |