-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathBedrockAuto.ts
More file actions
143 lines (122 loc) · 5.94 KB
/
BedrockAuto.ts
File metadata and controls
143 lines (122 loc) · 5.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
import * as chalk from 'chalk';
import * as Serve from './bedrock/server/Serve';
import { Attempt } from './bedrock/core/Attempt';
import * as Version from './bedrock/core/Version';
import * as RunnerRoutes from './bedrock/server/RunnerRoutes';
import * as Reporter from './bedrock/core/Reporter';
import * as DriverMaster from './bedrock/server/DriverMaster';
import * as Driver from './bedrock/auto/Driver';
import * as Tunnel from './bedrock/auto/Tunnel';
import * as Lifecycle from './bedrock/core/Lifecycle';
import { BedrockAutoSettings } from './bedrock/core/Settings';
import { ExitCodes } from './bedrock/util/ExitCodes';
import * as ConsoleReporter from './bedrock/core/ConsoleReporter';
import * as SettingsResolver from './bedrock/core/SettingsResolver';
import { format } from 'node:util';
import { Browser } from 'webdriverio';
import { defer } from './bedrock/util/Waiter';
async function makeWebDriver(settings: BedrockAutoSettings, servicePort: number, shutdownServices: ((immediate?: boolean) => Promise<void>)[], browserName: string, isHeadless: boolean) {
// Remote settings
const remoteWebdriver = settings.remote;
const sishDomain = settings.sishDomain;
const username = settings.username ?? process.env.LT_USERNAME;
const accesskey = settings.accesskey ?? process.env.LT_ACCESS_KEY;
const tunnelCredentials = {
user: username,
key: accesskey
};
const tunnel = await Tunnel.prepareConnection(servicePort, remoteWebdriver, sishDomain, tunnelCredentials);
shutdownServices.push(tunnel.shutdown);
const location = tunnel.url.href;
console.log(`Creating ${ remoteWebdriver ?? 'local' } webdriver...`);
if (remoteWebdriver == 'aws') {
console.log('INFO: Webdriver creation waits for device farm session to activate. Takes 30-45s.');
}
const driver = await Driver.create({
browser: browserName,
basedir: settings.basedir,
headless: isHeadless,
debuggingPort: settings.debuggingPort,
useSandboxForHeadless: settings.useSandboxForHeadless,
extraBrowserCapabilities: settings.extraBrowserCapabilities,
verbose: settings.verbose,
wipeBrowserCache: settings.wipeBrowserCache,
remoteWebdriver,
webdriverPort: settings.webdriverPort,
useSelenium: settings.useSelenium,
username,
accesskey,
devicefarmRegion: settings.devicefarmRegion,
deviceFarmArn: settings.devicefarmArn,
browserVersion: settings.browserVersion,
platformName: settings.platformName,
tunnel,
name: settings.name ? settings.name : 'bedrock-auto'
});
shutdownServices.push(driver.shutdown);
const webdriver = driver.webdriver;
return { location, webdriver };
}
export const go = async (bedrockAutoSettings: BedrockAutoSettings): Promise<void> => {
console.log('bedrock-auto ' + Version.get() + ' starting...');
const settings = SettingsResolver.resolveAndLog(bedrockAutoSettings);
const master = DriverMaster.create();
const browserName = settings.browser.replace('-headless', '');
const isPhantom = browserName === 'phantomjs';
const isHeadless = settings.browser.endsWith('-headless') || isPhantom;
const basePage = 'src/resources/html/' + (isPhantom ? 'bedrock-phantom.html' : 'bedrock.html');
const shutdownServices: ((immediate?: boolean) => Promise<void>)[] = [];
const shutdown = (services: ((immediate?: boolean) => Promise<void>)[]) => (immediate?: boolean) => Promise.allSettled(services.map((fn) => fn(immediate)));
try {
const driverDeferred = defer<Attempt<unknown, Browser>>();
const scratchDir = settings.name ? `scratch/${settings.name}` : `scratch/bedrock`;
const routesPromise = RunnerRoutes.generate('auto', settings.projectdir, settings.basedir, scratchDir, settings.config, settings.bundler, settings.testfiles, settings.chunk, settings.retries, settings.singleTimeout, settings.stopOnFailure, basePage, settings.coverage, settings.polyfills);
const service = await Serve.start({
...settings,
driver: driverDeferred.promise,
master,
runner: routesPromise,
stickyFirstSession: true,
});
const driverPromise = makeWebDriver(settings, service.port, shutdownServices, browserName, isHeadless);
driverPromise.then(({ webdriver }) => {
driverDeferred.resolve(Attempt.passed(webdriver));
}).catch((e) => {
driverDeferred.reject(Attempt.failed(e));
});
shutdownServices.push(service.shutdown);
const { location, webdriver } = await driverPromise;
console.log('Started webdriver session: ', webdriver.sessionId);
const cancelEverything = Lifecycle.cancel(webdriver, shutdown(shutdownServices), settings.gruntDone);
process.on('SIGINT', cancelEverything);
process.on('SIGQUIT', cancelEverything);
process.on('SIGTERM', cancelEverything);
try {
if (!isHeadless) {
console.log('bedrock-auto ' + Version.get() + ' available at: ' + location);
}
console.log('Loading initial page...');
await webdriver.url(location);
console.log(isPhantom ? '\nPhantom tests loading ...\n' : '\nInitial page has loaded ...\n');
service.markLoaded();
service.enableHud();
const result = await service.awaitDone().then((data) => {
ConsoleReporter.printReport(data);
return Reporter.write(settings, data);
}, (data) => {
ConsoleReporter.printReport(data);
return Reporter.writePollExit(settings, data);
});
return Lifecycle.done(result, webdriver, shutdown(shutdownServices), settings.gruntDone, settings.delayExit);
} catch (e) {
return Lifecycle.error(e as any, webdriver, shutdown(shutdownServices), settings.gruntDone, settings.delayExit);
}
} catch(err) {
// Chalk does not use a formatter. Using node's built-in to expand Objects, etc.
console.error(chalk.red('Error creating webdriver', format(err)));
// Shutdown tunnels in case webdriver fails
await shutdown(shutdownServices)(true);
return Lifecycle.exit(settings.gruntDone, ExitCodes.failures.unexpected);
}
};
export const mode = 'forAuto';