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