Skip to content

Commit 5f0ee9d

Browse files
Andrew Boieandrewboie
authored andcommitted
tests: timer_api: run in user mode
We didn't have any coverage of the timer APIs in user mode. Signed-off-by: Andrew Boie <[email protected]>
1 parent e07e8b8 commit 5f0ee9d

File tree

3 files changed

+85
-61
lines changed

3 files changed

+85
-61
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
CONFIG_ZTEST=y
22
CONFIG_QEMU_TICKLESS_WORKAROUND=y
3-
3+
CONFIG_TEST_USERSPACE=y
44

tests/kernel/timer/timer_api/src/main.c

Lines changed: 82 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,18 @@ static void duration_stop(struct k_timer *timer);
2424

2525
/** TESTPOINT: init timer via K_TIMER_DEFINE */
2626
K_TIMER_DEFINE(ktimer, duration_expire, duration_stop);
27-
static struct k_timer timer;
28-
static struct timer_data tdata;
27+
28+
static struct k_timer duration_timer;
29+
static struct k_timer period0_timer;
30+
static struct k_timer expire_timer;
31+
static struct k_timer sync_timer;
32+
static struct k_timer periodicity_timer;
33+
static struct k_timer status_timer;
34+
static struct k_timer status_anytime_timer;
35+
static struct k_timer status_sync_timer;
36+
static struct k_timer remain_timer;
37+
38+
static ZTEST_BMEM struct timer_data tdata;
2939

3040
#define TIMER_ASSERT(exp, tmr) \
3141
do { \
@@ -119,16 +129,15 @@ void test_timer_duration_period(void)
119129
{
120130
init_timer_data();
121131
/** TESTPOINT: init timer via k_timer_init */
122-
k_timer_init(&timer, duration_expire, duration_stop);
123-
k_timer_start(&timer, DURATION, PERIOD);
132+
k_timer_start(&duration_timer, DURATION, PERIOD);
124133
tdata.timestamp = k_uptime_get();
125134
busy_wait_ms(DURATION + PERIOD * EXPIRE_TIMES + PERIOD / 2);
126135
/** TESTPOINT: check expire and stop times */
127-
TIMER_ASSERT(tdata.expire_cnt == EXPIRE_TIMES, &timer);
128-
TIMER_ASSERT(tdata.stop_cnt == 1, &timer);
136+
TIMER_ASSERT(tdata.expire_cnt == EXPIRE_TIMES, &duration_timer);
137+
TIMER_ASSERT(tdata.stop_cnt == 1, &duration_timer);
129138

130139
/* cleanup environemtn */
131-
k_timer_stop(&timer);
140+
k_timer_stop(&duration_timer);
132141
}
133142

134143
/**
@@ -150,17 +159,16 @@ void test_timer_period_0(void)
150159
{
151160
init_timer_data();
152161
/** TESTPOINT: set period 0 */
153-
k_timer_init(&timer, period0_expire, NULL);
154-
k_timer_start(&timer, DURATION, 0);
162+
k_timer_start(&period0_timer, DURATION, 0);
155163
tdata.timestamp = k_uptime_get();
156164
busy_wait_ms(DURATION + 1);
157165

158166
/** TESTPOINT: ensure it is one-short timer */
159-
TIMER_ASSERT(tdata.expire_cnt == 1, &timer);
160-
TIMER_ASSERT(tdata.stop_cnt == 0, &timer);
167+
TIMER_ASSERT(tdata.expire_cnt == 1, &period0_timer);
168+
TIMER_ASSERT(tdata.stop_cnt == 0, &period0_timer);
161169

162170
/* cleanup environemtn */
163-
k_timer_stop(&timer);
171+
k_timer_stop(&period0_timer);
164172
}
165173

166174
/**
@@ -182,28 +190,24 @@ void test_timer_expirefn_null(void)
182190
{
183191
init_timer_data();
184192
/** TESTPOINT: expire function NULL */
185-
k_timer_init(&timer, NULL, duration_stop);
186-
k_timer_start(&timer, DURATION, PERIOD);
193+
k_timer_start(&expire_timer, DURATION, PERIOD);
187194
busy_wait_ms(DURATION + PERIOD * EXPIRE_TIMES + PERIOD / 2);
188195

189-
k_timer_stop(&timer);
196+
k_timer_stop(&expire_timer);
190197
/** TESTPOINT: expire handler is not invoked */
191-
TIMER_ASSERT(tdata.expire_cnt == 0, &timer);
198+
TIMER_ASSERT(tdata.expire_cnt == 0, &expire_timer);
192199
/** TESTPOINT: stop handler is invoked */
193-
TIMER_ASSERT(tdata.stop_cnt == 1, &timer);
200+
TIMER_ASSERT(tdata.stop_cnt == 1, &expire_timer);
194201

195202
/* cleanup environment */
196-
k_timer_stop(&timer);
203+
k_timer_stop(&expire_timer);
197204
}
198205

