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

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

Issue 417303002: Convert ReadMessage...() to use the new user pointer handling (see r285350). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: hmm Created 6 years, 5 months 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 | Annotate | Revision Log
« no previous file with comments | « mojo/system/message_pipe_dispatcher.cc ('k') | mojo/system/message_pipe_endpoint.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « mojo/system/message_pipe_dispatcher.cc ('k') | mojo/system/message_pipe_endpoint.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698