summaryrefslogtreecommitdiffstats
path: root/tools/runner/lib/TestActivity.java
diff options
context:
space:
mode:
Diffstat (limited to 'tools/runner/lib/TestActivity.java')
-rw-r--r--tools/runner/lib/TestActivity.java105
1 files changed, 105 insertions, 0 deletions
diff --git a/tools/runner/lib/TestActivity.java b/tools/runner/lib/TestActivity.java
new file mode 100644
index 0000000..15206f8
--- /dev/null
+++ b/tools/runner/lib/TestActivity.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2010 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 dalvik.runner;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.util.Log;
+import android.widget.TextView;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+
+/**
+ * Runs a user-supplied {@code main(String[] args)} method
+ * in the context of an Android activity. The result of the method
+ * (success or exception) is reported to a file where Dalvik
+ * Runner can pick it up.
+ */
+public class TestActivity extends Activity {
+
+ private final static String TAG = "TestActivity";
+
+ private TextView view;
+
+ @Override public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ this.view = new TextView(this);
+ log("TestActivity starting...");
+ setContentView(view);
+ ActivityRunner activityRunner = new ActivityRunner();
+ activityRunner.run();
+ }
+
+ private void log(String message, Throwable ex) {
+ log(message + "\n" + Log.getStackTraceString(ex));
+ }
+ private void log(String message) {
+ Log.i(TAG, message);
+ view.append(message + "\n");
+ }
+
+ class ActivityRunner extends TestRunner {
+
+ private final File runnerDir;
+ private final Thread shutdownHook = new Thread(new ShutdownHook());
+
+ ActivityRunner() {
+ runnerDir = new File(properties.getProperty(TestProperties.DEVICE_RUNNER_DIR));
+ }
+
+ @Override public boolean run() {
+ log("Using " + runnerClass + " to run " + qualifiedName);
+ Runtime.getRuntime().addShutdownHook(shutdownHook);
+ boolean success = super.run();
+ Runtime.getRuntime().removeShutdownHook(shutdownHook);
+ writeResultFile(success);
+ return success;
+ }
+
+ private void writeResultFile (boolean success) {
+ String result = TestProperties.result(success);
+ File resultDir = new File(runnerDir, qualifiedName);
+ File resultTemp = new File(resultDir, TestProperties.RESULT_FILE + ".temp");
+ File resultFile = new File(resultDir, TestProperties.RESULT_FILE);
+ log("TestActivity " + result + " " + resultFile);
+ try {
+ FileOutputStream resultOut = new FileOutputStream(resultTemp);
+ resultOut.write(result.getBytes("UTF-8"));
+ resultOut.close();
+ // atomically rename since DalvikRunner will be polling for this
+ resultTemp.renameTo(resultFile);
+ } catch (IOException e) {
+ log("TestActivity could not create result file", e);
+ }
+ }
+
+ /**
+ * Used to trap tests that try to exit on the their own. We
+ * treat this as a failure since they usually are calling
+ * System.exit with a non-zero value.
+ */
+ class ShutdownHook implements Runnable {
+ public void run() {
+ writeResultFile(false);
+ }
+ }
+ }
+}