[ftr/webdriver] retry on all errors, use Rx so that timers are canceled (#72540)

* [ftr/webdriver] retry on all errors, use Rx so that timers are canceled

* throw if attemptToCreateCommand() aborts by resolving to undefined

Co-authored-by: spalger <spalger@users.noreply.github.com>
This commit is contained in:
Spencer 2020-07-20 20:35:15 -07:00 committed by GitHub
parent bfbb8d2138
commit a1753ffffd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -21,10 +21,9 @@ import { resolve } from 'path';
import Fs from 'fs';
import * as Rx from 'rxjs';
import { mergeMap, map, takeUntil } from 'rxjs/operators';
import { mergeMap, map, takeUntil, catchError } from 'rxjs/operators';
import { Lifecycle } from '@kbn/test/src/functional_test_runner/lib/lifecycle';
import { ToolingLog } from '@kbn/dev-utils';
import { delay } from 'bluebird';
import chromeDriver from 'chromedriver';
// @ts-ignore types not available
import geckoDriver from 'geckodriver';
@ -337,25 +336,33 @@ export async function initWebDriver(
edgePaths = await installDriver();
}
return await Promise.race([
(async () => {
await delay(2 * MINUTE);
throw new Error('remote failed to start within 2 minutes');
})(),
(async () => {
while (true) {
const command = await Promise.race([
delay(30 * SECOND),
attemptToCreateCommand(log, browserType, lifecycle, config),
]);
return await Rx.race(
Rx.timer(2 * MINUTE).pipe(
map(() => {
throw new Error('remote failed to start within 2 minutes');
})
),
Rx.race(
Rx.defer(async () => {
const command = await attemptToCreateCommand(log, browserType, lifecycle, config);
if (!command) {
continue;
throw new Error('remote creation aborted');
}
return command;
}
})(),
]);
}),
Rx.timer(30 * SECOND).pipe(
map(() => {
throw new Error('remote failed to start within 30 seconds');
})
)
).pipe(
catchError((error, resubscribe) => {
log.warning('Failure while creating webdriver instance');
log.warning(error);
log.warning('...retrying...');
return resubscribe;
})
)
).toPromise();
}