Index: base/test/android/javatests/src/org/chromium/base/test/ScreenshotOnFailureStatement.java |
diff --git a/base/test/android/javatests/src/org/chromium/base/test/ScreenshotOnFailureStatement.java b/base/test/android/javatests/src/org/chromium/base/test/ScreenshotOnFailureStatement.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ac60fd556361c5c2e878fb2d80f46ef065118bea |
--- /dev/null |
+++ b/base/test/android/javatests/src/org/chromium/base/test/ScreenshotOnFailureStatement.java |
@@ -0,0 +1,76 @@ |
+// Copyright 2017 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+package org.chromium.base.test; |
+ |
+import android.support.test.InstrumentationRegistry; |
+import android.support.test.uiautomator.UiDevice; |
+ |
+import org.junit.runners.model.Statement; |
+ |
+import org.chromium.base.Log; |
+ |
+import java.io.File; |
+ |
+/** |
+ * Statement that captures screenshots if |base| statement fails. |
+ * |
+ * If --screenshot-path commandline flag is given, this |Statement| |
+ * will save a screenshot to the specified path in the case of a test failure. |
+ */ |
+public class ScreenshotOnFailureStatement extends Statement { |
+ private static final String TAG = "ScreenshotOnFail"; |
+ |
+ private static final String EXTRA_SCREENSHOT_FILE = |
+ "org.chromium.base.test.ScreenshotOnFailureStatement.ScreenshotFile"; |
+ |
+ private final Statement mBase; |
+ |
+ public ScreenshotOnFailureStatement(final Statement base) { |
+ mBase = base; |
+ } |
+ |
+ @Override |
+ public void evaluate() throws Throwable { |
+ try { |
+ mBase.evaluate(); |
+ } catch (Throwable e) { |
+ takeScreenshot(); |
+ throw e; |
+ } |
+ } |
+ |
+ private void takeScreenshot() { |
+ String screenshotFilePath = |
+ InstrumentationRegistry.getArguments().getString(EXTRA_SCREENSHOT_FILE); |
+ if (screenshotFilePath == null) { |
+ Log.d(TAG, |
+ String.format("Did not save screenshot of failure. Must specify %s " |
+ + "instrumentation argument to enable this feature.", |
+ EXTRA_SCREENSHOT_FILE)); |
+ return; |
+ } |
+ |
+ UiDevice uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); |
+ File screenshotFile = new File(screenshotFilePath); |
+ File screenshotDir = screenshotFile.getParentFile(); |
+ if (screenshotDir == null) { |
+ Log.d(TAG, |
+ String.format( |
+ "Failed to create parent directory for %s. Can't save screenshot.", |
+ screenshotFile)); |
+ return; |
+ } |
+ if (!screenshotDir.exists()) { |
+ if (!screenshotDir.mkdirs()) { |
+ Log.d(TAG, |
+ String.format( |
+ "Failed to create %s. Can't save screenshot.", screenshotDir)); |
+ return; |
+ } |
+ } |
+ Log.d(TAG, String.format("Saving screenshot of test failure, %s", screenshotFile)); |
+ uiDevice.takeScreenshot(screenshotFile); |
+ } |
+} |