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 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
56 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 0)); | 56 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 0)); |
57 // Shouldn't need to remove the waiter (it was not added). | 57 // Shouldn't need to remove the waiter (it was not added). |
58 | 58 |
59 // Add a readable waiter to |d0|, then make it readable (by writing to | 59 // Add a readable waiter to |d0|, then make it readable (by writing to |
60 // |d1|), then wait. | 60 // |d1|), then wait. |
61 w.Init(); | 61 w.Init(); |
62 ASSERT_EQ(MOJO_RESULT_OK, | 62 ASSERT_EQ(MOJO_RESULT_OK, |
63 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 1)); | 63 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 1)); |
64 buffer[0] = 123456789; | 64 buffer[0] = 123456789; |
65 EXPECT_EQ(MOJO_RESULT_OK, | 65 EXPECT_EQ(MOJO_RESULT_OK, |
66 d1->WriteMessage(buffer, kBufferSize, | 66 d1->WriteMessage(UserPointer<const void>(buffer), kBufferSize, |
67 NULL, | 67 NULL, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
68 MOJO_WRITE_MESSAGE_FLAG_NONE)); | |
69 stopwatch.Start(); | 68 stopwatch.Start(); |
70 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, &context)); | 69 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
71 EXPECT_EQ(1u, context); | 70 EXPECT_EQ(1u, context); |
72 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); | 71 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); |
73 d0->RemoveWaiter(&w); | 72 d0->RemoveWaiter(&w); |
74 | 73 |
75 // Try adding a readable waiter when already readable (from above). | 74 // Try adding a readable waiter when already readable (from above). |
76 w.Init(); | 75 w.Init(); |
77 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 76 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
78 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 2)); | 77 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 2)); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 MessagePipeDispatcher::kDefaultCreateOptions)); | 120 MessagePipeDispatcher::kDefaultCreateOptions)); |
122 scoped_refptr<MessagePipeDispatcher> d1(new MessagePipeDispatcher( | 121 scoped_refptr<MessagePipeDispatcher> d1(new MessagePipeDispatcher( |
123 MessagePipeDispatcher::kDefaultCreateOptions)); | 122 MessagePipeDispatcher::kDefaultCreateOptions)); |
124 { | 123 { |
125 scoped_refptr<MessagePipe> mp(new MessagePipe()); | 124 scoped_refptr<MessagePipe> mp(new MessagePipe()); |
126 d0->Init(mp, 0); | 125 d0->Init(mp, 0); |
127 d1->Init(mp, 1); | 126 d1->Init(mp, 1); |
128 } | 127 } |
129 | 128 |
130 // |WriteMessage|: | 129 // |WriteMessage|: |
| 130 // Huge buffer size. |
| 131 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, |
| 132 d0->WriteMessage(UserPointer<const void>(buffer), |
| 133 std::numeric_limits<uint32_t>::max(), NULL, |
| 134 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 135 |
| 136 EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); |
| 137 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); |
| 138 } |
| 139 |
| 140 // These test invalid arguments that should cause death if we're being paranoid |
| 141 // about checking arguments (which we would want to do if, e.g., we were in a |
| 142 // true "kernel" situation, but we might not want to do otherwise for |
| 143 // performance reasons). Probably blatant errors like passing in null pointers |
| 144 // (for required pointer arguments) will still cause death, but perhaps not |
| 145 // predictably. |
| 146 TEST(MessagePipeDispatcherTest, InvalidParamsDeath) { |
| 147 const char kMemoryCheckFailedRegex[] = "Check failed"; |
| 148 |
| 149 scoped_refptr<MessagePipeDispatcher> d0(new MessagePipeDispatcher( |
| 150 MessagePipeDispatcher::kDefaultCreateOptions)); |
| 151 scoped_refptr<MessagePipeDispatcher> d1(new MessagePipeDispatcher( |
| 152 MessagePipeDispatcher::kDefaultCreateOptions)); |
| 153 { |
| 154 scoped_refptr<MessagePipe> mp(new MessagePipe()); |
| 155 d0->Init(mp, 0); |
| 156 d1->Init(mp, 1); |
| 157 } |
| 158 |
| 159 // |WriteMessage|: |
131 // Null buffer with nonzero buffer size. | 160 // Null buffer with nonzero buffer size. |
132 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 161 EXPECT_DEATH_IF_SUPPORTED( |
133 d0->WriteMessage(NULL, 1, | 162 d0->WriteMessage(NullUserPointer(), 1, NULL, |
134 NULL, | 163 MOJO_WRITE_MESSAGE_FLAG_NONE), |
| 164 kMemoryCheckFailedRegex); |
| 165 |
| 166 // |ReadMessage|: |
| 167 // Null buffer with nonzero buffer size. |
| 168 // First write something so that we actually have something to read. |
| 169 EXPECT_EQ(MOJO_RESULT_OK, |
| 170 d1->WriteMessage(UserPointer<const void>("x"), 1, NULL, |
135 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 171 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
136 // Huge buffer size. | 172 uint32_t buffer_size = 1; |
137 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, | 173 EXPECT_DEATH_IF_SUPPORTED( |
138 d0->WriteMessage(buffer, std::numeric_limits<uint32_t>::max(), | 174 d0->ReadMessage(NullUserPointer(), MakeUserPointer(&buffer_size), 0, NULL, |
139 NULL, | 175 MOJO_READ_MESSAGE_FLAG_NONE), |
140 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 176 kMemoryCheckFailedRegex); |
141 | 177 |
142 EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); | 178 EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); |
143 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); | 179 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); |
144 } | 180 } |
145 | 181 |
146 // Test what happens when one end is closed (single-threaded test). | 182 // Test what happens when one end is closed (single-threaded test). |
147 TEST(MessagePipeDispatcherTest, BasicClosed) { | 183 TEST(MessagePipeDispatcherTest, BasicClosed) { |
148 int32_t buffer[1]; | 184 int32_t buffer[1]; |
149 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); | 185 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); |
150 uint32_t buffer_size; | 186 uint32_t buffer_size; |
151 | 187 |
152 // Run this test both with |d0| as port 0, |d1| as port 1 and vice versa. | 188 // Run this test both with |d0| as port 0, |d1| as port 1 and vice versa. |
153 for (unsigned i = 0; i < 2; i++) { | 189 for (unsigned i = 0; i < 2; i++) { |
154 scoped_refptr<MessagePipeDispatcher> d0(new MessagePipeDispatcher( | 190 scoped_refptr<MessagePipeDispatcher> d0(new MessagePipeDispatcher( |
155 MessagePipeDispatcher::kDefaultCreateOptions)); | 191 MessagePipeDispatcher::kDefaultCreateOptions)); |
156 scoped_refptr<MessagePipeDispatcher> d1(new MessagePipeDispatcher( | 192 scoped_refptr<MessagePipeDispatcher> d1(new MessagePipeDispatcher( |
157 MessagePipeDispatcher::kDefaultCreateOptions)); | 193 MessagePipeDispatcher::kDefaultCreateOptions)); |
158 { | 194 { |
159 scoped_refptr<MessagePipe> mp(new MessagePipe()); | 195 scoped_refptr<MessagePipe> mp(new MessagePipe()); |
160 d0->Init(mp, i); // 0, 1. | 196 d0->Init(mp, i); // 0, 1. |
161 d1->Init(mp, i ^ 1); // 1, 0. | 197 d1->Init(mp, i ^ 1); // 1, 0. |
162 } | 198 } |
163 Waiter w; | 199 Waiter w; |
164 | 200 |
165 // Write (twice) to |d1|. | 201 // Write (twice) to |d1|. |
166 buffer[0] = 123456789; | 202 buffer[0] = 123456789; |
167 EXPECT_EQ(MOJO_RESULT_OK, | 203 EXPECT_EQ(MOJO_RESULT_OK, |
168 d1->WriteMessage(buffer, kBufferSize, | 204 d1->WriteMessage(UserPointer<const void>(buffer), kBufferSize, |
169 NULL, | 205 NULL, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
170 MOJO_WRITE_MESSAGE_FLAG_NONE)); | |
171 buffer[0] = 234567890; | 206 buffer[0] = 234567890; |
172 EXPECT_EQ(MOJO_RESULT_OK, | 207 EXPECT_EQ(MOJO_RESULT_OK, |
173 d1->WriteMessage(buffer, kBufferSize, | 208 d1->WriteMessage(UserPointer<const void>(buffer), kBufferSize, |
174 NULL, | 209 NULL, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
175 MOJO_WRITE_MESSAGE_FLAG_NONE)); | |
176 | 210 |
177 // Try waiting for readable on |d0|; should fail (already satisfied). | 211 // Try waiting for readable on |d0|; should fail (already satisfied). |
178 w.Init(); | 212 w.Init(); |
179 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 213 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
180 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 0)); | 214 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 0)); |
181 | 215 |
182 // Try reading from |d1|; should fail (nothing to read). | 216 // Try reading from |d1|; should fail (nothing to read). |
183 buffer[0] = 0; | 217 buffer[0] = 0; |
184 buffer_size = kBufferSize; | 218 buffer_size = kBufferSize; |
185 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 219 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
235 buffer[0] = 0; | 269 buffer[0] = 0; |
236 buffer_size = kBufferSize; | 270 buffer_size = kBufferSize; |
237 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 271 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
238 d0->ReadMessage(UserPointer<void>(buffer), | 272 d0->ReadMessage(UserPointer<void>(buffer), |
239 MakeUserPointer(&buffer_size), 0, NULL, | 273 MakeUserPointer(&buffer_size), 0, NULL, |
240 MOJO_READ_MESSAGE_FLAG_NONE)); | 274 MOJO_READ_MESSAGE_FLAG_NONE)); |
241 | 275 |
242 // Try writing to |d0|; should fail (other end closed). | 276 // Try writing to |d0|; should fail (other end closed). |
243 buffer[0] = 345678901; | 277 buffer[0] = 345678901; |
244 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 278 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
245 d0->WriteMessage(buffer, kBufferSize, | 279 d0->WriteMessage(UserPointer<const void>(buffer), kBufferSize, |
246 NULL, | 280 NULL, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
247 MOJO_WRITE_MESSAGE_FLAG_NONE)); | |
248 | 281 |
249 EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); | 282 EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); |
250 } | 283 } |
251 } | 284 } |
252 | 285 |
253 #if defined(OS_WIN) | 286 #if defined(OS_WIN) |
254 // http://crbug.com/396386 | 287 // http://crbug.com/396386 |
255 #define MAYBE_BasicThreaded DISABLED_BasicThreaded | 288 #define MAYBE_BasicThreaded DISABLED_BasicThreaded |
256 #else | 289 #else |
257 #define MAYBE_BasicThreaded BasicThreaded | 290 #define MAYBE_BasicThreaded BasicThreaded |
(...skipping 26 matching lines...) Expand all Loading... |
284 MOJO_HANDLE_SIGNAL_READABLE, | 317 MOJO_HANDLE_SIGNAL_READABLE, |
285 MOJO_DEADLINE_INDEFINITE, | 318 MOJO_DEADLINE_INDEFINITE, |
286 1, | 319 1, |
287 &did_wait, &result, &context); | 320 &did_wait, &result, &context); |
288 stopwatch.Start(); | 321 stopwatch.Start(); |
289 thread.Start(); | 322 thread.Start(); |
290 base::PlatformThread::Sleep(2 * test::EpsilonTimeout()); | 323 base::PlatformThread::Sleep(2 * test::EpsilonTimeout()); |
291 // Wake it up by writing to |d0|. | 324 // Wake it up by writing to |d0|. |
292 buffer[0] = 123456789; | 325 buffer[0] = 123456789; |
293 EXPECT_EQ(MOJO_RESULT_OK, | 326 EXPECT_EQ(MOJO_RESULT_OK, |
294 d0->WriteMessage(buffer, kBufferSize, | 327 d0->WriteMessage(UserPointer<const void>(buffer), kBufferSize, |
295 NULL, | 328 NULL, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
296 MOJO_WRITE_MESSAGE_FLAG_NONE)); | |
297 } // Joins the thread. | 329 } // Joins the thread. |
298 elapsed = stopwatch.Elapsed(); | 330 elapsed = stopwatch.Elapsed(); |
299 EXPECT_GT(elapsed, (2-1) * test::EpsilonTimeout()); | 331 EXPECT_GT(elapsed, (2-1) * test::EpsilonTimeout()); |
300 EXPECT_LT(elapsed, (2+1) * test::EpsilonTimeout()); | 332 EXPECT_LT(elapsed, (2+1) * test::EpsilonTimeout()); |
301 EXPECT_TRUE(did_wait); | 333 EXPECT_TRUE(did_wait); |
302 EXPECT_EQ(MOJO_RESULT_OK, result); | 334 EXPECT_EQ(MOJO_RESULT_OK, result); |
303 EXPECT_EQ(1u, context); | 335 EXPECT_EQ(1u, context); |
304 | 336 |
305 // Now |d1| is already readable. Try waiting for it again. | 337 // Now |d1| is already readable. Try waiting for it again. |
306 { | 338 { |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
414 buffer[i] = static_cast<unsigned char>(i); | 446 buffer[i] = static_cast<unsigned char>(i); |
415 | 447 |
416 // Number of messages to write. | 448 // Number of messages to write. |
417 *messages_written_ = static_cast<size_t>(base::RandInt(1000, 6000)); | 449 *messages_written_ = static_cast<size_t>(base::RandInt(1000, 6000)); |
418 | 450 |
419 // Write messages. | 451 // Write messages. |
420 for (size_t i = 0; i < *messages_written_; i++) { | 452 for (size_t i = 0; i < *messages_written_; i++) { |
421 uint32_t bytes_to_write = static_cast<uint32_t>( | 453 uint32_t bytes_to_write = static_cast<uint32_t>( |
422 base::RandInt(1, static_cast<int>(kMaxMessageSize))); | 454 base::RandInt(1, static_cast<int>(kMaxMessageSize))); |
423 EXPECT_EQ(MOJO_RESULT_OK, | 455 EXPECT_EQ(MOJO_RESULT_OK, |
424 write_dispatcher_->WriteMessage(buffer, bytes_to_write, | 456 write_dispatcher_->WriteMessage(UserPointer<const void>(buffer), |
425 NULL, | 457 bytes_to_write, NULL, |
426 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 458 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
427 *bytes_written_ += bytes_to_write; | 459 *bytes_written_ += bytes_to_write; |
428 } | 460 } |
429 | 461 |
430 // Write one last "quit" message. | 462 // Write one last "quit" message. |
431 EXPECT_EQ(MOJO_RESULT_OK, | 463 EXPECT_EQ(MOJO_RESULT_OK, |
432 write_dispatcher_->WriteMessage("quit", 4, | 464 write_dispatcher_->WriteMessage(UserPointer<const void>("quit"), |
433 NULL, | 465 4, NULL, |
434 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 466 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
435 } | 467 } |
436 | 468 |
437 const scoped_refptr<Dispatcher> write_dispatcher_; | 469 const scoped_refptr<Dispatcher> write_dispatcher_; |
438 size_t* const messages_written_; | 470 size_t* const messages_written_; |
439 size_t* const bytes_written_; | 471 size_t* const bytes_written_; |
440 | 472 |
441 DISALLOW_COPY_AND_ASSIGN(WriterThread); | 473 DISALLOW_COPY_AND_ASSIGN(WriterThread); |
442 }; | 474 }; |
443 | 475 |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
587 EXPECT_EQ(total_messages_written, total_messages_read); | 619 EXPECT_EQ(total_messages_written, total_messages_read); |
588 EXPECT_EQ(total_bytes_written, total_bytes_read); | 620 EXPECT_EQ(total_bytes_written, total_bytes_read); |
589 | 621 |
590 EXPECT_EQ(MOJO_RESULT_OK, d_write->Close()); | 622 EXPECT_EQ(MOJO_RESULT_OK, d_write->Close()); |
591 EXPECT_EQ(MOJO_RESULT_OK, d_read->Close()); | 623 EXPECT_EQ(MOJO_RESULT_OK, d_read->Close()); |
592 } | 624 } |
593 | 625 |
594 } // namespace | 626 } // namespace |
595 } // namespace system | 627 } // namespace system |
596 } // namespace mojo | 628 } // namespace mojo |
OLD | NEW |