@wdio/browserstack-service 9.28.0 → 9.29.1
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/cleanup.js +4 -1
- package/build/cli/frameworks/constants/testFrameworkConstants.d.ts +1 -0
- package/build/cli/frameworks/constants/testFrameworkConstants.d.ts.map +1 -1
- package/build/cli/index.d.ts.map +1 -1
- package/build/cli/modules/customTagsModule.d.ts +31 -0
- package/build/cli/modules/customTagsModule.d.ts.map +1 -0
- package/build/custom-tags-handler.d.ts +29 -0
- package/build/custom-tags-handler.d.ts.map +1 -0
- package/build/customTags.d.ts +59 -0
- package/build/customTags.d.ts.map +1 -0
- package/build/index.js +458 -10
- package/build/insights-handler.d.ts +21 -0
- package/build/insights-handler.d.ts.map +1 -1
- package/build/instrumentation/funnelInstrumentation.d.ts.map +1 -1
- package/build/service.d.ts +17 -1
- package/build/service.d.ts.map +1 -1
- package/build/types.d.ts +9 -0
- package/build/types.d.ts.map +1 -1
- package/package.json +7 -7
package/build/cleanup.js
CHANGED
|
@@ -70,7 +70,7 @@ import logger from "@wdio/logger";
|
|
|
70
70
|
// package.json
|
|
71
71
|
var package_default = {
|
|
72
72
|
name: "@wdio/browserstack-service",
|
|
73
|
-
version: "9.
|
|
73
|
+
version: "9.29.0",
|
|
74
74
|
description: "WebdriverIO service for better Browserstack integration",
|
|
75
75
|
author: "Adam Bjerstedt <abjerstedt@gmail.com>",
|
|
76
76
|
homepage: "https://github.com/webdriverio/webdriverio/tree/main/packages/wdio-browserstack-service",
|
|
@@ -591,6 +591,7 @@ var TestFrameworkConstants = {
|
|
|
591
591
|
KEY_TEST_FAILURE_REASON: "test_failure_reason",
|
|
592
592
|
KEY_TEST_LOGS: "test_logs",
|
|
593
593
|
KEY_TEST_META: "test_meta",
|
|
594
|
+
KEY_CUSTOM_TAGS: "custom_metadata",
|
|
594
595
|
KEY_TEST_DEFERRED: "test_deferred",
|
|
595
596
|
KEY_SESSION_NAME: "test_session_name",
|
|
596
597
|
KEY_AUTOMATE_SESSION_NAME: "automate_session_name",
|
|
@@ -2505,6 +2506,8 @@ var TestOpsConfig = class _TestOpsConfig {
|
|
|
2505
2506
|
this.manuallySet = manuallySet;
|
|
2506
2507
|
_TestOpsConfig._instance = this;
|
|
2507
2508
|
}
|
|
2509
|
+
enabled;
|
|
2510
|
+
manuallySet;
|
|
2508
2511
|
static _instance;
|
|
2509
2512
|
buildStopped = false;
|
|
2510
2513
|
buildHashedId;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testFrameworkConstants.d.ts","sourceRoot":"","sources":["../../../../src/cli/frameworks/constants/testFrameworkConstants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB
|
|
1
|
+
{"version":3,"file":"testFrameworkConstants.d.ts","sourceRoot":"","sources":["../../../../src/cli/frameworks/constants/testFrameworkConstants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0ClC,CAAA"}
|
package/build/cli/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAK7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAA;AACtF,OAAO,KAAK,UAAU,MAAM,yBAAyB,CAAA;AAErD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE1C,OAAO,sBAAsB,MAAM,wCAAwC,CAAA;AAC3E,OAAO,uBAAuB,MAAM,yCAAyC,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAK7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAA;AACtF,OAAO,KAAK,UAAU,MAAM,yBAAyB,CAAA;AAErD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE1C,OAAO,sBAAsB,MAAM,wCAAwC,CAAA;AAC3E,OAAO,uBAAuB,MAAM,yCAAyC,CAAA;AAM7E,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAkB,MAAM,aAAa,CAAA;AAK1F;;;;;GAKG;AACH,qBAAa,eAAe;;IAExB,MAAM,CAAC,OAAO,UAAQ;IACtB,WAAW,EAAC,OAAO,CAAA;IACnB,MAAM,EAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAC,MAAM,CAAA;IACd,kBAAkB,EAAE,OAAO,CAAC,UAAU,GAAC,EAAE,CAAA;IACzC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAO;IACnC,eAAe,UAAQ;IACvB,gBAAgB,UAAQ;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAO;IAClC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAK;IACxC,aAAa,EAAE,sBAAsB,GAAC,IAAI,CAAO;IACjD,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAO;IAC/C,mBAAmB,EAAE,uBAAuB,GAAC,IAAI,CAAO;IACxD,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAO;IACtC,MAAM,sBAAe;IACrB,OAAO,EAAE,kBAAkB,GAAG,mBAAmB,GAAG,EAAE,CAAA;;IAWtD;;;OAGG;IACH,MAAM,CAAC,WAAW;IAOlB;;;;OAIG;IACG,SAAS,CAAC,OAAO,EAAE,kBAAkB,GAAG,mBAAmB,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,UAAU,EAAE,UAAU,SAAG;IA2B7G;;;OAGG;IACG,SAAS;IAYf;;;OAGG;IACH,WAAW,CAAC,gBAAgB,EAAE,uBAAuB;IA4DrD;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IAgBtB;;;OAGG;IACG,gBAAgB;IAUtB;;;;OAIG;IACG,KAAK;IA6DX;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAyD3B;;;OAGG;IACG,IAAI;IAiDV;;;;OAIG;IACG,kBAAkB;IASxB;;;;OAIG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAM5C;;;;OAIG;IACG,UAAU,CAAC,YAAY,EAAE,MAAM;IAkBrC;;;OAGG;IACH,SAAS;IAWT;;;OAGG;IACH,qBAAqB;IAIrB;;;;OAIG;IACH,qBAAqB,CAAC,kBAAkB,EAAC,OAAO,CAAC,UAAU;IAI3D;;;OAGG;IACG,aAAa;IAOnB;;;OAGG;IACH,YAAY;IAIZ;;;OAGG;IACH,SAAS;IAIT;;;;MAIE;IACF,SAAS,CAAC,QAAQ,EAAE,uBAAuB;IAW3C;;;OAGG;IACH,kBAAkB;IAOlB;;;OAGG;IACH,wBAAwB;IAOxB;;;OAGG;IACH,gBAAgB;IAIhB;;;OAGG;IACH,sBAAsB;CAGzB"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import BaseModule from './baseModule.js';
|
|
2
|
+
import { BStackLogger } from '../cliLogger.js';
|
|
3
|
+
/**
|
|
4
|
+
* CustomTagsModule — CLI/gRPC path registration for `browser.setCustomTags`.
|
|
5
|
+
*
|
|
6
|
+
* Mirrors AccessibilityModule: registers the browser method in onBeforeExecute()
|
|
7
|
+
* (observer-bound to AutomationFrameworkState.CREATE / HookState.POST), instantiated
|
|
8
|
+
* from BrowserstackCLI.loadModules() whenever the binary is up.
|
|
9
|
+
*
|
|
10
|
+
* The per-test custom_metadata is merged directly into the tracked
|
|
11
|
+
* TestFrameworkInstance map under KEY_CUSTOM_TAGS ('custom_metadata'). That whole
|
|
12
|
+
* map is serialized verbatim into event_json (testHubModule.sendTestFrameworkEvent),
|
|
13
|
+
* so the binary reads it as event.custom_metadata. The instance is created fresh
|
|
14
|
+
* per test, so per-instance merge gives test-scoped union/dedupe; the binary is a
|
|
15
|
+
* strict pass-through and does NOT consolidate across events.
|
|
16
|
+
*/
|
|
17
|
+
export default class CustomTagsModule extends BaseModule {
|
|
18
|
+
logger: typeof BStackLogger;
|
|
19
|
+
name: string;
|
|
20
|
+
static MODULE_NAME: string;
|
|
21
|
+
constructor();
|
|
22
|
+
getModuleName(): string;
|
|
23
|
+
onBeforeExecute(): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* If the test framework is currently inside a hook, merge custom_metadata onto
|
|
26
|
+
* the last-started hook record so the binary receives hook.custom_metadata.
|
|
27
|
+
* Best-effort: silently no-ops when no active hook is resolvable.
|
|
28
|
+
*/
|
|
29
|
+
private applyToActiveHook;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=customTagsModule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"customTagsModule.d.ts","sourceRoot":"","sources":["../../../src/cli/modules/customTagsModule.ts"],"names":[],"mappings":"AACA,OAAO,UAAU,MAAM,iBAAiB,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAa9C;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,UAAU;IAEpD,MAAM,sBAAe;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,WAAW,SAAqB;;IAQvC,aAAa;IAIP,eAAe;IAsDrB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;CAiB5B"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { CustomTagAccumulator } from './customTags.js';
|
|
2
|
+
import type { CustomMetadata } from './customTags.js';
|
|
3
|
+
/**
|
|
4
|
+
* Legacy/Listener-path handler for `browser.setCustomTags`.
|
|
5
|
+
*
|
|
6
|
+
* Registered from service.ts in the `!BrowserstackCLI.getInstance().isRunning()`
|
|
7
|
+
* branch (alongside AccessibilityHandler.before() / InsightsHandler.before()).
|
|
8
|
+
* Deliberately NOT folded into InsightsHandler.before() — that method registers
|
|
9
|
+
* no browser methods and is SKIPPED when the CLI is running.
|
|
10
|
+
*
|
|
11
|
+
* Accumulates (key, value) pairs per active test, keyed on
|
|
12
|
+
* InsightsHandler.currentTest.uuid (set in beforeTest / setTestData). The
|
|
13
|
+
* accumulator is static so InsightsHandler.getRunData can drain it into the
|
|
14
|
+
* TestData.custom_metadata field at TestRunFinished (flushed in afterTest).
|
|
15
|
+
*/
|
|
16
|
+
declare class _CustomTagsHandler {
|
|
17
|
+
private _browser;
|
|
18
|
+
private _caps;
|
|
19
|
+
private _framework?;
|
|
20
|
+
static accumulator: CustomTagAccumulator;
|
|
21
|
+
constructor(_browser: WebdriverIO.Browser | WebdriverIO.MultiRemoteBrowser, _caps: WebdriverIO.Capabilities | Record<string, unknown>, _framework?: string | undefined);
|
|
22
|
+
before(): void;
|
|
23
|
+
/** Drain the accumulated custom_metadata for a test uuid; clears after read. */
|
|
24
|
+
static drain(testUuid: string | undefined): CustomMetadata | undefined;
|
|
25
|
+
}
|
|
26
|
+
declare const CustomTagsHandler: typeof _CustomTagsHandler;
|
|
27
|
+
type CustomTagsHandler = _CustomTagsHandler;
|
|
28
|
+
export default CustomTagsHandler;
|
|
29
|
+
//# sourceMappingURL=custom-tags-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-tags-handler.d.ts","sourceRoot":"","sources":["../src/custom-tags-handler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAIrD;;;;;;;;;;;;GAYG;AACH,cAAM,kBAAkB;IAMhB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,UAAU,CAAC;IALvB,OAAc,WAAW,EAAE,oBAAoB,CAA6B;gBAGhE,QAAQ,EAAE,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,kBAAkB,EAC9D,KAAK,EAAE,WAAW,CAAC,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACzD,UAAU,CAAC,EAAE,MAAM,YAAA;IAG/B,MAAM;IA+CN,gFAAgF;IAChF,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS;CAKzE;AAGD,QAAA,MAAM,iBAAiB,EAAE,OAAO,kBAA8D,CAAA;AAC9F,KAAK,iBAAiB,GAAG,kBAAkB,CAAA;AAE3C,eAAe,iBAAiB,CAAA"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helpers for one-to-many custom-tag (Test-Case-ID) tagging.
|
|
3
|
+
*
|
|
4
|
+
* Both runtime paths (CLI/gRPC module + legacy listener handler) funnel through
|
|
5
|
+
* the same tokenizer + merge engine so they produce an identical `custom_metadata`
|
|
6
|
+
* payload shape:
|
|
7
|
+
* { [key]: { field_type: 'multi_dropdown', values: [...] } }
|
|
8
|
+
*
|
|
9
|
+
* The binary is a strict pass-through for per-test/per-hook `custom_metadata` — it
|
|
10
|
+
* does NOT merge or dedupe across events — so the union+dedupe (set semantics)
|
|
11
|
+
* MUST be completed SDK-side before serialization. Value parsing mirrors the
|
|
12
|
+
* node-agent quote-aware tokenizer (helper.js `parseCommaSeparatedValues`).
|
|
13
|
+
*/
|
|
14
|
+
export interface CustomMetadataEntry {
|
|
15
|
+
field_type: 'multi_dropdown';
|
|
16
|
+
values: string[];
|
|
17
|
+
}
|
|
18
|
+
export type CustomMetadata = Record<string, CustomMetadataEntry>;
|
|
19
|
+
/**
|
|
20
|
+
* Quote-aware comma split. Mirrors node-agent `helper.js` tokenizer
|
|
21
|
+
* `/\s*"([^"]*)"\s*|[^,]+/g` — a quoted body is preserved verbatim (so an
|
|
22
|
+
* embedded comma is kept), otherwise the raw token is trimmed; empties dropped.
|
|
23
|
+
* '"checkout,cart", header' -> ['checkout,cart', 'header']
|
|
24
|
+
* 'TC-1, TC-2' -> ['TC-1', 'TC-2']
|
|
25
|
+
* Backward compatible: unquoted input tokenizes identically to a naive
|
|
26
|
+
* split(',').map(trim).filter(Boolean).
|
|
27
|
+
*/
|
|
28
|
+
export declare function parseCommaSeparatedValues(value: string | string[] | undefined | null): string[];
|
|
29
|
+
/**
|
|
30
|
+
* Union + dedupe, existing-first ordering. Mirrors node-agent
|
|
31
|
+
* `CustomTagManager.mergeValues` — repeated calls accumulate, they do not override.
|
|
32
|
+
*/
|
|
33
|
+
export declare function mergeValues(existingValues: string[] | undefined | null, incomingValues: string[] | undefined | null): string[];
|
|
34
|
+
/**
|
|
35
|
+
* Create-or-merge a single tag key inside a `custom_metadata` container.
|
|
36
|
+
* Always produces `{ field_type: 'multi_dropdown', values: [...] }`; merges values
|
|
37
|
+
* via mergeValues. The container is mutated in place and returned for chaining.
|
|
38
|
+
* Mirrors node-agent `CustomTagManager.mergeIntoTags`.
|
|
39
|
+
*/
|
|
40
|
+
export declare function mergeIntoTags(tagsContainer: CustomMetadata, key: string, incomingValues: string[]): CustomMetadata;
|
|
41
|
+
/**
|
|
42
|
+
* Per-test-uuid accumulator. Both paths key on `InsightsHandler.currentTest.uuid`
|
|
43
|
+
* so repeated `setCustomTags` calls within a single test union into one entry, and
|
|
44
|
+
* the flush sink reads the final consolidated map for that test.
|
|
45
|
+
*/
|
|
46
|
+
export declare class CustomTagAccumulator {
|
|
47
|
+
private store;
|
|
48
|
+
/**
|
|
49
|
+
* Add (key, value) for a test uuid. value is quote-aware comma-split; the
|
|
50
|
+
* resulting values union+dedupe into the test's custom_metadata for that key.
|
|
51
|
+
* Returns false (no-op) when uuid/key/value resolve to nothing.
|
|
52
|
+
*/
|
|
53
|
+
add(testUuid: string | undefined, key: string, value: string): boolean;
|
|
54
|
+
/** Final consolidated custom_metadata for a test uuid, or undefined if none. */
|
|
55
|
+
get(testUuid: string | undefined): CustomMetadata | undefined;
|
|
56
|
+
/** Drop the accumulated entry once flushed (avoid unbounded growth). */
|
|
57
|
+
clear(testUuid: string | undefined): void;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=customTags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"customTags.d.ts","sourceRoot":"","sources":["../src/customTags.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,mBAAmB;IAChC,UAAU,EAAE,gBAAgB,CAAA;IAC5B,MAAM,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;AAEhE;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,EAAE,CAyB/F;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,EAAE,CAE9H;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,aAAa,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,cAAc,CAkBlH;AAED;;;;GAIG;AACH,qBAAa,oBAAoB;IAC7B,OAAO,CAAC,KAAK,CAAyC;IAEtD;;;;OAIG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IActE,gFAAgF;IAChF,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS;IAO7D,wEAAwE;IACxE,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;CAK5C"}
|
package/build/index.js
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
3
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
-
var __esm = (fn, res) => function __init() {
|
|
5
|
-
|
|
4
|
+
var __esm = (fn, res, err) => function __init() {
|
|
5
|
+
if (err) throw err[0];
|
|
6
|
+
try {
|
|
7
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
8
|
+
} catch (e) {
|
|
9
|
+
throw err = [e], e;
|
|
10
|
+
}
|
|
6
11
|
};
|
|
7
12
|
var __export = (target, all) => {
|
|
8
13
|
for (var name in all)
|
|
@@ -23,7 +28,7 @@ var init_package = __esm({
|
|
|
23
28
|
"package.json"() {
|
|
24
29
|
package_default = {
|
|
25
30
|
name: "@wdio/browserstack-service",
|
|
26
|
-
version: "9.
|
|
31
|
+
version: "9.29.0",
|
|
27
32
|
description: "WebdriverIO service for better Browserstack integration",
|
|
28
33
|
author: "Adam Bjerstedt <abjerstedt@gmail.com>",
|
|
29
34
|
homepage: "https://github.com/webdriverio/webdriverio/tree/main/packages/wdio-browserstack-service",
|
|
@@ -697,6 +702,7 @@ var init_testFrameworkConstants = __esm({
|
|
|
697
702
|
KEY_TEST_FAILURE_REASON: "test_failure_reason",
|
|
698
703
|
KEY_TEST_LOGS: "test_logs",
|
|
699
704
|
KEY_TEST_META: "test_meta",
|
|
705
|
+
KEY_CUSTOM_TAGS: "custom_metadata",
|
|
700
706
|
KEY_TEST_DEFERRED: "test_deferred",
|
|
701
707
|
KEY_SESSION_NAME: "test_session_name",
|
|
702
708
|
KEY_AUTOMATE_SESSION_NAME: "automate_session_name",
|
|
@@ -2650,6 +2656,8 @@ var init_testOpsConfig = __esm({
|
|
|
2650
2656
|
this.manuallySet = manuallySet;
|
|
2651
2657
|
_TestOpsConfig._instance = this;
|
|
2652
2658
|
}
|
|
2659
|
+
enabled;
|
|
2660
|
+
manuallySet;
|
|
2653
2661
|
static _instance;
|
|
2654
2662
|
buildStopped = false;
|
|
2655
2663
|
buildHashedId;
|
|
@@ -7547,6 +7555,186 @@ var init_accessibilityModule = __esm({
|
|
|
7547
7555
|
}
|
|
7548
7556
|
});
|
|
7549
7557
|
|
|
7558
|
+
// src/customTags.ts
|
|
7559
|
+
function parseCommaSeparatedValues(value) {
|
|
7560
|
+
if (!value) {
|
|
7561
|
+
return [];
|
|
7562
|
+
}
|
|
7563
|
+
if (Array.isArray(value)) {
|
|
7564
|
+
return value;
|
|
7565
|
+
}
|
|
7566
|
+
const str = value.toString();
|
|
7567
|
+
if (str.trim() === "") {
|
|
7568
|
+
return [];
|
|
7569
|
+
}
|
|
7570
|
+
const tokenizer = /\s*"([^"]*)"\s*|[^,]+/g;
|
|
7571
|
+
const out = [];
|
|
7572
|
+
let match;
|
|
7573
|
+
while ((match = tokenizer.exec(str)) !== null) {
|
|
7574
|
+
const token = match[1] !== void 0 ? match[1] : match[0].trim();
|
|
7575
|
+
if (token !== "") {
|
|
7576
|
+
out.push(token);
|
|
7577
|
+
}
|
|
7578
|
+
}
|
|
7579
|
+
return out;
|
|
7580
|
+
}
|
|
7581
|
+
function mergeValues(existingValues, incomingValues) {
|
|
7582
|
+
return Array.from(/* @__PURE__ */ new Set([...existingValues || [], ...incomingValues || []]));
|
|
7583
|
+
}
|
|
7584
|
+
function mergeIntoTags(tagsContainer, key, incomingValues) {
|
|
7585
|
+
if (!tagsContainer[key]) {
|
|
7586
|
+
tagsContainer[key] = {
|
|
7587
|
+
field_type: "multi_dropdown",
|
|
7588
|
+
values: [...incomingValues || []]
|
|
7589
|
+
};
|
|
7590
|
+
} else {
|
|
7591
|
+
if (!tagsContainer[key].field_type) {
|
|
7592
|
+
tagsContainer[key].field_type = "multi_dropdown";
|
|
7593
|
+
}
|
|
7594
|
+
if (!Array.isArray(tagsContainer[key].values)) {
|
|
7595
|
+
tagsContainer[key].values = [];
|
|
7596
|
+
}
|
|
7597
|
+
tagsContainer[key].values = mergeValues(tagsContainer[key].values, incomingValues);
|
|
7598
|
+
}
|
|
7599
|
+
return tagsContainer;
|
|
7600
|
+
}
|
|
7601
|
+
var CustomTagAccumulator;
|
|
7602
|
+
var init_customTags = __esm({
|
|
7603
|
+
"src/customTags.ts"() {
|
|
7604
|
+
"use strict";
|
|
7605
|
+
CustomTagAccumulator = class {
|
|
7606
|
+
store = /* @__PURE__ */ new Map();
|
|
7607
|
+
/**
|
|
7608
|
+
* Add (key, value) for a test uuid. value is quote-aware comma-split; the
|
|
7609
|
+
* resulting values union+dedupe into the test's custom_metadata for that key.
|
|
7610
|
+
* Returns false (no-op) when uuid/key/value resolve to nothing.
|
|
7611
|
+
*/
|
|
7612
|
+
add(testUuid, key, value) {
|
|
7613
|
+
if (!testUuid || !key) {
|
|
7614
|
+
return false;
|
|
7615
|
+
}
|
|
7616
|
+
const values = parseCommaSeparatedValues(value);
|
|
7617
|
+
if (values.length === 0) {
|
|
7618
|
+
return false;
|
|
7619
|
+
}
|
|
7620
|
+
const container = this.store.get(testUuid) || {};
|
|
7621
|
+
mergeIntoTags(container, key, values);
|
|
7622
|
+
this.store.set(testUuid, container);
|
|
7623
|
+
return true;
|
|
7624
|
+
}
|
|
7625
|
+
/** Final consolidated custom_metadata for a test uuid, or undefined if none. */
|
|
7626
|
+
get(testUuid) {
|
|
7627
|
+
if (!testUuid) {
|
|
7628
|
+
return void 0;
|
|
7629
|
+
}
|
|
7630
|
+
return this.store.get(testUuid);
|
|
7631
|
+
}
|
|
7632
|
+
/** Drop the accumulated entry once flushed (avoid unbounded growth). */
|
|
7633
|
+
clear(testUuid) {
|
|
7634
|
+
if (testUuid) {
|
|
7635
|
+
this.store.delete(testUuid);
|
|
7636
|
+
}
|
|
7637
|
+
}
|
|
7638
|
+
};
|
|
7639
|
+
}
|
|
7640
|
+
});
|
|
7641
|
+
|
|
7642
|
+
// src/cli/modules/customTagsModule.ts
|
|
7643
|
+
var CustomTagsModule;
|
|
7644
|
+
var init_customTagsModule = __esm({
|
|
7645
|
+
"src/cli/modules/customTagsModule.ts"() {
|
|
7646
|
+
"use strict";
|
|
7647
|
+
init_baseModule();
|
|
7648
|
+
init_cliLogger();
|
|
7649
|
+
init_testFramework();
|
|
7650
|
+
init_automationFramework();
|
|
7651
|
+
init_automationFrameworkState();
|
|
7652
|
+
init_hookState();
|
|
7653
|
+
init_testFrameworkConstants();
|
|
7654
|
+
init_cliUtils();
|
|
7655
|
+
init_wdioMochaTestFramework();
|
|
7656
|
+
init_customTags();
|
|
7657
|
+
CustomTagsModule = class _CustomTagsModule extends BaseModule {
|
|
7658
|
+
logger = BStackLogger2;
|
|
7659
|
+
name;
|
|
7660
|
+
static MODULE_NAME = "CustomTagsModule";
|
|
7661
|
+
constructor() {
|
|
7662
|
+
super();
|
|
7663
|
+
this.name = "CustomTagsModule";
|
|
7664
|
+
AutomationFramework.registerObserver(AutomationFrameworkState.CREATE, HookState.POST, this.onBeforeExecute.bind(this));
|
|
7665
|
+
}
|
|
7666
|
+
getModuleName() {
|
|
7667
|
+
return _CustomTagsModule.MODULE_NAME;
|
|
7668
|
+
}
|
|
7669
|
+
async onBeforeExecute() {
|
|
7670
|
+
try {
|
|
7671
|
+
const autoInstance = AutomationFramework.getTrackedInstance();
|
|
7672
|
+
if (!autoInstance) {
|
|
7673
|
+
this.logger.debug("CustomTagsModule: No tracked automation instance found!");
|
|
7674
|
+
return;
|
|
7675
|
+
}
|
|
7676
|
+
const browser = AutomationFramework.getDriver(autoInstance);
|
|
7677
|
+
if (!browser) {
|
|
7678
|
+
this.logger.debug("CustomTagsModule: No browser instance found for setCustomTags registration");
|
|
7679
|
+
return;
|
|
7680
|
+
}
|
|
7681
|
+
browser.setCustomTags = async (key, value) => {
|
|
7682
|
+
try {
|
|
7683
|
+
if (!key || !value) {
|
|
7684
|
+
this.logger.warn("setCustomTags: key and value are required; ignoring call");
|
|
7685
|
+
return;
|
|
7686
|
+
}
|
|
7687
|
+
const testInstance = TestFramework.getTrackedInstance();
|
|
7688
|
+
if (!testInstance) {
|
|
7689
|
+
this.logger.warn("setCustomTags called outside of a resolvable test context; ignoring");
|
|
7690
|
+
return;
|
|
7691
|
+
}
|
|
7692
|
+
const values = parseCommaSeparatedValues(value);
|
|
7693
|
+
if (values.length === 0) {
|
|
7694
|
+
this.logger.warn(`setCustomTags: no usable values parsed from "${value}"; ignoring call`);
|
|
7695
|
+
return;
|
|
7696
|
+
}
|
|
7697
|
+
const existing = TestFramework.getState(testInstance, TestFrameworkConstants.KEY_CUSTOM_TAGS) || {};
|
|
7698
|
+
mergeIntoTags(existing, key, values);
|
|
7699
|
+
testInstance.updateMultipleEntries({
|
|
7700
|
+
[TestFrameworkConstants.KEY_CUSTOM_TAGS]: existing
|
|
7701
|
+
});
|
|
7702
|
+
this.applyToActiveHook(testInstance, key, values);
|
|
7703
|
+
this.logger.debug(`setCustomTags: merged key=${key} values=${JSON.stringify(values)}`);
|
|
7704
|
+
} catch (error) {
|
|
7705
|
+
this.logger.warn(`setCustomTags: error while recording custom tags: ${error}`);
|
|
7706
|
+
}
|
|
7707
|
+
};
|
|
7708
|
+
} catch (error) {
|
|
7709
|
+
this.logger.error(`Error in CustomTagsModule.onBeforeExecute: ${error}`);
|
|
7710
|
+
}
|
|
7711
|
+
}
|
|
7712
|
+
/**
|
|
7713
|
+
* If the test framework is currently inside a hook, merge custom_metadata onto
|
|
7714
|
+
* the last-started hook record so the binary receives hook.custom_metadata.
|
|
7715
|
+
* Best-effort: silently no-ops when no active hook is resolvable.
|
|
7716
|
+
*/
|
|
7717
|
+
applyToActiveHook(testInstance, key, values) {
|
|
7718
|
+
try {
|
|
7719
|
+
const currentState = testInstance.getCurrentTestState().toString();
|
|
7720
|
+
if (!CLIUtils.matchHookRegex(currentState)) {
|
|
7721
|
+
return;
|
|
7722
|
+
}
|
|
7723
|
+
const hook = WdioMochaTestFramework.lastActiveHook(testInstance, WdioMochaTestFramework.KEY_HOOK_LAST_STARTED);
|
|
7724
|
+
if (!hook) {
|
|
7725
|
+
return;
|
|
7726
|
+
}
|
|
7727
|
+
const hookTags = hook[TestFrameworkConstants.KEY_CUSTOM_TAGS] || {};
|
|
7728
|
+
mergeIntoTags(hookTags, key, values);
|
|
7729
|
+
hook[TestFrameworkConstants.KEY_CUSTOM_TAGS] = hookTags;
|
|
7730
|
+
} catch (error) {
|
|
7731
|
+
this.logger.debug(`setCustomTags: could not apply to active hook: ${error}`);
|
|
7732
|
+
}
|
|
7733
|
+
}
|
|
7734
|
+
};
|
|
7735
|
+
}
|
|
7736
|
+
});
|
|
7737
|
+
|
|
7550
7738
|
// src/cli/modules/observabilityModule.ts
|
|
7551
7739
|
var ObservabilityModule;
|
|
7552
7740
|
var init_observabilityModule = __esm({
|
|
@@ -8297,6 +8485,82 @@ var init_reporter = __esm({
|
|
|
8297
8485
|
}
|
|
8298
8486
|
});
|
|
8299
8487
|
|
|
8488
|
+
// src/custom-tags-handler.ts
|
|
8489
|
+
var _CustomTagsHandler, CustomTagsHandler, custom_tags_handler_default;
|
|
8490
|
+
var init_custom_tags_handler = __esm({
|
|
8491
|
+
"src/custom-tags-handler.ts"() {
|
|
8492
|
+
"use strict";
|
|
8493
|
+
init_insights_handler();
|
|
8494
|
+
init_customTags();
|
|
8495
|
+
init_util();
|
|
8496
|
+
init_bstackLogger();
|
|
8497
|
+
_CustomTagsHandler = class __CustomTagsHandler {
|
|
8498
|
+
constructor(_browser, _caps, _framework) {
|
|
8499
|
+
this._browser = _browser;
|
|
8500
|
+
this._caps = _caps;
|
|
8501
|
+
this._framework = _framework;
|
|
8502
|
+
}
|
|
8503
|
+
_browser;
|
|
8504
|
+
_caps;
|
|
8505
|
+
_framework;
|
|
8506
|
+
// Static so the flush sink (InsightsHandler.getRunData) can read it without a
|
|
8507
|
+
// handler reference. Keyed on the per-test uuid.
|
|
8508
|
+
static accumulator = new CustomTagAccumulator();
|
|
8509
|
+
before() {
|
|
8510
|
+
const register = (browser) => {
|
|
8511
|
+
browser.setCustomTags = async (key, value) => {
|
|
8512
|
+
try {
|
|
8513
|
+
if (this._framework !== "mocha") {
|
|
8514
|
+
BStackLogger.warn("setCustomTags is only supported for the mocha framework; ignoring call");
|
|
8515
|
+
return;
|
|
8516
|
+
}
|
|
8517
|
+
if (!key || !value) {
|
|
8518
|
+
BStackLogger.warn("setCustomTags: key and value are required; ignoring call");
|
|
8519
|
+
return;
|
|
8520
|
+
}
|
|
8521
|
+
const testUuid = insights_handler_default.currentTest.uuid;
|
|
8522
|
+
if (!testUuid) {
|
|
8523
|
+
BStackLogger.warn("setCustomTags called outside of a resolvable test context; ignoring");
|
|
8524
|
+
return;
|
|
8525
|
+
}
|
|
8526
|
+
const added = __CustomTagsHandler.accumulator.add(testUuid, key, value);
|
|
8527
|
+
if (!added) {
|
|
8528
|
+
BStackLogger.warn(`setCustomTags: no usable values parsed from "${value}"; ignoring call`);
|
|
8529
|
+
return;
|
|
8530
|
+
}
|
|
8531
|
+
BStackLogger.debug(`setCustomTags: recorded key=${key} value="${value}" for test=${testUuid}`);
|
|
8532
|
+
} catch (error) {
|
|
8533
|
+
BStackLogger.warn(`setCustomTags: error while recording custom tags: ${error}`);
|
|
8534
|
+
}
|
|
8535
|
+
};
|
|
8536
|
+
};
|
|
8537
|
+
register(this._browser);
|
|
8538
|
+
if (this._browser.isMultiremote) {
|
|
8539
|
+
const multiRemoteBrowser = this._browser;
|
|
8540
|
+
Object.keys(this._caps).forEach((browserName) => {
|
|
8541
|
+
try {
|
|
8542
|
+
const instance = multiRemoteBrowser.getInstance(browserName);
|
|
8543
|
+
if (instance) {
|
|
8544
|
+
register(instance);
|
|
8545
|
+
}
|
|
8546
|
+
} catch (error) {
|
|
8547
|
+
BStackLogger.debug(`setCustomTags: could not register on multiremote instance ${browserName}: ${error}`);
|
|
8548
|
+
}
|
|
8549
|
+
});
|
|
8550
|
+
}
|
|
8551
|
+
}
|
|
8552
|
+
/** Drain the accumulated custom_metadata for a test uuid; clears after read. */
|
|
8553
|
+
static drain(testUuid) {
|
|
8554
|
+
const data = __CustomTagsHandler.accumulator.get(testUuid);
|
|
8555
|
+
__CustomTagsHandler.accumulator.clear(testUuid);
|
|
8556
|
+
return data;
|
|
8557
|
+
}
|
|
8558
|
+
};
|
|
8559
|
+
CustomTagsHandler = o11yClassErrorHandler(_CustomTagsHandler);
|
|
8560
|
+
custom_tags_handler_default = CustomTagsHandler;
|
|
8561
|
+
}
|
|
8562
|
+
});
|
|
8563
|
+
|
|
8300
8564
|
// src/insights-handler.ts
|
|
8301
8565
|
import path16 from "node:path";
|
|
8302
8566
|
import { v4 as uuidv44 } from "uuid";
|
|
@@ -8314,6 +8578,7 @@ var init_insights_handler = __esm({
|
|
|
8314
8578
|
init_hookState();
|
|
8315
8579
|
init_performance_tester();
|
|
8316
8580
|
init_constants2();
|
|
8581
|
+
init_custom_tags_handler();
|
|
8317
8582
|
_InsightsHandler = class {
|
|
8318
8583
|
constructor(_browser, _framework, _userCaps, _options) {
|
|
8319
8584
|
this._browser = _browser;
|
|
@@ -8332,6 +8597,8 @@ var init_insights_handler = __esm({
|
|
|
8332
8597
|
};
|
|
8333
8598
|
this.registerListeners();
|
|
8334
8599
|
}
|
|
8600
|
+
_browser;
|
|
8601
|
+
_framework;
|
|
8335
8602
|
_tests = {};
|
|
8336
8603
|
_hooks = {};
|
|
8337
8604
|
_platformMeta;
|
|
@@ -8513,7 +8780,13 @@ var init_insights_handler = __esm({
|
|
|
8513
8780
|
const fullTitle = getUniqueIdentifier(test, this._framework);
|
|
8514
8781
|
this._tests[fullTitle] = {
|
|
8515
8782
|
uuid: hookUUID,
|
|
8516
|
-
startedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
8783
|
+
startedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
8784
|
+
// Tag as a hook and stash identity so a teardown sweep can synthesise a terminal
|
|
8785
|
+
// HookRunFinished if this hook never returns (e.g. a hang with timeouts disabled).
|
|
8786
|
+
kind: "hook",
|
|
8787
|
+
name: test.title || test.description,
|
|
8788
|
+
scopes: this.getHierarchy(test),
|
|
8789
|
+
fileName: test.file || this._suiteFile
|
|
8517
8790
|
};
|
|
8518
8791
|
this.setCurrentHook({ uuid: hookUUID });
|
|
8519
8792
|
this.attachHookData(context, hookUUID);
|
|
@@ -8537,7 +8810,12 @@ var init_insights_handler = __esm({
|
|
|
8537
8810
|
};
|
|
8538
8811
|
}
|
|
8539
8812
|
this.setCurrentHook({ uuid: this._tests[fullTitle].uuid, finished: true });
|
|
8540
|
-
this.
|
|
8813
|
+
const hookData = this.getRunData(test, "HookRunFinished", result);
|
|
8814
|
+
if (hookData.uuid) {
|
|
8815
|
+
this.listener.hookFinished(hookData);
|
|
8816
|
+
} else {
|
|
8817
|
+
BStackLogger.warn(`Skipping HookRunFinished for '${fullTitle}' \u2014 resolved uuid is missing; not emitting an unmatched finish.`);
|
|
8818
|
+
}
|
|
8541
8819
|
const hookType = getHookType(test.title);
|
|
8542
8820
|
if (!result.passed && (hookType === "BEFORE_EACH" || hookType === "BEFORE_ALL" || hookType === "AFTER_EACH")) {
|
|
8543
8821
|
const sendTestSkip = async (skippedTest) => {
|
|
@@ -8613,7 +8891,13 @@ var init_insights_handler = __esm({
|
|
|
8613
8891
|
const fullTitle = getUniqueIdentifier(test, this._framework);
|
|
8614
8892
|
this._tests[fullTitle] = {
|
|
8615
8893
|
uuid,
|
|
8616
|
-
startedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
8894
|
+
startedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
8895
|
+
// Tag as a test and stash identity so a teardown sweep can synthesise a terminal
|
|
8896
|
+
// TestRunFinished if this test never reaches afterTest (e.g. mocha advanced past a hang).
|
|
8897
|
+
kind: "test",
|
|
8898
|
+
name: test.title || test.description,
|
|
8899
|
+
scopes: this.getHierarchy(test),
|
|
8900
|
+
fileName: test.file || this._suiteFile
|
|
8617
8901
|
};
|
|
8618
8902
|
this.listener.testStarted(this.getRunData(test, "TestRunStarted"));
|
|
8619
8903
|
}
|
|
@@ -8628,6 +8912,10 @@ var init_insights_handler = __esm({
|
|
|
8628
8912
|
};
|
|
8629
8913
|
this.flushCBTDataQueue();
|
|
8630
8914
|
const testData = this.getRunData(test, "TestRunFinished", result);
|
|
8915
|
+
if (!testData.uuid) {
|
|
8916
|
+
BStackLogger.warn(`Skipping TestRunFinished for '${getUniqueIdentifier(test, this._framework)}' \u2014 resolved uuid is missing; not emitting an unmatched finish.`);
|
|
8917
|
+
return;
|
|
8918
|
+
}
|
|
8631
8919
|
this.listener.testFinished(testData);
|
|
8632
8920
|
const testFinishHashCode = generateHashCodeFromFields(
|
|
8633
8921
|
[
|
|
@@ -8643,6 +8931,91 @@ var init_insights_handler = __esm({
|
|
|
8643
8931
|
);
|
|
8644
8932
|
reporter_default.hashCodeToHandleTestSkip[testFinishHashCode] = testData.uuid ?? "";
|
|
8645
8933
|
}
|
|
8934
|
+
/**
|
|
8935
|
+
* Teardown safety net: synthesise a terminal finish for any started-but-unfinished
|
|
8936
|
+
* test/hook so the backend closes the entity instead of leaving it in_progress and
|
|
8937
|
+
* letting the build watchdog inflate the duration.
|
|
8938
|
+
*
|
|
8939
|
+
* Scoped to mocha. Cucumber hooks are keyed differently (getCucumberHookUniqueId) and
|
|
8940
|
+
* their lifecycle differs, so they are intentionally left out here — closing them safely
|
|
8941
|
+
* would need cucumber-specific keying and is a known gap for a follow-up.
|
|
8942
|
+
*
|
|
8943
|
+
* Each entry was tagged with kind at start time so we emit HookRunFinished for hooks and
|
|
8944
|
+
* TestRunFinished for tests without re-deriving the kind from the title. Entries without a
|
|
8945
|
+
* uuid are skipped (same null-uuid guard as afterTest): a finish the backend can't match to a
|
|
8946
|
+
* start is worse than none. The result is marked failed/incomplete via getFailureObject so the
|
|
8947
|
+
* entity lands in a terminal state rather than pending.
|
|
8948
|
+
*/
|
|
8949
|
+
async sweepUnfinished() {
|
|
8950
|
+
if (this._framework !== "mocha") {
|
|
8951
|
+
return;
|
|
8952
|
+
}
|
|
8953
|
+
for (const fullTitle of Object.keys(this._tests)) {
|
|
8954
|
+
const meta = this._tests[fullTitle];
|
|
8955
|
+
if (!meta || meta.finishedAt || meta.kind !== "hook" && meta.kind !== "test") {
|
|
8956
|
+
continue;
|
|
8957
|
+
}
|
|
8958
|
+
if (!meta.startedAt) {
|
|
8959
|
+
continue;
|
|
8960
|
+
}
|
|
8961
|
+
if (!meta.uuid) {
|
|
8962
|
+
BStackLogger.warn("Skipping synthetic finish for " + fullTitle + " \u2014 stashed uuid is missing.");
|
|
8963
|
+
continue;
|
|
8964
|
+
}
|
|
8965
|
+
const finishedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
8966
|
+
try {
|
|
8967
|
+
const testData = this.buildSweepFinishData(fullTitle, meta, finishedAt);
|
|
8968
|
+
if (meta.kind === "hook") {
|
|
8969
|
+
this.listener.hookFinished(testData);
|
|
8970
|
+
} else {
|
|
8971
|
+
this.listener.testFinished(testData);
|
|
8972
|
+
}
|
|
8973
|
+
meta.finishedAt = finishedAt;
|
|
8974
|
+
BStackLogger.debug("Emitted synthetic " + (meta.kind === "hook" ? "HookRunFinished" : "TestRunFinished") + " for unfinished " + fullTitle + ".");
|
|
8975
|
+
} catch (err) {
|
|
8976
|
+
BStackLogger.warn("Failed to emit synthetic finish while sweeping unfinished " + fullTitle + ": " + err);
|
|
8977
|
+
}
|
|
8978
|
+
}
|
|
8979
|
+
}
|
|
8980
|
+
/**
|
|
8981
|
+
* Build a terminal (failed/incomplete) finish payload for a swept entry directly from the
|
|
8982
|
+
* stashed TestMeta, since the live framework test object is no longer available at teardown.
|
|
8983
|
+
*/
|
|
8984
|
+
buildSweepFinishData(fullTitle, meta, finishedAt) {
|
|
8985
|
+
const filename = meta.fileName;
|
|
8986
|
+
const testData = {
|
|
8987
|
+
uuid: meta.uuid,
|
|
8988
|
+
type: meta.kind === "hook" ? "hook" : "test",
|
|
8989
|
+
name: meta.name,
|
|
8990
|
+
body: {
|
|
8991
|
+
lang: "webdriverio",
|
|
8992
|
+
code: null
|
|
8993
|
+
},
|
|
8994
|
+
scope: fullTitle,
|
|
8995
|
+
scopes: meta.scopes,
|
|
8996
|
+
identifier: fullTitle,
|
|
8997
|
+
file_name: filename ? path16.relative(process.cwd(), filename) : void 0,
|
|
8998
|
+
location: filename ? path16.relative(process.cwd(), filename) : void 0,
|
|
8999
|
+
vc_filepath: this._gitConfigPath && filename ? path16.relative(this._gitConfigPath, filename) : void 0,
|
|
9000
|
+
started_at: meta.startedAt,
|
|
9001
|
+
finished_at: finishedAt,
|
|
9002
|
+
framework: this._framework,
|
|
9003
|
+
// getFailureObject only returns failure/failure_reason/failure_type — never a result
|
|
9004
|
+
// key — but set result AFTER the spread so the synthetic 'failed' status stays
|
|
9005
|
+
// authoritative even if that ever changes.
|
|
9006
|
+
...getFailureObject(new Error("Test/hook did not finish before the session ended (incomplete).")),
|
|
9007
|
+
result: "failed"
|
|
9008
|
+
};
|
|
9009
|
+
testData.integrations = {};
|
|
9010
|
+
if (this._browser && this._platformMeta) {
|
|
9011
|
+
const provider = getCloudProvider(this._browser);
|
|
9012
|
+
testData.integrations[provider] = this.getIntegrationsObject();
|
|
9013
|
+
}
|
|
9014
|
+
if (meta.kind === "hook") {
|
|
9015
|
+
testData.hook_type = meta.name ? getHookType(meta.name.toLowerCase()) : "undefined";
|
|
9016
|
+
}
|
|
9017
|
+
return testData;
|
|
9018
|
+
}
|
|
8646
9019
|
/**
|
|
8647
9020
|
* Cucumber Only
|
|
8648
9021
|
*/
|
|
@@ -8861,7 +9234,7 @@ var init_insights_handler = __esm({
|
|
|
8861
9234
|
}
|
|
8862
9235
|
getRunData(test, eventType, results) {
|
|
8863
9236
|
const fullTitle = getUniqueIdentifier(test, this._framework);
|
|
8864
|
-
const testMetaData = this._tests[fullTitle];
|
|
9237
|
+
const testMetaData = this._tests[fullTitle] || {};
|
|
8865
9238
|
const filename = test.file || this._suiteFile;
|
|
8866
9239
|
this.currentTestId = testMetaData.uuid;
|
|
8867
9240
|
if (eventType === "TestRunStarted") {
|
|
@@ -8908,6 +9281,10 @@ var init_insights_handler = __esm({
|
|
|
8908
9281
|
if (this._hooks[fullTitle]) {
|
|
8909
9282
|
testData.hooks = this._hooks[fullTitle];
|
|
8910
9283
|
}
|
|
9284
|
+
const customMetadata = custom_tags_handler_default.drain(testMetaData.uuid);
|
|
9285
|
+
if (customMetadata && Object.keys(customMetadata).length > 0) {
|
|
9286
|
+
testData.custom_metadata = customMetadata;
|
|
9287
|
+
}
|
|
8911
9288
|
}
|
|
8912
9289
|
if (eventType === "TestRunStarted" || eventType === "TestRunSkipped" || eventType === "HookRunStarted") {
|
|
8913
9290
|
testData.integrations = {};
|
|
@@ -9240,6 +9617,11 @@ var init_Percy_Handler = __esm({
|
|
|
9240
9617
|
this._percyAutoCaptureMode = "auto";
|
|
9241
9618
|
}
|
|
9242
9619
|
}
|
|
9620
|
+
_percyAutoCaptureMode;
|
|
9621
|
+
_browser;
|
|
9622
|
+
_capabilities;
|
|
9623
|
+
_isAppAutomate;
|
|
9624
|
+
_framework;
|
|
9243
9625
|
_sessionName;
|
|
9244
9626
|
_isPercyCleanupProcessingUnderway = false;
|
|
9245
9627
|
_percyScreenshotCounter = 0;
|
|
@@ -9478,6 +9860,7 @@ var init_cli = __esm({
|
|
|
9478
9860
|
init_wdioAutomationFramework();
|
|
9479
9861
|
init_webdriverIOModule();
|
|
9480
9862
|
init_accessibilityModule();
|
|
9863
|
+
init_customTagsModule();
|
|
9481
9864
|
init_util();
|
|
9482
9865
|
init_observabilityModule();
|
|
9483
9866
|
init_crash_reporter();
|
|
@@ -9594,6 +9977,7 @@ var init_cli = __esm({
|
|
|
9594
9977
|
this.modules[ObservabilityModule.MODULE_NAME] = new ObservabilityModule(startBinResponse.observability);
|
|
9595
9978
|
}
|
|
9596
9979
|
this.modules[TestHubModule.MODULE_NAME] = new TestHubModule(startBinResponse.testhub);
|
|
9980
|
+
this.modules[CustomTagsModule.MODULE_NAME] = new CustomTagsModule();
|
|
9597
9981
|
if (startBinResponse.accessibility?.success) {
|
|
9598
9982
|
process.env[BROWSERSTACK_ACCESSIBILITY] = "true";
|
|
9599
9983
|
const options = this.options;
|
|
@@ -11393,6 +11777,10 @@ function buildEventData(eventType, config, isCLIEnabled = false) {
|
|
|
11393
11777
|
if (process.env.BSTACK_A11Y_POLLING_TIMEOUT) {
|
|
11394
11778
|
eventProperties.pollingTimeout = process.env.BSTACK_A11Y_POLLING_TIMEOUT;
|
|
11395
11779
|
}
|
|
11780
|
+
const reloadHappened = workerData.some((worker2) => worker2.reloadHappened === true);
|
|
11781
|
+
if (reloadHappened) {
|
|
11782
|
+
eventProperties.finishedMetadata = { reason: "session_reloaded" };
|
|
11783
|
+
}
|
|
11396
11784
|
}
|
|
11397
11785
|
return {
|
|
11398
11786
|
userName: config.userName,
|
|
@@ -11867,6 +12255,8 @@ var BrowserstackLauncherService = class {
|
|
|
11867
12255
|
BStackLogger.error(`[Crash_Report_Upload] Config processing failed due to ${error}`);
|
|
11868
12256
|
}
|
|
11869
12257
|
}
|
|
12258
|
+
_options;
|
|
12259
|
+
_config;
|
|
11870
12260
|
browserstackLocal;
|
|
11871
12261
|
_buildName;
|
|
11872
12262
|
_projectName;
|
|
@@ -12719,6 +13109,9 @@ var _AccessibilityHandler = class {
|
|
|
12719
13109
|
this._config = _config;
|
|
12720
13110
|
this._turboscale = isTrue(_turboscale);
|
|
12721
13111
|
}
|
|
13112
|
+
_browser;
|
|
13113
|
+
isAppAutomate;
|
|
13114
|
+
_framework;
|
|
12722
13115
|
_platformA11yMeta;
|
|
12723
13116
|
_caps;
|
|
12724
13117
|
_suiteFile;
|
|
@@ -13033,6 +13426,7 @@ var AccessibilityHandler = o11yClassErrorHandler(_AccessibilityHandler);
|
|
|
13033
13426
|
var accessibility_handler_default = AccessibilityHandler;
|
|
13034
13427
|
|
|
13035
13428
|
// src/service.ts
|
|
13429
|
+
init_custom_tags_handler();
|
|
13036
13430
|
init_bstackLogger();
|
|
13037
13431
|
init_Percy_Handler();
|
|
13038
13432
|
init_listener();
|
|
@@ -13082,6 +13476,8 @@ var BrowserstackService = class {
|
|
|
13082
13476
|
process.env.PERCY_SNAPSHOT = "true";
|
|
13083
13477
|
}
|
|
13084
13478
|
}
|
|
13479
|
+
_caps;
|
|
13480
|
+
_config;
|
|
13085
13481
|
_sessionBaseUrl = "https://api.browserstack.com/automate/sessions";
|
|
13086
13482
|
_failReasons = [];
|
|
13087
13483
|
_hookFailReasons = [];
|
|
@@ -13091,6 +13487,8 @@ var BrowserstackService = class {
|
|
|
13091
13487
|
// Track last scenario for preferScenarioName feature
|
|
13092
13488
|
_scenariosRanCount = 0;
|
|
13093
13489
|
// Count of non-skipped scenarios
|
|
13490
|
+
_reloadHappened = false;
|
|
13491
|
+
// Set when browser.reloadSession() is called; surfaced as finishedMetadata on SDKTestSuccessful so reload-orphaned builds can be excluded from session-linking
|
|
13094
13492
|
_failureStatuses = ["failed", "ambiguous", "undefined", "unknown"];
|
|
13095
13493
|
_browser;
|
|
13096
13494
|
_suiteTitle;
|
|
@@ -13100,9 +13498,24 @@ var BrowserstackService = class {
|
|
|
13100
13498
|
_specsRan = false;
|
|
13101
13499
|
_observability;
|
|
13102
13500
|
_currentTest;
|
|
13501
|
+
/**
|
|
13502
|
+
* CLI/gRPC path: map of test identity -> the test_uuid minted for it at
|
|
13503
|
+
* INIT_TEST/PRE. The CLI mints a fresh uuid into a SINGLE mutable per-worker tracked instance
|
|
13504
|
+
* (`trackWdioMochaInstance` overwrites `TestFramework.instances[ctxId]` wholesale on every
|
|
13505
|
+
* INIT_TEST), and the gRPC test-finish reads the uuid from that single slot. When a test hangs
|
|
13506
|
+
* past the mocha timeout, the NEXT test's INIT_TEST overwrites the slot before the hung test's
|
|
13507
|
+
* afterTest POST fires, so the POST would carry the wrong (next) test's uuid and the binary
|
|
13508
|
+
* would close the wrong test_run — orphaning the hung one. We snapshot each test's uuid here,
|
|
13509
|
+
* keyed by the same identity the legacy `_tests` map uses, and at afterTest we restore the
|
|
13510
|
+
* finishing test's minted uuid onto the tracked instance before the POST so it closes the
|
|
13511
|
+
* correct test_run. The finishing identity is `originalTest` (already snapshotted pre-await by
|
|
13512
|
+
* the testFnWrapper, so it is the timed-out runnable's own identity, not the next test's).
|
|
13513
|
+
*/
|
|
13514
|
+
_cliTestUuids = /* @__PURE__ */ new Map();
|
|
13103
13515
|
_insightsHandler;
|
|
13104
13516
|
_accessibility;
|
|
13105
13517
|
_accessibilityHandler;
|
|
13518
|
+
_customTagsHandler;
|
|
13106
13519
|
_percy;
|
|
13107
13520
|
_percyCaptureMode = void 0;
|
|
13108
13521
|
_percyHandler;
|
|
@@ -13227,6 +13640,18 @@ var BrowserstackService = class {
|
|
|
13227
13640
|
}
|
|
13228
13641
|
await this._insightsHandler.before();
|
|
13229
13642
|
}
|
|
13643
|
+
if (!BrowserstackCLI.getInstance().isRunning()) {
|
|
13644
|
+
try {
|
|
13645
|
+
this._customTagsHandler = new custom_tags_handler_default(
|
|
13646
|
+
this._browser,
|
|
13647
|
+
this._caps,
|
|
13648
|
+
this._config.framework
|
|
13649
|
+
);
|
|
13650
|
+
this._customTagsHandler.before();
|
|
13651
|
+
} catch (err) {
|
|
13652
|
+
BStackLogger.error(`[Custom Tags] Error registering setCustomTags: ${err}`);
|
|
13653
|
+
}
|
|
13654
|
+
}
|
|
13230
13655
|
if (!BrowserstackCLI.getInstance().isRunning()) {
|
|
13231
13656
|
this._browser.on("command", async (command) => {
|
|
13232
13657
|
if (shouldProcessEventForTesthub("")) {
|
|
@@ -13316,6 +13741,9 @@ var BrowserstackService = class {
|
|
|
13316
13741
|
if (BrowserstackCLI.getInstance().isRunning()) {
|
|
13317
13742
|
await BrowserstackCLI.getInstance().getTestFramework().trackEvent(TestFrameworkState.INIT_TEST, HookState.PRE, { test });
|
|
13318
13743
|
const uuid = TestFramework.getState(TestFramework.getTrackedInstance(), TestFrameworkConstants.KEY_TEST_UUID);
|
|
13744
|
+
if (this._config.framework === "mocha" && uuid) {
|
|
13745
|
+
this._cliTestUuids.set(getUniqueIdentifier(test, this._config.framework), uuid);
|
|
13746
|
+
}
|
|
13319
13747
|
this._insightsHandler?.setTestData(test, uuid);
|
|
13320
13748
|
await BrowserstackCLI.getInstance().getTestFramework().trackEvent(TestFrameworkState.TEST, HookState.PRE, { test, suiteTitle });
|
|
13321
13749
|
return;
|
|
@@ -13325,7 +13753,8 @@ var BrowserstackService = class {
|
|
|
13325
13753
|
await this._accessibilityHandler?.beforeTest(suiteTitle, test);
|
|
13326
13754
|
await this._insightsHandler?.beforeTest(test);
|
|
13327
13755
|
}
|
|
13328
|
-
async afterTest(
|
|
13756
|
+
async afterTest(originalTest, context, results) {
|
|
13757
|
+
const test = originalTest;
|
|
13329
13758
|
this._specsRan = true;
|
|
13330
13759
|
const { error, passed, skipped } = results;
|
|
13331
13760
|
if (!passed && !skipped) {
|
|
@@ -13334,8 +13763,19 @@ var BrowserstackService = class {
|
|
|
13334
13763
|
this._pureTestFailReasons.push(testError);
|
|
13335
13764
|
}
|
|
13336
13765
|
if (BrowserstackCLI.getInstance().isRunning()) {
|
|
13766
|
+
if (this._config.framework === "mocha") {
|
|
13767
|
+
const identifier = getUniqueIdentifier(test, this._config.framework);
|
|
13768
|
+
const resolvedUuid = this._cliTestUuids.get(identifier);
|
|
13769
|
+
if (resolvedUuid) {
|
|
13770
|
+
const trackedInstance = TestFramework.getTrackedInstance();
|
|
13771
|
+
if (trackedInstance) {
|
|
13772
|
+
TestFramework.setState(trackedInstance, TestFrameworkConstants.KEY_TEST_UUID, resolvedUuid);
|
|
13773
|
+
}
|
|
13774
|
+
this._cliTestUuids.delete(identifier);
|
|
13775
|
+
}
|
|
13776
|
+
}
|
|
13337
13777
|
await BrowserstackCLI.getInstance().getTestFramework().trackEvent(TestFrameworkState.LOG_REPORT, HookState.POST, { test, result: results });
|
|
13338
|
-
await BrowserstackCLI.getInstance().getTestFramework().trackEvent(TestFrameworkState.TEST, HookState.POST, { test, result: results,
|
|
13778
|
+
await BrowserstackCLI.getInstance().getTestFramework().trackEvent(TestFrameworkState.TEST, HookState.POST, { test, result: results, suiteTitle: this._suiteTitle });
|
|
13339
13779
|
return;
|
|
13340
13780
|
}
|
|
13341
13781
|
await this._accessibilityHandler?.afterTest(this._suiteTitle, test);
|
|
@@ -13395,6 +13835,12 @@ var BrowserstackService = class {
|
|
|
13395
13835
|
});
|
|
13396
13836
|
}
|
|
13397
13837
|
})();
|
|
13838
|
+
try {
|
|
13839
|
+
await this._insightsHandler?.sweepUnfinished();
|
|
13840
|
+
} catch (sweepErr) {
|
|
13841
|
+
BStackLogger.debug("Exception in sweepUnfinished during after(): " + util12.format(sweepErr));
|
|
13842
|
+
}
|
|
13843
|
+
this._cliTestUuids.clear();
|
|
13398
13844
|
PerformanceTester.start(EVENTS.SDK_LISTENER_WORKER_END);
|
|
13399
13845
|
await listener_default.getInstance().onWorkerEnd();
|
|
13400
13846
|
PerformanceTester.end(EVENTS.SDK_LISTENER_WORKER_END, true);
|
|
@@ -13495,6 +13941,7 @@ var BrowserstackService = class {
|
|
|
13495
13941
|
if (!this._browser) {
|
|
13496
13942
|
return Promise.resolve();
|
|
13497
13943
|
}
|
|
13944
|
+
this._reloadHappened = true;
|
|
13498
13945
|
const { setSessionName, setSessionStatus } = this._options;
|
|
13499
13946
|
const ignoreHooksStatus = this._options.testObservabilityOptions?.ignoreHooksStatus === true;
|
|
13500
13947
|
let sessionStatus;
|
|
@@ -13669,7 +14116,8 @@ var BrowserstackService = class {
|
|
|
13669
14116
|
}
|
|
13670
14117
|
saveWorkerData() {
|
|
13671
14118
|
saveWorkerData({
|
|
13672
|
-
usageStats: usageStats_default.getInstance().getDataToSave()
|
|
14119
|
+
usageStats: usageStats_default.getInstance().getDataToSave(),
|
|
14120
|
+
reloadHappened: this._reloadHappened
|
|
13673
14121
|
});
|
|
13674
14122
|
}
|
|
13675
14123
|
};
|
|
@@ -38,6 +38,27 @@ declare class _InsightsHandler {
|
|
|
38
38
|
getHookRunDataForCucumber(hookData: TestMeta, eventType: string, result?: Frameworks.TestResult): TestData;
|
|
39
39
|
beforeTest(test: Frameworks.Test): Promise<void>;
|
|
40
40
|
afterTest(test: Frameworks.Test, result: Frameworks.TestResult): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Teardown safety net: synthesise a terminal finish for any started-but-unfinished
|
|
43
|
+
* test/hook so the backend closes the entity instead of leaving it in_progress and
|
|
44
|
+
* letting the build watchdog inflate the duration.
|
|
45
|
+
*
|
|
46
|
+
* Scoped to mocha. Cucumber hooks are keyed differently (getCucumberHookUniqueId) and
|
|
47
|
+
* their lifecycle differs, so they are intentionally left out here — closing them safely
|
|
48
|
+
* would need cucumber-specific keying and is a known gap for a follow-up.
|
|
49
|
+
*
|
|
50
|
+
* Each entry was tagged with kind at start time so we emit HookRunFinished for hooks and
|
|
51
|
+
* TestRunFinished for tests without re-deriving the kind from the title. Entries without a
|
|
52
|
+
* uuid are skipped (same null-uuid guard as afterTest): a finish the backend can't match to a
|
|
53
|
+
* start is worse than none. The result is marked failed/incomplete via getFailureObject so the
|
|
54
|
+
* entity lands in a terminal state rather than pending.
|
|
55
|
+
*/
|
|
56
|
+
sweepUnfinished(): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Build a terminal (failed/incomplete) finish payload for a swept entry directly from the
|
|
59
|
+
* stashed TestMeta, since the live framework test object is no longer available at teardown.
|
|
60
|
+
*/
|
|
61
|
+
private buildSweepFinishData;
|
|
41
62
|
/**
|
|
42
63
|
* Cucumber Only
|
|
43
64
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"insights-handler.d.ts","sourceRoot":"","sources":["../src/insights-handler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAGzE,OAAO,KAAK,EAAiB,OAAO,EAAE,QAAQ,EAAsB,YAAY,EAAE,kBAAkB,EAAE,MAAM,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAGjK,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAmBzE,OAAO,KAAK,EACR,QAAQ,EACR,QAAQ,EAER,cAAc,EACd,MAAM,EACN,OAAO,EAEV,MAAM,YAAY,CAAA;AAEnB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"insights-handler.d.ts","sourceRoot":"","sources":["../src/insights-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"funnelInstrumentation.d.ts","sourceRoot":"","sources":["../../src/instrumentation/funnelInstrumentation.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,kBAAkB,MAAM,cAAc,CAAA;AAMlD,OAAO,KAAK,EAAE,UAAU,EAAmB,MAAM,aAAa,CAAA;AAsB9D,wBAAsB,SAAS,CAAC,MAAM,EAAE,kBAAkB,iBAWzD;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,kBAAkB,EAAE,YAAY,UAAQ,iBAUhF;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,YAAY,UAAQ,GAAG,MAAM,CAO1G;AAeD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBvE;
|
|
1
|
+
{"version":3,"file":"funnelInstrumentation.d.ts","sourceRoot":"","sources":["../../src/instrumentation/funnelInstrumentation.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,kBAAkB,MAAM,cAAc,CAAA;AAMlD,OAAO,KAAK,EAAE,UAAU,EAAmB,MAAM,aAAa,CAAA;AAsB9D,wBAAsB,SAAS,CAAC,MAAM,EAAE,kBAAkB,iBAWzD;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,kBAAkB,EAAE,YAAY,UAAQ,iBAUhF;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,YAAY,UAAQ,GAAG,MAAM,CAO1G;AAeD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBvE;AAiKD,UAAU,UAAU;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,eAAe,EAAE,OAAO,CAAA;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,gBAAgB,EAAE,OAAO,CAAA;CAC5B;AAED,wBAAgB,4BAA4B,CACxC,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,kBAAkB,EAC1B,iBAAiB,EAAE,OAAO,GAAG,SAAS,QAiCzC"}
|
package/build/service.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ export default class BrowserstackService implements Services.ServiceInstance {
|
|
|
11
11
|
private _scenariosThatRan;
|
|
12
12
|
private _lastScenarioName?;
|
|
13
13
|
private _scenariosRanCount;
|
|
14
|
+
private _reloadHappened;
|
|
14
15
|
private _failureStatuses;
|
|
15
16
|
private _browser?;
|
|
16
17
|
private _suiteTitle?;
|
|
@@ -20,9 +21,24 @@ export default class BrowserstackService implements Services.ServiceInstance {
|
|
|
20
21
|
private _specsRan;
|
|
21
22
|
private _observability;
|
|
22
23
|
private _currentTest?;
|
|
24
|
+
/**
|
|
25
|
+
* CLI/gRPC path: map of test identity -> the test_uuid minted for it at
|
|
26
|
+
* INIT_TEST/PRE. The CLI mints a fresh uuid into a SINGLE mutable per-worker tracked instance
|
|
27
|
+
* (`trackWdioMochaInstance` overwrites `TestFramework.instances[ctxId]` wholesale on every
|
|
28
|
+
* INIT_TEST), and the gRPC test-finish reads the uuid from that single slot. When a test hangs
|
|
29
|
+
* past the mocha timeout, the NEXT test's INIT_TEST overwrites the slot before the hung test's
|
|
30
|
+
* afterTest POST fires, so the POST would carry the wrong (next) test's uuid and the binary
|
|
31
|
+
* would close the wrong test_run — orphaning the hung one. We snapshot each test's uuid here,
|
|
32
|
+
* keyed by the same identity the legacy `_tests` map uses, and at afterTest we restore the
|
|
33
|
+
* finishing test's minted uuid onto the tracked instance before the POST so it closes the
|
|
34
|
+
* correct test_run. The finishing identity is `originalTest` (already snapshotted pre-await by
|
|
35
|
+
* the testFnWrapper, so it is the timed-out runnable's own identity, not the next test's).
|
|
36
|
+
*/
|
|
37
|
+
private _cliTestUuids;
|
|
23
38
|
private _insightsHandler?;
|
|
24
39
|
private _accessibility;
|
|
25
40
|
private _accessibilityHandler?;
|
|
41
|
+
private _customTagsHandler?;
|
|
26
42
|
private _percy;
|
|
27
43
|
private _percyCaptureMode;
|
|
28
44
|
private _percyHandler?;
|
|
@@ -42,7 +58,7 @@ export default class BrowserstackService implements Services.ServiceInstance {
|
|
|
42
58
|
beforeHook(test: Frameworks.Test | CucumberHook, context: unknown): Promise<void>;
|
|
43
59
|
afterHook(test: Frameworks.Test | CucumberHook, context: unknown, result: Frameworks.TestResult): Promise<void>;
|
|
44
60
|
beforeTest(test: Frameworks.Test): Promise<void>;
|
|
45
|
-
afterTest(
|
|
61
|
+
afterTest(originalTest: Frameworks.Test, context: never, results: Frameworks.TestResult): Promise<void>;
|
|
46
62
|
after(result: number): Promise<void>;
|
|
47
63
|
/**
|
|
48
64
|
* For CucumberJS
|
package/build/service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
|
package/build/types.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Capabilities, Options, Frameworks } from '@wdio/types';
|
|
2
2
|
import type { Options as BSOptions } from 'browserstack-local';
|
|
3
|
+
import type { CustomMetadata } from './customTags.js';
|
|
3
4
|
export type MultiRemoteAction = (sessionId: string, browserName?: string) => Promise<unknown>;
|
|
4
5
|
export type AppConfig = {
|
|
5
6
|
id?: string;
|
|
@@ -238,6 +239,10 @@ export interface TestMeta {
|
|
|
238
239
|
examples?: string[];
|
|
239
240
|
hookType?: string;
|
|
240
241
|
testRunId?: string;
|
|
242
|
+
kind?: 'hook' | 'test';
|
|
243
|
+
name?: string;
|
|
244
|
+
scopes?: string[];
|
|
245
|
+
fileName?: string;
|
|
241
246
|
}
|
|
242
247
|
export interface CurrentRunInfo {
|
|
243
248
|
uuid?: string;
|
|
@@ -277,6 +282,7 @@ export interface TestData {
|
|
|
277
282
|
tags?: string[];
|
|
278
283
|
test_run_id?: string;
|
|
279
284
|
product_map?: {};
|
|
285
|
+
custom_metadata?: CustomMetadata;
|
|
280
286
|
}
|
|
281
287
|
export interface UserConfig {
|
|
282
288
|
buildName?: string;
|
|
@@ -434,6 +440,9 @@ export interface EventProperties {
|
|
|
434
440
|
};
|
|
435
441
|
};
|
|
436
442
|
isCLIEnabled?: boolean;
|
|
443
|
+
finishedMetadata?: {
|
|
444
|
+
reason: string;
|
|
445
|
+
};
|
|
437
446
|
}
|
|
438
447
|
export interface FunnelData {
|
|
439
448
|
userName?: string;
|
package/build/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACpE,OAAO,KAAK,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wdio/browserstack-service",
|
|
3
|
-
"version": "9.
|
|
3
|
+
"version": "9.29.1",
|
|
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",
|
|
@@ -41,9 +41,9 @@
|
|
|
41
41
|
"@percy/appium-app": "^2.0.9",
|
|
42
42
|
"@percy/selenium-webdriver": "^2.2.2",
|
|
43
43
|
"@types/gitconfiglocal": "^2.0.1",
|
|
44
|
-
"@wdio/logger": "9.
|
|
45
|
-
"@wdio/reporter": "9.
|
|
46
|
-
"@wdio/types": "9.
|
|
44
|
+
"@wdio/logger": "9.29.1",
|
|
45
|
+
"@wdio/reporter": "9.29.1",
|
|
46
|
+
"@wdio/types": "9.29.1",
|
|
47
47
|
"browserstack-local": "^1.5.1",
|
|
48
48
|
"chalk": "^5.3.0",
|
|
49
49
|
"csv-writer": "^1.6.0",
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"tar": "^7.5.11",
|
|
54
54
|
"undici": "^6.24.0",
|
|
55
55
|
"uuid": "^11.1.0",
|
|
56
|
-
"webdriverio": "9.
|
|
56
|
+
"webdriverio": "9.29.1",
|
|
57
57
|
"winston-transport": "^4.5.0",
|
|
58
58
|
"yauzl": "^3.0.0"
|
|
59
59
|
},
|
|
@@ -64,10 +64,10 @@
|
|
|
64
64
|
"@types/node": "^20.1.0",
|
|
65
65
|
"@types/tar": "^7.0.87",
|
|
66
66
|
"@types/yauzl": "^2.10.3",
|
|
67
|
-
"@wdio/globals": "9.
|
|
67
|
+
"@wdio/globals": "9.29.1"
|
|
68
68
|
},
|
|
69
69
|
"publishConfig": {
|
|
70
70
|
"access": "public"
|
|
71
71
|
},
|
|
72
|
-
"gitHead": "
|
|
72
|
+
"gitHead": "cea4a759f7e78c798e7dd1a0794ae4aeec5acdbf"
|
|
73
73
|
}
|