| /* |
| * Copyright (c) 2017-2018,2020 The Linux Foundation. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are |
| * met: |
| * * Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * * Redistributions in binary form must reproduce the above |
| * copyright notice, this list of conditions and the following |
| * disclaimer in the documentation and/or other materials provided |
| * with the distribution. |
| * * Neither the name of The Linux Foundation nor the names of its |
| * contributors may be used to endorse or promote products derived |
| * from this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED |
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
| * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT |
| * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS |
| * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR |
| * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
| * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE |
| * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN |
| * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| * |
| * Changes from Qualcomm Innovation Center are provided under the following license: |
| * |
| * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted (subject to the limitations in the |
| * disclaimer below) provided that the following conditions are met: |
| * |
| * * Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * |
| * * Redistributions in binary form must reproduce the above |
| * copyright notice, this list of conditions and the following |
| * disclaimer in the documentation and/or other materials provided |
| * with the distribution. |
| * |
| * * Neither the name of Qualcomm Innovation Center, Inc. nor the names of its |
| * contributors may be used to endorse or promote products derived |
| * from this software without specific prior written permission. |
| * |
| * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE |
| * GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT |
| * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED |
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
| * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
| * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR |
| * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE |
| * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER |
| * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
| * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN |
| * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE |
| */ |
| |
| #include <getopt.h> |
| |
| #include "Logger.h" |
| #include "TestManager.h" |
| #include "TestsUtils.h" |
| #include <stdio.h> |
| #include <iostream> |
| #include <set> |
| /////////////////////////////////////////////////////////// |
| |
| Logger g_Logger(LOG_ERROR); |
| #define CHOOSER_MODE "--chooser" |
| #define SHOW_TEST_FLAG "--show_tests" |
| #define SHOW_SUIT_FLAG "--show_suites" |
| #define RUN_TEST_FLAG "--test" |
| #define RUN_SUIT_FLAG "--suite" |
| string sFormat = "ip_accelerator <control_flag> <suit/name>, ..., <suit/name>\n" |
| "contorl_flag = " RUN_TEST_FLAG " or " RUN_SUIT_FLAG "\n" |
| "ip_accelerator " SHOW_TEST_FLAG "\n" |
| "ip_accelerator " SHOW_SUIT_FLAG "\n" |
| "or ip_accelerator --chooser " |
| "for menu chooser interface\n"; |
| #define MAX_SUITES 19 |
| |
| #undef strcasesame |
| #define strcasesame(x, y) \ |
| (! strcasecmp((x), (y))) |
| |
| #undef legal_nat_mem_type |
| #define legal_nat_mem_type(mt) \ |
| ( strcasesame(mt, "DDR") || \ |
| strcasesame(mt, "SRAM") || \ |
| strcasesame(mt, "HYBRID") ) |
| |
| TestManager *testmanager = NULL; |
| |
| enum ipa_test_type{ |
| TEST = 1, |
| SUITE, |
| EXIT, |
| MAX_TYPE |
| }; |
| |
| const char *ipa_hw_type_name[] = { |
| "None", |
| "1.0", |
| "1.1", |
| "2.0", |
| "2.1", |
| "2.5/2.6", |
| "2.6L", |
| "Unused", |
| "Unused", |
| "Unused", |
| "3.0", |
| "3.1", |
| "3.5", |
| "3.5.1", |
| "4.0", |
| "4.1", |
| "4.2", |
| "4.5", |
| "4.7", |
| "4.9", |
| "4.11", |
| "5.0", |
| "5.1", |
| "5.5", |
| "MAX" |
| }; |
| |
| void BuildRegressionTestSuite() |
| { |
| TestBase *test; |
| |
| for (unsigned int i = 0; i < testmanager->m_testList.size(); i++) { |
| test = testmanager->m_testList[i]; |
| if (test->m_runInRegression) { |
| test->m_testSuiteName.push_back("Regression"); |
| } |
| } |
| } |
| |
| |
| /////////////////////////////////////////////////////////// |
| void showTests() |
| { |
| TestBase *test = testmanager->m_testList[0]; |
| |
| for (unsigned i = 0; i < testmanager->m_testList.size(); i++) { |
| test = testmanager->m_testList[i]; |
| string name = test->m_name, index = test->m_testSuiteName[0]; |
| |
| printf("%d) %s (part of %s suite" ,i+1, name.c_str(), index.c_str()); |
| for (unsigned j = 0; j < test->m_testSuiteName.size(); ++j) { |
| if ( test->m_testSuiteName[j] == index) |
| continue; |
| printf(", %s suite", |
| test->m_testSuiteName[j].c_str()); |
| index = test->m_testSuiteName[j]; |
| } |
| printf("), (%s <= HW Version <= %s)\n", |
| ipa_hw_type_name[test->m_minIPAHwType], |
| ipa_hw_type_name[test->m_maxIPAHwType]); |
| } |
| |
| // Example: |
| // 15) DmaModeMBIMggregationLoopTest (part of DmaMbim16Agg suite), (1.0 <= HW Version <= 2.1) |
| } |
| |
| void showSuits() |
| { |
| TestBase *test; |
| std::set<string> suiteSet; |
| int suiteIndex = 1; |
| |
| test = testmanager->m_testList[0]; |
| |
| for (unsigned i = 0; i < testmanager->m_testList.size(); i++) { |
| test = testmanager->m_testList[i]; |
| for (unsigned j = 0; j < test->m_testSuiteName.size() ; j++) |
| suiteSet.insert(test->m_testSuiteName[j]); |
| } |
| |
| for (std::set<string>::iterator i = suiteSet.begin(); |
| i != suiteSet.end(); suiteIndex++) { |
| printf("%d) %s\n", suiteIndex, (*i).c_str()); |
| ++i; |
| } |
| } |
| |
| void preparTests(int argc, char* argv[], |
| vector<string>& list) |
| { |
| for (int i = 2; i < argc; i++) |
| list.push_back(argv[i]); |
| } |
| |
| const char* getSuite(int suite_num) { |
| int count = 0, suiteIndex = 1; |
| string result = "error"; |
| TestBase *test = testmanager->m_testList[0]; |
| set<string> suiteSet; |
| |
| if (testmanager->m_testList.size() < 1) |
| return NULL; |
| |
| if (count == suite_num) |
| return testmanager->m_testList[0]->m_testSuiteName[0].c_str(); |
| |
| for (unsigned i = 0; i < testmanager->m_testList.size(); i++) { |
| test = testmanager->m_testList[i]; |
| for (unsigned j = 0; j < test->m_testSuiteName.size() ; j++) |
| suiteSet.insert(test->m_testSuiteName[j]); |
| } |
| |
| for (std::set<string>::iterator i = suiteSet.begin(); |
| i != suiteSet.end(); suiteIndex++) { |
| printf("%d) %s\n", suiteIndex, (*i).c_str()); |
| if (suiteIndex == suite_num) |
| return (*i).c_str(); |
| ++i; |
| } |
| return NULL; |
| } |
| |
| int chooserMode() { |
| vector<string> testSuiteList; |
| vector<string> testNameList; |
| unsigned int test_num; |
| int suite_num; |
| int type; |
| TestBase *test; |
| const char* res; |
| int result = 0; |
| char input_str[4]; |
| char* temp; |
| |
| printf("Welcome to the ip_accelerator\nChoose an option:\n"); |
| printf("1) Run tests\n2) Run suites\n3) Exit\nChoose an option: "); |
| temp = fgets(input_str, sizeof(input_str), stdin); |
| if (!temp) { |
| printf("Error: fgets returned nullptr !!"); |
| return -1; |
| } |
| type = atoi(input_str); |
| switch((enum ipa_test_type)type) { |
| case TEST: |
| BuildRegressionTestSuite(); |
| showTests(); |
| printf("Choose which test you wish to run: \n"); |
| fflush(stdin); |
| temp = fgets(input_str, sizeof(input_str), stdin); |
| if (!temp) { |
| printf("Error: fgets returned nullptr !!"); |
| return -1; |
| } |
| test_num = atoi(input_str); |
| if ( test_num > testmanager->m_testList.size()) { |
| printf("Invalid test number. Try again\n"); |
| result = -1; |
| break; |
| } |
| test = testmanager->m_testList[test_num-1]; |
| printf("Running Test %s\n", |
| test->m_name. |
| c_str()); |
| testNameList.push_back(test->m_name.c_str()); |
| BuildRegressionTestSuite(); |
| testmanager->Run(testSuiteList, testNameList); |
| testNameList.clear(); |
| break; |
| case SUITE: |
| BuildRegressionTestSuite(); |
| showSuits(); |
| printf("Choose which suite you wish to run: \n"); |
| fflush(stdin); |
| temp = fgets(input_str, sizeof(input_str), stdin); |
| if (!temp) { |
| printf("Error: fgets returned nullptr !!"); |
| return -1; |
| } |
| suite_num = atoi(input_str); |
| if (suite_num < 0 || suite_num > MAX_SUITES) { |
| printf("Invalid test number. Try again\n"); |
| result = -1; |
| break; |
| } |
| res = getSuite(suite_num); |
| if (!res) { |
| printf("Error in getSuite. Exiting\n"); |
| result = -1; |
| break; |
| } |
| testSuiteList.push_back(res); |
| testmanager->Run(testSuiteList, testNameList); |
| testSuiteList.clear(); |
| break; |
| default: |
| printf("Exiting\n"); |
| break; |
| } |
| return result; |
| } |
| |
| int scriptMode(int argc, char* argv[]) { |
| vector<string> testSuiteList; |
| vector<string> testNameList; |
| string sControlFlag; |
| |
| if (argc < 2) { |
| printf("please use correct format:\n%s", sFormat.c_str()); |
| return -1; |
| } |
| |
| sControlFlag = argv[1]; |
| |
| if (sControlFlag.find("--") == string::npos) { |
| printf("please use correct format:\n%s", sFormat.c_str()); |
| return -1; |
| } |
| |
| BuildRegressionTestSuite(); |
| |
| if (sControlFlag.compare(SHOW_TEST_FLAG) == 0) { |
| showTests(); |
| return 0; |
| } else if (sControlFlag.compare(SHOW_SUIT_FLAG) == 0) { |
| showSuits(); |
| return 0; |
| } |
| |
| if (sControlFlag.compare(RUN_TEST_FLAG) == 0) { |
| preparTests(argc, argv, testNameList); |
| } else if (sControlFlag.compare(RUN_SUIT_FLAG) == 0) { |
| preparTests(argc, argv, testSuiteList); |
| } else { |
| printf("please use correct format:\n%s", sFormat.c_str()); |
| return -1; |
| } |
| |
| testmanager->Run(testSuiteList, testNameList); |
| return 0; |
| } |
| |
| int main(int argc, char* argv[]) |
| { |
| string nat_mem_type = DFLT_NAT_MEM_TYPE; |
| |
| int c, result = 0, what = 0; |
| |
| int opt_idx = 0; |
| |
| struct option opts[] = { |
| /* These options set a flag. */ |
| {"chooser", no_argument, &what, 1}, |
| {"show_tests", no_argument, &what, 2}, |
| {"show_suites", no_argument, &what, 3}, |
| {"test", no_argument, &what, 4}, |
| {"suite", no_argument, &what, 5}, |
| {"mem", required_argument, 0, 'm'}, |
| {0, 0, 0, 0} |
| }; |
| |
| if (argc <= 1) { |
| printf("please use correct format:\n%s", sFormat.c_str()); |
| return -1; |
| } |
| |
| while ( (c = getopt_long(argc, argv, "", opts, &opt_idx)) != -1 ) |
| { |
| switch ( c ) |
| { |
| case 0: |
| break; |
| case 'm': |
| if ( legal_nat_mem_type(optarg) ) |
| { |
| nat_mem_type = optarg; |
| } |
| else |
| { |
| fprintf(stderr, "Illegal: --mem %s\n", optarg); |
| exit(1); |
| } |
| break; |
| default: |
| fprintf(stderr, "Illegal command line argument passed\n"); |
| printf("please use correct format:\n%s", sFormat.c_str()); |
| exit(1); |
| } |
| } |
| |
| if ( what == 0 ) { |
| printf("please use correct format:\n%s", sFormat.c_str()); |
| return -1; |
| } |
| |
| argc = 2; |
| |
| switch ( what ) |
| { |
| case 1: |
| argv[1] = (char*) CHOOSER_MODE; |
| break; |
| case 2: |
| argv[1] = (char*) SHOW_TEST_FLAG; |
| break; |
| case 3: |
| argv[1] = (char*) SHOW_SUIT_FLAG; |
| break; |
| case 4: |
| argv[1] = (char*) RUN_TEST_FLAG; |
| break; |
| case 5: |
| argv[1] = (char*) RUN_SUIT_FLAG; |
| break; |
| default: |
| printf("please use correct format:\n%s", sFormat.c_str()); |
| exit(1); |
| } |
| |
| testmanager = TestManager::GetInstance(nat_mem_type.c_str()); |
| |
| string sControlFlag = argv[1]; |
| |
| if (sControlFlag.compare(CHOOSER_MODE) == 0) { |
| result = chooserMode(); |
| } else { |
| result = scriptMode(argc, argv); |
| } |
| return result; |
| }//main |
| |
| //////////////////////////////////////////////////////////////////// |
| |