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

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

Issue 60103005: Mojo: First stab at making MessagePipes work across OS pipes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebased Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // TODO(vtl): Factor out the POSIX-specific bits of this test (once we have a 5 // TODO(vtl): Factor out the POSIX-specific bits of this test (once we have a
6 // non-POSIX implementation). 6 // non-POSIX implementation).
7 7
8 #include "mojo/system/raw_channel.h" 8 #include "mojo/system/raw_channel.h"
9 9
10 #include <fcntl.h> 10 #include <fcntl.h>
(...skipping 27 matching lines...) Expand all
38 #include "testing/gtest/include/gtest/gtest.h" 38 #include "testing/gtest/include/gtest/gtest.h"
39 39
40 namespace mojo { 40 namespace mojo {
41 namespace system { 41 namespace system {
42 namespace { 42 namespace {
43 43
44 MessageInTransit* MakeTestMessage(uint32_t num_bytes) { 44 MessageInTransit* MakeTestMessage(uint32_t num_bytes) {
45 std::vector<unsigned char> bytes(num_bytes, 0); 45 std::vector<unsigned char> bytes(num_bytes, 0);
46 for (size_t i = 0; i < num_bytes; i++) 46 for (size_t i = 0; i < num_bytes; i++)
47 bytes[i] = static_cast<unsigned char>(i + num_bytes); 47 bytes[i] = static_cast<unsigned char>(i + num_bytes);
48 return MessageInTransit::Create(bytes.data(), num_bytes); 48 return MessageInTransit::Create(
49 MessageInTransit::kTypeMessagePipeEndpoint,
50 MessageInTransit::kSubtypeMessagePipeEndpointData,
51 bytes.data(), num_bytes);
49 } 52 }
50 53
51 bool CheckMessageData(const void* bytes, uint32_t num_bytes) { 54 bool CheckMessageData(const void* bytes, uint32_t num_bytes) {
52 const unsigned char* b = static_cast<const unsigned char*>(bytes); 55 const unsigned char* b = static_cast<const unsigned char*>(bytes);
53 for (uint32_t i = 0; i < num_bytes; i++) { 56 for (uint32_t i = 0; i < num_bytes; i++) {
54 if (b[i] != static_cast<unsigned char>(i + num_bytes)) 57 if (b[i] != static_cast<unsigned char>(i + num_bytes))
55 return false; 58 return false;
56 } 59 }
57 return true; 60 return true;
58 } 61 }
59 62
63 void InitOnIOThread(RawChannel* raw_channel) {
64 CHECK(raw_channel->Init());
65 }
66
60 // ----------------------------------------------------------------------------- 67 // -----------------------------------------------------------------------------
61 68
62 class RawChannelPosixTest : public testing::Test { 69 class RawChannelPosixTest : public testing::Test {
63 public: 70 public:
64 RawChannelPosixTest() : io_thread_("io_thread") { 71 RawChannelPosixTest() : io_thread_("io_thread") {
65 fds_[0] = -1; 72 fds_[0] = -1;
66 fds_[1] = -1; 73 fds_[1] = -1;
67 } 74 }
68 75
69 virtual ~RawChannelPosixTest() { 76 virtual ~RawChannelPosixTest() {
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
203 scoped_ptr<RawChannel> rc(RawChannel::Create(PlatformChannelHandle(fd(0)), 210 scoped_ptr<RawChannel> rc(RawChannel::Create(PlatformChannelHandle(fd(0)),
204 &delegate, 211 &delegate,
205 io_thread_message_loop())); 212 io_thread_message_loop()));
206 // |RawChannel::Create()| takes ownership of the FD. 213 // |RawChannel::Create()| takes ownership of the FD.
207 clear_fd(0); 214 clear_fd(0);
208 215
209 TestMessageReaderAndChecker checker(fd(1)); 216 TestMessageReaderAndChecker checker(fd(1));
210 217
211 test::PostTaskAndWait(io_thread_task_runner(), 218 test::PostTaskAndWait(io_thread_task_runner(),
212 FROM_HERE, 219 FROM_HERE,
213 base::Bind(&RawChannel::Init, 220 base::Bind(&InitOnIOThread, rc.get()));
214 base::Unretained(rc.get())));
215 221
216 // Write and read, for a variety of sizes. 222 // Write and read, for a variety of sizes.
217 for (uint32_t size = 1; size < 5 * 1000 * 1000; size += size / 2 + 1) { 223 for (uint32_t size = 1; size < 5 * 1000 * 1000; size += size / 2 + 1) {
218 EXPECT_TRUE(rc->WriteMessage(MakeTestMessage(size))); 224 EXPECT_TRUE(rc->WriteMessage(MakeTestMessage(size)));
219 EXPECT_TRUE(checker.ReadAndCheckNextMessage(size)) << size; 225 EXPECT_TRUE(checker.ReadAndCheckNextMessage(size)) << size;
220 } 226 }
221 227
222 // Write/queue and read afterwards, for a variety of sizes. 228 // Write/queue and read afterwards, for a variety of sizes.
223 for (uint32_t size = 1; size < 5 * 1000 * 1000; size += size / 2 + 1) 229 for (uint32_t size = 1; size < 5 * 1000 * 1000; size += size / 2 + 1)
224 EXPECT_TRUE(rc->WriteMessage(MakeTestMessage(size))); 230 EXPECT_TRUE(rc->WriteMessage(MakeTestMessage(size)));
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
297 303
298 ReadCheckerRawChannelDelegate delegate; 304 ReadCheckerRawChannelDelegate delegate;
299 scoped_ptr<RawChannel> rc(RawChannel::Create(PlatformChannelHandle(fd(0)), 305 scoped_ptr<RawChannel> rc(RawChannel::Create(PlatformChannelHandle(fd(0)),
300 &delegate, 306 &delegate,
301 io_thread_message_loop())); 307 io_thread_message_loop()));
302 // |RawChannel::Create()| takes ownership of the FD. 308 // |RawChannel::Create()| takes ownership of the FD.
303 clear_fd(0); 309 clear_fd(0);
304 310
305 test::PostTaskAndWait(io_thread_task_runner(), 311 test::PostTaskAndWait(io_thread_task_runner(),
306 FROM_HERE, 312 FROM_HERE,
307 base::Bind(&RawChannel::Init, 313 base::Bind(&InitOnIOThread, rc.get()));
308 base::Unretained(rc.get())));
309 314
310 // Write and read, for a variety of sizes. 315 // Write and read, for a variety of sizes.
311 for (uint32_t size = 1; size < 5 * 1000 * 1000; size += size / 2 + 1) { 316 for (uint32_t size = 1; size < 5 * 1000 * 1000; size += size / 2 + 1) {
312 delegate.SetExpectedSizes(std::vector<uint32_t>(1, size)); 317 delegate.SetExpectedSizes(std::vector<uint32_t>(1, size));
313 MessageInTransit* message = MakeTestMessage(size); 318 MessageInTransit* message = MakeTestMessage(size);
314 EXPECT_EQ(static_cast<ssize_t>(message->size_with_header_and_padding()), 319 EXPECT_EQ(static_cast<ssize_t>(message->size_with_header_and_padding()),
315 write(fd(1), message, message->size_with_header_and_padding())); 320 write(fd(1), message, message->size_with_header_and_padding()));
316 message->Destroy(); 321 message->Destroy();
317 delegate.Wait(); 322 delegate.Wait();
318 } 323 }
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
409 WriteOnlyRawChannelDelegate writer_delegate; 414 WriteOnlyRawChannelDelegate writer_delegate;
410 scoped_ptr<RawChannel> writer_rc( 415 scoped_ptr<RawChannel> writer_rc(
411 RawChannel::Create(PlatformChannelHandle(fd(0)), 416 RawChannel::Create(PlatformChannelHandle(fd(0)),
412 &writer_delegate, 417 &writer_delegate,
413 io_thread_message_loop())); 418 io_thread_message_loop()));
414 // |RawChannel::Create()| takes ownership of the FD. 419 // |RawChannel::Create()| takes ownership of the FD.
415 clear_fd(0); 420 clear_fd(0);
416 421
417 test::PostTaskAndWait(io_thread_task_runner(), 422 test::PostTaskAndWait(io_thread_task_runner(),
418 FROM_HERE, 423 FROM_HERE,
419 base::Bind(&RawChannel::Init, 424 base::Bind(&InitOnIOThread, writer_rc.get()));
420 base::Unretained(writer_rc.get())));
421 425
422 ReadCountdownRawChannelDelegate reader_delegate( 426 ReadCountdownRawChannelDelegate reader_delegate(
423 kNumWriterThreads * kNumWriteMessagesPerThread); 427 kNumWriterThreads * kNumWriteMessagesPerThread);
424 scoped_ptr<RawChannel> reader_rc( 428 scoped_ptr<RawChannel> reader_rc(
425 RawChannel::Create(PlatformChannelHandle(fd(1)), 429 RawChannel::Create(PlatformChannelHandle(fd(1)),
426 &reader_delegate, 430 &reader_delegate,
427 io_thread_message_loop())); 431 io_thread_message_loop()));
428 // |RawChannel::Create()| takes ownership of the FD. 432 // |RawChannel::Create()| takes ownership of the FD.
429 clear_fd(1); 433 clear_fd(1);
430 434
431 test::PostTaskAndWait(io_thread_task_runner(), 435 test::PostTaskAndWait(io_thread_task_runner(),
432 FROM_HERE, 436 FROM_HERE,
433 base::Bind(&RawChannel::Init, 437 base::Bind(&InitOnIOThread, reader_rc.get()));
434 base::Unretained(reader_rc.get())));
435 438
436 { 439 {
437 ScopedVector<RawChannelWriterThread> writer_threads; 440 ScopedVector<RawChannelWriterThread> writer_threads;
438 for (size_t i = 0; i < kNumWriterThreads; i++) { 441 for (size_t i = 0; i < kNumWriterThreads; i++) {
439 writer_threads.push_back(new RawChannelWriterThread( 442 writer_threads.push_back(new RawChannelWriterThread(
440 writer_rc.get(), kNumWriteMessagesPerThread)); 443 writer_rc.get(), kNumWriteMessagesPerThread));
441 } 444 }
442 for (size_t i = 0; i < writer_threads.size(); i++) 445 for (size_t i = 0; i < writer_threads.size(); i++)
443 writer_threads[i]->Start(); 446 writer_threads[i]->Start();
444 } // Joins all the writer threads. 447 } // Joins all the writer threads.
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
503 TEST_F(RawChannelPosixTest, OnFatalError) { 506 TEST_F(RawChannelPosixTest, OnFatalError) {
504 FatalErrorRecordingRawChannelDelegate delegate; 507 FatalErrorRecordingRawChannelDelegate delegate;
505 scoped_ptr<RawChannel> rc(RawChannel::Create(PlatformChannelHandle(fd(0)), 508 scoped_ptr<RawChannel> rc(RawChannel::Create(PlatformChannelHandle(fd(0)),
506 &delegate, 509 &delegate,
507 io_thread_message_loop())); 510 io_thread_message_loop()));
508 // |RawChannel::Create()| takes ownership of the FD. 511 // |RawChannel::Create()| takes ownership of the FD.
509 clear_fd(0); 512 clear_fd(0);
510 513
511 test::PostTaskAndWait(io_thread_task_runner(), 514 test::PostTaskAndWait(io_thread_task_runner(),
512 FROM_HERE, 515 FROM_HERE,
513 base::Bind(&RawChannel::Init, 516 base::Bind(&InitOnIOThread, rc.get()));
514 base::Unretained(rc.get())));
515 517
516 // Close the other end, which should make writing fail. 518 // Close the other end, which should make writing fail.
517 CHECK_EQ(close(fd(1)), 0); 519 CHECK_EQ(close(fd(1)), 0);
518 clear_fd(1); 520 clear_fd(1);
519 521
520 EXPECT_FALSE(rc->WriteMessage(MakeTestMessage(1))); 522 EXPECT_FALSE(rc->WriteMessage(MakeTestMessage(1)));
521 523
522 // TODO(vtl): In theory, it's conceivable that closing the other end might 524 // TODO(vtl): In theory, it's conceivable that closing the other end might
523 // lead to read failing. In practice, it doesn't seem to. 525 // lead to read failing. In practice, it doesn't seem to.
524 EXPECT_EQ(RawChannel::Delegate::FATAL_ERROR_FAILED_WRITE, 526 EXPECT_EQ(RawChannel::Delegate::FATAL_ERROR_FAILED_WRITE,
(...skipping 13 matching lines...) Expand all
538 TEST_F(RawChannelPosixTest, WriteMessageAfterShutdown) { 540 TEST_F(RawChannelPosixTest, WriteMessageAfterShutdown) {
539 WriteOnlyRawChannelDelegate delegate; 541 WriteOnlyRawChannelDelegate delegate;
540 scoped_ptr<RawChannel> rc(RawChannel::Create(PlatformChannelHandle(fd(0)), 542 scoped_ptr<RawChannel> rc(RawChannel::Create(PlatformChannelHandle(fd(0)),
541 &delegate, 543 &delegate,
542 io_thread_message_loop())); 544 io_thread_message_loop()));
543 // |RawChannel::Create()| takes ownership of the FD. 545 // |RawChannel::Create()| takes ownership of the FD.
544 clear_fd(0); 546 clear_fd(0);
545 547
546 test::PostTaskAndWait(io_thread_task_runner(), 548 test::PostTaskAndWait(io_thread_task_runner(),
547 FROM_HERE, 549 FROM_HERE,
548 base::Bind(&RawChannel::Init, 550 base::Bind(&InitOnIOThread, rc.get()));
549 base::Unretained(rc.get())));
550 test::PostTaskAndWait(io_thread_task_runner(), 551 test::PostTaskAndWait(io_thread_task_runner(),
551 FROM_HERE, 552 FROM_HERE,
552 base::Bind(&RawChannel::Shutdown, 553 base::Bind(&RawChannel::Shutdown,
553 base::Unretained(rc.get()))); 554 base::Unretained(rc.get())));
554 555
555 EXPECT_FALSE(rc->WriteMessage(MakeTestMessage(1))); 556 EXPECT_FALSE(rc->WriteMessage(MakeTestMessage(1)));
556 } 557 }
557 558
558 } // namespace 559 } // namespace
559 } // namespace system 560 } // namespace system
560 } // namespace mojo 561 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698