| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/raw_channel.h" | 5 #include "mojo/edk/system/raw_channel.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 #include <stdio.h> | 8 #include <stdio.h> |
| 9 | 9 |
| 10 #include <vector> | 10 #include <vector> |
| 11 | 11 |
| 12 #include "base/bind.h" | 12 #include "base/bind.h" |
| 13 #include "base/files/file_path.h" | 13 #include "base/files/file_path.h" |
| 14 #include "base/files/file_util.h" | 14 #include "base/files/file_util.h" |
| 15 #include "base/files/scoped_file.h" | 15 #include "base/files/scoped_file.h" |
| 16 #include "base/files/scoped_temp_dir.h" | 16 #include "base/files/scoped_temp_dir.h" |
| 17 #include "base/location.h" | 17 #include "base/location.h" |
| 18 #include "base/logging.h" | 18 #include "base/logging.h" |
| 19 #include "base/memory/scoped_ptr.h" | 19 #include "base/memory/scoped_ptr.h" |
| 20 #include "base/memory/scoped_vector.h" | 20 #include "base/memory/scoped_vector.h" |
| 21 #include "base/rand_util.h" | 21 #include "base/rand_util.h" |
| 22 #include "base/synchronization/lock.h" | 22 #include "base/synchronization/lock.h" |
| 23 #include "base/synchronization/waitable_event.h" | 23 #include "base/synchronization/waitable_event.h" |
| 24 #include "base/test/test_io_thread.h" | 24 #include "base/test/test_io_thread.h" |
| 25 #include "base/threading/simple_thread.h" | 25 #include "base/threading/simple_thread.h" |
| 26 #include "build/build_config.h" // TODO(vtl): Remove this. | 26 #include "build/build_config.h" |
| 27 #include "mojo/edk/embedder/embedder.h" |
| 28 #include "mojo/edk/embedder/embedder_internal.h" |
| 27 #include "mojo/edk/embedder/platform_channel_pair.h" | 29 #include "mojo/edk/embedder/platform_channel_pair.h" |
| 28 #include "mojo/edk/embedder/platform_handle.h" | 30 #include "mojo/edk/embedder/platform_handle.h" |
| 29 #include "mojo/edk/embedder/scoped_platform_handle.h" | 31 #include "mojo/edk/embedder/scoped_platform_handle.h" |
| 30 #include "mojo/edk/system/message_in_transit.h" | 32 #include "mojo/edk/system/message_in_transit.h" |
| 31 #include "mojo/edk/system/test_utils.h" | 33 #include "mojo/edk/system/test_utils.h" |
| 32 #include "mojo/edk/system/transport_data.h" | 34 #include "mojo/edk/system/transport_data.h" |
| 33 #include "mojo/edk/test/test_utils.h" | 35 #include "mojo/edk/test/test_utils.h" |
| 34 #include "mojo/public/cpp/system/macros.h" | 36 #include "mojo/public/cpp/system/macros.h" |
| 35 #include "testing/gtest/include/gtest/gtest.h" | 37 #include "testing/gtest/include/gtest/gtest.h" |
| 36 | 38 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 66 scoped_ptr<MessageInTransit> message(MakeTestMessage(num_bytes)); | 68 scoped_ptr<MessageInTransit> message(MakeTestMessage(num_bytes)); |
| 67 | 69 |
| 68 size_t write_size = 0; | 70 size_t write_size = 0; |
| 69 test::BlockingWrite(handle, message->main_buffer(), | 71 test::BlockingWrite(handle, message->main_buffer(), |
| 70 message->main_buffer_size(), &write_size); | 72 message->main_buffer_size(), &write_size); |
| 71 return write_size == message->main_buffer_size(); | 73 return write_size == message->main_buffer_size(); |
| 72 } | 74 } |
| 73 | 75 |
| 74 // ----------------------------------------------------------------------------- | 76 // ----------------------------------------------------------------------------- |
| 75 | 77 |
| 76 class RawChannelTest : public test::MojoSystemTest { | 78 class RawChannelTest : public testing::Test { |
| 77 public: | 79 public: |
| 78 RawChannelTest() {} | 80 RawChannelTest() {} |
| 79 ~RawChannelTest() override {} | 81 ~RawChannelTest() override {} |
| 80 | 82 |
| 81 void SetUp() override { | 83 void SetUp() override { |
| 82 PlatformChannelPair channel_pair; | 84 PlatformChannelPair channel_pair; |
| 83 handles[0] = channel_pair.PassServerHandle(); | 85 handles[0] = channel_pair.PassServerHandle(); |
| 84 handles[1] = channel_pair.PassClientHandle();\ | 86 handles[1] = channel_pair.PassClientHandle();\ |
| 85 } | 87 } |
| 86 | 88 |
| 87 void TearDown() override { | 89 void TearDown() override { |
| 88 handles[0].reset(); | 90 handles[0].reset(); |
| 89 handles[1].reset(); | 91 handles[1].reset(); |
| 90 } | 92 } |
| 91 | 93 |
| 94 void FlushIOThread() { |
| 95 base::WaitableEvent event(false, false); |
| 96 internal::g_io_thread_task_runner->PostTask( |
| 97 FROM_HERE, |
| 98 base::Bind(&base::WaitableEvent::Signal, base::Unretained(&event))); |
| 99 event.Wait(); |
| 100 } |
| 101 |
| 92 protected: | 102 protected: |
| 93 ScopedPlatformHandle handles[2]; | 103 ScopedPlatformHandle handles[2]; |
| 94 | 104 |
| 95 private: | 105 private: |
| 96 MOJO_DISALLOW_COPY_AND_ASSIGN(RawChannelTest); | 106 MOJO_DISALLOW_COPY_AND_ASSIGN(RawChannelTest); |
| 97 }; | 107 }; |
| 98 | 108 |
| 99 // RawChannelTest.WriteMessage ------------------------------------------------- | 109 // RawChannelTest.WriteMessage ------------------------------------------------- |
| 100 | 110 |
| 101 class WriteOnlyRawChannelDelegate : public RawChannel::Delegate { | 111 class WriteOnlyRawChannelDelegate : public RawChannel::Delegate { |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 182 std::vector<unsigned char> bytes_; | 192 std::vector<unsigned char> bytes_; |
| 183 | 193 |
| 184 MOJO_DISALLOW_COPY_AND_ASSIGN(TestMessageReaderAndChecker); | 194 MOJO_DISALLOW_COPY_AND_ASSIGN(TestMessageReaderAndChecker); |
| 185 }; | 195 }; |
| 186 | 196 |
| 187 // Tests writing (and verifies reading using our own custom reader). | 197 // Tests writing (and verifies reading using our own custom reader). |
| 188 TEST_F(RawChannelTest, WriteMessage) { | 198 TEST_F(RawChannelTest, WriteMessage) { |
| 189 WriteOnlyRawChannelDelegate delegate; | 199 WriteOnlyRawChannelDelegate delegate; |
| 190 RawChannel* rc = RawChannel::Create(handles[0].Pass()); | 200 RawChannel* rc = RawChannel::Create(handles[0].Pass()); |
| 191 TestMessageReaderAndChecker checker(handles[1].get()); | 201 TestMessageReaderAndChecker checker(handles[1].get()); |
| 192 test_io_thread()->PostTaskAndWait( | 202 internal::g_io_thread_task_runner->PostTask( |
| 193 FROM_HERE, | 203 FROM_HERE, |
| 194 base::Bind(&InitOnIOThread, rc, base::Unretained(&delegate))); | 204 base::Bind(&InitOnIOThread, rc, base::Unretained(&delegate))); |
| 195 | 205 |
| 196 // Write and read, for a variety of sizes. | 206 // Write and read, for a variety of sizes. |
| 197 for (uint32_t size = 1; size < 5 * 1000 * 1000; size += size / 2 + 1) { | 207 for (uint32_t size = 1; size < 5 * 1000 * 1000; size += size / 2 + 1) { |
| 198 EXPECT_TRUE(rc->WriteMessage(MakeTestMessage(size))); | 208 EXPECT_TRUE(rc->WriteMessage(MakeTestMessage(size))); |
| 199 EXPECT_TRUE(checker.ReadAndCheckNextMessage(size)) << size; | 209 EXPECT_TRUE(checker.ReadAndCheckNextMessage(size)) << size; |
| 200 } | 210 } |
| 201 | 211 |
| 202 // Write/queue and read afterwards, for a variety of sizes. | 212 // Write/queue and read afterwards, for a variety of sizes. |
| 203 for (uint32_t size = 1; size < 5 * 1000 * 1000; size += size / 2 + 1) | 213 for (uint32_t size = 1; size < 5 * 1000 * 1000; size += size / 2 + 1) |
| 204 EXPECT_TRUE(rc->WriteMessage(MakeTestMessage(size))); | 214 EXPECT_TRUE(rc->WriteMessage(MakeTestMessage(size))); |
| 205 for (uint32_t size = 1; size < 5 * 1000 * 1000; size += size / 2 + 1) | 215 for (uint32_t size = 1; size < 5 * 1000 * 1000; size += size / 2 + 1) |
| 206 EXPECT_TRUE(checker.ReadAndCheckNextMessage(size)) << size; | 216 EXPECT_TRUE(checker.ReadAndCheckNextMessage(size)) << size; |
| 207 | 217 |
| 208 test_io_thread()->PostTaskAndWait( | 218 internal::g_io_thread_task_runner->PostTask( |
| 209 FROM_HERE, base::Bind(&RawChannel::Shutdown, base::Unretained(rc))); | 219 FROM_HERE, base::Bind(&RawChannel::Shutdown, base::Unretained(rc))); |
| 210 } | 220 } |
| 211 | 221 |
| 212 // RawChannelTest.OnReadMessage ------------------------------------------------ | 222 // RawChannelTest.OnReadMessage ------------------------------------------------ |
| 213 | 223 |
| 214 class ReadCheckerRawChannelDelegate : public RawChannel::Delegate { | 224 class ReadCheckerRawChannelDelegate : public RawChannel::Delegate { |
| 215 public: | 225 public: |
| 216 ReadCheckerRawChannelDelegate() : done_event_(false, false), position_(0) {} | 226 ReadCheckerRawChannelDelegate() : done_event_(false, false), position_(0) {} |
| 217 ~ReadCheckerRawChannelDelegate() override {} | 227 ~ReadCheckerRawChannelDelegate() override {} |
| 218 | 228 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 267 std::vector<uint32_t> expected_sizes_; | 277 std::vector<uint32_t> expected_sizes_; |
| 268 size_t position_; | 278 size_t position_; |
| 269 | 279 |
| 270 MOJO_DISALLOW_COPY_AND_ASSIGN(ReadCheckerRawChannelDelegate); | 280 MOJO_DISALLOW_COPY_AND_ASSIGN(ReadCheckerRawChannelDelegate); |
| 271 }; | 281 }; |
| 272 | 282 |
| 273 // Tests reading (writing using our own custom writer). | 283 // Tests reading (writing using our own custom writer). |
| 274 TEST_F(RawChannelTest, OnReadMessage) { | 284 TEST_F(RawChannelTest, OnReadMessage) { |
| 275 ReadCheckerRawChannelDelegate delegate; | 285 ReadCheckerRawChannelDelegate delegate; |
| 276 RawChannel* rc = RawChannel::Create(handles[0].Pass()); | 286 RawChannel* rc = RawChannel::Create(handles[0].Pass()); |
| 277 test_io_thread()->PostTaskAndWait( | 287 internal::g_io_thread_task_runner->PostTask( |
| 278 FROM_HERE, | 288 FROM_HERE, |
| 279 base::Bind(&InitOnIOThread, rc, base::Unretained(&delegate))); | 289 base::Bind(&InitOnIOThread, rc, base::Unretained(&delegate))); |
| 280 | 290 |
| 281 // Write and read, for a variety of sizes. | 291 // Write and read, for a variety of sizes. |
| 282 for (uint32_t size = 1; size < 5 * 1000 * 1000; size += size / 2 + 1) { | 292 for (uint32_t size = 1; size < 5 * 1000 * 1000; size += size / 2 + 1) { |
| 283 delegate.SetExpectedSizes(std::vector<uint32_t>(1, size)); | 293 delegate.SetExpectedSizes(std::vector<uint32_t>(1, size)); |
| 284 | 294 |
| 285 EXPECT_TRUE(WriteTestMessageToHandle(handles[1].get(), size)); | 295 EXPECT_TRUE(WriteTestMessageToHandle(handles[1].get(), size)); |
| 286 | 296 |
| 287 delegate.Wait(); | 297 delegate.Wait(); |
| 288 } | 298 } |
| 289 | 299 |
| 290 // Set up reader and write as fast as we can. | 300 // Set up reader and write as fast as we can. |
| 291 // Write/queue and read afterwards, for a variety of sizes. | 301 // Write/queue and read afterwards, for a variety of sizes. |
| 292 std::vector<uint32_t> expected_sizes; | 302 std::vector<uint32_t> expected_sizes; |
| 293 for (uint32_t size = 1; size < 5 * 1000 * 1000; size += size / 2 + 1) | 303 for (uint32_t size = 1; size < 5 * 1000 * 1000; size += size / 2 + 1) |
| 294 expected_sizes.push_back(size); | 304 expected_sizes.push_back(size); |
| 295 delegate.SetExpectedSizes(expected_sizes); | 305 delegate.SetExpectedSizes(expected_sizes); |
| 296 for (uint32_t size = 1; size < 5 * 1000 * 1000; size += size / 2 + 1) | 306 for (uint32_t size = 1; size < 5 * 1000 * 1000; size += size / 2 + 1) |
| 297 EXPECT_TRUE(WriteTestMessageToHandle(handles[1].get(), size)); | 307 EXPECT_TRUE(WriteTestMessageToHandle(handles[1].get(), size)); |
| 298 delegate.Wait(); | 308 delegate.Wait(); |
| 299 | 309 |
| 300 test_io_thread()->PostTaskAndWait( | 310 internal::g_io_thread_task_runner->PostTask( |
| 301 FROM_HERE, base::Bind(&RawChannel::Shutdown, base::Unretained(rc))); | 311 FROM_HERE, base::Bind(&RawChannel::Shutdown, base::Unretained(rc))); |
| 302 } | 312 } |
| 303 | 313 |
| 304 // RawChannelTest.WriteMessageAndOnReadMessage --------------------------------- | 314 // RawChannelTest.WriteMessageAndOnReadMessage --------------------------------- |
| 305 | 315 |
| 306 class RawChannelWriterThread : public base::SimpleThread { | 316 class RawChannelWriterThread : public base::SimpleThread { |
| 307 public: | 317 public: |
| 308 RawChannelWriterThread(RawChannel* raw_channel, size_t write_count) | 318 RawChannelWriterThread(RawChannel* raw_channel, size_t write_count) |
| 309 : base::SimpleThread("raw_channel_writer_thread"), | 319 : base::SimpleThread("raw_channel_writer_thread"), |
| 310 raw_channel_(raw_channel), | 320 raw_channel_(raw_channel), |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 364 | 374 |
| 365 MOJO_DISALLOW_COPY_AND_ASSIGN(ReadCountdownRawChannelDelegate); | 375 MOJO_DISALLOW_COPY_AND_ASSIGN(ReadCountdownRawChannelDelegate); |
| 366 }; | 376 }; |
| 367 | 377 |
| 368 TEST_F(RawChannelTest, WriteMessageAndOnReadMessage) { | 378 TEST_F(RawChannelTest, WriteMessageAndOnReadMessage) { |
| 369 static const size_t kNumWriterThreads = 10; | 379 static const size_t kNumWriterThreads = 10; |
| 370 static const size_t kNumWriteMessagesPerThread = 400; | 380 static const size_t kNumWriteMessagesPerThread = 400; |
| 371 | 381 |
| 372 WriteOnlyRawChannelDelegate writer_delegate; | 382 WriteOnlyRawChannelDelegate writer_delegate; |
| 373 RawChannel* writer_rc = RawChannel::Create(handles[0].Pass()); | 383 RawChannel* writer_rc = RawChannel::Create(handles[0].Pass()); |
| 374 test_io_thread()->PostTaskAndWait( | 384 internal::g_io_thread_task_runner->PostTask( |
| 375 FROM_HERE, | 385 FROM_HERE, |
| 376 base::Bind(&InitOnIOThread, writer_rc, | 386 base::Bind(&InitOnIOThread, writer_rc, |
| 377 base::Unretained(&writer_delegate))); | 387 base::Unretained(&writer_delegate))); |
| 378 | 388 |
| 379 ReadCountdownRawChannelDelegate reader_delegate(kNumWriterThreads * | 389 ReadCountdownRawChannelDelegate reader_delegate(kNumWriterThreads * |
| 380 kNumWriteMessagesPerThread); | 390 kNumWriteMessagesPerThread); |
| 381 RawChannel* reader_rc = RawChannel::Create(handles[1].Pass()); | 391 RawChannel* reader_rc = RawChannel::Create(handles[1].Pass()); |
| 382 test_io_thread()->PostTaskAndWait( | 392 internal::g_io_thread_task_runner->PostTask( |
| 383 FROM_HERE, | 393 FROM_HERE, |
| 384 base::Bind(&InitOnIOThread, reader_rc, | 394 base::Bind(&InitOnIOThread, reader_rc, |
| 385 base::Unretained(&reader_delegate))); | 395 base::Unretained(&reader_delegate))); |
| 386 | 396 |
| 387 { | 397 { |
| 388 ScopedVector<RawChannelWriterThread> writer_threads; | 398 ScopedVector<RawChannelWriterThread> writer_threads; |
| 389 for (size_t i = 0; i < kNumWriterThreads; i++) { | 399 for (size_t i = 0; i < kNumWriterThreads; i++) { |
| 390 writer_threads.push_back(new RawChannelWriterThread( | 400 writer_threads.push_back(new RawChannelWriterThread( |
| 391 writer_rc, kNumWriteMessagesPerThread)); | 401 writer_rc, kNumWriteMessagesPerThread)); |
| 392 } | 402 } |
| 393 for (size_t i = 0; i < writer_threads.size(); i++) | 403 for (size_t i = 0; i < writer_threads.size(); i++) |
| 394 writer_threads[i]->Start(); | 404 writer_threads[i]->Start(); |
| 395 } // Joins all the writer threads. | 405 } // Joins all the writer threads. |
| 396 | 406 |
| 397 // Sleep a bit, to let any extraneous reads be processed. (There shouldn't be | 407 // Sleep a bit, to let any extraneous reads be processed. (There shouldn't be |
| 398 // any, but we want to know about them.) | 408 // any, but we want to know about them.) |
| 399 test::Sleep(test::DeadlineFromMilliseconds(100)); | 409 test::Sleep(test::DeadlineFromMilliseconds(100)); |
| 400 | 410 |
| 401 // Wait for reading to finish. | 411 // Wait for reading to finish. |
| 402 reader_delegate.Wait(); | 412 reader_delegate.Wait(); |
| 403 | 413 |
| 404 test_io_thread()->PostTaskAndWait( | 414 internal::g_io_thread_task_runner->PostTask( |
| 405 FROM_HERE, | 415 FROM_HERE, |
| 406 base::Bind(&RawChannel::Shutdown, base::Unretained(reader_rc))); | 416 base::Bind(&RawChannel::Shutdown, base::Unretained(reader_rc))); |
| 407 | 417 |
| 408 test_io_thread()->PostTaskAndWait( | 418 internal::g_io_thread_task_runner->PostTask( |
| 409 FROM_HERE, | 419 FROM_HERE, |
| 410 base::Bind(&RawChannel::Shutdown, base::Unretained(writer_rc))); | 420 base::Bind(&RawChannel::Shutdown, base::Unretained(writer_rc))); |
| 411 } | 421 } |
| 412 | 422 |
| 413 // RawChannelTest.OnError ------------------------------------------------------ | 423 // RawChannelTest.OnError ------------------------------------------------------ |
| 414 | 424 |
| 415 class ErrorRecordingRawChannelDelegate | 425 class ErrorRecordingRawChannelDelegate |
| 416 : public ReadCountdownRawChannelDelegate { | 426 : public ReadCountdownRawChannelDelegate { |
| 417 public: | 427 public: |
| 418 ErrorRecordingRawChannelDelegate(size_t expected_read_count, | 428 ErrorRecordingRawChannelDelegate(size_t expected_read_count, |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 463 bool expecting_read_error_; | 473 bool expecting_read_error_; |
| 464 bool expecting_write_error_; | 474 bool expecting_write_error_; |
| 465 | 475 |
| 466 MOJO_DISALLOW_COPY_AND_ASSIGN(ErrorRecordingRawChannelDelegate); | 476 MOJO_DISALLOW_COPY_AND_ASSIGN(ErrorRecordingRawChannelDelegate); |
| 467 }; | 477 }; |
| 468 | 478 |
| 469 // Tests (fatal) errors. | 479 // Tests (fatal) errors. |
| 470 TEST_F(RawChannelTest, OnError) { | 480 TEST_F(RawChannelTest, OnError) { |
| 471 ErrorRecordingRawChannelDelegate delegate(0, true, true); | 481 ErrorRecordingRawChannelDelegate delegate(0, true, true); |
| 472 RawChannel* rc = RawChannel::Create(handles[0].Pass()); | 482 RawChannel* rc = RawChannel::Create(handles[0].Pass()); |
| 473 test_io_thread()->PostTaskAndWait( | 483 internal::g_io_thread_task_runner->PostTask( |
| 474 FROM_HERE, | 484 FROM_HERE, |
| 475 base::Bind(&InitOnIOThread, rc, base::Unretained(&delegate))); | 485 base::Bind(&InitOnIOThread, rc, base::Unretained(&delegate))); |
| 486 FlushIOThread(); |
| 476 | 487 |
| 477 // Close the handle of the other end, which should make writing fail. | 488 // Close the handle of the other end, which should make writing fail. |
| 478 handles[1].reset(); | 489 handles[1].reset(); |
| 479 | 490 |
| 480 EXPECT_FALSE(rc->WriteMessage(MakeTestMessage(1))); | 491 EXPECT_FALSE(rc->WriteMessage(MakeTestMessage(1))); |
| 481 | 492 |
| 482 // We should get a write error. | 493 // We should get a write error. |
| 483 delegate.WaitForWriteError(); | 494 delegate.WaitForWriteError(); |
| 484 | 495 |
| 485 // We should also get a read error. | 496 // We should also get a read error. |
| 486 delegate.WaitForReadError(); | 497 delegate.WaitForReadError(); |
| 487 | 498 |
| 488 EXPECT_FALSE(rc->WriteMessage(MakeTestMessage(2))); | 499 EXPECT_FALSE(rc->WriteMessage(MakeTestMessage(2))); |
| 489 | 500 |
| 490 // Sleep a bit, to make sure we don't get another |OnError()| | 501 // Sleep a bit, to make sure we don't get another |OnError()| |
| 491 // notification. (If we actually get another one, |OnError()| crashes.) | 502 // notification. (If we actually get another one, |OnError()| crashes.) |
| 492 test::Sleep(test::DeadlineFromMilliseconds(20)); | 503 test::Sleep(test::DeadlineFromMilliseconds(20)); |
| 493 | 504 |
| 494 test_io_thread()->PostTaskAndWait( | 505 internal::g_io_thread_task_runner->PostTask( |
| 495 FROM_HERE, base::Bind(&RawChannel::Shutdown, base::Unretained(rc))); | 506 FROM_HERE, base::Bind(&RawChannel::Shutdown, base::Unretained(rc))); |
| 496 } | 507 } |
| 497 | 508 |
| 498 // RawChannelTest.ReadUnaffectedByWriteError ----------------------------------- | 509 // RawChannelTest.ReadUnaffectedByWriteError ----------------------------------- |
| 499 | 510 |
| 500 TEST_F(RawChannelTest, ReadUnaffectedByWriteError) { | 511 TEST_F(RawChannelTest, ReadUnaffectedByWriteError) { |
| 501 const size_t kMessageCount = 5; | 512 const size_t kMessageCount = 5; |
| 502 | 513 |
| 503 // Write a few messages into the other end. | 514 // Write a few messages into the other end. |
| 504 uint32_t message_size = 1; | 515 uint32_t message_size = 1; |
| 505 for (size_t i = 0; i < kMessageCount; | 516 for (size_t i = 0; i < kMessageCount; |
| 506 i++, message_size += message_size / 2 + 1) | 517 i++, message_size += message_size / 2 + 1) |
| 507 EXPECT_TRUE(WriteTestMessageToHandle(handles[1].get(), message_size)); | 518 EXPECT_TRUE(WriteTestMessageToHandle(handles[1].get(), message_size)); |
| 508 | 519 |
| 509 // Close the other end, which should make writing fail. | 520 // Close the other end, which should make writing fail. |
| 510 handles[1].reset(); | 521 handles[1].reset(); |
| 511 | 522 |
| 512 // Only start up reading here. The system buffer should still contain the | 523 // Only start up reading here. The system buffer should still contain the |
| 513 // messages that were written. | 524 // messages that were written. |
| 514 ErrorRecordingRawChannelDelegate delegate(kMessageCount, true, true); | 525 ErrorRecordingRawChannelDelegate delegate(kMessageCount, true, true); |
| 515 RawChannel* rc = RawChannel::Create(handles[0].Pass()); | 526 RawChannel* rc = RawChannel::Create(handles[0].Pass()); |
| 516 test_io_thread()->PostTaskAndWait( | 527 internal::g_io_thread_task_runner->PostTask( |
| 517 FROM_HERE, | 528 FROM_HERE, |
| 518 base::Bind(&InitOnIOThread, rc, base::Unretained(&delegate))); | 529 base::Bind(&InitOnIOThread, rc, base::Unretained(&delegate))); |
| 530 FlushIOThread(); |
| 519 | 531 |
| 520 EXPECT_FALSE(rc->WriteMessage(MakeTestMessage(1))); | 532 EXPECT_FALSE(rc->WriteMessage(MakeTestMessage(1))); |
| 521 | 533 |
| 522 // We should definitely get a write error. | 534 // We should definitely get a write error. |
| 523 delegate.WaitForWriteError(); | 535 delegate.WaitForWriteError(); |
| 524 | 536 |
| 525 // Wait for reading to finish. A writing failure shouldn't affect reading. | 537 // Wait for reading to finish. A writing failure shouldn't affect reading. |
| 526 delegate.Wait(); | 538 delegate.Wait(); |
| 527 | 539 |
| 528 // And then we should get a read error. | 540 // And then we should get a read error. |
| 529 delegate.WaitForReadError(); | 541 delegate.WaitForReadError(); |
| 530 | 542 |
| 531 test_io_thread()->PostTaskAndWait( | 543 internal::g_io_thread_task_runner->PostTask( |
| 532 FROM_HERE, base::Bind(&RawChannel::Shutdown, base::Unretained(rc))); | 544 FROM_HERE, base::Bind(&RawChannel::Shutdown, base::Unretained(rc))); |
| 533 } | 545 } |
| 534 | 546 |
| 535 // RawChannelTest.ReadWritePlatformHandles ------------------------------------- | 547 // RawChannelTest.ReadWritePlatformHandles ------------------------------------- |
| 536 | 548 |
| 537 class ReadPlatformHandlesCheckerRawChannelDelegate | 549 class ReadPlatformHandlesCheckerRawChannelDelegate |
| 538 : public RawChannel::Delegate { | 550 : public RawChannel::Delegate { |
| 539 public: | 551 public: |
| 540 ReadPlatformHandlesCheckerRawChannelDelegate() : done_event_(false, false) {} | 552 ReadPlatformHandlesCheckerRawChannelDelegate() : done_event_(false, false) {} |
| 541 ~ReadPlatformHandlesCheckerRawChannelDelegate() override {} | 553 ~ReadPlatformHandlesCheckerRawChannelDelegate() override {} |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 590 | 602 |
| 591 MOJO_DISALLOW_COPY_AND_ASSIGN(ReadPlatformHandlesCheckerRawChannelDelegate); | 603 MOJO_DISALLOW_COPY_AND_ASSIGN(ReadPlatformHandlesCheckerRawChannelDelegate); |
| 592 }; | 604 }; |
| 593 | 605 |
| 594 TEST_F(RawChannelTest, ReadWritePlatformHandles) { | 606 TEST_F(RawChannelTest, ReadWritePlatformHandles) { |
| 595 base::ScopedTempDir temp_dir; | 607 base::ScopedTempDir temp_dir; |
| 596 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | 608 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
| 597 | 609 |
| 598 WriteOnlyRawChannelDelegate write_delegate; | 610 WriteOnlyRawChannelDelegate write_delegate; |
| 599 RawChannel* rc_write = RawChannel::Create(handles[0].Pass()); | 611 RawChannel* rc_write = RawChannel::Create(handles[0].Pass()); |
| 600 test_io_thread()->PostTaskAndWait( | 612 internal::g_io_thread_task_runner->PostTask( |
| 601 FROM_HERE, | 613 FROM_HERE, |
| 602 base::Bind(&InitOnIOThread, rc_write, base::Unretained(&write_delegate))); | 614 base::Bind(&InitOnIOThread, rc_write, base::Unretained(&write_delegate))); |
| 603 | 615 |
| 604 ReadPlatformHandlesCheckerRawChannelDelegate read_delegate; | 616 ReadPlatformHandlesCheckerRawChannelDelegate read_delegate; |
| 605 RawChannel* rc_read = RawChannel::Create(handles[1].Pass()); | 617 RawChannel* rc_read = RawChannel::Create(handles[1].Pass()); |
| 606 test_io_thread()->PostTaskAndWait( | 618 internal::g_io_thread_task_runner->PostTask( |
| 607 FROM_HERE, | 619 FROM_HERE, |
| 608 base::Bind(&InitOnIOThread, rc_read, base::Unretained(&read_delegate))); | 620 base::Bind(&InitOnIOThread, rc_read, base::Unretained(&read_delegate))); |
| 609 | 621 |
| 610 base::FilePath unused; | 622 base::FilePath unused; |
| 611 base::ScopedFILE fp1( | 623 base::ScopedFILE fp1( |
| 612 base::CreateAndOpenTemporaryFileInDir(temp_dir.path(), &unused)); | 624 base::CreateAndOpenTemporaryFileInDir(temp_dir.path(), &unused)); |
| 613 EXPECT_EQ(1u, fwrite("1", 1, 1, fp1.get())); | 625 EXPECT_EQ(1u, fwrite("1", 1, 1, fp1.get())); |
| 614 base::ScopedFILE fp2( | 626 base::ScopedFILE fp2( |
| 615 base::CreateAndOpenTemporaryFileInDir(temp_dir.path(), &unused)); | 627 base::CreateAndOpenTemporaryFileInDir(temp_dir.path(), &unused)); |
| 616 EXPECT_EQ(1u, fwrite("2", 1, 1, fp2.get())); | 628 EXPECT_EQ(1u, fwrite("2", 1, 1, fp2.get())); |
| 617 | 629 |
| 618 { | 630 { |
| 619 const char kHello[] = "hello"; | 631 const char kHello[] = "hello"; |
| 620 ScopedPlatformHandleVectorPtr platform_handles(new PlatformHandleVector()); | 632 ScopedPlatformHandleVectorPtr platform_handles(new PlatformHandleVector()); |
| 621 platform_handles->push_back( | 633 platform_handles->push_back( |
| 622 test::PlatformHandleFromFILE(fp1.Pass()).release()); | 634 test::PlatformHandleFromFILE(fp1.Pass()).release()); |
| 623 platform_handles->push_back( | 635 platform_handles->push_back( |
| 624 test::PlatformHandleFromFILE(fp2.Pass()).release()); | 636 test::PlatformHandleFromFILE(fp2.Pass()).release()); |
| 625 | 637 |
| 626 scoped_ptr<MessageInTransit> message( | 638 scoped_ptr<MessageInTransit> message( |
| 627 new MessageInTransit(MessageInTransit::Type::MESSAGE, | 639 new MessageInTransit(MessageInTransit::Type::MESSAGE, |
| 628 sizeof(kHello), kHello)); | 640 sizeof(kHello), kHello)); |
| 629 message->SetTransportData(make_scoped_ptr(new TransportData( | 641 message->SetTransportData(make_scoped_ptr(new TransportData( |
| 630 platform_handles.Pass(), rc_write->GetSerializedPlatformHandleSize()))); | 642 platform_handles.Pass(), rc_write->GetSerializedPlatformHandleSize()))); |
| 631 EXPECT_TRUE(rc_write->WriteMessage(message.Pass())); | 643 EXPECT_TRUE(rc_write->WriteMessage(message.Pass())); |
| 632 } | 644 } |
| 633 | 645 |
| 634 read_delegate.Wait(); | 646 read_delegate.Wait(); |
| 635 | 647 |
| 636 test_io_thread()->PostTaskAndWait( | 648 internal::g_io_thread_task_runner->PostTask( |
| 637 FROM_HERE, | 649 FROM_HERE, |
| 638 base::Bind(&RawChannel::Shutdown, base::Unretained(rc_read))); | 650 base::Bind(&RawChannel::Shutdown, base::Unretained(rc_read))); |
| 639 test_io_thread()->PostTaskAndWait( | 651 internal::g_io_thread_task_runner->PostTask( |
| 640 FROM_HERE, | 652 FROM_HERE, |
| 641 base::Bind(&RawChannel::Shutdown, base::Unretained(rc_write))); | 653 base::Bind(&RawChannel::Shutdown, base::Unretained(rc_write))); |
| 642 } | 654 } |
| 643 | 655 |
| 644 } // namespace | 656 } // namespace |
| 645 } // namespace edk | 657 } // namespace edk |
| 646 } // namespace mojo | 658 } // namespace mojo |
| OLD | NEW |