/* * Copyright (c) 2021-2023, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #include #include #include #include #include #include #include "service_under_test.h" #define TEST_ID_OFFSET (5) #define TEST_POSTFIX_OFFSET (8) #define TEST_ENTRY_LENGTH (9) int32_t val_entry(void); extern size_t val_get_test_list(uint32_t *test_id_list, size_t size); extern void pal_set_custom_test_list(char *custom_test_list); /* Returns whether option_switch is in the argv list and provide its index in the array */ static bool option_selected(const char *option_switch, int argc, char *argv[], int *index) { bool selected = false; *index = 0; for (int i = 1; (i < argc) && !selected; ++i) { selected = (strcmp(argv[i], option_switch) == 0); *index = i; } return selected; } /* Print the supported command line arguments */ static void print_help(void) { printf("Supported command line arguments:\n\n"); printf("\t -l: Print list of tests.\n"); printf("\t -t : Run only the listed tests (e.g: test_201;test_202;). test_list = ^(test_[0-9]{3};)+ \n"); printf("\t -v: Verbose mode.\n"); printf("\t -h: Print this help message.\n"); printf("\n"); } /* Prints the list of selectable psa-api tests */ static void print_psa_api_tests(void) { /* Request the number of tests to find out the size of the area needed to store the test ID-s. */ size_t n_test = val_get_test_list(NULL, 0); uint32_t *test_id_list = (uint32_t *)calloc(n_test, sizeof(uint32_t)); if (test_id_list) { n_test = val_get_test_list(test_id_list, n_test); printf("Available psa-api tests:\n"); for (int i = 0; i < n_test; i++) { printf("\t test_%d;\n", test_id_list[i]); } free(test_id_list); } else { printf("Could not allocate enough memory to store the list of tests\n"); } } /* Check if the received test list string is formatted as expected */ static bool is_test_list_wrong(char* test_list) { size_t len = strlen(test_list); for (unsigned i = 0; i < len; i += TEST_ENTRY_LENGTH) { /* Report error when the test entry is not properly finished */ if (i + TEST_ENTRY_LENGTH > len) { printf("Expecting \"test_xxx;\" test entry at the %dth character, got \"%s\" instead.\n", i, &test_list[i]); return true; } /* Report error at incorrect test entry prefix */ if (memcmp(&test_list[i], "test_", TEST_ID_OFFSET)) { printf("Expecting \"test_\" at the %dth character, got \"%.5s\" instead.\n", i, &test_list[i]); return true; } /* Report error if the test ID is incorrect */ if (!(isdigit(test_list[i + TEST_ID_OFFSET]) && isdigit(test_list[i + TEST_ID_OFFSET + 1]) && isdigit(test_list[i + TEST_ID_OFFSET + 2]))) { printf("Expecting three digits at the %dth character, got \"%.3s\" instead.\n", i + TEST_ID_OFFSET, &test_list[i + TEST_ID_OFFSET]); return true; } /* Report error at incorrect test entry postfix */ if (test_list[i + TEST_POSTFIX_OFFSET] != ';') { printf("Expecting ; at the %dth character, got \"%.1s\" instead.\n", i + TEST_POSTFIX_OFFSET, &test_list[i + TEST_POSTFIX_OFFSET]); return true; } } return false; } /* Entry point */ int main(int argc, char *argv[]) { int rval = -1; int option_index = 0; /* Print available tests */ if (option_selected("-l", argc, argv, &option_index)) { print_psa_api_tests(); return 0; } /* Create custom test list */ if (option_selected("-t", argc, argv, &option_index)) { /* Avoid overindexing of argv and detect if the option is followed by another option */ char *test_list_values = argv[option_index + 1]; if ((option_index >= argc) || (test_list_values[0] == '-')) { printf("Testlist string is expected after -t argument!\n"); return -1; } if (is_test_list_wrong(test_list_values)) { printf("Testlist string is not valid!\n"); print_psa_api_tests(); return -1; } /* Filter tests */ pal_set_custom_test_list(test_list_values); } /* Print help */ if (option_selected("-h", argc, argv, &option_index)) { print_help(); return 0; } /* Locate service under test */ rval = locate_service_under_test(); /* Run tests */ if (!rval) { rval = val_entry(); relinquish_service_under_test(); } else { printf("Failed to locate service under test. Error code: %d\n", rval); } return rval; }