1 /* 2 * Copyright (c) Huawei Technologies Co., Ltd. 2018-2020. All rights reserved. 3 * Description: CPPTest框架中通过Flag标识实现用例过滤 4 */ 5 6 #include "gtest/hwext/gtest-filter.h" 7 #include "gtest/hwext/gtest-tag.h" 8 #include "gtest/hwext/gtest-utils.h" 9 10 namespace testing { 11 namespace ext { 12 13 const char* const TestFilter::kStrictFilter = "strict_tags"; 14 enum IndexEnum {A = 1, B, C, D, E, F, G, H, I, J, K}; 15 instance()16 TestFilter* TestFilter::instance() 17 { 18 static TestFilter* instance_ = NULL; 19 if (instance_ == NULL) { 20 instance_ = new TestFilter(); 21 instance_->reset(); 22 } 23 return instance_; 24 } 25 printHelp() const26 void TestFilter::printHelp() const 27 { 28 printf("\nTest Filtering:\n"); 29 const std::vector<const TestFlag*>& sets = AllHextTagSets(); 30 // help message line indents 31 const char* indents[] = { " ", " " }; 32 33 for (unsigned int i = 0; i < sets.size(); i++) { 34 sets.at(i)->printHelp(indents); 35 } 36 37 printf("%sSelect tests by test level, may be a list seperated by ',' or ';'.\n", indents[1]); 38 } 39 getAllFilterFlagsKv()40 map<const char*, string*>& TestFilter::getAllFilterFlagsKv() 41 { 42 // no need to consider concurrence so for, because we do 43 // this before running tests 44 if (flag_kvs_inited) { 45 return filterFlagsKv; 46 } 47 48 flag_kvs_inited = true; 49 const std::vector<const TestFlag*>& sets = AllHextTagSets(); 50 for (unsigned int i = 0; i < sets.size(); i++) { 51 filterFlagsKv.insert(pair<const char*, string*>(sets.at(i)->naming(), new string(""))); 52 } 53 54 // strict mode 55 filterFlagsKv.insert(pair<const char*, string*>(kStrictFilter, new string("false"))); 56 return filterFlagsKv; 57 } 58 postSetType(vector<string> vectemp)59 void TestFilter::postSetType (vector<string> vectemp) 60 { 61 for (size_t i = 0; i < vectemp.size(); i++) { 62 string curr = vectemp[i]; 63 if (curr == "Function") { 64 vecType.push_back(A); 65 } else if (curr == "Performance") { 66 vecType.push_back(B); 67 } else if (curr == "Power") { 68 vecType.push_back(C); 69 } else if (curr == "Reliability") { 70 vecType.push_back(D); 71 } else if (curr == "Security") { 72 vecType.push_back(E); 73 } else if (curr == "Global") { 74 vecType.push_back(F); 75 } else if (curr == "Compatibility") { 76 vecType.push_back(G); 77 } else if (curr == "User") { 78 vecType.push_back(H); 79 } else if (curr == "Standard") { 80 vecType.push_back(I); 81 } else if (curr == "Safety") { 82 vecType.push_back(J); 83 } else if (curr == "Resilience") { 84 vecType.push_back(K); 85 } 86 } 87 } 88 postSetSize(vector<string> vectemp)89 void TestFilter::postSetSize (vector<string> vectemp) 90 { 91 for (size_t i = 0; i < vectemp.size(); i++) { 92 string curr = vectemp[i]; 93 if (curr == "SmallTest") { 94 vecSize.push_back(A); 95 } else if (curr == "MediumTest") { 96 vecSize.push_back(B); 97 } else if (curr == "LargeTest") { 98 vecSize.push_back(C); 99 } 100 } 101 } 102 postSetRank(vector<string> vectemp)103 void TestFilter::postSetRank (vector<string> vectemp) 104 { 105 for (size_t i = 0; i < vectemp.size(); i++) { 106 string curr = vectemp[i]; 107 if (curr == "Level0") { 108 vecRank.push_back(A); 109 } else if (curr == "Level1") { 110 vecRank.push_back(B); 111 } else if (curr == "Level2") { 112 vecRank.push_back(C); 113 } else if (curr == "Level3") { 114 vecRank.push_back(D); 115 } else if (curr == "Level4") { 116 vecRank.push_back(E); 117 } 118 } 119 } 120 postParsingArguments()121 bool TestFilter::postParsingArguments() 122 { 123 if (ready || !flag_kvs_inited) { 124 // only run setup logic once 125 return true; 126 } 127 128 const char *kCandidateSeps = ",;|/"; 129 ready = true; 130 bool error = false; 131 map<const char*, string*>::iterator iter; 132 133 for (iter = filterFlagsKv.begin(); iter != filterFlagsKv.end(); iter++) { 134 const char *kstr = iter->first; 135 const char *vstr = iter->second->c_str(); 136 int flag = TestFlag::None; 137 138 if (compareStringsByIgnoreCase(kStrictFilter, kstr)) { 139 strictMode = compareStringsByIgnoreCase("true", vstr) || compareStringsByIgnoreCase("t", vstr); 140 } else if (flagForName(kstr, vstr, flag)) { 141 string strname = string(kstr); 142 string strval = string(vstr); 143 vector<string> vectemp = SplitString(strval, kCandidateSeps); 144 145 if (strname == "testsize") { 146 for (size_t i = 0; i < vectemp.size(); i++) { 147 string curr = vectemp[i]; 148 if (curr == "Level0") { 149 vecTestLevel.push_back(1); 150 } else if (curr == "Level1") { 151 vecTestLevel.push_back(2); 152 } else if (curr == "Level2") { 153 vecTestLevel.push_back(4); 154 } else if (curr == "Level3") { 155 vecTestLevel.push_back(8); 156 } else if (curr == "Level4") { 157 vecTestLevel.push_back(16); 158 } 159 } 160 } else if (strname == "type") { 161 this->postSetType(vectemp); 162 } else if (strname == "size") { 163 this->postSetSize(vectemp); 164 } else if (strname == "rank") { 165 this->postSetRank(vectemp); 166 } 167 } else { 168 // illegal arguments 169 error = true; 170 } 171 // free the newed strings 172 delete iter->second; 173 } 174 175 filterFlagsKv.clear(); 176 return !error; 177 } 178 accept(int flags) const179 bool TestFilter::accept(int flags) const 180 { 181 // both of flags and req_no should be accepted 182 if (!ready) { 183 return true; 184 } 185 186 int posType = 8; 187 int posSize = 4; 188 int level = (flags >> 24); 189 int type = (flags >> posType); 190 int size = (flags >> posSize); 191 int rank = flags; 192 bool flags_type = false; 193 bool flags_size = false; 194 bool flags_rank = false; 195 bool flags_level = false; 196 bool flags_accepted = false; 197 198 if (!strictMode) { 199 flags_type = IsElementInVector(vecType, type); 200 flags_size = IsElementInVector(vecSize, size); 201 flags_rank = IsElementInVector(vecRank, rank); 202 flags_level = IsElementInVector(vecTestLevel, level); 203 flags_accepted = (flags_type & flags_size & flags_rank) | (flags_level); 204 } 205 else { 206 flags_accepted = ((flags&requiredFlags) == requiredFlags); 207 } 208 209 if (!flags_accepted) { 210 return false; 211 } 212 213 return true; 214 } 215 reset()216 void TestFilter::reset() 217 { 218 filterFlagsKv.clear(); 219 requiredFlags = TestFlag::None; 220 flag_kvs_inited = false; 221 strictMode = false; 222 ready = false; 223 } 224 225 } // namespace ext 226 } // namespace testing