blob: 85b91f1b632d4503e95e83c523f107338e2f0ae6 [file] [log] [blame]
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.smoketest;
import com.android.internal.os.RuntimeInit;
import android.app.ActivityManager;
import android.content.Context;
import android.server.data.CrashData;
import android.test.AndroidTestCase;
import android.util.Log;
import java.util.Iterator;
import java.util.List;
/**
* This smoke test is designed to quickly sniff for any error conditions
* encountered after initial startup.
*/
public class ProcessErrorsTest extends AndroidTestCase {
private final String TAG = "ProcessErrorsTest";
protected ActivityManager mActivityManager;
@Override
public void setUp() throws Exception {
super.setUp();
mActivityManager = (ActivityManager)
getContext().getSystemService(Context.ACTIVITY_SERVICE);
}
public void testSetUpConditions() throws Exception {
assertNotNull(mActivityManager);
}
public void testNoProcessErrors() throws Exception {
List<ActivityManager.ProcessErrorStateInfo> errList;
errList = mActivityManager.getProcessesInErrorState();
// note: this contains information about each process that is currently in an error
// condition. if the list is empty (null) then "we're good".
// if the list is non-empty, then it's useful to report the contents of the list
// we'll put a copy in the log, and we'll report it back to the framework via the assert.
final String reportMsg = reportListContents(errList);
if (reportMsg != null) {
Log.w(TAG, reportMsg);
}
// report a non-empty list back to the test framework
assertNull(reportMsg, errList);
}
/**
* This helper function will dump the actual error reports.
*
* @param errList The error report containing one or more error records.
* @return Returns a string containing all of the errors.
*/
private String reportListContents(List<ActivityManager.ProcessErrorStateInfo> errList) {
if (errList == null) return null;
StringBuilder builder = new StringBuilder();
Iterator<ActivityManager.ProcessErrorStateInfo> iter = errList.iterator();
while (iter.hasNext()) {
ActivityManager.ProcessErrorStateInfo entry = iter.next();
String condition;
switch (entry.condition) {
case ActivityManager.ProcessErrorStateInfo.CRASHED:
condition = "CRASHED";
break;
case ActivityManager.ProcessErrorStateInfo.NOT_RESPONDING:
condition = "ANR";
break;
default:
condition = "<unknown>";
break;
}
String stackTrace = null;
try {
if (entry.crashData != null) {
CrashData cd = RuntimeInit.unmarshallException(entry.crashData);
stackTrace = cd.toString();
}
} catch (RuntimeException e) { }
if (stackTrace == null) {
stackTrace = "<no stack trace>";
}
final String entryReport = "Process error " + condition + " " + entry.shortMsg +
" detected in " + entry.processName + " " + entry.tag +
". \n" + stackTrace;
builder.append(entryReport).append(" ");
}
return builder.toString();
}
}