From 092b6f8cbf40b0f144fb4d903f92ade6bdbacb0e Mon Sep 17 00:00:00 2001 From: vadimt Date: Thu, 27 Jun 2019 19:16:38 -0700 Subject: [PATCH] Adding system health diags for inporoc tests Bug: 133891845 Change-Id: I90161bfc9db5983a45dfb89728a82ec1e3d81f19 --- .../testcomponent/TestCommandReceiver.java | 17 +++- .../launcher3/ui/AbstractLauncherUiTest.java | 7 +- .../tapl/LauncherInstrumentation.java | 84 ++++--------------- .../android/launcher3/tapl/TestHelpers.java | 68 +++++++++++++++ 4 files changed, 102 insertions(+), 74 deletions(-) diff --git a/tests/src/com/android/launcher3/testcomponent/TestCommandReceiver.java b/tests/src/com/android/launcher3/testcomponent/TestCommandReceiver.java index fa23b8d5b9..6a6916eec3 100644 --- a/tests/src/com/android/launcher3/testcomponent/TestCommandReceiver.java +++ b/tests/src/com/android/launcher3/testcomponent/TestCommandReceiver.java @@ -32,13 +32,14 @@ import android.os.Bundle; import android.os.ParcelFileDescriptor; import android.util.Base64; +import androidx.test.InstrumentationRegistry; + +import com.android.launcher3.tapl.TestHelpers; + import java.io.File; import java.io.FileNotFoundException; -import java.io.FileOutputStream; import java.io.IOException; -import androidx.test.InstrumentationRegistry; - /** * Content provider to receive commands from tests */ @@ -47,6 +48,7 @@ public class TestCommandReceiver extends ContentProvider { public static final String ENABLE_TEST_LAUNCHER = "enable-test-launcher"; public static final String DISABLE_TEST_LAUNCHER = "disable-test-launcher"; public static final String KILL_PROCESS = "kill-process"; + public static final String GET_SYSTEM_HEALTH_MESSAGE = "get-system-health-message"; @Override public boolean onCreate() { @@ -99,6 +101,12 @@ public class TestCommandReceiver extends ContentProvider { killBackgroundProcesses(arg); return null; } + + case GET_SYSTEM_HEALTH_MESSAGE: { + final Bundle response = new Bundle(); + response.putString("result", TestHelpers.getSystemHealthMessage(getContext())); + return response; + } } return super.call(method, arg, extras); } @@ -122,7 +130,8 @@ public class TestCommandReceiver extends ContentProvider { // Create an empty file so that we can pass its descriptor try { file.createNewFile(); - } catch (IOException e) { } + } catch (IOException e) { + } } return ParcelFileDescriptor.open(file, MODE_READ_WRITE); diff --git a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java index e39fc76a0b..361f2fb533 100644 --- a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java +++ b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java @@ -51,6 +51,7 @@ import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.model.AppLaunchTracker; import com.android.launcher3.tapl.LauncherInstrumentation; import com.android.launcher3.tapl.TestHelpers; +import com.android.launcher3.testcomponent.TestCommandReceiver; import com.android.launcher3.util.PackageManagerHelper; import com.android.launcher3.util.Wait; import com.android.launcher3.util.rule.FailureWatcher; @@ -98,7 +99,11 @@ public abstract class AbstractLauncherUiTest { } catch (RemoteException e) { throw new RuntimeException(e); } - if (TestHelpers.isInLauncherProcess()) Utilities.enableRunningInTestHarnessForTests(); + if (TestHelpers.isInLauncherProcess()) { + Utilities.enableRunningInTestHarnessForTests(); + mLauncher.setSystemHealthSupplier(() -> TestCommandReceiver.callCommand( + TestCommandReceiver.GET_SYSTEM_HEALTH_MESSAGE).getString("result")); + } } protected final LauncherActivityRule mActivityMonitor = new LauncherActivityRule(); diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java index 5a6c898104..0fed337a04 100644 --- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java +++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java @@ -39,7 +39,6 @@ import android.graphics.Rect; import android.net.Uri; import android.os.Build; import android.os.Bundle; -import android.os.DropBoxManager; import android.os.Parcelable; import android.os.SystemClock; import android.text.TextUtils; @@ -73,6 +72,7 @@ import java.util.Deque; import java.util.LinkedList; import java.util.List; import java.util.concurrent.TimeoutException; +import java.util.function.Supplier; /** * The main tapl object. The only object that can be explicitly constructed by the using code. It @@ -133,6 +133,7 @@ public final class LauncherInstrumentation { private int mExpectedRotation = Surface.ROTATION_0; private final Uri mTestProviderUri; private final Deque mDiagnosticContext = new LinkedList<>(); + private Supplier mSystemHealthSupplier; /** * Constructs the root of TAPL hierarchy. You get all other objects from it. @@ -285,79 +286,24 @@ public final class LauncherInstrumentation { return "Background"; } - private static String truncateCrash(String text, int maxLines) { - String[] lines = text.split("\\r?\\n"); - StringBuilder ret = new StringBuilder(); - for (int i = 0; i < maxLines && i < lines.length; i++) { - ret.append(lines[i]); - ret.append('\n'); - } - if (lines.length > maxLines) { - ret.append("... "); - ret.append(lines.length - maxLines); - ret.append(" more lines truncated ...\n"); - } - return ret.toString(); - } - - private String checkCrash(String label) { - DropBoxManager dropbox = (DropBoxManager) getContext().getSystemService( - Context.DROPBOX_SERVICE); - Assert.assertNotNull("Unable access the DropBoxManager service", dropbox); - - long timestamp = 0; - DropBoxManager.Entry entry; - int crashCount = 0; - StringBuilder errorDetails = new StringBuilder(); - while (null != (entry = dropbox.getNextEntry(label, timestamp))) { - String dropboxSnippet; - try { - dropboxSnippet = entry.getText(4096); - } finally { - entry.close(); - } - - crashCount++; - errorDetails.append(label); - errorDetails.append(": "); - errorDetails.append(truncateCrash(dropboxSnippet, 40)); - errorDetails.append(" ...\n"); - - timestamp = entry.getTimeMillis(); - } - Assert.assertEquals(errorDetails.toString(), 0, crashCount); - return crashCount > 0 ? errorDetails.toString() : null; + public void setSystemHealthSupplier(Supplier supplier) { + this.mSystemHealthSupplier = supplier; } private String getSystemHealthMessage() { + final String testPackage = getContext().getPackageName(); try { - StringBuilder errors = new StringBuilder(); - - final String testPackage = getContext().getPackageName(); - try { - mDevice.executeShellCommand("pm grant " + testPackage + - " android.permission.READ_LOGS"); - mDevice.executeShellCommand("pm grant " + testPackage + - " android.permission.PACKAGE_USAGE_STATS"); - } catch (IOException e) { - e.printStackTrace(); - } - - final String[] labels = { - "system_server_crash", - "system_server_native_crash", - "system_server_anr", - }; - - for (String label : labels) { - final String crash = checkCrash(label); - if (crash != null) errors.append(crash); - } - - return errors.length() != 0 ? errors.toString() : null; - } catch (Exception e) { - return null; + mDevice.executeShellCommand("pm grant " + testPackage + + " android.permission.READ_LOGS"); + mDevice.executeShellCommand("pm grant " + testPackage + + " android.permission.PACKAGE_USAGE_STATS"); + } catch (IOException e) { + e.printStackTrace(); } + + return mSystemHealthSupplier != null + ? mSystemHealthSupplier.get() + : TestHelpers.getSystemHealthMessage(getContext()); } private void fail(String message) { diff --git a/tests/tapl/com/android/launcher3/tapl/TestHelpers.java b/tests/tapl/com/android/launcher3/tapl/TestHelpers.java index 93554d2452..e19f91a20a 100644 --- a/tests/tapl/com/android/launcher3/tapl/TestHelpers.java +++ b/tests/tapl/com/android/launcher3/tapl/TestHelpers.java @@ -26,6 +26,9 @@ import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.ResolveInfo; import android.content.res.Resources; +import android.os.DropBoxManager; + +import org.junit.Assert; import java.util.List; @@ -81,4 +84,69 @@ public class TestHelpers { } return "com.android.systemui"; } + + private static String truncateCrash(String text, int maxLines) { + String[] lines = text.split("\\r?\\n"); + StringBuilder ret = new StringBuilder(); + for (int i = 0; i < maxLines && i < lines.length; i++) { + ret.append(lines[i]); + ret.append('\n'); + } + if (lines.length > maxLines) { + ret.append("... "); + ret.append(lines.length - maxLines); + ret.append(" more lines truncated ...\n"); + } + return ret.toString(); + } + + private static String checkCrash(Context context, String label) { + DropBoxManager dropbox = (DropBoxManager) context.getSystemService(Context.DROPBOX_SERVICE); + Assert.assertNotNull("Unable access the DropBoxManager service", dropbox); + + long timestamp = 0; + DropBoxManager.Entry entry; + int crashCount = 0; + StringBuilder errorDetails = new StringBuilder(); + while (null != (entry = dropbox.getNextEntry(label, timestamp))) { + String dropboxSnippet; + try { + dropboxSnippet = entry.getText(4096); + } finally { + entry.close(); + } + + crashCount++; + errorDetails.append(label); + errorDetails.append(": "); + errorDetails.append(truncateCrash(dropboxSnippet, 40)); + errorDetails.append(" ...\n"); + + timestamp = entry.getTimeMillis(); + } + Assert.assertEquals(errorDetails.toString(), 0, crashCount); + return crashCount > 0 ? errorDetails.toString() : null; + } + + public static String getSystemHealthMessage(Context context) { + try { + StringBuilder errors = new StringBuilder(); + + final String[] labels = { + "system_server_crash", + "system_server_native_crash", + "system_server_anr", + }; + + for (String label : labels) { + final String crash = checkCrash(context, label); + if (crash != null) errors.append(crash); + } + + return errors.length() != 0 ? errors.toString() : null; + } catch (Exception e) { + return "Failed to get system health diags, maybe build your test via .bp instead of " + + ".mk? " + android.util.Log.getStackTraceString(e); + } + } }