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

Side by Side Diff: mojo/public/c/system/tests/wait_set_unittest.cc

Issue 2106433002: Add thunks for wait set operations, together with public tests. (Closed) Base URL: https://github.com/domokit/mojo.git@work791_wait_set_6-x-work790_wait_set_5.4
Patch Set: doh Created 4 years, 5 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 2016 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 // This file tests the C wait set API (the functions declared in
6 // mojo/public/c/system/wait_set.h).
7
8 #include "mojo/public/c/system/wait_set.h"
9
10 #include "mojo/public/c/system/handle.h"
11 #include "mojo/public/c/system/message_pipe.h"
12 #include "mojo/public/c/system/result.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14
15 namespace {
16
17 const MojoHandleRights kDefaultWaitSetHandleRights =
18 MOJO_HANDLE_RIGHT_READ | MOJO_HANDLE_RIGHT_WRITE |
19 MOJO_HANDLE_RIGHT_GET_OPTIONS | MOJO_HANDLE_RIGHT_SET_OPTIONS;
20
21 TEST(WaitSetTest, InvalidHandle) {
22 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
23 MojoWaitSetAdd(MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID,
24 MOJO_HANDLE_SIGNAL_READABLE, 123u, nullptr));
25 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
26 MojoWaitSetRemove(MOJO_HANDLE_INVALID, 123u));
27 uint32_t num_results = 10u;
28 MojoWaitSetResult results[10] = {};
29 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
30 MojoWaitSetWait(MOJO_HANDLE_INVALID, MOJO_DEADLINE_INDEFINITE,
31 &num_results, results, nullptr));
32
33 // Also check |MojoWaitSetAdd()| with a valid handle to be added.
34 MojoHandle mph0 = MOJO_HANDLE_INVALID;
35 MojoHandle mph1 = MOJO_HANDLE_INVALID;
36 EXPECT_EQ(MOJO_RESULT_OK, MojoCreateMessagePipe(nullptr, &mph0, &mph1));
37 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
38 MojoWaitSetAdd(MOJO_HANDLE_INVALID, mph0,
39 MOJO_HANDLE_SIGNAL_READABLE, 123u, nullptr));
40 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(mph0));
41 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(mph1));
42 }
43
44 TEST(WaitSetTest, Create) {
45 // Invalid options.
46 {
47 static constexpr MojoCreateWaitSetOptions kOptions = {};
48 MojoHandle h = MOJO_HANDLE_INVALID;
49 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoCreateWaitSet(&kOptions, &h));
50 EXPECT_EQ(MOJO_HANDLE_INVALID, h);
51 }
52
53 // Options with unknown flags.
54 {
55 static constexpr MojoCreateWaitSetOptions kOptions = {
56 static_cast<uint32_t>(sizeof(MojoCreateWaitSetOptions)),
57 ~static_cast<MojoCreateWaitSetOptionsFlags>(0),
58 };
59 MojoHandle h = MOJO_HANDLE_INVALID;
60 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED, MojoCreateWaitSet(&kOptions, &h));
61 EXPECT_EQ(MOJO_HANDLE_INVALID, h);
62 }
63
64 // With non-null options.
65 {
66 static constexpr MojoCreateWaitSetOptions kOptions = {
67 static_cast<uint32_t>(sizeof(MojoCreateWaitSetOptions)),
68 static_cast<MojoCreateWaitSetOptionsFlags>(0),
69 };
70 MojoHandle h = MOJO_HANDLE_INVALID;
71 EXPECT_EQ(MOJO_RESULT_OK, MojoCreateWaitSet(&kOptions, &h));
72 EXPECT_NE(h, MOJO_HANDLE_INVALID);
73
74 // Should have the correct rights.
75 MojoHandleRights rights = MOJO_HANDLE_RIGHT_NONE;
76 EXPECT_EQ(MOJO_RESULT_OK, MojoGetRights(h, &rights));
77 EXPECT_EQ(kDefaultWaitSetHandleRights, rights);
78
79 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h));
80 }
81
82 // With null options.
83 {
84 MojoHandle h = MOJO_HANDLE_INVALID;
85 EXPECT_EQ(MOJO_RESULT_OK, MojoCreateWaitSet(nullptr, &h));
86 EXPECT_NE(h, MOJO_HANDLE_INVALID);
87
88 // Should have the correct rights.
89 MojoHandleRights rights = MOJO_HANDLE_RIGHT_NONE;
90 EXPECT_EQ(MOJO_RESULT_OK, MojoGetRights(h, &rights));
91 EXPECT_EQ(kDefaultWaitSetHandleRights, rights);
92
93 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h));
94 }
95 }
96
97 TEST(WaitSetTest, Add) {
98 MojoHandle h = MOJO_HANDLE_INVALID;
99 EXPECT_EQ(MOJO_RESULT_OK, MojoCreateWaitSet(nullptr, &h));
100 EXPECT_NE(h, MOJO_HANDLE_INVALID);
101
102 // Add invalid handle.
103 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
104 MojoWaitSetAdd(h, MOJO_HANDLE_INVALID, MOJO_HANDLE_SIGNAL_READABLE,
105 0u, nullptr));
106
107 // Some handles that we can add.
108 MojoHandle mph0 = MOJO_HANDLE_INVALID;
109 MojoHandle mph1 = MOJO_HANDLE_INVALID;
110 EXPECT_EQ(MOJO_RESULT_OK, MojoCreateMessagePipe(nullptr, &mph0, &mph1));
111
112 // Add with invalid options.
113 {
114 static constexpr MojoWaitSetAddOptions kOptions = {};
115 EXPECT_EQ(
116 MOJO_RESULT_INVALID_ARGUMENT,
117 MojoWaitSetAdd(h, mph0, MOJO_HANDLE_SIGNAL_READABLE, 0u, &kOptions));
118 }
119
120 // Add with options with unknown flags.
121 {
122 static constexpr MojoWaitSetAddOptions kOptions = {
123 static_cast<uint32_t>(sizeof(MojoWaitSetAddOptions)),
124 ~static_cast<MojoWaitSetAddOptionsFlags>(0),
125 };
126 EXPECT_EQ(
127 MOJO_RESULT_UNIMPLEMENTED,
128 MojoWaitSetAdd(h, mph0, MOJO_HANDLE_SIGNAL_READABLE, 0u, &kOptions));
129 }
130
131 // Add with options.
132 {
133 static constexpr MojoWaitSetAddOptions kOptions = {
134 static_cast<uint32_t>(sizeof(MojoWaitSetAddOptions)),
135 static_cast<MojoWaitSetAddOptionsFlags>(0),
136 };
137 EXPECT_EQ(
138 MOJO_RESULT_OK,
139 MojoWaitSetAdd(h, mph0, MOJO_HANDLE_SIGNAL_READABLE, 0u, &kOptions));
140 }
141
142 // Add with null options.
143 EXPECT_EQ(MOJO_RESULT_OK,
144 MojoWaitSetAdd(h, mph1, MOJO_HANDLE_SIGNAL_WRITABLE, 1u, nullptr));
145
146 // Add a handle that's already present, with a different cookie.
147 EXPECT_EQ(MOJO_RESULT_OK,
148 MojoWaitSetAdd(h, mph0, MOJO_HANDLE_SIGNAL_READABLE, 2u, nullptr));
149
150 // Try to add a cookie that's already present.
151 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
152 MojoWaitSetAdd(h, mph1, MOJO_HANDLE_SIGNAL_READABLE, 0u, nullptr));
153
154 // Can close things in a wait set.
155 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(mph0));
156
157 // Can close a wait set with unclosed handles in it.
158 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h));
159
160 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(mph1));
161 }
162
163 TEST(WaitSetTest, Remove) {
164 MojoHandle h = MOJO_HANDLE_INVALID;
165 EXPECT_EQ(MOJO_RESULT_OK, MojoCreateWaitSet(nullptr, &h));
166 EXPECT_NE(h, MOJO_HANDLE_INVALID);
167
168 // Some handles that we can add.
169 MojoHandle mph0 = MOJO_HANDLE_INVALID;
170 MojoHandle mph1 = MOJO_HANDLE_INVALID;
171 EXPECT_EQ(MOJO_RESULT_OK, MojoCreateMessagePipe(nullptr, &mph0, &mph1));
172
173 // Try to remove something that's not there.
174 EXPECT_EQ(MOJO_RESULT_NOT_FOUND, MojoWaitSetRemove(h, 12u));
175
176 EXPECT_EQ(MOJO_RESULT_OK,
177 MojoWaitSetAdd(h, mph0, MOJO_HANDLE_SIGNAL_READABLE, 12u, nullptr));
178 EXPECT_EQ(MOJO_RESULT_OK,
179 MojoWaitSetAdd(h, mph1, MOJO_HANDLE_SIGNAL_READABLE, 34u, nullptr));
180
181 // Remove something.
182 EXPECT_EQ(MOJO_RESULT_OK, MojoWaitSetRemove(h, 12u));
183
184 // Can't remove it again.
185 EXPECT_EQ(MOJO_RESULT_NOT_FOUND, MojoWaitSetRemove(h, 12u));
186
187 // Now can add it again.
188 EXPECT_EQ(MOJO_RESULT_OK,
189 MojoWaitSetAdd(h, mph0, MOJO_HANDLE_SIGNAL_WRITABLE, 12u, nullptr));
190
191 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h));
192 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(mph0));
193 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(mph1));
194 }
195
196 // Helper to check if an array of |MojoWaitSetResult|s has a result |r| for the
197 // given cookie, in which case:
198 // - |r.wait_result| must equal |wait_result|.
199 // - If |wait_result| is |MOJO_RESULT_OK| or
200 // |MOJO_RESULT_FAILED_PRECONDITION|, then
201 // - |r.signals_state.satisfied_signals & signals| must equal
202 // |signals_state.satisfied_signals & signals|, and
203 // - |r.signals_state.satisfiable & signals| must equal
204 // |signals_state.satisfiable_signals & signals|.
205 // - Otherwise, |r.signals_state| must equals |signals_state|.
206 // (This doesn't check that the result is unique; you should check |num_results|
207 // versus the expect number and exhaustively check every expected result.)
208 bool CheckHasResult(uint32_t num_results,
209 const MojoWaitSetResult* results,
210 uint64_t cookie,
211 MojoHandleSignals signals,
212 MojoResult wait_result,
213 const MojoHandleSignalsState& signals_state) {
214 for (uint32_t i = 0; i < num_results; i++) {
215 if (results[i].cookie == cookie) {
216 EXPECT_EQ(wait_result, results[i].wait_result) << cookie;
217 EXPECT_EQ(0u, results[i].reserved) << cookie;
218 if (wait_result == MOJO_RESULT_OK ||
219 wait_result == MOJO_RESULT_FAILED_PRECONDITION) {
220 EXPECT_EQ(signals_state.satisfied_signals & signals,
221 results[i].signals_state.satisfied_signals & signals)
222 << cookie;
223 EXPECT_EQ(signals_state.satisfiable_signals & signals,
224 results[i].signals_state.satisfiable_signals & signals)
225 << cookie;
226 } else {
227 EXPECT_EQ(signals_state.satisfied_signals,
228 results[i].signals_state.satisfied_signals)
229 << cookie;
230 EXPECT_EQ(signals_state.satisfiable_signals,
231 results[i].signals_state.satisfiable_signals)
232 << cookie;
233 }
234 return true;
235 }
236 }
237 return false;
238 }
239
240 TEST(WaitSetTest, Wait) {
241 MojoHandle h = MOJO_HANDLE_INVALID;
242 EXPECT_EQ(MOJO_RESULT_OK, MojoCreateWaitSet(nullptr, &h));
243 EXPECT_NE(h, MOJO_HANDLE_INVALID);
244
245 // Nothing in the wait set.
246 {
247 uint32_t num_results = 10u;
248 MojoWaitSetResult results[10] = {};
249 uint32_t max_results = 1234u;
250 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED,
251 MojoWaitSetWait(h, static_cast<MojoDeadline>(0), &num_results,
252 results, &max_results));
253 EXPECT_EQ(10u, num_results);
254 EXPECT_EQ(1234u, max_results);
255 }
256
257 // Ditto, with non-zero deadline and null |max_results|.
258 {
259 uint32_t num_results = 10u;
260 MojoWaitSetResult results[10] = {};
261 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED,
262 MojoWaitSetWait(h, static_cast<MojoDeadline>(1000), &num_results,
263 results, nullptr));
264 EXPECT_EQ(10u, num_results);
265 }
266
267 // Some handles that we can add.
268 MojoHandle mph0 = MOJO_HANDLE_INVALID;
269 MojoHandle mph1 = MOJO_HANDLE_INVALID;
270 EXPECT_EQ(MOJO_RESULT_OK, MojoCreateMessagePipe(nullptr, &mph0, &mph1));
271
272 EXPECT_EQ(MOJO_RESULT_OK,
273 MojoWaitSetAdd(h, mph0, MOJO_HANDLE_SIGNAL_READABLE, 1u, nullptr));
274 EXPECT_EQ(MOJO_RESULT_OK,
275 MojoWaitSetAdd(h, mph1, MOJO_HANDLE_SIGNAL_READABLE, 2u, nullptr));
276
277 // Will still time out.
278 {
279 uint32_t num_results = 10u;
280 MojoWaitSetResult results[10] = {};
281 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED,
282 MojoWaitSetWait(h, static_cast<MojoDeadline>(0), &num_results,
283 results, nullptr));
284 EXPECT_EQ(10u, num_results);
285 }
286
287 // Write to |mph1|.
288 EXPECT_EQ(MOJO_RESULT_OK, MojoWriteMessage(mph1, nullptr, 0, nullptr, 0,
289 MOJO_WRITE_MESSAGE_FLAG_NONE));
290
291 // Should get cookie 1.
292 {
293 uint32_t num_results = 10u;
294 MojoWaitSetResult results[10] = {};
295 uint32_t max_results = 1234u;
296 EXPECT_EQ(MOJO_RESULT_OK,
297 MojoWaitSetWait(h, static_cast<MojoDeadline>(0), &num_results,
298 results, &max_results));
299 EXPECT_EQ(1u, num_results);
300 EXPECT_TRUE(CheckHasResult(
301 num_results, results, 1u, MOJO_HANDLE_SIGNAL_READABLE, MOJO_RESULT_OK,
302 MojoHandleSignalsState{
303 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
304 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE}));
305 EXPECT_EQ(1u, max_results);
306 }
307
308 // Non-zero deadline, null |max_results|; should still get cookie 1.
309 {
310 uint32_t num_results = 10u;
311 MojoWaitSetResult results[10] = {};
312 EXPECT_EQ(MOJO_RESULT_OK,
313 MojoWaitSetWait(h, static_cast<MojoDeadline>(1000), &num_results,
314 results, nullptr));
315 EXPECT_EQ(1u, num_results);
316 EXPECT_TRUE(CheckHasResult(
317 num_results, results, 1u, MOJO_HANDLE_SIGNAL_READABLE, MOJO_RESULT_OK,
318 MojoHandleSignalsState{
319 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
320 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE}));
321 }
322
323 // Zero |num_results|.
324 {
325 uint32_t num_results = 0u;
326 uint32_t max_results = 1234u;
327 EXPECT_EQ(MOJO_RESULT_OK,
328 MojoWaitSetWait(h, static_cast<MojoDeadline>(0), &num_results,
329 nullptr, &max_results));
330 EXPECT_EQ(0u, num_results);
331 EXPECT_EQ(1u, max_results);
332 }
333
334 // Add another entry waiting for readability on |mph0|.
335 EXPECT_EQ(MOJO_RESULT_OK,
336 MojoWaitSetAdd(h, mph0, MOJO_HANDLE_SIGNAL_READABLE |
337 MOJO_HANDLE_SIGNAL_WRITABLE,
338 3u, nullptr));
339
340 {
341 uint32_t num_results = 10u;
342 uint32_t max_results = 1234u;
343 MojoWaitSetResult results[10] = {};
344 EXPECT_EQ(MOJO_RESULT_OK,
345 MojoWaitSetWait(h, MOJO_DEADLINE_INDEFINITE, &num_results,
346 results, &max_results));
347 EXPECT_EQ(2u, num_results);
348 EXPECT_TRUE(CheckHasResult(
349 num_results, results, 1u, MOJO_HANDLE_SIGNAL_READABLE, MOJO_RESULT_OK,
350 MojoHandleSignalsState{
351 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
352 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE}));
353 EXPECT_TRUE(CheckHasResult(
354 num_results, results, 3u,
355 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
356 MOJO_RESULT_OK,
357 MojoHandleSignalsState{
358 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
359 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE}));
360 EXPECT_EQ(2u, max_results);
361 }
362
363 // Close |mph0|.
364 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(mph0));
365
366 {
367 uint32_t num_results = 10u;
368 MojoWaitSetResult results[10] = {};
369 EXPECT_EQ(MOJO_RESULT_OK, MojoWaitSetWait(h, MOJO_DEADLINE_INDEFINITE,
370 &num_results, results, nullptr));
371 EXPECT_EQ(3u, num_results);
372 EXPECT_TRUE(
373 CheckHasResult(num_results, results, 1u, MOJO_HANDLE_SIGNAL_READABLE,
374 MOJO_RESULT_CANCELLED, MojoHandleSignalsState()));
375 EXPECT_TRUE(CheckHasResult(
376 num_results, results, 2u, MOJO_HANDLE_SIGNAL_WRITABLE,
377 MOJO_RESULT_FAILED_PRECONDITION, MojoHandleSignalsState()));
378 EXPECT_TRUE(CheckHasResult(
379 num_results, results, 3u,
380 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
381 MOJO_RESULT_CANCELLED, MojoHandleSignalsState()));
382 }
383
384 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h));
385 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(mph1));
386 }
387
388 // TODO(vtl): Add threaded tests, especially those that actually ... wait.
389
390 } // namespace
OLDNEW
« no previous file with comments | « mojo/public/c/system/tests/time_unittest.cc ('k') | mojo/public/c/system/tests/wait_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698