Skip to content

Commit e29c0c1

Browse files
Nicolas Pitrekartben
Nicolas Pitre
authored andcommitted
tests: poll: add pipe coverage
Add pipe test coverage. Signed-off-by: Nicolas Pitre <[email protected]>
1 parent d089815 commit e29c0c1

File tree

1 file changed

+55
-7
lines changed

1 file changed

+55
-7
lines changed

tests/kernel/poll/src/test_poll.c

+55-7
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,14 @@ struct fifo_msg {
1818
#define MSGQ_MSG_SIZE 4
1919
#define MSGQ_MAX_MSGS 16
2020
#define MSGQ_MSG_VALUE {'a', 'b', 'c', 'd'}
21+
#define PIPE_DATA "atad_epip"
2122
#define STACK_SIZE (1024 + CONFIG_TEST_EXTRA_STACK_SIZE)
2223

2324
/* verify k_poll() without waiting */
2425
static struct k_sem no_wait_sem;
2526
static struct k_fifo no_wait_fifo;
2627
static struct k_poll_signal no_wait_signal;
28+
K_PIPE_DEFINE(no_wait_pipe, 32, 1);
2729
static struct k_poll_signal test_signal;
2830
#ifndef CONFIG_USERSPACE
2931
static struct k_msgq no_wait_msgq;
@@ -63,6 +65,7 @@ ZTEST_USER(poll_api_1cpu, test_poll_no_wait)
6365
unsigned int signaled;
6466
char msgq_recv_buf[MSGQ_MSG_SIZE] = {0};
6567
char msgq_msg[MSGQ_MSG_SIZE] = MSGQ_MSG_VALUE;
68+
char pipe_recv_buf[sizeof(PIPE_DATA) + 4];
6669
int result;
6770
struct k_msgq *mq;
6871
#ifdef CONFIG_USERSPACE
@@ -78,6 +81,8 @@ ZTEST_USER(poll_api_1cpu, test_poll_no_wait)
7881

7982
k_msgq_alloc_init(mq, MSGQ_MSG_SIZE, MSGQ_MAX_MSGS);
8083

84+
k_pipe_write(&no_wait_pipe, PIPE_DATA, sizeof(PIPE_DATA), K_NO_WAIT);
85+
8186
struct k_poll_event events[] = {
8287
K_POLL_EVENT_INITIALIZER(K_POLL_TYPE_SEM_AVAILABLE,
8388
K_POLL_MODE_NOTIFY_ONLY,
@@ -94,6 +99,9 @@ ZTEST_USER(poll_api_1cpu, test_poll_no_wait)
9499
K_POLL_EVENT_INITIALIZER(K_POLL_TYPE_MSGQ_DATA_AVAILABLE,
95100
K_POLL_MODE_NOTIFY_ONLY,
96101
mq),
102+
K_POLL_EVENT_INITIALIZER(K_POLL_TYPE_PIPE_DATA_AVAILABLE,
103+
K_POLL_MODE_NOTIFY_ONLY,
104+
&no_wait_pipe),
97105
};
98106

99107
#ifdef CONFIG_USERSPACE
@@ -159,12 +167,18 @@ ZTEST_USER(poll_api_1cpu, test_poll_no_wait)
159167
zassert_false(k_msgq_get(mq, msgq_recv_buf, K_NO_WAIT));
160168
zassert_false(memcmp(msgq_msg, msgq_recv_buf, MSGQ_MSG_SIZE), "");
161169

170+
zassert_equal(events[5].state, K_POLL_STATE_PIPE_DATA_AVAILABLE);
171+
result = k_pipe_read(&no_wait_pipe, pipe_recv_buf, sizeof(pipe_recv_buf), K_NO_WAIT);
172+
zassert_equal(result, sizeof(PIPE_DATA));
173+
zassert_str_equal(pipe_recv_buf, PIPE_DATA);
174+
162175
/* verify events are not ready anymore (user has to clear them first) */
163176
events[0].state = K_POLL_STATE_NOT_READY;
164177
events[1].state = K_POLL_STATE_NOT_READY;
165178
events[2].state = K_POLL_STATE_NOT_READY;
166179
events[3].state = K_POLL_STATE_NOT_READY;
167180
events[4].state = K_POLL_STATE_NOT_READY;
181+
events[5].state = K_POLL_STATE_NOT_READY;
168182
k_poll_signal_reset(&no_wait_signal);
169183

170184
zassert_equal(k_poll(events, ARRAY_SIZE(events), K_NO_WAIT), -EAGAIN,
@@ -174,11 +188,11 @@ ZTEST_USER(poll_api_1cpu, test_poll_no_wait)
174188
zassert_equal(events[2].state, K_POLL_STATE_NOT_READY, "");
175189
zassert_equal(events[3].state, K_POLL_STATE_NOT_READY, "");
176190
zassert_equal(events[4].state, K_POLL_STATE_NOT_READY, "");
191+
zassert_equal(events[5].state, K_POLL_STATE_NOT_READY, "");
177192

178193
zassert_not_equal(k_sem_take(&no_wait_sem, K_NO_WAIT), 0, "");
179194
zassert_is_null(k_fifo_get(&no_wait_fifo, K_NO_WAIT), "");
180-
zassert_not_equal(k_msgq_get(mq, msgq_recv_buf, K_NO_WAIT), 0,
181-
"");
195+
zassert_not_equal(k_msgq_get(mq, msgq_recv_buf, K_NO_WAIT), 0, "");
182196
}
183197

184198
/* verify k_poll() that has to wait */
@@ -192,10 +206,13 @@ static struct k_poll_signal wait_signal =
192206

193207
struct fifo_msg wait_msg = { NULL, FIFO_MSG_VALUE };
194208

209+
K_PIPE_DEFINE(wait_pipe, 32, 1);
210+
195211
#define TAG_0 10
196212
#define TAG_1 11
197213
#define TAG_2 12
198214
#define TAG_3 13
215+
#define TAG_4 14
199216

200217
struct k_poll_event wait_events[] = {
201218
K_POLL_EVENT_STATIC_INITIALIZER(K_POLL_TYPE_SEM_AVAILABLE,
@@ -213,10 +230,14 @@ struct k_poll_event wait_events[] = {
213230
K_POLL_EVENT_STATIC_INITIALIZER(K_POLL_TYPE_MSGQ_DATA_AVAILABLE,
214231
K_POLL_MODE_NOTIFY_ONLY,
215232
&wait_msgq, TAG_3),
233+
K_POLL_EVENT_STATIC_INITIALIZER(K_POLL_TYPE_PIPE_DATA_AVAILABLE,
234+
K_POLL_MODE_NOTIFY_ONLY,
235+
&wait_pipe, TAG_4),
216236
};
217237

218238
#define USE_FIFO (1 << 0)
219239
#define USE_MSGQ (1 << 1)
240+
#define USE_PIPE (1 << 2)
220241

221242
static void poll_wait_helper(void *use_queuelike, void *msgq, void *p3)
222243
{
@@ -239,6 +260,10 @@ static void poll_wait_helper(void *use_queuelike, void *msgq, void *p3)
239260

240261
k_msgq_put(msgq, &m[0], K_FOREVER);
241262
}
263+
264+
if (flags & USE_PIPE) {
265+
k_pipe_write(&wait_pipe, PIPE_DATA, sizeof(PIPE_DATA), K_NO_WAIT);
266+
}
242267
}
243268

244269
/* check results for multiple events */
@@ -248,6 +273,8 @@ void check_results(struct k_poll_event *events, uint32_t event_type,
248273
struct fifo_msg *msg_ptr;
249274
char msgq_recv_buf[MSGQ_MSG_SIZE] = {0};
250275
char msg[] = MSGQ_MSG_VALUE;
276+
char pipe_recv_buf[sizeof(PIPE_DATA) + 4];
277+
int result;
251278

252279
switch (event_type) {
253280
case K_POLL_TYPE_SEM_AVAILABLE:
@@ -317,7 +344,20 @@ void check_results(struct k_poll_event *events, uint32_t event_type,
317344
"");
318345
}
319346
break;
320-
347+
case K_POLL_TYPE_PIPE_DATA_AVAILABLE:
348+
if (is_available) {
349+
zassert_equal(events->state, K_POLL_STATE_PIPE_DATA_AVAILABLE);
350+
result = k_pipe_read(&wait_pipe, pipe_recv_buf,
351+
sizeof(pipe_recv_buf), K_NO_WAIT);
352+
zassert_equal(result, sizeof(PIPE_DATA));
353+
zassert_str_equal(pipe_recv_buf, PIPE_DATA);
354+
zassert_equal(events->tag, TAG_4);
355+
/* reset to not ready */
356+
events->state = K_POLL_STATE_NOT_READY;
357+
} else {
358+
zassert_equal(events->state, K_POLL_STATE_NOT_READY);
359+
}
360+
break;
321361
default:
322362
__ASSERT(false, "invalid event type (0x%x)\n", event_type);
323363
break;
@@ -403,9 +443,9 @@ ZTEST(poll_api_1cpu, test_poll_wait)
403443

404444
k_tid_t tid1 = k_thread_create(&test_thread, test_stack,
405445
K_THREAD_STACK_SIZEOF(test_stack),
406-
poll_wait_helper, (void *)(USE_FIFO | USE_MSGQ), wait_msgq_ptr, 0,
407-
main_low_prio - 1, K_USER | K_INHERIT_PERMS,
408-
K_NO_WAIT);
446+
poll_wait_helper, (void *)(USE_FIFO | USE_MSGQ | USE_PIPE),
447+
wait_msgq_ptr, 0, main_low_prio - 1,
448+
K_USER | K_INHERIT_PERMS, K_NO_WAIT);
409449

410450
rc = k_poll(wait_events, ARRAY_SIZE(wait_events), K_NO_WAIT);
411451
zassert_equal(rc, -EAGAIN, "should return EAGAIN with K_NO_WAIT");
@@ -422,6 +462,7 @@ ZTEST(poll_api_1cpu, test_poll_wait)
422462
check_results(&wait_events[2], K_POLL_TYPE_SIGNAL, true);
423463
check_results(&wait_events[3], K_POLL_TYPE_IGNORE, true);
424464
check_results(&wait_events[4], K_POLL_TYPE_MSGQ_DATA_AVAILABLE, true);
465+
check_results(&wait_events[5], K_POLL_TYPE_PIPE_DATA_AVAILABLE, true);
425466

426467
/* verify events are not ready anymore */
427468
zassert_equal(k_poll(wait_events, ARRAY_SIZE(wait_events),
@@ -433,6 +474,7 @@ ZTEST(poll_api_1cpu, test_poll_wait)
433474
check_results(&wait_events[2], K_POLL_TYPE_SIGNAL, false);
434475
check_results(&wait_events[3], K_POLL_TYPE_IGNORE, false);
435476
check_results(&wait_events[4], K_POLL_TYPE_MSGQ_DATA_AVAILABLE, false);
477+
check_results(&wait_events[5], K_POLL_TYPE_PIPE_DATA_AVAILABLE, false);
436478

437479
/*
438480
* Wait for 2 out of 4 non-ready events to become ready from a higher
@@ -455,6 +497,7 @@ ZTEST(poll_api_1cpu, test_poll_wait)
455497
check_results(&wait_events[1], K_POLL_TYPE_DATA_AVAILABLE, false);
456498
check_results(&wait_events[2], K_POLL_TYPE_SIGNAL, true);
457499
check_results(&wait_events[4], K_POLL_TYPE_MSGQ_DATA_AVAILABLE, false);
500+
check_results(&wait_events[4], K_POLL_TYPE_PIPE_DATA_AVAILABLE, false);
458501

459502
/*
460503
* Wait for each event to be ready from a lower priority thread, one at
@@ -473,6 +516,7 @@ ZTEST(poll_api_1cpu, test_poll_wait)
473516
check_results(&wait_events[1], K_POLL_TYPE_DATA_AVAILABLE, false);
474517
check_results(&wait_events[2], K_POLL_TYPE_SIGNAL, false);
475518
check_results(&wait_events[4], K_POLL_TYPE_MSGQ_DATA_AVAILABLE, false);
519+
check_results(&wait_events[5], K_POLL_TYPE_PIPE_DATA_AVAILABLE, false);
476520

477521
/* fifo */
478522
rc = k_poll(wait_events, ARRAY_SIZE(wait_events), K_SECONDS(1));
@@ -483,6 +527,7 @@ ZTEST(poll_api_1cpu, test_poll_wait)
483527
check_results(&wait_events[1], K_POLL_TYPE_DATA_AVAILABLE, true);
484528
check_results(&wait_events[2], K_POLL_TYPE_SIGNAL, false);
485529
check_results(&wait_events[4], K_POLL_TYPE_MSGQ_DATA_AVAILABLE, false);
530+
check_results(&wait_events[5], K_POLL_TYPE_PIPE_DATA_AVAILABLE, false);
486531

487532
/* poll signal */
488533
rc = k_poll(wait_events, ARRAY_SIZE(wait_events), K_SECONDS(1));
@@ -493,6 +538,7 @@ ZTEST(poll_api_1cpu, test_poll_wait)
493538
check_results(&wait_events[1], K_POLL_TYPE_DATA_AVAILABLE, false);
494539
check_results(&wait_events[2], K_POLL_TYPE_SIGNAL, true);
495540
check_results(&wait_events[4], K_POLL_TYPE_MSGQ_DATA_AVAILABLE, false);
541+
check_results(&wait_events[5], K_POLL_TYPE_PIPE_DATA_AVAILABLE, false);
496542

497543
/* message queue */
498544
rc = k_poll(wait_events, ARRAY_SIZE(wait_events), K_SECONDS(1));
@@ -503,6 +549,7 @@ ZTEST(poll_api_1cpu, test_poll_wait)
503549
check_results(&wait_events[1], K_POLL_TYPE_DATA_AVAILABLE, false);
504550
check_results(&wait_events[2], K_POLL_TYPE_SIGNAL, false);
505551
check_results(&wait_events[4], K_POLL_TYPE_MSGQ_DATA_AVAILABLE, true);
552+
check_results(&wait_events[5], K_POLL_TYPE_PIPE_DATA_AVAILABLE, false);
506553

507554
k_thread_abort(tid1);
508555
k_thread_abort(tid2);
@@ -780,7 +827,8 @@ void poll_test_grant_access(void)
780827
&no_wait_signal, &wait_sem, &wait_fifo,
781828
&cancel_fifo, &non_cancel_fifo,
782829
&wait_signal, &test_thread, &test_signal,
783-
&test_stack, &multi_sem, &multi_reply);
830+
&test_stack, &multi_sem, &multi_reply,
831+
&no_wait_pipe, &wait_pipe);
784832
}
785833

786834

0 commit comments

Comments
 (0)