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

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

Issue 2741033003: Mojo EDK: Introduce MojoQueryHandleSignalsState API (Closed)
Patch Set: fix stupid bad DCHECK Created 3 years, 9 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
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 #include <stdint.h> 5 #include <stdint.h>
6 #include <string.h> 6 #include <string.h>
7 7
8 #include "base/memory/ref_counted.h" 8 #include "base/memory/ref_counted.h"
9 #include "mojo/edk/system/test_utils.h" 9 #include "mojo/edk/system/test_utils.h"
10 #include "mojo/edk/test/mojo_test_base.h" 10 #include "mojo/edk/test/mojo_test_base.h"
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 buffer[1] = 456; 93 buffer[1] = 456;
94 buffer_size = kBufferSize; 94 buffer_size = kBufferSize;
95 ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT, ReadMessage(pipe1_, buffer, &buffer_size)); 95 ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT, ReadMessage(pipe1_, buffer, &buffer_size));
96 96
97 // Write from port 1 (to port 0). 97 // Write from port 1 (to port 0).
98 buffer[0] = 789012345; 98 buffer[0] = 789012345;
99 buffer[1] = 0; 99 buffer[1] = 0;
100 ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe1_, buffer, sizeof(buffer[0]))); 100 ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe1_, buffer, sizeof(buffer[0])));
101 101
102 MojoHandleSignalsState state; 102 MojoHandleSignalsState state;
103 ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe0_, MOJO_HANDLE_SIGNAL_READABLE, 103 ASSERT_EQ(MOJO_RESULT_OK,
104 MOJO_DEADLINE_INDEFINITE, &state)); 104 WaitForSignals(pipe0_, MOJO_HANDLE_SIGNAL_READABLE, &state));
105 105
106 // Read from port 0. 106 // Read from port 0.
107 buffer[0] = 123; 107 buffer[0] = 123;
108 buffer[1] = 456; 108 buffer[1] = 456;
109 buffer_size = kBufferSize; 109 buffer_size = kBufferSize;
110 ASSERT_EQ(MOJO_RESULT_OK, ReadMessage(pipe0_, buffer, &buffer_size)); 110 ASSERT_EQ(MOJO_RESULT_OK, ReadMessage(pipe0_, buffer, &buffer_size));
111 ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); 111 ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size);
112 ASSERT_EQ(789012345, buffer[0]); 112 ASSERT_EQ(789012345, buffer[0]);
113 ASSERT_EQ(456, buffer[1]); 113 ASSERT_EQ(456, buffer[1]);
114 114
115 // Read again from port 0 -- it should be empty. 115 // Read again from port 0 -- it should be empty.
116 buffer_size = kBufferSize; 116 buffer_size = kBufferSize;
117 ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT, ReadMessage(pipe0_, buffer, &buffer_size)); 117 ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT, ReadMessage(pipe0_, buffer, &buffer_size));
118 118
119 // Write two messages from port 0 (to port 1). 119 // Write two messages from port 0 (to port 1).
120 buffer[0] = 123456789; 120 buffer[0] = 123456789;
121 buffer[1] = 0; 121 buffer[1] = 0;
122 ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe0_, buffer, sizeof(buffer[0]))); 122 ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe0_, buffer, sizeof(buffer[0])));
123 buffer[0] = 234567890; 123 buffer[0] = 234567890;
124 buffer[1] = 0; 124 buffer[1] = 0;
125 ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe0_, buffer, sizeof(buffer[0]))); 125 ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe0_, buffer, sizeof(buffer[0])));
126 126
127 ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe1_, MOJO_HANDLE_SIGNAL_READABLE, 127 ASSERT_EQ(MOJO_RESULT_OK,
128 MOJO_DEADLINE_INDEFINITE, &state)); 128 WaitForSignals(pipe1_, MOJO_HANDLE_SIGNAL_READABLE, &state));
129 129
130 // Read from port 1 with buffer size 0 (should get the size of next message). 130 // Read from port 1 with buffer size 0 (should get the size of next message).
131 // Also test that giving a null buffer is okay when the buffer size is 0. 131 // Also test that giving a null buffer is okay when the buffer size is 0.
132 buffer_size = 0; 132 buffer_size = 0;
133 ASSERT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, 133 ASSERT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
134 ReadMessage(pipe1_, nullptr, &buffer_size)); 134 ReadMessage(pipe1_, nullptr, &buffer_size));
135 ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); 135 ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size);
136 136
137 // Read from port 1 with buffer size 1 (too small; should get the size of next 137 // Read from port 1 with buffer size 1 (too small; should get the size of next
138 // message). 138 // message).
139 buffer[0] = 123; 139 buffer[0] = 123;
140 buffer[1] = 456; 140 buffer[1] = 456;
141 buffer_size = 1; 141 buffer_size = 1;
142 ASSERT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, 142 ASSERT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
143 ReadMessage(pipe1_, buffer, &buffer_size)); 143 ReadMessage(pipe1_, buffer, &buffer_size));
144 ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); 144 ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size);
145 ASSERT_EQ(123, buffer[0]); 145 ASSERT_EQ(123, buffer[0]);
146 ASSERT_EQ(456, buffer[1]); 146 ASSERT_EQ(456, buffer[1]);
147 147
148 // Read from port 1. 148 // Read from port 1.
149 buffer[0] = 123; 149 buffer[0] = 123;
150 buffer[1] = 456; 150 buffer[1] = 456;
151 buffer_size = kBufferSize; 151 buffer_size = kBufferSize;
152 ASSERT_EQ(MOJO_RESULT_OK, ReadMessage(pipe1_, buffer, &buffer_size)); 152 ASSERT_EQ(MOJO_RESULT_OK, ReadMessage(pipe1_, buffer, &buffer_size));
153 ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); 153 ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size);
154 ASSERT_EQ(123456789, buffer[0]); 154 ASSERT_EQ(123456789, buffer[0]);
155 ASSERT_EQ(456, buffer[1]); 155 ASSERT_EQ(456, buffer[1]);
156 156
157 ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe1_, MOJO_HANDLE_SIGNAL_READABLE, 157 ASSERT_EQ(MOJO_RESULT_OK,
158 MOJO_DEADLINE_INDEFINITE, &state)); 158 WaitForSignals(pipe1_, MOJO_HANDLE_SIGNAL_READABLE, &state));
159 159
160 // Read again from port 1. 160 // Read again from port 1.
161 buffer[0] = 123; 161 buffer[0] = 123;
162 buffer[1] = 456; 162 buffer[1] = 456;
163 buffer_size = kBufferSize; 163 buffer_size = kBufferSize;
164 ASSERT_EQ(MOJO_RESULT_OK, ReadMessage(pipe1_, buffer, &buffer_size)); 164 ASSERT_EQ(MOJO_RESULT_OK, ReadMessage(pipe1_, buffer, &buffer_size));
165 ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); 165 ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size);
166 ASSERT_EQ(234567890, buffer[0]); 166 ASSERT_EQ(234567890, buffer[0]);
167 ASSERT_EQ(456, buffer[1]); 167 ASSERT_EQ(456, buffer[1]);
168 168
169 // Read again from port 1 -- it should be empty. 169 // Read again from port 1 -- it should be empty.
170 buffer_size = kBufferSize; 170 buffer_size = kBufferSize;
171 ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT, ReadMessage(pipe1_, buffer, &buffer_size)); 171 ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT, ReadMessage(pipe1_, buffer, &buffer_size));
172 172
173 // Write from port 0 (to port 1). 173 // Write from port 0 (to port 1).
174 buffer[0] = 345678901; 174 buffer[0] = 345678901;
175 buffer[1] = 0; 175 buffer[1] = 0;
176 ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe0_, buffer, sizeof(buffer[0]))); 176 ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe0_, buffer, sizeof(buffer[0])));
177 177
178 // Close port 0. 178 // Close port 0.
179 MojoClose(pipe0_); 179 MojoClose(pipe0_);
180 pipe0_ = MOJO_HANDLE_INVALID; 180 pipe0_ = MOJO_HANDLE_INVALID;
181 181
182 ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe1_, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 182 ASSERT_EQ(MOJO_RESULT_OK,
183 MOJO_DEADLINE_INDEFINITE, &state)); 183 WaitForSignals(pipe1_, MOJO_HANDLE_SIGNAL_PEER_CLOSED, &state));
184 184
185 // Try to write from port 1 (to port 0). 185 // Try to write from port 1 (to port 0).
186 buffer[0] = 456789012; 186 buffer[0] = 456789012;
187 buffer[1] = 0; 187 buffer[1] = 0;
188 ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 188 ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
189 WriteMessage(pipe1_, buffer, sizeof(buffer[0]))); 189 WriteMessage(pipe1_, buffer, sizeof(buffer[0])));
190 190
191 // Read from port 1; should still get message (even though port 0 was closed). 191 // Read from port 1; should still get message (even though port 0 was closed).
192 buffer[0] = 123; 192 buffer[0] = 123;
193 buffer[1] = 456; 193 buffer[1] = 456;
(...skipping 14 matching lines...) Expand all
208 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); 208 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer));
209 uint32_t buffer_size; 209 uint32_t buffer_size;
210 210
211 // Write some messages from port 1 (to port 0). 211 // Write some messages from port 1 (to port 0).
212 for (int32_t i = 0; i < 5; i++) { 212 for (int32_t i = 0; i < 5; i++) {
213 buffer[0] = i; 213 buffer[0] = i;
214 ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe1_, buffer, kBufferSize)); 214 ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe1_, buffer, kBufferSize));
215 } 215 }
216 216
217 MojoHandleSignalsState state; 217 MojoHandleSignalsState state;
218 ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe0_, MOJO_HANDLE_SIGNAL_READABLE, 218 ASSERT_EQ(MOJO_RESULT_OK,
219 MOJO_DEADLINE_INDEFINITE, &state)); 219 WaitForSignals(pipe0_, MOJO_HANDLE_SIGNAL_READABLE, &state));
220 220
221 // Port 0 shouldn't be empty. 221 // Port 0 shouldn't be empty.
222 buffer_size = 0; 222 buffer_size = 0;
223 ASSERT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, 223 ASSERT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
224 ReadMessage(pipe0_, nullptr, &buffer_size)); 224 ReadMessage(pipe0_, nullptr, &buffer_size));
225 ASSERT_EQ(kBufferSize, buffer_size); 225 ASSERT_EQ(kBufferSize, buffer_size);
226 226
227 // Close port 0 first, which should have outstanding (incoming) messages. 227 // Close port 0 first, which should have outstanding (incoming) messages.
228 MojoClose(pipe0_); 228 MojoClose(pipe0_);
229 MojoClose(pipe1_); 229 MojoClose(pipe1_);
230 pipe0_ = pipe1_ = MOJO_HANDLE_INVALID; 230 pipe0_ = pipe1_ = MOJO_HANDLE_INVALID;
231 } 231 }
232 232
233 TEST_F(MessagePipeTest, DiscardMode) { 233 TEST_F(MessagePipeTest, DiscardMode) {
234 int32_t buffer[2]; 234 int32_t buffer[2];
235 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); 235 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer));
236 uint32_t buffer_size; 236 uint32_t buffer_size;
237 237
238 // Write from port 1 (to port 0). 238 // Write from port 1 (to port 0).
239 buffer[0] = 789012345; 239 buffer[0] = 789012345;
240 buffer[1] = 0; 240 buffer[1] = 0;
241 ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe1_, buffer, sizeof(buffer[0]))); 241 ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe1_, buffer, sizeof(buffer[0])));
242 242
243 MojoHandleSignalsState state; 243 MojoHandleSignalsState state;
244 ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe0_, MOJO_HANDLE_SIGNAL_READABLE, 244 ASSERT_EQ(MOJO_RESULT_OK,
245 MOJO_DEADLINE_INDEFINITE, &state)); 245 WaitForSignals(pipe0_, MOJO_HANDLE_SIGNAL_READABLE, &state));
246 246
247 // Read/discard from port 0 (no buffer); get size. 247 // Read/discard from port 0 (no buffer); get size.
248 buffer_size = 0; 248 buffer_size = 0;
249 ASSERT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, 249 ASSERT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
250 ReadMessage(pipe0_, nullptr, &buffer_size, true)); 250 ReadMessage(pipe0_, nullptr, &buffer_size, true));
251 ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); 251 ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size);
252 252
253 // Read again from port 0 -- it should be empty. 253 // Read again from port 0 -- it should be empty.
254 buffer_size = kBufferSize; 254 buffer_size = kBufferSize;
255 ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT, 255 ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT,
256 ReadMessage(pipe0_, buffer, &buffer_size, true)); 256 ReadMessage(pipe0_, buffer, &buffer_size, true));
257 257
258 // Write from port 1 (to port 0). 258 // Write from port 1 (to port 0).
259 buffer[0] = 890123456; 259 buffer[0] = 890123456;
260 buffer[1] = 0; 260 buffer[1] = 0;
261 ASSERT_EQ(MOJO_RESULT_OK, 261 ASSERT_EQ(MOJO_RESULT_OK,
262 WriteMessage(pipe1_, buffer, sizeof(buffer[0]))); 262 WriteMessage(pipe1_, buffer, sizeof(buffer[0])));
263 263
264 ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe0_, MOJO_HANDLE_SIGNAL_READABLE, 264 ASSERT_EQ(MOJO_RESULT_OK,
265 MOJO_DEADLINE_INDEFINITE, &state)); 265 WaitForSignals(pipe0_, MOJO_HANDLE_SIGNAL_READABLE, &state));
266 266
267 // Read from port 0 (buffer big enough). 267 // Read from port 0 (buffer big enough).
268 buffer[0] = 123; 268 buffer[0] = 123;
269 buffer[1] = 456; 269 buffer[1] = 456;
270 buffer_size = kBufferSize; 270 buffer_size = kBufferSize;
271 ASSERT_EQ(MOJO_RESULT_OK, ReadMessage(pipe0_, buffer, &buffer_size, true)); 271 ASSERT_EQ(MOJO_RESULT_OK, ReadMessage(pipe0_, buffer, &buffer_size, true));
272 ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); 272 ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size);
273 ASSERT_EQ(890123456, buffer[0]); 273 ASSERT_EQ(890123456, buffer[0]);
274 ASSERT_EQ(456, buffer[1]); 274 ASSERT_EQ(456, buffer[1]);
275 275
276 // Read again from port 0 -- it should be empty. 276 // Read again from port 0 -- it should be empty.
277 buffer_size = kBufferSize; 277 buffer_size = kBufferSize;
278 ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT, 278 ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT,
279 ReadMessage(pipe0_, buffer, &buffer_size, true)); 279 ReadMessage(pipe0_, buffer, &buffer_size, true));
280 280
281 // Write from port 1 (to port 0). 281 // Write from port 1 (to port 0).
282 buffer[0] = 901234567; 282 buffer[0] = 901234567;
283 buffer[1] = 0; 283 buffer[1] = 0;
284 ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe1_, buffer, sizeof(buffer[0]))); 284 ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe1_, buffer, sizeof(buffer[0])));
285 285
286 ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe0_, MOJO_HANDLE_SIGNAL_READABLE, 286 ASSERT_EQ(MOJO_RESULT_OK,
287 MOJO_DEADLINE_INDEFINITE, &state)); 287 WaitForSignals(pipe0_, MOJO_HANDLE_SIGNAL_READABLE, &state));
288 288
289 // Read/discard from port 0 (buffer too small); get size. 289 // Read/discard from port 0 (buffer too small); get size.
290 buffer_size = 1; 290 buffer_size = 1;
291 ASSERT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, 291 ASSERT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
292 ReadMessage(pipe0_, buffer, &buffer_size, true)); 292 ReadMessage(pipe0_, buffer, &buffer_size, true));
293 ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); 293 ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size);
294 294
295 // Read again from port 0 -- it should be empty. 295 // Read again from port 0 -- it should be empty.
296 buffer_size = kBufferSize; 296 buffer_size = kBufferSize;
297 ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT, 297 ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT,
298 ReadMessage(pipe0_, buffer, &buffer_size, true)); 298 ReadMessage(pipe0_, buffer, &buffer_size, true));
299 299
300 // Write from port 1 (to port 0). 300 // Write from port 1 (to port 0).
301 buffer[0] = 123456789; 301 buffer[0] = 123456789;
302 buffer[1] = 0; 302 buffer[1] = 0;
303 ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe1_, buffer, sizeof(buffer[0]))); 303 ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe1_, buffer, sizeof(buffer[0])));
304 304
305 ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe0_, MOJO_HANDLE_SIGNAL_READABLE, 305 ASSERT_EQ(MOJO_RESULT_OK,
306 MOJO_DEADLINE_INDEFINITE, &state)); 306 WaitForSignals(pipe0_, MOJO_HANDLE_SIGNAL_READABLE, &state));
307 307
308 // Discard from port 0. 308 // Discard from port 0.
309 buffer_size = 1; 309 buffer_size = 1;
310 ASSERT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, 310 ASSERT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
311 ReadMessage(pipe0_, nullptr, 0, true)); 311 ReadMessage(pipe0_, nullptr, 0, true));
312 312
313 // Read again from port 0 -- it should be empty. 313 // Read again from port 0 -- it should be empty.
314 buffer_size = kBufferSize; 314 buffer_size = kBufferSize;
315 ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT, 315 ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT,
316 ReadMessage(pipe0_, buffer, &buffer_size, true)); 316 ReadMessage(pipe0_, buffer, &buffer_size, true));
317 } 317 }
318 318
319 TEST_F(MessagePipeTest, BasicWaiting) { 319 TEST_F(MessagePipeTest, BasicWaiting) {
320 MojoHandleSignalsState hss; 320 MojoHandleSignalsState hss;
321 321
322 int32_t buffer[1]; 322 int32_t buffer[1];
323 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); 323 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer));
324 uint32_t buffer_size; 324 uint32_t buffer_size;
325 325
326 // Always writable (until the other port is closed). 326 // Always writable (until the other port is closed). Not yet readable. Peer
327 hss = MojoHandleSignalsState(); 327 // not closed.
328 ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe0_, MOJO_HANDLE_SIGNAL_WRITABLE, 0, 328 hss = GetSignalsState(pipe0_);
329 &hss));
330 ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 329 ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
331 ASSERT_EQ(kAllSignals, hss.satisfiable_signals); 330 ASSERT_EQ(kAllSignals, hss.satisfiable_signals);
332 hss = MojoHandleSignalsState(); 331 hss = MojoHandleSignalsState();
333 332
334 // Not yet readable.
335 ASSERT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED,
336 MojoWait(pipe0_, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss));
337 ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
338 ASSERT_EQ(kAllSignals, hss.satisfiable_signals);
339
340 // The peer is not closed.
341 hss = MojoHandleSignalsState();
342 ASSERT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED,
343 MojoWait(pipe0_, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 0, &hss));
344 ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
345 ASSERT_EQ(kAllSignals, hss.satisfiable_signals);
346
347 // Write from port 0 (to port 1), to make port 1 readable. 333 // Write from port 0 (to port 1), to make port 1 readable.
348 buffer[0] = 123456789; 334 buffer[0] = 123456789;
349 ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe0_, buffer, kBufferSize)); 335 ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe0_, buffer, kBufferSize));
350 336
351 // Port 1 should already be readable now. 337 // Port 1 should already be readable now.
352 ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe1_, MOJO_HANDLE_SIGNAL_READABLE, 338 ASSERT_EQ(MOJO_RESULT_OK,
353 MOJO_DEADLINE_INDEFINITE, &hss)); 339 WaitForSignals(pipe1_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
354 ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 340 ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
355 hss.satisfied_signals); 341 hss.satisfied_signals);
356 ASSERT_EQ(kAllSignals, hss.satisfiable_signals); 342 ASSERT_EQ(kAllSignals, hss.satisfiable_signals);
357 // ... and still writable. 343 // ... and still writable.
358 hss = MojoHandleSignalsState(); 344 hss = MojoHandleSignalsState();
359 ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe1_, MOJO_HANDLE_SIGNAL_WRITABLE, 345 ASSERT_EQ(MOJO_RESULT_OK,
360 MOJO_DEADLINE_INDEFINITE, &hss)); 346 WaitForSignals(pipe1_, MOJO_HANDLE_SIGNAL_WRITABLE, &hss));
361 ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 347 ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
362 hss.satisfied_signals); 348 hss.satisfied_signals);
363 ASSERT_EQ(kAllSignals, hss.satisfiable_signals); 349 ASSERT_EQ(kAllSignals, hss.satisfiable_signals);
364 350
365 // Close port 0. 351 // Close port 0.
366 MojoClose(pipe0_); 352 MojoClose(pipe0_);
367 pipe0_ = MOJO_HANDLE_INVALID; 353 pipe0_ = MOJO_HANDLE_INVALID;
368 354
369 // Port 1 should be signaled with peer closed. 355 // Port 1 should be signaled with peer closed.
370 hss = MojoHandleSignalsState(); 356 hss = MojoHandleSignalsState();
371 ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe1_, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 357 ASSERT_EQ(MOJO_RESULT_OK,
372 MOJO_DEADLINE_INDEFINITE, &hss)); 358 WaitForSignals(pipe1_, MOJO_HANDLE_SIGNAL_PEER_CLOSED, &hss));
373 ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, 359 ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
374 hss.satisfied_signals); 360 hss.satisfied_signals);
375 ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, 361 ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
376 hss.satisfiable_signals); 362 hss.satisfiable_signals);
377 363
378 // Port 1 should not be writable. 364 // Port 1 should not be writable.
379 hss = MojoHandleSignalsState(); 365 hss = MojoHandleSignalsState();
380 366
381 ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 367 ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
382 MojoWait(pipe1_, MOJO_HANDLE_SIGNAL_WRITABLE, 368 WaitForSignals(pipe1_, MOJO_HANDLE_SIGNAL_WRITABLE, &hss));
383 MOJO_DEADLINE_INDEFINITE, &hss));
384 ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, 369 ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
385 hss.satisfied_signals); 370 hss.satisfied_signals);
386 ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, 371 ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
387 hss.satisfiable_signals); 372 hss.satisfiable_signals);
388 373
389 // But it should still be readable. 374 // But it should still be readable.
390 hss = MojoHandleSignalsState(); 375 hss = MojoHandleSignalsState();
391 ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe1_, MOJO_HANDLE_SIGNAL_READABLE, 376 ASSERT_EQ(MOJO_RESULT_OK,
392 MOJO_DEADLINE_INDEFINITE, &hss)); 377 WaitForSignals(pipe1_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
393 ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, 378 ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
394 hss.satisfied_signals); 379 hss.satisfied_signals);
395 ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, 380 ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
396 hss.satisfiable_signals); 381 hss.satisfiable_signals);
397 382
398 // Read from port 1. 383 // Read from port 1.
399 buffer[0] = 0; 384 buffer[0] = 0;
400 buffer_size = kBufferSize; 385 buffer_size = kBufferSize;
401 ASSERT_EQ(MOJO_RESULT_OK, ReadMessage(pipe1_, buffer, &buffer_size)); 386 ASSERT_EQ(MOJO_RESULT_OK, ReadMessage(pipe1_, buffer, &buffer_size));
402 ASSERT_EQ(123456789, buffer[0]); 387 ASSERT_EQ(123456789, buffer[0]);
403 388
404 // Now port 1 should no longer be readable. 389 // Now port 1 should no longer be readable.
405 hss = MojoHandleSignalsState(); 390 hss = MojoHandleSignalsState();
406 ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 391 ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
407 MojoWait(pipe1_, MOJO_HANDLE_SIGNAL_READABLE, 392 WaitForSignals(pipe1_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
408 MOJO_DEADLINE_INDEFINITE, &hss));
409 ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); 393 ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
410 ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); 394 ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
411 } 395 }
412 396
413 TEST_F(MessagePipeTest, InvalidMessageObjects) { 397 TEST_F(MessagePipeTest, InvalidMessageObjects) {
414 // null message 398 // null message
415 ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT, 399 ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
416 MojoFreeMessage(MOJO_MESSAGE_HANDLE_INVALID)); 400 MojoFreeMessage(MOJO_MESSAGE_HANDLE_INVALID));
417 401
418 // null message 402 // null message
(...skipping 27 matching lines...) Expand all
446 void* buffer = nullptr; 430 void* buffer = nullptr;
447 EXPECT_EQ(MOJO_RESULT_OK, MojoGetMessageBuffer(message, &buffer)); 431 EXPECT_EQ(MOJO_RESULT_OK, MojoGetMessageBuffer(message, &buffer));
448 ASSERT_TRUE(buffer); 432 ASSERT_TRUE(buffer);
449 memcpy(buffer, kMessage.data(), kMessage.size()); 433 memcpy(buffer, kMessage.data(), kMessage.size());
450 434
451 MojoHandle a, b; 435 MojoHandle a, b;
452 CreateMessagePipe(&a, &b); 436 CreateMessagePipe(&a, &b);
453 EXPECT_EQ(MOJO_RESULT_OK, 437 EXPECT_EQ(MOJO_RESULT_OK,
454 MojoWriteMessageNew(a, message, MOJO_WRITE_MESSAGE_FLAG_NONE)); 438 MojoWriteMessageNew(a, message, MOJO_WRITE_MESSAGE_FLAG_NONE));
455 439
456 EXPECT_EQ(MOJO_RESULT_OK, 440 EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(b, MOJO_HANDLE_SIGNAL_READABLE));
457 MojoWait(b, MOJO_HANDLE_SIGNAL_READABLE, MOJO_DEADLINE_INDEFINITE,
458 nullptr));
459 uint32_t num_bytes = 0; 441 uint32_t num_bytes = 0;
460 uint32_t num_handles = 0; 442 uint32_t num_handles = 0;
461 EXPECT_EQ(MOJO_RESULT_OK, 443 EXPECT_EQ(MOJO_RESULT_OK,
462 MojoReadMessageNew(b, &message, &num_bytes, nullptr, &num_handles, 444 MojoReadMessageNew(b, &message, &num_bytes, nullptr, &num_handles,
463 MOJO_READ_MESSAGE_FLAG_NONE)); 445 MOJO_READ_MESSAGE_FLAG_NONE));
464 ASSERT_NE(MOJO_MESSAGE_HANDLE_INVALID, message); 446 ASSERT_NE(MOJO_MESSAGE_HANDLE_INVALID, message);
465 EXPECT_EQ(static_cast<uint32_t>(kMessage.size()), num_bytes); 447 EXPECT_EQ(static_cast<uint32_t>(kMessage.size()), num_bytes);
466 EXPECT_EQ(0u, num_handles); 448 EXPECT_EQ(0u, num_handles);
467 449
468 EXPECT_EQ(MOJO_RESULT_OK, MojoGetMessageBuffer(message, &buffer)); 450 EXPECT_EQ(MOJO_RESULT_OK, MojoGetMessageBuffer(message, &buffer));
(...skipping 13 matching lines...) Expand all
482 const size_t kPingPongIterations = 500; 464 const size_t kPingPongIterations = 500;
483 465
484 DEFINE_TEST_CLIENT_TEST_WITH_PIPE(HandlePingPong, MessagePipeTest, h) { 466 DEFINE_TEST_CLIENT_TEST_WITH_PIPE(HandlePingPong, MessagePipeTest, h) {
485 // Waits for a handle to become readable and writes it back to the sender. 467 // Waits for a handle to become readable and writes it back to the sender.
486 for (size_t i = 0; i < kPingPongIterations; i++) { 468 for (size_t i = 0; i < kPingPongIterations; i++) {
487 MojoHandle handles[kPingPongHandlesPerIteration]; 469 MojoHandle handles[kPingPongHandlesPerIteration];
488 ReadMessageWithHandles(h, handles, kPingPongHandlesPerIteration); 470 ReadMessageWithHandles(h, handles, kPingPongHandlesPerIteration);
489 WriteMessageWithHandles(h, "", handles, kPingPongHandlesPerIteration); 471 WriteMessageWithHandles(h, "", handles, kPingPongHandlesPerIteration);
490 } 472 }
491 473
492 EXPECT_EQ(MOJO_RESULT_OK, MojoWait(h, MOJO_HANDLE_SIGNAL_READABLE, 474 EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE));
493 MOJO_DEADLINE_INDEFINITE, nullptr));
494 char msg[4]; 475 char msg[4];
495 uint32_t num_bytes = 4; 476 uint32_t num_bytes = 4;
496 EXPECT_EQ(MOJO_RESULT_OK, ReadMessage(h, msg, &num_bytes)); 477 EXPECT_EQ(MOJO_RESULT_OK, ReadMessage(h, msg, &num_bytes));
497 } 478 }
498 479
499 // This test is flaky: http://crbug.com/585784 480 // This test is flaky: http://crbug.com/585784
500 TEST_F(MessagePipeTest, DISABLED_DataPipeConsumerHandlePingPong) { 481 TEST_F(MessagePipeTest, DISABLED_DataPipeConsumerHandlePingPong) {
501 MojoHandle p, c[kPingPongHandlesPerIteration]; 482 MojoHandle p, c[kPingPongHandlesPerIteration];
502 for (size_t i = 0; i < kPingPongHandlesPerIteration; ++i) { 483 for (size_t i = 0; i < kPingPongHandlesPerIteration; ++i) {
503 EXPECT_EQ(MOJO_RESULT_OK, MojoCreateDataPipe(nullptr, &p, &c[i])); 484 EXPECT_EQ(MOJO_RESULT_OK, MojoCreateDataPipe(nullptr, &p, &c[i]));
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
668 CreateMessagePipe(&a, &b); 649 CreateMessagePipe(&a, &b);
669 CreateMessagePipe(&c, &d); 650 CreateMessagePipe(&c, &d);
670 651
671 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a)); 652 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
672 EXPECT_EQ(MOJO_RESULT_OK, MojoFuseMessagePipes(b, c)); 653 EXPECT_EQ(MOJO_RESULT_OK, MojoFuseMessagePipes(b, c));
673 654
674 // Handles b and c should be closed. 655 // Handles b and c should be closed.
675 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(b)); 656 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(b));
676 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(c)); 657 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(c));
677 658
678 EXPECT_EQ(MOJO_RESULT_OK, MojoWait(d, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 659 EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(d, MOJO_HANDLE_SIGNAL_PEER_CLOSED));
679 MOJO_DEADLINE_INDEFINITE, nullptr));
680
681 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(d)); 660 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(d));
682 } 661 }
683 662
684 TEST_F(FuseMessagePipeTest, FuseAfterPeerWriteAndClosure) { 663 TEST_F(FuseMessagePipeTest, FuseAfterPeerWriteAndClosure) {
685 // Test that peer write and closure prior to fusion still results in the 664 // Test that peer write and closure prior to fusion still results in the
686 // both message arrival and awareness of peer closure. 665 // both message arrival and awareness of peer closure.
687 666
688 MojoHandle a, b, c, d; 667 MojoHandle a, b, c, d;
689 CreateMessagePipe(&a, &b); 668 CreateMessagePipe(&a, &b);
690 CreateMessagePipe(&c, &d); 669 CreateMessagePipe(&c, &d);
691 670
692 const std::string kTestMessage = "ayyy lmao"; 671 const std::string kTestMessage = "ayyy lmao";
693 WriteMessage(a, kTestMessage); 672 WriteMessage(a, kTestMessage);
694 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a)); 673 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
695 674
696 EXPECT_EQ(MOJO_RESULT_OK, MojoFuseMessagePipes(b, c)); 675 EXPECT_EQ(MOJO_RESULT_OK, MojoFuseMessagePipes(b, c));
697 676
698 // Handles b and c should be closed. 677 // Handles b and c should be closed.
699 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(b)); 678 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(b));
700 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(c)); 679 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(c));
701 680
702 EXPECT_EQ(kTestMessage, ReadMessage(d)); 681 EXPECT_EQ(kTestMessage, ReadMessage(d));
703 EXPECT_EQ(MOJO_RESULT_OK, MojoWait(d, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 682 EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(d, MOJO_HANDLE_SIGNAL_PEER_CLOSED));
704 MOJO_DEADLINE_INDEFINITE, nullptr));
705
706 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(d)); 683 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(d));
707 } 684 }
708 685
709 TEST_F(MessagePipeTest, ClosePipesStressTest) { 686 TEST_F(MessagePipeTest, ClosePipesStressTest) {
710 // Stress test to exercise https://crbug.com/665869. 687 // Stress test to exercise https://crbug.com/665869.
711 const size_t kNumPipes = 100000; 688 const size_t kNumPipes = 100000;
712 for (size_t i = 0; i < kNumPipes; ++i) { 689 for (size_t i = 0; i < kNumPipes; ++i) {
713 MojoHandle a, b; 690 MojoHandle a, b;
714 CreateMessagePipe(&a, &b); 691 CreateMessagePipe(&a, &b);
715 MojoClose(a); 692 MojoClose(a);
716 MojoClose(b); 693 MojoClose(b);
717 } 694 }
718 } 695 }
719 696
720 } // namespace 697 } // namespace
721 } // namespace edk 698 } // namespace edk
722 } // namespace mojo 699 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/edk/system/message_pipe_perftest.cc ('k') | mojo/edk/system/multiprocess_message_pipe_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698