@wdio/browserstack-service 7.35.0 → 7.36.0
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/build/bstackLogger.d.ts +14 -0
- package/build/bstackLogger.d.ts.map +1 -0
- package/build/bstackLogger.js +52 -0
- package/build/cleanup.d.ts +6 -2
- package/build/cleanup.d.ts.map +1 -1
- package/build/cleanup.js +104 -12
- package/build/config.d.ts +23 -0
- package/build/config.d.ts.map +1 -0
- package/build/config.js +32 -0
- package/build/constants.d.ts +17 -0
- package/build/constants.d.ts.map +1 -1
- package/build/constants.js +34 -1
- package/build/crash-reporter.js +1 -1
- package/build/data-store.d.ts +3 -0
- package/build/data-store.d.ts.map +1 -0
- package/build/data-store.js +49 -0
- package/build/exitHandler.d.ts +4 -0
- package/build/exitHandler.d.ts.map +1 -0
- package/build/exitHandler.js +37 -0
- package/build/insights-handler.d.ts +5 -11
- package/build/insights-handler.d.ts.map +1 -1
- package/build/insights-handler.js +45 -106
- package/build/instrumentation/funnelInstrumentation.d.ts +6 -0
- package/build/instrumentation/funnelInstrumentation.d.ts.map +1 -0
- package/build/instrumentation/funnelInstrumentation.js +127 -0
- package/build/launcher.d.ts +1 -2
- package/build/launcher.d.ts.map +1 -1
- package/build/launcher.js +21 -20
- package/build/reporter.d.ts +3 -3
- package/build/reporter.d.ts.map +1 -1
- package/build/reporter.js +10 -23
- package/build/request-handler.d.ts +5 -13
- package/build/request-handler.d.ts.map +1 -1
- package/build/request-handler.js +27 -48
- package/build/service.d.ts +1 -0
- package/build/service.d.ts.map +1 -1
- package/build/service.js +14 -6
- package/build/testOps/featureStats.d.ts +45 -0
- package/build/testOps/featureStats.d.ts.map +1 -0
- package/build/testOps/featureStats.js +120 -0
- package/build/testOps/featureUsage.d.ts +22 -0
- package/build/testOps/featureUsage.d.ts.map +1 -0
- package/build/testOps/featureUsage.js +46 -0
- package/build/testOps/listener.d.ts +33 -0
- package/build/testOps/listener.d.ts.map +1 -0
- package/build/testOps/listener.js +228 -0
- package/build/testOps/requestUtils.d.ts +4 -0
- package/build/testOps/requestUtils.d.ts.map +1 -0
- package/build/testOps/requestUtils.js +47 -0
- package/build/testOps/testOpsConfig.d.ts +11 -0
- package/build/testOps/testOpsConfig.d.ts.map +1 -0
- package/build/testOps/testOpsConfig.js +17 -0
- package/build/testOps/usageStats.d.ts +404 -0
- package/build/testOps/usageStats.d.ts.map +1 -0
- package/build/testOps/usageStats.js +110 -0
- package/build/types.d.ts +33 -7
- package/build/types.d.ts.map +1 -1
- package/build/util.d.ts +2 -6
- package/build/util.d.ts.map +1 -1
- package/build/util.js +60 -66
- package/package.json +3 -3
package/build/util.js
CHANGED
|
@@ -26,7 +26,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
26
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
27
|
};
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.ObjectsAreEqual = exports.isObject = exports.isTrue = exports.isUndefined = exports.getBrowserStackKey = exports.getBrowserStackUser = exports.stopAccessibilityTestRun = exports.getA11yResultsSummary = exports.getA11yResults = exports.createAccessibilityTestRun = exports.isAccessibilityAutomationSession = exports.shouldScanTestForAccessibility = exports.validateCapsWithA11y = exports.
|
|
29
|
+
exports.getErrorString = exports.isObjectEmpty = exports.ObjectsAreEqual = exports.isObject = exports.isTrue = exports.isUndefined = exports.getBrowserStackKey = exports.getBrowserStackUser = exports.stopAccessibilityTestRun = exports.getA11yResultsSummary = exports.getA11yResults = exports.createAccessibilityTestRun = exports.isAccessibilityAutomationSession = exports.shouldScanTestForAccessibility = exports.validateCapsWithA11y = exports.sleep = exports.patchConsoleLogs = exports.getFailureObject = exports.frameworkSupportsHook = exports.getObservabilityBuildTags = exports.getObservabilityBuild = exports.getObservabilityProject = exports.getObservabilityKey = exports.getObservabilityUser = exports.batchAndPostEvents = exports.shouldAddServiceVersion = exports.isBStackSession = exports.isScreenshotCommand = exports.getHookType = exports.getHierarchy = exports.getLogTag = exports.removeAnsiColors = exports.getScenarioExamples = exports.isBrowserstackSession = exports.getCloudProvider = exports.getUniqueIdentifierForCucumber = exports.getUniqueIdentifier = exports.getGitMetaData = exports.nodeRequest = exports.getCiInfo = exports.stopBuildUpstream = exports.launchTestSession = exports.o11yClassErrorHandler = exports.o11yErrorHandler = exports.errorHandler = exports.getParentSuiteName = exports.isBrowserstackCapability = exports.getBrowserCapabilities = exports.getBrowserDescription = exports.DEFAULT_REQUEST_CONFIG = void 0;
|
|
30
30
|
const os_1 = require("os");
|
|
31
31
|
const util_1 = require("util");
|
|
32
32
|
const http_1 = __importDefault(require("http"));
|
|
@@ -40,9 +40,10 @@ const gitconfiglocal_1 = __importDefault(require("gitconfiglocal"));
|
|
|
40
40
|
const crash_reporter_1 = __importDefault(require("./crash-reporter"));
|
|
41
41
|
const logPatcher_1 = __importDefault(require("./logPatcher"));
|
|
42
42
|
const constants_1 = require("./constants");
|
|
43
|
-
const request_handler_1 = __importDefault(require("./request-handler"));
|
|
44
43
|
const performance_tester_1 = __importDefault(require("./performance-tester"));
|
|
45
44
|
const test_event_scripts_1 = require("./scripts/test-event-scripts");
|
|
45
|
+
const usageStats_1 = __importDefault(require("./testOps/usageStats"));
|
|
46
|
+
const testOpsConfig_1 = __importDefault(require("./testOps/testOpsConfig"));
|
|
46
47
|
const pGitconfig = (0, util_1.promisify)(gitconfiglocal_1.default);
|
|
47
48
|
const log = (0, logger_1.default)('@wdio/browserstack-service');
|
|
48
49
|
exports.DEFAULT_REQUEST_CONFIG = {
|
|
@@ -145,7 +146,7 @@ function o11yErrorHandler(fn) {
|
|
|
145
146
|
return function (...args) {
|
|
146
147
|
try {
|
|
147
148
|
let functionToHandle = fn;
|
|
148
|
-
if (process.env.
|
|
149
|
+
if (process.env[constants_1.PERF_MEASUREMENT_ENV]) {
|
|
149
150
|
functionToHandle = performance_tester_1.default.getPerformance().timerify(functionToHandle);
|
|
150
151
|
}
|
|
151
152
|
const result = functionToHandle(...args);
|
|
@@ -173,7 +174,7 @@ function o11yClassErrorHandler(errorClass) {
|
|
|
173
174
|
writable: true,
|
|
174
175
|
value: function (...args) {
|
|
175
176
|
try {
|
|
176
|
-
const result = (process.env.
|
|
177
|
+
const result = (process.env[constants_1.PERF_MEASUREMENT_ENV] ? performance_tester_1.default.getPerformance().timerify(method) : method).call(this, ...args);
|
|
177
178
|
if (result instanceof Promise) {
|
|
178
179
|
return result.catch(error => processError(error, method, args));
|
|
179
180
|
}
|
|
@@ -190,6 +191,8 @@ function o11yClassErrorHandler(errorClass) {
|
|
|
190
191
|
}
|
|
191
192
|
exports.o11yClassErrorHandler = o11yClassErrorHandler;
|
|
192
193
|
exports.launchTestSession = o11yErrorHandler(async function launchTestSession(options, config, bsConfig) {
|
|
194
|
+
const launchBuildUsage = usageStats_1.default.getInstance().launchBuildUsage;
|
|
195
|
+
launchBuildUsage.triggered();
|
|
193
196
|
const data = {
|
|
194
197
|
format: 'json',
|
|
195
198
|
project_name: getObservabilityProject(options, bsConfig.projectName),
|
|
@@ -206,7 +209,7 @@ exports.launchTestSession = o11yErrorHandler(async function launchTestSession(op
|
|
|
206
209
|
},
|
|
207
210
|
ci_info: getCiInfo(),
|
|
208
211
|
build_run_identifier: process.env.BROWSERSTACK_BUILD_RUN_IDENTIFIER,
|
|
209
|
-
failed_tests_rerun: process.env.
|
|
212
|
+
failed_tests_rerun: process.env[constants_1.RERUN_ENV] || false,
|
|
210
213
|
version_control: await getGitMetaData(),
|
|
211
214
|
observability_version: {
|
|
212
215
|
frameworkName: 'WebdriverIO-' + config.framework,
|
|
@@ -232,13 +235,17 @@ exports.launchTestSession = o11yErrorHandler(async function launchTestSession(op
|
|
|
232
235
|
json: data
|
|
233
236
|
}).json();
|
|
234
237
|
log.debug(`[Start_Build] Success response: ${JSON.stringify(response)}`);
|
|
235
|
-
process.env.
|
|
236
|
-
if (response.jwt)
|
|
237
|
-
process.env.
|
|
238
|
-
|
|
239
|
-
|
|
238
|
+
process.env[constants_1.TESTOPS_BUILD_COMPLETED_ENV] = 'true';
|
|
239
|
+
if (response.jwt) {
|
|
240
|
+
process.env[constants_1.TESTOPS_JWT_ENV] = response.jwt;
|
|
241
|
+
launchBuildUsage.success();
|
|
242
|
+
}
|
|
243
|
+
if (response.build_hashed_id) {
|
|
244
|
+
process.env[constants_1.TESTOPS_BUILD_ID_ENV] = response.build_hashed_id;
|
|
245
|
+
testOpsConfig_1.default.getInstance().buildHashedId = response.build_hashed_id;
|
|
246
|
+
}
|
|
240
247
|
if (response.allow_screenshots)
|
|
241
|
-
process.env.
|
|
248
|
+
process.env[constants_1.TESTOPS_SCREENSHOT_ENV] = response.allow_screenshots.toString();
|
|
242
249
|
}
|
|
243
250
|
catch (error) {
|
|
244
251
|
if (error instanceof got_1.HTTPError && error.response) {
|
|
@@ -257,18 +264,27 @@ exports.launchTestSession = o11yErrorHandler(async function launchTestSession(op
|
|
|
257
264
|
default:
|
|
258
265
|
log.error(errorMessage);
|
|
259
266
|
}
|
|
267
|
+
launchBuildUsage.failed(errorMessage || error);
|
|
260
268
|
}
|
|
261
269
|
else {
|
|
262
270
|
log.error(`Data upload to BrowserStack Test Observability failed due to ${error}`);
|
|
271
|
+
launchBuildUsage.failed(error);
|
|
263
272
|
}
|
|
264
273
|
}
|
|
265
274
|
});
|
|
266
275
|
exports.stopBuildUpstream = o11yErrorHandler(async function stopBuildUpstream() {
|
|
267
|
-
|
|
268
|
-
|
|
276
|
+
const stopBuildUsage = usageStats_1.default.getInstance().stopBuildUsage;
|
|
277
|
+
stopBuildUsage.triggered();
|
|
278
|
+
if (!process.env[constants_1.TESTOPS_BUILD_COMPLETED_ENV]) {
|
|
279
|
+
stopBuildUsage.failed('Build is not completed yet');
|
|
280
|
+
return {
|
|
281
|
+
status: 'error',
|
|
282
|
+
message: 'Build is not completed yet'
|
|
283
|
+
};
|
|
269
284
|
}
|
|
270
|
-
if (!process.env.
|
|
285
|
+
if (!process.env[constants_1.TESTOPS_JWT_ENV]) {
|
|
271
286
|
log.debug('[STOP_BUILD] Missing Authentication Token/ Build ID');
|
|
287
|
+
stopBuildUsage.failed('Token/buildID is undefined, build creation might have failed');
|
|
272
288
|
return {
|
|
273
289
|
status: 'error',
|
|
274
290
|
message: 'Token/buildID is undefined, build creation might have failed'
|
|
@@ -278,22 +294,24 @@ exports.stopBuildUpstream = o11yErrorHandler(async function stopBuildUpstream()
|
|
|
278
294
|
'stop_time': (new Date()).toISOString()
|
|
279
295
|
};
|
|
280
296
|
try {
|
|
281
|
-
const url = `${constants_1.DATA_ENDPOINT}/api/v1/builds/${process.env.
|
|
297
|
+
const url = `${constants_1.DATA_ENDPOINT}/api/v1/builds/${process.env[constants_1.TESTOPS_BUILD_ID_ENV]}/stop`;
|
|
282
298
|
const response = await got_1.default.put(url, {
|
|
283
299
|
agent: exports.DEFAULT_REQUEST_CONFIG.agent,
|
|
284
300
|
headers: {
|
|
285
301
|
...exports.DEFAULT_REQUEST_CONFIG.headers,
|
|
286
|
-
'Authorization': `Bearer ${process.env.
|
|
302
|
+
'Authorization': `Bearer ${process.env[constants_1.TESTOPS_JWT_ENV]}`
|
|
287
303
|
},
|
|
288
304
|
json: data
|
|
289
305
|
}).json();
|
|
290
306
|
log.debug(`[STOP_BUILD] Success response: ${JSON.stringify(response)}`);
|
|
307
|
+
stopBuildUsage.success();
|
|
291
308
|
return {
|
|
292
309
|
status: 'success',
|
|
293
310
|
message: ''
|
|
294
311
|
};
|
|
295
312
|
}
|
|
296
313
|
catch (error) {
|
|
314
|
+
stopBuildUsage.failed(error);
|
|
297
315
|
log.debug(`[STOP_BUILD] Failed. Error: ${error}`);
|
|
298
316
|
return {
|
|
299
317
|
status: 'error',
|
|
@@ -667,43 +685,6 @@ function getLogTag(eventType) {
|
|
|
667
685
|
return 'undefined';
|
|
668
686
|
}
|
|
669
687
|
exports.getLogTag = getLogTag;
|
|
670
|
-
async function uploadEventData(eventData, eventUrl = constants_1.DATA_EVENT_ENDPOINT) {
|
|
671
|
-
let logTag = 'BATCH_UPLOAD';
|
|
672
|
-
if (!Array.isArray(eventData)) {
|
|
673
|
-
logTag = getLogTag(eventData.event_type);
|
|
674
|
-
}
|
|
675
|
-
if (eventUrl == constants_1.DATA_SCREENSHOT_ENDPOINT)
|
|
676
|
-
logTag = 'screenshot_upload';
|
|
677
|
-
if (!process.env.BS_TESTOPS_BUILD_COMPLETED) {
|
|
678
|
-
return;
|
|
679
|
-
}
|
|
680
|
-
if (!process.env.BS_TESTOPS_JWT) {
|
|
681
|
-
log.debug(`[${logTag}] Missing Authentication Token/ Build ID`);
|
|
682
|
-
return {
|
|
683
|
-
status: 'error',
|
|
684
|
-
message: 'Token/buildID is undefined, build creation might have failed'
|
|
685
|
-
};
|
|
686
|
-
}
|
|
687
|
-
try {
|
|
688
|
-
const url = `${constants_1.DATA_ENDPOINT}/${eventUrl}`;
|
|
689
|
-
request_handler_1.default.getInstance().pendingUploads += 1;
|
|
690
|
-
const data = await got_1.default.post(url, {
|
|
691
|
-
agent: exports.DEFAULT_REQUEST_CONFIG.agent,
|
|
692
|
-
headers: {
|
|
693
|
-
...exports.DEFAULT_REQUEST_CONFIG.headers,
|
|
694
|
-
'Authorization': `Bearer ${process.env.BS_TESTOPS_JWT}`
|
|
695
|
-
},
|
|
696
|
-
json: eventData
|
|
697
|
-
}).json();
|
|
698
|
-
log.debug(`[${logTag}] Success response: ${JSON.stringify(data)}`);
|
|
699
|
-
request_handler_1.default.getInstance().pendingUploads -= 1;
|
|
700
|
-
}
|
|
701
|
-
catch (error) {
|
|
702
|
-
log.debug(`[${logTag}] Failed. Error: ${error}`);
|
|
703
|
-
request_handler_1.default.getInstance().pendingUploads -= 1;
|
|
704
|
-
}
|
|
705
|
-
}
|
|
706
|
-
exports.uploadEventData = uploadEventData;
|
|
707
688
|
// get hierarchy for a particular test (called by reporter for skipped tests)
|
|
708
689
|
function getHierarchy(fullTitle) {
|
|
709
690
|
if (!fullTitle)
|
|
@@ -746,8 +727,12 @@ function shouldAddServiceVersion(config, testObservability) {
|
|
|
746
727
|
}
|
|
747
728
|
exports.shouldAddServiceVersion = shouldAddServiceVersion;
|
|
748
729
|
async function batchAndPostEvents(eventUrl, kind, data) {
|
|
749
|
-
if (!process.env.
|
|
750
|
-
|
|
730
|
+
if (!process.env[constants_1.TESTOPS_BUILD_COMPLETED_ENV]) {
|
|
731
|
+
throw new Error('Build not completed yet');
|
|
732
|
+
}
|
|
733
|
+
const jwtToken = process.env[constants_1.TESTOPS_JWT_ENV];
|
|
734
|
+
if (!jwtToken) {
|
|
735
|
+
throw new Error('Missing authentication Token');
|
|
751
736
|
}
|
|
752
737
|
try {
|
|
753
738
|
const url = `${constants_1.DATA_ENDPOINT}/${eventUrl}`;
|
|
@@ -755,7 +740,7 @@ async function batchAndPostEvents(eventUrl, kind, data) {
|
|
|
755
740
|
agent: exports.DEFAULT_REQUEST_CONFIG.agent,
|
|
756
741
|
headers: {
|
|
757
742
|
...exports.DEFAULT_REQUEST_CONFIG.headers,
|
|
758
|
-
'Authorization': `Bearer ${
|
|
743
|
+
'Authorization': `Bearer ${jwtToken}`
|
|
759
744
|
},
|
|
760
745
|
json: data
|
|
761
746
|
}).json();
|
|
@@ -763,6 +748,7 @@ async function batchAndPostEvents(eventUrl, kind, data) {
|
|
|
763
748
|
}
|
|
764
749
|
catch (error) {
|
|
765
750
|
log.debug(`[${kind}] EXCEPTION IN ${kind} REQUEST TO TEST OBSERVABILITY : ${error}`);
|
|
751
|
+
throw new Error('Exception in request ' + error);
|
|
766
752
|
}
|
|
767
753
|
}
|
|
768
754
|
exports.batchAndPostEvents = batchAndPostEvents;
|
|
@@ -858,16 +844,6 @@ function patchConsoleLogs() {
|
|
|
858
844
|
exports.patchConsoleLogs = patchConsoleLogs;
|
|
859
845
|
const sleep = (ms = 100) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
860
846
|
exports.sleep = sleep;
|
|
861
|
-
async function pushDataToQueue(data, requestQueueHandler = undefined) {
|
|
862
|
-
if (!requestQueueHandler) {
|
|
863
|
-
requestQueueHandler = request_handler_1.default.getInstance();
|
|
864
|
-
}
|
|
865
|
-
const req = requestQueueHandler.add(data);
|
|
866
|
-
if (req.proceed && req.data) {
|
|
867
|
-
await uploadEventData(req.data, req.url);
|
|
868
|
-
}
|
|
869
|
-
}
|
|
870
|
-
exports.pushDataToQueue = pushDataToQueue;
|
|
871
847
|
const validateCapsWithA11y = (deviceName, platformMeta, chromeOptions) => {
|
|
872
848
|
var _a, _b;
|
|
873
849
|
try {
|
|
@@ -1112,3 +1088,21 @@ const ObjectsAreEqual = (object1, object2) => {
|
|
|
1112
1088
|
return true;
|
|
1113
1089
|
};
|
|
1114
1090
|
exports.ObjectsAreEqual = ObjectsAreEqual;
|
|
1091
|
+
const isObjectEmpty = (objectName) => {
|
|
1092
|
+
return (objectName &&
|
|
1093
|
+
Object.keys(objectName).length === 0 &&
|
|
1094
|
+
objectName.constructor === Object);
|
|
1095
|
+
};
|
|
1096
|
+
exports.isObjectEmpty = isObjectEmpty;
|
|
1097
|
+
const getErrorString = (err) => {
|
|
1098
|
+
if (!err) {
|
|
1099
|
+
return undefined;
|
|
1100
|
+
}
|
|
1101
|
+
if (typeof err === 'string') {
|
|
1102
|
+
return err; // works, `e` narrowed to string
|
|
1103
|
+
}
|
|
1104
|
+
else if (err instanceof Error) {
|
|
1105
|
+
return err.message; // works, `e` narrowed to Error
|
|
1106
|
+
}
|
|
1107
|
+
};
|
|
1108
|
+
exports.getErrorString = getErrorString;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wdio/browserstack-service",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.36.0",
|
|
4
4
|
"description": "WebdriverIO service for better Browserstack integration",
|
|
5
5
|
"author": "Adam Bjerstedt <abjerstedt@gmail.com>",
|
|
6
6
|
"homepage": "https://github.com/webdriverio/webdriverio/tree/main/packages/wdio-browserstack-service",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"gitconfiglocal": "^2.1.0",
|
|
37
37
|
"got": "^11.0.2",
|
|
38
38
|
"uuid": "^9.0.1",
|
|
39
|
-
"webdriverio": "7.
|
|
39
|
+
"webdriverio": "7.36.0",
|
|
40
40
|
"winston-transport": "^4.5.0",
|
|
41
41
|
"yauzl": "^2.10.0"
|
|
42
42
|
},
|
|
@@ -47,5 +47,5 @@
|
|
|
47
47
|
"access": "public"
|
|
48
48
|
},
|
|
49
49
|
"types": "./build/index.d.ts",
|
|
50
|
-
"gitHead": "
|
|
50
|
+
"gitHead": "978016defb1c1cb7a3a819c493c350f20fdfbb36"
|
|
51
51
|
}
|