summaryrefslogtreecommitdiffstats
path: root/test-runner/src/android/test/TestRecorder.java
diff options
context:
space:
mode:
Diffstat (limited to 'test-runner/src/android/test/TestRecorder.java')
-rw-r--r--test-runner/src/android/test/TestRecorder.java186
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());
+ }
+}