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