187 lines
6.4 KiB
Java
187 lines
6.4 KiB
Java
/*
|
|
* Copyright (C) 2006 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 android.test;
|
|
|
|
import android.content.ContentValues;
|
|
import android.database.sqlite.SQLiteDatabase;
|
|
import android.os.Environment;
|
|
import android.os.FileUtils;
|
|
import android.test.TestRunner.IntermediateTime;
|
|
import android.util.Log;
|
|
import junit.framework.Test;
|
|
import junit.framework.TestListener;
|
|
|
|
import java.io.File;
|
|
import java.io.PrintWriter;
|
|
import java.io.StringWriter;
|
|
import java.util.HashSet;
|
|
import java.util.List;
|
|
import java.util.Set;
|
|
|
|
/**
|
|
* {@hide} Not needed for 1.0 SDK.
|
|
*/
|
|
public class TestRecorder implements TestRunner.Listener, TestListener {
|
|
private static final int DATABASE_VERSION = 1;
|
|
private static SQLiteDatabase sDb;
|
|
private Set<String> mFailedTests = new HashSet<String>();
|
|
|
|
private static SQLiteDatabase getDatabase() {
|
|
if (sDb == null) {
|
|
File dir = new File(Environment.getDataDirectory(), "test_results");
|
|
|
|
/* TODO: add a DB version number and bootstrap/upgrade methods
|
|
* if the format of the table changes.
|
|
*/
|
|
String dbName = "TestHarness.db";
|
|
File file = new File(dir, dbName);
|
|
sDb = SQLiteDatabase.openOrCreateDatabase(file.getPath(), null);
|
|
|
|
if (sDb.getVersion() == 0) {
|
|
int code = FileUtils.setPermissions(file.getPath(),
|
|
FileUtils.S_IRUSR | FileUtils.S_IWUSR |
|
|
FileUtils.S_IRGRP | FileUtils.S_IWGRP |
|
|
FileUtils.S_IROTH | FileUtils.S_IWOTH, -1, -1);
|
|
|
|
if (code != 0) {
|
|
Log.w("TestRecorder",
|
|
"Set permissions for " + file.getPath() + " returned = " + code);
|
|
}
|
|
|
|
try {
|
|
sDb.execSQL("CREATE TABLE IF NOT EXISTS tests (_id INT PRIMARY KEY," +
|
|
"name TEXT," +
|
|
"result TEXT," +
|
|
"exception TEXT," +
|
|
"started INTEGER," +
|
|
"finished INTEGER," +
|
|
"time INTEGER," +
|
|
"iterations INTEGER," +
|
|
"allocations INTEGER," +
|
|
"parent INTEGER);");
|
|
sDb.setVersion(DATABASE_VERSION);
|
|
} catch (Exception e) {
|
|
Log.e("TestRecorder", "failed to create table 'tests'", e);
|
|
sDb = null;
|
|
}
|
|
}
|
|
}
|
|
|
|
return sDb;
|
|
}
|
|
|
|
public TestRecorder() {
|
|
}
|
|
|
|
public void started(String className) {
|
|
ContentValues map = new ContentValues(2);
|
|
map.put("name", className);
|
|
map.put("started", System.currentTimeMillis());
|
|
|
|
// try to update the row first in case we've ran this test before.
|
|
int rowsAffected = getDatabase().update("tests", map, "name = '" + className + "'", null);
|
|
|
|
if (rowsAffected == 0) {
|
|
getDatabase().insert("tests", null, map);
|
|
}
|
|
}
|
|
|
|
public void finished(String className) {
|
|
ContentValues map = new ContentValues(1);
|
|
map.put("finished", System.currentTimeMillis());
|
|
|
|
getDatabase().update("tests", map, "name = '" + className + "'", null);
|
|
}
|
|
|
|
public void performance(String className, long itemTimeNS, int iterations, List<IntermediateTime> intermediates) {
|
|
ContentValues map = new ContentValues();
|
|
map.put("time", itemTimeNS);
|
|
map.put("iterations", iterations);
|
|
|
|
getDatabase().update("tests", map, "name = '" + className + "'", null);
|
|
|
|
if (intermediates != null && intermediates.size() > 0) {
|
|
int n = intermediates.size();
|
|
for (int i = 0; i < n; i++) {
|
|
TestRunner.IntermediateTime time = intermediates.get(i);
|
|
|
|
getDatabase().execSQL("INSERT INTO tests (name, time, parent) VALUES ('" +
|
|
time.name + "', " + time.timeInNS + ", " +
|
|
"(SELECT _id FROM tests WHERE name = '" + className + "'));");
|
|
}
|
|
}
|
|
}
|
|
|
|
public void passed(String className) {
|
|
ContentValues map = new ContentValues();
|
|
map.put("result", "passed");
|
|
|
|
getDatabase().update("tests", map, "name = '" + className + "'", null);
|
|
}
|
|
|
|
public void failed(String className, Throwable exception) {
|
|
StringWriter stringWriter = new StringWriter();
|
|
PrintWriter printWriter = new PrintWriter(stringWriter);
|
|
try {
|
|
exception.printStackTrace(printWriter);
|
|
} finally {
|
|
printWriter.close();
|
|
}
|
|
ContentValues map = new ContentValues();
|
|
map.put("result", "failed");
|
|
map.put("exception", stringWriter.toString());
|
|
|
|
getDatabase().update("tests", map, "name = '" + className + "'", null);
|
|
}
|
|
|
|
/**
|
|
* Reports a test case failure.
|
|
*
|
|
* @param className Name of the class/test.
|
|
* @param reason Reason for failure.
|
|
*/
|
|
public void failed(String className, String reason) {
|
|
ContentValues map = new ContentValues();
|
|
map.put("result", "failed");
|
|
// The reason is put as the exception.
|
|
map.put("exception", reason);
|
|
getDatabase().update("tests", map, "name = '" + className + "'", null);
|
|
}
|
|
|
|
public void addError(Test test, Throwable t) {
|
|
mFailedTests.add(test.toString());
|
|
failed(test.toString(), t);
|
|
}
|
|
|
|
public void addFailure(Test test, junit.framework.AssertionFailedError t) {
|
|
mFailedTests.add(test.toString());
|
|
failed(test.toString(), t.getMessage());
|
|
}
|
|
|
|
public void endTest(Test test) {
|
|
finished(test.toString());
|
|
if (!mFailedTests.contains(test.toString())) {
|
|
passed(test.toString());
|
|
}
|
|
mFailedTests.remove(test.toString());
|
|
}
|
|
|
|
public void startTest(Test test) {
|
|
started(test.toString());
|
|
}
|
|
}
|