| /* |
| * 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()); |
| } |
| } |