| 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 #include "mojo/edk/system/local_data_pipe.h" | 5 #include "mojo/edk/system/local_data_pipe.h" |
| 6 | 6 |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 | 8 |
| 9 #include "base/macros.h" | 9 #include "base/macros.h" |
| 10 #include "base/memory/ref_counted.h" | 10 #include "base/memory/ref_counted.h" |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 232 uint32_t context = 0; | 232 uint32_t context = 0; |
| 233 HandleSignalsState hss; | 233 HandleSignalsState hss; |
| 234 | 234 |
| 235 // Never readable. | 235 // Never readable. |
| 236 waiter.Init(); | 236 waiter.Init(); |
| 237 hss = HandleSignalsState(); | 237 hss = HandleSignalsState(); |
| 238 EXPECT_EQ( | 238 EXPECT_EQ( |
| 239 MOJO_RESULT_FAILED_PRECONDITION, | 239 MOJO_RESULT_FAILED_PRECONDITION, |
| 240 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 12, &hss)); | 240 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 12, &hss)); |
| 241 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 241 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 242 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); | 242 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_CLOSED, |
| 243 hss.satisfiable_signals); |
| 243 | 244 |
| 244 // Already writable. | 245 // Already writable. |
| 245 waiter.Init(); | 246 waiter.Init(); |
| 246 hss = HandleSignalsState(); | 247 hss = HandleSignalsState(); |
| 247 EXPECT_EQ( | 248 EXPECT_EQ( |
| 248 MOJO_RESULT_ALREADY_EXISTS, | 249 MOJO_RESULT_ALREADY_EXISTS, |
| 249 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 34, &hss)); | 250 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 34, &hss)); |
| 250 | 251 |
| 251 // Write two elements. | 252 // Write two elements. |
| 252 int32_t elements[2] = {123, 456}; | 253 int32_t elements[2] = {123, 456}; |
| 253 uint32_t num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); | 254 uint32_t num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); |
| 254 EXPECT_EQ(MOJO_RESULT_OK, | 255 EXPECT_EQ(MOJO_RESULT_OK, |
| 255 dp->ProducerWriteData(UserPointer<const void>(elements), | 256 dp->ProducerWriteData(UserPointer<const void>(elements), |
| 256 MakeUserPointer(&num_bytes), true)); | 257 MakeUserPointer(&num_bytes), true)); |
| 257 EXPECT_EQ(static_cast<uint32_t>(2u * sizeof(elements[0])), num_bytes); | 258 EXPECT_EQ(static_cast<uint32_t>(2u * sizeof(elements[0])), num_bytes); |
| 258 | 259 |
| 259 // Adding a waiter should now succeed. | 260 // Adding a waiter should now succeed. |
| 260 waiter.Init(); | 261 waiter.Init(); |
| 261 ASSERT_EQ( | 262 ASSERT_EQ( |
| 262 MOJO_RESULT_OK, | 263 MOJO_RESULT_OK, |
| 263 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 56, nullptr)); | 264 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 56, nullptr)); |
| 264 // And it shouldn't be writable yet. | 265 // And it shouldn't be writable yet. |
| 265 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); | 266 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); |
| 266 hss = HandleSignalsState(); | 267 hss = HandleSignalsState(); |
| 267 dp->ProducerRemoveWaiter(&waiter, &hss); | 268 dp->ProducerRemoveWaiter(&waiter, &hss); |
| 268 EXPECT_EQ(0u, hss.satisfied_signals); | 269 EXPECT_EQ(0u, hss.satisfied_signals); |
| 269 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); | 270 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_CLOSED, |
| 271 hss.satisfiable_signals); |
| 270 | 272 |
| 271 // Peek one element. | 273 // Peek one element. |
| 272 elements[0] = -1; | 274 elements[0] = -1; |
| 273 elements[1] = -1; | 275 elements[1] = -1; |
| 274 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 276 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
| 275 EXPECT_EQ(MOJO_RESULT_OK, | 277 EXPECT_EQ(MOJO_RESULT_OK, |
| 276 dp->ConsumerReadData(UserPointer<void>(elements), | 278 dp->ConsumerReadData(UserPointer<void>(elements), |
| 277 MakeUserPointer(&num_bytes), true, true)); | 279 MakeUserPointer(&num_bytes), true, true)); |
| 278 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); | 280 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
| 279 EXPECT_EQ(123, elements[0]); | 281 EXPECT_EQ(123, elements[0]); |
| 280 EXPECT_EQ(-1, elements[1]); | 282 EXPECT_EQ(-1, elements[1]); |
| 281 | 283 |
| 282 // Add a waiter. | 284 // Add a waiter. |
| 283 waiter.Init(); | 285 waiter.Init(); |
| 284 ASSERT_EQ( | 286 ASSERT_EQ( |
| 285 MOJO_RESULT_OK, | 287 MOJO_RESULT_OK, |
| 286 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 56, nullptr)); | 288 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 56, nullptr)); |
| 287 // And it still shouldn't be writable yet. | 289 // And it still shouldn't be writable yet. |
| 288 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); | 290 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); |
| 289 hss = HandleSignalsState(); | 291 hss = HandleSignalsState(); |
| 290 dp->ProducerRemoveWaiter(&waiter, &hss); | 292 dp->ProducerRemoveWaiter(&waiter, &hss); |
| 291 EXPECT_EQ(0u, hss.satisfied_signals); | 293 EXPECT_EQ(0u, hss.satisfied_signals); |
| 292 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); | 294 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_CLOSED, |
| 295 hss.satisfiable_signals); |
| 293 | 296 |
| 294 // Do it again. | 297 // Do it again. |
| 295 waiter.Init(); | 298 waiter.Init(); |
| 296 ASSERT_EQ( | 299 ASSERT_EQ( |
| 297 MOJO_RESULT_OK, | 300 MOJO_RESULT_OK, |
| 298 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 78, nullptr)); | 301 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 78, nullptr)); |
| 299 | 302 |
| 300 // Read one element. | 303 // Read one element. |
| 301 elements[0] = -1; | 304 elements[0] = -1; |
| 302 elements[1] = -1; | 305 elements[1] = -1; |
| 303 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 306 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
| 304 EXPECT_EQ(MOJO_RESULT_OK, | 307 EXPECT_EQ(MOJO_RESULT_OK, |
| 305 dp->ConsumerReadData(UserPointer<void>(elements), | 308 dp->ConsumerReadData(UserPointer<void>(elements), |
| 306 MakeUserPointer(&num_bytes), true, false)); | 309 MakeUserPointer(&num_bytes), true, false)); |
| 307 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); | 310 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
| 308 EXPECT_EQ(123, elements[0]); | 311 EXPECT_EQ(123, elements[0]); |
| 309 EXPECT_EQ(-1, elements[1]); | 312 EXPECT_EQ(-1, elements[1]); |
| 310 | 313 |
| 311 // Waiting should now succeed. | 314 // Waiting should now succeed. |
| 312 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(1000, &context)); | 315 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(1000, &context)); |
| 313 EXPECT_EQ(78u, context); | 316 EXPECT_EQ(78u, context); |
| 314 hss = HandleSignalsState(); | 317 hss = HandleSignalsState(); |
| 315 dp->ProducerRemoveWaiter(&waiter, &hss); | 318 dp->ProducerRemoveWaiter(&waiter, &hss); |
| 316 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 319 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 317 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); | 320 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_CLOSED, |
| 321 hss.satisfiable_signals); |
| 318 | 322 |
| 319 // Try writing, using a two-phase write. | 323 // Try writing, using a two-phase write. |
| 320 void* buffer = nullptr; | 324 void* buffer = nullptr; |
| 321 num_bytes = static_cast<uint32_t>(3u * sizeof(elements[0])); | 325 num_bytes = static_cast<uint32_t>(3u * sizeof(elements[0])); |
| 322 EXPECT_EQ(MOJO_RESULT_OK, | 326 EXPECT_EQ(MOJO_RESULT_OK, |
| 323 dp->ProducerBeginWriteData(MakeUserPointer(&buffer), | 327 dp->ProducerBeginWriteData(MakeUserPointer(&buffer), |
| 324 MakeUserPointer(&num_bytes), false)); | 328 MakeUserPointer(&num_bytes), false)); |
| 325 EXPECT_TRUE(buffer); | 329 EXPECT_TRUE(buffer); |
| 326 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); | 330 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
| 327 | 331 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 350 EXPECT_EQ( | 354 EXPECT_EQ( |
| 351 MOJO_RESULT_OK, | 355 MOJO_RESULT_OK, |
| 352 dp->ConsumerEndReadData(static_cast<uint32_t>(1u * sizeof(elements[0])))); | 356 dp->ConsumerEndReadData(static_cast<uint32_t>(1u * sizeof(elements[0])))); |
| 353 | 357 |
| 354 // Waiting should succeed. | 358 // Waiting should succeed. |
| 355 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(1000, &context)); | 359 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(1000, &context)); |
| 356 EXPECT_EQ(90u, context); | 360 EXPECT_EQ(90u, context); |
| 357 hss = HandleSignalsState(); | 361 hss = HandleSignalsState(); |
| 358 dp->ProducerRemoveWaiter(&waiter, &hss); | 362 dp->ProducerRemoveWaiter(&waiter, &hss); |
| 359 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 363 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 360 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); | 364 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_CLOSED, |
| 365 hss.satisfiable_signals); |
| 361 | 366 |
| 362 // Write one element. | 367 // Write one element. |
| 363 elements[0] = 123; | 368 elements[0] = 123; |
| 364 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 369 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
| 365 EXPECT_EQ(MOJO_RESULT_OK, | 370 EXPECT_EQ(MOJO_RESULT_OK, |
| 366 dp->ProducerWriteData(UserPointer<const void>(elements), | 371 dp->ProducerWriteData(UserPointer<const void>(elements), |
| 367 MakeUserPointer(&num_bytes), false)); | 372 MakeUserPointer(&num_bytes), false)); |
| 368 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); | 373 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
| 369 | 374 |
| 370 // Add a waiter. | 375 // Add a waiter. |
| 371 waiter.Init(); | 376 waiter.Init(); |
| 372 ASSERT_EQ( | 377 ASSERT_EQ( |
| 373 MOJO_RESULT_OK, | 378 MOJO_RESULT_OK, |
| 374 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 12, nullptr)); | 379 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 12, nullptr)); |
| 375 | 380 |
| 376 // Close the consumer. | 381 // Close the consumer. |
| 377 dp->ConsumerClose(); | 382 dp->ConsumerClose(); |
| 378 | 383 |
| 379 // It should now be never-writable. | 384 // It should now be never-writable. |
| 380 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, waiter.Wait(1000, &context)); | 385 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, waiter.Wait(1000, &context)); |
| 381 EXPECT_EQ(12u, context); | 386 EXPECT_EQ(12u, context); |
| 382 hss = HandleSignalsState(); | 387 hss = HandleSignalsState(); |
| 383 dp->ProducerRemoveWaiter(&waiter, &hss); | 388 dp->ProducerRemoveWaiter(&waiter, &hss); |
| 384 EXPECT_EQ(0u, hss.satisfied_signals); | 389 EXPECT_EQ(MOJO_HANDLE_SIGNAL_CLOSED, hss.satisfied_signals); |
| 385 EXPECT_EQ(0u, hss.satisfiable_signals); | 390 EXPECT_EQ(MOJO_HANDLE_SIGNAL_CLOSED, hss.satisfiable_signals); |
| 386 | 391 |
| 387 dp->ProducerClose(); | 392 dp->ProducerClose(); |
| 388 } | 393 } |
| 389 | 394 |
| 390 TEST(LocalDataPipeTest, BasicConsumerWaiting) { | 395 TEST(LocalDataPipeTest, BasicConsumerWaiting) { |
| 391 const MojoCreateDataPipeOptions options = { | 396 const MojoCreateDataPipeOptions options = { |
| 392 kSizeOfOptions, // |struct_size|. | 397 kSizeOfOptions, // |struct_size|. |
| 393 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. | 398 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. |
| 394 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. | 399 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. |
| 395 1000 * sizeof(int32_t) // |capacity_num_bytes|. | 400 1000 * sizeof(int32_t) // |capacity_num_bytes|. |
| 396 }; | 401 }; |
| 397 MojoCreateDataPipeOptions validated_options = {0}; | 402 MojoCreateDataPipeOptions validated_options = {0}; |
| 398 EXPECT_EQ(MOJO_RESULT_OK, DataPipe::ValidateCreateOptions( | 403 EXPECT_EQ(MOJO_RESULT_OK, DataPipe::ValidateCreateOptions( |
| 399 MakeUserPointer(&options), &validated_options)); | 404 MakeUserPointer(&options), &validated_options)); |
| 400 | 405 |
| 401 { | 406 { |
| 402 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 407 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 403 Waiter waiter; | 408 Waiter waiter; |
| 404 uint32_t context = 0; | 409 uint32_t context = 0; |
| 405 HandleSignalsState hss; | 410 HandleSignalsState hss; |
| 406 | 411 |
| 407 // Never writable. | 412 // Never writable. |
| 408 waiter.Init(); | 413 waiter.Init(); |
| 409 hss = HandleSignalsState(); | 414 hss = HandleSignalsState(); |
| 410 EXPECT_EQ( | 415 EXPECT_EQ( |
| 411 MOJO_RESULT_FAILED_PRECONDITION, | 416 MOJO_RESULT_FAILED_PRECONDITION, |
| 412 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 12, &hss)); | 417 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 12, &hss)); |
| 413 EXPECT_EQ(0u, hss.satisfied_signals); | 418 EXPECT_EQ(0u, hss.satisfied_signals); |
| 414 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 419 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED, |
| 420 hss.satisfiable_signals); |
| 415 | 421 |
| 416 // Not yet readable. | 422 // Not yet readable. |
| 417 waiter.Init(); | 423 waiter.Init(); |
| 418 ASSERT_EQ(MOJO_RESULT_OK, | 424 ASSERT_EQ(MOJO_RESULT_OK, |
| 419 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 34, | 425 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 34, |
| 420 nullptr)); | 426 nullptr)); |
| 421 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); | 427 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); |
| 422 hss = HandleSignalsState(); | 428 hss = HandleSignalsState(); |
| 423 dp->ConsumerRemoveWaiter(&waiter, &hss); | 429 dp->ConsumerRemoveWaiter(&waiter, &hss); |
| 424 EXPECT_EQ(0u, hss.satisfied_signals); | 430 EXPECT_EQ(0u, hss.satisfied_signals); |
| 425 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 431 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED, |
| 432 hss.satisfiable_signals); |
| 426 | 433 |
| 427 // Write two elements. | 434 // Write two elements. |
| 428 int32_t elements[2] = {123, 456}; | 435 int32_t elements[2] = {123, 456}; |
| 429 uint32_t num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); | 436 uint32_t num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); |
| 430 EXPECT_EQ(MOJO_RESULT_OK, | 437 EXPECT_EQ(MOJO_RESULT_OK, |
| 431 dp->ProducerWriteData(UserPointer<const void>(elements), | 438 dp->ProducerWriteData(UserPointer<const void>(elements), |
| 432 MakeUserPointer(&num_bytes), true)); | 439 MakeUserPointer(&num_bytes), true)); |
| 433 | 440 |
| 434 // Should already be readable. | 441 // Should already be readable. |
| 435 waiter.Init(); | 442 waiter.Init(); |
| 436 hss = HandleSignalsState(); | 443 hss = HandleSignalsState(); |
| 437 EXPECT_EQ( | 444 EXPECT_EQ( |
| 438 MOJO_RESULT_ALREADY_EXISTS, | 445 MOJO_RESULT_ALREADY_EXISTS, |
| 439 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 56, &hss)); | 446 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 56, &hss)); |
| 440 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 447 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
| 441 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 448 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED, |
| 449 hss.satisfiable_signals); |
| 442 | 450 |
| 443 // Discard one element. | 451 // Discard one element. |
| 444 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 452 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
| 445 EXPECT_EQ(MOJO_RESULT_OK, | 453 EXPECT_EQ(MOJO_RESULT_OK, |
| 446 dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true)); | 454 dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true)); |
| 447 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); | 455 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
| 448 | 456 |
| 449 // Should still be readable. | 457 // Should still be readable. |
| 450 waiter.Init(); | 458 waiter.Init(); |
| 451 hss = HandleSignalsState(); | 459 hss = HandleSignalsState(); |
| 452 EXPECT_EQ( | 460 EXPECT_EQ( |
| 453 MOJO_RESULT_ALREADY_EXISTS, | 461 MOJO_RESULT_ALREADY_EXISTS, |
| 454 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 78, &hss)); | 462 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 78, &hss)); |
| 455 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 463 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
| 456 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 464 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED, |
| 465 hss.satisfiable_signals); |
| 457 | 466 |
| 458 // Peek one element. | 467 // Peek one element. |
| 459 elements[0] = -1; | 468 elements[0] = -1; |
| 460 elements[1] = -1; | 469 elements[1] = -1; |
| 461 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 470 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
| 462 EXPECT_EQ(MOJO_RESULT_OK, | 471 EXPECT_EQ(MOJO_RESULT_OK, |
| 463 dp->ConsumerReadData(UserPointer<void>(elements), | 472 dp->ConsumerReadData(UserPointer<void>(elements), |
| 464 MakeUserPointer(&num_bytes), true, true)); | 473 MakeUserPointer(&num_bytes), true, true)); |
| 465 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); | 474 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
| 466 EXPECT_EQ(456, elements[0]); | 475 EXPECT_EQ(456, elements[0]); |
| 467 EXPECT_EQ(-1, elements[1]); | 476 EXPECT_EQ(-1, elements[1]); |
| 468 | 477 |
| 469 // Should still be readable. | 478 // Should still be readable. |
| 470 waiter.Init(); | 479 waiter.Init(); |
| 471 hss = HandleSignalsState(); | 480 hss = HandleSignalsState(); |
| 472 EXPECT_EQ( | 481 EXPECT_EQ( |
| 473 MOJO_RESULT_ALREADY_EXISTS, | 482 MOJO_RESULT_ALREADY_EXISTS, |
| 474 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 78, &hss)); | 483 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 78, &hss)); |
| 475 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 484 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
| 476 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 485 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED, |
| 486 hss.satisfiable_signals); |
| 477 | 487 |
| 478 // Read one element. | 488 // Read one element. |
| 479 elements[0] = -1; | 489 elements[0] = -1; |
| 480 elements[1] = -1; | 490 elements[1] = -1; |
| 481 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 491 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
| 482 EXPECT_EQ(MOJO_RESULT_OK, | 492 EXPECT_EQ(MOJO_RESULT_OK, |
| 483 dp->ConsumerReadData(UserPointer<void>(elements), | 493 dp->ConsumerReadData(UserPointer<void>(elements), |
| 484 MakeUserPointer(&num_bytes), true, false)); | 494 MakeUserPointer(&num_bytes), true, false)); |
| 485 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); | 495 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
| 486 EXPECT_EQ(456, elements[0]); | 496 EXPECT_EQ(456, elements[0]); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 499 EXPECT_EQ(MOJO_RESULT_OK, | 509 EXPECT_EQ(MOJO_RESULT_OK, |
| 500 dp->ProducerWriteData(UserPointer<const void>(elements), | 510 dp->ProducerWriteData(UserPointer<const void>(elements), |
| 501 MakeUserPointer(&num_bytes), true)); | 511 MakeUserPointer(&num_bytes), true)); |
| 502 | 512 |
| 503 // Waiting should now succeed. | 513 // Waiting should now succeed. |
| 504 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(1000, &context)); | 514 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(1000, &context)); |
| 505 EXPECT_EQ(90u, context); | 515 EXPECT_EQ(90u, context); |
| 506 hss = HandleSignalsState(); | 516 hss = HandleSignalsState(); |
| 507 dp->ConsumerRemoveWaiter(&waiter, &hss); | 517 dp->ConsumerRemoveWaiter(&waiter, &hss); |
| 508 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 518 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
| 509 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 519 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED, |
| 520 hss.satisfiable_signals); |
| 510 | 521 |
| 511 // Close the producer. | 522 // Close the producer. |
| 512 dp->ProducerClose(); | 523 dp->ProducerClose(); |
| 513 | 524 |
| 514 // Should still be readable. | 525 // Should still be readable. |
| 515 waiter.Init(); | 526 waiter.Init(); |
| 516 hss = HandleSignalsState(); | 527 hss = HandleSignalsState(); |
| 517 EXPECT_EQ( | 528 EXPECT_EQ( |
| 518 MOJO_RESULT_ALREADY_EXISTS, | 529 MOJO_RESULT_ALREADY_EXISTS, |
| 519 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 12, &hss)); | 530 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 12, &hss)); |
| 520 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 531 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED, |
| 521 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 532 hss.satisfied_signals); |
| 533 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED, |
| 534 hss.satisfiable_signals); |
| 522 | 535 |
| 523 // Read one element. | 536 // Read one element. |
| 524 elements[0] = -1; | 537 elements[0] = -1; |
| 525 elements[1] = -1; | 538 elements[1] = -1; |
| 526 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 539 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
| 527 EXPECT_EQ(MOJO_RESULT_OK, | 540 EXPECT_EQ(MOJO_RESULT_OK, |
| 528 dp->ConsumerReadData(UserPointer<void>(elements), | 541 dp->ConsumerReadData(UserPointer<void>(elements), |
| 529 MakeUserPointer(&num_bytes), true, false)); | 542 MakeUserPointer(&num_bytes), true, false)); |
| 530 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); | 543 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
| 531 EXPECT_EQ(789, elements[0]); | 544 EXPECT_EQ(789, elements[0]); |
| 532 EXPECT_EQ(-1, elements[1]); | 545 EXPECT_EQ(-1, elements[1]); |
| 533 | 546 |
| 534 // Should be never-readable. | 547 // Should be never-readable. |
| 535 waiter.Init(); | 548 waiter.Init(); |
| 536 hss = HandleSignalsState(); | 549 hss = HandleSignalsState(); |
| 537 EXPECT_EQ( | 550 EXPECT_EQ( |
| 538 MOJO_RESULT_FAILED_PRECONDITION, | 551 MOJO_RESULT_FAILED_PRECONDITION, |
| 539 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 34, &hss)); | 552 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 34, &hss)); |
| 540 EXPECT_EQ(0u, hss.satisfied_signals); | 553 EXPECT_EQ(MOJO_HANDLE_SIGNAL_CLOSED, hss.satisfied_signals); |
| 541 EXPECT_EQ(0u, hss.satisfiable_signals); | 554 EXPECT_EQ(MOJO_HANDLE_SIGNAL_CLOSED, hss.satisfiable_signals); |
| 542 | 555 |
| 543 dp->ConsumerClose(); | 556 dp->ConsumerClose(); |
| 544 } | 557 } |
| 545 | 558 |
| 546 // Test with two-phase APIs and closing the producer with an active consumer | 559 // Test with two-phase APIs and closing the producer with an active consumer |
| 547 // waiter. | 560 // waiter. |
| 548 { | 561 { |
| 549 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 562 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 550 Waiter waiter; | 563 Waiter waiter; |
| 551 uint32_t context = 0; | 564 uint32_t context = 0; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 567 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(static_cast<uint32_t>( | 580 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(static_cast<uint32_t>( |
| 568 2u * sizeof(elements[0])))); | 581 2u * sizeof(elements[0])))); |
| 569 | 582 |
| 570 // Should already be readable. | 583 // Should already be readable. |
| 571 waiter.Init(); | 584 waiter.Init(); |
| 572 hss = HandleSignalsState(); | 585 hss = HandleSignalsState(); |
| 573 EXPECT_EQ( | 586 EXPECT_EQ( |
| 574 MOJO_RESULT_ALREADY_EXISTS, | 587 MOJO_RESULT_ALREADY_EXISTS, |
| 575 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 12, &hss)); | 588 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 12, &hss)); |
| 576 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 589 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
| 577 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 590 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED, |
| 591 hss.satisfiable_signals); |
| 578 | 592 |
| 579 // Read one element. | 593 // Read one element. |
| 580 // Request two in all-or-none mode, but only read one. | 594 // Request two in all-or-none mode, but only read one. |
| 581 const void* read_buffer = nullptr; | 595 const void* read_buffer = nullptr; |
| 582 num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); | 596 num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); |
| 583 EXPECT_EQ(MOJO_RESULT_OK, | 597 EXPECT_EQ(MOJO_RESULT_OK, |
| 584 dp->ConsumerBeginReadData(MakeUserPointer(&read_buffer), | 598 dp->ConsumerBeginReadData(MakeUserPointer(&read_buffer), |
| 585 MakeUserPointer(&num_bytes), true)); | 599 MakeUserPointer(&num_bytes), true)); |
| 586 EXPECT_TRUE(read_buffer); | 600 EXPECT_TRUE(read_buffer); |
| 587 EXPECT_EQ(static_cast<uint32_t>(2u * sizeof(elements[0])), num_bytes); | 601 EXPECT_EQ(static_cast<uint32_t>(2u * sizeof(elements[0])), num_bytes); |
| 588 const int32_t* read_elements = static_cast<const int32_t*>(read_buffer); | 602 const int32_t* read_elements = static_cast<const int32_t*>(read_buffer); |
| 589 EXPECT_EQ(123, read_elements[0]); | 603 EXPECT_EQ(123, read_elements[0]); |
| 590 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(static_cast<uint32_t>( | 604 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(static_cast<uint32_t>( |
| 591 1u * sizeof(elements[0])))); | 605 1u * sizeof(elements[0])))); |
| 592 | 606 |
| 593 // Should still be readable. | 607 // Should still be readable. |
| 594 waiter.Init(); | 608 waiter.Init(); |
| 595 hss = HandleSignalsState(); | 609 hss = HandleSignalsState(); |
| 596 EXPECT_EQ( | 610 EXPECT_EQ( |
| 597 MOJO_RESULT_ALREADY_EXISTS, | 611 MOJO_RESULT_ALREADY_EXISTS, |
| 598 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 34, &hss)); | 612 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 34, &hss)); |
| 599 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 613 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
| 600 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 614 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED, |
| 615 hss.satisfiable_signals); |
| 601 | 616 |
| 602 // Read one element. | 617 // Read one element. |
| 603 // Request three, but not in all-or-none mode. | 618 // Request three, but not in all-or-none mode. |
| 604 read_buffer = nullptr; | 619 read_buffer = nullptr; |
| 605 num_bytes = static_cast<uint32_t>(3u * sizeof(elements[0])); | 620 num_bytes = static_cast<uint32_t>(3u * sizeof(elements[0])); |
| 606 EXPECT_EQ(MOJO_RESULT_OK, | 621 EXPECT_EQ(MOJO_RESULT_OK, |
| 607 dp->ConsumerBeginReadData(MakeUserPointer(&read_buffer), | 622 dp->ConsumerBeginReadData(MakeUserPointer(&read_buffer), |
| 608 MakeUserPointer(&num_bytes), false)); | 623 MakeUserPointer(&num_bytes), false)); |
| 609 EXPECT_TRUE(read_buffer); | 624 EXPECT_TRUE(read_buffer); |
| 610 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); | 625 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
| 611 read_elements = static_cast<const int32_t*>(read_buffer); | 626 read_elements = static_cast<const int32_t*>(read_buffer); |
| 612 EXPECT_EQ(456, read_elements[0]); | 627 EXPECT_EQ(456, read_elements[0]); |
| 613 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(static_cast<uint32_t>( | 628 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(static_cast<uint32_t>( |
| 614 1u * sizeof(elements[0])))); | 629 1u * sizeof(elements[0])))); |
| 615 | 630 |
| 616 // Adding a waiter should now succeed. | 631 // Adding a waiter should now succeed. |
| 617 waiter.Init(); | 632 waiter.Init(); |
| 618 ASSERT_EQ(MOJO_RESULT_OK, | 633 ASSERT_EQ(MOJO_RESULT_OK, |
| 619 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 56, | 634 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 56, |
| 620 nullptr)); | 635 nullptr)); |
| 621 | 636 |
| 622 // Close the producer. | 637 // Close the producer. |
| 623 dp->ProducerClose(); | 638 dp->ProducerClose(); |
| 624 | 639 |
| 625 // Should be never-readable. | 640 // Should be never-readable. |
| 626 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, waiter.Wait(1000, &context)); | 641 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, waiter.Wait(1000, &context)); |
| 627 EXPECT_EQ(56u, context); | 642 EXPECT_EQ(56u, context); |
| 628 hss = HandleSignalsState(); | 643 hss = HandleSignalsState(); |
| 629 dp->ConsumerRemoveWaiter(&waiter, &hss); | 644 dp->ConsumerRemoveWaiter(&waiter, &hss); |
| 630 EXPECT_EQ(0u, hss.satisfied_signals); | 645 EXPECT_EQ(MOJO_HANDLE_SIGNAL_CLOSED, hss.satisfied_signals); |
| 631 EXPECT_EQ(0u, hss.satisfiable_signals); | 646 EXPECT_EQ(MOJO_HANDLE_SIGNAL_CLOSED, hss.satisfiable_signals); |
| 632 | 647 |
| 633 dp->ConsumerClose(); | 648 dp->ConsumerClose(); |
| 634 } | 649 } |
| 635 } | 650 } |
| 636 | 651 |
| 637 // Tests that data pipes aren't writable/readable during two-phase writes/reads. | 652 // Tests that data pipes aren't writable/readable during two-phase writes/reads. |
| 638 TEST(LocalDataPipeTest, BasicTwoPhaseWaiting) { | 653 TEST(LocalDataPipeTest, BasicTwoPhaseWaiting) { |
| 639 const MojoCreateDataPipeOptions options = { | 654 const MojoCreateDataPipeOptions options = { |
| 640 kSizeOfOptions, // |struct_size|. | 655 kSizeOfOptions, // |struct_size|. |
| 641 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. | 656 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. |
| 642 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. | 657 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. |
| 643 1000 * sizeof(int32_t) // |capacity_num_bytes|. | 658 1000 * sizeof(int32_t) // |capacity_num_bytes|. |
| 644 }; | 659 }; |
| 645 MojoCreateDataPipeOptions validated_options = {0}; | 660 MojoCreateDataPipeOptions validated_options = {0}; |
| 646 EXPECT_EQ(MOJO_RESULT_OK, DataPipe::ValidateCreateOptions( | 661 EXPECT_EQ(MOJO_RESULT_OK, DataPipe::ValidateCreateOptions( |
| 647 MakeUserPointer(&options), &validated_options)); | 662 MakeUserPointer(&options), &validated_options)); |
| 648 | 663 |
| 649 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 664 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 650 Waiter waiter; | 665 Waiter waiter; |
| 651 HandleSignalsState hss; | 666 HandleSignalsState hss; |
| 652 | 667 |
| 653 // It should be writable. | 668 // It should be writable. |
| 654 waiter.Init(); | 669 waiter.Init(); |
| 655 hss = HandleSignalsState(); | 670 hss = HandleSignalsState(); |
| 656 EXPECT_EQ( | 671 EXPECT_EQ( |
| 657 MOJO_RESULT_ALREADY_EXISTS, | 672 MOJO_RESULT_ALREADY_EXISTS, |
| 658 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss)); | 673 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss)); |
| 659 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 674 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 660 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); | 675 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_CLOSED, |
| 676 hss.satisfiable_signals); |
| 661 | 677 |
| 662 uint32_t num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t)); | 678 uint32_t num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t)); |
| 663 void* write_ptr = nullptr; | 679 void* write_ptr = nullptr; |
| 664 EXPECT_EQ(MOJO_RESULT_OK, | 680 EXPECT_EQ(MOJO_RESULT_OK, |
| 665 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), | 681 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), |
| 666 MakeUserPointer(&num_bytes), false)); | 682 MakeUserPointer(&num_bytes), false)); |
| 667 EXPECT_TRUE(write_ptr); | 683 EXPECT_TRUE(write_ptr); |
| 668 EXPECT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(int32_t))); | 684 EXPECT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(int32_t))); |
| 669 | 685 |
| 670 // At this point, it shouldn't be writable. | 686 // At this point, it shouldn't be writable. |
| 671 waiter.Init(); | 687 waiter.Init(); |
| 672 ASSERT_EQ( | 688 ASSERT_EQ( |
| 673 MOJO_RESULT_OK, | 689 MOJO_RESULT_OK, |
| 674 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 1, nullptr)); | 690 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 1, nullptr)); |
| 675 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); | 691 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); |
| 676 hss = HandleSignalsState(); | 692 hss = HandleSignalsState(); |
| 677 dp->ProducerRemoveWaiter(&waiter, &hss); | 693 dp->ProducerRemoveWaiter(&waiter, &hss); |
| 678 EXPECT_EQ(0u, hss.satisfied_signals); | 694 EXPECT_EQ(0u, hss.satisfied_signals); |
| 679 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); | 695 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_CLOSED, |
| 696 hss.satisfiable_signals); |
| 680 | 697 |
| 681 // It shouldn't be readable yet either. | 698 // It shouldn't be readable yet either. |
| 682 waiter.Init(); | 699 waiter.Init(); |
| 683 ASSERT_EQ( | 700 ASSERT_EQ( |
| 684 MOJO_RESULT_OK, | 701 MOJO_RESULT_OK, |
| 685 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 2, nullptr)); | 702 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 2, nullptr)); |
| 686 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); | 703 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); |
| 687 hss = HandleSignalsState(); | 704 hss = HandleSignalsState(); |
| 688 dp->ConsumerRemoveWaiter(&waiter, &hss); | 705 dp->ConsumerRemoveWaiter(&waiter, &hss); |
| 689 EXPECT_EQ(0u, hss.satisfied_signals); | 706 EXPECT_EQ(0u, hss.satisfied_signals); |
| 690 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 707 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED, |
| 708 hss.satisfiable_signals); |
| 691 | 709 |
| 692 static_cast<int32_t*>(write_ptr)[0] = 123; | 710 static_cast<int32_t*>(write_ptr)[0] = 123; |
| 693 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData( | 711 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData( |
| 694 static_cast<uint32_t>(1u * sizeof(int32_t)))); | 712 static_cast<uint32_t>(1u * sizeof(int32_t)))); |
| 695 | 713 |
| 696 // It should be writable again. | 714 // It should be writable again. |
| 697 waiter.Init(); | 715 waiter.Init(); |
| 698 hss = HandleSignalsState(); | 716 hss = HandleSignalsState(); |
| 699 EXPECT_EQ( | 717 EXPECT_EQ( |
| 700 MOJO_RESULT_ALREADY_EXISTS, | 718 MOJO_RESULT_ALREADY_EXISTS, |
| 701 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 3, &hss)); | 719 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 3, &hss)); |
| 702 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 720 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 703 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); | 721 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_CLOSED, |
| 722 hss.satisfiable_signals); |
| 704 | 723 |
| 705 // And readable. | 724 // And readable. |
| 706 waiter.Init(); | 725 waiter.Init(); |
| 707 hss = HandleSignalsState(); | 726 hss = HandleSignalsState(); |
| 708 EXPECT_EQ( | 727 EXPECT_EQ( |
| 709 MOJO_RESULT_ALREADY_EXISTS, | 728 MOJO_RESULT_ALREADY_EXISTS, |
| 710 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 4, &hss)); | 729 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 4, &hss)); |
| 711 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 730 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
| 712 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 731 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED, |
| 732 hss.satisfiable_signals); |
| 713 | 733 |
| 714 // Start another two-phase write and check that it's readable even in the | 734 // Start another two-phase write and check that it's readable even in the |
| 715 // middle of it. | 735 // middle of it. |
| 716 num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t)); | 736 num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t)); |
| 717 write_ptr = nullptr; | 737 write_ptr = nullptr; |
| 718 EXPECT_EQ(MOJO_RESULT_OK, | 738 EXPECT_EQ(MOJO_RESULT_OK, |
| 719 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), | 739 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), |
| 720 MakeUserPointer(&num_bytes), false)); | 740 MakeUserPointer(&num_bytes), false)); |
| 721 EXPECT_TRUE(write_ptr); | 741 EXPECT_TRUE(write_ptr); |
| 722 EXPECT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(int32_t))); | 742 EXPECT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(int32_t))); |
| 723 | 743 |
| 724 // It should be readable. | 744 // It should be readable. |
| 725 waiter.Init(); | 745 waiter.Init(); |
| 726 hss = HandleSignalsState(); | 746 hss = HandleSignalsState(); |
| 727 EXPECT_EQ( | 747 EXPECT_EQ( |
| 728 MOJO_RESULT_ALREADY_EXISTS, | 748 MOJO_RESULT_ALREADY_EXISTS, |
| 729 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 5, &hss)); | 749 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 5, &hss)); |
| 730 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 750 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
| 731 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 751 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED, |
| 752 hss.satisfiable_signals); |
| 732 | 753 |
| 733 // End the two-phase write without writing anything. | 754 // End the two-phase write without writing anything. |
| 734 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(0u)); | 755 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(0u)); |
| 735 | 756 |
| 736 // Start a two-phase read. | 757 // Start a two-phase read. |
| 737 num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t)); | 758 num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t)); |
| 738 const void* read_ptr = nullptr; | 759 const void* read_ptr = nullptr; |
| 739 EXPECT_EQ(MOJO_RESULT_OK, | 760 EXPECT_EQ(MOJO_RESULT_OK, |
| 740 dp->ConsumerBeginReadData(MakeUserPointer(&read_ptr), | 761 dp->ConsumerBeginReadData(MakeUserPointer(&read_ptr), |
| 741 MakeUserPointer(&num_bytes), false)); | 762 MakeUserPointer(&num_bytes), false)); |
| 742 EXPECT_TRUE(read_ptr); | 763 EXPECT_TRUE(read_ptr); |
| 743 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(int32_t)), num_bytes); | 764 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(int32_t)), num_bytes); |
| 744 | 765 |
| 745 // At this point, it should still be writable. | 766 // At this point, it should still be writable. |
| 746 waiter.Init(); | 767 waiter.Init(); |
| 747 hss = HandleSignalsState(); | 768 hss = HandleSignalsState(); |
| 748 EXPECT_EQ( | 769 EXPECT_EQ( |
| 749 MOJO_RESULT_ALREADY_EXISTS, | 770 MOJO_RESULT_ALREADY_EXISTS, |
| 750 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 6, &hss)); | 771 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 6, &hss)); |
| 751 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 772 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 752 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); | 773 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_CLOSED, |
| 774 hss.satisfiable_signals); |
| 753 | 775 |
| 754 // But not readable. | 776 // But not readable. |
| 755 waiter.Init(); | 777 waiter.Init(); |
| 756 ASSERT_EQ( | 778 ASSERT_EQ( |
| 757 MOJO_RESULT_OK, | 779 MOJO_RESULT_OK, |
| 758 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 7, nullptr)); | 780 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 7, nullptr)); |
| 759 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); | 781 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); |
| 760 hss = HandleSignalsState(); | 782 hss = HandleSignalsState(); |
| 761 dp->ConsumerRemoveWaiter(&waiter, &hss); | 783 dp->ConsumerRemoveWaiter(&waiter, &hss); |
| 762 EXPECT_EQ(0u, hss.satisfied_signals); | 784 EXPECT_EQ(0u, hss.satisfied_signals); |
| 763 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 785 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED, |
| 786 hss.satisfiable_signals); |
| 764 | 787 |
| 765 // End the two-phase read without reading anything. | 788 // End the two-phase read without reading anything. |
| 766 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(0u)); | 789 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(0u)); |
| 767 | 790 |
| 768 // It should be readable again. | 791 // It should be readable again. |
| 769 waiter.Init(); | 792 waiter.Init(); |
| 770 hss = HandleSignalsState(); | 793 hss = HandleSignalsState(); |
| 771 EXPECT_EQ( | 794 EXPECT_EQ( |
| 772 MOJO_RESULT_ALREADY_EXISTS, | 795 MOJO_RESULT_ALREADY_EXISTS, |
| 773 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 8, &hss)); | 796 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 8, &hss)); |
| 774 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 797 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
| 775 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 798 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED, |
| 799 hss.satisfiable_signals); |
| 776 | 800 |
| 777 dp->ProducerClose(); | 801 dp->ProducerClose(); |
| 778 dp->ConsumerClose(); | 802 dp->ConsumerClose(); |
| 779 } | 803 } |
| 780 | 804 |
| 781 // Test that a "may discard" data pipe is writable even when it's full. | 805 // Test that a "may discard" data pipe is writable even when it's full. |
| 782 TEST(LocalDataPipeTest, BasicMayDiscardWaiting) { | 806 TEST(LocalDataPipeTest, BasicMayDiscardWaiting) { |
| 783 const MojoCreateDataPipeOptions options = { | 807 const MojoCreateDataPipeOptions options = { |
| 784 kSizeOfOptions, // |struct_size|. | 808 kSizeOfOptions, // |struct_size|. |
| 785 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD, // |flags|. | 809 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD, // |flags|. |
| 786 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. | 810 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. |
| 787 1 * sizeof(int32_t) // |capacity_num_bytes|. | 811 1 * sizeof(int32_t) // |capacity_num_bytes|. |
| 788 }; | 812 }; |
| 789 MojoCreateDataPipeOptions validated_options = {0}; | 813 MojoCreateDataPipeOptions validated_options = {0}; |
| 790 EXPECT_EQ(MOJO_RESULT_OK, DataPipe::ValidateCreateOptions( | 814 EXPECT_EQ(MOJO_RESULT_OK, DataPipe::ValidateCreateOptions( |
| 791 MakeUserPointer(&options), &validated_options)); | 815 MakeUserPointer(&options), &validated_options)); |
| 792 | 816 |
| 793 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 817 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 794 Waiter waiter; | 818 Waiter waiter; |
| 795 HandleSignalsState hss; | 819 HandleSignalsState hss; |
| 796 | 820 |
| 797 // Writable. | 821 // Writable. |
| 798 waiter.Init(); | 822 waiter.Init(); |
| 799 hss = HandleSignalsState(); | 823 hss = HandleSignalsState(); |
| 800 EXPECT_EQ( | 824 EXPECT_EQ( |
| 801 MOJO_RESULT_ALREADY_EXISTS, | 825 MOJO_RESULT_ALREADY_EXISTS, |
| 802 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss)); | 826 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss)); |
| 803 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 827 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 804 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); | 828 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_CLOSED, |
| 829 hss.satisfiable_signals); |
| 805 | 830 |
| 806 // Not readable. | 831 // Not readable. |
| 807 waiter.Init(); | 832 waiter.Init(); |
| 808 ASSERT_EQ( | 833 ASSERT_EQ( |
| 809 MOJO_RESULT_OK, | 834 MOJO_RESULT_OK, |
| 810 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 1, nullptr)); | 835 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 1, nullptr)); |
| 811 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); | 836 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); |
| 812 hss = HandleSignalsState(); | 837 hss = HandleSignalsState(); |
| 813 dp->ConsumerRemoveWaiter(&waiter, &hss); | 838 dp->ConsumerRemoveWaiter(&waiter, &hss); |
| 814 EXPECT_EQ(0u, hss.satisfied_signals); | 839 EXPECT_EQ(0u, hss.satisfied_signals); |
| 815 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 840 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED, |
| 841 hss.satisfiable_signals); |
| 816 | 842 |
| 817 uint32_t num_bytes = static_cast<uint32_t>(sizeof(int32_t)); | 843 uint32_t num_bytes = static_cast<uint32_t>(sizeof(int32_t)); |
| 818 int32_t element = 123; | 844 int32_t element = 123; |
| 819 EXPECT_EQ(MOJO_RESULT_OK, | 845 EXPECT_EQ(MOJO_RESULT_OK, |
| 820 dp->ProducerWriteData(UserPointer<const void>(&element), | 846 dp->ProducerWriteData(UserPointer<const void>(&element), |
| 821 MakeUserPointer(&num_bytes), false)); | 847 MakeUserPointer(&num_bytes), false)); |
| 822 EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes); | 848 EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes); |
| 823 | 849 |
| 824 // Still writable (even though it's full). | 850 // Still writable (even though it's full). |
| 825 waiter.Init(); | 851 waiter.Init(); |
| 826 hss = HandleSignalsState(); | 852 hss = HandleSignalsState(); |
| 827 EXPECT_EQ( | 853 EXPECT_EQ( |
| 828 MOJO_RESULT_ALREADY_EXISTS, | 854 MOJO_RESULT_ALREADY_EXISTS, |
| 829 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 2, &hss)); | 855 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 2, &hss)); |
| 830 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 856 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 831 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); | 857 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_CLOSED, |
| 858 hss.satisfiable_signals); |
| 832 | 859 |
| 833 // Now readable. | 860 // Now readable. |
| 834 waiter.Init(); | 861 waiter.Init(); |
| 835 hss = HandleSignalsState(); | 862 hss = HandleSignalsState(); |
| 836 EXPECT_EQ( | 863 EXPECT_EQ( |
| 837 MOJO_RESULT_ALREADY_EXISTS, | 864 MOJO_RESULT_ALREADY_EXISTS, |
| 838 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 3, &hss)); | 865 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 3, &hss)); |
| 839 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 866 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
| 840 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 867 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED, |
| 868 hss.satisfiable_signals); |
| 841 | 869 |
| 842 // Overwrite that element. | 870 // Overwrite that element. |
| 843 num_bytes = static_cast<uint32_t>(sizeof(int32_t)); | 871 num_bytes = static_cast<uint32_t>(sizeof(int32_t)); |
| 844 element = 456; | 872 element = 456; |
| 845 EXPECT_EQ(MOJO_RESULT_OK, | 873 EXPECT_EQ(MOJO_RESULT_OK, |
| 846 dp->ProducerWriteData(UserPointer<const void>(&element), | 874 dp->ProducerWriteData(UserPointer<const void>(&element), |
| 847 MakeUserPointer(&num_bytes), false)); | 875 MakeUserPointer(&num_bytes), false)); |
| 848 EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes); | 876 EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes); |
| 849 | 877 |
| 850 // Still writable. | 878 // Still writable. |
| 851 waiter.Init(); | 879 waiter.Init(); |
| 852 hss = HandleSignalsState(); | 880 hss = HandleSignalsState(); |
| 853 EXPECT_EQ( | 881 EXPECT_EQ( |
| 854 MOJO_RESULT_ALREADY_EXISTS, | 882 MOJO_RESULT_ALREADY_EXISTS, |
| 855 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 4, &hss)); | 883 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 4, &hss)); |
| 856 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 884 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 857 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); | 885 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_CLOSED, |
| 886 hss.satisfiable_signals); |
| 858 | 887 |
| 859 // And still readable. | 888 // And still readable. |
| 860 waiter.Init(); | 889 waiter.Init(); |
| 861 hss = HandleSignalsState(); | 890 hss = HandleSignalsState(); |
| 862 EXPECT_EQ( | 891 EXPECT_EQ( |
| 863 MOJO_RESULT_ALREADY_EXISTS, | 892 MOJO_RESULT_ALREADY_EXISTS, |
| 864 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 5, &hss)); | 893 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 5, &hss)); |
| 865 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 894 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
| 866 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 895 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED, |
| 896 hss.satisfiable_signals); |
| 867 | 897 |
| 868 // Read that element. | 898 // Read that element. |
| 869 num_bytes = static_cast<uint32_t>(sizeof(int32_t)); | 899 num_bytes = static_cast<uint32_t>(sizeof(int32_t)); |
| 870 element = 0; | 900 element = 0; |
| 871 EXPECT_EQ(MOJO_RESULT_OK, | 901 EXPECT_EQ(MOJO_RESULT_OK, |
| 872 dp->ConsumerReadData(UserPointer<void>(&element), | 902 dp->ConsumerReadData(UserPointer<void>(&element), |
| 873 MakeUserPointer(&num_bytes), false, false)); | 903 MakeUserPointer(&num_bytes), false, false)); |
| 874 EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes); | 904 EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes); |
| 875 EXPECT_EQ(456, element); | 905 EXPECT_EQ(456, element); |
| 876 | 906 |
| 877 // Still writable. | 907 // Still writable. |
| 878 waiter.Init(); | 908 waiter.Init(); |
| 879 hss = HandleSignalsState(); | 909 hss = HandleSignalsState(); |
| 880 EXPECT_EQ( | 910 EXPECT_EQ( |
| 881 MOJO_RESULT_ALREADY_EXISTS, | 911 MOJO_RESULT_ALREADY_EXISTS, |
| 882 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 6, &hss)); | 912 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 6, &hss)); |
| 883 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 913 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 884 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); | 914 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_CLOSED, |
| 915 hss.satisfiable_signals); |
| 885 | 916 |
| 886 // No longer readable. | 917 // No longer readable. |
| 887 waiter.Init(); | 918 waiter.Init(); |
| 888 ASSERT_EQ( | 919 ASSERT_EQ( |
| 889 MOJO_RESULT_OK, | 920 MOJO_RESULT_OK, |
| 890 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 7, nullptr)); | 921 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 7, nullptr)); |
| 891 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); | 922 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); |
| 892 hss = HandleSignalsState(); | 923 hss = HandleSignalsState(); |
| 893 dp->ConsumerRemoveWaiter(&waiter, &hss); | 924 dp->ConsumerRemoveWaiter(&waiter, &hss); |
| 894 EXPECT_EQ(0u, hss.satisfied_signals); | 925 EXPECT_EQ(0u, hss.satisfied_signals); |
| 895 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 926 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED, |
| 927 hss.satisfiable_signals); |
| 896 | 928 |
| 897 dp->ProducerClose(); | 929 dp->ProducerClose(); |
| 898 dp->ConsumerClose(); | 930 dp->ConsumerClose(); |
| 899 } | 931 } |
| 900 | 932 |
| 901 void Seq(int32_t start, size_t count, int32_t* out) { | 933 void Seq(int32_t start, size_t count, int32_t* out) { |
| 902 for (size_t i = 0; i < count; i++) | 934 for (size_t i = 0; i < count; i++) |
| 903 out[i] = start + static_cast<int32_t>(i); | 935 out[i] = start + static_cast<int32_t>(i); |
| 904 } | 936 } |
| 905 | 937 |
| (...skipping 1061 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1967 // End reading. | 1999 // End reading. |
| 1968 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(2u)); | 2000 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(2u)); |
| 1969 | 2001 |
| 1970 dp->ProducerClose(); | 2002 dp->ProducerClose(); |
| 1971 dp->ConsumerClose(); | 2003 dp->ConsumerClose(); |
| 1972 } | 2004 } |
| 1973 | 2005 |
| 1974 } // namespace | 2006 } // namespace |
| 1975 } // namespace system | 2007 } // namespace system |
| 1976 } // namespace mojo | 2008 } // namespace mojo |
| OLD | NEW |