Saving screenshots for failures in NavigationModeSwitchRule

Change-Id: I732076a5eb14b181f560024e2780e2012a81fd95
This commit is contained in:
vadimt 2019-08-23 12:11:00 -07:00
parent 197ae725a0
commit f13eaa0242
2 changed files with 24 additions and 11 deletions

View File

@ -34,9 +34,9 @@ import androidx.test.uiautomator.UiDevice;
import com.android.launcher3.tapl.LauncherInstrumentation;
import com.android.launcher3.tapl.TestHelpers;
import com.android.launcher3.util.rule.FailureWatcher;
import com.android.systemui.shared.system.QuickStepContract;
import org.junit.Assert;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
@ -79,6 +79,14 @@ public class NavigationModeSwitchRule implements TestRule {
description.getAnnotation(NavigationModeSwitch.class) != null) {
Mode mode = description.getAnnotation(NavigationModeSwitch.class).mode();
return new Statement() {
private void assertTrue(String message, boolean condition) {
if(!condition) {
final AssertionError assertionError = new AssertionError(message);
FailureWatcher.onError(mLauncher.getDevice(), description, assertionError);
throw assertionError;
}
}
@Override
public void evaluate() throws Throwable {
mLauncher.enableDebugTracing();
@ -107,7 +115,8 @@ public class NavigationModeSwitchRule implements TestRule {
Log.e(TAG, "Exception", e);
throw e;
} finally {
Assert.assertTrue(setActiveOverlay(prevOverlayPkg, originalMode));
assertTrue("Couldn't set overlay",
setActiveOverlay(prevOverlayPkg, originalMode));
}
mLauncher.disableDebugTracing();
}
@ -176,7 +185,7 @@ public class NavigationModeSwitchRule implements TestRule {
latch.await(10, TimeUnit.SECONDS);
targetContext.getMainExecutor().execute(() ->
sysUINavigationMode.removeModeChangeListener(listener));
Assert.assertTrue("Navigation mode didn't change to " + expectedMode,
assertTrue("Navigation mode didn't change to " + expectedMode,
currentSysUiNavigationMode() == expectedMode);
}
@ -184,7 +193,7 @@ public class NavigationModeSwitchRule implements TestRule {
if (mLauncher.getNavigationModel() == expectedMode) break;
Thread.sleep(100);
}
Assert.assertTrue("Couldn't switch to " + overlayPackage,
assertTrue("Couldn't switch to " + overlayPackage,
mLauncher.getNavigationModel() == expectedMode);
for (int i = 0; i != 100; ++i) {
@ -192,7 +201,7 @@ public class NavigationModeSwitchRule implements TestRule {
Thread.sleep(100);
}
final String error = mLauncher.getNavigationModeMismatchError();
Assert.assertTrue("Switching nav mode: " + error, error == null);
assertTrue("Switching nav mode: " + error, error == null);
Thread.sleep(5000);
return true;

View File

@ -21,10 +21,10 @@ public class FailureWatcher extends TestWatcher {
mDevice = device;
}
private void dumpViewHierarchy() {
private static void dumpViewHierarchy(UiDevice device) {
final ByteArrayOutputStream stream = new ByteArrayOutputStream();
try {
mDevice.dumpWindowHierarchy(stream);
device.dumpWindowHierarchy(stream);
stream.flush();
stream.close();
for (String line : stream.toString().split("\\r?\\n")) {
@ -37,7 +37,11 @@ public class FailureWatcher extends TestWatcher {
@Override
protected void failed(Throwable e, Description description) {
if (mDevice == null) return;
onError(mDevice, description, e);
}
public static void onError(UiDevice device, Description description, Throwable e) {
if (device == null) return;
final String pathname = getInstrumentation().getTargetContext().
getFilesDir().getPath() + "/TestScreenshot-" + description.getMethodName()
+ ".png";
@ -45,15 +49,15 @@ public class FailureWatcher extends TestWatcher {
", screenshot will be saved to " + pathname +
", track trace is below, UI object dump is further below:\n" +
Log.getStackTraceString(e));
dumpViewHierarchy();
dumpViewHierarchy(device);
try {
final String dumpsysResult = mDevice.executeShellCommand(
final String dumpsysResult = device.executeShellCommand(
"dumpsys activity service TouchInteractionService");
Log.d(TAG, "TouchInteractionService: " + dumpsysResult);
} catch (IOException ex) {
}
mDevice.takeScreenshot(new File(pathname));
device.takeScreenshot(new File(pathname));
}
}