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