@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.
Files changed (44) hide show
  1. package/dist/testertesting/app.js +39 -5
  2. package/dist/testertesting/app.js.map +1 -1
  3. package/dist/testertesting/commonTypes.js +30 -1
  4. package/dist/testertesting/commonTypes.js.map +1 -1
  5. package/dist/testertesting/telemetryProcessor.js +114 -0
  6. package/dist/testertesting/telemetryProcessor.js.map +1 -0
  7. package/dist/testertesting/testCase01.js +84 -0
  8. package/dist/testertesting/testCase01.js.map +1 -0
  9. package/dist/testertesting/workerInstance.js +107 -18
  10. package/dist/testertesting/workerInstance.js.map +1 -1
  11. package/dist/testertesting/workerManager.js +94 -118
  12. package/dist/testertesting/workerManager.js.map +1 -1
  13. package/dist/testertesting/workerPrimaryTestRunner01.js +5 -5
  14. package/dist/testertesting/workerPrimaryTestRunner01.js.map +1 -1
  15. package/dist/testertesting/workerWorkerTestRunner01.js +39 -14
  16. package/dist/testertesting/workerWorkerTestRunner01.js.map +1 -1
  17. package/package.json +1 -1
  18. package/src/testertesting/app.ts +50 -10
  19. package/src/testertesting/commonTypes.ts +172 -0
  20. package/src/testertesting/telemetryProcessor.ts +128 -0
  21. package/src/testertesting/testCase01.ts +107 -0
  22. package/src/testertesting/workerInstance.ts +128 -24
  23. package/src/testertesting/workerManager.ts +109 -141
  24. package/src/testertesting/workerPrimaryTestRunner01.ts +1 -1
  25. package/src/testertesting/workerWorkerTestRunner01.ts +24 -2
  26. package/types/testertesting/commonTypes.d.ts +155 -1
  27. package/types/testertesting/commonTypes.d.ts.map +1 -1
  28. package/types/testertesting/telemetryProcessor.d.ts +6 -0
  29. package/types/testertesting/telemetryProcessor.d.ts.map +1 -0
  30. package/types/testertesting/testCase01.d.ts +13 -0
  31. package/types/testertesting/testCase01.d.ts.map +1 -0
  32. package/types/testertesting/workerInstance.d.ts +9 -2
  33. package/types/testertesting/workerInstance.d.ts.map +1 -1
  34. package/types/testertesting/workerManager.d.ts +3 -1
  35. package/types/testertesting/workerManager.d.ts.map +1 -1
  36. package/types/testertesting/workerPrimaryTestRunner01.d.ts +1 -1
  37. package/types/testertesting/workerPrimaryTestRunner01.d.ts.map +1 -1
  38. package/types/testertesting/workerWorkerTestRunner01.d.ts +5 -1
  39. package/types/testertesting/workerWorkerTestRunner01.d.ts.map +1 -1
  40. package/dist/testertesting/stsTestWorkerDefinitions.js +0 -34
  41. package/dist/testertesting/stsTestWorkerDefinitions.js.map +0 -1
  42. package/src/testertesting/stsTestWorkerDefinitions.ts +0 -150
  43. package/types/testertesting/stsTestWorkerDefinitions.d.ts +0 -124
  44. 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 } from './commonTypes'
5
-
6
- import type { ISTSAgentWorkerMessagePort, IRunner, ITestRunnerTelemetryPayload } from './stsTestWorkerDefinitions'
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, IRunner> = { };
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
- StartRunner = async (runner: IRunner) => {
98
- this.#debug(`StartRunner`)
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
- this.#runners[runner.id] = runner;
108
- this.StartRunner(runner);
109
- }
110
-
111
- #StopRunners = (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload) => {
112
- this.#debug(`StopRunners`)
113
- if (testRunnerTelemetryPayload === null) {
114
- for (const [, testRunner] of Object.entries(this.#runners)) {
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
- const runner: IRunner = this.#runners[testRunnerTelemetryPayload.runner.id];
119
- if (runner) {
120
- runner.state = IRunnerState.stopped;
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 { type IAsyncRunnerContext, IIWMessagePayload, IIWMessagePayloadContentBase,
4
- type IIWMessageCommand, eIWMessageCommands } from './commonTypes'
5
-
6
- import { Gauge, InstrumentGaugeTelemetry } from '@nsshunt/stsobservability'
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: this.#workerId++, // uuidv4()
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
- Stop: async (): Promise<boolean> => this.#StopWorker(stsWorkerEx)
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
- if (runner.instrumentData.message) {
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
- Stop: async (): Promise<boolean> => this.#StopRunner(workerEx, runnerEx)
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
- #StopRunner = async (workerEx: IWorkerEx, runnerEx: IRunnerEx | null = null): Promise<boolean> => {
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.StopAllAsyncRunners, {
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 './stsTestWorkerDefinitions'
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, IRunnerState } from './stsTestWorkerDefinitions'
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 WorkerWorkerTestRunner01();
186
+ const worker = new WorkerTestCases();
165
187
 
166
188
  parentPort?.on('message', (data: any) => {
167
189