@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
|
@@ -4,7 +4,7 @@ import { IAsyncRunnerContext, IIWMessagePayload, IIWMessagePayloadContentBase,
|
|
|
4
4
|
IIWMessageCommand, eIWMessageCommands, IWorkerState, IRunnerState,
|
|
5
5
|
ISTSAgentWorkerMessagePort, IWorkerEx, IRunner, IRunnerEx,
|
|
6
6
|
ITestRunnerTelemetryPayload, IRunnerOptions, IRunnerTelemetry,
|
|
7
|
-
IWorkerManagerOptions, IWorkerFactory
|
|
7
|
+
IWorkerManagerOptions, IWorkerFactory, IRunnerEvent
|
|
8
8
|
} from './commonTypes'
|
|
9
9
|
|
|
10
10
|
import { ModelDelimeter } from '@nsshunt/stsutils'
|
|
@@ -47,6 +47,14 @@ export class STSWorkerManager {
|
|
|
47
47
|
return this.#workersEx;
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
+
get runnerId(): number {
|
|
51
|
+
return this.#runner;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
set runnerId(id: number) {
|
|
55
|
+
this.#runner = id;
|
|
56
|
+
}
|
|
57
|
+
|
|
50
58
|
AddWorker = async (useWorkerFactory?: IWorkerFactory): Promise<IWorkerEx> => {
|
|
51
59
|
let workerFactory: IWorkerFactory;
|
|
52
60
|
if (useWorkerFactory) {
|
|
@@ -66,9 +74,12 @@ export class STSWorkerManager {
|
|
|
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),
|
|
70
79
|
StartRunner: (runner: IRunnerEx): Promise<boolean> => this.#StartRunner(stsWorkerEx, runner),
|
|
71
80
|
StopRunner: (runner: IRunnerEx): Promise<boolean> => this.#StopRunner(stsWorkerEx, runner),
|
|
81
|
+
PauseRunner: (runner: IRunnerEx): Promise<boolean> => this.#PauseRunner(stsWorkerEx, runner),
|
|
82
|
+
ResumeRunner: (runner: IRunnerEx): Promise<boolean> => this.#ResumeRunner(stsWorkerEx, runner),
|
|
72
83
|
Stop: async (): Promise<boolean> => this.#StopWorker(stsWorkerEx),
|
|
73
84
|
GetRunner: (id: string): IRunnerEx | null => this.#workersEx[workerId].GetRunner(id)
|
|
74
85
|
}
|
|
@@ -107,13 +118,17 @@ export class STSWorkerManager {
|
|
|
107
118
|
const publishMessagePayload: IIWMessagePayload = data as IIWMessagePayload;
|
|
108
119
|
switch (publishMessagePayload.command) {
|
|
109
120
|
case eIWMessageCommands.MessagePortResponse :
|
|
110
|
-
this.#debug(`AddWorker::eIWMessageCommands.MessagePortResponse`);
|
|
121
|
+
//this.#debug(`AddWorker::eIWMessageCommands.MessagePortResponse`);
|
|
111
122
|
stsWorkerEx.state = IWorkerState.started;
|
|
112
123
|
break;
|
|
113
124
|
case eIWMessageCommands.InstrumentTelemetry :
|
|
114
|
-
this.#debug(`AddWorker::eIWMessageCommands.InstrumentTelemetry`);
|
|
125
|
+
//this.#debug(`AddWorker::eIWMessageCommands.InstrumentTelemetry`);
|
|
115
126
|
this.#ProcessTelemetry(stsWorkerEx, publishMessagePayload.payload as ITestRunnerTelemetryPayload);
|
|
116
127
|
break;
|
|
128
|
+
case eIWMessageCommands.Completed :
|
|
129
|
+
//this.#debug(`AddWorker::eIWMessageCommands.InstrumentTelemetry`);
|
|
130
|
+
this.#ProcessCompleted(stsWorkerEx, publishMessagePayload.payload as ITestRunnerTelemetryPayload);
|
|
131
|
+
break;
|
|
117
132
|
default :
|
|
118
133
|
this.#debug(`AddWorker::default`);
|
|
119
134
|
stsWorkerEx.primaryWorker.ProcessMessageFromWorker(workerPort, publishMessagePayload);
|
|
@@ -140,7 +155,6 @@ export class STSWorkerManager {
|
|
|
140
155
|
id: runnerEx.id,
|
|
141
156
|
asyncRunnerContext: { ...runnerEx.asyncRunnerContext },
|
|
142
157
|
options: { ...runnerEx.options },
|
|
143
|
-
state: runnerEx.state,
|
|
144
158
|
instrumentData: { ...runnerEx.instrumentData }
|
|
145
159
|
} as IRunner
|
|
146
160
|
}
|
|
@@ -165,8 +179,6 @@ export class STSWorkerManager {
|
|
|
165
179
|
// Copy telemetry
|
|
166
180
|
runnerEx.instrumentData = { ...runner.instrumentData };
|
|
167
181
|
|
|
168
|
-
this.#debug(JSON.stringify(runnerEx.instrumentData));
|
|
169
|
-
|
|
170
182
|
if (runner.instrumentData.message) {
|
|
171
183
|
runnerEx.instrumentData.message = [...runner.instrumentData.message];
|
|
172
184
|
} else {
|
|
@@ -181,6 +193,19 @@ export class STSWorkerManager {
|
|
|
181
193
|
}
|
|
182
194
|
}
|
|
183
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
|
+
|
|
184
209
|
#CreateAsyncRunner = (workerEx: IWorkerEx, runnerOptions: IRunnerOptions): IRunnerEx => {
|
|
185
210
|
//const applicationStore = ApplicationStore();
|
|
186
211
|
this.#runner++; // The runner number always increases
|
|
@@ -198,11 +223,11 @@ ${this.#runner}`,
|
|
|
198
223
|
threadId: `worker${workerEx.id}`,
|
|
199
224
|
asyncRunnerId: this.#runner
|
|
200
225
|
}
|
|
226
|
+
|
|
201
227
|
const runnerEx: IRunnerEx = {
|
|
202
228
|
id: this.#runner,
|
|
203
229
|
publishInstrumentController: (this.#STSInstrumentController as AgentInstrumentController).AddPublishInstrumentController(asyncRunnerContext),
|
|
204
230
|
asyncRunnerContext: asyncRunnerContext,
|
|
205
|
-
state: IRunnerState.created,
|
|
206
231
|
options: runnerOptions,
|
|
207
232
|
instrumentData: {
|
|
208
233
|
requestCount: 0,
|
|
@@ -222,19 +247,27 @@ ${this.#runner}`,
|
|
|
222
247
|
rx: 0,
|
|
223
248
|
tx: 0
|
|
224
249
|
} as IRunnerTelemetry,
|
|
225
|
-
Stop: async (): Promise<boolean> => this.#StopRunner(workerEx, runnerEx),
|
|
226
250
|
Start: async (): Promise<boolean> => this.#StartRunner(workerEx, runnerEx),
|
|
251
|
+
Stop: async (): Promise<boolean> => this.#StopRunner(workerEx, runnerEx),
|
|
227
252
|
Pause: async (): Promise<boolean> => this.#PauseRunner(workerEx, runnerEx),
|
|
228
253
|
Resume: async (): Promise<boolean> => this.#ResumeRunner(workerEx, runnerEx),
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
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
|
+
}
|
|
234
267
|
}
|
|
268
|
+
|
|
235
269
|
return runnerEx;
|
|
236
270
|
}
|
|
237
|
-
|
|
238
271
|
|
|
239
272
|
#PostMessageToWorker = (workerEx: IWorkerEx, command: IIWMessageCommand, payload: IIWMessagePayloadContentBase | null, transferObject?: any) => {
|
|
240
273
|
if (transferObject) {
|
|
@@ -267,7 +300,28 @@ ${this.#runner}`,
|
|
|
267
300
|
return true;
|
|
268
301
|
}
|
|
269
302
|
|
|
270
|
-
#
|
|
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> => {
|
|
271
325
|
// If runnerEx not provided, Remove the first runner in the collection
|
|
272
326
|
if (runnerEx === null) {
|
|
273
327
|
const ids: string[] = Object.keys(workerEx.runnersEx);
|
|
@@ -277,7 +331,7 @@ ${this.#runner}`,
|
|
|
277
331
|
}
|
|
278
332
|
}
|
|
279
333
|
if (runnerEx !== null) {
|
|
280
|
-
this.#PostMessageToWorker(workerEx, eIWMessageCommands.
|
|
334
|
+
this.#PostMessageToWorker(workerEx, eIWMessageCommands.StopRunner, {
|
|
281
335
|
runner: this.#CreateRunnerCopy(runnerEx)
|
|
282
336
|
} as ITestRunnerTelemetryPayload);
|
|
283
337
|
|
|
@@ -301,11 +355,17 @@ ${this.#runner}`,
|
|
|
301
355
|
return true;
|
|
302
356
|
}
|
|
303
357
|
|
|
304
|
-
#PauseRunner = async (workerEx: IWorkerEx, runnerEx: IRunnerEx
|
|
358
|
+
#PauseRunner = async (workerEx: IWorkerEx, runnerEx: IRunnerEx): Promise<boolean> => {
|
|
359
|
+
this.#PostMessageToWorker(workerEx, eIWMessageCommands.PauseRunner, {
|
|
360
|
+
runner: this.#CreateRunnerCopy(runnerEx)
|
|
361
|
+
} as ITestRunnerTelemetryPayload);
|
|
305
362
|
return true;
|
|
306
363
|
}
|
|
307
364
|
|
|
308
|
-
#ResumeRunner = async (workerEx: IWorkerEx, runnerEx: IRunnerEx
|
|
365
|
+
#ResumeRunner = async (workerEx: IWorkerEx, runnerEx: IRunnerEx): Promise<boolean> => {
|
|
366
|
+
this.#PostMessageToWorker(workerEx, eIWMessageCommands.ResumeRunner, {
|
|
367
|
+
runner: this.#CreateRunnerCopy(runnerEx)
|
|
368
|
+
} as ITestRunnerTelemetryPayload);
|
|
309
369
|
return true;
|
|
310
370
|
}
|
|
311
371
|
|
|
@@ -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
|
|
|
@@ -24,7 +24,13 @@ export declare enum eIWMessageCommands {
|
|
|
24
24
|
MessagePortResponse = "__STS__MessagePortResponse",
|
|
25
25
|
AddAsyncRunner = "__STS__AddAsyncRunner",
|
|
26
26
|
StopAllAsyncRunners = "__STS__StopAllAsyncRunners",
|
|
27
|
-
StartRunner = "__STS__StartRunner"
|
|
27
|
+
StartRunner = "__STS__StartRunner",
|
|
28
|
+
StopRunner = "__STS__StopRunner",
|
|
29
|
+
PauseRunner = "__STS__PauseRunner",
|
|
30
|
+
ResumeRunner = "__STS__ResumeRunner",
|
|
31
|
+
ResetRunner = "__STS__ResetRunner",
|
|
32
|
+
ExecuteRunner = "__STS__ExecuteRunner",
|
|
33
|
+
Completed = "__STS__Completed"
|
|
28
34
|
}
|
|
29
35
|
/**
|
|
30
36
|
* Inter-Worker (IW) message command.
|
|
@@ -74,11 +80,12 @@ export interface IRunnerTelemetry {
|
|
|
74
80
|
tx: number;
|
|
75
81
|
}
|
|
76
82
|
export interface IRunner {
|
|
77
|
-
id: number;
|
|
78
|
-
asyncRunnerContext: IAsyncRunnerContext;
|
|
79
|
-
options: IRunnerOptions;
|
|
80
|
-
|
|
81
|
-
instrumentData: IRunnerTelemetry;
|
|
83
|
+
get id(): number;
|
|
84
|
+
get asyncRunnerContext(): IAsyncRunnerContext;
|
|
85
|
+
get options(): IRunnerOptions;
|
|
86
|
+
set options(options: IRunnerOptions);
|
|
87
|
+
get instrumentData(): IRunnerTelemetry;
|
|
88
|
+
set instrumentData(newRunnerTelemetry: IRunnerTelemetry);
|
|
82
89
|
}
|
|
83
90
|
export interface IRunnerEx extends IRunner {
|
|
84
91
|
publishInstrumentController: PublishInstrumentController;
|
|
@@ -86,8 +93,13 @@ export interface IRunnerEx extends IRunner {
|
|
|
86
93
|
Pause: () => Promise<boolean>;
|
|
87
94
|
Resume: () => Promise<boolean>;
|
|
88
95
|
Stop: () => Promise<boolean>;
|
|
89
|
-
|
|
90
|
-
|
|
96
|
+
Terminate: () => Promise<boolean>;
|
|
97
|
+
Reset: () => Promise<boolean>;
|
|
98
|
+
Execute: (iteration: number) => Promise<boolean>;
|
|
99
|
+
on: (eventName: string, cb: () => void) => IRunnerEx;
|
|
100
|
+
}
|
|
101
|
+
export interface IRunnerInstance {
|
|
102
|
+
Execute: (iteration: number) => Promise<boolean>;
|
|
91
103
|
}
|
|
92
104
|
export declare enum IWorkerState {
|
|
93
105
|
starting = "starting",
|
|
@@ -111,16 +123,29 @@ export type Workers = Record<string, IWorker>;
|
|
|
111
123
|
export interface IPrimaryWorker {
|
|
112
124
|
ProcessMessageFromWorker(workerPort: MessagePort, publishMessagePayload: IIWMessagePayload): Promise<void>;
|
|
113
125
|
}
|
|
126
|
+
export interface IExecutionProfile {
|
|
127
|
+
iterations: number;
|
|
128
|
+
delayBetweenIterations: number;
|
|
129
|
+
}
|
|
114
130
|
export interface IRunnerOptions {
|
|
131
|
+
testType: string;
|
|
132
|
+
executionProfile: IExecutionProfile;
|
|
133
|
+
}
|
|
134
|
+
export interface IRunnerEvent {
|
|
135
|
+
eventName: string;
|
|
136
|
+
cb: () => void;
|
|
115
137
|
}
|
|
116
138
|
export interface IWorkerEx extends IWorker {
|
|
117
139
|
worker: Worker;
|
|
118
140
|
primaryWorker: IPrimaryWorker;
|
|
119
141
|
runnersEx: Record<string, IRunnerEx>;
|
|
142
|
+
runnersEvents: Record<string, IRunnerEvent[]>;
|
|
120
143
|
GetRunner(id: string): IRunnerEx | null;
|
|
121
144
|
AddRunner: (runnerOptions: IRunnerOptions) => IRunnerEx;
|
|
122
145
|
StartRunner: (runner: IRunnerEx) => Promise<boolean>;
|
|
123
146
|
StopRunner: (runner: IRunnerEx) => Promise<boolean>;
|
|
147
|
+
PauseRunner: (runner: IRunnerEx) => Promise<boolean>;
|
|
148
|
+
ResumeRunner: (runner: IRunnerEx) => Promise<boolean>;
|
|
124
149
|
Stop: () => Promise<boolean>;
|
|
125
150
|
}
|
|
126
151
|
export interface ISTSTestWorkerOptions {
|
|
@@ -155,6 +180,12 @@ export declare const PublishMessageCommandsTestRunner: {
|
|
|
155
180
|
readonly AddAsyncRunner: eIWMessageCommands.AddAsyncRunner;
|
|
156
181
|
readonly StopAllAsyncRunners: eIWMessageCommands.StopAllAsyncRunners;
|
|
157
182
|
readonly StartRunner: eIWMessageCommands.StartRunner;
|
|
183
|
+
readonly StopRunner: eIWMessageCommands.StopRunner;
|
|
184
|
+
readonly PauseRunner: eIWMessageCommands.PauseRunner;
|
|
185
|
+
readonly ResumeRunner: eIWMessageCommands.ResumeRunner;
|
|
186
|
+
readonly ResetRunner: eIWMessageCommands.ResetRunner;
|
|
187
|
+
readonly ExecuteRunner: eIWMessageCommands.ExecuteRunner;
|
|
188
|
+
readonly Completed: eIWMessageCommands.Completed;
|
|
158
189
|
};
|
|
159
190
|
export type PublishMessageCommandsTestRunner = typeof PublishMessageCommandsTestRunner[keyof typeof PublishMessageCommandsTestRunner];
|
|
160
191
|
export interface IIWMessagePayloadContentBase {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commonTypes.d.ts","sourceRoot":"","sources":["../../src/testertesting/commonTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAA;AAEvE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAExD,eAAO,MAAM,iBAAiB,EAAE,MAAY,CAAC;AAE7C,MAAM,WAAW,mBAAoB,SAAQ,YAAY;IACxD,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,4BAA4B;IACzC,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;GAEG;AACH,oBAAY,kBAAkB;IAC7B,mBAAmB,+BAA8B,CAAE,oCAAoC;IACvF,WAAW,uBAAuB;IAClC,mBAAmB,+BAA+B;IAClD,cAAc,0BAA0B;IACxC,mBAAmB,+BAA+B;IAClD,WAAW,uBAAuB;
|
|
1
|
+
{"version":3,"file":"commonTypes.d.ts","sourceRoot":"","sources":["../../src/testertesting/commonTypes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { IRunnerInstance, IRunnerOptions, IRunner } from './commonTypes';
|
|
2
|
+
import { WorkerInstance } from './workerInstance';
|
|
3
|
+
export interface IRunnerOptionsEx extends IRunnerOptions {
|
|
4
|
+
sleepDuration: number;
|
|
5
|
+
messageMod: number;
|
|
6
|
+
logMessageMod: number;
|
|
7
|
+
}
|
|
8
|
+
export declare class TestCase01 implements IRunnerInstance {
|
|
9
|
+
#private;
|
|
10
|
+
constructor(workerInstance: WorkerInstance, runner: IRunner);
|
|
11
|
+
Execute: (iteration: number) => Promise<boolean>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=testCase01.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testCase01.d.ts","sourceRoot":"","sources":["../../src/testertesting/testCase01.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAIxE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAWjD,MAAM,WAAW,gBAAiB,SAAQ,cAAc;IACpD,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;CACxB;AAED,qBAAa,UAAW,YAAW,eAAe;;gBAKlC,cAAc,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO;IAyC3D,OAAO,cAAqB,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC,CAsCpD;CACJ"}
|
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
import { MessagePort } from 'worker_threads';
|
|
2
|
-
import { IRunner } from './commonTypes';
|
|
2
|
+
import { IRunnerInstance, IRunner, ITestRunnerTelemetryPayload } from './commonTypes';
|
|
3
3
|
import { RequestResponseHelper } from './requestResponseHelper';
|
|
4
4
|
export interface IWorkerInstanceOptions {
|
|
5
5
|
}
|
|
6
|
+
export interface IRunnerEx2RunState {
|
|
7
|
+
runnerInstance: IRunnerInstance;
|
|
8
|
+
runner: IRunner;
|
|
9
|
+
iteration: number;
|
|
10
|
+
terminate: boolean;
|
|
11
|
+
paused: boolean;
|
|
12
|
+
}
|
|
6
13
|
export declare abstract class WorkerInstance {
|
|
7
14
|
#private;
|
|
8
15
|
constructor();
|
|
@@ -12,7 +19,7 @@ export declare abstract class WorkerInstance {
|
|
|
12
19
|
get RequestResponseHelper(): RequestResponseHelper | null;
|
|
13
20
|
get CollectorCollectorPort(): MessagePort | null;
|
|
14
21
|
get Options(): IWorkerInstanceOptions | null;
|
|
15
|
-
|
|
22
|
+
CreateAsyncRunner: (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload) => IRunnerInstance | null;
|
|
16
23
|
ProcessMessage: (data: any) => Promise<void>;
|
|
17
24
|
}
|
|
18
25
|
//# sourceMappingURL=workerInstance.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workerInstance.d.ts","sourceRoot":"","sources":["../../src/testertesting/workerInstance.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,
|
|
1
|
+
{"version":3,"file":"workerInstance.d.ts","sourceRoot":"","sources":["../../src/testertesting/workerInstance.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EAAuE,eAAe,EAC7D,OAAO,EAAE,2BAA2B,EACnE,MAAM,eAAe,CAAA;AAEtB,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAS/D,MAAM,WAAW,sBAAsB;CAEtC;AAED,MAAM,WAAW,kBAAkB;IAC/B,cAAc,EAAE,eAAe,CAAA;IAC/B,MAAM,EAAE,OAAO,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,OAAO,CAAA;IAClB,MAAM,EAAE,OAAO,CAAA;CAClB;AAED,8BAAsB,cAAc;;;IAchC,YAAY,QAAS,MAAM,YAGzB;IAGF,SAAS,WAAkB,OAAO,KAAG,OAAO,CAAC,IAAI,CAAC,CAGjD;IAED,aAAa,WAAY,OAAO,UAW/B;IAED,IAAI,qBAAqB,IAAI,qBAAqB,GAAG,IAAI,CAExD;IAED,IAAI,sBAAsB,IAAI,WAAW,GAAG,IAAI,CAE/C;IAED,IAAI,OAAO,IAAI,sBAAsB,GAAG,IAAI,CAE3C;IA4BD,iBAAiB,+BAAgC,2BAA2B,KAAG,eAAe,GAAG,IAAI,CAEpG;IAkGD,cAAc,SAAe,GAAG,mBAoD/B;CACJ"}
|
|
@@ -3,6 +3,8 @@ export declare class STSWorkerManager {
|
|
|
3
3
|
#private;
|
|
4
4
|
constructor(app: any, options?: IWorkerManagerOptions);
|
|
5
5
|
get WorkersEx(): Record<string, IWorkerEx>;
|
|
6
|
+
get runnerId(): number;
|
|
7
|
+
set runnerId(id: number);
|
|
6
8
|
AddWorker: (useWorkerFactory?: IWorkerFactory) => Promise<IWorkerEx>;
|
|
7
9
|
AddRunnerToWorker: (stsWorkerEx: IWorkerEx, runnerOptions: IRunnerOptions) => IRunnerEx;
|
|
8
10
|
GetNextAvailableWorker: () => IWorkerEx | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workerManager.d.ts","sourceRoot":"","sources":["../../src/testertesting/workerManager.ts"],"names":[],"mappings":"AAEA,OAAO,EAEyB,SAAS,EAAW,SAAS,EAC5B,cAAc,EAC3C,qBAAqB,EAAE,cAAc,EACxC,MAAM,eAAe,CAAA;AAYtB,qBAAa,gBAAgB;;gBAUb,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,qBAAqB;IAgBrD,IAAI,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAEzC;IAED,SAAS,sBAA6B,cAAc,KAAG,OAAO,CAAC,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"workerManager.d.ts","sourceRoot":"","sources":["../../src/testertesting/workerManager.ts"],"names":[],"mappings":"AAEA,OAAO,EAEyB,SAAS,EAAW,SAAS,EAC5B,cAAc,EAC3C,qBAAqB,EAAE,cAAc,EACxC,MAAM,eAAe,CAAA;AAYtB,qBAAa,gBAAgB;;gBAUb,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,qBAAqB;IAgBrD,IAAI,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAEzC;IAED,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,IAAI,QAAQ,CAAC,EAAE,EAAE,MAAM,EAEtB;IAED,SAAS,sBAA6B,cAAc,KAAG,OAAO,CAAC,SAAS,CAAC,CAqFxE;IAED,iBAAiB,gBAAiB,SAAS,iBAAiB,cAAc,KAAG,SAAS,CAMrF;IA0PD,sBAAsB,QAAO,SAAS,GAAG,IAAI,CAa5C;IAED,aAAa,QAAO,SAAS,GAAG,IAAI,CAanC;IAED,IAAI,OAAO,IAAI,qBAAqB,CAEnC;IAED,IAAI,OAAO,CAAC,OAAO,EAAE,qBAAqB,EAEzC;IAED,cAAc,sBAMb;CACJ"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { IRunner, IRunnerOptions } from './commonTypes';
|
|
1
|
+
import { IRunner, IRunnerOptions, IRunnerInstance, ITestRunnerTelemetryPayload } from './commonTypes';
|
|
2
2
|
import { WorkerInstance } from './workerInstance';
|
|
3
3
|
export interface IRunnerOptionsEx extends IRunnerOptions {
|
|
4
4
|
iterations: number;
|
|
@@ -13,4 +13,8 @@ export declare class WorkerWorkerTestRunner01 extends WorkerInstance {
|
|
|
13
13
|
GenLogMessage: (runner: IRunner) => void;
|
|
14
14
|
PerformTest: (runner: IRunner) => Promise<void>;
|
|
15
15
|
}
|
|
16
|
+
export declare class WorkerTestCases extends WorkerInstance {
|
|
17
|
+
constructor();
|
|
18
|
+
CreateAsyncRunner: (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload) => IRunnerInstance | null;
|
|
19
|
+
}
|
|
16
20
|
//# sourceMappingURL=workerWorkerTestRunner01.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workerWorkerTestRunner01.d.ts","sourceRoot":"","sources":["../../src/testertesting/workerWorkerTestRunner01.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"workerWorkerTestRunner01.d.ts","sourceRoot":"","sources":["../../src/testertesting/workerWorkerTestRunner01.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,2BAA2B,EAAa,MAAM,eAAe,CAAA;AAEhH,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAIjD,MAAM,WAAW,gBAAiB,SAAQ,cAAc;IACpD,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;CACxB;AAcD,qBAAa,wBAAyB,SAAQ,cAAc;;;IAQ/C,SAAS,WAAkB,OAAO,KAAG,OAAO,CAAC,IAAI,CAAC,CAK1D;IAED,aAAa,WAAY,OAAO,UAkC/B;IAED,WAAW,WAAiB,OAAO,KAAG,OAAO,CAAC,IAAI,CAAC,CA4ElD;CACJ;AAED,qBAAa,eAAgB,SAAQ,cAAc;;IAKtC,iBAAiB,+BAAgC,2BAA2B,KAAG,eAAe,GAAG,IAAI,CAQ7G;CACJ"}
|