diff options
Diffstat (limited to 'test-runner/src/android/test/TestRecorder.java')
-rw-r--r-- | test-runner/src/android/test/TestRecorder.java | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/test-runner/src/android/test/TestRecorder.java b/test-runner/src/android/test/TestRecorder.java new file mode 100644 index 0000000..7c368a0 --- /dev/null +++ b/test-runner/src/android/test/TestRecorder.java @@ -0,0 +1,186 @@ +/* + * 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()); + } +} |