/* * 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 #include "Logger.h" #include "TestManager.h" #include "TestsUtils.h" #include #include #include /////////////////////////////////////////////////////////// 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 , ..., \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 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::iterator i = suiteSet.begin(); i != suiteSet.end(); suiteIndex++) { printf("%d) %s\n", suiteIndex, (*i).c_str()); ++i; } } void preparTests(int argc, char* argv[], vector& 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 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::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 testSuiteList; vector 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 testSuiteList; vector 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 ////////////////////////////////////////////////////////////////////