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..ad22b4a2960864b3de5547fe99e034398152c8d7 |
--- /dev/null |
+++ b/base/test/android/javatests/src/org/chromium/base/test/ScreenshotOnFailureStatement.java |
@@ -0,0 +1,66 @@ |
+// 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.CommandLine; |
+import org.chromium.base.Log; |
+import org.chromium.base.test.util.UrlUtils; |
+ |
+import java.io.File; |
+ |
+/** |
+ * Statement that captures screenshots if |base| statement fails. |
+ * |
+ * If --screenshot-dir commandline flag is given, this statement |
+ * will save a screenshot named failure.png to |
+ * |UrlUtils.getIsolatedTestFilePath| under the subdirectory specified |
+ * in the case of a test failure. |
+ */ |
+public class ScreenshotOnFailureStatement extends Statement { |
+ private static final String TAG = "ScreenshotOnFail"; |
+ |
+ private static final String SCREENSHOT_FILENAME = "failure.png"; |
+ |
+ private final Statement mBase; |
+ |
+ public ScreenshotOnFailureStatement(final Statement base) { |
+ mBase = base; |
+ } |
+ |
+ @Override |
+ public void evaluate() throws Throwable { |
+ try { |
+ mBase.evaluate(); |
+ } catch (Throwable e) { |
+ String subdir = CommandLine.isInitialized() |
jbudorick
2017/05/05 01:21:58
This may be more readable/cleaner if you split the
mikecase (-- gone --)
2017/05/05 18:09:19
Done
|
+ ? CommandLine.getInstance().getSwitchValue("screenshot-dir") |
+ : null; |
+ if (subdir == null) { |
+ Log.d(TAG, |
+ "Did not save screenshot of failure. Must specify --screenshot-dir " |
+ + "command-line flag to enable this feature."); |
+ throw e; |
+ } |
+ |
+ UiDevice uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); |
jbudorick
2017/05/05 01:21:58
I assume this was the only way to do this?
mikecase (-- gone --)
2017/05/05 18:09:19
I looked at basically every other option. So there
|
+ File path = new File(UrlUtils.getIsolatedTestFilePath(subdir)); |
jbudorick
2017/05/05 01:21:58
While I'm ok with using the isolated test file pat
mikecase (-- gone --)
2017/05/05 18:09:19
Added UrlUtils.getTestFileOutputPath
|
+ if (!path.exists()) { |
+ if (!path.mkdirs()) { |
+ Log.d(TAG, String.format("Failed to create %s. Can't save screenshot.", path)); |
+ throw e; |
+ } |
+ } |
+ File file = new File(path + "/" + SCREENSHOT_FILENAME); |
+ Log.d(TAG, String.format("Saving screenshot of test failure, %s", file)); |
+ uiDevice.takeScreenshot(file); |
+ throw e; |
+ } |
+ } |
+} |