1 /*- 2 * BSD LICENSE 3 * 4 * Copyright(c) 2010-2014 Intel Corporation. All rights reserved. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 11 * * Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * * Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in 15 * the documentation and/or other materials provided with the 16 * distribution. 17 * * Neither the name of Intel Corporation nor the names of its 18 * contributors may be used to endorse or promote products derived 19 * from this software without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 25 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34 #include <string.h> 35 #include <stdio.h> 36 #include <stdint.h> 37 #include <stdarg.h> 38 #include <stdlib.h> 39 #include <errno.h> 40 #include <termios.h> 41 #include <ctype.h> 42 #include <sys/queue.h> 43 44 #ifdef RTE_LIBRTE_CMDLINE 45 #include <cmdline_rdline.h> 46 #include <cmdline_parse.h> 47 #include <cmdline_socket.h> 48 #include <cmdline.h> 49 extern cmdline_parse_ctx_t main_ctx[]; 50 #endif 51 52 #include <rte_memory.h> 53 #include <rte_memzone.h> 54 #include <rte_eal.h> 55 #include <rte_cycles.h> 56 #include <rte_log.h> 57 #include <rte_string_fns.h> 58 #ifdef RTE_LIBRTE_TIMER 59 #include <rte_timer.h> 60 #endif 61 62 #include "test.h" 63 64 #define RTE_LOGTYPE_APP RTE_LOGTYPE_USER1 65 66 const char *prgname; /* to be set to argv[0] */ 67 68 static const char *recursive_call; /* used in linuxapp for MP and other tests */ 69 70 static int 71 no_action(void){ return 0; } 72 73 static int 74 do_recursive_call(void) 75 { 76 unsigned i; 77 struct { 78 const char *env_var; 79 int (*action_fn)(void); 80 } actions[] = { 81 { "run_secondary_instances", test_mp_secondary }, 82 { "test_missing_c_flag", no_action }, 83 { "test_master_lcore_flag", no_action }, 84 { "test_invalid_n_flag", no_action }, 85 { "test_no_hpet_flag", no_action }, 86 { "test_whitelist_flag", no_action }, 87 { "test_invalid_b_flag", no_action }, 88 { "test_invalid_vdev_flag", no_action }, 89 { "test_invalid_r_flag", no_action }, 90 #ifdef RTE_LIBRTE_XEN_DOM0 91 { "test_dom0_misc_flags", no_action }, 92 #else 93 { "test_misc_flags", no_action }, 94 #endif 95 { "test_memory_flags", no_action }, 96 { "test_file_prefix", no_action }, 97 { "test_no_huge_flag", no_action }, 98 #ifdef RTE_LIBRTE_IVSHMEM 99 { "test_ivshmem", test_ivshmem }, 100 #endif 101 }; 102 103 if (recursive_call == NULL) 104 return -1; 105 for (i = 0; i < sizeof(actions)/sizeof(actions[0]); i++) { 106 if (strcmp(actions[i].env_var, recursive_call) == 0) 107 return (actions[i].action_fn)(); 108 } 109 printf("ERROR - missing action to take for %s\n", recursive_call); 110 return -1; 111 } 112 113 int 114 main(int argc, char **argv) 115 { 116 #ifdef RTE_LIBRTE_CMDLINE 117 struct cmdline *cl; 118 #endif 119 int ret; 120 121 ret = rte_eal_init(argc, argv); 122 if (ret < 0) 123 return -1; 124 125 #ifdef RTE_LIBRTE_TIMER 126 rte_timer_subsystem_init(); 127 #endif 128 129 if (commands_init() < 0) 130 return -1; 131 132 argv += ret; 133 134 prgname = argv[0]; 135 136 if ((recursive_call = getenv(RECURSIVE_ENV_VAR)) != NULL) 137 return do_recursive_call(); 138 139 #ifdef RTE_LIBEAL_USE_HPET 140 if (rte_eal_hpet_init(1) < 0) 141 #endif 142 RTE_LOG(INFO, APP, 143 "HPET is not enabled, using TSC as default timer\n"); 144 145 146 #ifdef RTE_LIBRTE_CMDLINE 147 cl = cmdline_stdin_new(main_ctx, "RTE>>"); 148 if (cl == NULL) { 149 return -1; 150 } 151 cmdline_interact(cl); 152 cmdline_stdin_exit(cl); 153 #endif 154 155 return 0; 156 } 157 158 159 int 160 unit_test_suite_runner(struct unit_test_suite *suite) 161 { 162 int test_success; 163 unsigned total = 0, executed = 0, skipped = 0, succeeded = 0, failed = 0; 164 165 if (suite->suite_name) { 166 printf(" + ------------------------------------------------------- +\n"); 167 printf(" + Test Suite : %s\n", suite->suite_name); 168 } 169 170 if (suite->setup) 171 if (suite->setup() != 0) 172 goto suite_summary; 173 174 printf(" + ------------------------------------------------------- +\n"); 175 176 while (suite->unit_test_cases[total].testcase) { 177 if (!suite->unit_test_cases[total].enabled) { 178 skipped++; 179 total++; 180 continue; 181 } else { 182 executed++; 183 } 184 185 /* run test case setup */ 186 if (suite->unit_test_cases[total].setup) 187 test_success = suite->unit_test_cases[total].setup(); 188 else 189 test_success = TEST_SUCCESS; 190 191 if (test_success == TEST_SUCCESS) { 192 /* run the test case */ 193 test_success = suite->unit_test_cases[total].testcase(); 194 if (test_success == TEST_SUCCESS) 195 succeeded++; 196 else 197 failed++; 198 } else { 199 failed++; 200 } 201 202 /* run the test case teardown */ 203 if (suite->unit_test_cases[total].teardown) 204 suite->unit_test_cases[total].teardown(); 205 206 if (test_success == TEST_SUCCESS) 207 printf(" + TestCase [%2d] : %s\n", total, 208 suite->unit_test_cases[total].success_msg ? 209 suite->unit_test_cases[total].success_msg : 210 "passed"); 211 else 212 printf(" + TestCase [%2d] : %s\n", total, 213 suite->unit_test_cases[total].fail_msg ? 214 suite->unit_test_cases[total].fail_msg : 215 "failed"); 216 217 total++; 218 } 219 220 /* Run test suite teardown */ 221 if (suite->teardown) 222 suite->teardown(); 223 224 goto suite_summary; 225 226 suite_summary: 227 printf(" + ------------------------------------------------------- +\n"); 228 printf(" + Test Suite Summary \n"); 229 printf(" + Tests Total : %2d\n", total); 230 printf(" + Tests Skipped : %2d\n", skipped); 231 printf(" + Tests Executed : %2d\n", executed); 232 printf(" + Tests Passed : %2d\n", succeeded); 233 printf(" + Tests Failed : %2d\n", failed); 234 printf(" + ------------------------------------------------------- +\n"); 235 236 if (failed) 237 return -1; 238 239 return 0; 240 } 241