ScuttleBot

scuttlebot / tests / e2e / node_modules / playwright / lib / reporters / teleEmitter.js
Blame History Raw 318 lines
1
"use strict";
2
var __create = Object.create;
3
var __defProp = Object.defineProperty;
4
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
var __getOwnPropNames = Object.getOwnPropertyNames;
6
var __getProtoOf = Object.getPrototypeOf;
7
var __hasOwnProp = Object.prototype.hasOwnProperty;
8
var __export = (target, all) => {
9
for (var name in all)
10
__defProp(target, name, { get: all[name], enumerable: true });
11
};
12
var __copyProps = (to, from, except, desc) => {
13
if (from && typeof from === "object" || typeof from === "function") {
14
for (let key of __getOwnPropNames(from))
15
if (!__hasOwnProp.call(to, key) && key !== except)
16
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
}
18
return to;
19
};
20
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
// If the importer is in node compatibility mode or this is not an ESM
22
// file that has been converted to a CommonJS file using a Babel-
23
// compatible transform (i.e. "__esModule" has not been set), then set
24
// "default" to the CommonJS "module.exports" for node compatibility.
25
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
mod
27
));
28
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
var teleEmitter_exports = {};
30
__export(teleEmitter_exports, {
31
TeleReporterEmitter: () => TeleReporterEmitter
32
});
33
module.exports = __toCommonJS(teleEmitter_exports);
34
var import_path = __toESM(require("path"));
35
var import_utils = require("playwright-core/lib/utils");
36
var import_teleReceiver = require("../isomorphic/teleReceiver");
37
class TeleReporterEmitter {
38
constructor(messageSink, options = {}) {
39
this._resultKnownAttachmentCounts = /* @__PURE__ */ new Map();
40
this._resultKnownErrorCounts = /* @__PURE__ */ new Map();
41
// In case there is blob reporter and UI mode, make sure one doesn't override
42
// the id assigned by the other.
43
this._idSymbol = Symbol("id");
44
this._messageSink = messageSink;
45
this._emitterOptions = options;
46
}
47
version() {
48
return "v2";
49
}
50
onConfigure(config) {
51
this._rootDir = config.rootDir;
52
this._messageSink({ method: "onConfigure", params: { config: this._serializeConfig(config) } });
53
}
54
onBegin(suite) {
55
const projects = suite.suites.map((projectSuite) => this._serializeProject(projectSuite));
56
for (const project of projects)
57
this._messageSink({ method: "onProject", params: { project } });
58
this._messageSink({ method: "onBegin", params: void 0 });
59
}
60
onTestBegin(test, result) {
61
result[this._idSymbol] = (0, import_utils.createGuid)();
62
this._messageSink({
63
method: "onTestBegin",
64
params: {
65
testId: test.id,
66
result: this._serializeResultStart(result)
67
}
68
});
69
}
70
async onTestPaused(test, result) {
71
const resultId = result[this._idSymbol];
72
this._resultKnownErrorCounts.set(resultId, result.errors.length);
73
this._messageSink({
74
method: "onTestPaused",
75
params: {
76
testId: test.id,
77
resultId,
78
errors: result.errors
79
}
80
});
81
await new Promise(() => {
82
});
83
}
84
onTestEnd(test, result) {
85
const testEnd = {
86
testId: test.id,
87
expectedStatus: test.expectedStatus,
88
timeout: test.timeout,
89
annotations: []
90
};
91
this._sendNewAttachments(result, test.id);
92
this._messageSink({
93
method: "onTestEnd",
94
params: {
95
test: testEnd,
96
result: this._serializeResultEnd(result)
97
}
98
});
99
const resultId = result[this._idSymbol];
100
this._resultKnownAttachmentCounts.delete(resultId);
101
this._resultKnownErrorCounts.delete(resultId);
102
}
103
onStepBegin(test, result, step) {
104
step[this._idSymbol] = (0, import_utils.createGuid)();
105
this._messageSink({
106
method: "onStepBegin",
107
params: {
108
testId: test.id,
109
resultId: result[this._idSymbol],
110
step: this._serializeStepStart(step)
111
}
112
});
113
}
114
onStepEnd(test, result, step) {
115
const resultId = result[this._idSymbol];
116
this._sendNewAttachments(result, test.id);
117
this._messageSink({
118
method: "onStepEnd",
119
params: {
120
testId: test.id,
121
resultId,
122
step: this._serializeStepEnd(step, result)
123
}
124
});
125
}
126
onError(error) {
127
this._messageSink({
128
method: "onError",
129
params: { error }
130
});
131
}
132
onStdOut(chunk, test, result) {
133
this._onStdIO("stdout", chunk, test, result);
134
}
135
onStdErr(chunk, test, result) {
136
this._onStdIO("stderr", chunk, test, result);
137
}
138
_onStdIO(type, chunk, test, result) {
139
if (this._emitterOptions.omitOutput)
140
return;
141
const isBase64 = typeof chunk !== "string";
142
const data = isBase64 ? chunk.toString("base64") : chunk;
143
this._messageSink({
144
method: "onStdIO",
145
params: { testId: test?.id, resultId: result ? result[this._idSymbol] : void 0, type, data, isBase64 }
146
});
147
}
148
async onEnd(result) {
149
const resultPayload = {
150
status: result.status,
151
startTime: result.startTime.getTime(),
152
duration: result.duration
153
};
154
this._messageSink({
155
method: "onEnd",
156
params: {
157
result: resultPayload
158
}
159
});
160
}
161
printsToStdio() {
162
return false;
163
}
164
_serializeConfig(config) {
165
return {
166
configFile: this._relativePath(config.configFile),
167
globalTimeout: config.globalTimeout,
168
maxFailures: config.maxFailures,
169
metadata: config.metadata,
170
rootDir: config.rootDir,
171
version: config.version,
172
workers: config.workers,
173
globalSetup: config.globalSetup,
174
globalTeardown: config.globalTeardown,
175
tags: config.tags,
176
webServer: config.webServer
177
};
178
}
179
_serializeProject(suite) {
180
const project = suite.project();
181
const report = {
182
metadata: project.metadata,
183
name: project.name,
184
outputDir: this._relativePath(project.outputDir),
185
repeatEach: project.repeatEach,
186
retries: project.retries,
187
testDir: this._relativePath(project.testDir),
188
testIgnore: (0, import_teleReceiver.serializeRegexPatterns)(project.testIgnore),
189
testMatch: (0, import_teleReceiver.serializeRegexPatterns)(project.testMatch),
190
timeout: project.timeout,
191
suites: suite.suites.map((fileSuite) => {
192
return this._serializeSuite(fileSuite);
193
}),
194
grep: (0, import_teleReceiver.serializeRegexPatterns)(project.grep),
195
grepInvert: (0, import_teleReceiver.serializeRegexPatterns)(project.grepInvert || []),
196
dependencies: project.dependencies,
197
snapshotDir: this._relativePath(project.snapshotDir),
198
teardown: project.teardown,
199
use: this._serializeProjectUseOptions(project.use)
200
};
201
return report;
202
}
203
_serializeProjectUseOptions(use) {
204
return {
205
testIdAttribute: use.testIdAttribute
206
};
207
}
208
_serializeSuite(suite) {
209
const result = {
210
title: suite.title,
211
location: this._relativeLocation(suite.location),
212
entries: suite.entries().map((e) => {
213
if (e.type === "test")
214
return this._serializeTest(e);
215
return this._serializeSuite(e);
216
})
217
};
218
return result;
219
}
220
_serializeTest(test) {
221
return {
222
testId: test.id,
223
title: test.title,
224
location: this._relativeLocation(test.location),
225
retries: test.retries,
226
tags: test.tags,
227
repeatEachIndex: test.repeatEachIndex,
228
annotations: this._relativeAnnotationLocations(test.annotations)
229
};
230
}
231
_serializeResultStart(result) {
232
return {
233
id: result[this._idSymbol],
234
retry: result.retry,
235
workerIndex: result.workerIndex,
236
parallelIndex: result.parallelIndex,
237
startTime: +result.startTime
238
};
239
}
240
_serializeResultEnd(result) {
241
const id = result[this._idSymbol];
242
return {
243
id,
244
duration: result.duration,
245
status: result.status,
246
errors: this._resultKnownErrorCounts.has(id) ? result.errors.slice(this._resultKnownAttachmentCounts.get(id)) : result.errors,
247
annotations: result.annotations?.length ? this._relativeAnnotationLocations(result.annotations) : void 0
248
};
249
}
250
_sendNewAttachments(result, testId) {
251
const resultId = result[this._idSymbol];
252
const knownAttachmentCount = this._resultKnownAttachmentCounts.get(resultId) ?? 0;
253
if (result.attachments.length > knownAttachmentCount) {
254
this._messageSink({
255
method: "onAttach",
256
params: {
257
testId,
258
resultId,
259
attachments: this._serializeAttachments(result.attachments.slice(knownAttachmentCount))
260
}
261
});
262
}
263
this._resultKnownAttachmentCounts.set(resultId, result.attachments.length);
264
}
265
_serializeAttachments(attachments) {
266
return attachments.map((a) => {
267
const { body, ...rest } = a;
268
return {
269
...rest,
270
// There is no Buffer in the browser, so there is no point in sending the data there.
271
base64: body && !this._emitterOptions.omitBuffers ? body.toString("base64") : void 0
272
};
273
});
274
}
275
_serializeStepStart(step) {
276
return {
277
id: step[this._idSymbol],
278
parentStepId: step.parent?.[this._idSymbol],
279
title: step.title,
280
category: step.category,
281
startTime: +step.startTime,
282
location: this._relativeLocation(step.location)
283
};
284
}
285
_serializeStepEnd(step, result) {
286
return {
287
id: step[this._idSymbol],
288
duration: step.duration,
289
error: step.error,
290
attachments: step.attachments.length ? step.attachments.map((a) => result.attachments.indexOf(a)) : void 0,
291
annotations: step.annotations.length ? this._relativeAnnotationLocations(step.annotations) : void 0
292
};
293
}
294
_relativeAnnotationLocations(annotations) {
295
return annotations.map((annotation) => ({
296
...annotation,
297
location: annotation.location ? this._relativeLocation(annotation.location) : void 0
298
}));
299
}
300
_relativeLocation(location) {
301
if (!location)
302
return location;
303
return {
304
...location,
305
file: this._relativePath(location.file)
306
};
307
}
308
_relativePath(absolutePath) {
309
if (!absolutePath)
310
return absolutePath;
311
return import_path.default.relative(this._rootDir, absolutePath);
312
}
313
}
314
// Annotate the CommonJS export names for ESM import in node:
315
0 && (module.exports = {
316
TeleReporterEmitter
317
});
318

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button