xref: /dpdk/app/test/test_alarm.c (revision 31fcb7d7dbf04b3ce4ae66602485c9797f6dbcd8)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2010-2014 Intel Corporation
3  */
4 
5 #include <stdio.h>
6 #include <stdbool.h>
7 #include <stdint.h>
8 
9 #include <rte_alarm.h>
10 #include <rte_atomic.h>
11 #include <rte_common.h>
12 #include <rte_cycles.h>
13 #include <rte_errno.h>
14 
15 #include "test.h"
16 
17 #ifndef US_PER_SEC
18 #define US_PER_SEC	1000000u
19 #endif
20 
21 static void
22 test_alarm_callback(void *cb_arg)
23 {
24 	RTE_ATOMIC(bool) *triggered = cb_arg;
25 
26 	rte_atomic_store_explicit(triggered, 1, rte_memory_order_release);
27 }
28 
29 
30 static int
31 test_alarm(void)
32 {
33 	RTE_ATOMIC(bool) triggered = false;
34 	RTE_ATOMIC(bool) later = false;
35 	int ret;
36 
37 	/* check if it will fail to set alarm with wrong us values */
38 	TEST_ASSERT_FAIL(rte_eal_alarm_set(0, test_alarm_callback, NULL),
39 			 "Expected rte_eal_alarm_set to fail with 0 us value");
40 
41 	/* check it if will fail with a very large timeout value */
42 	TEST_ASSERT_FAIL(rte_eal_alarm_set(UINT64_MAX - 1, test_alarm_callback, NULL),
43 			 "Expected rte_eal_alarm_set to fail with (UINT64_MAX-1) us value");
44 
45 	/* check if it will fail to set alarm with null callback parameter */
46 	TEST_ASSERT_FAIL(rte_eal_alarm_set(US_PER_SEC, NULL, NULL),
47 			 "Expected rte_eal_alarm_set to fail with null callback parameter");
48 
49 	/* check if it will fail to remove alarm with null callback parameter */
50 	TEST_ASSERT_FAIL(rte_eal_alarm_cancel(NULL, NULL),
51 			 "Expected rte_eal_alarm_cancel to fail with null callback parameter");
52 
53 	/* check if can set a alarm for one second */
54 	TEST_ASSERT_SUCCESS(rte_eal_alarm_set(US_PER_SEC, test_alarm_callback, &triggered),
55 			    "Setting one second alarm failed");
56 
57 	/* set a longer alarm that will be canceled. */
58 	TEST_ASSERT_SUCCESS(rte_eal_alarm_set(10 * US_PER_SEC, test_alarm_callback, &later),
59 			    "Setting ten second alarm failed");
60 
61 	/* wait for alarm to happen */
62 	while (rte_atomic_load_explicit(&triggered, rte_memory_order_acquire) == false)
63 		rte_delay_us_sleep(US_PER_SEC / 10);
64 
65 	TEST_ASSERT(!rte_atomic_load_explicit(&later, rte_memory_order_acquire),
66 		    "Only one alarm should have fired.");
67 
68 	ret = rte_eal_alarm_cancel(test_alarm_callback, &triggered);
69 	TEST_ASSERT(ret == 0 && rte_errno == ENOENT,
70 		    "Canceling alarm after run ret %d: %s", ret, rte_strerror(rte_errno));
71 
72 	ret = rte_eal_alarm_cancel(test_alarm_callback, &later);
73 	TEST_ASSERT(ret == 1, "Canceling ten second alarm failed %d: %s",
74 		    ret, rte_strerror(rte_errno));
75 
76 	return 0;
77 }
78 
79 REGISTER_FAST_TEST(alarm_autotest, true, true, test_alarm);
80