• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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