1886da342Sopenharmony_ci/*
2886da342Sopenharmony_ci * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
3886da342Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4886da342Sopenharmony_ci * you may not use this file except in compliance with the License.
5886da342Sopenharmony_ci * You may obtain a copy of the License at
6886da342Sopenharmony_ci *
7886da342Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8886da342Sopenharmony_ci *
9886da342Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10886da342Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11886da342Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12886da342Sopenharmony_ci * See the License for the specific language governing permissions and
13886da342Sopenharmony_ci * limitations under the License.
14886da342Sopenharmony_ci */
15886da342Sopenharmony_ci
16886da342Sopenharmony_ciimport { ClassFilter, NotClassFilter, SuiteAndItNameFilter, TestTypesFilter, NestFilter } from './Filter';
17886da342Sopenharmony_ciimport { TAG, TESTTYPE, LEVEL, SIZE, KEYSET } from '../../Constant';
18886da342Sopenharmony_ciconst STRESS_RULE = /^[1-9]\d*$/;
19886da342Sopenharmony_ci
20886da342Sopenharmony_ciclass ConfigService {
21886da342Sopenharmony_ci    constructor(attr) {
22886da342Sopenharmony_ci        this.id = attr.id;
23886da342Sopenharmony_ci        this.supportAsync = true; // 默认异步处理测试用例
24886da342Sopenharmony_ci        this.random = false;
25886da342Sopenharmony_ci        this.filterValid = [];
26886da342Sopenharmony_ci        this.filter = 0;
27886da342Sopenharmony_ci        this.flag = false;
28886da342Sopenharmony_ci        this.suite = null;
29886da342Sopenharmony_ci        this.itName = null;
30886da342Sopenharmony_ci        this.testType = null;
31886da342Sopenharmony_ci        this.level = null;
32886da342Sopenharmony_ci        this.size = null;
33886da342Sopenharmony_ci        this.class = null;
34886da342Sopenharmony_ci        this.notClass = null;
35886da342Sopenharmony_ci        this.timeout = null;
36886da342Sopenharmony_ci        // 遇错即停模式配置
37886da342Sopenharmony_ci        this.breakOnError = false;
38886da342Sopenharmony_ci        // 压力测试配置
39886da342Sopenharmony_ci        this.stress = null;
40886da342Sopenharmony_ci        this.skipMessage = false;
41886da342Sopenharmony_ci        this.runSkipped = '';
42886da342Sopenharmony_ci        this.filterXdescribe = [];
43886da342Sopenharmony_ci    }
44886da342Sopenharmony_ci
45886da342Sopenharmony_ci    init(coreContext) {
46886da342Sopenharmony_ci        this.coreContext = coreContext;
47886da342Sopenharmony_ci    }
48886da342Sopenharmony_ci
49886da342Sopenharmony_ci    isNormalInteger(str) {
50886da342Sopenharmony_ci        const n = Math.floor(Number(str));
51886da342Sopenharmony_ci        return n !== Infinity && String(n) === String(str) && n >= 0;
52886da342Sopenharmony_ci    }
53886da342Sopenharmony_ci
54886da342Sopenharmony_ci
55886da342Sopenharmony_ci    getStress() {
56886da342Sopenharmony_ci        if (this.stress === undefined || this.stress === '' || this.stress === null) {
57886da342Sopenharmony_ci            return 1;
58886da342Sopenharmony_ci        }
59886da342Sopenharmony_ci        return !this.stress.match(STRESS_RULE) ? 1 : Number.parseInt(this.stress);
60886da342Sopenharmony_ci    }
61886da342Sopenharmony_ci
62886da342Sopenharmony_ci    basicParamValidCheck(params) {
63886da342Sopenharmony_ci        let size = params.size;
64886da342Sopenharmony_ci        if (size !== undefined && size !== '' && size !== null) {
65886da342Sopenharmony_ci            let sizeArray = ['small', 'medium', 'large'];
66886da342Sopenharmony_ci            if (sizeArray.indexOf(size) === -1) {
67886da342Sopenharmony_ci                this.filterValid.push('size:' + size);
68886da342Sopenharmony_ci            }
69886da342Sopenharmony_ci        }
70886da342Sopenharmony_ci        let level = params.level;
71886da342Sopenharmony_ci        if (level !== undefined && level !== '' && level !== null) {
72886da342Sopenharmony_ci            let levelArray = ['0', '1', '2', '3', '4'];
73886da342Sopenharmony_ci            if (levelArray.indexOf(level) === -1) {
74886da342Sopenharmony_ci                this.filterValid.push('level:' + level);
75886da342Sopenharmony_ci            }
76886da342Sopenharmony_ci        }
77886da342Sopenharmony_ci        let testType = params.testType;
78886da342Sopenharmony_ci        if (testType !== undefined && testType !== '' && testType !== null) {
79886da342Sopenharmony_ci            let testTypeArray = ['function', 'performance', 'power', 'reliability', 'security',
80886da342Sopenharmony_ci                'global', 'compatibility', 'user', 'standard', 'safety', 'resilience'];
81886da342Sopenharmony_ci            if (testTypeArray.indexOf(testType) === -1) {
82886da342Sopenharmony_ci                this.filterValid.push('testType:' + testType);
83886da342Sopenharmony_ci            }
84886da342Sopenharmony_ci        }
85886da342Sopenharmony_ci    }
86886da342Sopenharmony_ci
87886da342Sopenharmony_ci    filterParamValidCheck(params) {
88886da342Sopenharmony_ci        let timeout = params.timeout;
89886da342Sopenharmony_ci        if (timeout !== undefined && timeout !== '' && timeout !== null) {
90886da342Sopenharmony_ci            if (!this.isNormalInteger(timeout)) {
91886da342Sopenharmony_ci                this.filterValid.push('timeout:' + timeout);
92886da342Sopenharmony_ci            }
93886da342Sopenharmony_ci        }
94886da342Sopenharmony_ci
95886da342Sopenharmony_ci        let paramKeys = ['dryRun', 'random', 'breakOnError', 'coverage', 'skipMessage'];
96886da342Sopenharmony_ci        for (const key of paramKeys) {
97886da342Sopenharmony_ci            if (params[key] !== undefined && params[key] !== 'true' && params[key] !== 'false') {
98886da342Sopenharmony_ci                this.filterValid.push(`${key}:${params[key]}`);
99886da342Sopenharmony_ci            }
100886da342Sopenharmony_ci        }
101886da342Sopenharmony_ci
102886da342Sopenharmony_ci        // 压力测试参数验证,正整数
103886da342Sopenharmony_ci        if (params.stress !== undefined && params.stress !== '' && params.stress !== null) {
104886da342Sopenharmony_ci            if (!params.stress.match(STRESS_RULE)) {
105886da342Sopenharmony_ci                this.filterValid.push('stress:' + params.stress);
106886da342Sopenharmony_ci            }
107886da342Sopenharmony_ci        }
108886da342Sopenharmony_ci
109886da342Sopenharmony_ci        let nameRule = /^[A-Za-z]{1}[\w#,.]*$/;
110886da342Sopenharmony_ci        let paramClassKeys = ['class', 'notClass'];
111886da342Sopenharmony_ci        for (const key of paramClassKeys) {
112886da342Sopenharmony_ci            if (params[key] !== undefined && params[key] !== '' && params[key] !== null) {
113886da342Sopenharmony_ci                let classArray = params[key].split(',');
114886da342Sopenharmony_ci                classArray.forEach(item => !item.match(nameRule) ? this.filterValid.push(`${key}:${params[key]}`) : null);
115886da342Sopenharmony_ci            }
116886da342Sopenharmony_ci        }
117886da342Sopenharmony_ci    }
118886da342Sopenharmony_ci
119886da342Sopenharmony_ci    setConfig(params) {
120886da342Sopenharmony_ci        this.basicParamValidCheck(params);
121886da342Sopenharmony_ci        this.filterParamValidCheck(params);
122886da342Sopenharmony_ci        try {
123886da342Sopenharmony_ci            this.class = params.class;
124886da342Sopenharmony_ci            this.notClass = params.notClass;
125886da342Sopenharmony_ci            this.flag = params.flag || { flag: false };
126886da342Sopenharmony_ci            this.suite = params.suite;
127886da342Sopenharmony_ci            this.itName = params.itName;
128886da342Sopenharmony_ci            this.filter = params.filter;
129886da342Sopenharmony_ci            this.testType = params.testType;
130886da342Sopenharmony_ci            this.level = params.level;
131886da342Sopenharmony_ci            this.size = params.size;
132886da342Sopenharmony_ci            this.timeout = params.timeout;
133886da342Sopenharmony_ci            this.dryRun = params.dryRun;
134886da342Sopenharmony_ci            this.breakOnError = params.breakOnError;
135886da342Sopenharmony_ci            this.random = params.random === 'true' ? true : false;
136886da342Sopenharmony_ci            this.stress = params.stress;
137886da342Sopenharmony_ci            this.coverage = params.coverage;
138886da342Sopenharmony_ci            this.skipMessage = params.skipMessage;
139886da342Sopenharmony_ci            this.runSkipped = params.runSkipped;
140886da342Sopenharmony_ci            this.filterParam = {
141886da342Sopenharmony_ci                testType: TESTTYPE,
142886da342Sopenharmony_ci                level: LEVEL,
143886da342Sopenharmony_ci                size: SIZE
144886da342Sopenharmony_ci            };
145886da342Sopenharmony_ci            this.parseParams();
146886da342Sopenharmony_ci        } catch (err) {
147886da342Sopenharmony_ci            console.info(`${TAG}setConfig error: ${err.message}`);
148886da342Sopenharmony_ci        }
149886da342Sopenharmony_ci    }
150886da342Sopenharmony_ci
151886da342Sopenharmony_ci    parseParams() {
152886da342Sopenharmony_ci        if (this.filter != null) {
153886da342Sopenharmony_ci            return;
154886da342Sopenharmony_ci        }
155886da342Sopenharmony_ci        let testTypeFilter = 0;
156886da342Sopenharmony_ci        let sizeFilter = 0;
157886da342Sopenharmony_ci        let levelFilter = 0;
158886da342Sopenharmony_ci        if (this.testType != null) {
159886da342Sopenharmony_ci            testTypeFilter = this.testType.split(',')
160886da342Sopenharmony_ci                .map(item => this.filterParam.testType[item] || 0)
161886da342Sopenharmony_ci                .reduce((pre, cur) => pre | cur, 0);
162886da342Sopenharmony_ci        }
163886da342Sopenharmony_ci        if (this.level != null) {
164886da342Sopenharmony_ci            levelFilter = this.level.split(',')
165886da342Sopenharmony_ci                .map(item => this.filterParam.level[item] || 0)
166886da342Sopenharmony_ci                .reduce((pre, cur) => pre | cur, 0);
167886da342Sopenharmony_ci        }
168886da342Sopenharmony_ci        if (this.size != null) {
169886da342Sopenharmony_ci            sizeFilter = this.size.split(',')
170886da342Sopenharmony_ci                .map(item => this.filterParam.size[item] || 0)
171886da342Sopenharmony_ci                .reduce((pre, cur) => pre | cur, 0);
172886da342Sopenharmony_ci        }
173886da342Sopenharmony_ci        this.filter = testTypeFilter | sizeFilter | levelFilter;
174886da342Sopenharmony_ci        console.info(`${TAG}filter params:${this.filter}`);
175886da342Sopenharmony_ci    }
176886da342Sopenharmony_ci
177886da342Sopenharmony_ci    isCurrentSuite(description) {
178886da342Sopenharmony_ci        if (this.suite !== undefined && this.suite !== '' && this.suite !== null) {
179886da342Sopenharmony_ci            let suiteArray = this.suite.split(',');
180886da342Sopenharmony_ci            return suiteArray.indexOf(description) !== -1;
181886da342Sopenharmony_ci        }
182886da342Sopenharmony_ci        return false;
183886da342Sopenharmony_ci    }
184886da342Sopenharmony_ci
185886da342Sopenharmony_ci    filterSuite(currentSuiteName) {
186886da342Sopenharmony_ci        let filterArray = [];
187886da342Sopenharmony_ci        if (this.suite !== undefined && this.suite !== '' && this.suite !== null) {
188886da342Sopenharmony_ci            filterArray.push(new SuiteAndItNameFilter(currentSuiteName, '', this.suite));
189886da342Sopenharmony_ci        }
190886da342Sopenharmony_ci        if (this.class !== undefined && this.class !== '' && this.class !== null) {
191886da342Sopenharmony_ci            filterArray.push(new ClassFilter(currentSuiteName, '', this.class));
192886da342Sopenharmony_ci        }
193886da342Sopenharmony_ci        if (this.notClass !== undefined && this.notClass !== '' && this.notClass !== null) {
194886da342Sopenharmony_ci            filterArray.push(new NotClassFilter(currentSuiteName, '', this.notClass));
195886da342Sopenharmony_ci        }
196886da342Sopenharmony_ci
197886da342Sopenharmony_ci        let result = filterArray.map(item => item.filterSuite()).reduce((pre, cur) => pre || cur, false);
198886da342Sopenharmony_ci        return result;
199886da342Sopenharmony_ci    }
200886da342Sopenharmony_ci
201886da342Sopenharmony_ci    filterDesc(currentSuiteName, desc, fi, coreContext) {
202886da342Sopenharmony_ci        let filterArray = [];
203886da342Sopenharmony_ci        if (this.itName !== undefined && this.itName !== '' && this.itName !== null) {
204886da342Sopenharmony_ci            filterArray.push(new SuiteAndItNameFilter(currentSuiteName, desc, this.itName));
205886da342Sopenharmony_ci        }
206886da342Sopenharmony_ci        if (this.class !== undefined && this.class !== '' && this.class !== null) {
207886da342Sopenharmony_ci            filterArray.push(new ClassFilter(currentSuiteName, desc, this.class));
208886da342Sopenharmony_ci        }
209886da342Sopenharmony_ci        if (this.notClass !== undefined && this.notClass !== '' && this.notClass !== null) {
210886da342Sopenharmony_ci            filterArray.push(new NotClassFilter(currentSuiteName, desc, this.notClass));
211886da342Sopenharmony_ci        }
212886da342Sopenharmony_ci        if (typeof (this.filter) !== 'undefined' && this.filter !== 0 && fi !== 0) {
213886da342Sopenharmony_ci            filterArray.push(new TestTypesFilter('', '', fi, this.filter));
214886da342Sopenharmony_ci        }
215886da342Sopenharmony_ci        let result = filterArray.map(item => item.filterIt()).reduce((pre, cur) => pre || cur, false);
216886da342Sopenharmony_ci        return result;
217886da342Sopenharmony_ci    }
218886da342Sopenharmony_ci
219886da342Sopenharmony_ci    filterWithNest(desc, filter) {
220886da342Sopenharmony_ci        let filterArray = [];
221886da342Sopenharmony_ci        const nestFilter = new NestFilter();
222886da342Sopenharmony_ci        const targetSuiteArray = this.coreContext.getDefaultService('suite').targetSuiteArray;
223886da342Sopenharmony_ci        const targetSpecArray = this.coreContext.getDefaultService('suite').targetSpecArray;
224886da342Sopenharmony_ci        const suiteStack = this.coreContext.getDefaultService('suite').suitesStack;
225886da342Sopenharmony_ci        let isFilter = nestFilter.filterNestName(targetSuiteArray, targetSpecArray, suiteStack, desc);
226886da342Sopenharmony_ci        const isFullRun = this.coreContext.getDefaultService('suite').fullRun;
227886da342Sopenharmony_ci        if (typeof (this.filter) !== 'undefined' && this.filter !== 0 && filter !== 0) {
228886da342Sopenharmony_ci            filterArray.push(new TestTypesFilter('', '', filter, this.filter));
229886da342Sopenharmony_ci            return filterArray.map(item => item.filterIt()).reduce((pre, cur) => pre || cur, false);
230886da342Sopenharmony_ci        }
231886da342Sopenharmony_ci        if (isFilter && !isFullRun) {
232886da342Sopenharmony_ci            return true;
233886da342Sopenharmony_ci        }
234886da342Sopenharmony_ci        return nestFilter.filterNotClass(this.notClass, suiteStack, desc);
235886da342Sopenharmony_ci
236886da342Sopenharmony_ci    }
237886da342Sopenharmony_ci
238886da342Sopenharmony_ci    isRandom() {
239886da342Sopenharmony_ci        return this.random || false;
240886da342Sopenharmony_ci    }
241886da342Sopenharmony_ci
242886da342Sopenharmony_ci    isBreakOnError() {
243886da342Sopenharmony_ci        return this.breakOnError !== 'true' ? false : true;
244886da342Sopenharmony_ci    }
245886da342Sopenharmony_ci
246886da342Sopenharmony_ci    setSupportAsync(value) {
247886da342Sopenharmony_ci        this.supportAsync = value;
248886da342Sopenharmony_ci    }
249886da342Sopenharmony_ci
250886da342Sopenharmony_ci    isSupportAsync() {
251886da342Sopenharmony_ci        return this.supportAsync;
252886da342Sopenharmony_ci    }
253886da342Sopenharmony_ci
254886da342Sopenharmony_ci    translateParams(parameters) {
255886da342Sopenharmony_ci        const keySet = new Set(KEYSET);
256886da342Sopenharmony_ci        let targetParams = {};
257886da342Sopenharmony_ci        for (const key in parameters) {
258886da342Sopenharmony_ci            if (keySet.has(key)) {
259886da342Sopenharmony_ci                var newKey = key.replace('-s ', '');
260886da342Sopenharmony_ci                targetParams[newKey] = parameters[key];
261886da342Sopenharmony_ci            }
262886da342Sopenharmony_ci        }
263886da342Sopenharmony_ci        return targetParams;
264886da342Sopenharmony_ci    }
265886da342Sopenharmony_ci    translateParamsToString(parameters) {
266886da342Sopenharmony_ci        const keySet = new Set(KEYSET);
267886da342Sopenharmony_ci        let targetParams = '';
268886da342Sopenharmony_ci        for (const key in parameters) {
269886da342Sopenharmony_ci            if (keySet.has(key)) {
270886da342Sopenharmony_ci                targetParams += ' ' + key + ' ' + parameters[key];
271886da342Sopenharmony_ci            }
272886da342Sopenharmony_ci        }
273886da342Sopenharmony_ci        return targetParams.trim();
274886da342Sopenharmony_ci    }
275886da342Sopenharmony_ci
276886da342Sopenharmony_ci    execute() {
277886da342Sopenharmony_ci    }
278886da342Sopenharmony_ci
279886da342Sopenharmony_ci    checkIfSuiteInSkipRun(desc) {
280886da342Sopenharmony_ci        return this.runSkipped.split(',').some(item => {
281886da342Sopenharmony_ci            return item === desc || item.startsWith(desc + '.') || item.startsWith(desc + '#') || desc.startsWith(item + '.') || this.runSkipped === 'skipped';
282886da342Sopenharmony_ci        });
283886da342Sopenharmony_ci    }
284886da342Sopenharmony_ci
285886da342Sopenharmony_ci    checkIfSpecInSkipRun(desc) {
286886da342Sopenharmony_ci        return this.runSkipped.split(',').some(item => {
287886da342Sopenharmony_ci            if (item.includes('#')) {
288886da342Sopenharmony_ci                return item === desc;
289886da342Sopenharmony_ci            } else {
290886da342Sopenharmony_ci                return desc.startsWith(item + '.') || desc.startsWith(item + '#') || this.runSkipped === 'skipped';
291886da342Sopenharmony_ci            }
292886da342Sopenharmony_ci        }
293886da342Sopenharmony_ci        );
294886da342Sopenharmony_ci    }
295886da342Sopenharmony_ci}
296886da342Sopenharmony_ci
297886da342Sopenharmony_ciexport {
298886da342Sopenharmony_ci    ConfigService
299886da342Sopenharmony_ci};
300