@nsshunt/stsappframework 3.1.162 → 3.1.164
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/testertesting/app.js +34 -4
- package/dist/testertesting/app.js.map +1 -1
- package/dist/testertesting/commonTypes.js +6 -0
- package/dist/testertesting/commonTypes.js.map +1 -1
- package/dist/testertesting/testCase01.js +84 -0
- package/dist/testertesting/testCase01.js.map +1 -0
- package/dist/testertesting/workerInstance.js +98 -19
- package/dist/testertesting/workerInstance.js.map +1 -1
- package/dist/testertesting/workerManager.js +69 -15
- package/dist/testertesting/workerManager.js.map +1 -1
- package/dist/testertesting/workerWorkerTestRunner01.js +39 -14
- package/dist/testertesting/workerWorkerTestRunner01.js.map +1 -1
- package/package.json +1 -1
- package/src/testertesting/app.ts +42 -7
- package/src/testertesting/commonTypes.ts +34 -9
- package/src/testertesting/testCase01.ts +107 -0
- package/src/testertesting/workerInstance.ts +117 -24
- package/src/testertesting/workerManager.ts +78 -18
- package/src/testertesting/workerWorkerTestRunner01.ts +24 -2
- package/types/testertesting/commonTypes.d.ts +39 -8
- package/types/testertesting/commonTypes.d.ts.map +1 -1
- package/types/testertesting/testCase01.d.ts +13 -0
- package/types/testertesting/testCase01.d.ts.map +1 -0
- package/types/testertesting/workerInstance.d.ts +9 -2
- package/types/testertesting/workerInstance.d.ts.map +1 -1
- package/types/testertesting/workerManager.d.ts +2 -0
- package/types/testertesting/workerManager.d.ts.map +1 -1
- package/types/testertesting/workerWorkerTestRunner01.d.ts +5 -1
- package/types/testertesting/workerWorkerTestRunner01.d.ts.map +1 -1
|
@@ -3,13 +3,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.WorkerWorkerTestRunner01 = void 0;
|
|
6
|
+
exports.WorkerTestCases = exports.WorkerWorkerTestRunner01 = void 0;
|
|
7
7
|
/* eslint @typescript-eslint/no-unused-vars: 0, @typescript-eslint/no-explicit-any: 0 */ // --> OFF
|
|
8
8
|
const chalk_1 = __importDefault(require("chalk"));
|
|
9
9
|
// Force chalk level
|
|
10
10
|
chalk_1.default.level = 3;
|
|
11
|
-
const commonTypes_1 = require("./commonTypes");
|
|
12
11
|
const workerInstance_1 = require("./workerInstance");
|
|
12
|
+
const testCase01_1 = require("./testCase01");
|
|
13
13
|
const debug = (message) => {
|
|
14
14
|
console.log(chalk_1.default.blue(`pid: [${process.pid}] workerWorkerTestRunner01::${message}`));
|
|
15
15
|
};
|
|
@@ -79,53 +79,78 @@ class WorkerWorkerTestRunner01 extends workerInstance_1.WorkerInstance {
|
|
|
79
79
|
runner.instrumentData.tx += parseInt(val);
|
|
80
80
|
});
|
|
81
81
|
*/
|
|
82
|
-
|
|
83
|
-
|
|
82
|
+
/*
|
|
83
|
+
while (runner.state !== IRunnerState.stopped) {
|
|
84
|
+
|
|
85
|
+
await Sleep(0);
|
|
84
86
|
//let retVal = await tester.StartTest();
|
|
87
|
+
|
|
85
88
|
runner.instrumentData.coreCount = 1;
|
|
86
|
-
|
|
87
|
-
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
const options = runner.options as IRunnerOptionsEx;
|
|
92
|
+
|
|
93
|
+
await Sleep(options.sleepDuration);
|
|
94
|
+
|
|
88
95
|
runner.instrumentData.timer++;
|
|
89
96
|
runner.instrumentData.requestCount++;
|
|
90
97
|
runner.instrumentData.velocity = options.messageMod;
|
|
98
|
+
|
|
91
99
|
//runner.instrumentData.tx += 256;
|
|
92
100
|
//runner.instrumentData.rx += 6500;
|
|
101
|
+
|
|
93
102
|
if (runner.instrumentData.requestCount % options.logMessageMod === 0) {
|
|
94
103
|
this.GenLogMessage(runner);
|
|
95
104
|
}
|
|
105
|
+
|
|
96
106
|
if (runner.instrumentData.requestCount % options.messageMod === 0) {
|
|
97
107
|
this.PostTelemetry(runner);
|
|
98
|
-
runner.instrumentData.message = [];
|
|
108
|
+
runner.instrumentData.message = [ ];
|
|
99
109
|
runner.instrumentData.tx = 0;
|
|
100
110
|
runner.instrumentData.rx = 0;
|
|
101
111
|
}
|
|
102
112
|
if (runner.instrumentData.requestCount % 1000 === 0) {
|
|
103
113
|
const message = `Worker: [${runner.asyncRunnerContext.threadId}], Runner: [${runner.asyncRunnerContext.asyncRunnerId}] has completed: [${runner.instrumentData.requestCount}] iterations of max: [${options.iterations}]`;
|
|
104
114
|
console.log(message);
|
|
105
|
-
runner.instrumentData.message = [message]
|
|
115
|
+
runner.instrumentData.message = [message]
|
|
106
116
|
this.PostTelemetry(runner);
|
|
107
|
-
runner.instrumentData.message = [];
|
|
117
|
+
runner.instrumentData.message = [ ];
|
|
108
118
|
runner.instrumentData.tx = 0;
|
|
109
119
|
runner.instrumentData.rx = 0;
|
|
120
|
+
|
|
110
121
|
}
|
|
111
122
|
if (runner.instrumentData.requestCount > options.iterations) {
|
|
112
|
-
runner.state =
|
|
123
|
+
runner.state = IRunnerState.stopped;
|
|
113
124
|
const message = `Worker: [${runner.asyncRunnerContext.threadId}], Runner: [${runner.asyncRunnerContext.asyncRunnerId}] stopping ...`;
|
|
114
125
|
console.log(message);
|
|
115
|
-
runner.instrumentData.message = [message]
|
|
126
|
+
runner.instrumentData.message = [message]
|
|
116
127
|
this.PostTelemetry(runner);
|
|
117
|
-
runner.instrumentData.message = [];
|
|
128
|
+
runner.instrumentData.message = [ ];
|
|
118
129
|
runner.instrumentData.tx = 0;
|
|
119
130
|
runner.instrumentData.rx = 0;
|
|
120
131
|
}
|
|
121
132
|
}
|
|
133
|
+
*/
|
|
122
134
|
};
|
|
123
135
|
}
|
|
124
136
|
exports.WorkerWorkerTestRunner01 = WorkerWorkerTestRunner01;
|
|
137
|
+
class WorkerTestCases extends workerInstance_1.WorkerInstance {
|
|
138
|
+
constructor() {
|
|
139
|
+
super();
|
|
140
|
+
}
|
|
141
|
+
CreateAsyncRunner = (testRunnerTelemetryPayload) => {
|
|
142
|
+
const { runner } = testRunnerTelemetryPayload;
|
|
143
|
+
switch (runner.options.testType) {
|
|
144
|
+
case 'TestCase01':
|
|
145
|
+
return new testCase01_1.TestCase01(this, runner);
|
|
146
|
+
}
|
|
147
|
+
return null;
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
exports.WorkerTestCases = WorkerTestCases;
|
|
125
151
|
const worker_threads_1 = require("worker_threads");
|
|
126
|
-
const stsutils_1 = require("@nsshunt/stsutils");
|
|
127
152
|
let messagePort;
|
|
128
|
-
const worker = new
|
|
153
|
+
const worker = new WorkerTestCases();
|
|
129
154
|
worker_threads_1.parentPort?.on('message', (data) => {
|
|
130
155
|
worker.ProcessMessage(data);
|
|
131
156
|
/*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workerWorkerTestRunner01.js","sourceRoot":"","sources":["../../src/testertesting/workerWorkerTestRunner01.ts"],"names":[],"mappings":";;;;;;AAAA,yFAAyF,CAAE,UAAU;AACrG,kDAA0B;AAC1B,oBAAoB;AACpB,eAAK,CAAC,KAAK,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"workerWorkerTestRunner01.js","sourceRoot":"","sources":["../../src/testertesting/workerWorkerTestRunner01.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/testertesting/app.ts
CHANGED
|
@@ -15,11 +15,14 @@ import { IContextBase, AgentInstrumentController, IPublishInstrumentControllerOp
|
|
|
15
15
|
InstrumentDefinitions, InstrumentLogOptions, InstrumentGaugeOptions, PublishTransportRESTServer,
|
|
16
16
|
TransportType, IPublishTransportRESTServerOptions } from '@nsshunt/stsobservability'
|
|
17
17
|
|
|
18
|
-
import { ModelDelimeter, type ISTSLogger, defaultLogger } from '@nsshunt/stsutils'
|
|
18
|
+
import { ModelDelimeter, type ISTSLogger, defaultLogger, JSONObject } from '@nsshunt/stsutils'
|
|
19
19
|
|
|
20
20
|
import { v4 as uuidv4 } from 'uuid';
|
|
21
21
|
|
|
22
22
|
import { goptions } from '@nsshunt/stsconfig'
|
|
23
|
+
import { JsonWebTokenError } from 'jsonwebtoken';
|
|
24
|
+
|
|
25
|
+
import { IRunnerOptionsEx } from './testCase01'
|
|
23
26
|
|
|
24
27
|
declare interface IAsyncRunnerContext extends IContextBase {
|
|
25
28
|
id: string;
|
|
@@ -207,20 +210,52 @@ if (cluster.isPrimary) {
|
|
|
207
210
|
});
|
|
208
211
|
const worker = await wm.AddWorker();
|
|
209
212
|
|
|
210
|
-
const runnerOptions:
|
|
211
|
-
|
|
212
|
-
|
|
213
|
+
const runnerOptions: IRunnerOptionsEx = {
|
|
214
|
+
testType: 'TestCase01',
|
|
215
|
+
executionProfile: {
|
|
216
|
+
iterations: 50,
|
|
217
|
+
delayBetweenIterations: 250
|
|
218
|
+
},
|
|
219
|
+
sleepDuration: 0,
|
|
213
220
|
messageMod: 1,
|
|
214
221
|
logMessageMod: 1
|
|
215
|
-
}
|
|
222
|
+
};
|
|
216
223
|
|
|
217
224
|
const runner1 = worker.AddRunner(runnerOptions);
|
|
218
|
-
runner1.
|
|
225
|
+
runner1.on('Completed', () => {
|
|
226
|
+
console.log(chalk.rgb(10, 100, 250)(`Completed event handler for runner 1`));
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
worker.StartRunner(runner1);
|
|
219
230
|
|
|
220
231
|
const runner2 = wm.AddRunnerToWorker(worker, runnerOptions);
|
|
221
232
|
runner2.Start();
|
|
233
|
+
runner2.on('Completed', () => {
|
|
234
|
+
console.log(chalk.rgb(100, 10, 250)(`Completed event handler for runner 2`));
|
|
235
|
+
});
|
|
222
236
|
|
|
223
|
-
wm.AddRunnerToWorker(worker, runnerOptions).
|
|
237
|
+
wm.AddRunnerToWorker(worker, runnerOptions).on('Completed', () => {
|
|
238
|
+
console.log(chalk.rgb(250, 100, 25)(`Completed event handler for runner 3`));
|
|
239
|
+
}).Start();
|
|
240
|
+
|
|
241
|
+
setTimeout(() => {
|
|
242
|
+
runner2.Pause();
|
|
243
|
+
setTimeout(() => {
|
|
244
|
+
runner2.Resume();
|
|
245
|
+
setTimeout(() => {
|
|
246
|
+
runner2.Reset();
|
|
247
|
+
setTimeout(() => {
|
|
248
|
+
runner2.Start();
|
|
249
|
+
setTimeout(() => {
|
|
250
|
+
runner2.Stop();
|
|
251
|
+
setTimeout(() => {
|
|
252
|
+
runner2.Terminate();
|
|
253
|
+
}, 2000);
|
|
254
|
+
}, 2000);
|
|
255
|
+
}, 100);
|
|
256
|
+
}, 2000);
|
|
257
|
+
}, 2000);
|
|
258
|
+
}, 2000);
|
|
224
259
|
};
|
|
225
260
|
PerformTesting();
|
|
226
261
|
|
|
@@ -31,6 +31,12 @@ export enum eIWMessageCommands {
|
|
|
31
31
|
AddAsyncRunner = '__STS__AddAsyncRunner',
|
|
32
32
|
StopAllAsyncRunners = '__STS__StopAllAsyncRunners',
|
|
33
33
|
StartRunner = '__STS__StartRunner',
|
|
34
|
+
StopRunner = '__STS__StopRunner',
|
|
35
|
+
PauseRunner = '__STS__PauseRunner',
|
|
36
|
+
ResumeRunner = '__STS__ResumeRunner',
|
|
37
|
+
ResetRunner = '__STS__ResetRunner',
|
|
38
|
+
ExecuteRunner = '__STS__ExecuteRunner',
|
|
39
|
+
Completed = '__STS__Completed'
|
|
34
40
|
}
|
|
35
41
|
|
|
36
42
|
/**
|
|
@@ -87,11 +93,12 @@ export interface IRunnerTelemetry {
|
|
|
87
93
|
}
|
|
88
94
|
|
|
89
95
|
export interface IRunner {
|
|
90
|
-
id: number
|
|
91
|
-
asyncRunnerContext: IAsyncRunnerContext
|
|
92
|
-
options: IRunnerOptions
|
|
93
|
-
|
|
94
|
-
instrumentData: IRunnerTelemetry
|
|
96
|
+
get id(): number
|
|
97
|
+
get asyncRunnerContext(): IAsyncRunnerContext
|
|
98
|
+
get options(): IRunnerOptions
|
|
99
|
+
set options(options: IRunnerOptions)
|
|
100
|
+
get instrumentData(): IRunnerTelemetry
|
|
101
|
+
set instrumentData(newRunnerTelemetry: IRunnerTelemetry)
|
|
95
102
|
}
|
|
96
103
|
|
|
97
104
|
export interface IRunnerEx extends IRunner {
|
|
@@ -100,8 +107,14 @@ export interface IRunnerEx extends IRunner {
|
|
|
100
107
|
Pause: () => Promise<boolean>
|
|
101
108
|
Resume: () => Promise<boolean>
|
|
102
109
|
Stop: () => Promise<boolean>
|
|
103
|
-
|
|
104
|
-
|
|
110
|
+
Terminate: () => Promise<boolean>
|
|
111
|
+
Reset: () => Promise<boolean>
|
|
112
|
+
Execute: (iteration: number) => Promise<boolean> // Execute a single iteration for this test
|
|
113
|
+
on: (eventName: string, cb: () => void) => IRunnerEx
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export interface IRunnerInstance {
|
|
117
|
+
Execute: (iteration: number) => Promise<boolean> // Execute a single iteration for this test
|
|
105
118
|
}
|
|
106
119
|
|
|
107
120
|
export enum IWorkerState {
|
|
@@ -133,19 +146,32 @@ export interface IPrimaryWorker {
|
|
|
133
146
|
ProcessMessageFromWorker(workerPort: MessagePort, publishMessagePayload: IIWMessagePayload): Promise<void>
|
|
134
147
|
}
|
|
135
148
|
|
|
136
|
-
|
|
149
|
+
export interface IExecutionProfile {
|
|
150
|
+
iterations: number
|
|
151
|
+
delayBetweenIterations: number
|
|
152
|
+
}
|
|
153
|
+
|
|
137
154
|
export interface IRunnerOptions {
|
|
155
|
+
testType: string
|
|
156
|
+
executionProfile: IExecutionProfile
|
|
157
|
+
}
|
|
138
158
|
|
|
159
|
+
export interface IRunnerEvent {
|
|
160
|
+
eventName: string
|
|
161
|
+
cb: () => void
|
|
139
162
|
}
|
|
140
163
|
|
|
141
164
|
export interface IWorkerEx extends IWorker {
|
|
142
165
|
worker: Worker
|
|
143
166
|
primaryWorker: IPrimaryWorker
|
|
144
167
|
runnersEx: Record<string, IRunnerEx>
|
|
168
|
+
runnersEvents: Record<string, IRunnerEvent[]>
|
|
145
169
|
GetRunner(id: string): IRunnerEx | null
|
|
146
170
|
AddRunner: (runnerOptions: IRunnerOptions) => IRunnerEx
|
|
147
171
|
StartRunner: (runner: IRunnerEx) => Promise<boolean>
|
|
148
172
|
StopRunner: (runner: IRunnerEx) => Promise<boolean>
|
|
173
|
+
PauseRunner: (runner: IRunnerEx) => Promise<boolean>
|
|
174
|
+
ResumeRunner: (runner: IRunnerEx) => Promise<boolean>
|
|
149
175
|
Stop: () => Promise<boolean>
|
|
150
176
|
}
|
|
151
177
|
|
|
@@ -194,4 +220,3 @@ export interface IIWMessagePayload {
|
|
|
194
220
|
command: IIWMessageCommand;
|
|
195
221
|
payload: IIWMessagePayloadContentBase;
|
|
196
222
|
}
|
|
197
|
-
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { IRunnerInstance, IRunnerOptions, IRunner } from './commonTypes'
|
|
2
|
+
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
|
|
5
|
+
import { WorkerInstance } from './workerInstance'
|
|
6
|
+
|
|
7
|
+
import { Sleep } from '@nsshunt/stsutils'
|
|
8
|
+
|
|
9
|
+
declare interface LogMessageData {
|
|
10
|
+
indent: number
|
|
11
|
+
adder: number
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
declare type LogMessageDataSet = Record<string, LogMessageData>;
|
|
15
|
+
|
|
16
|
+
export interface IRunnerOptionsEx extends IRunnerOptions {
|
|
17
|
+
sleepDuration: number
|
|
18
|
+
messageMod: number
|
|
19
|
+
logMessageMod: number
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export class TestCase01 implements IRunnerInstance {
|
|
23
|
+
#runner: IRunner
|
|
24
|
+
#workerInstance: WorkerInstance;
|
|
25
|
+
#logMessageDataSet: LogMessageDataSet = { };
|
|
26
|
+
|
|
27
|
+
constructor(workerInstance: WorkerInstance, runner: IRunner) {
|
|
28
|
+
this.#workerInstance = workerInstance;
|
|
29
|
+
this.#runner = runner;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
#GenLogMessage = (runner: IRunner, iteration: number) => {
|
|
33
|
+
if (!this.#logMessageDataSet[runner.id]) {
|
|
34
|
+
this.#logMessageDataSet[runner.id] = {
|
|
35
|
+
adder: 1,
|
|
36
|
+
indent: 0
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const logMessageData = this.#logMessageDataSet[runner.id];
|
|
40
|
+
|
|
41
|
+
let message = `${' '.repeat(logMessageData.indent)}>> Hello World << ${iteration}`;
|
|
42
|
+
const colorCode = runner.asyncRunnerContext.asyncRunnerId % 4;
|
|
43
|
+
switch (colorCode) {
|
|
44
|
+
case 0:
|
|
45
|
+
message = chalk.green(`${message}`);
|
|
46
|
+
break;
|
|
47
|
+
case 1:
|
|
48
|
+
message = chalk.yellow(`${message}`);
|
|
49
|
+
break;
|
|
50
|
+
case 2:
|
|
51
|
+
message = chalk.magenta(`${message}`);
|
|
52
|
+
break;
|
|
53
|
+
case 3:
|
|
54
|
+
message = chalk.white(`${message}`);
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
console.log(message);
|
|
59
|
+
runner.instrumentData.message.push(message);
|
|
60
|
+
logMessageData.indent += logMessageData.adder;
|
|
61
|
+
if (logMessageData.indent > 20) {
|
|
62
|
+
logMessageData.adder = -1;
|
|
63
|
+
} else if (logMessageData.indent === 0) {
|
|
64
|
+
logMessageData.adder = 1;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
Execute = async (iteration: number): Promise<boolean> => {
|
|
69
|
+
//console.log(chalk.magenta(`Execute! [${iteration}]`));
|
|
70
|
+
//console.log(chalk.magenta(JSON.stringify(this.#runner)));
|
|
71
|
+
|
|
72
|
+
this.#runner.instrumentData.coreCount = 1;
|
|
73
|
+
|
|
74
|
+
const options = this.#runner.options as IRunnerOptionsEx;
|
|
75
|
+
|
|
76
|
+
await Sleep(options.sleepDuration);
|
|
77
|
+
|
|
78
|
+
//this.#runner.instrumentData.timer++;
|
|
79
|
+
this.#runner.instrumentData.requestCount++;
|
|
80
|
+
this.#runner.instrumentData.velocity = options.messageMod;
|
|
81
|
+
|
|
82
|
+
//runner.instrumentData.tx += 256;
|
|
83
|
+
//runner.instrumentData.rx += 6500;
|
|
84
|
+
|
|
85
|
+
if (this.#runner.instrumentData.requestCount % options.logMessageMod === 0) {
|
|
86
|
+
this.#GenLogMessage(this.#runner, iteration);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (this.#runner.instrumentData.requestCount % options.messageMod === 0) {
|
|
90
|
+
this.#workerInstance.PostTelemetry(this.#runner);
|
|
91
|
+
this.#runner.instrumentData.message = [ ];
|
|
92
|
+
this.#runner.instrumentData.tx = 0;
|
|
93
|
+
this.#runner.instrumentData.rx = 0;
|
|
94
|
+
}
|
|
95
|
+
if (this.#runner.instrumentData.requestCount % 1000 === 0) {
|
|
96
|
+
const message = `Worker: [${this.#runner.asyncRunnerContext.threadId}], Runner: [${this.#runner.asyncRunnerContext.asyncRunnerId}] has completed: [${this.#runner.instrumentData.requestCount}] iterations of max: [${options.executionProfile.iterations}]`;
|
|
97
|
+
console.log(message);
|
|
98
|
+
this.#runner.instrumentData.message = [message]
|
|
99
|
+
this.#workerInstance.PostTelemetry(this.#runner);
|
|
100
|
+
this.#runner.instrumentData.message = [ ];
|
|
101
|
+
this.#runner.instrumentData.tx = 0;
|
|
102
|
+
this.#runner.instrumentData.rx = 0;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF
|
|
2
2
|
import { MessagePort } from 'worker_threads';
|
|
3
3
|
|
|
4
|
-
import { IIWMessagePayload, eIWMessageCommands, IIWMessagePayloadContentBase,
|
|
5
|
-
ISTSAgentWorkerMessagePort, IRunner, ITestRunnerTelemetryPayload
|
|
4
|
+
import { IIWMessagePayload, eIWMessageCommands, IIWMessagePayloadContentBase, IRunnerInstance,
|
|
5
|
+
ISTSAgentWorkerMessagePort, IRunner, ITestRunnerTelemetryPayload, IRunnerEx
|
|
6
6
|
} from './commonTypes'
|
|
7
7
|
|
|
8
8
|
import { RequestResponseHelper } from './requestResponseHelper'
|
|
@@ -11,22 +11,31 @@ import chalk from 'chalk';
|
|
|
11
11
|
// Force chalk level
|
|
12
12
|
chalk.level = 3;
|
|
13
13
|
|
|
14
|
+
import { Sleep } from '@nsshunt/stsutils';
|
|
15
|
+
|
|
14
16
|
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
|
|
15
17
|
export interface IWorkerInstanceOptions {
|
|
16
18
|
|
|
17
19
|
}
|
|
18
20
|
|
|
21
|
+
export interface IRunnerEx2RunState {
|
|
22
|
+
runnerInstance: IRunnerInstance
|
|
23
|
+
runner: IRunner
|
|
24
|
+
iteration: number
|
|
25
|
+
terminate: boolean
|
|
26
|
+
paused: boolean
|
|
27
|
+
}
|
|
28
|
+
|
|
19
29
|
export abstract class WorkerInstance {
|
|
20
30
|
#collectorCollectorPort: MessagePort | null = null;
|
|
21
31
|
#requestResponseHelper: RequestResponseHelper | null = null;
|
|
22
|
-
#runners: Record<string,
|
|
32
|
+
#runners: Record<string, IRunnerEx2RunState> = { };
|
|
23
33
|
#options: IWorkerInstanceOptions | null = null;
|
|
24
34
|
|
|
25
35
|
#debug = (message: string) => {
|
|
26
36
|
console.log(chalk.green(`pid: [${process.pid}] WorkerInstance::${message}`));
|
|
27
37
|
}
|
|
28
38
|
|
|
29
|
-
|
|
30
39
|
constructor() {
|
|
31
40
|
this.#debug(`constructor`)
|
|
32
41
|
}
|
|
@@ -93,42 +102,105 @@ export abstract class WorkerInstance {
|
|
|
93
102
|
this.#collectorCollectorPort.postMessage(response);
|
|
94
103
|
}
|
|
95
104
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
this.#debug(`StartTests: [${JSON.stringify(runner)}]`);
|
|
99
|
-
runner.state = IRunnerState.running;
|
|
100
|
-
this.StartWork(runner);
|
|
105
|
+
CreateAsyncRunner = (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload): IRunnerInstance | null => {
|
|
106
|
+
return null;
|
|
101
107
|
}
|
|
102
108
|
|
|
103
109
|
#AddAsyncRunner = (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload): IRunner => {
|
|
104
110
|
this.#debug(`AddAsyncRunner`)
|
|
105
111
|
const { runner } = testRunnerTelemetryPayload;
|
|
106
|
-
|
|
112
|
+
const asyncRunnerInstance = this.CreateAsyncRunner(testRunnerTelemetryPayload);
|
|
113
|
+
if (asyncRunnerInstance) {
|
|
114
|
+
this.#runners[runner.id] = {
|
|
115
|
+
runnerInstance: asyncRunnerInstance,
|
|
116
|
+
runner: testRunnerTelemetryPayload.runner,
|
|
117
|
+
iteration: 0,
|
|
118
|
+
terminate: false,
|
|
119
|
+
paused: false
|
|
120
|
+
}
|
|
121
|
+
} else {
|
|
122
|
+
//@@ exception - implementation not found
|
|
123
|
+
}
|
|
107
124
|
return runner;
|
|
108
|
-
//this.StartRunner(runner);
|
|
109
125
|
}
|
|
110
126
|
|
|
111
|
-
|
|
127
|
+
//@@ re4set iteration count - need a reset
|
|
128
|
+
|
|
129
|
+
#StartRunner = (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload) => {
|
|
112
130
|
this.#debug(`StartRunner`)
|
|
113
131
|
const { runner } = testRunnerTelemetryPayload;
|
|
114
|
-
this.
|
|
115
|
-
|
|
132
|
+
this.#runners[runner.id].terminate = false;
|
|
133
|
+
this.#runners[runner.id].paused = false;
|
|
134
|
+
|
|
135
|
+
const ExecuteLoop = async () => {
|
|
136
|
+
if (this.#runners[runner.id].iteration < this.#runners[runner.id].runner.options.executionProfile.iterations) {
|
|
137
|
+
await this.#runners[runner.id].runnerInstance.Execute(this.#runners[runner.id].iteration);
|
|
138
|
+
this.#runners[runner.id].iteration++;
|
|
139
|
+
await Sleep(0); // Yield to the event loop to make sure we can process worker messages if any in the event loop queue
|
|
140
|
+
if (!this.#runners[runner.id].terminate) {
|
|
141
|
+
if (!this.#runners[runner.id].paused) {
|
|
142
|
+
await Sleep(this.#runners[runner.id].runner.options.executionProfile.delayBetweenIterations);
|
|
143
|
+
ExecuteLoop();
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
} else {
|
|
147
|
+
if (this.#collectorCollectorPort) {
|
|
148
|
+
const message: IIWMessagePayload = {
|
|
149
|
+
command: eIWMessageCommands.Completed,
|
|
150
|
+
payload: {
|
|
151
|
+
runner
|
|
152
|
+
} as ITestRunnerTelemetryPayload
|
|
153
|
+
}
|
|
154
|
+
this.#collectorCollectorPort.postMessage(message);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
ExecuteLoop();
|
|
116
159
|
}
|
|
117
160
|
|
|
118
161
|
#StopRunners = (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload) => {
|
|
119
|
-
this.#debug(`StopRunners`)
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
testRunner.state = IRunnerState.stopped;
|
|
123
|
-
}
|
|
124
|
-
} else {
|
|
125
|
-
const runner: IRunner = this.#runners[testRunnerTelemetryPayload.runner.id];
|
|
126
|
-
if (runner) {
|
|
127
|
-
runner.state = IRunnerState.stopped;
|
|
128
|
-
}
|
|
162
|
+
this.#debug(`StopRunners`);
|
|
163
|
+
for (const [, runner] of Object.entries(this.#runners)) {
|
|
164
|
+
runner.terminate = true;
|
|
129
165
|
}
|
|
130
166
|
}
|
|
131
167
|
|
|
168
|
+
#StopRunner = (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload) => {
|
|
169
|
+
this.#debug(`StopRunner`)
|
|
170
|
+
const { runner } = testRunnerTelemetryPayload;
|
|
171
|
+
this.#runners[runner.id].terminate = true;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
#PauseRunner = (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload) => {
|
|
175
|
+
this.#debug(`PauseRunner`)
|
|
176
|
+
const { runner } = testRunnerTelemetryPayload;
|
|
177
|
+
this.#runners[runner.id].paused = true;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
#ResumeRunner = (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload) => {
|
|
181
|
+
this.#debug(`ResumeRunner`);
|
|
182
|
+
const { runner } = testRunnerTelemetryPayload;
|
|
183
|
+
this.#runners[runner.id].paused = false;
|
|
184
|
+
this.#StartRunner(testRunnerTelemetryPayload);
|
|
185
|
+
//@@ todo
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
#ResetRunner = (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload) => {
|
|
189
|
+
this.#debug(`ResetRunner`)
|
|
190
|
+
const { runner } = testRunnerTelemetryPayload;
|
|
191
|
+
this.#runners[runner.id].terminate = true;
|
|
192
|
+
this.#runners[runner.id].iteration = 0;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Execute a single iteration of this runners work item
|
|
196
|
+
#ExecuteRunner = (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload) => {
|
|
197
|
+
this.#debug(`ExecuteRunner`)
|
|
198
|
+
const { runner } = testRunnerTelemetryPayload;
|
|
199
|
+
this.#runners[runner.id].runnerInstance.Execute(this.#runners[runner.id].iteration);
|
|
200
|
+
this.#runners[runner.id].iteration++;
|
|
201
|
+
//@@ todo
|
|
202
|
+
}
|
|
203
|
+
|
|
132
204
|
// ProcessMessage = async(data: MessageEvent) => { // Browser version
|
|
133
205
|
ProcessMessage = async(data: any) => {
|
|
134
206
|
this.#debug(`ProcessMessage: data: [${JSON.stringify(data)}]`)
|
|
@@ -154,6 +226,27 @@ export abstract class WorkerInstance {
|
|
|
154
226
|
this.#debug(`ProcessMessage::StartRunner`)
|
|
155
227
|
this.#StartRunner(payloadMessage.payload as ITestRunnerTelemetryPayload);
|
|
156
228
|
break;
|
|
229
|
+
case eIWMessageCommands.StopRunner :
|
|
230
|
+
this.#debug(`ProcessMessage::StopRunner`)
|
|
231
|
+
this.#StopRunner(payloadMessage.payload as ITestRunnerTelemetryPayload);
|
|
232
|
+
break;
|
|
233
|
+
case eIWMessageCommands.PauseRunner :
|
|
234
|
+
this.#debug(`ProcessMessage::PauseRunner`)
|
|
235
|
+
this.#PauseRunner(payloadMessage.payload as ITestRunnerTelemetryPayload);
|
|
236
|
+
break;
|
|
237
|
+
case eIWMessageCommands.ResumeRunner :
|
|
238
|
+
this.#debug(`ProcessMessage::ResumeRunner`)
|
|
239
|
+
this.#ResumeRunner(payloadMessage.payload as ITestRunnerTelemetryPayload);
|
|
240
|
+
break;
|
|
241
|
+
case eIWMessageCommands.ResetRunner :
|
|
242
|
+
this.#debug(`ProcessMessage::ResetRunner`)
|
|
243
|
+
this.#ResetRunner(payloadMessage.payload as ITestRunnerTelemetryPayload);
|
|
244
|
+
break;
|
|
245
|
+
case eIWMessageCommands.ExecuteRunner :
|
|
246
|
+
this.#debug(`ProcessMessage::ExecuteRunner`)
|
|
247
|
+
this.#ExecuteRunner(payloadMessage.payload as ITestRunnerTelemetryPayload);
|
|
248
|
+
//@@ should return a response ??
|
|
249
|
+
break;
|
|
157
250
|
default :
|
|
158
251
|
this.#debug(`ProcessMessage::default`)
|
|
159
252
|
this.#debug(`Invalid payloadMessage.command: [${payloadMessage.command}] - Ignoring`);
|