Adding system health diags for inporoc tests

Bug: 133891845
Change-Id: I90161bfc9db5983a45dfb89728a82ec1e3d81f19
This commit is contained in:
vadimt 2019-06-27 19:16:38 -07:00
parent eb078ba5dd
commit 092b6f8cbf
4 changed files with 102 additions and 74 deletions

View File

@ -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);

View File

@ -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();

View File

@ -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<String> mDiagnosticContext = new LinkedList<>();
private Supplier<String> mSystemHealthSupplier;
/**
* Constructs the root of TAPL hierarchy. You get all other objects from it.
@ -285,54 +286,11 @@ 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<String> supplier) {
this.mSystemHealthSupplier = supplier;
}
private String getSystemHealthMessage() {
try {
StringBuilder errors = new StringBuilder();
final String testPackage = getContext().getPackageName();
try {
mDevice.executeShellCommand("pm grant " + testPackage +
@ -343,21 +301,9 @@ public final class LauncherInstrumentation {
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;
}
return mSystemHealthSupplier != null
? mSystemHealthSupplier.get()
: TestHelpers.getSystemHealthMessage(getContext());
}
private void fail(String message) {

View File

@ -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);
}
}
}