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

Side by Side Diff: mojo/edk/system/remote_data_pipe_impl_unittest.cc

Issue 2084593005: Rationalize AddAwakable...() and RemoveAwakable...() methods. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: doh Created 4 years, 6 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
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 // This file tests both |RemoteProducerDataPipeImpl| and 5 // This file tests both |RemoteProducerDataPipeImpl| and
6 // |RemoteConsumerDataPipeImpl|. 6 // |RemoteConsumerDataPipeImpl|.
7 7
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <memory> 10 #include <memory>
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
134 char read_buffer[100] = {}; 134 char read_buffer[100] = {};
135 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); 135 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer));
136 Waiter waiter; 136 Waiter waiter;
137 HandleSignalsState hss; 137 HandleSignalsState hss;
138 uint64_t context = 0; 138 uint64_t context = 0;
139 139
140 // Write on MP 0 (port 0). Wait and receive on MP 1 (port 0). (Add the waiter 140 // Write on MP 0 (port 0). Wait and receive on MP 1 (port 0). (Add the waiter
141 // first, to avoid any handling the case where it's already readable.) 141 // first, to avoid any handling the case where it's already readable.)
142 waiter.Init(); 142 waiter.Init();
143 ASSERT_EQ(MOJO_RESULT_OK, 143 ASSERT_EQ(MOJO_RESULT_OK,
144 message_pipe(1)->AddAwakable( 144 message_pipe(1)->AddAwakable(0, &waiter, 123, false,
145 0, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, 123, nullptr)); 145 MOJO_HANDLE_SIGNAL_READABLE, nullptr));
146 EXPECT_EQ(MOJO_RESULT_OK, 146 EXPECT_EQ(MOJO_RESULT_OK,
147 message_pipe(0)->WriteMessage(0, UserPointer<const void>(kHello), 147 message_pipe(0)->WriteMessage(0, UserPointer<const void>(kHello),
148 sizeof(kHello), nullptr, 148 sizeof(kHello), nullptr,
149 MOJO_WRITE_MESSAGE_FLAG_NONE)); 149 MOJO_WRITE_MESSAGE_FLAG_NONE));
150 EXPECT_EQ(MOJO_RESULT_OK, 150 EXPECT_EQ(MOJO_RESULT_OK,
151 waiter.Wait(test::ActionTimeout(), &context, nullptr)); 151 waiter.Wait(test::ActionTimeout(), &context, nullptr));
152 EXPECT_EQ(123u, context); 152 EXPECT_EQ(123u, context);
153 hss = HandleSignalsState(); 153 hss = HandleSignalsState();
154 message_pipe(1)->RemoveAwakable(0, &waiter, &hss); 154 message_pipe(1)->RemoveAwakable(0, false, &waiter, 0, &hss);
155 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 155 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
156 hss.satisfied_signals); 156 hss.satisfied_signals);
157 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | 157 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
158 MOJO_HANDLE_SIGNAL_PEER_CLOSED, 158 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
159 hss.satisfiable_signals); 159 hss.satisfiable_signals);
160 EXPECT_EQ(MOJO_RESULT_OK, message_pipe(1)->ReadMessage( 160 EXPECT_EQ(MOJO_RESULT_OK, message_pipe(1)->ReadMessage(
161 0, UserPointer<void>(read_buffer), 161 0, UserPointer<void>(read_buffer),
162 MakeUserPointer(&read_buffer_size), nullptr, 162 MakeUserPointer(&read_buffer_size), nullptr,
163 nullptr, MOJO_READ_MESSAGE_FLAG_NONE)); 163 nullptr, MOJO_READ_MESSAGE_FLAG_NONE));
164 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size)); 164 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size));
(...skipping 23 matching lines...) Expand all
188 dp->ProducerWriteData(UserPointer<const void>(elements), 188 dp->ProducerWriteData(UserPointer<const void>(elements),
189 MakeUserPointer(&num_bytes), false)); 189 MakeUserPointer(&num_bytes), false));
190 EXPECT_EQ(1u * sizeof(elements[0]), num_bytes); 190 EXPECT_EQ(1u * sizeof(elements[0]), num_bytes);
191 dp->ProducerClose(); 191 dp->ProducerClose();
192 192
193 // Write the consumer to MP 0 (port 0). Wait and receive on MP 1 (port 0). 193 // Write the consumer to MP 0 (port 0). Wait and receive on MP 1 (port 0).
194 // (Add the waiter first, to avoid any handling the case where it's already 194 // (Add the waiter first, to avoid any handling the case where it's already
195 // readable.) 195 // readable.)
196 waiter.Init(); 196 waiter.Init();
197 ASSERT_EQ(MOJO_RESULT_OK, 197 ASSERT_EQ(MOJO_RESULT_OK,
198 message_pipe(1)->AddAwakable( 198 message_pipe(1)->AddAwakable(0, &waiter, 123, false,
199 0, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, 123, nullptr)); 199 MOJO_HANDLE_SIGNAL_READABLE, nullptr));
200 { 200 {
201 HandleTransport transport(test::HandleTryStartTransport(consumer_handle)); 201 HandleTransport transport(test::HandleTryStartTransport(consumer_handle));
202 EXPECT_TRUE(transport.is_valid()); 202 EXPECT_TRUE(transport.is_valid());
203 203
204 std::vector<HandleTransport> transports; 204 std::vector<HandleTransport> transports;
205 transports.push_back(transport); 205 transports.push_back(transport);
206 EXPECT_EQ(MOJO_RESULT_OK, message_pipe(0)->WriteMessage( 206 EXPECT_EQ(MOJO_RESULT_OK, message_pipe(0)->WriteMessage(
207 0, NullUserPointer(), 0, &transports, 207 0, NullUserPointer(), 0, &transports,
208 MOJO_WRITE_MESSAGE_FLAG_NONE)); 208 MOJO_WRITE_MESSAGE_FLAG_NONE));
209 transport.End(); 209 transport.End();
210 210
211 // |consumer_handle.dispatcher| should have been closed. This is 211 // |consumer_handle.dispatcher| should have been closed. This is
212 // |DCHECK()|ed when it is destroyed. 212 // |DCHECK()|ed when it is destroyed.
213 EXPECT_TRUE(consumer_handle.dispatcher->HasOneRef()); 213 EXPECT_TRUE(consumer_handle.dispatcher->HasOneRef());
214 consumer_handle.reset(); 214 consumer_handle.reset();
215 } 215 }
216 EXPECT_EQ(MOJO_RESULT_OK, 216 EXPECT_EQ(MOJO_RESULT_OK,
217 waiter.Wait(test::ActionTimeout(), &context, nullptr)); 217 waiter.Wait(test::ActionTimeout(), &context, nullptr));
218 EXPECT_EQ(123u, context); 218 EXPECT_EQ(123u, context);
219 hss = HandleSignalsState(); 219 hss = HandleSignalsState();
220 message_pipe(1)->RemoveAwakable(0, &waiter, &hss); 220 message_pipe(1)->RemoveAwakable(0, false, &waiter, 0, &hss);
221 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 221 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
222 hss.satisfied_signals); 222 hss.satisfied_signals);
223 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | 223 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
224 MOJO_HANDLE_SIGNAL_PEER_CLOSED, 224 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
225 hss.satisfiable_signals); 225 hss.satisfiable_signals);
226 EXPECT_EQ(MOJO_RESULT_OK, 226 EXPECT_EQ(MOJO_RESULT_OK,
227 message_pipe(1)->ReadMessage(0, UserPointer<void>(read_buffer), 227 message_pipe(1)->ReadMessage(0, UserPointer<void>(read_buffer),
228 MakeUserPointer(&read_buffer_size), 228 MakeUserPointer(&read_buffer_size),
229 &read_handles, &read_num_handles, 229 &read_handles, &read_num_handles,
230 MOJO_READ_MESSAGE_FLAG_NONE)); 230 MOJO_READ_MESSAGE_FLAG_NONE));
231 EXPECT_EQ(0u, static_cast<size_t>(read_buffer_size)); 231 EXPECT_EQ(0u, static_cast<size_t>(read_buffer_size));
232 EXPECT_EQ(1u, read_handles.size()); 232 EXPECT_EQ(1u, read_handles.size());
233 EXPECT_EQ(1u, read_num_handles); 233 EXPECT_EQ(1u, read_num_handles);
234 ASSERT_TRUE(read_handles[0]); 234 ASSERT_TRUE(read_handles[0]);
235 EXPECT_TRUE(read_handles[0].dispatcher->HasOneRef()); 235 EXPECT_TRUE(read_handles[0].dispatcher->HasOneRef());
236 236
237 EXPECT_EQ(Dispatcher::Type::DATA_PIPE_CONSUMER, 237 EXPECT_EQ(Dispatcher::Type::DATA_PIPE_CONSUMER,
238 read_handles[0].dispatcher->GetType()); 238 read_handles[0].dispatcher->GetType());
239 EXPECT_EQ(DataPipeConsumerDispatcher::kDefaultHandleRights, 239 EXPECT_EQ(DataPipeConsumerDispatcher::kDefaultHandleRights,
240 read_handles[0].rights); 240 read_handles[0].rights);
241 consumer = RefPtr<DataPipeConsumerDispatcher>( 241 consumer = RefPtr<DataPipeConsumerDispatcher>(
242 static_cast<DataPipeConsumerDispatcher*>( 242 static_cast<DataPipeConsumerDispatcher*>(
243 read_handles[0].dispatcher.get())); 243 read_handles[0].dispatcher.get()));
244 read_handles.clear(); 244 read_handles.clear();
245 245
246 waiter.Init(); 246 waiter.Init();
247 hss = HandleSignalsState(); 247 hss = HandleSignalsState();
248 MojoResult result = 248 MojoResult result = consumer->AddAwakable(&waiter, 456, false,
249 consumer->AddAwakable(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 456, &hss); 249 MOJO_HANDLE_SIGNAL_READABLE, &hss);
250 if (result == MOJO_RESULT_OK) { 250 if (result == MOJO_RESULT_OK) {
251 context = 0; 251 context = 0;
252 EXPECT_EQ(MOJO_RESULT_OK, 252 EXPECT_EQ(MOJO_RESULT_OK,
253 waiter.Wait(test::ActionTimeout(), &context, nullptr)); 253 waiter.Wait(test::ActionTimeout(), &context, nullptr));
254 EXPECT_EQ(456u, context); 254 EXPECT_EQ(456u, context);
255 consumer->RemoveAwakable(&waiter, &hss); 255 consumer->RemoveAwakable(false, &waiter, 0, &hss);
256 } else { 256 } else {
257 ASSERT_EQ(MOJO_RESULT_ALREADY_EXISTS, result); 257 ASSERT_EQ(MOJO_RESULT_ALREADY_EXISTS, result);
258 } 258 }
259 // We don't know if the fact that the producer has been closed is known yet. 259 // We don't know if the fact that the producer has been closed is known yet.
260 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE)); 260 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE));
261 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READ_THRESHOLD)); 261 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READ_THRESHOLD));
262 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); 262 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE));
263 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READ_THRESHOLD)); 263 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READ_THRESHOLD));
264 264
265 // Read one element. 265 // Read one element.
266 elements[0] = -1; 266 elements[0] = -1;
267 elements[1] = -1; 267 elements[1] = -1;
268 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); 268 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
269 EXPECT_EQ(MOJO_RESULT_OK, consumer->ReadData(UserPointer<void>(elements), 269 EXPECT_EQ(MOJO_RESULT_OK, consumer->ReadData(UserPointer<void>(elements),
270 MakeUserPointer(&num_bytes), 270 MakeUserPointer(&num_bytes),
271 MOJO_READ_DATA_FLAG_NONE)); 271 MOJO_READ_DATA_FLAG_NONE));
272 EXPECT_EQ(1u * sizeof(elements[0]), num_bytes); 272 EXPECT_EQ(1u * sizeof(elements[0]), num_bytes);
273 EXPECT_EQ(123, elements[0]); 273 EXPECT_EQ(123, elements[0]);
274 EXPECT_EQ(-1, elements[1]); 274 EXPECT_EQ(-1, elements[1]);
275 275
276 waiter.Init(); 276 waiter.Init();
277 hss = HandleSignalsState(); 277 hss = HandleSignalsState();
278 result = 278 result = consumer->AddAwakable(&waiter, 789, false,
279 consumer->AddAwakable(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 789, &hss); 279 MOJO_HANDLE_SIGNAL_READABLE, &hss);
280 if (result == MOJO_RESULT_OK) { 280 if (result == MOJO_RESULT_OK) {
281 context = 0; 281 context = 0;
282 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 282 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
283 waiter.Wait(test::ActionTimeout(), &context, nullptr)); 283 waiter.Wait(test::ActionTimeout(), &context, nullptr));
284 EXPECT_EQ(789u, context); 284 EXPECT_EQ(789u, context);
285 consumer->RemoveAwakable(&waiter, &hss); 285 consumer->RemoveAwakable(false, &waiter, 0, &hss);
286 } else { 286 } else {
287 ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); 287 ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
288 } 288 }
289 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); 289 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
290 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); 290 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
291 291
292 consumer->Close(); 292 consumer->Close();
293 } 293 }
294 294
295 TEST_F(RemoteDataPipeImplTest, SendConsumerDuringTwoPhaseWrite) { 295 TEST_F(RemoteDataPipeImplTest, SendConsumerDuringTwoPhaseWrite) {
(...skipping 17 matching lines...) Expand all
313 EXPECT_EQ(MOJO_RESULT_OK, 313 EXPECT_EQ(MOJO_RESULT_OK,
314 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), 314 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr),
315 MakeUserPointer(&num_bytes))); 315 MakeUserPointer(&num_bytes)));
316 ASSERT_GE(num_bytes, 1u * sizeof(int32_t)); 316 ASSERT_GE(num_bytes, 1u * sizeof(int32_t));
317 317
318 // Write the consumer to MP 0 (port 0). Wait and receive on MP 1 (port 0). 318 // Write the consumer to MP 0 (port 0). Wait and receive on MP 1 (port 0).
319 // (Add the waiter first, to avoid any handling the case where it's already 319 // (Add the waiter first, to avoid any handling the case where it's already
320 // readable.) 320 // readable.)
321 waiter.Init(); 321 waiter.Init();
322 ASSERT_EQ(MOJO_RESULT_OK, 322 ASSERT_EQ(MOJO_RESULT_OK,
323 message_pipe(1)->AddAwakable( 323 message_pipe(1)->AddAwakable(0, &waiter, 123, false,
324 0, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, 123, nullptr)); 324 MOJO_HANDLE_SIGNAL_READABLE, nullptr));
325 { 325 {
326 HandleTransport transport(test::HandleTryStartTransport(consumer_handle)); 326 HandleTransport transport(test::HandleTryStartTransport(consumer_handle));
327 EXPECT_TRUE(transport.is_valid()); 327 EXPECT_TRUE(transport.is_valid());
328 328
329 std::vector<HandleTransport> transports; 329 std::vector<HandleTransport> transports;
330 transports.push_back(transport); 330 transports.push_back(transport);
331 EXPECT_EQ(MOJO_RESULT_OK, message_pipe(0)->WriteMessage( 331 EXPECT_EQ(MOJO_RESULT_OK, message_pipe(0)->WriteMessage(
332 0, NullUserPointer(), 0, &transports, 332 0, NullUserPointer(), 0, &transports,
333 MOJO_WRITE_MESSAGE_FLAG_NONE)); 333 MOJO_WRITE_MESSAGE_FLAG_NONE));
334 transport.End(); 334 transport.End();
335 335
336 // |consumer_handle.dispatcher| should have been closed. This is 336 // |consumer_handle.dispatcher| should have been closed. This is
337 // |DCHECK()|ed when it is destroyed. 337 // |DCHECK()|ed when it is destroyed.
338 EXPECT_TRUE(consumer_handle.dispatcher->HasOneRef()); 338 EXPECT_TRUE(consumer_handle.dispatcher->HasOneRef());
339 consumer_handle.reset(); 339 consumer_handle.reset();
340 } 340 }
341 EXPECT_EQ(MOJO_RESULT_OK, 341 EXPECT_EQ(MOJO_RESULT_OK,
342 waiter.Wait(test::ActionTimeout(), &context, nullptr)); 342 waiter.Wait(test::ActionTimeout(), &context, nullptr));
343 EXPECT_EQ(123u, context); 343 EXPECT_EQ(123u, context);
344 hss = HandleSignalsState(); 344 hss = HandleSignalsState();
345 message_pipe(1)->RemoveAwakable(0, &waiter, &hss); 345 message_pipe(1)->RemoveAwakable(0, false, &waiter, 0, &hss);
346 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 346 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
347 hss.satisfied_signals); 347 hss.satisfied_signals);
348 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | 348 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
349 MOJO_HANDLE_SIGNAL_PEER_CLOSED, 349 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
350 hss.satisfiable_signals); 350 hss.satisfiable_signals);
351 EXPECT_EQ(MOJO_RESULT_OK, 351 EXPECT_EQ(MOJO_RESULT_OK,
352 message_pipe(1)->ReadMessage(0, UserPointer<void>(read_buffer), 352 message_pipe(1)->ReadMessage(0, UserPointer<void>(read_buffer),
353 MakeUserPointer(&read_buffer_size), 353 MakeUserPointer(&read_buffer_size),
354 &read_handles, &read_num_handles, 354 &read_handles, &read_num_handles,
355 MOJO_READ_MESSAGE_FLAG_NONE)); 355 MOJO_READ_MESSAGE_FLAG_NONE));
(...skipping 15 matching lines...) Expand all
371 // Now actually write the data, complete the two-phase write, and close the 371 // Now actually write the data, complete the two-phase write, and close the
372 // producer. 372 // producer.
373 *static_cast<int32_t*>(write_ptr) = 123456; 373 *static_cast<int32_t*>(write_ptr) = 123456;
374 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData( 374 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(
375 static_cast<uint32_t>(1u * sizeof(int32_t)))); 375 static_cast<uint32_t>(1u * sizeof(int32_t))));
376 dp->ProducerClose(); 376 dp->ProducerClose();
377 377
378 // Wait for the consumer to be readable. 378 // Wait for the consumer to be readable.
379 waiter.Init(); 379 waiter.Init();
380 hss = HandleSignalsState(); 380 hss = HandleSignalsState();
381 MojoResult result = 381 MojoResult result = consumer->AddAwakable(&waiter, 456, false,
382 consumer->AddAwakable(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 456, &hss); 382 MOJO_HANDLE_SIGNAL_READABLE, &hss);
383 if (result == MOJO_RESULT_OK) { 383 if (result == MOJO_RESULT_OK) {
384 context = 0; 384 context = 0;
385 EXPECT_EQ(MOJO_RESULT_OK, 385 EXPECT_EQ(MOJO_RESULT_OK,
386 waiter.Wait(test::ActionTimeout(), &context, nullptr)); 386 waiter.Wait(test::ActionTimeout(), &context, nullptr));
387 EXPECT_EQ(456u, context); 387 EXPECT_EQ(456u, context);
388 consumer->RemoveAwakable(&waiter, &hss); 388 consumer->RemoveAwakable(false, &waiter, 0, &hss);
389 } else { 389 } else {
390 ASSERT_EQ(MOJO_RESULT_ALREADY_EXISTS, result); 390 ASSERT_EQ(MOJO_RESULT_ALREADY_EXISTS, result);
391 } 391 }
392 // We don't know if the fact that the producer has been closed is known yet. 392 // We don't know if the fact that the producer has been closed is known yet.
393 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE)); 393 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE));
394 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READ_THRESHOLD)); 394 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READ_THRESHOLD));
395 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); 395 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE));
396 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READ_THRESHOLD)); 396 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READ_THRESHOLD));
397 397
398 // Read one element. 398 // Read one element.
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
442 EXPECT_EQ(MOJO_RESULT_OK, 442 EXPECT_EQ(MOJO_RESULT_OK,
443 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), 443 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr),
444 MakeUserPointer(&num_bytes))); 444 MakeUserPointer(&num_bytes)));
445 ASSERT_GE(num_bytes, 1u * sizeof(int32_t)); 445 ASSERT_GE(num_bytes, 1u * sizeof(int32_t));
446 446
447 // Write the consumer to MP 0 (port 0). Wait and receive on MP 1 (port 0). 447 // Write the consumer to MP 0 (port 0). Wait and receive on MP 1 (port 0).
448 // (Add the waiter first, to avoid any handling the case where it's already 448 // (Add the waiter first, to avoid any handling the case where it's already
449 // readable.) 449 // readable.)
450 waiter.Init(); 450 waiter.Init();
451 ASSERT_EQ(MOJO_RESULT_OK, 451 ASSERT_EQ(MOJO_RESULT_OK,
452 message_pipe(1)->AddAwakable( 452 message_pipe(1)->AddAwakable(0, &waiter, 123, false,
453 0, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, 123, nullptr)); 453 MOJO_HANDLE_SIGNAL_READABLE, nullptr));
454 { 454 {
455 HandleTransport transport(test::HandleTryStartTransport(consumer_handle)); 455 HandleTransport transport(test::HandleTryStartTransport(consumer_handle));
456 EXPECT_TRUE(transport.is_valid()); 456 EXPECT_TRUE(transport.is_valid());
457 457
458 std::vector<HandleTransport> transports; 458 std::vector<HandleTransport> transports;
459 transports.push_back(transport); 459 transports.push_back(transport);
460 EXPECT_EQ(MOJO_RESULT_OK, message_pipe(0)->WriteMessage( 460 EXPECT_EQ(MOJO_RESULT_OK, message_pipe(0)->WriteMessage(
461 0, NullUserPointer(), 0, &transports, 461 0, NullUserPointer(), 0, &transports,
462 MOJO_WRITE_MESSAGE_FLAG_NONE)); 462 MOJO_WRITE_MESSAGE_FLAG_NONE));
463 transport.End(); 463 transport.End();
464 464
465 // |consumer_handle.dispatcher| should have been closed. This is 465 // |consumer_handle.dispatcher| should have been closed. This is
466 // |DCHECK()|ed when it is destroyed. 466 // |DCHECK()|ed when it is destroyed.
467 EXPECT_TRUE(consumer_handle.dispatcher->HasOneRef()); 467 EXPECT_TRUE(consumer_handle.dispatcher->HasOneRef());
468 consumer_handle.reset(); 468 consumer_handle.reset();
469 } 469 }
470 EXPECT_EQ(MOJO_RESULT_OK, 470 EXPECT_EQ(MOJO_RESULT_OK,
471 waiter.Wait(test::ActionTimeout(), &context, nullptr)); 471 waiter.Wait(test::ActionTimeout(), &context, nullptr));
472 EXPECT_EQ(123u, context); 472 EXPECT_EQ(123u, context);
473 hss = HandleSignalsState(); 473 hss = HandleSignalsState();
474 message_pipe(1)->RemoveAwakable(0, &waiter, &hss); 474 message_pipe(1)->RemoveAwakable(0, false, &waiter, 0, &hss);
475 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 475 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
476 hss.satisfied_signals); 476 hss.satisfied_signals);
477 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | 477 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
478 MOJO_HANDLE_SIGNAL_PEER_CLOSED, 478 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
479 hss.satisfiable_signals); 479 hss.satisfiable_signals);
480 EXPECT_EQ(MOJO_RESULT_OK, 480 EXPECT_EQ(MOJO_RESULT_OK,
481 message_pipe(1)->ReadMessage(0, UserPointer<void>(read_buffer), 481 message_pipe(1)->ReadMessage(0, UserPointer<void>(read_buffer),
482 MakeUserPointer(&read_buffer_size), 482 MakeUserPointer(&read_buffer_size),
483 &read_handles, &read_num_handles, 483 &read_handles, &read_num_handles,
484 MOJO_READ_MESSAGE_FLAG_NONE)); 484 MOJO_READ_MESSAGE_FLAG_NONE));
(...skipping 15 matching lines...) Expand all
500 // Now actually write the data, complete the two-phase write, and close the 500 // Now actually write the data, complete the two-phase write, and close the
501 // producer. 501 // producer.
502 *static_cast<int32_t*>(write_ptr) = 789012; 502 *static_cast<int32_t*>(write_ptr) = 789012;
503 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData( 503 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(
504 static_cast<uint32_t>(1u * sizeof(int32_t)))); 504 static_cast<uint32_t>(1u * sizeof(int32_t))));
505 dp->ProducerClose(); 505 dp->ProducerClose();
506 506
507 // Wait for the consumer to know that the producer is closed. 507 // Wait for the consumer to know that the producer is closed.
508 waiter.Init(); 508 waiter.Init();
509 hss = HandleSignalsState(); 509 hss = HandleSignalsState();
510 MojoResult result = 510 MojoResult result = consumer->AddAwakable(
511 consumer->AddAwakable(&waiter, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 456, &hss); 511 &waiter, 456, false, MOJO_HANDLE_SIGNAL_PEER_CLOSED, &hss);
512 if (result == MOJO_RESULT_OK) { 512 if (result == MOJO_RESULT_OK) {
513 context = 0; 513 context = 0;
514 EXPECT_EQ(MOJO_RESULT_OK, 514 EXPECT_EQ(MOJO_RESULT_OK,
515 waiter.Wait(test::ActionTimeout(), &context, nullptr)); 515 waiter.Wait(test::ActionTimeout(), &context, nullptr));
516 EXPECT_EQ(456u, context); 516 EXPECT_EQ(456u, context);
517 consumer->RemoveAwakable(&waiter, &hss); 517 consumer->RemoveAwakable(false, &waiter, 0, &hss);
518 } else { 518 } else {
519 ASSERT_EQ(MOJO_RESULT_ALREADY_EXISTS, result); 519 ASSERT_EQ(MOJO_RESULT_ALREADY_EXISTS, result);
520 } 520 }
521 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | 521 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
522 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, 522 MOJO_HANDLE_SIGNAL_READ_THRESHOLD,
523 hss.satisfied_signals); 523 hss.satisfied_signals);
524 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | 524 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
525 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, 525 MOJO_HANDLE_SIGNAL_READ_THRESHOLD,
526 hss.satisfiable_signals); 526 hss.satisfiable_signals);
527 527
528 // Read some elements. 528 // Read some elements.
529 int32_t elements[10] = {}; 529 int32_t elements[10] = {};
530 num_bytes = static_cast<uint32_t>(sizeof(elements)); 530 num_bytes = static_cast<uint32_t>(sizeof(elements));
531 EXPECT_EQ(MOJO_RESULT_OK, consumer->ReadData(UserPointer<void>(elements), 531 EXPECT_EQ(MOJO_RESULT_OK, consumer->ReadData(UserPointer<void>(elements),
532 MakeUserPointer(&num_bytes), 532 MakeUserPointer(&num_bytes),
533 MOJO_READ_DATA_FLAG_NONE)); 533 MOJO_READ_DATA_FLAG_NONE));
534 EXPECT_EQ(2u * sizeof(elements[0]), num_bytes); 534 EXPECT_EQ(2u * sizeof(elements[0]), num_bytes);
535 EXPECT_EQ(123456, elements[0]); 535 EXPECT_EQ(123456, elements[0]);
536 EXPECT_EQ(789012, elements[1]); 536 EXPECT_EQ(789012, elements[1]);
537 EXPECT_EQ(0, elements[2]); 537 EXPECT_EQ(0, elements[2]);
538 538
539 consumer->Close(); 539 consumer->Close();
540 } 540 }
541 541
542 } // namespace 542 } // namespace
543 } // namespace system 543 } // namespace system
544 } // namespace mojo 544 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/edk/system/message_pipe_unittest.cc ('k') | mojo/edk/system/remote_message_pipe_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698