xref: /f-stack/dpdk/app/test/test_debug.c (revision 2d9fd380)
14418919fSjohnjiang /* SPDX-License-Identifier: BSD-3-Clause
24418919fSjohnjiang  * Copyright(c) 2010-2014 Intel Corporation
34418919fSjohnjiang  */
44418919fSjohnjiang 
54418919fSjohnjiang #include <stdio.h>
64418919fSjohnjiang #include <stdint.h>
74418919fSjohnjiang #include <sys/wait.h>
84418919fSjohnjiang #include <unistd.h>
94418919fSjohnjiang 
104418919fSjohnjiang #include <rte_debug.h>
114418919fSjohnjiang #include <rte_common.h>
124418919fSjohnjiang #include <rte_eal.h>
134418919fSjohnjiang #include <rte_service_component.h>
144418919fSjohnjiang 
154418919fSjohnjiang #include "test.h"
164418919fSjohnjiang 
174418919fSjohnjiang /*
184418919fSjohnjiang  * Debug test
194418919fSjohnjiang  * ==========
204418919fSjohnjiang  */
214418919fSjohnjiang 
224418919fSjohnjiang /* use fork() to test rte_panic() */
234418919fSjohnjiang static int
test_panic(void)244418919fSjohnjiang test_panic(void)
254418919fSjohnjiang {
264418919fSjohnjiang 	int pid;
274418919fSjohnjiang 	int status;
284418919fSjohnjiang 
294418919fSjohnjiang 	pid = fork();
304418919fSjohnjiang 
314418919fSjohnjiang 	if (pid == 0)
324418919fSjohnjiang 		rte_panic("Test Debug\n");
334418919fSjohnjiang 	else if (pid < 0){
344418919fSjohnjiang 		printf("Fork Failed\n");
354418919fSjohnjiang 		return -1;
364418919fSjohnjiang 	}
374418919fSjohnjiang 	wait(&status);
384418919fSjohnjiang 	if(status == 0){
394418919fSjohnjiang 		printf("Child process terminated normally!\n");
404418919fSjohnjiang 		return -1;
414418919fSjohnjiang 	} else
424418919fSjohnjiang 		printf("Child process terminated as expected - Test passed!\n");
434418919fSjohnjiang 
444418919fSjohnjiang 	return 0;
454418919fSjohnjiang }
464418919fSjohnjiang 
474418919fSjohnjiang /* use fork() to test rte_exit() */
484418919fSjohnjiang static int
test_exit_val(int exit_val)494418919fSjohnjiang test_exit_val(int exit_val)
504418919fSjohnjiang {
514418919fSjohnjiang 	int pid;
524418919fSjohnjiang 	int status;
534418919fSjohnjiang 
544418919fSjohnjiang 	/* manually cleanup EAL memory, as the fork() below would otherwise
554418919fSjohnjiang 	 * cause the same hugepages to be free()-ed multiple times.
564418919fSjohnjiang 	 */
574418919fSjohnjiang 	rte_service_finalize();
584418919fSjohnjiang 
594418919fSjohnjiang 	pid = fork();
604418919fSjohnjiang 
614418919fSjohnjiang 	if (pid == 0)
624418919fSjohnjiang 		rte_exit(exit_val, __func__);
634418919fSjohnjiang 	else if (pid < 0){
644418919fSjohnjiang 		printf("Fork Failed\n");
654418919fSjohnjiang 		return -1;
664418919fSjohnjiang 	}
674418919fSjohnjiang 	wait(&status);
684418919fSjohnjiang 	printf("Child process status: %d\n", status);
694418919fSjohnjiang 	if(!WIFEXITED(status) || WEXITSTATUS(status) != (uint8_t)exit_val){
704418919fSjohnjiang 		printf("Child process terminated with incorrect status (expected = %d)!\n",
714418919fSjohnjiang 				exit_val);
724418919fSjohnjiang 		return -1;
734418919fSjohnjiang 	}
744418919fSjohnjiang 	return 0;
754418919fSjohnjiang }
764418919fSjohnjiang 
774418919fSjohnjiang static int
test_exit(void)784418919fSjohnjiang test_exit(void)
794418919fSjohnjiang {
804418919fSjohnjiang 	int test_vals[] = { 0, 1, 2, 255, -1 };
814418919fSjohnjiang 	unsigned i;
82*2d9fd380Sjfb8856606 	for (i = 0; i < RTE_DIM(test_vals); i++) {
834418919fSjohnjiang 		if (test_exit_val(test_vals[i]) < 0)
844418919fSjohnjiang 			return -1;
854418919fSjohnjiang 	}
864418919fSjohnjiang 	printf("%s Passed\n", __func__);
874418919fSjohnjiang 	return 0;
884418919fSjohnjiang }
894418919fSjohnjiang 
904418919fSjohnjiang static void
dummy_app_usage(const char * progname)914418919fSjohnjiang dummy_app_usage(const char *progname)
924418919fSjohnjiang {
934418919fSjohnjiang 	RTE_SET_USED(progname);
944418919fSjohnjiang }
954418919fSjohnjiang 
964418919fSjohnjiang static int
test_usage(void)974418919fSjohnjiang test_usage(void)
984418919fSjohnjiang {
994418919fSjohnjiang 	if (rte_set_application_usage_hook(dummy_app_usage) != NULL) {
1004418919fSjohnjiang 		printf("Non-NULL value returned for initial usage hook\n");
1014418919fSjohnjiang 		return -1;
1024418919fSjohnjiang 	}
1034418919fSjohnjiang 	if (rte_set_application_usage_hook(NULL) != dummy_app_usage) {
1044418919fSjohnjiang 		printf("Incorrect value returned for application usage hook\n");
1054418919fSjohnjiang 		return -1;
1064418919fSjohnjiang 	}
1074418919fSjohnjiang 	return 0;
1084418919fSjohnjiang }
1094418919fSjohnjiang 
1104418919fSjohnjiang static int
test_debug(void)1114418919fSjohnjiang test_debug(void)
1124418919fSjohnjiang {
1134418919fSjohnjiang 	rte_dump_stack();
1144418919fSjohnjiang 	if (test_panic() < 0)
1154418919fSjohnjiang 		return -1;
1164418919fSjohnjiang 	if (test_exit() < 0)
1174418919fSjohnjiang 		return -1;
1184418919fSjohnjiang 	if (test_usage() < 0)
1194418919fSjohnjiang 		return -1;
1204418919fSjohnjiang 	return 0;
1214418919fSjohnjiang }
1224418919fSjohnjiang 
1234418919fSjohnjiang REGISTER_TEST_COMMAND(debug_autotest, test_debug);
124