1*344aa361SAndroid Build Coastguard Worker /*
2*344aa361SAndroid Build Coastguard Worker * Copyright (C) 2019 The Android Open Source Project
3*344aa361SAndroid Build Coastguard Worker *
4*344aa361SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*344aa361SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*344aa361SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*344aa361SAndroid Build Coastguard Worker *
8*344aa361SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*344aa361SAndroid Build Coastguard Worker *
10*344aa361SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*344aa361SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*344aa361SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*344aa361SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*344aa361SAndroid Build Coastguard Worker * limitations under the License.
15*344aa361SAndroid Build Coastguard Worker */
16*344aa361SAndroid Build Coastguard Worker
17*344aa361SAndroid Build Coastguard Worker #include <assert.h>
18*344aa361SAndroid Build Coastguard Worker #include <err.h>
19*344aa361SAndroid Build Coastguard Worker #include <lib/trusty/event.h>
20*344aa361SAndroid Build Coastguard Worker #include <lib/trusty/handle_set.h>
21*344aa361SAndroid Build Coastguard Worker #include <lib/trusty/ipc_msg.h>
22*344aa361SAndroid Build Coastguard Worker #include <lib/trusty/uuid.h>
23*344aa361SAndroid Build Coastguard Worker #include <lib/unittest/unittest.h>
24*344aa361SAndroid Build Coastguard Worker
25*344aa361SAndroid Build Coastguard Worker #include <trace.h>
26*344aa361SAndroid Build Coastguard Worker
27*344aa361SAndroid Build Coastguard Worker #define EXPECTED_TO_FAIL_TIMEOUT_MSEC 1000
28*344aa361SAndroid Build Coastguard Worker #define NOT_EXPECTED_TO_FAIL_TIMEOUT_MSEC (30000)
29*344aa361SAndroid Build Coastguard Worker
30*344aa361SAndroid Build Coastguard Worker #define MAX_EVT_CNT 100
31*344aa361SAndroid Build Coastguard Worker #define TEST_EVS_NAME1 "com.android.trusty.test-uevent-source1"
32*344aa361SAndroid Build Coastguard Worker #define TEST_EVS_NAME2 "com.android.trusty.test-uevent-source2"
33*344aa361SAndroid Build Coastguard Worker #define TEST_EVT_NAME1 "com.android.trusty.test-uevent-client1"
34*344aa361SAndroid Build Coastguard Worker #define TEST_EVT_NAME2 "com.android.trusty.test-uevent-client2"
35*344aa361SAndroid Build Coastguard Worker
36*344aa361SAndroid Build Coastguard Worker typedef struct uirq {
37*344aa361SAndroid Build Coastguard Worker struct handle* hset;
38*344aa361SAndroid Build Coastguard Worker struct handle* hevts;
39*344aa361SAndroid Build Coastguard Worker struct handle* hevt1;
40*344aa361SAndroid Build Coastguard Worker struct handle* hevt2;
41*344aa361SAndroid Build Coastguard Worker struct handle_ref hevts_ref;
42*344aa361SAndroid Build Coastguard Worker struct handle_ref hevt1_ref;
43*344aa361SAndroid Build Coastguard Worker struct handle_ref hevt2_ref;
44*344aa361SAndroid Build Coastguard Worker } uirq_t;
45*344aa361SAndroid Build Coastguard Worker
TEST_F_SETUP(uirq)46*344aa361SAndroid Build Coastguard Worker TEST_F_SETUP(uirq) {
47*344aa361SAndroid Build Coastguard Worker memset(_state, 0, sizeof(*_state));
48*344aa361SAndroid Build Coastguard Worker }
49*344aa361SAndroid Build Coastguard Worker
TEST_F_TEARDOWN(uirq)50*344aa361SAndroid Build Coastguard Worker TEST_F_TEARDOWN(uirq) {
51*344aa361SAndroid Build Coastguard Worker if (_state->hevts_ref.handle) {
52*344aa361SAndroid Build Coastguard Worker handle_set_detach_ref(&_state->hevts_ref);
53*344aa361SAndroid Build Coastguard Worker }
54*344aa361SAndroid Build Coastguard Worker
55*344aa361SAndroid Build Coastguard Worker if (_state->hevt1_ref.handle) {
56*344aa361SAndroid Build Coastguard Worker handle_set_detach_ref(&_state->hevt1_ref);
57*344aa361SAndroid Build Coastguard Worker }
58*344aa361SAndroid Build Coastguard Worker
59*344aa361SAndroid Build Coastguard Worker if (_state->hevt2_ref.handle) {
60*344aa361SAndroid Build Coastguard Worker handle_set_detach_ref(&_state->hevt2_ref);
61*344aa361SAndroid Build Coastguard Worker }
62*344aa361SAndroid Build Coastguard Worker
63*344aa361SAndroid Build Coastguard Worker if (_state->hevts) {
64*344aa361SAndroid Build Coastguard Worker handle_close(_state->hevts);
65*344aa361SAndroid Build Coastguard Worker }
66*344aa361SAndroid Build Coastguard Worker
67*344aa361SAndroid Build Coastguard Worker if (_state->hevt1) {
68*344aa361SAndroid Build Coastguard Worker handle_close(_state->hevt1);
69*344aa361SAndroid Build Coastguard Worker }
70*344aa361SAndroid Build Coastguard Worker
71*344aa361SAndroid Build Coastguard Worker if (_state->hevt2) {
72*344aa361SAndroid Build Coastguard Worker handle_close(_state->hevt2);
73*344aa361SAndroid Build Coastguard Worker }
74*344aa361SAndroid Build Coastguard Worker
75*344aa361SAndroid Build Coastguard Worker if (_state->hset) {
76*344aa361SAndroid Build Coastguard Worker handle_close(_state->hset);
77*344aa361SAndroid Build Coastguard Worker }
78*344aa361SAndroid Build Coastguard Worker }
79*344aa361SAndroid Build Coastguard Worker
TEST_F(uirq,event_source_create_invalid)80*344aa361SAndroid Build Coastguard Worker TEST_F(uirq, event_source_create_invalid) {
81*344aa361SAndroid Build Coastguard Worker int rc;
82*344aa361SAndroid Build Coastguard Worker
83*344aa361SAndroid Build Coastguard Worker rc = event_source_create(NULL, NULL, NULL, NULL, 0, 0, &_state->hevts);
84*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(ERR_INVALID_ARGS, rc);
85*344aa361SAndroid Build Coastguard Worker
86*344aa361SAndroid Build Coastguard Worker rc = event_source_create("", NULL, NULL, NULL, 0, 0, &_state->hevts);
87*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(ERR_INVALID_ARGS, rc);
88*344aa361SAndroid Build Coastguard Worker test_abort:;
89*344aa361SAndroid Build Coastguard Worker }
90*344aa361SAndroid Build Coastguard Worker
TEST_F(uirq,event_source_create_close)91*344aa361SAndroid Build Coastguard Worker TEST_F(uirq, event_source_create_close) {
92*344aa361SAndroid Build Coastguard Worker int rc;
93*344aa361SAndroid Build Coastguard Worker uint32_t cnt;
94*344aa361SAndroid Build Coastguard Worker
95*344aa361SAndroid Build Coastguard Worker /* create/close named event 10000 times */
96*344aa361SAndroid Build Coastguard Worker for (cnt = 0; cnt < 10000; cnt++) {
97*344aa361SAndroid Build Coastguard Worker rc = event_source_create(TEST_EVS_NAME1, NULL, NULL, NULL, 0, 0,
98*344aa361SAndroid Build Coastguard Worker &_state->hevts);
99*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
100*344aa361SAndroid Build Coastguard Worker
101*344aa361SAndroid Build Coastguard Worker /* then close it */
102*344aa361SAndroid Build Coastguard Worker handle_close(_state->hevts);
103*344aa361SAndroid Build Coastguard Worker _state->hevts = NULL;
104*344aa361SAndroid Build Coastguard Worker }
105*344aa361SAndroid Build Coastguard Worker test_abort:;
106*344aa361SAndroid Build Coastguard Worker }
107*344aa361SAndroid Build Coastguard Worker
TEST_F(uirq,event_source_create_existing)108*344aa361SAndroid Build Coastguard Worker TEST_F(uirq, event_source_create_existing) {
109*344aa361SAndroid Build Coastguard Worker int rc;
110*344aa361SAndroid Build Coastguard Worker struct handle* h = NULL;
111*344aa361SAndroid Build Coastguard Worker
112*344aa361SAndroid Build Coastguard Worker /* create named event */
113*344aa361SAndroid Build Coastguard Worker rc = event_source_create(TEST_EVS_NAME1, NULL, NULL, NULL, 0, 0,
114*344aa361SAndroid Build Coastguard Worker &_state->hevts);
115*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
116*344aa361SAndroid Build Coastguard Worker
117*344aa361SAndroid Build Coastguard Worker /* then publish it */
118*344aa361SAndroid Build Coastguard Worker rc = event_source_publish(_state->hevts);
119*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
120*344aa361SAndroid Build Coastguard Worker
121*344aa361SAndroid Build Coastguard Worker /* try to create event with the same name again */
122*344aa361SAndroid Build Coastguard Worker rc = event_source_create(TEST_EVS_NAME1, NULL, NULL, NULL, 0, 0, &h);
123*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
124*344aa361SAndroid Build Coastguard Worker
125*344aa361SAndroid Build Coastguard Worker /* then publish it */
126*344aa361SAndroid Build Coastguard Worker rc = event_source_publish(h);
127*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(ERR_ALREADY_EXISTS, rc);
128*344aa361SAndroid Build Coastguard Worker
129*344aa361SAndroid Build Coastguard Worker if (h) {
130*344aa361SAndroid Build Coastguard Worker handle_close(h);
131*344aa361SAndroid Build Coastguard Worker }
132*344aa361SAndroid Build Coastguard Worker
133*344aa361SAndroid Build Coastguard Worker test_abort:;
134*344aa361SAndroid Build Coastguard Worker }
135*344aa361SAndroid Build Coastguard Worker
TEST_F(uirq,event_source_wait_no_clients)136*344aa361SAndroid Build Coastguard Worker TEST_F(uirq, event_source_wait_no_clients) {
137*344aa361SAndroid Build Coastguard Worker int rc;
138*344aa361SAndroid Build Coastguard Worker uint32_t uevt;
139*344aa361SAndroid Build Coastguard Worker
140*344aa361SAndroid Build Coastguard Worker /* create named event */
141*344aa361SAndroid Build Coastguard Worker rc = event_source_create(TEST_EVS_NAME1, NULL, NULL, NULL, 0, 0,
142*344aa361SAndroid Build Coastguard Worker &_state->hevts);
143*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
144*344aa361SAndroid Build Coastguard Worker
145*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevts, &uevt, EXPECTED_TO_FAIL_TIMEOUT_MSEC);
146*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(ERR_TIMED_OUT, rc, "wait on created event");
147*344aa361SAndroid Build Coastguard Worker
148*344aa361SAndroid Build Coastguard Worker rc = event_source_signal(_state->hevts);
149*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "signal event");
150*344aa361SAndroid Build Coastguard Worker
151*344aa361SAndroid Build Coastguard Worker /* event without clients becomes ready */
152*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevts, &uevt, NOT_EXPECTED_TO_FAIL_TIMEOUT_MSEC);
153*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "wait on signaled event");
154*344aa361SAndroid Build Coastguard Worker
155*344aa361SAndroid Build Coastguard Worker /* do it again: it should time out */
156*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevts, &uevt, EXPECTED_TO_FAIL_TIMEOUT_MSEC);
157*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(ERR_TIMED_OUT, rc, "wait on created event");
158*344aa361SAndroid Build Coastguard Worker
159*344aa361SAndroid Build Coastguard Worker rc = event_source_signal(_state->hevts);
160*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "signal event");
161*344aa361SAndroid Build Coastguard Worker
162*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevts, &uevt, NOT_EXPECTED_TO_FAIL_TIMEOUT_MSEC);
163*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "wait on created event");
164*344aa361SAndroid Build Coastguard Worker
165*344aa361SAndroid Build Coastguard Worker test_abort:;
166*344aa361SAndroid Build Coastguard Worker }
167*344aa361SAndroid Build Coastguard Worker
TEST_F(uirq,event_client_open_invalid)168*344aa361SAndroid Build Coastguard Worker TEST_F(uirq, event_client_open_invalid) {
169*344aa361SAndroid Build Coastguard Worker int rc;
170*344aa361SAndroid Build Coastguard Worker struct uuid cid = zero_uuid;
171*344aa361SAndroid Build Coastguard Worker
172*344aa361SAndroid Build Coastguard Worker /* open named event with NULL name */
173*344aa361SAndroid Build Coastguard Worker rc = event_source_open(&cid, NULL, 0, 0, &_state->hevt1);
174*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(ERR_INVALID_ARGS, rc);
175*344aa361SAndroid Build Coastguard Worker
176*344aa361SAndroid Build Coastguard Worker /* open named event with empty name */
177*344aa361SAndroid Build Coastguard Worker rc = event_source_open(&cid, "", 1, 0, &_state->hevt1);
178*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(ERR_INVALID_ARGS, rc);
179*344aa361SAndroid Build Coastguard Worker
180*344aa361SAndroid Build Coastguard Worker /* open non-existing named event */
181*344aa361SAndroid Build Coastguard Worker rc = event_source_open(&cid, TEST_EVS_NAME1, strlen(TEST_EVS_NAME1) + 1, 0,
182*344aa361SAndroid Build Coastguard Worker &_state->hevt1);
183*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(ERR_NOT_FOUND, rc);
184*344aa361SAndroid Build Coastguard Worker
185*344aa361SAndroid Build Coastguard Worker test_abort:;
186*344aa361SAndroid Build Coastguard Worker }
187*344aa361SAndroid Build Coastguard Worker
TEST_F(uirq,event_client_open_close)188*344aa361SAndroid Build Coastguard Worker TEST_F(uirq, event_client_open_close) {
189*344aa361SAndroid Build Coastguard Worker int rc;
190*344aa361SAndroid Build Coastguard Worker struct uuid cid = zero_uuid;
191*344aa361SAndroid Build Coastguard Worker
192*344aa361SAndroid Build Coastguard Worker /* create named event source */
193*344aa361SAndroid Build Coastguard Worker rc = event_source_create(TEST_EVS_NAME1, NULL, NULL, NULL, 0, 0,
194*344aa361SAndroid Build Coastguard Worker &_state->hevts);
195*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
196*344aa361SAndroid Build Coastguard Worker
197*344aa361SAndroid Build Coastguard Worker rc = event_source_publish(_state->hevts);
198*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
199*344aa361SAndroid Build Coastguard Worker
200*344aa361SAndroid Build Coastguard Worker /* open/close the same named event 10000 times */
201*344aa361SAndroid Build Coastguard Worker for (int i = 0; i < 10000; i++) {
202*344aa361SAndroid Build Coastguard Worker rc = event_source_open(&cid, TEST_EVS_NAME1, strlen(TEST_EVS_NAME1) + 1,
203*344aa361SAndroid Build Coastguard Worker 0, &_state->hevt1);
204*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
205*344aa361SAndroid Build Coastguard Worker
206*344aa361SAndroid Build Coastguard Worker handle_close(_state->hevt1);
207*344aa361SAndroid Build Coastguard Worker _state->hevt1 = NULL;
208*344aa361SAndroid Build Coastguard Worker }
209*344aa361SAndroid Build Coastguard Worker
210*344aa361SAndroid Build Coastguard Worker test_abort:;
211*344aa361SAndroid Build Coastguard Worker }
212*344aa361SAndroid Build Coastguard Worker
TEST_F(uirq,event_client_wait_single)213*344aa361SAndroid Build Coastguard Worker TEST_F(uirq, event_client_wait_single) {
214*344aa361SAndroid Build Coastguard Worker int rc;
215*344aa361SAndroid Build Coastguard Worker uint32_t uevt;
216*344aa361SAndroid Build Coastguard Worker struct handle_ref ref;
217*344aa361SAndroid Build Coastguard Worker struct uuid cid = zero_uuid;
218*344aa361SAndroid Build Coastguard Worker
219*344aa361SAndroid Build Coastguard Worker /* create handle set */
220*344aa361SAndroid Build Coastguard Worker _state->hset = handle_set_create();
221*344aa361SAndroid Build Coastguard Worker
222*344aa361SAndroid Build Coastguard Worker /* create named event source */
223*344aa361SAndroid Build Coastguard Worker rc = event_source_create(TEST_EVS_NAME1, NULL, NULL, NULL, 0, 0,
224*344aa361SAndroid Build Coastguard Worker &_state->hevts);
225*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
226*344aa361SAndroid Build Coastguard Worker
227*344aa361SAndroid Build Coastguard Worker rc = event_source_publish(_state->hevts);
228*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
229*344aa361SAndroid Build Coastguard Worker
230*344aa361SAndroid Build Coastguard Worker /* open the same named event */
231*344aa361SAndroid Build Coastguard Worker rc = event_source_open(&cid, TEST_EVS_NAME1, strlen(TEST_EVS_NAME1) + 1, 0,
232*344aa361SAndroid Build Coastguard Worker &_state->hevt1);
233*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
234*344aa361SAndroid Build Coastguard Worker
235*344aa361SAndroid Build Coastguard Worker /* wait on unsignaled event: should timeout */
236*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevt1, &uevt, EXPECTED_TO_FAIL_TIMEOUT_MSEC);
237*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(ERR_TIMED_OUT, rc, "wait on client");
238*344aa361SAndroid Build Coastguard Worker
239*344aa361SAndroid Build Coastguard Worker /* signal event */
240*344aa361SAndroid Build Coastguard Worker rc = event_source_signal(_state->hevts);
241*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "notify event signaled");
242*344aa361SAndroid Build Coastguard Worker
243*344aa361SAndroid Build Coastguard Worker /* wait on signaled event: should return as it is signaled */
244*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevt1, &uevt, NOT_EXPECTED_TO_FAIL_TIMEOUT_MSEC);
245*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "wait on client");
246*344aa361SAndroid Build Coastguard Worker
247*344aa361SAndroid Build Coastguard Worker /* wait on event source: should timeout as we have not notified */
248*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevts, &uevt, EXPECTED_TO_FAIL_TIMEOUT_MSEC);
249*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(ERR_TIMED_OUT, rc, "wait on source");
250*344aa361SAndroid Build Coastguard Worker
251*344aa361SAndroid Build Coastguard Worker /* notify that event is handled to put source into handled state */
252*344aa361SAndroid Build Coastguard Worker rc = event_client_notify_handled(_state->hevt1);
253*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "notify event handled");
254*344aa361SAndroid Build Coastguard Worker
255*344aa361SAndroid Build Coastguard Worker /* wait on event source again: should return as event is handled */
256*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevts, &uevt, NOT_EXPECTED_TO_FAIL_TIMEOUT_MSEC);
257*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "wait on source");
258*344aa361SAndroid Build Coastguard Worker
259*344aa361SAndroid Build Coastguard Worker /* Check handle sets: add both events to handle set */
260*344aa361SAndroid Build Coastguard Worker memset(&_state->hevts_ref, 0, sizeof(_state->hevts_ref));
261*344aa361SAndroid Build Coastguard Worker _state->hevts_ref.handle = _state->hevts;
262*344aa361SAndroid Build Coastguard Worker _state->hevts_ref.emask = ~0U;
263*344aa361SAndroid Build Coastguard Worker _state->hevts_ref.cookie = NULL;
264*344aa361SAndroid Build Coastguard Worker rc = handle_set_attach(_state->hset, &_state->hevts_ref);
265*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
266*344aa361SAndroid Build Coastguard Worker
267*344aa361SAndroid Build Coastguard Worker memset(&_state->hevt1_ref, 0, sizeof(_state->hevt1_ref));
268*344aa361SAndroid Build Coastguard Worker _state->hevt1_ref.handle = _state->hevt1;
269*344aa361SAndroid Build Coastguard Worker _state->hevt1_ref.emask = ~0U;
270*344aa361SAndroid Build Coastguard Worker _state->hevt1_ref.cookie = NULL;
271*344aa361SAndroid Build Coastguard Worker rc = handle_set_attach(_state->hset, &_state->hevt1_ref);
272*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
273*344aa361SAndroid Build Coastguard Worker
274*344aa361SAndroid Build Coastguard Worker /* trigger and handle event MAX_EVT_CNT times */
275*344aa361SAndroid Build Coastguard Worker uint32_t cnt = MAX_EVT_CNT;
276*344aa361SAndroid Build Coastguard Worker rc = event_source_signal(_state->hevts);
277*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc, "notify event signaled");
278*344aa361SAndroid Build Coastguard Worker while (cnt) {
279*344aa361SAndroid Build Coastguard Worker rc = handle_set_wait(_state->hset, &ref,
280*344aa361SAndroid Build Coastguard Worker NOT_EXPECTED_TO_FAIL_TIMEOUT_MSEC);
281*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc, "wait any");
282*344aa361SAndroid Build Coastguard Worker
283*344aa361SAndroid Build Coastguard Worker if (ref.handle) {
284*344aa361SAndroid Build Coastguard Worker /* dec ref obtained by handle_set_wait */
285*344aa361SAndroid Build Coastguard Worker handle_decref(ref.handle);
286*344aa361SAndroid Build Coastguard Worker }
287*344aa361SAndroid Build Coastguard Worker
288*344aa361SAndroid Build Coastguard Worker if (ref.handle == _state->hevt1) {
289*344aa361SAndroid Build Coastguard Worker cnt--;
290*344aa361SAndroid Build Coastguard Worker rc = event_client_notify_handled(_state->hevt1);
291*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc, "notify event handled");
292*344aa361SAndroid Build Coastguard Worker } else if (ref.handle == _state->hevts) {
293*344aa361SAndroid Build Coastguard Worker rc = event_source_signal(_state->hevts);
294*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc, "notify event signaled");
295*344aa361SAndroid Build Coastguard Worker } else {
296*344aa361SAndroid Build Coastguard Worker break;
297*344aa361SAndroid Build Coastguard Worker }
298*344aa361SAndroid Build Coastguard Worker }
299*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, cnt, "event counter");
300*344aa361SAndroid Build Coastguard Worker
301*344aa361SAndroid Build Coastguard Worker test_abort:;
302*344aa361SAndroid Build Coastguard Worker }
303*344aa361SAndroid Build Coastguard Worker
TEST_F(uirq,event_client_wait_multiple)304*344aa361SAndroid Build Coastguard Worker TEST_F(uirq, event_client_wait_multiple) {
305*344aa361SAndroid Build Coastguard Worker int rc;
306*344aa361SAndroid Build Coastguard Worker struct handle_ref ref;
307*344aa361SAndroid Build Coastguard Worker struct uuid cid = zero_uuid;
308*344aa361SAndroid Build Coastguard Worker
309*344aa361SAndroid Build Coastguard Worker /* create handle set */
310*344aa361SAndroid Build Coastguard Worker _state->hset = handle_set_create();
311*344aa361SAndroid Build Coastguard Worker
312*344aa361SAndroid Build Coastguard Worker /* create named event source */
313*344aa361SAndroid Build Coastguard Worker rc = event_source_create(TEST_EVS_NAME1, NULL, NULL, NULL, 0, 0,
314*344aa361SAndroid Build Coastguard Worker &_state->hevts);
315*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
316*344aa361SAndroid Build Coastguard Worker
317*344aa361SAndroid Build Coastguard Worker rc = event_source_publish(_state->hevts);
318*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
319*344aa361SAndroid Build Coastguard Worker
320*344aa361SAndroid Build Coastguard Worker /* open named event */
321*344aa361SAndroid Build Coastguard Worker rc = event_source_open(&cid, TEST_EVS_NAME1, strlen(TEST_EVS_NAME1) + 1, 0,
322*344aa361SAndroid Build Coastguard Worker &_state->hevt1);
323*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
324*344aa361SAndroid Build Coastguard Worker
325*344aa361SAndroid Build Coastguard Worker /* open the same named event */
326*344aa361SAndroid Build Coastguard Worker rc = event_source_open(&cid, TEST_EVS_NAME1, strlen(TEST_EVS_NAME1) + 1, 0,
327*344aa361SAndroid Build Coastguard Worker &_state->hevt2);
328*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
329*344aa361SAndroid Build Coastguard Worker
330*344aa361SAndroid Build Coastguard Worker /* Add all handles to handle set */
331*344aa361SAndroid Build Coastguard Worker memset(&_state->hevts_ref, 0, sizeof(_state->hevts_ref));
332*344aa361SAndroid Build Coastguard Worker _state->hevts_ref.handle = _state->hevts;
333*344aa361SAndroid Build Coastguard Worker _state->hevts_ref.emask = ~0U;
334*344aa361SAndroid Build Coastguard Worker _state->hevts_ref.cookie = NULL;
335*344aa361SAndroid Build Coastguard Worker rc = handle_set_attach(_state->hset, &_state->hevts_ref);
336*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
337*344aa361SAndroid Build Coastguard Worker
338*344aa361SAndroid Build Coastguard Worker memset(&_state->hevt1_ref, 0, sizeof(_state->hevt1_ref));
339*344aa361SAndroid Build Coastguard Worker _state->hevt1_ref.handle = _state->hevt1;
340*344aa361SAndroid Build Coastguard Worker _state->hevt1_ref.emask = ~0U;
341*344aa361SAndroid Build Coastguard Worker _state->hevt1_ref.cookie = NULL;
342*344aa361SAndroid Build Coastguard Worker rc = handle_set_attach(_state->hset, &_state->hevt1_ref);
343*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
344*344aa361SAndroid Build Coastguard Worker
345*344aa361SAndroid Build Coastguard Worker memset(&_state->hevt2_ref, 0, sizeof(_state->hevt2_ref));
346*344aa361SAndroid Build Coastguard Worker _state->hevt2_ref.handle = _state->hevt2;
347*344aa361SAndroid Build Coastguard Worker _state->hevt2_ref.emask = ~0U;
348*344aa361SAndroid Build Coastguard Worker _state->hevt2_ref.cookie = NULL;
349*344aa361SAndroid Build Coastguard Worker rc = handle_set_attach(_state->hset, &_state->hevt2_ref);
350*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
351*344aa361SAndroid Build Coastguard Worker
352*344aa361SAndroid Build Coastguard Worker /* trigger and handle event MAX_EVT_CNT times */
353*344aa361SAndroid Build Coastguard Worker uint32_t evts_cnt = 0;
354*344aa361SAndroid Build Coastguard Worker uint32_t evt1_cnt = 0;
355*344aa361SAndroid Build Coastguard Worker uint32_t evt2_cnt = 0;
356*344aa361SAndroid Build Coastguard Worker
357*344aa361SAndroid Build Coastguard Worker rc = event_source_signal(_state->hevts);
358*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc, "notify event signaled");
359*344aa361SAndroid Build Coastguard Worker evts_cnt++;
360*344aa361SAndroid Build Coastguard Worker for (;;) {
361*344aa361SAndroid Build Coastguard Worker rc = handle_set_wait(_state->hset, &ref,
362*344aa361SAndroid Build Coastguard Worker NOT_EXPECTED_TO_FAIL_TIMEOUT_MSEC);
363*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc, "wait any");
364*344aa361SAndroid Build Coastguard Worker
365*344aa361SAndroid Build Coastguard Worker if (ref.handle) {
366*344aa361SAndroid Build Coastguard Worker /* dec ref obtained by handle_set_wait */
367*344aa361SAndroid Build Coastguard Worker handle_decref(ref.handle);
368*344aa361SAndroid Build Coastguard Worker }
369*344aa361SAndroid Build Coastguard Worker
370*344aa361SAndroid Build Coastguard Worker if (ref.handle == _state->hevts) {
371*344aa361SAndroid Build Coastguard Worker if (evts_cnt == MAX_EVT_CNT)
372*344aa361SAndroid Build Coastguard Worker break;
373*344aa361SAndroid Build Coastguard Worker rc = event_source_signal(_state->hevts);
374*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc, "notify event signaled");
375*344aa361SAndroid Build Coastguard Worker evts_cnt++;
376*344aa361SAndroid Build Coastguard Worker } else if (ref.handle == _state->hevt1) {
377*344aa361SAndroid Build Coastguard Worker evt1_cnt++;
378*344aa361SAndroid Build Coastguard Worker rc = event_client_notify_handled(_state->hevt1);
379*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc, "notify event handled");
380*344aa361SAndroid Build Coastguard Worker } else if (ref.handle == _state->hevt2) {
381*344aa361SAndroid Build Coastguard Worker evt2_cnt++;
382*344aa361SAndroid Build Coastguard Worker rc = event_client_notify_handled(_state->hevt2);
383*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc, "notify event handled");
384*344aa361SAndroid Build Coastguard Worker } else {
385*344aa361SAndroid Build Coastguard Worker break;
386*344aa361SAndroid Build Coastguard Worker }
387*344aa361SAndroid Build Coastguard Worker }
388*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(MAX_EVT_CNT, evts_cnt, "evts count");
389*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(MAX_EVT_CNT, evt1_cnt, "evt1 count");
390*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(MAX_EVT_CNT, evt2_cnt, "evt2 count");
391*344aa361SAndroid Build Coastguard Worker
392*344aa361SAndroid Build Coastguard Worker test_abort:;
393*344aa361SAndroid Build Coastguard Worker }
394*344aa361SAndroid Build Coastguard Worker
TEST_F(uirq,event_client_open_signaled)395*344aa361SAndroid Build Coastguard Worker TEST_F(uirq, event_client_open_signaled) {
396*344aa361SAndroid Build Coastguard Worker int rc;
397*344aa361SAndroid Build Coastguard Worker uint32_t uevt;
398*344aa361SAndroid Build Coastguard Worker struct uuid cid = zero_uuid;
399*344aa361SAndroid Build Coastguard Worker
400*344aa361SAndroid Build Coastguard Worker /* create named event source */
401*344aa361SAndroid Build Coastguard Worker rc = event_source_create(TEST_EVS_NAME1, NULL, NULL, NULL, 0, 0,
402*344aa361SAndroid Build Coastguard Worker &_state->hevts);
403*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
404*344aa361SAndroid Build Coastguard Worker
405*344aa361SAndroid Build Coastguard Worker rc = event_source_publish(_state->hevts);
406*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
407*344aa361SAndroid Build Coastguard Worker
408*344aa361SAndroid Build Coastguard Worker /* open the named event */
409*344aa361SAndroid Build Coastguard Worker rc = event_source_open(&cid, TEST_EVS_NAME1, strlen(TEST_EVS_NAME1) + 1, 0,
410*344aa361SAndroid Build Coastguard Worker &_state->hevt1);
411*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
412*344aa361SAndroid Build Coastguard Worker
413*344aa361SAndroid Build Coastguard Worker /* signal event */
414*344aa361SAndroid Build Coastguard Worker rc = event_source_signal(_state->hevts);
415*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "notify event signaled");
416*344aa361SAndroid Build Coastguard Worker
417*344aa361SAndroid Build Coastguard Worker /* open named event again */
418*344aa361SAndroid Build Coastguard Worker rc = event_source_open(&cid, TEST_EVS_NAME1, strlen(TEST_EVS_NAME1) + 1, 0,
419*344aa361SAndroid Build Coastguard Worker &_state->hevt2);
420*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
421*344aa361SAndroid Build Coastguard Worker
422*344aa361SAndroid Build Coastguard Worker /* wait on client 1: should be signaled */
423*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevt1, &uevt, NOT_EXPECTED_TO_FAIL_TIMEOUT_MSEC);
424*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "wait on client1");
425*344aa361SAndroid Build Coastguard Worker
426*344aa361SAndroid Build Coastguard Worker /* wait on client 2: should timeout as it should not be signaled */
427*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevt2, &uevt, EXPECTED_TO_FAIL_TIMEOUT_MSEC);
428*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(ERR_TIMED_OUT, rc, "wait on source");
429*344aa361SAndroid Build Coastguard Worker
430*344aa361SAndroid Build Coastguard Worker /* wait on event source: should timeout: event is not handled */
431*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevts, &uevt, EXPECTED_TO_FAIL_TIMEOUT_MSEC);
432*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(ERR_TIMED_OUT, rc, "wait on source");
433*344aa361SAndroid Build Coastguard Worker
434*344aa361SAndroid Build Coastguard Worker /* notify that event1 is handled: to put it in unsignaled state */
435*344aa361SAndroid Build Coastguard Worker rc = event_client_notify_handled(_state->hevt1);
436*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "notify event handled");
437*344aa361SAndroid Build Coastguard Worker
438*344aa361SAndroid Build Coastguard Worker /* wait on event source again: should return as event is handled */
439*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevts, &uevt, NOT_EXPECTED_TO_FAIL_TIMEOUT_MSEC);
440*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "wait on source");
441*344aa361SAndroid Build Coastguard Worker
442*344aa361SAndroid Build Coastguard Worker /* signal event again: now both events must ack */
443*344aa361SAndroid Build Coastguard Worker rc = event_source_signal(_state->hevts);
444*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "notify event signaled");
445*344aa361SAndroid Build Coastguard Worker
446*344aa361SAndroid Build Coastguard Worker /* wait on client 1: should be signaled */
447*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevt1, &uevt, NOT_EXPECTED_TO_FAIL_TIMEOUT_MSEC);
448*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "wait on client1");
449*344aa361SAndroid Build Coastguard Worker
450*344aa361SAndroid Build Coastguard Worker /* wait on client 2: should be signaled */
451*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevt2, &uevt, NOT_EXPECTED_TO_FAIL_TIMEOUT_MSEC);
452*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "wait on client2");
453*344aa361SAndroid Build Coastguard Worker
454*344aa361SAndroid Build Coastguard Worker /* notify that event1 is handled */
455*344aa361SAndroid Build Coastguard Worker rc = event_client_notify_handled(_state->hevt1);
456*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "notify event handled");
457*344aa361SAndroid Build Coastguard Worker
458*344aa361SAndroid Build Coastguard Worker /* notify that event2 is handled */
459*344aa361SAndroid Build Coastguard Worker rc = event_client_notify_handled(_state->hevt2);
460*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "notify event handled");
461*344aa361SAndroid Build Coastguard Worker
462*344aa361SAndroid Build Coastguard Worker /* wait on event source again: should be handled */
463*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevts, &uevt, NOT_EXPECTED_TO_FAIL_TIMEOUT_MSEC);
464*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "wait on source");
465*344aa361SAndroid Build Coastguard Worker
466*344aa361SAndroid Build Coastguard Worker test_abort:;
467*344aa361SAndroid Build Coastguard Worker }
468*344aa361SAndroid Build Coastguard Worker
TEST_F(uirq,event_source_resignal_signaled)469*344aa361SAndroid Build Coastguard Worker TEST_F(uirq, event_source_resignal_signaled) {
470*344aa361SAndroid Build Coastguard Worker int rc;
471*344aa361SAndroid Build Coastguard Worker uint32_t uevt;
472*344aa361SAndroid Build Coastguard Worker struct uuid cid = zero_uuid;
473*344aa361SAndroid Build Coastguard Worker
474*344aa361SAndroid Build Coastguard Worker /* create named event source */
475*344aa361SAndroid Build Coastguard Worker rc = event_source_create(TEST_EVS_NAME1, NULL, NULL, NULL, 0, 0,
476*344aa361SAndroid Build Coastguard Worker &_state->hevts);
477*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
478*344aa361SAndroid Build Coastguard Worker
479*344aa361SAndroid Build Coastguard Worker rc = event_source_publish(_state->hevts);
480*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
481*344aa361SAndroid Build Coastguard Worker
482*344aa361SAndroid Build Coastguard Worker /* open the named event */
483*344aa361SAndroid Build Coastguard Worker rc = event_source_open(&cid, TEST_EVS_NAME1, strlen(TEST_EVS_NAME1) + 1, 0,
484*344aa361SAndroid Build Coastguard Worker &_state->hevt1);
485*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
486*344aa361SAndroid Build Coastguard Worker
487*344aa361SAndroid Build Coastguard Worker /* open named event again */
488*344aa361SAndroid Build Coastguard Worker rc = event_source_open(&cid, TEST_EVS_NAME1, strlen(TEST_EVS_NAME1) + 1, 0,
489*344aa361SAndroid Build Coastguard Worker &_state->hevt2);
490*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
491*344aa361SAndroid Build Coastguard Worker
492*344aa361SAndroid Build Coastguard Worker /* signal event */
493*344aa361SAndroid Build Coastguard Worker rc = event_source_signal(_state->hevts);
494*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "notify event signaled");
495*344aa361SAndroid Build Coastguard Worker
496*344aa361SAndroid Build Coastguard Worker /* signal event again */
497*344aa361SAndroid Build Coastguard Worker rc = event_source_signal(_state->hevts);
498*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "notify event signaled");
499*344aa361SAndroid Build Coastguard Worker
500*344aa361SAndroid Build Coastguard Worker /* wait on client 1: should be signaled */
501*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevt1, &uevt, NOT_EXPECTED_TO_FAIL_TIMEOUT_MSEC);
502*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "wait on client1");
503*344aa361SAndroid Build Coastguard Worker
504*344aa361SAndroid Build Coastguard Worker /* wait on client 2: should be signaled */
505*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevt2, &uevt, NOT_EXPECTED_TO_FAIL_TIMEOUT_MSEC);
506*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "wait on client2");
507*344aa361SAndroid Build Coastguard Worker
508*344aa361SAndroid Build Coastguard Worker /* notify that event1 is handled */
509*344aa361SAndroid Build Coastguard Worker rc = event_client_notify_handled(_state->hevt1);
510*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "notify event handled");
511*344aa361SAndroid Build Coastguard Worker
512*344aa361SAndroid Build Coastguard Worker /* notify that event2 is handled */
513*344aa361SAndroid Build Coastguard Worker rc = event_client_notify_handled(_state->hevt2);
514*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "notify event handled");
515*344aa361SAndroid Build Coastguard Worker
516*344aa361SAndroid Build Coastguard Worker /* wait on event source: should be handled */
517*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevts, &uevt, NOT_EXPECTED_TO_FAIL_TIMEOUT_MSEC);
518*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "wait on source");
519*344aa361SAndroid Build Coastguard Worker
520*344aa361SAndroid Build Coastguard Worker test_abort:;
521*344aa361SAndroid Build Coastguard Worker }
522*344aa361SAndroid Build Coastguard Worker
TEST_F(uirq,event_source_resignal_notified)523*344aa361SAndroid Build Coastguard Worker TEST_F(uirq, event_source_resignal_notified) {
524*344aa361SAndroid Build Coastguard Worker int rc;
525*344aa361SAndroid Build Coastguard Worker uint32_t uevt;
526*344aa361SAndroid Build Coastguard Worker struct uuid cid = zero_uuid;
527*344aa361SAndroid Build Coastguard Worker
528*344aa361SAndroid Build Coastguard Worker /* create named event source */
529*344aa361SAndroid Build Coastguard Worker rc = event_source_create(TEST_EVS_NAME1, NULL, NULL, NULL, 0, 0,
530*344aa361SAndroid Build Coastguard Worker &_state->hevts);
531*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
532*344aa361SAndroid Build Coastguard Worker
533*344aa361SAndroid Build Coastguard Worker rc = event_source_publish(_state->hevts);
534*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
535*344aa361SAndroid Build Coastguard Worker
536*344aa361SAndroid Build Coastguard Worker /* open the named event */
537*344aa361SAndroid Build Coastguard Worker rc = event_source_open(&cid, TEST_EVS_NAME1, strlen(TEST_EVS_NAME1) + 1, 0,
538*344aa361SAndroid Build Coastguard Worker &_state->hevt1);
539*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
540*344aa361SAndroid Build Coastguard Worker
541*344aa361SAndroid Build Coastguard Worker /* open named event again */
542*344aa361SAndroid Build Coastguard Worker rc = event_source_open(&cid, TEST_EVS_NAME1, strlen(TEST_EVS_NAME1) + 1, 0,
543*344aa361SAndroid Build Coastguard Worker &_state->hevt2);
544*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
545*344aa361SAndroid Build Coastguard Worker
546*344aa361SAndroid Build Coastguard Worker /* signal event */
547*344aa361SAndroid Build Coastguard Worker rc = event_source_signal(_state->hevts);
548*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "notify event signaled");
549*344aa361SAndroid Build Coastguard Worker
550*344aa361SAndroid Build Coastguard Worker /* wait on client 1: to put it into notifieed state */
551*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevt1, &uevt, NOT_EXPECTED_TO_FAIL_TIMEOUT_MSEC);
552*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "wait on client1");
553*344aa361SAndroid Build Coastguard Worker
554*344aa361SAndroid Build Coastguard Worker /* signal event again */
555*344aa361SAndroid Build Coastguard Worker rc = event_source_signal(_state->hevts);
556*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "notify event signaled");
557*344aa361SAndroid Build Coastguard Worker
558*344aa361SAndroid Build Coastguard Worker /* notify that event1 is handled: it should enter signaled state */
559*344aa361SAndroid Build Coastguard Worker rc = event_client_notify_handled(_state->hevt1);
560*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "notify event handled");
561*344aa361SAndroid Build Coastguard Worker
562*344aa361SAndroid Build Coastguard Worker /* wait on client 2: should be signaled */
563*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevt2, &uevt, NOT_EXPECTED_TO_FAIL_TIMEOUT_MSEC);
564*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "wait on client2");
565*344aa361SAndroid Build Coastguard Worker
566*344aa361SAndroid Build Coastguard Worker /* notify that event2 is handled to put it into unsignaled state */
567*344aa361SAndroid Build Coastguard Worker rc = event_client_notify_handled(_state->hevt2);
568*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "notify event handled");
569*344aa361SAndroid Build Coastguard Worker
570*344aa361SAndroid Build Coastguard Worker /* wait on event source: should timeout as event1 stil signaled */
571*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevts, &uevt, EXPECTED_TO_FAIL_TIMEOUT_MSEC);
572*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(ERR_TIMED_OUT, rc, "wait on source");
573*344aa361SAndroid Build Coastguard Worker
574*344aa361SAndroid Build Coastguard Worker /* wait on client 1: should be signaled */
575*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevt1, &uevt, NOT_EXPECTED_TO_FAIL_TIMEOUT_MSEC);
576*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "wait on client1");
577*344aa361SAndroid Build Coastguard Worker
578*344aa361SAndroid Build Coastguard Worker /* notify that event1 is handled to put it into unsignaled state */
579*344aa361SAndroid Build Coastguard Worker rc = event_client_notify_handled(_state->hevt1);
580*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "notify event handled");
581*344aa361SAndroid Build Coastguard Worker
582*344aa361SAndroid Build Coastguard Worker /* wait on event source: should be handled */
583*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevts, &uevt, NOT_EXPECTED_TO_FAIL_TIMEOUT_MSEC);
584*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "wait on source");
585*344aa361SAndroid Build Coastguard Worker
586*344aa361SAndroid Build Coastguard Worker test_abort:;
587*344aa361SAndroid Build Coastguard Worker }
588*344aa361SAndroid Build Coastguard Worker
TEST_F(uirq,event_source_resignal_handled)589*344aa361SAndroid Build Coastguard Worker TEST_F(uirq, event_source_resignal_handled) {
590*344aa361SAndroid Build Coastguard Worker int rc;
591*344aa361SAndroid Build Coastguard Worker uint32_t uevt;
592*344aa361SAndroid Build Coastguard Worker struct uuid cid = zero_uuid;
593*344aa361SAndroid Build Coastguard Worker
594*344aa361SAndroid Build Coastguard Worker /* create named event source */
595*344aa361SAndroid Build Coastguard Worker rc = event_source_create(TEST_EVS_NAME1, NULL, NULL, NULL, 0, 0,
596*344aa361SAndroid Build Coastguard Worker &_state->hevts);
597*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
598*344aa361SAndroid Build Coastguard Worker
599*344aa361SAndroid Build Coastguard Worker rc = event_source_publish(_state->hevts);
600*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
601*344aa361SAndroid Build Coastguard Worker
602*344aa361SAndroid Build Coastguard Worker /* open the named event */
603*344aa361SAndroid Build Coastguard Worker rc = event_source_open(&cid, TEST_EVS_NAME1, strlen(TEST_EVS_NAME1) + 1, 0,
604*344aa361SAndroid Build Coastguard Worker &_state->hevt1);
605*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
606*344aa361SAndroid Build Coastguard Worker
607*344aa361SAndroid Build Coastguard Worker /* open named event again */
608*344aa361SAndroid Build Coastguard Worker rc = event_source_open(&cid, TEST_EVS_NAME1, strlen(TEST_EVS_NAME1) + 1, 0,
609*344aa361SAndroid Build Coastguard Worker &_state->hevt2);
610*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
611*344aa361SAndroid Build Coastguard Worker
612*344aa361SAndroid Build Coastguard Worker /* signal event */
613*344aa361SAndroid Build Coastguard Worker rc = event_source_signal(_state->hevts);
614*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "notify event signaled");
615*344aa361SAndroid Build Coastguard Worker
616*344aa361SAndroid Build Coastguard Worker /* wait on client 1: to put it into notified state */
617*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevt1, &uevt, NOT_EXPECTED_TO_FAIL_TIMEOUT_MSEC);
618*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "wait on client1");
619*344aa361SAndroid Build Coastguard Worker
620*344aa361SAndroid Build Coastguard Worker /* notify that event1 is handled to put it into unsignaled state */
621*344aa361SAndroid Build Coastguard Worker rc = event_client_notify_handled(_state->hevt1);
622*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "notify event handled");
623*344aa361SAndroid Build Coastguard Worker
624*344aa361SAndroid Build Coastguard Worker /* signal event again to put event 1 into signaled state */
625*344aa361SAndroid Build Coastguard Worker rc = event_source_signal(_state->hevts);
626*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "notify event signaled");
627*344aa361SAndroid Build Coastguard Worker
628*344aa361SAndroid Build Coastguard Worker /* wait on client 2: should be in signaled state */
629*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevt2, &uevt, NOT_EXPECTED_TO_FAIL_TIMEOUT_MSEC);
630*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "wait on client2");
631*344aa361SAndroid Build Coastguard Worker
632*344aa361SAndroid Build Coastguard Worker /* notify that event2 is handled to put it into unsignaled state */
633*344aa361SAndroid Build Coastguard Worker rc = event_client_notify_handled(_state->hevt2);
634*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "notify event handled");
635*344aa361SAndroid Build Coastguard Worker
636*344aa361SAndroid Build Coastguard Worker /* wait on event source: should timeout as event1 still signaled */
637*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevts, &uevt, EXPECTED_TO_FAIL_TIMEOUT_MSEC);
638*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(ERR_TIMED_OUT, rc, "wait on source");
639*344aa361SAndroid Build Coastguard Worker
640*344aa361SAndroid Build Coastguard Worker /* wait on client 1: to put it into notified state */
641*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevt1, &uevt, NOT_EXPECTED_TO_FAIL_TIMEOUT_MSEC);
642*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "wait on client1");
643*344aa361SAndroid Build Coastguard Worker
644*344aa361SAndroid Build Coastguard Worker /* notify that event1 is handled to put it into unsignaled state */
645*344aa361SAndroid Build Coastguard Worker rc = event_client_notify_handled(_state->hevt1);
646*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "notify event handled");
647*344aa361SAndroid Build Coastguard Worker
648*344aa361SAndroid Build Coastguard Worker /* wait on event source: should be in handled */
649*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevts, &uevt, NOT_EXPECTED_TO_FAIL_TIMEOUT_MSEC);
650*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "wait on source");
651*344aa361SAndroid Build Coastguard Worker
652*344aa361SAndroid Build Coastguard Worker test_abort:;
653*344aa361SAndroid Build Coastguard Worker }
654*344aa361SAndroid Build Coastguard Worker
TEST_F(uirq,event_source_close)655*344aa361SAndroid Build Coastguard Worker TEST_F(uirq, event_source_close) {
656*344aa361SAndroid Build Coastguard Worker int rc;
657*344aa361SAndroid Build Coastguard Worker uint32_t uevt;
658*344aa361SAndroid Build Coastguard Worker struct uuid cid = zero_uuid;
659*344aa361SAndroid Build Coastguard Worker
660*344aa361SAndroid Build Coastguard Worker /* create named event source */
661*344aa361SAndroid Build Coastguard Worker rc = event_source_create(TEST_EVS_NAME1, NULL, NULL, NULL, 0, 0,
662*344aa361SAndroid Build Coastguard Worker &_state->hevts);
663*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
664*344aa361SAndroid Build Coastguard Worker
665*344aa361SAndroid Build Coastguard Worker rc = event_source_publish(_state->hevts);
666*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
667*344aa361SAndroid Build Coastguard Worker
668*344aa361SAndroid Build Coastguard Worker /* open the named event */
669*344aa361SAndroid Build Coastguard Worker rc = event_source_open(&cid, TEST_EVS_NAME1, strlen(TEST_EVS_NAME1) + 1, 0,
670*344aa361SAndroid Build Coastguard Worker &_state->hevt1);
671*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
672*344aa361SAndroid Build Coastguard Worker
673*344aa361SAndroid Build Coastguard Worker /* close sevent source */
674*344aa361SAndroid Build Coastguard Worker handle_close(_state->hevts);
675*344aa361SAndroid Build Coastguard Worker _state->hevts = NULL;
676*344aa361SAndroid Build Coastguard Worker
677*344aa361SAndroid Build Coastguard Worker /* wait on closed client: should return HUP event */
678*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevt1, &uevt, NOT_EXPECTED_TO_FAIL_TIMEOUT_MSEC);
679*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "wait on source");
680*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(1, !!(uevt & IPC_HANDLE_POLL_HUP));
681*344aa361SAndroid Build Coastguard Worker
682*344aa361SAndroid Build Coastguard Worker /* Invoke notify on client with closed source */
683*344aa361SAndroid Build Coastguard Worker rc = event_client_notify_handled(_state->hevt1);
684*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(ERR_CHANNEL_CLOSED, rc, "notify event handled");
685*344aa361SAndroid Build Coastguard Worker
686*344aa361SAndroid Build Coastguard Worker test_abort:;
687*344aa361SAndroid Build Coastguard Worker }
688*344aa361SAndroid Build Coastguard Worker
TEST_F(uirq,event_client_close_signaled)689*344aa361SAndroid Build Coastguard Worker TEST_F(uirq, event_client_close_signaled) {
690*344aa361SAndroid Build Coastguard Worker int rc;
691*344aa361SAndroid Build Coastguard Worker uint32_t uevt;
692*344aa361SAndroid Build Coastguard Worker struct uuid cid = zero_uuid;
693*344aa361SAndroid Build Coastguard Worker
694*344aa361SAndroid Build Coastguard Worker /* create named event source */
695*344aa361SAndroid Build Coastguard Worker rc = event_source_create(TEST_EVS_NAME1, NULL, NULL, NULL, 0, 0,
696*344aa361SAndroid Build Coastguard Worker &_state->hevts);
697*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
698*344aa361SAndroid Build Coastguard Worker
699*344aa361SAndroid Build Coastguard Worker rc = event_source_publish(_state->hevts);
700*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
701*344aa361SAndroid Build Coastguard Worker
702*344aa361SAndroid Build Coastguard Worker /* open the named event */
703*344aa361SAndroid Build Coastguard Worker rc = event_source_open(&cid, TEST_EVS_NAME1, strlen(TEST_EVS_NAME1) + 1, 0,
704*344aa361SAndroid Build Coastguard Worker &_state->hevt1);
705*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
706*344aa361SAndroid Build Coastguard Worker
707*344aa361SAndroid Build Coastguard Worker /* signal event */
708*344aa361SAndroid Build Coastguard Worker rc = event_source_signal(_state->hevts);
709*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "notify event signaled");
710*344aa361SAndroid Build Coastguard Worker
711*344aa361SAndroid Build Coastguard Worker /* close signaled event */
712*344aa361SAndroid Build Coastguard Worker handle_close(_state->hevt1);
713*344aa361SAndroid Build Coastguard Worker _state->hevt1 = NULL;
714*344aa361SAndroid Build Coastguard Worker
715*344aa361SAndroid Build Coastguard Worker /* wait on event source: should not block */
716*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevts, &uevt, NOT_EXPECTED_TO_FAIL_TIMEOUT_MSEC);
717*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "wait on source");
718*344aa361SAndroid Build Coastguard Worker
719*344aa361SAndroid Build Coastguard Worker test_abort:;
720*344aa361SAndroid Build Coastguard Worker }
721*344aa361SAndroid Build Coastguard Worker
TEST_F(uirq,event_client_close_notified)722*344aa361SAndroid Build Coastguard Worker TEST_F(uirq, event_client_close_notified) {
723*344aa361SAndroid Build Coastguard Worker int rc;
724*344aa361SAndroid Build Coastguard Worker uint32_t uevt;
725*344aa361SAndroid Build Coastguard Worker struct uuid cid = zero_uuid;
726*344aa361SAndroid Build Coastguard Worker
727*344aa361SAndroid Build Coastguard Worker /* create named event source */
728*344aa361SAndroid Build Coastguard Worker rc = event_source_create(TEST_EVS_NAME1, NULL, NULL, NULL, 0, 0,
729*344aa361SAndroid Build Coastguard Worker &_state->hevts);
730*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
731*344aa361SAndroid Build Coastguard Worker
732*344aa361SAndroid Build Coastguard Worker rc = event_source_publish(_state->hevts);
733*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
734*344aa361SAndroid Build Coastguard Worker
735*344aa361SAndroid Build Coastguard Worker /* open the named event */
736*344aa361SAndroid Build Coastguard Worker rc = event_source_open(&cid, TEST_EVS_NAME1, strlen(TEST_EVS_NAME1) + 1, 0,
737*344aa361SAndroid Build Coastguard Worker &_state->hevt1);
738*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
739*344aa361SAndroid Build Coastguard Worker
740*344aa361SAndroid Build Coastguard Worker /* signal event */
741*344aa361SAndroid Build Coastguard Worker rc = event_source_signal(_state->hevts);
742*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "notify event signaled");
743*344aa361SAndroid Build Coastguard Worker
744*344aa361SAndroid Build Coastguard Worker /* wait on client 1: to put it into notified state */
745*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevt1, &uevt, NOT_EXPECTED_TO_FAIL_TIMEOUT_MSEC);
746*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "wait on client1");
747*344aa361SAndroid Build Coastguard Worker
748*344aa361SAndroid Build Coastguard Worker /* close client */
749*344aa361SAndroid Build Coastguard Worker handle_close(_state->hevt1);
750*344aa361SAndroid Build Coastguard Worker _state->hevt1 = NULL;
751*344aa361SAndroid Build Coastguard Worker
752*344aa361SAndroid Build Coastguard Worker /* wait on event source: should not block */
753*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevts, &uevt, NOT_EXPECTED_TO_FAIL_TIMEOUT_MSEC);
754*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "wait on source");
755*344aa361SAndroid Build Coastguard Worker
756*344aa361SAndroid Build Coastguard Worker test_abort:;
757*344aa361SAndroid Build Coastguard Worker }
758*344aa361SAndroid Build Coastguard Worker
TEST_F(uirq,event_client_close_notified_signaled)759*344aa361SAndroid Build Coastguard Worker TEST_F(uirq, event_client_close_notified_signaled) {
760*344aa361SAndroid Build Coastguard Worker int rc;
761*344aa361SAndroid Build Coastguard Worker uint32_t uevt;
762*344aa361SAndroid Build Coastguard Worker struct uuid cid = zero_uuid;
763*344aa361SAndroid Build Coastguard Worker
764*344aa361SAndroid Build Coastguard Worker /* create named event source */
765*344aa361SAndroid Build Coastguard Worker rc = event_source_create(TEST_EVS_NAME1, NULL, NULL, NULL, 0, 0,
766*344aa361SAndroid Build Coastguard Worker &_state->hevts);
767*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
768*344aa361SAndroid Build Coastguard Worker
769*344aa361SAndroid Build Coastguard Worker rc = event_source_publish(_state->hevts);
770*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
771*344aa361SAndroid Build Coastguard Worker
772*344aa361SAndroid Build Coastguard Worker /* open the named event */
773*344aa361SAndroid Build Coastguard Worker rc = event_source_open(&cid, TEST_EVS_NAME1, strlen(TEST_EVS_NAME1) + 1, 0,
774*344aa361SAndroid Build Coastguard Worker &_state->hevt1);
775*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
776*344aa361SAndroid Build Coastguard Worker
777*344aa361SAndroid Build Coastguard Worker /* signal event */
778*344aa361SAndroid Build Coastguard Worker rc = event_source_signal(_state->hevts);
779*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "notify event signaled");
780*344aa361SAndroid Build Coastguard Worker
781*344aa361SAndroid Build Coastguard Worker /* wait on client 1: to put it into notified state */
782*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevt1, &uevt, NOT_EXPECTED_TO_FAIL_TIMEOUT_MSEC);
783*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "wait on client1");
784*344aa361SAndroid Build Coastguard Worker
785*344aa361SAndroid Build Coastguard Worker /* signal event to put it intonotified signaled state */
786*344aa361SAndroid Build Coastguard Worker rc = event_source_signal(_state->hevts);
787*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "notify event signaled");
788*344aa361SAndroid Build Coastguard Worker
789*344aa361SAndroid Build Coastguard Worker /* close client */
790*344aa361SAndroid Build Coastguard Worker handle_close(_state->hevt1);
791*344aa361SAndroid Build Coastguard Worker _state->hevt1 = NULL;
792*344aa361SAndroid Build Coastguard Worker
793*344aa361SAndroid Build Coastguard Worker /* wait on event source: should not block */
794*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevts, &uevt, NOT_EXPECTED_TO_FAIL_TIMEOUT_MSEC);
795*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "wait on source");
796*344aa361SAndroid Build Coastguard Worker
797*344aa361SAndroid Build Coastguard Worker test_abort:;
798*344aa361SAndroid Build Coastguard Worker }
799*344aa361SAndroid Build Coastguard Worker
TEST_F(uirq,event_client_ack_unread)800*344aa361SAndroid Build Coastguard Worker TEST_F(uirq, event_client_ack_unread) {
801*344aa361SAndroid Build Coastguard Worker int rc;
802*344aa361SAndroid Build Coastguard Worker uint32_t uevt;
803*344aa361SAndroid Build Coastguard Worker struct uuid cid = zero_uuid;
804*344aa361SAndroid Build Coastguard Worker
805*344aa361SAndroid Build Coastguard Worker /* create named event source */
806*344aa361SAndroid Build Coastguard Worker rc = event_source_create(TEST_EVS_NAME1, NULL, NULL, NULL, 0, 0,
807*344aa361SAndroid Build Coastguard Worker &_state->hevts);
808*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
809*344aa361SAndroid Build Coastguard Worker
810*344aa361SAndroid Build Coastguard Worker rc = event_source_publish(_state->hevts);
811*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
812*344aa361SAndroid Build Coastguard Worker
813*344aa361SAndroid Build Coastguard Worker /* open the named event */
814*344aa361SAndroid Build Coastguard Worker rc = event_source_open(&cid, TEST_EVS_NAME1, strlen(TEST_EVS_NAME1) + 1, 0,
815*344aa361SAndroid Build Coastguard Worker &_state->hevt1);
816*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
817*344aa361SAndroid Build Coastguard Worker
818*344aa361SAndroid Build Coastguard Worker /* signal event */
819*344aa361SAndroid Build Coastguard Worker rc = event_source_signal(_state->hevts);
820*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "notify event signaled");
821*344aa361SAndroid Build Coastguard Worker
822*344aa361SAndroid Build Coastguard Worker /*
823*344aa361SAndroid Build Coastguard Worker * Notify that event1 is handled: should error because we need to wait on
824*344aa361SAndroid Build Coastguard Worker * event first
825*344aa361SAndroid Build Coastguard Worker */
826*344aa361SAndroid Build Coastguard Worker rc = event_client_notify_handled(_state->hevt1);
827*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(ERR_BAD_STATE, rc, "notify event handled");
828*344aa361SAndroid Build Coastguard Worker
829*344aa361SAndroid Build Coastguard Worker /* wait on client 1: to put it into notifird state */
830*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevt1, &uevt, NOT_EXPECTED_TO_FAIL_TIMEOUT_MSEC);
831*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "wait on client1");
832*344aa361SAndroid Build Coastguard Worker
833*344aa361SAndroid Build Coastguard Worker /* notify that event1 is handled: should be OK */
834*344aa361SAndroid Build Coastguard Worker rc = event_client_notify_handled(_state->hevt1);
835*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "notify event handled");
836*344aa361SAndroid Build Coastguard Worker
837*344aa361SAndroid Build Coastguard Worker test_abort:;
838*344aa361SAndroid Build Coastguard Worker }
839*344aa361SAndroid Build Coastguard Worker
TEST_F(uirq,event_client_wait_on_notified_signaled)840*344aa361SAndroid Build Coastguard Worker TEST_F(uirq, event_client_wait_on_notified_signaled) {
841*344aa361SAndroid Build Coastguard Worker int rc;
842*344aa361SAndroid Build Coastguard Worker uint32_t uevt;
843*344aa361SAndroid Build Coastguard Worker struct uuid cid = zero_uuid;
844*344aa361SAndroid Build Coastguard Worker
845*344aa361SAndroid Build Coastguard Worker /* create named event source */
846*344aa361SAndroid Build Coastguard Worker rc = event_source_create(TEST_EVS_NAME1, NULL, NULL, NULL, 0, 0,
847*344aa361SAndroid Build Coastguard Worker &_state->hevts);
848*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
849*344aa361SAndroid Build Coastguard Worker
850*344aa361SAndroid Build Coastguard Worker rc = event_source_publish(_state->hevts);
851*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
852*344aa361SAndroid Build Coastguard Worker
853*344aa361SAndroid Build Coastguard Worker /* open the named event */
854*344aa361SAndroid Build Coastguard Worker rc = event_source_open(&cid, TEST_EVS_NAME1, strlen(TEST_EVS_NAME1) + 1, 0,
855*344aa361SAndroid Build Coastguard Worker &_state->hevt1);
856*344aa361SAndroid Build Coastguard Worker ASSERT_EQ(0, rc);
857*344aa361SAndroid Build Coastguard Worker
858*344aa361SAndroid Build Coastguard Worker /* signal event */
859*344aa361SAndroid Build Coastguard Worker rc = event_source_signal(_state->hevts);
860*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "notify event signaled");
861*344aa361SAndroid Build Coastguard Worker
862*344aa361SAndroid Build Coastguard Worker /* wait on client 1: should be signaled: enters notified state */
863*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevt1, &uevt, NOT_EXPECTED_TO_FAIL_TIMEOUT_MSEC);
864*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "wait on client1");
865*344aa361SAndroid Build Coastguard Worker
866*344aa361SAndroid Build Coastguard Worker /* signal event again to put is into notified signaled state */
867*344aa361SAndroid Build Coastguard Worker rc = event_source_signal(_state->hevts);
868*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "notify event signaled");
869*344aa361SAndroid Build Coastguard Worker
870*344aa361SAndroid Build Coastguard Worker /* wait on client 1: should timeout as it is in notified signaled state */
871*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevt1, &uevt, EXPECTED_TO_FAIL_TIMEOUT_MSEC);
872*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(ERR_TIMED_OUT, rc, "wait on client1");
873*344aa361SAndroid Build Coastguard Worker
874*344aa361SAndroid Build Coastguard Worker /*
875*344aa361SAndroid Build Coastguard Worker * notify that event1 is handled: shoudl be OK: puts event into signaled
876*344aa361SAndroid Build Coastguard Worker * state
877*344aa361SAndroid Build Coastguard Worker */
878*344aa361SAndroid Build Coastguard Worker rc = event_client_notify_handled(_state->hevt1);
879*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "notify event handled");
880*344aa361SAndroid Build Coastguard Worker
881*344aa361SAndroid Build Coastguard Worker /* wait on client 1: should be signaled as it is in signaled state */
882*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevt1, &uevt, NOT_EXPECTED_TO_FAIL_TIMEOUT_MSEC);
883*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "wait on client1");
884*344aa361SAndroid Build Coastguard Worker
885*344aa361SAndroid Build Coastguard Worker /* notify that event1 is handled to put source into handled state */
886*344aa361SAndroid Build Coastguard Worker rc = event_client_notify_handled(_state->hevt1);
887*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "notify event handled");
888*344aa361SAndroid Build Coastguard Worker
889*344aa361SAndroid Build Coastguard Worker /* wait on event source: should be in handled state */
890*344aa361SAndroid Build Coastguard Worker rc = handle_wait(_state->hevts, &uevt, NOT_EXPECTED_TO_FAIL_TIMEOUT_MSEC);
891*344aa361SAndroid Build Coastguard Worker EXPECT_EQ(0, rc, "wait on source");
892*344aa361SAndroid Build Coastguard Worker
893*344aa361SAndroid Build Coastguard Worker test_abort:;
894*344aa361SAndroid Build Coastguard Worker }
895*344aa361SAndroid Build Coastguard Worker
896*344aa361SAndroid Build Coastguard Worker PORT_TEST(uirq, "com.android.kernel.uirq-unittest");
897