1 /**
2 * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <stdint.h>
17 #include <string.h>
18 #include "securec.h"
19 #ifdef CONFIG_TESTSUITE_SUPPORT_MULTI_CORE
20 #include "debug_print.h"
21 #include "test_suite_ipc.h"
22 #endif
23 #include "test_suite_log.h"
24 #include "test_suite_console.h"
25 #include "test_suite_errors.h"
26 #include "test_suite.h"
27 #include "test_suite_functions_processor.h"
28
29 #define MIN_DOT_BUFFER_NUMBER 10
30
31 /* Maximum number of functions */
32 #ifdef CONFIG_TEST_SUITE_FUNCTIONS_MAX_FUNCS
33 #define TEST_SUITE_FUNCTIONS_MAX_FUNCS CONFIG_TEST_SUITE_FUNCTIONS_MAX_FUNCS
34 #else
35 #define TEST_SUITE_FUNCTIONS_MAX_FUNCS 400
36 #endif
37 /* Maximum number of arguments */
38 #define TEST_SUITE_FUNCTIONS_MAX_ARGS 20
39
40 typedef struct {
41 char *func_name;
42 char *func_description;
43 test_suite_function_callback_t func;
44 } test_suite_functions_t;
45
46 static uint32_t g_function_count = 0;
47 static test_suite_functions_t g_test_suite_functions_known_funcs[TEST_SUITE_FUNCTIONS_MAX_FUNCS];
48 static int32_t g_test_suite_functions_argc;
49 static char *g_test_suite_functions_argv[TEST_SUITE_FUNCTIONS_MAX_ARGS];
50
cmd_helper_split(char * result[],char res_len,char * string,char split_char)51 static char cmd_helper_split(char *result[], char res_len, char *string, char split_char)
52 {
53 /* replace split_char with '\0' and return the positions of the start of the strings */
54 int32_t i = 0;
55 bool new = true;
56 char *char_buf = string;
57
58 while (*char_buf != 0) {
59 if (new) {
60 result[i] = char_buf;
61 if (++i >= res_len) {
62 return (char)(i - 1);
63 }
64 new = false;
65 }
66 if (*char_buf == split_char) {
67 *char_buf = '\0';
68 new = true;
69 }
70 char_buf++;
71 }
72 return (char)i;
73 }
74
test_suite_function_unknown_func_reply(void)75 static void test_suite_function_unknown_func_reply(void)
76 {
77 test_suite_log_line("this is not a known function, try ? to list registered function");
78 }
79
test_suite_function_execute_func(char argc,char * argv[])80 static void test_suite_function_execute_func(char argc, char *argv[])
81 {
82 uint16_t function_to_execute;
83 uint16_t i;
84 int test_status;
85 char func_argc = argc;
86 char **func_argv = argv;
87
88 function_to_execute = (uint16_t)g_function_count; /* set by default a wrong value */
89
90 for (i = 0; i < g_function_count; i++) {
91 if (strcmp(g_test_suite_functions_known_funcs[i].func_name, *argv) == 0) {
92 function_to_execute = i;
93 func_argc--;
94 func_argv++;
95 break;
96 }
97 }
98
99 if (function_to_execute >= (signed)g_function_count) {
100 test_suite_function_unknown_func_reply();
101 test_status = TEST_SUITE_UNKNOWN_FUNCTION;
102 test_suite_log_set_test_result(test_status);
103 #if (CORE == TEST_SUITE_CORE_IMPLEMENTING_THE_CONSOLE)
104 test_suite_console_display_test_status(test_status);
105 #else
106 test_suite_log_send_test_status(test_status);
107 #endif
108 return;
109 }
110 test_suite_log_string("Starting function ");
111 test_suite_log_line(g_test_suite_functions_known_funcs[function_to_execute].func_name);
112
113 test_status = g_test_suite_functions_known_funcs[function_to_execute].func(func_argc, func_argv);
114 test_suite_log_set_test_result(test_status);
115 #if (CORE == TEST_SUITE_CORE_IMPLEMENTING_THE_CONSOLE)
116 test_suite_console_display_test_status(test_status);
117 #else
118 test_suite_log_send_test_status(test_status);
119 #endif
120 }
121
test_suite_function_add_func(char * name,char * description,test_suite_function_callback_t func)122 errcode_t test_suite_function_add_func(char *name, char *description, test_suite_function_callback_t func)
123 {
124 if (g_function_count + 1 >= TEST_SUITE_FUNCTIONS_MAX_FUNCS) {
125 return ERRCODE_FAIL;
126 }
127 g_test_suite_functions_known_funcs[g_function_count].func_name = name;
128 g_test_suite_functions_known_funcs[g_function_count].func_description = description;
129 g_test_suite_functions_known_funcs[g_function_count].func = func;
130 g_function_count++;
131 return ERRCODE_SUCC;
132 }
133
test_suite_function_init(void)134 void test_suite_function_init(void)
135 {
136 g_function_count = 0;
137 (void)memset_s(g_test_suite_functions_known_funcs, sizeof(test_suite_functions_t) * \
138 TEST_SUITE_FUNCTIONS_MAX_FUNCS, 0, sizeof(test_suite_functions_t) * \
139 TEST_SUITE_FUNCTIONS_MAX_FUNCS);
140 }
141
test_suite_function_deinit(void)142 void test_suite_function_deinit(void)
143 {
144 g_function_count = 0;
145 (void)memset_s(g_test_suite_functions_known_funcs, sizeof(test_suite_functions_t) * \
146 TEST_SUITE_FUNCTIONS_MAX_FUNCS, 0, sizeof(test_suite_functions_t) * \
147 TEST_SUITE_FUNCTIONS_MAX_FUNCS);
148 }
149
test_suite_function_list_func(void)150 void test_suite_function_list_func(void)
151 {
152 uint32_t strlen_max = 0;
153 uint32_t l, i, j, c;
154
155 for (i = 0; i < g_function_count; i++) {
156 l = (uint32_t)strlen((char *)g_test_suite_functions_known_funcs[i].func_name);
157 if (l > strlen_max) {
158 strlen_max = l;
159 }
160 }
161 for (i = 0; i < g_function_count; i++) {
162 test_suite_log_string(g_test_suite_functions_known_funcs[i].func_name);
163 c = (uint32_t)(strlen_max + MIN_DOT_BUFFER_NUMBER -
164 strlen((char *)g_test_suite_functions_known_funcs[i].func_name));
165 test_suite_log_string(" ");
166 for (j = 1; j < c; j++) {
167 test_suite_log_string(".");
168 }
169 test_suite_log_line(g_test_suite_functions_known_funcs[i].func_description);
170 }
171 return;
172 }
173
test_suite_function_execute_command(char * command)174 void test_suite_function_execute_command(char *command)
175 {
176 /* initialise the command array to zeros. */
177 for (int32_t i = 0; i < TEST_SUITE_FUNCTIONS_MAX_ARGS; i++) {
178 g_test_suite_functions_argv[i] = 0;
179 }
180 g_test_suite_functions_argc = cmd_helper_split(g_test_suite_functions_argv, TEST_SUITE_FUNCTIONS_MAX_ARGS,
181 command, ' ');
182 test_suite_function_execute_func((char)g_test_suite_functions_argc, g_test_suite_functions_argv);
183 }
184