199206
/* Wait for the next expiration of an OS timer tick, to synchronize
200207
* test start
201208
*/
202209
static void tick_sync(void)
203210
{
204-
static struct k_timer sync_timer;
205-
206-
k_timer_init(&sync_timer, NULL, NULL);
207211
k_timer_start(&sync_timer, 0, 1);
208212
k_timer_status_sync(&sync_timer);
209213
k_timer_stop(&sync_timer);
@@ -238,29 +242,30 @@ void test_timer_periodicity(void)
238242

239243
init_timer_data();
240244
/** TESTPOINT: set duration 0 */
241-
k_timer_init(&timer, NULL, NULL);
242-
k_timer_start(&timer, 0, PERIOD);
245+
k_timer_start(&periodicity_timer, 0, PERIOD);
243246

244247
/* clear the expiration that would have happenned due to
245248
* whatever duration that was set.
246249
*/
247-
k_timer_status_sync(&timer);
250+
k_timer_status_sync(&periodicity_timer);
248251
tdata.timestamp = k_uptime_get();
249252

250253
for (int i = 0; i < EXPIRE_TIMES; i++) {
251254
/** TESTPOINT: expired times returned by status sync */
252-
TIMER_ASSERT(k_timer_status_sync(&timer) == 1, &timer);
255+
TIMER_ASSERT(k_timer_status_sync(&periodicity_timer) == 1,
256+
&periodicity_timer);
253257

254258
delta = k_uptime_delta(&tdata.timestamp);
255259

256260
/** TESTPOINT: check if timer fired within 1ms of the
257261
* expected period (firing time)
258262
*/
259-
TIMER_ASSERT(WITHIN_ERROR(delta, PERIOD, 1), &timer);
263+
TIMER_ASSERT(WITHIN_ERROR(delta, PERIOD, 1),
264+
&periodicity_timer);
260265
}
261266

262267
/* cleanup environment */
263-
k_timer_stop(&timer);
268+
k_timer_stop(&periodicity_timer);
264269
}
265270

266271
/**
@@ -281,15 +286,15 @@ void test_timer_periodicity(void)
281286
void test_timer_status_get(void)
282287
{
283288
init_timer_data();
284-
k_timer_init(&timer, status_expire, status_stop);
285-
k_timer_start(&timer, DURATION, PERIOD);
289+
k_timer_start(&status_timer, DURATION, PERIOD);
286290
/** TESTPOINT: status get upon timer starts */
287-
TIMER_ASSERT(k_timer_status_get(&timer) == 0, &timer);
291+
TIMER_ASSERT(k_timer_status_get(&status_timer) == 0, &status_timer);
288292
/** TESTPOINT: remaining get upon timer starts */
289-
TIMER_ASSERT(k_timer_remaining_get(&timer) >= DURATION / 2, &timer);
293+
TIMER_ASSERT(k_timer_remaining_get(&status_timer) >= DURATION / 2,
294+
&status_timer);
290295

291296
/* cleanup environment */
292-
k_timer_stop(&timer);
297+
k_timer_stop(&status_timer);
293298
}
294299

295300
/**
@@ -310,15 +315,15 @@ void test_timer_status_get(void)
310315
void test_timer_status_get_anytime(void)
311316
{
312317
init_timer_data();
313-
k_timer_init(&timer, NULL, NULL);
314-
k_timer_start(&timer, DURATION, PERIOD);
318+
k_timer_start(&status_anytime_timer, DURATION, PERIOD);
315319
busy_wait_ms(DURATION + PERIOD * (EXPIRE_TIMES - 1) + PERIOD / 2);
316320

317321
/** TESTPOINT: status get at any time */
318-
TIMER_ASSERT(k_timer_status_get(&timer) == EXPIRE_TIMES, &timer);
322+
TIMER_ASSERT(k_timer_status_get(&status_anytime_timer) == EXPIRE_TIMES,
323+
&status_anytime_timer);
319324

320325
/* cleanup environment */
321-
k_timer_stop(&timer);
326+
k_timer_stop(&status_anytime_timer);
322327
}
323328

324329
/**
@@ -340,20 +345,20 @@ void test_timer_status_get_anytime(void)
340345
void test_timer_status_sync(void)
341346
{
342347
init_timer_data();
343-
k_timer_init(&timer, duration_expire, duration_stop);
344-
k_timer_start(&timer, DURATION, PERIOD);
348+
k_timer_start(&status_sync_timer, DURATION, PERIOD);
345349

346350
for (int i = 0; i < EXPIRE_TIMES; i++) {
347351
/** TESTPOINT: check timer not expire */
348-
TIMER_ASSERT(tdata.expire_cnt == i, &timer);
352+
TIMER_ASSERT(tdata.expire_cnt == i, &status_sync_timer);
349353
/** TESTPOINT: expired times returned by status sync */
350-
TIMER_ASSERT(k_timer_status_sync(&timer) == 1, &timer);
354+
TIMER_ASSERT(k_timer_status_sync(&status_sync_timer) == 1,
355+
&status_sync_timer);
351356
/** TESTPOINT: check timer not expire */
352-
TIMER_ASSERT(tdata.expire_cnt == (i + 1), &timer);
357+
TIMER_ASSERT(tdata.expire_cnt == (i + 1), &status_sync_timer);
353358
}
354359

