| Index: tools/testing/dart/browser_controller.dart
|
| diff --git a/tools/testing/dart/browser_controller.dart b/tools/testing/dart/browser_controller.dart
|
| index ef2f189c45aeae4c8bb195977de8507607379308..9f943cd8fd080059c03eacb4ac32aefb9c540508 100644
|
| --- a/tools/testing/dart/browser_controller.dart
|
| +++ b/tools/testing/dart/browser_controller.dart
|
| @@ -1130,7 +1130,7 @@ class BrowserTestRunner {
|
| }
|
| }
|
|
|
| - void handleTimeout(BrowserStatus status) {
|
| + Future handleTimeout(BrowserStatus status) async {
|
| // We simply kill the browser and starts up a new one!
|
| // We could be smarter here, but it does not seems like it is worth it.
|
| if (status.timeout) {
|
| @@ -1142,33 +1142,39 @@ class BrowserTestRunner {
|
| var id = status.browser.id;
|
|
|
| status.currentTest.stopwatch.stop();
|
| - status.browser.close().then((_) {
|
| - var lastKnownMessage =
|
| - 'Dom could not be fetched, since the test timed out.';
|
| - if (status.currentTest.lastKnownMessage.length > 0) {
|
| - lastKnownMessage = status.currentTest.lastKnownMessage;
|
| - }
|
| - if (status.lastTest != null) {
|
| - lastKnownMessage += '\nPrevious test was ${status.lastTest.url}';
|
| - }
|
| - // Wait until the browser is closed before reporting the test as timeout.
|
| - // This will enable us to capture stdout/stderr from the browser
|
| - // (which might provide us with information about what went wrong).
|
| - var browserTestOutput = new BrowserTestOutput(
|
| - status.currentTest.delayUntilTestStarted,
|
| - status.currentTest.stopwatch.elapsed,
|
| - lastKnownMessage,
|
| - status.browser.testBrowserOutput,
|
| - didTimeout: true);
|
| - status.currentTest.doneCallback(browserTestOutput);
|
| - status.lastTest = status.currentTest;
|
| - status.currentTest = null;
|
|
|
| - // We don't want to start a new browser if we are terminating.
|
| - if (underTermination) return;
|
| - removeBrowser(id);
|
| - requestBrowser();
|
| - });
|
| + // Before closing the browser, we'll try to capture a screenshot on
|
| + // windows when using IE (to debug flakiness).
|
| + if (status.browser is IE) {
|
| + await captureInternetExplorerScreenshot(
|
| + 'IE screenshot for ${status.currentTest.url}');
|
| + }
|
| + await status.browser.close();
|
| + var lastKnownMessage =
|
| + 'Dom could not be fetched, since the test timed out.';
|
| + if (status.currentTest.lastKnownMessage.length > 0) {
|
| + lastKnownMessage = status.currentTest.lastKnownMessage;
|
| + }
|
| + if (status.lastTest != null) {
|
| + lastKnownMessage += '\nPrevious test was ${status.lastTest.url}';
|
| + }
|
| + // Wait until the browser is closed before reporting the test as timeout.
|
| + // This will enable us to capture stdout/stderr from the browser
|
| + // (which might provide us with information about what went wrong).
|
| + var browserTestOutput = new BrowserTestOutput(
|
| + status.currentTest.delayUntilTestStarted,
|
| + status.currentTest.stopwatch.elapsed,
|
| + lastKnownMessage,
|
| + status.browser.testBrowserOutput,
|
| + didTimeout: true);
|
| + status.currentTest.doneCallback(browserTestOutput);
|
| + status.lastTest = status.currentTest;
|
| + status.currentTest = null;
|
| +
|
| + // We don't want to start a new browser if we are terminating.
|
| + if (underTermination) return;
|
| + removeBrowser(id);
|
| + requestBrowser();
|
| }
|
|
|
| /// Remove a browser that has closed from our data structures that track
|
| @@ -1884,3 +1890,51 @@ body div {
|
| return driverContent;
|
| }
|
| }
|
| +
|
| +Future captureInternetExplorerScreenshot(String message) async {
|
| + if (Platform.environment['USERNAME'] != 'chrome-bot') {
|
| + return;
|
| + }
|
| +
|
| + print('--------------------------------------------------------------------');
|
| + final String date =
|
| + new DateTime.now().toUtc().toIso8601String().replaceAll(':', '_');
|
| + final screenshotName = 'ie_screenshot_${date}.png';
|
| +
|
| + // The "capture_screen.ps1" script is next to "test.dart" in "tools/"
|
| + final powerShellScript =
|
| + Platform.script.resolve('capture_screenshot.ps1').toFilePath();
|
| + final screenshotFile =
|
| + Platform.script.resolve('../$screenshotName').toFilePath();
|
| +
|
| + final args = [powerShellScript, screenshotFile];
|
| + final ProcessResult result =
|
| + await Process.run('powershell.exe', args, runInShell: true);
|
| + if (result.exitCode != 0) {
|
| + print('[$message] Failed to capture IE screenshot on windows: '
|
| + 'powershell.exe "${args.join(' ')}" returned with:\n'
|
| + 'exit code: ${result.exitCode}\n'
|
| + 'stdout: ${result.stdout}\n'
|
| + 'stderr: ${result.stderr}');
|
| + } else {
|
| + final storageUrl = 'gs://dart-temp-crash-archive/$screenshotName';
|
| + final args = [
|
| + r'e:\b\depot_tools\gsutil.py',
|
| + 'cp',
|
| + screenshotFile,
|
| + storageUrl,
|
| + ];
|
| + final ProcessResult result = await Process.run('python', args);
|
| + if (result.exitCode != 0) {
|
| + print('[$message] Failed upload captured IE screenshot to cloud storage: '
|
| + '"${args.join(' ')}" returned with:\n'
|
| + 'exit code: ${result.exitCode}\n'
|
| + 'stdout: ${result.stdout}\n'
|
| + 'stderr: ${result.stderr}');
|
| + } else {
|
| + print('[$message] Successfully uploaded screenshot to $storageUrl');
|
| + }
|
| + new File(screenshotFile).deleteSync();
|
| + }
|
| + print('--------------------------------------------------------------------');
|
| +}
|
|
|