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