@wdio/browserstack-service 9.0.0-alpha.9 → 9.0.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.
Files changed (72) hide show
  1. package/README.md +9 -6
  2. package/build/Percy/Percy-Handler.d.ts +1 -1
  3. package/build/Percy/Percy-Handler.d.ts.map +1 -1
  4. package/build/Percy/PercyHelper.d.ts +1 -1
  5. package/build/Percy/PercyHelper.d.ts.map +1 -1
  6. package/build/accessibility-handler.d.ts +2 -2
  7. package/build/accessibility-handler.d.ts.map +1 -1
  8. package/build/ai-handler.d.ts +23 -0
  9. package/build/ai-handler.d.ts.map +1 -0
  10. package/build/constants.d.ts +10 -1
  11. package/build/constants.d.ts.map +1 -1
  12. package/build/crash-reporter.d.ts +2 -2
  13. package/build/crash-reporter.d.ts.map +1 -1
  14. package/build/fileStream.d.ts +0 -2
  15. package/build/fileStream.d.ts.map +1 -1
  16. package/build/index.js +5822 -12
  17. package/build/insights-handler.d.ts +5 -1
  18. package/build/insights-handler.d.ts.map +1 -1
  19. package/build/instrumentation/funnelInstrumentation.d.ts +2 -0
  20. package/build/instrumentation/funnelInstrumentation.d.ts.map +1 -1
  21. package/build/launcher.d.ts +6 -6
  22. package/build/launcher.d.ts.map +1 -1
  23. package/build/performance-tester.d.ts +0 -1
  24. package/build/performance-tester.d.ts.map +1 -1
  25. package/build/reporter.d.ts.map +1 -1
  26. package/build/service.d.ts +4 -4
  27. package/build/service.d.ts.map +1 -1
  28. package/build/testOps/listener.d.ts +1 -0
  29. package/build/testOps/listener.d.ts.map +1 -1
  30. package/build/types.d.ts +9 -3
  31. package/build/types.d.ts.map +1 -1
  32. package/build/util.d.ts +43 -30
  33. package/build/util.d.ts.map +1 -1
  34. package/package.json +13 -10
  35. package/build/Percy/Percy-Handler.js +0 -156
  36. package/build/Percy/Percy.js +0 -123
  37. package/build/Percy/PercyBinary.js +0 -142
  38. package/build/Percy/PercyCaptureMap.js +0 -35
  39. package/build/Percy/PercyHelper.js +0 -67
  40. package/build/Percy/PercyLogger.js +0 -67
  41. package/build/Percy/PercySDK.js +0 -39
  42. package/build/accessibility-handler.js +0 -287
  43. package/build/bstackLogger.js +0 -70
  44. package/build/cleanup.js +0 -89
  45. package/build/config.js +0 -39
  46. package/build/constants.js +0 -73
  47. package/build/crash-reporter.js +0 -138
  48. package/build/cucumber-types.js +0 -1
  49. package/build/data-store.js +0 -41
  50. package/build/exitHandler.js +0 -29
  51. package/build/fetchWrapper.js +0 -14
  52. package/build/fileStream.js +0 -12
  53. package/build/insights-handler.js +0 -719
  54. package/build/instrumentation/funnelInstrumentation.js +0 -120
  55. package/build/launcher.js +0 -741
  56. package/build/log4jsAppender.js +0 -19
  57. package/build/logPatcher.js +0 -38
  58. package/build/logReportingAPI.js +0 -56
  59. package/build/performance-tester.js +0 -94
  60. package/build/reporter.js +0 -251
  61. package/build/request-handler.js +0 -74
  62. package/build/scripts/accessibility-scripts.js +0 -61
  63. package/build/service.js +0 -428
  64. package/build/testOps/featureStats.js +0 -116
  65. package/build/testOps/featureUsage.js +0 -47
  66. package/build/testOps/listener.js +0 -222
  67. package/build/testOps/requestUtils.js +0 -39
  68. package/build/testOps/testOpsConfig.js +0 -19
  69. package/build/testOps/usageStats.js +0 -114
  70. package/build/types.js +0 -1
  71. package/build/util.js +0 -1132
  72. /package/{LICENSE-MIT → LICENSE} +0 -0
