@@ -12,10 +12,58 @@ import { BedrockAutoSettings } from './bedrock/core/Settings';
1212import { ExitCodes } from './bedrock/util/ExitCodes' ;
1313import * as ConsoleReporter from './bedrock/core/ConsoleReporter' ;
1414import * as SettingsResolver from './bedrock/core/SettingsResolver' ;
15- import * as portfinder from 'portfinder' ;
1615import { format } from 'node:util' ;
16+ import { Browser } from 'webdriverio' ;
17+ import { defer } from './bedrock/util/Waiter' ;
1718
18- export const go = ( bedrockAutoSettings : BedrockAutoSettings ) : void => {
19+ async function makeWebDriver ( settings : BedrockAutoSettings , servicePort : number , shutdownServices : ( ( immediate ?: boolean ) => Promise < void > ) [ ] , browserName : string , isHeadless : boolean ) {
20+ // Remote settings
21+ const remoteWebdriver = settings . remote ;
22+ const sishDomain = settings . sishDomain ;
23+ const username = settings . username ?? process . env . LT_USERNAME ;
24+ const accesskey = settings . accesskey ?? process . env . LT_ACCESS_KEY ;
25+ const tunnelCredentials = {
26+ user : username ,
27+ key : accesskey
28+ } ;
29+
30+ const tunnel = await Tunnel . prepareConnection ( servicePort , remoteWebdriver , sishDomain , tunnelCredentials ) ;
31+ shutdownServices . push ( tunnel . shutdown ) ;
32+ const location = tunnel . url . href ;
33+
34+ console . log ( `Creating ${ remoteWebdriver ?? 'local' } webdriver...` ) ;
35+ if ( remoteWebdriver == 'aws' ) {
36+ console . log ( 'INFO: Webdriver creation waits for device farm session to activate. Takes 30-45s.' ) ;
37+ }
38+
39+ const driver = await Driver . create ( {
40+ browser : browserName ,
41+ basedir : settings . basedir ,
42+ headless : isHeadless ,
43+ debuggingPort : settings . debuggingPort ,
44+ useSandboxForHeadless : settings . useSandboxForHeadless ,
45+ extraBrowserCapabilities : settings . extraBrowserCapabilities ,
46+ verbose : settings . verbose ,
47+ wipeBrowserCache : settings . wipeBrowserCache ,
48+ remoteWebdriver,
49+ webdriverPort : settings . webdriverPort ,
50+ useSelenium : settings . useSelenium ,
51+ username,
52+ accesskey,
53+ devicefarmRegion : settings . devicefarmRegion ,
54+ deviceFarmArn : settings . devicefarmArn ,
55+ browserVersion : settings . browserVersion ,
56+ platformName : settings . platformName ,
57+ tunnel,
58+ name : settings . name ? settings . name : 'bedrock-auto'
59+ } ) ;
60+ shutdownServices . push ( driver . shutdown ) ;
61+
62+ const webdriver = driver . webdriver ;
63+ return { location, webdriver } ;
64+ }
65+
66+ export const go = async ( bedrockAutoSettings : BedrockAutoSettings ) : Promise < void > => {
1967 console . log ( 'bedrock-auto ' + Version . get ( ) + ' starting...' ) ;
2068
2169 const settings = SettingsResolver . resolveAndLog ( bedrockAutoSettings ) ;
@@ -24,72 +72,36 @@ export const go = (bedrockAutoSettings: BedrockAutoSettings): void => {
2472 const isPhantom = browserName === 'phantomjs' ;
2573 const isHeadless = settings . browser . endsWith ( '-headless' ) || isPhantom ;
2674 const basePage = 'src/resources/html/' + ( isPhantom ? 'bedrock-phantom.html' : 'bedrock.html' ) ;
27- // Remote settings
28- const remoteWebdriver = settings . remote ;
29- const sishDomain = settings . sishDomain ;
30- const username = settings . username ?? process . env . LT_USERNAME ;
31- const accesskey = settings . accesskey ?? process . env . LT_ACCESS_KEY ;
32-
33- const routes = RunnerRoutes . generate ( 'auto' , settings . projectdir , settings . basedir , settings . config , settings . bundler , settings . testfiles , settings . chunk , settings . retries , settings . singleTimeout , settings . stopOnFailure , basePage , settings . coverage , settings . polyfills ) ;
3475
3576 const shutdownServices : ( ( immediate ?: boolean ) => Promise < void > ) [ ] = [ ] ;
3677 const shutdown = ( services : ( ( immediate ?: boolean ) => Promise < void > ) [ ] ) => ( immediate ?: boolean ) => Promise . allSettled ( services . map ( ( fn ) => fn ( immediate ) ) ) ;
3778
38- routes . then ( async ( runner ) => {
39-
40- // LambdaTest Tunnel must know dev server port, but tunnel must be created before dev server.
41- const servicePort = await portfinder . getPortPromise ( {
42- port : 8000 ,
43- stopPort : 20000
44- } ) ;
45-
46- const tunnelCredentials = {
47- user : username ,
48- key : accesskey
49- } ;
79+ try {
5080
51- const tunnel = await Tunnel . prepareConnection ( servicePort , remoteWebdriver , sishDomain , tunnelCredentials ) ;
52- shutdownServices . push ( tunnel . shutdown ) ;
53- const location = tunnel . url . href ;
81+ const driverDeferred = defer < Attempt < unknown , Browser > > ( ) ;
5482
55- console . log ( `Creating ${ remoteWebdriver ?? 'local' } webdriver...` ) ;
56- if ( remoteWebdriver == 'aws' ) {
57- console . log ( 'INFO: Webdriver creation waits for device farm session to activate. Takes 30-45s.' ) ;
58- }
83+ const scratchDir = settings . name ? `scratch_${ settings . name } ` : `bedrock` ;
5984
60- const driver = await Driver . create ( {
61- browser : browserName ,
62- basedir : settings . basedir ,
63- headless : isHeadless ,
64- debuggingPort : settings . debuggingPort ,
65- useSandboxForHeadless : settings . useSandboxForHeadless ,
66- extraBrowserCapabilities : settings . extraBrowserCapabilities ,
67- verbose : settings . verbose ,
68- wipeBrowserCache : settings . wipeBrowserCache ,
69- remoteWebdriver,
70- webdriverPort : settings . webdriverPort ,
71- useSelenium : settings . useSelenium ,
72- username,
73- accesskey,
74- devicefarmRegion : settings . devicefarmRegion ,
75- deviceFarmArn : settings . devicefarmArn ,
76- browserVersion : settings . browserVersion ,
77- platformName : settings . platformName ,
78- tunnel,
79- name : settings . name ? settings . name : 'bedrock-auto'
80- } ) ;
85+ 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 ) ;
8186
82- const webdriver = driver . webdriver ;
83- console . log ( 'Started webdriver session: ' , webdriver . sessionId ) ;
8487 const service = await Serve . start ( {
8588 ...settings ,
86- driver : Attempt . passed ( webdriver ) ,
89+ driver : driverDeferred . promise ,
8790 master,
88- runner,
91+ runner : routesPromise ,
8992 stickyFirstSession : true ,
90- port : servicePort
9193 } ) ;
92- shutdownServices . push ( service . shutdown , driver . shutdown ) ;
94+ const driverPromise = makeWebDriver ( settings , service . port , shutdownServices , browserName , isHeadless ) ;
95+ driverPromise . then ( ( { webdriver } ) => {
96+ driverDeferred . resolve ( Attempt . passed ( webdriver ) ) ;
97+ } ) . catch ( ( e ) => {
98+ driverDeferred . reject ( Attempt . failed ( e ) ) ;
99+ } ) ;
100+
101+ shutdownServices . push ( service . shutdown ) ;
102+
103+ const { location, webdriver } = await driverPromise ;
104+ console . log ( 'Started webdriver session: ' , webdriver . sessionId ) ;
93105
94106 const cancelEverything = Lifecycle . cancel ( webdriver , shutdown ( shutdownServices ) , settings . gruntDone ) ;
95107 process . on ( 'SIGINT' , cancelEverything ) ;
@@ -119,13 +131,13 @@ export const go = (bedrockAutoSettings: BedrockAutoSettings): void => {
119131 } catch ( e ) {
120132 return Lifecycle . error ( e as any , webdriver , shutdown ( shutdownServices ) , settings . gruntDone , settings . delayExit ) ;
121133 }
122- } ) . catch ( async ( err ) => {
134+ } catch ( err ) {
123135 // Chalk does not use a formatter. Using node's built-in to expand Objects, etc.
124136 console . error ( chalk . red ( 'Error creating webdriver' , format ( err ) ) ) ;
125137 // Shutdown tunnels in case webdriver fails
126138 await shutdown ( shutdownServices ) ( true ) ;
127- Lifecycle . exit ( settings . gruntDone , ExitCodes . failures . unexpected ) ;
128- } ) ;
139+ return Lifecycle . exit ( settings . gruntDone , ExitCodes . failures . unexpected ) ;
140+ }
129141} ;
130142
131143export const mode = 'forAuto' ;
0 commit comments