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 | 8 |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 23 matching lines...) Expand all Loading... |
34 namespace system { | 34 namespace system { |
35 namespace { | 35 namespace { |
36 | 36 |
37 scoped_ptr<MessageInTransit> MakeTestMessage(uint32_t num_bytes) { | 37 scoped_ptr<MessageInTransit> MakeTestMessage(uint32_t num_bytes) { |
38 std::vector<unsigned char> bytes(num_bytes, 0); | 38 std::vector<unsigned char> bytes(num_bytes, 0); |
39 for (size_t i = 0; i < num_bytes; i++) | 39 for (size_t i = 0; i < num_bytes; i++) |
40 bytes[i] = static_cast<unsigned char>(i + num_bytes); | 40 bytes[i] = static_cast<unsigned char>(i + num_bytes); |
41 return make_scoped_ptr( | 41 return make_scoped_ptr( |
42 new MessageInTransit(MessageInTransit::kTypeMessagePipeEndpoint, | 42 new MessageInTransit(MessageInTransit::kTypeMessagePipeEndpoint, |
43 MessageInTransit::kSubtypeMessagePipeEndpointData, | 43 MessageInTransit::kSubtypeMessagePipeEndpointData, |
44 num_bytes, bytes.empty() ? nullptr : &bytes[0])); | 44 num_bytes, |
| 45 bytes.empty() ? nullptr : &bytes[0])); |
45 } | 46 } |
46 | 47 |
47 bool CheckMessageData(const void* bytes, uint32_t num_bytes) { | 48 bool CheckMessageData(const void* bytes, uint32_t num_bytes) { |
48 const unsigned char* b = static_cast<const unsigned char*>(bytes); | 49 const unsigned char* b = static_cast<const unsigned char*>(bytes); |
49 for (uint32_t i = 0; i < num_bytes; i++) { | 50 for (uint32_t i = 0; i < num_bytes; i++) { |
50 if (b[i] != static_cast<unsigned char>(i + num_bytes)) | 51 if (b[i] != static_cast<unsigned char>(i + num_bytes)) |
51 return false; | 52 return false; |
52 } | 53 } |
53 return true; | 54 return true; |
54 } | 55 } |
55 | 56 |
56 void InitOnIOThread(RawChannel* raw_channel, RawChannel::Delegate* delegate) { | 57 void InitOnIOThread(RawChannel* raw_channel, RawChannel::Delegate* delegate) { |
57 CHECK(raw_channel->Init(delegate)); | 58 CHECK(raw_channel->Init(delegate)); |
58 } | 59 } |
59 | 60 |
60 bool WriteTestMessageToHandle(const embedder::PlatformHandle& handle, | 61 bool WriteTestMessageToHandle(const embedder::PlatformHandle& handle, |
61 uint32_t num_bytes) { | 62 uint32_t num_bytes) { |
62 scoped_ptr<MessageInTransit> message(MakeTestMessage(num_bytes)); | 63 scoped_ptr<MessageInTransit> message(MakeTestMessage(num_bytes)); |
63 | 64 |
64 size_t write_size = 0; | 65 size_t write_size = 0; |
65 mojo::test::BlockingWrite(handle, message->main_buffer(), | 66 mojo::test::BlockingWrite( |
66 message->main_buffer_size(), &write_size); | 67 handle, message->main_buffer(), message->main_buffer_size(), &write_size); |
67 return write_size == message->main_buffer_size(); | 68 return write_size == message->main_buffer_size(); |
68 } | 69 } |
69 | 70 |
70 // ----------------------------------------------------------------------------- | 71 // ----------------------------------------------------------------------------- |
71 | 72 |
72 class RawChannelTest : public testing::Test { | 73 class RawChannelTest : public testing::Test { |
73 public: | 74 public: |
74 RawChannelTest() : io_thread_(base::TestIOThread::kManualStart) {} | 75 RawChannelTest() : io_thread_(base::TestIOThread::kManualStart) {} |
75 ~RawChannelTest() override {} | 76 ~RawChannelTest() override {} |
76 | 77 |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
127 public: | 128 public: |
128 explicit TestMessageReaderAndChecker(embedder::PlatformHandle handle) | 129 explicit TestMessageReaderAndChecker(embedder::PlatformHandle handle) |
129 : handle_(handle) {} | 130 : handle_(handle) {} |
130 ~TestMessageReaderAndChecker() { CHECK(bytes_.empty()); } | 131 ~TestMessageReaderAndChecker() { CHECK(bytes_.empty()); } |
131 | 132 |
132 bool ReadAndCheckNextMessage(uint32_t expected_size) { | 133 bool ReadAndCheckNextMessage(uint32_t expected_size) { |
133 unsigned char buffer[4096]; | 134 unsigned char buffer[4096]; |
134 | 135 |
135 for (size_t i = 0; i < kMessageReaderMaxPollIterations;) { | 136 for (size_t i = 0; i < kMessageReaderMaxPollIterations;) { |
136 size_t read_size = 0; | 137 size_t read_size = 0; |
137 CHECK(mojo::test::NonBlockingRead(handle_, buffer, sizeof(buffer), | 138 CHECK(mojo::test::NonBlockingRead( |
138 &read_size)); | 139 handle_, buffer, sizeof(buffer), &read_size)); |
139 | 140 |
140 // Append newly-read data to |bytes_|. | 141 // Append newly-read data to |bytes_|. |
141 bytes_.insert(bytes_.end(), buffer, buffer + read_size); | 142 bytes_.insert(bytes_.end(), buffer, buffer + read_size); |
142 | 143 |
143 // If we have the header.... | 144 // If we have the header.... |
144 size_t message_size; | 145 size_t message_size; |
145 if (MessageInTransit::GetNextMessageSize( | 146 if (MessageInTransit::GetNextMessageSize( |
146 bytes_.empty() ? nullptr : &bytes_[0], bytes_.size(), | 147 bytes_.empty() ? nullptr : &bytes_[0], |
| 148 bytes_.size(), |
147 &message_size)) { | 149 &message_size)) { |
148 // If we've read the whole message.... | 150 // If we've read the whole message.... |
149 if (bytes_.size() >= message_size) { | 151 if (bytes_.size() >= message_size) { |
150 bool rv = true; | 152 bool rv = true; |
151 MessageInTransit::View message_view(message_size, &bytes_[0]); | 153 MessageInTransit::View message_view(message_size, &bytes_[0]); |
152 CHECK_EQ(message_view.main_buffer_size(), message_size); | 154 CHECK_EQ(message_view.main_buffer_size(), message_size); |
153 | 155 |
154 if (message_view.num_bytes() != expected_size) { | 156 if (message_view.num_bytes() != expected_size) { |
155 LOG(ERROR) << "Wrong size: " << message_size << " instead of " | 157 LOG(ERROR) << "Wrong size: " << message_size << " instead of " |
156 << expected_size << " bytes."; | 158 << expected_size << " bytes."; |
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
369 DISALLOW_COPY_AND_ASSIGN(ReadCountdownRawChannelDelegate); | 371 DISALLOW_COPY_AND_ASSIGN(ReadCountdownRawChannelDelegate); |
370 }; | 372 }; |
371 | 373 |
372 TEST_F(RawChannelTest, WriteMessageAndOnReadMessage) { | 374 TEST_F(RawChannelTest, WriteMessageAndOnReadMessage) { |
373 static const size_t kNumWriterThreads = 10; | 375 static const size_t kNumWriterThreads = 10; |
374 static const size_t kNumWriteMessagesPerThread = 4000; | 376 static const size_t kNumWriteMessagesPerThread = 4000; |
375 | 377 |
376 WriteOnlyRawChannelDelegate writer_delegate; | 378 WriteOnlyRawChannelDelegate writer_delegate; |
377 scoped_ptr<RawChannel> writer_rc(RawChannel::Create(handles[0].Pass())); | 379 scoped_ptr<RawChannel> writer_rc(RawChannel::Create(handles[0].Pass())); |
378 io_thread()->PostTaskAndWait(FROM_HERE, | 380 io_thread()->PostTaskAndWait(FROM_HERE, |
379 base::Bind(&InitOnIOThread, writer_rc.get(), | 381 base::Bind(&InitOnIOThread, |
| 382 writer_rc.get(), |
380 base::Unretained(&writer_delegate))); | 383 base::Unretained(&writer_delegate))); |
381 | 384 |
382 ReadCountdownRawChannelDelegate reader_delegate(kNumWriterThreads * | 385 ReadCountdownRawChannelDelegate reader_delegate(kNumWriterThreads * |
383 kNumWriteMessagesPerThread); | 386 kNumWriteMessagesPerThread); |
384 scoped_ptr<RawChannel> reader_rc(RawChannel::Create(handles[1].Pass())); | 387 scoped_ptr<RawChannel> reader_rc(RawChannel::Create(handles[1].Pass())); |
385 io_thread()->PostTaskAndWait(FROM_HERE, | 388 io_thread()->PostTaskAndWait(FROM_HERE, |
386 base::Bind(&InitOnIOThread, reader_rc.get(), | 389 base::Bind(&InitOnIOThread, |
| 390 reader_rc.get(), |
387 base::Unretained(&reader_delegate))); | 391 base::Unretained(&reader_delegate))); |
388 | 392 |
389 { | 393 { |
390 ScopedVector<RawChannelWriterThread> writer_threads; | 394 ScopedVector<RawChannelWriterThread> writer_threads; |
391 for (size_t i = 0; i < kNumWriterThreads; i++) { | 395 for (size_t i = 0; i < kNumWriterThreads; i++) { |
392 writer_threads.push_back(new RawChannelWriterThread( | 396 writer_threads.push_back(new RawChannelWriterThread( |
393 writer_rc.get(), kNumWriteMessagesPerThread)); | 397 writer_rc.get(), kNumWriteMessagesPerThread)); |
394 } | 398 } |
395 for (size_t i = 0; i < writer_threads.size(); i++) | 399 for (size_t i = 0; i < writer_threads.size(); i++) |
396 writer_threads[i]->Start(); | 400 writer_threads[i]->Start(); |
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
675 | 679 |
676 EXPECT_FALSE(rc->WriteMessage(MakeTestMessage(1))); | 680 EXPECT_FALSE(rc->WriteMessage(MakeTestMessage(1))); |
677 | 681 |
678 // Wait for the delegate, which will shut the |RawChannel| down. | 682 // Wait for the delegate, which will shut the |RawChannel| down. |
679 delegate.Wait(); | 683 delegate.Wait(); |
680 } | 684 } |
681 | 685 |
682 } // namespace | 686 } // namespace |
683 } // namespace system | 687 } // namespace system |
684 } // namespace mojo | 688 } // namespace mojo |
OLD | NEW |