1886da342Sopenharmony_ci/* 2886da342Sopenharmony_ci * Copyright (c) 2021-2022 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 {SuiteService, SpecService, ExpectService, ReportService} from './service'; 17886da342Sopenharmony_ciimport {ConfigService} from './module/config/configService'; 18886da342Sopenharmony_ciimport {SpecEvent, TaskEvent, SuiteEvent} from './event'; 19886da342Sopenharmony_ci 20886da342Sopenharmony_ci/** 21886da342Sopenharmony_ci * core service for execute testcase. 22886da342Sopenharmony_ci */ 23886da342Sopenharmony_ciclass Core { 24886da342Sopenharmony_ci static getInstance() { 25886da342Sopenharmony_ci if (!this.instance) { 26886da342Sopenharmony_ci this.instance = new Core(); 27886da342Sopenharmony_ci } 28886da342Sopenharmony_ci return this.instance; 29886da342Sopenharmony_ci } 30886da342Sopenharmony_ci 31886da342Sopenharmony_ci constructor() { 32886da342Sopenharmony_ci this.instance = null; 33886da342Sopenharmony_ci this.services = { 34886da342Sopenharmony_ci suite: {}, 35886da342Sopenharmony_ci spec: {}, 36886da342Sopenharmony_ci config: {}, 37886da342Sopenharmony_ci expect: {}, 38886da342Sopenharmony_ci log: {}, 39886da342Sopenharmony_ci report: {} 40886da342Sopenharmony_ci 41886da342Sopenharmony_ci }; 42886da342Sopenharmony_ci this.events = { 43886da342Sopenharmony_ci suite: {}, 44886da342Sopenharmony_ci spec: {}, 45886da342Sopenharmony_ci task: {} 46886da342Sopenharmony_ci }; 47886da342Sopenharmony_ci } 48886da342Sopenharmony_ci 49886da342Sopenharmony_ci addService(name, service) { 50886da342Sopenharmony_ci let serviceObj = {}; 51886da342Sopenharmony_ci if (!this.services[name]) { 52886da342Sopenharmony_ci this.services[name] = serviceObj; 53886da342Sopenharmony_ci } else { 54886da342Sopenharmony_ci serviceObj = this.services[name]; 55886da342Sopenharmony_ci } 56886da342Sopenharmony_ci serviceObj[service.id] = service; 57886da342Sopenharmony_ci } 58886da342Sopenharmony_ci 59886da342Sopenharmony_ci getDefaultService(name) { 60886da342Sopenharmony_ci return this.services[name].default; 61886da342Sopenharmony_ci } 62886da342Sopenharmony_ci 63886da342Sopenharmony_ci getServices(name) { 64886da342Sopenharmony_ci return this.services[name]; 65886da342Sopenharmony_ci } 66886da342Sopenharmony_ci 67886da342Sopenharmony_ci registerEvent(serviceName, event) { 68886da342Sopenharmony_ci let eventObj = {}; 69886da342Sopenharmony_ci if (!this.events[serviceName]) { 70886da342Sopenharmony_ci this.events[serviceName] = eventObj; 71886da342Sopenharmony_ci } else { 72886da342Sopenharmony_ci eventObj = this.events[serviceName]; 73886da342Sopenharmony_ci } 74886da342Sopenharmony_ci eventObj[event.id] = event; 75886da342Sopenharmony_ci } 76886da342Sopenharmony_ci 77886da342Sopenharmony_ci unRegisterEvent(serviceName, eventID) { 78886da342Sopenharmony_ci const eventObj = this.events[serviceName]; 79886da342Sopenharmony_ci if (eventObj) { 80886da342Sopenharmony_ci delete eventObj[eventID]; 81886da342Sopenharmony_ci } 82886da342Sopenharmony_ci } 83886da342Sopenharmony_ci 84886da342Sopenharmony_ci subscribeEvent(serviceName, serviceObj) { 85886da342Sopenharmony_ci const eventObj = this.events[serviceName]; 86886da342Sopenharmony_ci if (eventObj) { 87886da342Sopenharmony_ci for (const attr in eventObj) { 88886da342Sopenharmony_ci eventObj[attr]['subscribeEvent'](serviceObj); 89886da342Sopenharmony_ci } 90886da342Sopenharmony_ci } 91886da342Sopenharmony_ci } 92886da342Sopenharmony_ci 93886da342Sopenharmony_ci async fireEvents(serviceName, eventName) { 94886da342Sopenharmony_ci const eventObj = this.events[serviceName]; 95886da342Sopenharmony_ci if (!eventObj) { 96886da342Sopenharmony_ci return; 97886da342Sopenharmony_ci } 98886da342Sopenharmony_ci for (const attr in eventObj) { 99886da342Sopenharmony_ci await eventObj[attr][eventName](); 100886da342Sopenharmony_ci } 101886da342Sopenharmony_ci } 102886da342Sopenharmony_ci 103886da342Sopenharmony_ci addToGlobal(apis) { 104886da342Sopenharmony_ci if (typeof globalThis !== 'undefined') { 105886da342Sopenharmony_ci for (let api in apis) { 106886da342Sopenharmony_ci globalThis[api] = apis[api]; 107886da342Sopenharmony_ci } 108886da342Sopenharmony_ci } 109886da342Sopenharmony_ci for (const api in apis) { 110886da342Sopenharmony_ci this[api] = apis[api]; 111886da342Sopenharmony_ci } 112886da342Sopenharmony_ci } 113886da342Sopenharmony_ci 114886da342Sopenharmony_ci init() { 115886da342Sopenharmony_ci this.addService('suite', new SuiteService({id: 'default'})); 116886da342Sopenharmony_ci this.addService('spec', new SpecService({id: 'default'})); 117886da342Sopenharmony_ci this.addService('expect', new ExpectService({id: 'default'})); 118886da342Sopenharmony_ci this.addService('report', new ReportService({id: 'default'})); 119886da342Sopenharmony_ci this.addService('config', new ConfigService({id: 'default'})); 120886da342Sopenharmony_ci this.registerEvent('task', new TaskEvent({id: 'default', coreContext: this})); 121886da342Sopenharmony_ci this.registerEvent('suite', new SuiteEvent({id: 'default', coreContext: this})); 122886da342Sopenharmony_ci this.registerEvent('spec', new SpecEvent({id: 'default', coreContext: this})); 123886da342Sopenharmony_ci this.subscribeEvent('spec', this.getDefaultService('report')); 124886da342Sopenharmony_ci this.subscribeEvent('suite', this.getDefaultService('report')); 125886da342Sopenharmony_ci this.subscribeEvent('task', this.getDefaultService('report')); 126886da342Sopenharmony_ci const context = this; 127886da342Sopenharmony_ci for (const key in this.services) { 128886da342Sopenharmony_ci const serviceObj = this.services[key]; 129886da342Sopenharmony_ci for (const serviceID in serviceObj) { 130886da342Sopenharmony_ci const service = serviceObj[serviceID]; 131886da342Sopenharmony_ci service.init(context); 132886da342Sopenharmony_ci 133886da342Sopenharmony_ci if (typeof service.apis !== 'function') { 134886da342Sopenharmony_ci continue; 135886da342Sopenharmony_ci } 136886da342Sopenharmony_ci const apis = service.apis(); 137886da342Sopenharmony_ci if (apis) { 138886da342Sopenharmony_ci this.addToGlobal(apis); 139886da342Sopenharmony_ci } 140886da342Sopenharmony_ci } 141886da342Sopenharmony_ci } 142886da342Sopenharmony_ci } 143886da342Sopenharmony_ci 144886da342Sopenharmony_ci execute(abilityDelegator) { 145886da342Sopenharmony_ci const suiteService = this.getDefaultService('suite'); 146886da342Sopenharmony_ci const configService = this.getDefaultService('config'); 147886da342Sopenharmony_ci if (configService['dryRun'] === 'true') { 148886da342Sopenharmony_ci (async function () { 149886da342Sopenharmony_ci await suiteService.dryRun(abilityDelegator); 150886da342Sopenharmony_ci })(); 151886da342Sopenharmony_ci return; 152886da342Sopenharmony_ci } 153886da342Sopenharmony_ci setTimeout(() => { 154886da342Sopenharmony_ci suiteService.execute(); 155886da342Sopenharmony_ci }, 10); 156886da342Sopenharmony_ci } 157886da342Sopenharmony_ci} 158886da342Sopenharmony_ci 159886da342Sopenharmony_ciexport default Core; 160