OLD | NEW |
---|---|
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "build/build_config.h" | 5 #include "build/build_config.h" |
6 | 6 |
7 #include <limits> | |
7 #include <set> | 8 #include <set> |
8 | 9 |
9 #include "ipc/attachment_broker.h" | 10 #include "ipc/attachment_broker.h" |
10 #include "ipc/brokerable_attachment.h" | 11 #include "ipc/brokerable_attachment.h" |
11 #include "ipc/ipc_channel_reader.h" | 12 #include "ipc/ipc_channel_reader.h" |
12 #include "ipc/placeholder_brokerable_attachment.h" | 13 #include "ipc/placeholder_brokerable_attachment.h" |
13 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
14 | 15 |
15 #if USE_ATTACHMENT_BROKER | |
16 namespace IPC { | 16 namespace IPC { |
17 namespace internal { | 17 namespace internal { |
18 | 18 |
19 namespace { | 19 namespace { |
20 | 20 |
21 #if USE_ATTACHMENT_BROKER | |
22 | |
21 class MockAttachment : public BrokerableAttachment { | 23 class MockAttachment : public BrokerableAttachment { |
22 public: | 24 public: |
23 MockAttachment() {} | 25 MockAttachment() {} |
24 MockAttachment(BrokerableAttachment::AttachmentId id) | 26 MockAttachment(BrokerableAttachment::AttachmentId id) |
25 : BrokerableAttachment(id) {} | 27 : BrokerableAttachment(id) {} |
26 | 28 |
27 #if defined(OS_POSIX) | 29 #if defined(OS_POSIX) |
28 base::PlatformFile TakePlatformFile() override { | 30 base::PlatformFile TakePlatformFile() override { |
29 return base::PlatformFile(); | 31 return base::PlatformFile(); |
30 } | 32 } |
(...skipping 15 matching lines...) Expand all Loading... | |
46 } | 48 } |
47 | 49 |
48 bool OnMessageReceived(const Message& message) override { return false; } | 50 bool OnMessageReceived(const Message& message) override { return false; } |
49 | 51 |
50 void AddAttachment(scoped_refptr<BrokerableAttachment> attachment) { | 52 void AddAttachment(scoped_refptr<BrokerableAttachment> attachment) { |
51 get_attachments()->push_back(attachment); | 53 get_attachments()->push_back(attachment); |
52 NotifyObservers(attachment->GetIdentifier()); | 54 NotifyObservers(attachment->GetIdentifier()); |
53 } | 55 } |
54 }; | 56 }; |
55 | 57 |
58 #endif // USE_ATTACHMENT_BROKER | |
59 | |
56 class MockChannelReader : public ChannelReader { | 60 class MockChannelReader : public ChannelReader { |
57 public: | 61 public: |
58 MockChannelReader() | 62 MockChannelReader() |
59 : ChannelReader(nullptr), last_dispatched_message_(nullptr) {} | 63 : ChannelReader(nullptr), last_dispatched_message_(nullptr) {} |
60 | 64 |
61 ReadState ReadData(char* buffer, int buffer_len, int* bytes_read) override { | 65 ReadState ReadData(char* buffer, int buffer_len, int* bytes_read) override { |
62 return READ_FAILED; | 66 return READ_FAILED; |
63 } | 67 } |
64 | 68 |
65 bool ShouldDispatchInputMessage(Message* msg) override { return true; } | 69 bool ShouldDispatchInputMessage(Message* msg) override { return true; } |
(...skipping 19 matching lines...) Expand all Loading... | |
85 | 89 |
86 Message* get_last_dispatched_message() { return last_dispatched_message_; } | 90 Message* get_last_dispatched_message() { return last_dispatched_message_; } |
87 | 91 |
88 void set_broker(AttachmentBroker* broker) { broker_ = broker; } | 92 void set_broker(AttachmentBroker* broker) { broker_ = broker; } |
89 | 93 |
90 private: | 94 private: |
91 Message* last_dispatched_message_; | 95 Message* last_dispatched_message_; |
92 AttachmentBroker* broker_; | 96 AttachmentBroker* broker_; |
93 }; | 97 }; |
94 | 98 |
99 class ExposedMessage: public Message { | |
100 public: | |
101 using Message::Header; | |
102 using Message::header; | |
103 }; | |
104 | |
95 } // namespace | 105 } // namespace |
96 | 106 |
107 #if USE_ATTACHMENT_BROKER | |
108 | |
97 TEST(ChannelReaderTest, AttachmentAlreadyBrokered) { | 109 TEST(ChannelReaderTest, AttachmentAlreadyBrokered) { |
98 MockAttachmentBroker broker; | 110 MockAttachmentBroker broker; |
99 MockChannelReader reader; | 111 MockChannelReader reader; |
100 reader.set_broker(&broker); | 112 reader.set_broker(&broker); |
101 scoped_refptr<MockAttachment> attachment(new MockAttachment); | 113 scoped_refptr<MockAttachment> attachment(new MockAttachment); |
102 broker.AddAttachment(attachment); | 114 broker.AddAttachment(attachment); |
103 | 115 |
104 Message* m = new Message; | 116 Message* m = new Message; |
105 PlaceholderBrokerableAttachment* needs_brokering_attachment = | 117 PlaceholderBrokerableAttachment* needs_brokering_attachment = |
106 new PlaceholderBrokerableAttachment(attachment->GetIdentifier()); | 118 new PlaceholderBrokerableAttachment(attachment->GetIdentifier()); |
(...skipping 15 matching lines...) Expand all Loading... | |
122 EXPECT_TRUE(m->WriteAttachment(needs_brokering_attachment)); | 134 EXPECT_TRUE(m->WriteAttachment(needs_brokering_attachment)); |
123 reader.AddMessageForDispatch(m); | 135 reader.AddMessageForDispatch(m); |
124 EXPECT_EQ(ChannelReader::DISPATCH_WAITING_ON_BROKER, | 136 EXPECT_EQ(ChannelReader::DISPATCH_WAITING_ON_BROKER, |
125 reader.DispatchMessages()); | 137 reader.DispatchMessages()); |
126 EXPECT_EQ(nullptr, reader.get_last_dispatched_message()); | 138 EXPECT_EQ(nullptr, reader.get_last_dispatched_message()); |
127 | 139 |
128 broker.AddAttachment(attachment); | 140 broker.AddAttachment(attachment); |
129 EXPECT_EQ(m, reader.get_last_dispatched_message()); | 141 EXPECT_EQ(m, reader.get_last_dispatched_message()); |
130 } | 142 } |
131 | 143 |
144 #endif // USE_ATTACHMENT_BROKER | |
145 | |
146 #if !USE_ATTACHMENT_BROKER | |
Maria
2015/09/25 22:23:00
should we just do #else here? instead of another i
Dmitry Skiba
2015/09/28 17:37:18
The effect of #else will be the same, but it's jus
| |
147 | |
148 // We can determine message size from its header (and hence resize the buffer) | |
149 // only when attachment broker is not used, see IPC::Message::FindNext(). | |
150 | |
151 TEST(ChannelReaderTest, ResizeOverflowBuffer) { | |
152 MockChannelReader reader; | |
153 | |
154 ExposedMessage::Header header = {}; | |
155 | |
156 header.payload_size = 128 * 1024; | |
157 EXPECT_LT(reader.input_overflow_buf_.capacity(), header.payload_size); | |
158 EXPECT_TRUE(reader.TranslateInputData( | |
159 reinterpret_cast<const char*>(&header), sizeof(header))); | |
160 | |
161 // Once message header is available we resize overflow buffer to | |
162 // fit the entire message. | |
163 EXPECT_GE(reader.input_overflow_buf_.capacity(), header.payload_size); | |
164 } | |
165 | |
166 TEST(ChannelReaderTest, InvalidMessageSize) { | |
167 MockChannelReader reader; | |
168 | |
169 ExposedMessage::Header header = {}; | |
170 | |
171 size_t capacity_before = reader.input_overflow_buf_.capacity(); | |
172 | |
173 // Message is slightly larger than maximum allowed size | |
174 header.payload_size = Channel::kMaximumMessageSize + 1; | |
175 EXPECT_FALSE(reader.TranslateInputData( | |
176 reinterpret_cast<const char*>(&header), sizeof(header))); | |
177 EXPECT_LE(reader.input_overflow_buf_.capacity(), capacity_before); | |
178 | |
179 // Payload size is negative, overflow is detected by Pickle::PeekNext() | |
180 header.payload_size = static_cast<uint32_t>(-1); | |
181 EXPECT_FALSE(reader.TranslateInputData( | |
182 reinterpret_cast<const char*>(&header), sizeof(header))); | |
183 EXPECT_LE(reader.input_overflow_buf_.capacity(), capacity_before); | |
184 | |
185 // Payload size is maximum int32 value | |
186 header.payload_size = std::numeric_limits<int32_t>::max(); | |
187 EXPECT_FALSE(reader.TranslateInputData( | |
188 reinterpret_cast<const char*>(&header), sizeof(header))); | |
189 EXPECT_LE(reader.input_overflow_buf_.capacity(), capacity_before); | |
190 } | |
191 | |
192 #endif // !USE_ATTACHMENT_BROKER | |
193 | |
132 } // namespace internal | 194 } // namespace internal |
133 } // namespace IPC | 195 } // namespace IPC |
134 #endif // USE_ATTACHMENT_BROKER | |
OLD | NEW |