@@ -1,222 +0,0 @@
1
- import UsageStats from './usageStats.js';
2
- import RequestQueueHandler from '../request-handler.js';
3
- import { batchAndPostEvents, sleep } from '../util.js';
4
- import { DATA_BATCH_ENDPOINT, DEFAULT_WAIT_INTERVAL_FOR_PENDING_UPLOADS, DEFAULT_WAIT_TIMEOUT_FOR_PENDING_UPLOADS, LOG_KIND_USAGE_MAP } from '../constants.js';
5
- import { sendScreenshots } from './requestUtils.js';
6
- import { BStackLogger } from '../bstackLogger.js';
7
- class Listener {
8
- static instance;
9
- usageStats = UsageStats.getInstance();
10
- testStartedStats = this.usageStats.testStartedStats;
11
- testFinishedStats = this.usageStats.testFinishedStats;
12
- hookStartedStats = this.usageStats.hookStartedStats;
13
- hookFinishedStats = this.usageStats.hookFinishedStats;
14
- cbtSessionStats = this.usageStats.cbtSessionStats;
15
- logEvents = this.usageStats.logStats;
16
- requestBatcher;
17
- pendingUploads = 0;
18
- // Making the constructor private to use singleton pattern
19
- constructor() {
20
- }
21
- static getInstance() {
22
- if (!Listener.instance) {
23
- Listener.instance = new Listener();
24
- }
25
- return Listener.instance;
26
- }
27
- async onWorkerEnd() {
28
- try {
29
- await this.uploadPending();
30
- await this.teardown();
31
- }
32
- catch (e) {
33
- BStackLogger.debug('Exception in onWorkerEnd: ' + e);
34
- }
35
- }
36
- async uploadPending(waitTimeout = DEFAULT_WAIT_TIMEOUT_FOR_PENDING_UPLOADS, waitInterval = DEFAULT_WAIT_INTERVAL_FOR_PENDING_UPLOADS) {
37
- if ((this.pendingUploads <= 0) || waitTimeout <= 0) {
38
- return;
39
- }
40
- await sleep(waitInterval);
41
- return this.uploadPending(waitTimeout - waitInterval);
42
- }
43
- async teardown() {
44
- BStackLogger.debug('teardown started');
45
- RequestQueueHandler.tearDownInvoked = true;
46
- await this.requestBatcher?.shutdown();
47
- BStackLogger.debug('teardown ended');
48
- }
49
- hookStarted(hookData) {
50
- try {
51
- this.hookStartedStats.triggered();
52
- this.sendBatchEvents(this.getEventForHook('HookRunStarted', hookData));
53
- }
54
- catch (e) {
55
- this.hookStartedStats.failed();
56
- throw e;
57
- }
58
- }
59
- hookFinished(hookData) {
60
- try {
61
- this.hookFinishedStats.triggered(hookData.result);
62
- this.sendBatchEvents(this.getEventForHook('HookRunFinished', hookData));
63
- }
64
- catch (e) {
65
- this.hookFinishedStats.failed(hookData.result);
66
- throw e;
67
- }
68
- }
69
- testStarted(testData) {
70
- try {
71
- this.testStartedStats.triggered();
72
- this.sendBatchEvents(this.getEventForHook('TestRunStarted', testData));
73
- }
74
- catch (e) {
75
- this.testStartedStats.failed();
76
- throw e;
77
- }
78
- }
79
- testFinished(testData) {
80
- try {
81
- this.testFinishedStats.triggered(testData.result);
82
- this.sendBatchEvents(this.getEventForHook('TestRunFinished', testData));
83
- }
84
- catch (e) {
85
- this.testFinishedStats.failed(testData.result);
86
- throw e;
87
- }
88
- }
89
- logCreated(logs) {
90
- try {
91
- this.markLogs('triggered', logs);
92
- this.sendBatchEvents({
93
- event_type: 'LogCreated', logs: logs
94
- });
95
- }
96
- catch (e) {
97
- this.markLogs('failed', logs);
98
- throw e;
99
- }
100
- }
101
- async onScreenshot(jsonArray) {
102
- try {
103
- this.markLogs('triggered', jsonArray);
104
- this.pendingUploads += 1;
105
- await sendScreenshots([{
106
- event_type: 'LogCreated', logs: jsonArray
107
- }]);
108
- this.markLogs('success', jsonArray);
109
- }
110
- catch (e) {
111
- this.markLogs('failed', jsonArray);
112
- throw e;
113
- }
114
- finally {
115
- this.pendingUploads -= 1;
116
- }
117
- }
118
- cbtSessionCreated(data) {
119
- try {
120
- this.cbtSessionStats.triggered();
121
- this.sendBatchEvents({ event_type: 'CBTSessionCreated', test_run: data });
122
- }
123
- catch (e) {
124
- this.cbtSessionStats.failed();
125
- throw e;
126
- }
127
- }
128
- markLogs(status, data) {
129
- if (!data) {
130
- BStackLogger.debug('No log data');
131
- return;
132
- }
133
- try {
134
- for (const _log of data) {
135
- const kind = _log.kind;
136
- this.logEvents.mark(status, LOG_KIND_USAGE_MAP[kind] || kind);
137
- }
138
- }
139
- catch (e) {
140
- BStackLogger.debug('Exception in marking logs status ' + e);
141
- throw e;
142
- }
143
- }
144
- getResult(jsonObject, kind) {
145
- const runStr = kind === 'test' ? 'test_run' : 'hook_run';
146
- const runData = jsonObject[runStr];
147
- return runData?.result;
148
- }
149
- sendBatchEvents(jsonObject) {
150
- if (!this.requestBatcher) {
151
- this.requestBatcher = RequestQueueHandler.getInstance(async (data) => {
152
- BStackLogger.debug('callback: called with events ' + data.length);
153
- try {
154
- this.pendingUploads += 1;
155
- await batchAndPostEvents(DATA_BATCH_ENDPOINT, 'BATCH_DATA', data);
156
- BStackLogger.debug('callback: marking events success ' + data.length);
157
- this.eventsSuccess(data);
158
- }
159
- catch (e) {
160
- BStackLogger.debug('callback: marking events failed ' + data.length);
161
- this.eventsFailed(data);
162
- }
163
- finally {
164
- this.pendingUploads -= 1;
165
- }
166
- });
167
- }
168
- this.requestBatcher.add(jsonObject);
169
- }
170
- eventsFailed(events) {
171
- for (const event of events) {
172
- const eventType = event.event_type;
173
- if (eventType === 'TestRunStarted') {
174
- this.testStartedStats.failed();
175
- }
176
- else if (eventType === 'TestRunFinished') {
177
- this.testFinishedStats.failed(this.getResult(event, 'test'));
178
- }
179
- else if (eventType === 'HookRunStarted') {
180
- this.hookStartedStats.failed();
181
- }
182
- else if (eventType === 'HookRunFinished') {
183
- this.hookFinishedStats.failed(this.getResult(event, 'hook'));
184
- }
185
- else if (eventType === 'CBTSessionCreated') {
186
- this.cbtSessionStats.failed();
187
- }
188
- else if (eventType === 'LogCreated') {
189
- this.markLogs('failed', event.logs);
190
- }
191
- }
192
- }
193
- eventsSuccess(events) {
194
- for (const event of events) {
195
- const eventType = event.event_type;
196
- if (eventType === 'TestRunStarted') {
197
- this.testStartedStats.success();
198
- }
199
- else if (eventType === 'TestRunFinished') {
200
- this.testFinishedStats.success(this.getResult(event, 'test'));
201
- }
202
- else if (eventType === 'HookRunStarted') {
203
- this.hookStartedStats.success();
204
- }
205
- else if (eventType === 'HookRunFinished') {
206
- this.hookFinishedStats.success(this.getResult(event, 'hook'));
207
- }
208
- else if (eventType === 'CBTSessionCreated') {
209
- this.cbtSessionStats.success();
210
- }
211
- else if (eventType === 'LogCreated') {
212
- this.markLogs('success', event.logs);
213
- }
214
- }
215
- }
216
- getEventForHook(eventType, data) {
217
- return {
218
- event_type: eventType, [data.type === 'hook' ? 'hook_run' : 'test_run']: data
219
- };
220
- }
221
- }
222
- export default Listener;
@@ -1,39 +0,0 @@
1
- import { DATA_ENDPOINT, DATA_EVENT_ENDPOINT, DATA_SCREENSHOT_ENDPOINT, TESTOPS_BUILD_COMPLETED_ENV, TESTOPS_JWT_ENV } from '../constants.js';
2
- import { BStackLogger } from '../bstackLogger.js';
3
- import { DEFAULT_REQUEST_CONFIG, getLogTag } from '../util.js';
4
- import fetchWrap from '../fetchWrapper.js';
5
- export async function uploadEventData(eventData, eventUrl = DATA_EVENT_ENDPOINT) {
6
- let logTag = 'BATCH_UPLOAD';
7
- if (!Array.isArray(eventData)) {
8
- logTag = getLogTag(eventData.event_type);
9
- }
10
- if (eventUrl === DATA_SCREENSHOT_ENDPOINT) {
11
- logTag = 'screenshot_upload';
12
- }
13
- if (!process.env[TESTOPS_BUILD_COMPLETED_ENV]) {
14
- throw new Error('Build start not completed yet');
15
- }
16
- if (!process.env[TESTOPS_JWT_ENV]) {
17
- BStackLogger.debug(`[${logTag}] Missing Authentication Token/ Build ID`);
18
- throw new Error('Token/buildID is undefined, build creation might have failed');
19
- }
20
- try {
21
- const url = `${DATA_ENDPOINT}/${eventUrl}`;
22
- const data = await fetchWrap(url, {
23
- method: 'POST',
24
- headers: {
25
- ...DEFAULT_REQUEST_CONFIG.headers,
26
- 'Authorization': `Bearer ${process.env[TESTOPS_JWT_ENV]}`
27
- },
28
- body: JSON.stringify(eventData)
29
- });
30
- BStackLogger.debug(`[${logTag}] Success response: ${JSON.stringify(await data.json())}`);
31
- }
32
- catch (error) {
33
- BStackLogger.debug(`[${logTag}] Failed. Error: ${error}`);
34
- throw error;
35
- }
36
- }
37
- export function sendScreenshots(eventData) {
38
- return uploadEventData(eventData, DATA_SCREENSHOT_ENDPOINT);
39
- }
@@ -1,19 +0,0 @@
1
- class TestOpsConfig {
2
- enabled;
3
- manuallySet;
4
- static _instance;
5
- buildStopped = false;
6
- buildHashedId;
7
- static getInstance(...args) {
8
- if (!this._instance) {
9
- this._instance = new TestOpsConfig(...args);
10
- }
11
- return this._instance;
12
- }
13
- constructor(enabled = true, manuallySet = false) {
14
- this.enabled = enabled;
15
- this.manuallySet = manuallySet;
16
- TestOpsConfig._instance = this;
17
- }
18
- }
19
- export default TestOpsConfig;
@@ -1,114 +0,0 @@
1
- import FeatureStats from './featureStats.js';
2
- import FeatureUsage from './featureUsage.js';
3
- import { BStackLogger } from '../bstackLogger.js';
4
- import TestOpsConfig from './testOpsConfig.js';
5
- class UsageStats {
6
- static instance;
7
- testStartedStats;
8
- testFinishedStats;
9
- hookStartedStats;
10
- hookFinishedStats;
11
- cbtSessionStats;
12
- logStats;
13
- launchBuildUsage;
14
- stopBuildUsage;
15
- static getInstance() {
16
- if (!UsageStats.instance) {
17
- UsageStats.instance = new UsageStats();
18
- }
19
- return UsageStats.instance;
20
- }
21
- constructor() {
22
- this.testStartedStats = new FeatureStats();
23
- this.testFinishedStats = new FeatureStats();
24
- this.hookStartedStats = new FeatureStats();
25
- this.hookFinishedStats = new FeatureStats();
26
- this.cbtSessionStats = new FeatureStats();
27
- this.logStats = new FeatureStats();
28
- this.launchBuildUsage = new FeatureUsage();
29
- this.stopBuildUsage = new FeatureUsage();
30
- }
31
- add(usageStats) {
32
- this.testStartedStats.add(usageStats.testStartedStats);
33
- this.testFinishedStats.add(usageStats.testFinishedStats);
34
- this.hookStartedStats.add(usageStats.hookStartedStats);
35
- this.hookFinishedStats.add(usageStats.hookFinishedStats);
36
- this.cbtSessionStats.add(usageStats.cbtSessionStats);
37
- this.logStats.add(usageStats.logStats);
38
- }
39
- getFormattedData(workersData) {
40
- this.addDataFromWorkers(workersData);
41
- const testOpsConfig = TestOpsConfig.getInstance();
42
- const usage = {
43
- enabled: testOpsConfig.enabled,
44
- manuallySet: testOpsConfig.manuallySet,
45
- buildHashedId: testOpsConfig.buildHashedId
46
- };
47
- if (!usage.enabled) {
48
- return usage;
49
- }
50
- try {
51
- usage.events = this.getEventsData();
52
- }
53
- catch (e) {
54
- BStackLogger.debug('exception in getFormattedData: ' + e);
55
- }
56
- return usage;
57
- }
58
- addDataFromWorkers(workersData) {
59
- workersData.map(workerData => {
60
- try {
61
- const usageStatsForWorker = UsageStats.fromJSON(workerData.usageStats);
62
- this.add(usageStatsForWorker);
63
- }
64
- catch (e) {
65
- BStackLogger.debug('Exception in adding workerData: ' + e);
66
- }
67
- });
68
- }
69
- getEventsData() {
70
- return {
71
- buildEvents: {
72
- started: this.launchBuildUsage.toJSON(),
73
- finished: this.stopBuildUsage.toJSON()
74
- },
75
- testEvents: {
76
- started: this.testStartedStats.toJSON(),
77
- finished: this.testFinishedStats.toJSON({ omitGroups: true }),
78
- ...this.testFinishedStats.toJSON({ onlyGroups: true })
79
- },
80
- hookEvents: {
81
- started: this.hookStartedStats.toJSON(),
82
- finished: this.hookFinishedStats.toJSON({ omitGroups: true }),
83
- ...this.hookFinishedStats.toJSON({ onlyGroups: true })
84
- },
85
- logEvents: this.logStats.toJSON(),
86
- cbtSessionEvents: this.cbtSessionStats.toJSON()
87
- };
88
- }
89
- getDataToSave() {
90
- return {
91
- testEvents: {
92
- started: this.testStartedStats.toJSON(),
93
- finished: this.testFinishedStats.toJSON({ nestedGroups: true }),
94
- },
95
- hookEvents: {
96
- started: this.hookStartedStats.toJSON(),
97
- finished: this.hookFinishedStats.toJSON({ nestedGroups: true }),
98
- },
99
- logEvents: this.logStats.toJSON({ nestedGroups: true }),
100
- cbtSessionEvents: this.cbtSessionStats.toJSON()
101
- };
102
- }
103
- static fromJSON(data) {
104
- const usageStats = new UsageStats();
105
- usageStats.testStartedStats = FeatureStats.fromJSON(data.testEvents.started);
106
- usageStats.testFinishedStats = FeatureStats.fromJSON(data.testEvents.finished);
107
- usageStats.hookStartedStats = FeatureStats.fromJSON(data.hookEvents.started);
108
- usageStats.hookFinishedStats = FeatureStats.fromJSON(data.hookEvents.finished);
109
- usageStats.logStats = FeatureStats.fromJSON(data.logEvents);
110
- usageStats.cbtSessionStats = FeatureStats.fromJSON(data.cbtSessionStats);
111
- return usageStats;
112
- }
113
- }
114
- export default UsageStats;
package/build/types.js DELETED
@@ -1 +0,0 @@
1
- export {};