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

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

Issue 67413003: Mojo: Implement plumbing to support passing handles over MessagePipes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebased & review comments Created 7 years, 1 month 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_unittest.cc » ('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. |kEpsilonMicros| may be increased to increase 6 // heavily-loaded system). Sorry. |kEpsilonMicros| may be increased to increase
7 // tolerance and reduce observed flakiness. 7 // tolerance and reduce observed flakiness.
8 8
9 #include "mojo/system/message_pipe_dispatcher.h" 9 #include "mojo/system/message_pipe_dispatcher.h"
10 10
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
56 // Shouldn't need to remove the waiter (it was not added). 56 // Shouldn't need to remove the waiter (it was not added).
57 57
58 // Add a readable waiter to |d_0|, then make it readable (by writing to 58 // Add a readable waiter to |d_0|, then make it readable (by writing to
59 // |d_1|), then wait. 59 // |d_1|), then wait.
60 w.Init(); 60 w.Init();
61 EXPECT_EQ(MOJO_RESULT_OK, 61 EXPECT_EQ(MOJO_RESULT_OK,
62 d_0->AddWaiter(&w, MOJO_WAIT_FLAG_READABLE, 1)); 62 d_0->AddWaiter(&w, MOJO_WAIT_FLAG_READABLE, 1));
63 buffer[0] = 123456789; 63 buffer[0] = 123456789;
64 EXPECT_EQ(MOJO_RESULT_OK, 64 EXPECT_EQ(MOJO_RESULT_OK,
65 d_1->WriteMessage(buffer, kBufferSize, 65 d_1->WriteMessage(buffer, kBufferSize,
66 NULL, 0, 66 NULL,
67 MOJO_WRITE_MESSAGE_FLAG_NONE)); 67 MOJO_WRITE_MESSAGE_FLAG_NONE));
68 stopwatch.Start(); 68 stopwatch.Start();
69 EXPECT_EQ(1, w.Wait(MOJO_DEADLINE_INDEFINITE)); 69 EXPECT_EQ(1, w.Wait(MOJO_DEADLINE_INDEFINITE));
70 elapsed_micros = stopwatch.Elapsed(); 70 elapsed_micros = stopwatch.Elapsed();
71 EXPECT_LT(elapsed_micros, kEpsilonMicros); 71 EXPECT_LT(elapsed_micros, kEpsilonMicros);
72 d_0->RemoveWaiter(&w); 72 d_0->RemoveWaiter(&w);
73 73
74 // Try adding a readable waiter when already readable (from above). 74 // Try adding a readable waiter when already readable (from above).
75 w.Init(); 75 w.Init();
76 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, 76 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
77 d_0->AddWaiter(&w, MOJO_WAIT_FLAG_READABLE, 2)); 77 d_0->AddWaiter(&w, MOJO_WAIT_FLAG_READABLE, 2));
78 // Shouldn't need to remove the waiter (it was not added). 78 // Shouldn't need to remove the waiter (it was not added).
79 79
80 // Make |d_0| no longer readable (by reading from it). 80 // Make |d_0| no longer readable (by reading from it).
81 buffer[0] = 0; 81 buffer[0] = 0;
82 buffer_size = kBufferSize; 82 buffer_size = kBufferSize;
83 EXPECT_EQ(MOJO_RESULT_OK, 83 EXPECT_EQ(MOJO_RESULT_OK,
84 d_0->ReadMessage(buffer, &buffer_size, 84 d_0->ReadMessage(buffer, &buffer_size,
85 NULL, NULL, 85 0, NULL,
86 MOJO_READ_MESSAGE_FLAG_NONE)); 86 MOJO_READ_MESSAGE_FLAG_NONE));
87 EXPECT_EQ(kBufferSize, buffer_size); 87 EXPECT_EQ(kBufferSize, buffer_size);
88 EXPECT_EQ(123456789, buffer[0]); 88 EXPECT_EQ(123456789, buffer[0]);
89 89
90 // Wait for zero time for readability on |d_0| (will time out). 90 // Wait for zero time for readability on |d_0| (will time out).
91 w.Init(); 91 w.Init();
92 EXPECT_EQ(MOJO_RESULT_OK, 92 EXPECT_EQ(MOJO_RESULT_OK,
93 d_0->AddWaiter(&w, MOJO_WAIT_FLAG_READABLE, 3)); 93 d_0->AddWaiter(&w, MOJO_WAIT_FLAG_READABLE, 3));
94 stopwatch.Start(); 94 stopwatch.Start();
95 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0)); 95 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0));
(...skipping 12 matching lines...) Expand all
108 EXPECT_LT(elapsed_micros, (2+1) * kEpsilonMicros); 108 EXPECT_LT(elapsed_micros, (2+1) * kEpsilonMicros);
109 d_0->RemoveWaiter(&w); 109 d_0->RemoveWaiter(&w);
110 110
111 EXPECT_EQ(MOJO_RESULT_OK, d_0->Close()); 111 EXPECT_EQ(MOJO_RESULT_OK, d_0->Close());
112 EXPECT_EQ(MOJO_RESULT_OK, d_1->Close()); 112 EXPECT_EQ(MOJO_RESULT_OK, d_1->Close());
113 } 113 }
114 } 114 }
115 115
116 TEST(MessagePipeDispatcherTest, InvalidParams) { 116 TEST(MessagePipeDispatcherTest, InvalidParams) {
117 char buffer[1]; 117 char buffer[1];
118 MojoHandle handles[1];
119 118
120 scoped_refptr<MessagePipeDispatcher> d_0(new MessagePipeDispatcher()); 119 scoped_refptr<MessagePipeDispatcher> d_0(new MessagePipeDispatcher());
121 scoped_refptr<MessagePipeDispatcher> d_1(new MessagePipeDispatcher()); 120 scoped_refptr<MessagePipeDispatcher> d_1(new MessagePipeDispatcher());
122 { 121 {
123 scoped_refptr<MessagePipe> mp(new MessagePipe()); 122 scoped_refptr<MessagePipe> mp(new MessagePipe());
124 d_0->Init(mp, 0); 123 d_0->Init(mp, 0);
125 d_1->Init(mp, 1); 124 d_1->Init(mp, 1);
126 } 125 }
127 126
128 // |WriteMessage|: 127 // |WriteMessage|:
129 // Null buffer with nonzero buffer size. 128 // Null buffer with nonzero buffer size.
130 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, 129 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
131 d_0->WriteMessage(NULL, 1, 130 d_0->WriteMessage(NULL, 1,
132 NULL, 0, 131 NULL,
133 MOJO_WRITE_MESSAGE_FLAG_NONE)); 132 MOJO_WRITE_MESSAGE_FLAG_NONE));
134 // Huge buffer size. 133 // Huge buffer size.
135 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, 134 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
136 d_0->WriteMessage(buffer, std::numeric_limits<uint32_t>::max(), 135 d_0->WriteMessage(buffer, std::numeric_limits<uint32_t>::max(),
137 NULL, 0, 136 NULL,
138 MOJO_WRITE_MESSAGE_FLAG_NONE));
139
140 // Null handles with nonzero handle count.
141 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
142 d_0->WriteMessage(buffer, sizeof(buffer),
143 NULL, 1,
144 MOJO_WRITE_MESSAGE_FLAG_NONE));
145 // Huge handle count (implausibly big on some systems -- more than can be
146 // stored in a 32-bit address space).
147 // Note: This may return either |MOJO_RESULT_INVALID_ARGUMENT| or
148 // |MOJO_RESULT_RESOURCE_EXHAUSTED|, depending on whether it's plausible or
149 // not.
150 EXPECT_NE(MOJO_RESULT_OK,
151 d_0->WriteMessage(buffer, sizeof(buffer),
152 handles, std::numeric_limits<uint32_t>::max(),
153 MOJO_WRITE_MESSAGE_FLAG_NONE));
154 // Huge handle count (plausibly big).
155 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
156 d_0->WriteMessage(buffer, sizeof(buffer),
157 handles, std::numeric_limits<uint32_t>::max() /
158 sizeof(handles[0]),
159 MOJO_WRITE_MESSAGE_FLAG_NONE)); 137 MOJO_WRITE_MESSAGE_FLAG_NONE));
160 138
161 // |ReadMessage|: 139 // |ReadMessage|:
162 // Null buffer with nonzero buffer size. 140 // Null buffer with nonzero buffer size.
163 uint32_t buffer_size = 1; 141 uint32_t buffer_size = 1;
164 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, 142 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
165 d_0->ReadMessage(NULL, &buffer_size, 143 d_0->ReadMessage(NULL, &buffer_size,
166 NULL, NULL, 144 0, NULL,
167 MOJO_READ_MESSAGE_FLAG_NONE));
168 // Null handles with nonzero handle count.
169 buffer_size = static_cast<uint32_t>(sizeof(buffer));
170 uint32_t handle_count = 1;
171 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
172 d_0->ReadMessage(buffer, &buffer_size,
173 NULL, &handle_count,
174 MOJO_READ_MESSAGE_FLAG_NONE)); 145 MOJO_READ_MESSAGE_FLAG_NONE));
175 146
176 EXPECT_EQ(MOJO_RESULT_OK, d_0->Close()); 147 EXPECT_EQ(MOJO_RESULT_OK, d_0->Close());
177 EXPECT_EQ(MOJO_RESULT_OK, d_1->Close()); 148 EXPECT_EQ(MOJO_RESULT_OK, d_1->Close());
178 } 149 }
179 150
180 // Test what happens when one end is closed (single-threaded test). 151 // Test what happens when one end is closed (single-threaded test).
181 TEST(MessagePipeDispatcherTest, BasicClosed) { 152 TEST(MessagePipeDispatcherTest, BasicClosed) {
182 int32_t buffer[1]; 153 int32_t buffer[1];
183 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); 154 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer));
184 uint32_t buffer_size; 155 uint32_t buffer_size;
185 156
186 // Run this test both with |d_0| as port 0, |d_1| as port 1 and vice versa. 157 // Run this test both with |d_0| as port 0, |d_1| as port 1 and vice versa.
187 for (unsigned i = 0; i < 2; i++) { 158 for (unsigned i = 0; i < 2; i++) {
188 scoped_refptr<MessagePipeDispatcher> d_0(new MessagePipeDispatcher()); 159 scoped_refptr<MessagePipeDispatcher> d_0(new MessagePipeDispatcher());
189 scoped_refptr<MessagePipeDispatcher> d_1(new MessagePipeDispatcher()); 160 scoped_refptr<MessagePipeDispatcher> d_1(new MessagePipeDispatcher());
190 { 161 {
191 scoped_refptr<MessagePipe> mp(new MessagePipe()); 162 scoped_refptr<MessagePipe> mp(new MessagePipe());
192 d_0->Init(mp, i); // 0, 1. 163 d_0->Init(mp, i); // 0, 1.
193 d_1->Init(mp, i ^ 1); // 1, 0. 164 d_1->Init(mp, i ^ 1); // 1, 0.
194 } 165 }
195 Waiter w; 166 Waiter w;
196 167
197 // Write (twice) to |d_1|. 168 // Write (twice) to |d_1|.
198 buffer[0] = 123456789; 169 buffer[0] = 123456789;
199 EXPECT_EQ(MOJO_RESULT_OK, 170 EXPECT_EQ(MOJO_RESULT_OK,
200 d_1->WriteMessage(buffer, kBufferSize, 171 d_1->WriteMessage(buffer, kBufferSize,
201 NULL, 0, 172 NULL,
202 MOJO_WRITE_MESSAGE_FLAG_NONE)); 173 MOJO_WRITE_MESSAGE_FLAG_NONE));
203 buffer[0] = 234567890; 174 buffer[0] = 234567890;
204 EXPECT_EQ(MOJO_RESULT_OK, 175 EXPECT_EQ(MOJO_RESULT_OK,
205 d_1->WriteMessage(buffer, kBufferSize, 176 d_1->WriteMessage(buffer, kBufferSize,
206 NULL, 0, 177 NULL,
207 MOJO_WRITE_MESSAGE_FLAG_NONE)); 178 MOJO_WRITE_MESSAGE_FLAG_NONE));
208 179
209 // Try waiting for readable on |d_0|; should fail (already satisfied). 180 // Try waiting for readable on |d_0|; should fail (already satisfied).
210 w.Init(); 181 w.Init();
211 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, 182 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
212 d_0->AddWaiter(&w, MOJO_WAIT_FLAG_READABLE, 0)); 183 d_0->AddWaiter(&w, MOJO_WAIT_FLAG_READABLE, 0));
213 184
214 // Try reading from |d_1|; should fail (nothing to read). 185 // Try reading from |d_1|; should fail (nothing to read).
215 buffer[0] = 0; 186 buffer[0] = 0;
216 buffer_size = kBufferSize; 187 buffer_size = kBufferSize;
217 EXPECT_EQ(MOJO_RESULT_NOT_FOUND, 188 EXPECT_EQ(MOJO_RESULT_NOT_FOUND,
218 d_1->ReadMessage(buffer, &buffer_size, 189 d_1->ReadMessage(buffer, &buffer_size,
219 NULL, NULL, 190 0, NULL,
220 MOJO_READ_MESSAGE_FLAG_NONE)); 191 MOJO_READ_MESSAGE_FLAG_NONE));
221 192
222 // Close |d_1|. 193 // Close |d_1|.
223 EXPECT_EQ(MOJO_RESULT_OK, d_1->Close()); 194 EXPECT_EQ(MOJO_RESULT_OK, d_1->Close());
224 195
225 // Try waiting for readable on |d_0|; should fail (already satisfied). 196 // Try waiting for readable on |d_0|; should fail (already satisfied).
226 w.Init(); 197 w.Init();
227 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, 198 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
228 d_0->AddWaiter(&w, MOJO_WAIT_FLAG_READABLE, 1)); 199 d_0->AddWaiter(&w, MOJO_WAIT_FLAG_READABLE, 1));
229 200
230 // Read from |d_0|. 201 // Read from |d_0|.
231 buffer[0] = 0; 202 buffer[0] = 0;
232 buffer_size = kBufferSize; 203 buffer_size = kBufferSize;
233 EXPECT_EQ(MOJO_RESULT_OK, 204 EXPECT_EQ(MOJO_RESULT_OK,
234 d_0->ReadMessage(buffer, &buffer_size, 205 d_0->ReadMessage(buffer, &buffer_size,
235 NULL, NULL, 206 0, NULL,
236 MOJO_READ_MESSAGE_FLAG_NONE)); 207 MOJO_READ_MESSAGE_FLAG_NONE));
237 EXPECT_EQ(kBufferSize, buffer_size); 208 EXPECT_EQ(kBufferSize, buffer_size);
238 EXPECT_EQ(123456789, buffer[0]); 209 EXPECT_EQ(123456789, buffer[0]);
239 210
240 // Try waiting for readable on |d_0|; should fail (already satisfied). 211 // Try waiting for readable on |d_0|; should fail (already satisfied).
241 w.Init(); 212 w.Init();
242 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, 213 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
243 d_0->AddWaiter(&w, MOJO_WAIT_FLAG_READABLE, 2)); 214 d_0->AddWaiter(&w, MOJO_WAIT_FLAG_READABLE, 2));
244 215
245 // Read again from |d_0|. 216 // Read again from |d_0|.
246 buffer[0] = 0; 217 buffer[0] = 0;
247 buffer_size = kBufferSize; 218 buffer_size = kBufferSize;
248 EXPECT_EQ(MOJO_RESULT_OK, 219 EXPECT_EQ(MOJO_RESULT_OK,
249 d_0->ReadMessage(buffer, &buffer_size, 220 d_0->ReadMessage(buffer, &buffer_size,
250 NULL, NULL, 221 0, NULL,
251 MOJO_READ_MESSAGE_FLAG_NONE)); 222 MOJO_READ_MESSAGE_FLAG_NONE));
252 EXPECT_EQ(kBufferSize, buffer_size); 223 EXPECT_EQ(kBufferSize, buffer_size);
253 EXPECT_EQ(234567890, buffer[0]); 224 EXPECT_EQ(234567890, buffer[0]);
254 225
255 // Try waiting for readable on |d_0|; should fail (unsatisfiable). 226 // Try waiting for readable on |d_0|; should fail (unsatisfiable).
256 w.Init(); 227 w.Init();
257 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 228 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
258 d_0->AddWaiter(&w, MOJO_WAIT_FLAG_READABLE, 3)); 229 d_0->AddWaiter(&w, MOJO_WAIT_FLAG_READABLE, 3));
259 230
260 // Try waiting for writable on |d_0|; should fail (unsatisfiable). 231 // Try waiting for writable on |d_0|; should fail (unsatisfiable).
261 w.Init(); 232 w.Init();
262 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 233 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
263 d_0->AddWaiter(&w, MOJO_WAIT_FLAG_WRITABLE, 4)); 234 d_0->AddWaiter(&w, MOJO_WAIT_FLAG_WRITABLE, 4));
264 235
265 // Try reading from |d_0|; should fail (nothing to read and other end 236 // Try reading from |d_0|; should fail (nothing to read and other end
266 // closed). 237 // closed).
267 buffer[0] = 0; 238 buffer[0] = 0;
268 buffer_size = kBufferSize; 239 buffer_size = kBufferSize;
269 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 240 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
270 d_0->ReadMessage(buffer, &buffer_size, 241 d_0->ReadMessage(buffer, &buffer_size,
271 NULL, NULL, 242 0, NULL,
272 MOJO_READ_MESSAGE_FLAG_NONE)); 243 MOJO_READ_MESSAGE_FLAG_NONE));
273 244
274 // Try writing to |d_0|; should fail (other end closed). 245 // Try writing to |d_0|; should fail (other end closed).
275 buffer[0] = 345678901; 246 buffer[0] = 345678901;
276 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 247 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
277 d_0->WriteMessage(buffer, kBufferSize, 248 d_0->WriteMessage(buffer, kBufferSize,
278 NULL, 0, 249 NULL,
279 MOJO_WRITE_MESSAGE_FLAG_NONE)); 250 MOJO_WRITE_MESSAGE_FLAG_NONE));
280 251
281 EXPECT_EQ(MOJO_RESULT_OK, d_0->Close()); 252 EXPECT_EQ(MOJO_RESULT_OK, d_0->Close());
282 } 253 }
283 } 254 }
284 255
285 TEST(MessagePipeDispatcherTest, BasicThreaded) { 256 TEST(MessagePipeDispatcherTest, BasicThreaded) {
286 test::Stopwatch stopwatch; 257 test::Stopwatch stopwatch;
287 int32_t buffer[1]; 258 int32_t buffer[1];
288 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); 259 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer));
(...skipping 20 matching lines...) Expand all
309 0, 280 0,
310 &did_wait, &result); 281 &did_wait, &result);
311 stopwatch.Start(); 282 stopwatch.Start();
312 thread.Start(); 283 thread.Start();
313 base::PlatformThread::Sleep( 284 base::PlatformThread::Sleep(
314 base::TimeDelta::FromMicroseconds(2 * kEpsilonMicros)); 285 base::TimeDelta::FromMicroseconds(2 * kEpsilonMicros));
315 // Wake it up by writing to |d_0|. 286 // Wake it up by writing to |d_0|.
316 buffer[0] = 123456789; 287 buffer[0] = 123456789;
317 EXPECT_EQ(MOJO_RESULT_OK, 288 EXPECT_EQ(MOJO_RESULT_OK,
318 d_0->WriteMessage(buffer, kBufferSize, 289 d_0->WriteMessage(buffer, kBufferSize,
319 NULL, 0, 290 NULL,
320 MOJO_WRITE_MESSAGE_FLAG_NONE)); 291 MOJO_WRITE_MESSAGE_FLAG_NONE));
321 } // Joins the thread. 292 } // Joins the thread.
322 elapsed_micros = stopwatch.Elapsed(); 293 elapsed_micros = stopwatch.Elapsed();
323 EXPECT_TRUE(did_wait); 294 EXPECT_TRUE(did_wait);
324 EXPECT_EQ(0, result); 295 EXPECT_EQ(0, result);
325 EXPECT_GT(elapsed_micros, (2-1) * kEpsilonMicros); 296 EXPECT_GT(elapsed_micros, (2-1) * kEpsilonMicros);
326 EXPECT_LT(elapsed_micros, (2+1) * kEpsilonMicros); 297 EXPECT_LT(elapsed_micros, (2+1) * kEpsilonMicros);
327 298
328 // Now |d_1| is already readable. Try waiting for it again. 299 // Now |d_1| is already readable. Try waiting for it again.
329 { 300 {
330 test::WaiterThread thread(d_1, 301 test::WaiterThread thread(d_1,
331 MOJO_WAIT_FLAG_READABLE, 302 MOJO_WAIT_FLAG_READABLE,
332 MOJO_DEADLINE_INDEFINITE, 303 MOJO_DEADLINE_INDEFINITE,
333 1, 304 1,
334 &did_wait, &result); 305 &did_wait, &result);
335 stopwatch.Start(); 306 stopwatch.Start();
336 thread.Start(); 307 thread.Start();
337 } // Joins the thread. 308 } // Joins the thread.
338 elapsed_micros = stopwatch.Elapsed(); 309 elapsed_micros = stopwatch.Elapsed();
339 EXPECT_FALSE(did_wait); 310 EXPECT_FALSE(did_wait);
340 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, result); 311 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, result);
341 EXPECT_LT(elapsed_micros, kEpsilonMicros); 312 EXPECT_LT(elapsed_micros, kEpsilonMicros);
342 313
343 // Consume what we wrote to |d_0|. 314 // Consume what we wrote to |d_0|.
344 buffer[0] = 0; 315 buffer[0] = 0;
345 buffer_size = kBufferSize; 316 buffer_size = kBufferSize;
346 EXPECT_EQ(MOJO_RESULT_OK, 317 EXPECT_EQ(MOJO_RESULT_OK,
347 d_1->ReadMessage(buffer, &buffer_size, 318 d_1->ReadMessage(buffer, &buffer_size,
348 NULL, NULL, 319 0, NULL,
349 MOJO_READ_MESSAGE_FLAG_NONE)); 320 MOJO_READ_MESSAGE_FLAG_NONE));
350 EXPECT_EQ(kBufferSize, buffer_size); 321 EXPECT_EQ(kBufferSize, buffer_size);
351 EXPECT_EQ(123456789, buffer[0]); 322 EXPECT_EQ(123456789, buffer[0]);
352 323
353 // Wait for readable on |d_1| and close |d_0| after some time, which should 324 // Wait for readable on |d_1| and close |d_0| after some time, which should
354 // cancel that wait. 325 // cancel that wait.
355 { 326 {
356 test::WaiterThread thread(d_1, 327 test::WaiterThread thread(d_1,
357 MOJO_WAIT_FLAG_READABLE, 328 MOJO_WAIT_FLAG_READABLE,
358 MOJO_DEADLINE_INDEFINITE, 329 MOJO_DEADLINE_INDEFINITE,
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
437 408
438 // Number of messages to write. 409 // Number of messages to write.
439 *messages_written_ = static_cast<size_t>(base::RandInt(1000, 6000)); 410 *messages_written_ = static_cast<size_t>(base::RandInt(1000, 6000));
440 411
441 // Write messages. 412 // Write messages.
442 for (size_t i = 0; i < *messages_written_; i++) { 413 for (size_t i = 0; i < *messages_written_; i++) {
443 uint32_t bytes_to_write = static_cast<uint32_t>( 414 uint32_t bytes_to_write = static_cast<uint32_t>(
444 base::RandInt(1, static_cast<int>(kMaxMessageSize))); 415 base::RandInt(1, static_cast<int>(kMaxMessageSize)));
445 EXPECT_EQ(MOJO_RESULT_OK, 416 EXPECT_EQ(MOJO_RESULT_OK,
446 write_dispatcher_->WriteMessage(buffer, bytes_to_write, 417 write_dispatcher_->WriteMessage(buffer, bytes_to_write,
447 NULL, 0, 418 NULL,
448 MOJO_WRITE_MESSAGE_FLAG_NONE)); 419 MOJO_WRITE_MESSAGE_FLAG_NONE));
449 *bytes_written_ += bytes_to_write; 420 *bytes_written_ += bytes_to_write;
450 } 421 }
451 422
452 // Write one last "quit" message. 423 // Write one last "quit" message.
453 EXPECT_EQ(MOJO_RESULT_OK, 424 EXPECT_EQ(MOJO_RESULT_OK,
454 write_dispatcher_->WriteMessage("quit", 4, NULL, 0, 425 write_dispatcher_->WriteMessage("quit", 4,
426 NULL,
455 MOJO_WRITE_MESSAGE_FLAG_NONE)); 427 MOJO_WRITE_MESSAGE_FLAG_NONE));
456 } 428 }
457 429
458 const scoped_refptr<Dispatcher> write_dispatcher_; 430 const scoped_refptr<Dispatcher> write_dispatcher_;
459 size_t* const messages_written_; 431 size_t* const messages_written_;
460 size_t* const bytes_written_; 432 size_t* const bytes_written_;
461 433
462 DISALLOW_COPY_AND_ASSIGN(WriterThread); 434 DISALLOW_COPY_AND_ASSIGN(WriterThread);
463 }; 435 };
464 436
(...skipping 30 matching lines...) Expand all
495 if (result == MOJO_RESULT_OK) { 467 if (result == MOJO_RESULT_OK) {
496 // Actually need to wait. 468 // Actually need to wait.
497 EXPECT_EQ(0, w.Wait(MOJO_DEADLINE_INDEFINITE)); 469 EXPECT_EQ(0, w.Wait(MOJO_DEADLINE_INDEFINITE));
498 read_dispatcher_->RemoveWaiter(&w); 470 read_dispatcher_->RemoveWaiter(&w);
499 } 471 }
500 472
501 // Now, try to do the read. 473 // Now, try to do the read.
502 // Clear the buffer so that we can check the result. 474 // Clear the buffer so that we can check the result.
503 memset(buffer, 0, sizeof(buffer)); 475 memset(buffer, 0, sizeof(buffer));
504 uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer)); 476 uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer));
505 result = read_dispatcher_->ReadMessage(buffer, &buffer_size, NULL, NULL, 477 result = read_dispatcher_->ReadMessage(buffer, &buffer_size,
478 0, NULL,
506 MOJO_READ_MESSAGE_FLAG_NONE); 479 MOJO_READ_MESSAGE_FLAG_NONE);
507 EXPECT_TRUE(result == MOJO_RESULT_OK || 480 EXPECT_TRUE(result == MOJO_RESULT_OK ||
508 result == MOJO_RESULT_NOT_FOUND) << "result: " << result; 481 result == MOJO_RESULT_NOT_FOUND) << "result: " << result;
509 // We're racing with others to read, so maybe we failed. 482 // We're racing with others to read, so maybe we failed.
510 if (result == MOJO_RESULT_NOT_FOUND) 483 if (result == MOJO_RESULT_NOT_FOUND)
511 continue; // In which case, try again. 484 continue; // In which case, try again.
512 // Check for quit. 485 // Check for quit.
513 if (buffer_size == 4 && memcmp("quit", buffer, 4) == 0) 486 if (buffer_size == 4 && memcmp("quit", buffer, 4) == 0)
514 return; 487 return;
515 EXPECT_GE(buffer_size, 1u); 488 EXPECT_GE(buffer_size, 1u);
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
605 EXPECT_EQ(total_messages_written, total_messages_read); 578 EXPECT_EQ(total_messages_written, total_messages_read);
606 EXPECT_EQ(total_bytes_written, total_bytes_read); 579 EXPECT_EQ(total_bytes_written, total_bytes_read);
607 580
608 EXPECT_EQ(MOJO_RESULT_OK, d_write->Close()); 581 EXPECT_EQ(MOJO_RESULT_OK, d_write->Close());
609 EXPECT_EQ(MOJO_RESULT_OK, d_read->Close()); 582 EXPECT_EQ(MOJO_RESULT_OK, d_read->Close());
610 } 583 }
611 584
612 } // namespace 585 } // namespace
613 } // namespace system 586 } // namespace system
614 } // namespace mojo 587 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/system/message_pipe_dispatcher.cc ('k') | mojo/system/message_pipe_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698