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

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

Issue 1488853002: Add multiplexing of message pipes in the new EDK. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: tsepez review comments Created 5 years 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 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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « mojo/edk/system/multiprocess_message_pipe_unittest.cc ('k') | mojo/edk/system/routed_raw_channel.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698