1+ import { Environment } from "./environment" ;
2+ import { Playbook } from "./playbook" ;
3+ import { Runner } from "./runner" ;
4+ import { RunResult } from "./run_result" ;
5+
6+
7+ export class Engine {
8+
9+ private runners : Map < string , Runner > = new Map < string , Runner > ( ) ;
10+ private variables : Map < string , any > = new Map < string , any > ( ) ;
11+
12+ constructor ( private environmentName : string , private environment : Environment , private playbook : Playbook ) { }
13+
14+ async run ( ) {
15+ console . log ( "Environment: " + this . environmentName ) ;
16+ if ( ! await this . isEnvironmentComplete ( ) ) {
17+ if ( this . environment . failOnIncomplete ) {
18+ throw "Environment incomplete: " + this . environmentName ;
19+ }
20+ console . log ( "Environment incomplete: " + this . environmentName ) ;
21+ return ;
22+ }
23+ for ( let runnerIndex in this . environment . runners ) {
24+ ( await this . getRunner ( this . environment . runners [ runnerIndex ] ) ) . init ( this . playbook ) ;
25+ }
26+
27+ for ( let stepIndex in this . playbook . steps ) {
28+ for ( let lineIndex in this . playbook . steps [ stepIndex ] . lines ) {
29+ for ( let runnerIndex in this . environment . runners ) {
30+ let runner = await this . getRunner ( this . environment . runners [ runnerIndex ] ) ;
31+ if ( runner . supports ( this . playbook . steps [ stepIndex ] . lines [ lineIndex ] . name ) ) {
32+ var result = new RunResult ( ) ;
33+ try {
34+ result = runner . run ( this . playbook . steps [ stepIndex ] , this . playbook . steps [ stepIndex ] . lines [ lineIndex ] ) ;
35+ }
36+ catch ( e ) {
37+ result . exceptions . push ( e ) ;
38+ }
39+ await runner . assert ( this . playbook . steps [ stepIndex ] , this . playbook . steps [ stepIndex ] . lines [ lineIndex ] , result ) ;
40+ break ;
41+ }
42+ }
43+ }
44+ }
45+
46+ for ( let runnerIndex in this . environment . runners ) {
47+ ( await this . getRunner ( this . environment . runners [ runnerIndex ] ) ) . destroy ( this . playbook ) ;
48+ }
49+ }
50+
51+ public setVariable ( name : string , value : any ) {
52+ this . variables . set ( name , value ) ;
53+ }
54+
55+ private async isEnvironmentComplete ( ) : Promise < boolean > {
56+ for ( let stepIndex in this . playbook . steps ) {
57+ for ( let lineIndex in this . playbook . steps [ stepIndex ] . lines ) {
58+ let isSupported = false ;
59+ for ( let runnerIndex in this . environment . runners ) {
60+ if ( ( await this . getRunner ( this . environment . runners [ runnerIndex ] ) ) . supports ( this . playbook . steps [ stepIndex ] . lines [ lineIndex ] . name ) ) {
61+ isSupported = true ;
62+ break ;
63+ }
64+ }
65+ if ( ! isSupported ) {
66+ return false ;
67+ }
68+ }
69+ }
70+
71+ return true ;
72+ }
73+
74+ private async getRunner ( name : string ) : Promise < Runner > {
75+ if ( ! this . runners . has ( name ) ) {
76+ await this . loadRunner ( name ) ;
77+ }
78+ return this . runners . get ( name ) ;
79+ }
80+
81+ private async loadRunner ( name : string ) {
82+ let imp = await import ( "../runners/" + name + "/index" ) ;
83+ let map = new Map < string , any > ( ) ;
84+ for ( let index in imp ) {
85+ map . set ( index . toLowerCase ( ) , imp [ index ] ) ;
86+ }
87+ let runner : Runner = new ( map . get ( name . toLowerCase ( ) ) ) ;
88+ runner . registerGetVariableCallback ( ( name ) => this . variables . get ( name ) ) ;
89+ runner . registerSetVariableCallback ( ( name , value ) => this . setVariable ( name , value ) ) ;
90+ runner . path = __dirname + "/../runners/" + name + "/" ;
91+ runner . name = name ;
92+ runner . playbookName = this . playbook . name ;
93+ runner . playbookPath = this . playbook . path ;
94+ this . runners . set ( name , runner ) ;
95+ }
96+ }
0 commit comments