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

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

Issue 1350023003: Add a Mojo EDK for Chrome that uses one OS pipe per message pipe. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: move to mojo::edk namespace in preparation for runtim flag Created 5 years, 3 months 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "base/memory/ref_counted.h"
6 #include "mojo/edk/system/test_utils.h"
7 #include "mojo/public/c/system/core.h"
8 #include "mojo/public/c/system/types.h"
9
10 namespace mojo {
11 namespace edk {
12 namespace {
13
14 const MojoHandleSignals kAllSignals = MOJO_HANDLE_SIGNAL_READABLE |
15 MOJO_HANDLE_SIGNAL_WRITABLE |
16 MOJO_HANDLE_SIGNAL_PEER_CLOSED;
17 static const char kHelloWorld[] = "hello world";
18
19 class MessagePipeTest : public test::MojoSystemTest {
20 public:
21 MessagePipeTest() {
22 CHECK_EQ(MOJO_RESULT_OK, MojoCreateMessagePipe(nullptr, &pipe0_, &pipe1_));
23 }
24
25 ~MessagePipeTest() override {
26 if (pipe0_ != MOJO_HANDLE_INVALID)
27 CHECK_EQ(MOJO_RESULT_OK, MojoClose(pipe0_));
28 if (pipe1_ != MOJO_HANDLE_INVALID)
29 CHECK_EQ(MOJO_RESULT_OK, MojoClose(pipe1_));
30 }
31
32 MojoResult WriteMessage(MojoHandle message_pipe_handle,
33 const void* bytes,
34 uint32_t num_bytes) {
35 return MojoWriteMessage(message_pipe_handle, bytes, num_bytes, nullptr, 0,
36 MOJO_WRITE_MESSAGE_FLAG_NONE);
37 }
38
39 MojoResult ReadMessage(MojoHandle message_pipe_handle,
40 void* bytes,
41 uint32_t* num_bytes,
42 bool may_discard = false) {
43 return MojoReadMessage(message_pipe_handle, bytes, num_bytes, nullptr, 0,
44 may_discard ? MOJO_READ_MESSAGE_FLAG_MAY_DISCARD :
45 MOJO_READ_MESSAGE_FLAG_NONE);
46 }
47
48 MojoHandle pipe0_, pipe1_;
49
50 private:
51 MOJO_DISALLOW_COPY_AND_ASSIGN(MessagePipeTest);
52 };
53
54 TEST_F(MessagePipeTest, WriteData) {
55 ASSERT_EQ(MOJO_RESULT_OK,
56 WriteMessage(pipe0_, kHelloWorld, sizeof(kHelloWorld)));
57 }
58
59 // Tests:
60 // - only default flags
61 // - reading messages from a port
62 // - when there are no/one/two messages available for that port
63 // - with buffer size 0 (and null buffer) -- should get size
64 // - with too-small buffer -- should get size
65 // - also verify that buffers aren't modified when/where they shouldn't be
66 // - writing messages to a port
67 // - in the obvious scenarios (as above)
68 // - to a port that's been closed
69 // - writing a message to a port, closing the other (would be the source) port,
70 // and reading it
71 TEST_F(MessagePipeTest, Basic) {
72 int32_t buffer[2];
73 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer));
74 uint32_t buffer_size;
75
76 // Nothing to read yet on port 0.
77 buffer[0] = 123;
78 buffer[1] = 456;
79 buffer_size = kBufferSize;
80 ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT, ReadMessage(pipe0_, buffer, &buffer_size));
81 ASSERT_EQ(kBufferSize, buffer_size);
82 ASSERT_EQ(123, buffer[0]);
83 ASSERT_EQ(456, buffer[1]);
84
85 // Ditto for port 1.
86 buffer[0] = 123;
87 buffer[1] = 456;
88 buffer_size = kBufferSize;
89 ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT, ReadMessage(pipe1_, buffer, &buffer_size));
90
91 // Write from port 1 (to port 0).
92 buffer[0] = 789012345;
93 buffer[1] = 0;
94 ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe1_, buffer, sizeof(buffer[0])));
95
96 MojoHandleSignalsState state;
97 ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe0_, MOJO_HANDLE_SIGNAL_READABLE,
98 MOJO_DEADLINE_INDEFINITE, &state));
99
100 // Read from port 0.
101 buffer[0] = 123;
102 buffer[1] = 456;
103 buffer_size = kBufferSize;
104 ASSERT_EQ(MOJO_RESULT_OK, ReadMessage(pipe0_, buffer, &buffer_size));
105 ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size);
106 ASSERT_EQ(789012345, buffer[0]);
107 ASSERT_EQ(456, buffer[1]);
108
109 // Read again from port 0 -- it should be empty.
110 buffer_size = kBufferSize;
111 ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT, ReadMessage(pipe0_, buffer, &buffer_size));
112
113 // Write two messages from port 0 (to port 1).
114 buffer[0] = 123456789;
115 buffer[1] = 0;
116 ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe0_, buffer, sizeof(buffer[0])));
117 buffer[0] = 234567890;
118 buffer[1] = 0;
119 ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe0_, buffer, sizeof(buffer[0])));
120
121 ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe1_, MOJO_HANDLE_SIGNAL_READABLE,
122 MOJO_DEADLINE_INDEFINITE, &state));
123
124 // Read from port 1 with buffer size 0 (should get the size of next message).
125 // Also test that giving a null buffer is okay when the buffer size is 0.
126 buffer_size = 0;
127 ASSERT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
128 ReadMessage(pipe1_, nullptr, &buffer_size));
129 ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size);
130
131 // Read from port 1 with buffer size 1 (too small; should get the size of next
132 // message).
133 buffer[0] = 123;
134 buffer[1] = 456;
135 buffer_size = 1;
136 ASSERT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
137 ReadMessage(pipe1_, buffer, &buffer_size));
138 ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size);
139 ASSERT_EQ(123, buffer[0]);
140 ASSERT_EQ(456, buffer[1]);
141
142 // Read from port 1.
143 buffer[0] = 123;
144 buffer[1] = 456;
145 buffer_size = kBufferSize;
146 ASSERT_EQ(MOJO_RESULT_OK, ReadMessage(pipe1_, buffer, &buffer_size));
147 ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size);
148 ASSERT_EQ(123456789, buffer[0]);
149 ASSERT_EQ(456, buffer[1]);
150
151 ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe1_, MOJO_HANDLE_SIGNAL_READABLE,
152 MOJO_DEADLINE_INDEFINITE, &state));
153
154 // Read again from port 1.
155 buffer[0] = 123;
156 buffer[1] = 456;
157 buffer_size = kBufferSize;
158 ASSERT_EQ(MOJO_RESULT_OK, ReadMessage(pipe1_, buffer, &buffer_size));
159 ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size);
160 ASSERT_EQ(234567890, buffer[0]);
161 ASSERT_EQ(456, buffer[1]);
162
163 // Read again from port 1 -- it should be empty.
164 buffer_size = kBufferSize;
165 ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT, ReadMessage(pipe1_, buffer, &buffer_size));
166
167 // Write from port 0 (to port 1).
168 buffer[0] = 345678901;
169 buffer[1] = 0;
170 ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe0_, buffer, sizeof(buffer[0])));
171
172 // Close port 0.
173 MojoClose(pipe0_);
174 pipe0_ = MOJO_HANDLE_INVALID;
175
176 ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe1_, MOJO_HANDLE_SIGNAL_PEER_CLOSED,
177 MOJO_DEADLINE_INDEFINITE, &state));
178
179 // Try to write from port 1 (to port 0).
180 buffer[0] = 456789012;
181 buffer[1] = 0;
182 ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
183 WriteMessage(pipe1_, buffer, sizeof(buffer[0])));
184
185 // Read from port 1; should still get message (even though port 0 was closed).
186 buffer[0] = 123;
187 buffer[1] = 456;
188 buffer_size = kBufferSize;
189 ASSERT_EQ(MOJO_RESULT_OK, ReadMessage(pipe1_, buffer, &buffer_size));
190 ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size);
191 ASSERT_EQ(345678901, buffer[0]);
192 ASSERT_EQ(456, buffer[1]);
193
194 // Read again from port 1 -- it should be empty (and port 0 is closed).
195 buffer_size = kBufferSize;
196 ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
197 ReadMessage(pipe1_, buffer, &buffer_size));
198 }
199
200 TEST_F(MessagePipeTest, CloseWithQueuedIncomingMessages) {
201 int32_t buffer[1];
202 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer));
203 uint32_t buffer_size;
204
205 // Write some messages from port 1 (to port 0).
206 for (int32_t i = 0; i < 5; i++) {
207 buffer[0] = i;
208 ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe1_, buffer, kBufferSize));
209 }
210
211 MojoHandleSignalsState state;
212 ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe0_, MOJO_HANDLE_SIGNAL_READABLE,
213 MOJO_DEADLINE_INDEFINITE, &state));
214
215 // Port 0 shouldn't be empty.
216 buffer_size = 0;
217 ASSERT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
218 ReadMessage(pipe0_, nullptr, &buffer_size));
219 ASSERT_EQ(kBufferSize, buffer_size);
220
221 // Close port 0 first, which should have outstanding (incoming) messages.
222 MojoClose(pipe0_);
223 MojoClose(pipe1_);
224 pipe0_ = pipe1_ = MOJO_HANDLE_INVALID;
225 }
226
227 TEST_F(MessagePipeTest, DiscardMode) {
228 int32_t buffer[2];
229 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer));
230 uint32_t buffer_size;
231
232 // Write from port 1 (to port 0).
233 buffer[0] = 789012345;
234 buffer[1] = 0;
235 ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe1_, buffer, sizeof(buffer[0])));
236
237 MojoHandleSignalsState state;
238 ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe0_, MOJO_HANDLE_SIGNAL_READABLE,
239 MOJO_DEADLINE_INDEFINITE, &state));
240
241 // Read/discard from port 0 (no buffer); get size.
242 buffer_size = 0;
243 ASSERT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
244 ReadMessage(pipe0_, nullptr, &buffer_size, true));
245 ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size);
246
247 // Read again from port 0 -- it should be empty.
248 buffer_size = kBufferSize;
249 ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT,
250 ReadMessage(pipe0_, buffer, &buffer_size, true));
251
252 // Write from port 1 (to port 0).
253 buffer[0] = 890123456;
254 buffer[1] = 0;
255 ASSERT_EQ(MOJO_RESULT_OK,
256 WriteMessage(pipe1_, buffer, sizeof(buffer[0])));
257
258 ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe0_, MOJO_HANDLE_SIGNAL_READABLE,
259 MOJO_DEADLINE_INDEFINITE, &state));
260
261 // Read from port 0 (buffer big enough).
262 buffer[0] = 123;
263 buffer[1] = 456;
264 buffer_size = kBufferSize;
265 ASSERT_EQ(MOJO_RESULT_OK, ReadMessage(pipe0_, buffer, &buffer_size, true));
266 ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size);
267 ASSERT_EQ(890123456, buffer[0]);
268 ASSERT_EQ(456, buffer[1]);
269
270 // Read again from port 0 -- it should be empty.
271 buffer_size = kBufferSize;
272 ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT,
273 ReadMessage(pipe0_, buffer, &buffer_size, true));
274
275 // Write from port 1 (to port 0).
276 buffer[0] = 901234567;
277 buffer[1] = 0;
278 ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe1_, buffer, sizeof(buffer[0])));
279
280 ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe0_, MOJO_HANDLE_SIGNAL_READABLE,
281 MOJO_DEADLINE_INDEFINITE, &state));
282
283 // Read/discard from port 0 (buffer too small); get size.
284 buffer_size = 1;
285 ASSERT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
286 ReadMessage(pipe0_, buffer, &buffer_size, true));
287 ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size);
288
289 // Read again from port 0 -- it should be empty.
290 buffer_size = kBufferSize;
291 ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT,
292 ReadMessage(pipe0_, buffer, &buffer_size, true));
293
294 // Write from port 1 (to port 0).
295 buffer[0] = 123456789;
296 buffer[1] = 0;
297 ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe1_, buffer, sizeof(buffer[0])));
298
299 ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe0_, MOJO_HANDLE_SIGNAL_READABLE,
300 MOJO_DEADLINE_INDEFINITE, &state));
301
302 // Discard from port 0.
303 buffer_size = 1;
304 ASSERT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
305 ReadMessage(pipe0_, nullptr, 0, true));
306
307 // Read again from port 0 -- it should be empty.
308 buffer_size = kBufferSize;
309 ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT,
310 ReadMessage(pipe0_, buffer, &buffer_size, true));
311 }
312
313 TEST_F(MessagePipeTest, BasicWaiting) {
314 MojoHandleSignalsState hss;
315
316 int32_t buffer[1];
317 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer));
318 uint32_t buffer_size;
319
320 // Always writable (until the other port is closed).
321 hss = MojoHandleSignalsState();
322 ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe0_, MOJO_HANDLE_SIGNAL_WRITABLE, 0,
323 &hss));
324 ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
325 ASSERT_EQ(kAllSignals, hss.satisfiable_signals);
326 hss = MojoHandleSignalsState();
327
328 // Not yet readable.
329 ASSERT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED,
330 MojoWait(pipe0_, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss));
331 ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
332 ASSERT_EQ(kAllSignals, hss.satisfiable_signals);
333
334 // The peer is not closed.
335 hss = MojoHandleSignalsState();
336 ASSERT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED,
337 MojoWait(pipe0_, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 0, &hss));
338 ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
339 ASSERT_EQ(kAllSignals, hss.satisfiable_signals);
340
341 // Write from port 0 (to port 1), to make port 1 readable.
342 buffer[0] = 123456789;
343 ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe0_, buffer, kBufferSize));
344
345 // Port 1 should already be readable now.
346 ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe1_, MOJO_HANDLE_SIGNAL_READABLE,
347 MOJO_DEADLINE_INDEFINITE, &hss));
348 ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
349 hss.satisfied_signals);
350 ASSERT_EQ(kAllSignals, hss.satisfiable_signals);
351 // ... and still writable.
352 hss = MojoHandleSignalsState();
353 ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe1_, MOJO_HANDLE_SIGNAL_WRITABLE,
354 MOJO_DEADLINE_INDEFINITE, &hss));
355 ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
356 hss.satisfied_signals);
357 ASSERT_EQ(kAllSignals, hss.satisfiable_signals);
358
359 // Close port 0.
360 MojoClose(pipe0_);
361 pipe0_ = MOJO_HANDLE_INVALID;
362
363 // Port 1 should be signaled with peer closed.
364 hss = MojoHandleSignalsState();
365 ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe1_, MOJO_HANDLE_SIGNAL_PEER_CLOSED,
366 MOJO_DEADLINE_INDEFINITE, &hss));
367 ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
368 hss.satisfied_signals);
369 ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
370 hss.satisfiable_signals);
371
372 // Port 1 should not be writable.
373 hss = MojoHandleSignalsState();
374
375 ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
376 MojoWait(pipe1_, MOJO_HANDLE_SIGNAL_WRITABLE,
377 MOJO_DEADLINE_INDEFINITE, &hss));
378 ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
379 hss.satisfied_signals);
380 ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
381 hss.satisfiable_signals);
382
383 // But it should still be readable.
384 hss = MojoHandleSignalsState();
385 ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe1_, MOJO_HANDLE_SIGNAL_READABLE,
386 MOJO_DEADLINE_INDEFINITE, &hss));
387 ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
388 hss.satisfied_signals);
389 ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
390 hss.satisfiable_signals);
391
392 // Read from port 1.
393 buffer[0] = 0;
394 buffer_size = kBufferSize;
395 ASSERT_EQ(MOJO_RESULT_OK, ReadMessage(pipe1_, buffer, &buffer_size));
396 ASSERT_EQ(123456789, buffer[0]);
397
398 // Now port 1 should no longer be readable.
399 hss = MojoHandleSignalsState();
400 ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
401 MojoWait(pipe1_, MOJO_HANDLE_SIGNAL_READABLE,
402 MOJO_DEADLINE_INDEFINITE, &hss));
403 ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
404 ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
405 }
406
407 } // namespace
408 } // namespace edk
409 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698