xref: /dpdk/app/test/test_debug.c (revision e0a8442ccd15bafbb7eb150c35331c8e3b828c53)
1a9de470cSBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
2a9de470cSBruce Richardson  * Copyright(c) 2010-2014 Intel Corporation
3a9de470cSBruce Richardson  */
4a9de470cSBruce Richardson 
53c60274cSJie Zhou #include "test.h"
63c60274cSJie Zhou 
7a9de470cSBruce Richardson #include <stdio.h>
8a9de470cSBruce Richardson #include <stdint.h>
93c60274cSJie Zhou 
103c60274cSJie Zhou #ifdef RTE_EXEC_ENV_WINDOWS
113c60274cSJie Zhou static int
test_debug(void)123c60274cSJie Zhou test_debug(void)
133c60274cSJie Zhou {
143c60274cSJie Zhou 	printf("debug not supported on Windows, skipping test\n");
153c60274cSJie Zhou 	return TEST_SKIPPED;
163c60274cSJie Zhou }
173c60274cSJie Zhou 
183c60274cSJie Zhou #else
193c60274cSJie Zhou 
203cd7290cSDavid Marchand #include <sys/resource.h>
213cd7290cSDavid Marchand #include <sys/time.h>
22a9de470cSBruce Richardson #include <sys/wait.h>
23a9de470cSBruce Richardson #include <unistd.h>
24a9de470cSBruce Richardson 
25a9de470cSBruce Richardson #include <rte_debug.h>
26a9de470cSBruce Richardson #include <rte_common.h>
27a9de470cSBruce Richardson #include <rte_eal.h>
28a9de470cSBruce Richardson #include <rte_service_component.h>
29a9de470cSBruce Richardson 
30a9de470cSBruce Richardson /*
31a9de470cSBruce Richardson  * Debug test
32a9de470cSBruce Richardson  * ==========
33a9de470cSBruce Richardson  */
34a9de470cSBruce Richardson 
35a9de470cSBruce Richardson /* use fork() to test rte_panic() */
36a9de470cSBruce Richardson static int
test_panic(void)37a9de470cSBruce Richardson test_panic(void)
38a9de470cSBruce Richardson {
39a9de470cSBruce Richardson 	int pid;
40a9de470cSBruce Richardson 	int status;
41a9de470cSBruce Richardson 
42a9de470cSBruce Richardson 	pid = fork();
43a9de470cSBruce Richardson 
443cd7290cSDavid Marchand 	if (pid == 0) {
453cd7290cSDavid Marchand 		struct rlimit rl;
463cd7290cSDavid Marchand 
473cd7290cSDavid Marchand 		/* No need to generate a coredump when panicking. */
483cd7290cSDavid Marchand 		rl.rlim_cur = rl.rlim_max = 0;
493cd7290cSDavid Marchand 		setrlimit(RLIMIT_CORE, &rl);
50a9de470cSBruce Richardson 		rte_panic("Test Debug\n");
513cd7290cSDavid Marchand 	} else if (pid < 0) {
52a9de470cSBruce Richardson 		printf("Fork Failed\n");
53a9de470cSBruce Richardson 		return -1;
54a9de470cSBruce Richardson 	}
55a9de470cSBruce Richardson 	wait(&status);
56a9de470cSBruce Richardson 	if(status == 0){
57a9de470cSBruce Richardson 		printf("Child process terminated normally!\n");
58a9de470cSBruce Richardson 		return -1;
59a9de470cSBruce Richardson 	} else
60a9de470cSBruce Richardson 		printf("Child process terminated as expected - Test passed!\n");
61a9de470cSBruce Richardson 
62a9de470cSBruce Richardson 	return 0;
63a9de470cSBruce Richardson }
64a9de470cSBruce Richardson 
65a9de470cSBruce Richardson /* use fork() to test rte_exit() */
66a9de470cSBruce Richardson static int
test_exit_val(int exit_val)67a9de470cSBruce Richardson test_exit_val(int exit_val)
68a9de470cSBruce Richardson {
69a9de470cSBruce Richardson 	int pid;
70a9de470cSBruce Richardson 	int status;
71a9de470cSBruce Richardson 
72a9de470cSBruce Richardson 	/* manually cleanup EAL memory, as the fork() below would otherwise
73a9de470cSBruce Richardson 	 * cause the same hugepages to be free()-ed multiple times.
74a9de470cSBruce Richardson 	 */
75a9de470cSBruce Richardson 	rte_service_finalize();
76a9de470cSBruce Richardson 
77a9de470cSBruce Richardson 	pid = fork();
78a9de470cSBruce Richardson 
79a9de470cSBruce Richardson 	if (pid == 0)
80a9de470cSBruce Richardson 		rte_exit(exit_val, __func__);
81a9de470cSBruce Richardson 	else if (pid < 0){
82a9de470cSBruce Richardson 		printf("Fork Failed\n");
83a9de470cSBruce Richardson 		return -1;
84a9de470cSBruce Richardson 	}
85a9de470cSBruce Richardson 	wait(&status);
86a9de470cSBruce Richardson 	printf("Child process status: %d\n", status);
87a9de470cSBruce Richardson 	if(!WIFEXITED(status) || WEXITSTATUS(status) != (uint8_t)exit_val){
88a9de470cSBruce Richardson 		printf("Child process terminated with incorrect status (expected = %d)!\n",
89a9de470cSBruce Richardson 				exit_val);
90a9de470cSBruce Richardson 		return -1;
91a9de470cSBruce Richardson 	}
92a9de470cSBruce Richardson 	return 0;
93a9de470cSBruce Richardson }
94a9de470cSBruce Richardson 
95a9de470cSBruce Richardson static int
test_exit(void)96a9de470cSBruce Richardson test_exit(void)
97a9de470cSBruce Richardson {
98a9de470cSBruce Richardson 	int test_vals[] = { 0, 1, 2, 255, -1 };
99a9de470cSBruce Richardson 	unsigned i;
10071bdd8a1SPavan Nikhilesh 	for (i = 0; i < RTE_DIM(test_vals); i++) {
101a9de470cSBruce Richardson 		if (test_exit_val(test_vals[i]) < 0)
102a9de470cSBruce Richardson 			return -1;
103a9de470cSBruce Richardson 	}
104a9de470cSBruce Richardson 	printf("%s Passed\n", __func__);
105a9de470cSBruce Richardson 	return 0;
106a9de470cSBruce Richardson }
107a9de470cSBruce Richardson 
108a9de470cSBruce Richardson static void
dummy_app_usage(const char * progname)109a9de470cSBruce Richardson dummy_app_usage(const char *progname)
110a9de470cSBruce Richardson {
111a9de470cSBruce Richardson 	RTE_SET_USED(progname);
112a9de470cSBruce Richardson }
113a9de470cSBruce Richardson 
114a9de470cSBruce Richardson static int
test_usage(void)115a9de470cSBruce Richardson test_usage(void)
116a9de470cSBruce Richardson {
117a9de470cSBruce Richardson 	if (rte_set_application_usage_hook(dummy_app_usage) != NULL) {
118a9de470cSBruce Richardson 		printf("Non-NULL value returned for initial usage hook\n");
119a9de470cSBruce Richardson 		return -1;
120a9de470cSBruce Richardson 	}
121a9de470cSBruce Richardson 	if (rte_set_application_usage_hook(NULL) != dummy_app_usage) {
122a9de470cSBruce Richardson 		printf("Incorrect value returned for application usage hook\n");
123a9de470cSBruce Richardson 		return -1;
124a9de470cSBruce Richardson 	}
125a9de470cSBruce Richardson 	return 0;
126a9de470cSBruce Richardson }
127a9de470cSBruce Richardson 
128a9de470cSBruce Richardson static int
test_debug(void)129a9de470cSBruce Richardson test_debug(void)
130a9de470cSBruce Richardson {
131a9de470cSBruce Richardson 	rte_dump_stack();
132a9de470cSBruce Richardson 	if (test_panic() < 0)
133a9de470cSBruce Richardson 		return -1;
134a9de470cSBruce Richardson 	if (test_exit() < 0)
135a9de470cSBruce Richardson 		return -1;
136a9de470cSBruce Richardson 	if (test_usage() < 0)
137a9de470cSBruce Richardson 		return -1;
138a9de470cSBruce Richardson 	return 0;
139a9de470cSBruce Richardson }
140a9de470cSBruce Richardson 
1413c60274cSJie Zhou #endif /* !RTE_EXEC_ENV_WINDOWS */
1423c60274cSJie Zhou 
143*e0a8442cSBruce Richardson REGISTER_FAST_TEST(debug_autotest, true, true, test_debug);
144