355360
/* cleanup environment */
356-
k_timer_stop(&timer);
361+
k_timer_stop(&status_sync_timer);
357362
}
358363

359364
/**
@@ -415,13 +420,13 @@ K_TIMER_DEFINE(timer2, user_data_timer_handler, NULL);
415420
K_TIMER_DEFINE(timer3, user_data_timer_handler, NULL);
416421
K_TIMER_DEFINE(timer4, user_data_timer_handler, NULL);
417422

418-
static struct k_timer *user_data_timer[5] = {
423+
static ZTEST_DMEM struct k_timer *user_data_timer[5] = {
419424
&timer0, &timer1, &timer2, &timer3, &timer4
420425
};
421426

422427
static const intptr_t user_data[5] = { 0x1337, 0xbabe, 0xd00d, 0xdeaf, 0xfade };
423428

424-
static int user_data_correct[5] = { 0, 0, 0, 0, 0 };
429+
static ZTEST_BMEM int user_data_correct[5];
425430

426431
static void user_data_timer_handler(struct k_timer *timer)
427432
{
@@ -504,26 +509,45 @@ void test_timer_remaining_get(void)
504509
u32_t remaining;
505510

506511
init_timer_data();
507-
k_timer_init(&timer, NULL, NULL);
508-
k_timer_start(&timer, DURATION, 0);
512+
k_timer_start(&remain_timer, DURATION, 0);
509513
busy_wait_ms(DURATION / 2);
510-
remaining = k_timer_remaining_get(&timer);
511-
k_timer_stop(&timer);
514+
remaining = k_timer_remaining_get(&remain_timer);
515+
k_timer_stop(&remain_timer);
512516
zassert_true(remaining <= (DURATION / 2), NULL);
513517
}
514518

519+
static void timer_init(struct k_timer *timer, k_timer_expiry_t expiry_fn,
520+
k_timer_stop_t stop_fn)
521+
{
522+
k_object_access_grant(timer, k_current_get());
523+
k_timer_init(timer, expiry_fn, stop_fn);
524+
}
525+
515526
void test_main(void)
516527
{
528+
timer_init(&duration_timer, duration_expire, duration_stop);
529+
timer_init(&period0_timer, period0_expire, NULL);
530+
timer_init(&expire_timer, NULL, duration_stop);
531+
timer_init(&sync_timer, NULL, NULL);
532+
timer_init(&periodicity_timer, NULL, NULL);
533+
timer_init(&status_timer, status_expire, status_stop);
534+
timer_init(&status_anytime_timer, NULL, NULL);
535+
timer_init(&status_sync_timer, duration_expire, duration_stop);
536+
timer_init(&remain_timer, NULL, NULL);
537+
538+
k_thread_access_grant(k_current_get(), &ktimer, &timer0, &timer1,
539+
&timer2, &timer3, &timer4);
540+
517541
ztest_test_suite(timer_api,
518-
ztest_unit_test(test_timer_duration_period),
519-
ztest_unit_test(test_timer_period_0),
520-
ztest_unit_test(test_timer_expirefn_null),
521-
ztest_unit_test(test_timer_periodicity),
522-
ztest_unit_test(test_timer_status_get),
523-
ztest_unit_test(test_timer_status_get_anytime),
524-
ztest_unit_test(test_timer_status_sync),
525-
ztest_unit_test(test_timer_k_define),
526-
ztest_unit_test(test_timer_user_data),
527-
ztest_unit_test(test_timer_remaining_get));
542+
ztest_user_unit_test(test_timer_duration_period),
543+
ztest_user_unit_test(test_timer_period_0),
544+
ztest_user_unit_test(test_timer_expirefn_null),
545+
ztest_user_unit_test(test_timer_periodicity),
546+
ztest_user_unit_test(test_timer_status_get),
547+
ztest_user_unit_test(test_timer_status_get_anytime),
548+
ztest_user_unit_test(test_timer_status_sync),
549+
ztest_user_unit_test(test_timer_k_define),
550+
ztest_user_unit_test(test_timer_user_data),
551+
ztest_user_unit_test(test_timer_remaining_get));
528552
ztest_run_test_suite(timer_api);
529553
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
tests:
22
kernel.timer:
3-
tags: kernel
3+
tags: kernel userspace
44
kernel.timer.tickless:
55
build_only: true
66
extra_args: CONF_FILE="prj_tickless.conf"
77
arch_exclude: riscv32 nios2 posix
8-
tags: kernel
8+
tags: kernel userspace

0 commit comments

Comments
 (0)