@nsshunt/stsappframework 3.1.161 → 3.1.163
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 +39 -5
- package/dist/testertesting/app.js.map +1 -1
- package/dist/testertesting/commonTypes.js +30 -1
- package/dist/testertesting/commonTypes.js.map +1 -1
- package/dist/testertesting/telemetryProcessor.js +114 -0
- package/dist/testertesting/telemetryProcessor.js.map +1 -0
- package/dist/testertesting/testCase01.js +84 -0
- package/dist/testertesting/testCase01.js.map +1 -0
- package/dist/testertesting/workerInstance.js +107 -18
- package/dist/testertesting/workerInstance.js.map +1 -1
- package/dist/testertesting/workerManager.js +94 -118
- package/dist/testertesting/workerManager.js.map +1 -1
- package/dist/testertesting/workerPrimaryTestRunner01.js +5 -5
- package/dist/testertesting/workerPrimaryTestRunner01.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 +50 -10
- package/src/testertesting/commonTypes.ts +172 -0
- package/src/testertesting/telemetryProcessor.ts +128 -0
- package/src/testertesting/testCase01.ts +107 -0
- package/src/testertesting/workerInstance.ts +128 -24
- package/src/testertesting/workerManager.ts +109 -141
- package/src/testertesting/workerPrimaryTestRunner01.ts +1 -1
- package/src/testertesting/workerWorkerTestRunner01.ts +24 -2
- package/types/testertesting/commonTypes.d.ts +155 -1
- package/types/testertesting/commonTypes.d.ts.map +1 -1
- package/types/testertesting/telemetryProcessor.d.ts +6 -0
- package/types/testertesting/telemetryProcessor.d.ts.map +1 -0
- 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 +3 -1
- package/types/testertesting/workerManager.d.ts.map +1 -1
- package/types/testertesting/workerPrimaryTestRunner01.d.ts +1 -1
- package/types/testertesting/workerPrimaryTestRunner01.d.ts.map +1 -1
- package/types/testertesting/workerWorkerTestRunner01.d.ts +5 -1
- package/types/testertesting/workerWorkerTestRunner01.d.ts.map +1 -1
- package/dist/testertesting/stsTestWorkerDefinitions.js +0 -34
- package/dist/testertesting/stsTestWorkerDefinitions.js.map +0 -1
- package/src/testertesting/stsTestWorkerDefinitions.ts +0 -150
- package/types/testertesting/stsTestWorkerDefinitions.d.ts +0 -124
- package/types/testertesting/stsTestWorkerDefinitions.d.ts.map +0 -1
|
@@ -1,10 +1,9 @@
|
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
import { IRunnerState } from './stsTestWorkerDefinitions'
|
|
4
|
+
import { IIWMessagePayload, eIWMessageCommands, IIWMessagePayloadContentBase, IRunnerInstance,
|
|
5
|
+
ISTSAgentWorkerMessagePort, IRunner, ITestRunnerTelemetryPayload, IRunnerEx
|
|
6
|
+
} from './commonTypes'
|
|
8
7
|
|
|
9
8
|
import { RequestResponseHelper } from './requestResponseHelper'
|
|
10
9
|
|
|
@@ -12,22 +11,31 @@ import chalk from 'chalk';
|
|
|
12
11
|
// Force chalk level
|
|
13
12
|
chalk.level = 3;
|
|
14
13
|
|
|
14
|
+
import { Sleep } from '@nsshunt/stsutils';
|
|
15
|
+
|
|
15
16
|
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
|
|
16
17
|
export interface IWorkerInstanceOptions {
|
|
17
18
|
|
|
18
19
|
}
|
|
19
20
|
|
|
21
|
+
export interface IRunnerEx2RunState {
|
|
22
|
+
runnerInstance: IRunnerInstance
|
|
23
|
+
runner: IRunner
|
|
24
|
+
iteration: number
|
|
25
|
+
terminate: boolean
|
|
26
|
+
paused: boolean
|
|
27
|
+
}
|
|
28
|
+
|
|
20
29
|
export abstract class WorkerInstance {
|
|
21
30
|
#collectorCollectorPort: MessagePort | null = null;
|
|
22
31
|
#requestResponseHelper: RequestResponseHelper | null = null;
|
|
23
|
-
#runners: Record<string,
|
|
32
|
+
#runners: Record<string, IRunnerEx2RunState> = { };
|
|
24
33
|
#options: IWorkerInstanceOptions | null = null;
|
|
25
34
|
|
|
26
35
|
#debug = (message: string) => {
|
|
27
36
|
console.log(chalk.green(`pid: [${process.pid}] WorkerInstance::${message}`));
|
|
28
37
|
}
|
|
29
38
|
|
|
30
|
-
|
|
31
39
|
constructor() {
|
|
32
40
|
this.#debug(`constructor`)
|
|
33
41
|
}
|
|
@@ -94,32 +102,103 @@ export abstract class WorkerInstance {
|
|
|
94
102
|
this.#collectorCollectorPort.postMessage(response);
|
|
95
103
|
}
|
|
96
104
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
this.#debug(`StartTests: [${JSON.stringify(runner)}]`);
|
|
100
|
-
runner.state = IRunnerState.running;
|
|
101
|
-
this.StartWork(runner);
|
|
105
|
+
CreateAsyncRunner = (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload): IRunnerInstance | null => {
|
|
106
|
+
return null;
|
|
102
107
|
}
|
|
103
108
|
|
|
104
|
-
#AddAsyncRunner = (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload) => {
|
|
109
|
+
#AddAsyncRunner = (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload): IRunner => {
|
|
105
110
|
this.#debug(`AddAsyncRunner`)
|
|
106
111
|
const { runner } = testRunnerTelemetryPayload;
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
testRunner.state = IRunnerState.stopped;
|
|
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
|
|
116
120
|
}
|
|
117
121
|
} else {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
122
|
+
//@@ exception - implementation not found
|
|
123
|
+
}
|
|
124
|
+
return runner;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
//@@ re4set iteration count - need a reset
|
|
128
|
+
|
|
129
|
+
#StartRunner = (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload) => {
|
|
130
|
+
this.#debug(`StartRunner`)
|
|
131
|
+
const { runner } = testRunnerTelemetryPayload;
|
|
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
|
+
}
|
|
121
156
|
}
|
|
122
157
|
}
|
|
158
|
+
ExecuteLoop();
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
#StopRunners = (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload) => {
|
|
162
|
+
this.#debug(`StopRunners`);
|
|
163
|
+
for (const [, runner] of Object.entries(this.#runners)) {
|
|
164
|
+
runner.terminate = true;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
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
|
|
123
202
|
}
|
|
124
203
|
|
|
125
204
|
// ProcessMessage = async(data: MessageEvent) => { // Browser version
|
|
@@ -143,6 +222,31 @@ export abstract class WorkerInstance {
|
|
|
143
222
|
this.#debug(`ProcessMessage::StopAllAsyncRunners`)
|
|
144
223
|
this.#StopRunners(payloadMessage.payload as ITestRunnerTelemetryPayload);
|
|
145
224
|
break;
|
|
225
|
+
case eIWMessageCommands.StartRunner :
|
|
226
|
+
this.#debug(`ProcessMessage::StartRunner`)
|
|
227
|
+
this.#StartRunner(payloadMessage.payload as ITestRunnerTelemetryPayload);
|
|
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;
|
|
146
250
|
default :
|
|
147
251
|
this.#debug(`ProcessMessage::default`)
|
|
148
252
|
this.#debug(`Invalid payloadMessage.command: [${payloadMessage.command}] - Ignoring`);
|
|
@@ -1,22 +1,20 @@
|
|
|
1
1
|
/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF
|
|
2
2
|
//import MyWorker from './sts-worker?worker' // https://vitejs.dev/guide/features.html#web-workers
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
import { IAsyncRunnerContext, IIWMessagePayload, IIWMessagePayloadContentBase,
|
|
4
|
+
IIWMessageCommand, eIWMessageCommands, IWorkerState, IRunnerState,
|
|
5
|
+
ISTSAgentWorkerMessagePort, IWorkerEx, IRunner, IRunnerEx,
|
|
6
|
+
ITestRunnerTelemetryPayload, IRunnerOptions, IRunnerTelemetry,
|
|
7
|
+
IWorkerManagerOptions, IWorkerFactory, IRunnerEvent
|
|
8
|
+
} from './commonTypes'
|
|
7
9
|
|
|
8
10
|
import { ModelDelimeter } from '@nsshunt/stsutils'
|
|
9
11
|
|
|
10
|
-
import type { ISTSAgentWorkerMessagePort, IWorkerEx, IRunner, IRunnerEx,
|
|
11
|
-
ITestRunnerTelemetryPayload, IRunnerOptions, IRunnerTelemetry,
|
|
12
|
-
IWorkerManagerOptions, IWorkerFactory } from './stsTestWorkerDefinitions'
|
|
13
|
-
|
|
14
|
-
import { IWorkerState, IRunnerState } from './stsTestWorkerDefinitions'
|
|
15
12
|
import { Sleep } from '@nsshunt/stsutils';
|
|
16
13
|
|
|
17
14
|
import { AgentInstrumentController, PublishInstrumentController } from '@nsshunt/stsobservability'
|
|
18
15
|
|
|
19
16
|
import chalk from 'chalk';
|
|
17
|
+
import { TelemetryProcessor } from './telemetryProcessor'
|
|
20
18
|
chalk.level = 3;
|
|
21
19
|
|
|
22
20
|
export class STSWorkerManager {
|
|
@@ -26,9 +24,8 @@ export class STSWorkerManager {
|
|
|
26
24
|
#workerId = 0;
|
|
27
25
|
#options: IWorkerManagerOptions;
|
|
28
26
|
#STSInstrumentController: PublishInstrumentController
|
|
29
|
-
|
|
27
|
+
#telemetryProcessor: TelemetryProcessor
|
|
30
28
|
#app: any
|
|
31
|
-
|
|
32
29
|
|
|
33
30
|
constructor(app: any, options?: IWorkerManagerOptions) {
|
|
34
31
|
this.#app = app;
|
|
@@ -39,6 +36,7 @@ export class STSWorkerManager {
|
|
|
39
36
|
}
|
|
40
37
|
|
|
41
38
|
this.#STSInstrumentController = this.#options.publishInstrumentController;
|
|
39
|
+
this.#telemetryProcessor = new TelemetryProcessor();
|
|
42
40
|
}
|
|
43
41
|
|
|
44
42
|
#debug = (message: string) => {
|
|
@@ -49,6 +47,14 @@ export class STSWorkerManager {
|
|
|
49
47
|
return this.#workersEx;
|
|
50
48
|
}
|
|
51
49
|
|
|
50
|
+
get runnerId(): number {
|
|
51
|
+
return this.#runner;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
set runnerId(id: number) {
|
|
55
|
+
this.#runner = id;
|
|
56
|
+
}
|
|
57
|
+
|
|
52
58
|
AddWorker = async (useWorkerFactory?: IWorkerFactory): Promise<IWorkerEx> => {
|
|
53
59
|
let workerFactory: IWorkerFactory;
|
|
54
60
|
if (useWorkerFactory) {
|
|
@@ -58,17 +64,24 @@ export class STSWorkerManager {
|
|
|
58
64
|
// Use the default workFactory
|
|
59
65
|
workerFactory = this.#options.workerFactory
|
|
60
66
|
}
|
|
67
|
+
|
|
68
|
+
const workerId = this.#workerId++;
|
|
61
69
|
const stsWorkerEx: IWorkerEx = {
|
|
62
|
-
id:
|
|
70
|
+
id: workerId,
|
|
63
71
|
worker: workerFactory.createWorkerThreadWorker(),
|
|
64
72
|
primaryWorker: workerFactory.createPrimaryThreadWorker(this.#app, workerFactory.primaryThreadWorkerOptions),
|
|
65
73
|
state: IWorkerState.starting,
|
|
66
74
|
workerThreadWorkerOptions: workerFactory.workerThreadWorkerOptions,
|
|
67
75
|
primaryThreadWorkerOptions: workerFactory.primaryThreadWorkerOptions,
|
|
68
76
|
runnersEx: { } as Record<string, IRunnerEx>,
|
|
77
|
+
runnersEvents: { } as Record<string, IRunnerEvent[]>,
|
|
69
78
|
AddRunner: (runnerOptions: IRunnerOptions): IRunnerEx => this.AddRunnerToWorker(stsWorkerEx, runnerOptions),
|
|
79
|
+
StartRunner: (runner: IRunnerEx): Promise<boolean> => this.#StartRunner(stsWorkerEx, runner),
|
|
70
80
|
StopRunner: (runner: IRunnerEx): Promise<boolean> => this.#StopRunner(stsWorkerEx, runner),
|
|
71
|
-
|
|
81
|
+
PauseRunner: (runner: IRunnerEx): Promise<boolean> => this.#PauseRunner(stsWorkerEx, runner),
|
|
82
|
+
ResumeRunner: (runner: IRunnerEx): Promise<boolean> => this.#ResumeRunner(stsWorkerEx, runner),
|
|
83
|
+
Stop: async (): Promise<boolean> => this.#StopWorker(stsWorkerEx),
|
|
84
|
+
GetRunner: (id: string): IRunnerEx | null => this.#workersEx[workerId].GetRunner(id)
|
|
72
85
|
}
|
|
73
86
|
this.#STSInstrumentController.LogEx(chalk.yellow(`pid: [${process.pid}] Creating new worker: [${stsWorkerEx.id}]`));
|
|
74
87
|
this.#debug(`Adding worker: [${stsWorkerEx.id}]`);
|
|
@@ -105,13 +118,17 @@ export class STSWorkerManager {
|
|
|
105
118
|
const publishMessagePayload: IIWMessagePayload = data as IIWMessagePayload;
|
|
106
119
|
switch (publishMessagePayload.command) {
|
|
107
120
|
case eIWMessageCommands.MessagePortResponse :
|
|
108
|
-
this.#debug(`AddWorker::eIWMessageCommands.MessagePortResponse`);
|
|
121
|
+
//this.#debug(`AddWorker::eIWMessageCommands.MessagePortResponse`);
|
|
109
122
|
stsWorkerEx.state = IWorkerState.started;
|
|
110
123
|
break;
|
|
111
124
|
case eIWMessageCommands.InstrumentTelemetry :
|
|
112
|
-
this.#debug(`AddWorker::eIWMessageCommands.InstrumentTelemetry`);
|
|
125
|
+
//this.#debug(`AddWorker::eIWMessageCommands.InstrumentTelemetry`);
|
|
113
126
|
this.#ProcessTelemetry(stsWorkerEx, publishMessagePayload.payload as ITestRunnerTelemetryPayload);
|
|
114
127
|
break;
|
|
128
|
+
case eIWMessageCommands.Completed :
|
|
129
|
+
//this.#debug(`AddWorker::eIWMessageCommands.InstrumentTelemetry`);
|
|
130
|
+
this.#ProcessCompleted(stsWorkerEx, publishMessagePayload.payload as ITestRunnerTelemetryPayload);
|
|
131
|
+
break;
|
|
115
132
|
default :
|
|
116
133
|
this.#debug(`AddWorker::default`);
|
|
117
134
|
stsWorkerEx.primaryWorker.ProcessMessageFromWorker(workerPort, publishMessagePayload);
|
|
@@ -138,7 +155,6 @@ export class STSWorkerManager {
|
|
|
138
155
|
id: runnerEx.id,
|
|
139
156
|
asyncRunnerContext: { ...runnerEx.asyncRunnerContext },
|
|
140
157
|
options: { ...runnerEx.options },
|
|
141
|
-
state: runnerEx.state,
|
|
142
158
|
instrumentData: { ...runnerEx.instrumentData }
|
|
143
159
|
} as IRunner
|
|
144
160
|
}
|
|
@@ -159,136 +175,17 @@ export class STSWorkerManager {
|
|
|
159
175
|
|
|
160
176
|
if (workerEx.runnersEx[runner.id]) {
|
|
161
177
|
const runnerEx: IRunnerEx = workerEx.runnersEx[runner.id];
|
|
162
|
-
let update = false;
|
|
163
178
|
|
|
164
179
|
// Copy telemetry
|
|
165
180
|
runnerEx.instrumentData = { ...runner.instrumentData };
|
|
166
181
|
|
|
167
|
-
this.#debug(JSON.stringify(runnerEx.instrumentData));
|
|
168
|
-
|
|
169
182
|
if (runner.instrumentData.message) {
|
|
170
183
|
runnerEx.instrumentData.message = [...runner.instrumentData.message];
|
|
171
184
|
} else {
|
|
172
185
|
runnerEx.instrumentData.message = [ ];
|
|
173
186
|
}
|
|
174
187
|
|
|
175
|
-
|
|
176
|
-
runner.instrumentData.message.forEach((message) => {
|
|
177
|
-
runnerEx.publishInstrumentController.LogEx(message);
|
|
178
|
-
});
|
|
179
|
-
update = true;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
if (runner.instrumentData.requestCount) {
|
|
183
|
-
runnerEx.publishInstrumentController.UpdateInstrument(Gauge.REQUEST_COUNT_GAUGE, {
|
|
184
|
-
val: runnerEx.instrumentData.requestCount
|
|
185
|
-
} as InstrumentGaugeTelemetry);
|
|
186
|
-
update = true;
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
if (runner.instrumentData.errorCount) {
|
|
190
|
-
runnerEx.publishInstrumentController.UpdateInstrument(Gauge.ERROR_COUNT_GAUGE, {
|
|
191
|
-
val: runnerEx.instrumentData.errorCount
|
|
192
|
-
} as InstrumentGaugeTelemetry);
|
|
193
|
-
update = true;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
if (runner.instrumentData.retryCount) {
|
|
197
|
-
runnerEx.publishInstrumentController.UpdateInstrument(Gauge.RETRY_COUNT_GAUGE, {
|
|
198
|
-
val: runnerEx.instrumentData.retryCount
|
|
199
|
-
} as InstrumentGaugeTelemetry);
|
|
200
|
-
update = true;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
if (runner.instrumentData.authenticationCount) {
|
|
204
|
-
runnerEx.publishInstrumentController.UpdateInstrument(Gauge.AUTHENTICATION_COUNT_GAUGE, {
|
|
205
|
-
val: runnerEx.instrumentData.authenticationCount
|
|
206
|
-
} as InstrumentGaugeTelemetry);
|
|
207
|
-
update = true;
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
if (runner.instrumentData.authenticationErrorCount) {
|
|
211
|
-
runnerEx.publishInstrumentController.UpdateInstrument(Gauge.AUTHENTICATION_ERROR_COUNT_GAUGE, {
|
|
212
|
-
val: runnerEx.instrumentData.authenticationCount
|
|
213
|
-
} as InstrumentGaugeTelemetry);
|
|
214
|
-
update = true;
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
if (runner.instrumentData.authenticationRetryCount) {
|
|
218
|
-
runnerEx.publishInstrumentController.UpdateInstrument(Gauge.AUTHENTICATION_RETRY_COUNT_GAUGE, {
|
|
219
|
-
val: runnerEx.instrumentData.authenticationCount
|
|
220
|
-
} as InstrumentGaugeTelemetry);
|
|
221
|
-
update = true;
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
if (runner.instrumentData.coreCount) {
|
|
225
|
-
runnerEx.publishInstrumentController.UpdateInstrument(Gauge.CORE_COUNT_GAUGE, {
|
|
226
|
-
val: runnerEx.instrumentData.coreCount
|
|
227
|
-
} as InstrumentGaugeTelemetry);
|
|
228
|
-
update = true;
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
if (runner.instrumentData.timer) {
|
|
232
|
-
runnerEx.publishInstrumentController.UpdateInstrument(Gauge.TIMER_GAUGE, {
|
|
233
|
-
val: runnerEx.instrumentData.timer
|
|
234
|
-
} as InstrumentGaugeTelemetry);
|
|
235
|
-
update = true;
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
if (runner.instrumentData.activeRequestCount) {
|
|
239
|
-
runnerEx.publishInstrumentController.UpdateInstrument(Gauge.ACTIVE_REQUEST_GAUGE, {
|
|
240
|
-
val: runnerEx.instrumentData.activeRequestCount
|
|
241
|
-
} as InstrumentGaugeTelemetry);
|
|
242
|
-
update = true;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
if (runner.instrumentData.velocity) {
|
|
246
|
-
runnerEx.publishInstrumentController.UpdateInstrument(Gauge.VELOCITY_GAUGE, {
|
|
247
|
-
Inc: runnerEx.instrumentData.velocity
|
|
248
|
-
} as InstrumentGaugeTelemetry);
|
|
249
|
-
update = true;
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
if (runner.instrumentData.duration) {
|
|
253
|
-
runnerEx.publishInstrumentController.UpdateInstrument(Gauge.DURATION_GAUGE, {
|
|
254
|
-
val: runnerEx.instrumentData.duration
|
|
255
|
-
} as InstrumentGaugeTelemetry);
|
|
256
|
-
runnerEx.publishInstrumentController.UpdateInstrument(Gauge.DURATION_HISTOGRAM_GAUGE, {
|
|
257
|
-
val: runnerEx.instrumentData.duration
|
|
258
|
-
} as InstrumentGaugeTelemetry);
|
|
259
|
-
update = true;
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
if (runner.instrumentData.latency) {
|
|
263
|
-
runnerEx.publishInstrumentController.UpdateInstrument(Gauge.LATENCY_GAUGE, {
|
|
264
|
-
val: runnerEx.instrumentData.latency
|
|
265
|
-
} as InstrumentGaugeTelemetry);
|
|
266
|
-
runnerEx.publishInstrumentController.UpdateInstrument(Gauge.LATENCY_HISTOGRAM_GAUGE, {
|
|
267
|
-
val: runnerEx.instrumentData.latency
|
|
268
|
-
} as InstrumentGaugeTelemetry);
|
|
269
|
-
update = true;
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
if (runner.instrumentData.childCount) {
|
|
273
|
-
runnerEx.publishInstrumentController.UpdateInstrument(Gauge.CHILD_COUNT, {
|
|
274
|
-
val: runnerEx.instrumentData.childCount
|
|
275
|
-
} as InstrumentGaugeTelemetry);
|
|
276
|
-
update = true;
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
if (runner.instrumentData.rx) {
|
|
280
|
-
runnerEx.publishInstrumentController.UpdateInstrument(Gauge.NETWORK_RX_GAUGE, {
|
|
281
|
-
Inc: runnerEx.instrumentData.rx
|
|
282
|
-
} as InstrumentGaugeTelemetry);
|
|
283
|
-
update = true;
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
if (runner.instrumentData.tx) {
|
|
287
|
-
runnerEx.publishInstrumentController.UpdateInstrument(Gauge.NETWORK_TX_GAUGE, {
|
|
288
|
-
Inc: runnerEx.instrumentData.tx
|
|
289
|
-
} as InstrumentGaugeTelemetry);
|
|
290
|
-
update = true;
|
|
291
|
-
}
|
|
188
|
+
const update = this.#telemetryProcessor.ProcessTelemetry(runnerEx.publishInstrumentController, runnerEx.instrumentData);
|
|
292
189
|
|
|
293
190
|
if (update) {
|
|
294
191
|
//store.Update(workerEx, runnerEx);
|
|
@@ -296,6 +193,19 @@ export class STSWorkerManager {
|
|
|
296
193
|
}
|
|
297
194
|
}
|
|
298
195
|
|
|
196
|
+
#ProcessCompleted = (workerEx: IWorkerEx, payloadContents: ITestRunnerTelemetryPayload): void => {
|
|
197
|
+
const { runner } = payloadContents;
|
|
198
|
+
if (workerEx.runnersEvents[runner.id]) {
|
|
199
|
+
const runnersEvents: IRunnerEvent[] = workerEx.runnersEvents[runner.id];
|
|
200
|
+
runnersEvents.forEach(ev => {
|
|
201
|
+
if (ev.eventName.localeCompare('Completed') === 0) {
|
|
202
|
+
ev.cb();
|
|
203
|
+
}
|
|
204
|
+
})
|
|
205
|
+
}
|
|
206
|
+
console.log(chalk.green(`ProcessCompleted: [${JSON.stringify(runner)}]`));
|
|
207
|
+
}
|
|
208
|
+
|
|
299
209
|
#CreateAsyncRunner = (workerEx: IWorkerEx, runnerOptions: IRunnerOptions): IRunnerEx => {
|
|
300
210
|
//const applicationStore = ApplicationStore();
|
|
301
211
|
this.#runner++; // The runner number always increases
|
|
@@ -313,11 +223,11 @@ ${this.#runner}`,
|
|
|
313
223
|
threadId: `worker${workerEx.id}`,
|
|
314
224
|
asyncRunnerId: this.#runner
|
|
315
225
|
}
|
|
226
|
+
|
|
316
227
|
const runnerEx: IRunnerEx = {
|
|
317
228
|
id: this.#runner,
|
|
318
229
|
publishInstrumentController: (this.#STSInstrumentController as AgentInstrumentController).AddPublishInstrumentController(asyncRunnerContext),
|
|
319
230
|
asyncRunnerContext: asyncRunnerContext,
|
|
320
|
-
state: IRunnerState.created,
|
|
321
231
|
options: runnerOptions,
|
|
322
232
|
instrumentData: {
|
|
323
233
|
requestCount: 0,
|
|
@@ -337,11 +247,27 @@ ${this.#runner}`,
|
|
|
337
247
|
rx: 0,
|
|
338
248
|
tx: 0
|
|
339
249
|
} as IRunnerTelemetry,
|
|
340
|
-
|
|
250
|
+
Start: async (): Promise<boolean> => this.#StartRunner(workerEx, runnerEx),
|
|
251
|
+
Stop: async (): Promise<boolean> => this.#StopRunner(workerEx, runnerEx),
|
|
252
|
+
Pause: async (): Promise<boolean> => this.#PauseRunner(workerEx, runnerEx),
|
|
253
|
+
Resume: async (): Promise<boolean> => this.#ResumeRunner(workerEx, runnerEx),
|
|
254
|
+
Reset: async (): Promise<boolean> => this.#ResetRunner(workerEx, runnerEx),
|
|
255
|
+
Execute: async (): Promise<boolean> => this.#ExecuteRunner(workerEx, runnerEx),
|
|
256
|
+
Terminate: async (): Promise<boolean> => this.#TerminateRunner(workerEx, runnerEx),
|
|
257
|
+
on: (eventName: string, cb: () => void): IRunnerEx => {
|
|
258
|
+
if (!workerEx.runnersEvents[runnerEx.id]) {
|
|
259
|
+
workerEx.runnersEvents[runnerEx.id] = [ ];
|
|
260
|
+
}
|
|
261
|
+
workerEx.runnersEvents[runnerEx.id].push({
|
|
262
|
+
eventName,
|
|
263
|
+
cb
|
|
264
|
+
});
|
|
265
|
+
return runnerEx;
|
|
266
|
+
}
|
|
341
267
|
}
|
|
268
|
+
|
|
342
269
|
return runnerEx;
|
|
343
270
|
}
|
|
344
|
-
|
|
345
271
|
|
|
346
272
|
#PostMessageToWorker = (workerEx: IWorkerEx, command: IIWMessageCommand, payload: IIWMessagePayloadContentBase | null, transferObject?: any) => {
|
|
347
273
|
if (transferObject) {
|
|
@@ -367,7 +293,35 @@ ${this.#runner}`,
|
|
|
367
293
|
}
|
|
368
294
|
}
|
|
369
295
|
|
|
370
|
-
#
|
|
296
|
+
#StartRunner = async (workerEx: IWorkerEx, runnerEx: IRunnerEx): Promise<boolean> => {
|
|
297
|
+
this.#PostMessageToWorker(workerEx, eIWMessageCommands.StartRunner, {
|
|
298
|
+
runner: this.#CreateRunnerCopy(runnerEx)
|
|
299
|
+
} as ITestRunnerTelemetryPayload);
|
|
300
|
+
return true;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
#ResetRunner = async (workerEx: IWorkerEx, runnerEx: IRunnerEx): Promise<boolean> => {
|
|
304
|
+
this.#PostMessageToWorker(workerEx, eIWMessageCommands.ResetRunner, {
|
|
305
|
+
runner: this.#CreateRunnerCopy(runnerEx)
|
|
306
|
+
} as ITestRunnerTelemetryPayload);
|
|
307
|
+
return true;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
#ExecuteRunner = async (workerEx: IWorkerEx, runnerEx: IRunnerEx): Promise<boolean> => {
|
|
311
|
+
this.#PostMessageToWorker(workerEx, eIWMessageCommands.ExecuteRunner, {
|
|
312
|
+
runner: this.#CreateRunnerCopy(runnerEx)
|
|
313
|
+
} as ITestRunnerTelemetryPayload);
|
|
314
|
+
return true;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
#StopRunner = async (workerEx: IWorkerEx, runnerEx: IRunnerEx): Promise<boolean> => {
|
|
318
|
+
this.#PostMessageToWorker(workerEx, eIWMessageCommands.StopRunner, {
|
|
319
|
+
runner: this.#CreateRunnerCopy(runnerEx)
|
|
320
|
+
} as ITestRunnerTelemetryPayload);
|
|
321
|
+
return true;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
#TerminateRunner = async (workerEx: IWorkerEx, runnerEx: IRunnerEx | null = null): Promise<boolean> => {
|
|
371
325
|
// If runnerEx not provided, Remove the first runner in the collection
|
|
372
326
|
if (runnerEx === null) {
|
|
373
327
|
const ids: string[] = Object.keys(workerEx.runnersEx);
|
|
@@ -377,7 +331,7 @@ ${this.#runner}`,
|
|
|
377
331
|
}
|
|
378
332
|
}
|
|
379
333
|
if (runnerEx !== null) {
|
|
380
|
-
this.#PostMessageToWorker(workerEx, eIWMessageCommands.
|
|
334
|
+
this.#PostMessageToWorker(workerEx, eIWMessageCommands.StopRunner, {
|
|
381
335
|
runner: this.#CreateRunnerCopy(runnerEx)
|
|
382
336
|
} as ITestRunnerTelemetryPayload);
|
|
383
337
|
|
|
@@ -401,6 +355,20 @@ ${this.#runner}`,
|
|
|
401
355
|
return true;
|
|
402
356
|
}
|
|
403
357
|
|
|
358
|
+
#PauseRunner = async (workerEx: IWorkerEx, runnerEx: IRunnerEx): Promise<boolean> => {
|
|
359
|
+
this.#PostMessageToWorker(workerEx, eIWMessageCommands.PauseRunner, {
|
|
360
|
+
runner: this.#CreateRunnerCopy(runnerEx)
|
|
361
|
+
} as ITestRunnerTelemetryPayload);
|
|
362
|
+
return true;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
#ResumeRunner = async (workerEx: IWorkerEx, runnerEx: IRunnerEx): Promise<boolean> => {
|
|
366
|
+
this.#PostMessageToWorker(workerEx, eIWMessageCommands.ResumeRunner, {
|
|
367
|
+
runner: this.#CreateRunnerCopy(runnerEx)
|
|
368
|
+
} as ITestRunnerTelemetryPayload);
|
|
369
|
+
return true;
|
|
370
|
+
}
|
|
371
|
+
|
|
404
372
|
#StopWorker = async (workerEx: IWorkerEx): Promise<boolean> => {
|
|
405
373
|
try {
|
|
406
374
|
if (workerEx.state !== IWorkerState.stopped) {
|
|
@@ -5,7 +5,7 @@ import chalk from 'chalk';
|
|
|
5
5
|
chalk.level = 3;
|
|
6
6
|
|
|
7
7
|
import { IPrimaryWorker, IWorkerOptions, PublishMessageCommandsTestRunner,
|
|
8
|
-
IIWMessagePayload, IIWMessagePayloadContentBase } from './
|
|
8
|
+
IIWMessagePayload, IIWMessagePayloadContentBase } from './commonTypes'
|
|
9
9
|
|
|
10
10
|
//import { STSOAuth2Manager, STSOAuth2ManagerPluginKey } from '@nsshunt/stsoauth2plugin'
|
|
11
11
|
|
|
@@ -3,10 +3,12 @@ import chalk from 'chalk';
|
|
|
3
3
|
// Force chalk level
|
|
4
4
|
chalk.level = 3;
|
|
5
5
|
|
|
6
|
-
import { IRunner, IRunnerOptions,
|
|
6
|
+
import { IRunner, IRunnerOptions, IRunnerInstance, ITestRunnerTelemetryPayload, IRunnerEx } from './commonTypes'
|
|
7
7
|
|
|
8
8
|
import { WorkerInstance } from './workerInstance'
|
|
9
9
|
|
|
10
|
+
import { TestCase01 } from './testCase01'
|
|
11
|
+
|
|
10
12
|
export interface IRunnerOptionsEx extends IRunnerOptions {
|
|
11
13
|
iterations: number
|
|
12
14
|
sleepDuration: number
|
|
@@ -99,6 +101,9 @@ export class WorkerWorkerTestRunner01 extends WorkerInstance {
|
|
|
99
101
|
});
|
|
100
102
|
*/
|
|
101
103
|
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
/*
|
|
102
107
|
while (runner.state !== IRunnerState.stopped) {
|
|
103
108
|
|
|
104
109
|
await Sleep(0);
|
|
@@ -149,6 +154,23 @@ export class WorkerWorkerTestRunner01 extends WorkerInstance {
|
|
|
149
154
|
runner.instrumentData.rx = 0;
|
|
150
155
|
}
|
|
151
156
|
}
|
|
157
|
+
*/
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export class WorkerTestCases extends WorkerInstance {
|
|
162
|
+
constructor() {
|
|
163
|
+
super()
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
override CreateAsyncRunner = (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload): IRunnerInstance | null => {
|
|
167
|
+
const { runner } = testRunnerTelemetryPayload;
|
|
168
|
+
switch (runner.options.testType) {
|
|
169
|
+
case 'TestCase01' :
|
|
170
|
+
return new TestCase01(this, runner)
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
return null;
|
|
152
174
|
}
|
|
153
175
|
}
|
|
154
176
|
|
|
@@ -161,7 +183,7 @@ import { Sleep } from '@nsshunt/stsutils';
|
|
|
161
183
|
|
|
162
184
|
let messagePort: MessagePort;
|
|
163
185
|
|
|
164
|
-
const worker = new
|
|
186
|
+
const worker = new WorkerTestCases();
|
|
165
187
|
|
|
166
188
|
parentPort?.on('message', (data: any) => {
|
|
167
189
|
|