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