/* * 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.app.activity; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.test.AndroidTestCase; import android.test.PerformanceTestCase; public class ActivityTestsBase extends AndroidTestCase implements PerformanceTestCase, LaunchpadActivity.CallingTest { public static final String PERMISSION_GRANTED = "com.android.frameworks.coretests.permission.TEST_GRANTED"; public static final String PERMISSION_DENIED = "com.android.frameworks.coretests.permission.TEST_DENIED"; protected Intent mIntent; private PerformanceTestCase.Intermediates mIntermediates; private String mExpecting; // Synchronization of activity result. private boolean mFinished; private int mResultCode = 0; private Intent mData; private RuntimeException mResultStack = null; @Override protected void setUp() throws Exception { super.setUp(); mIntent = new Intent(mContext, LaunchpadActivity.class); mIntermediates = null; } @Override protected void tearDown() throws Exception { mIntermediates = null; super.tearDown(); } public boolean isPerformanceOnly() { return false; } public void setInternalIterations(int count) { } public void startTiming(boolean realTime) { if (mIntermediates != null) { mIntermediates.startTiming(realTime); } } public void addIntermediate(String name) { if (mIntermediates != null) { mIntermediates.addIntermediate(name); } } public void addIntermediate(String name, long timeInNS) { if (mIntermediates != null) { mIntermediates.addIntermediate(name, timeInNS); } } public void finishTiming(boolean realTime) { if (mIntermediates != null) { mIntermediates.finishTiming(realTime); } } public void activityFinished(int resultCode, Intent data, RuntimeException where) { finishWithResult(resultCode, data, where); } public Intent editIntent() { return mIntent; } public Context getContext() { return mContext; } public int startPerformance(Intermediates intermediates) { mIntermediates = intermediates; return 1; } public void finishGood() { finishWithResult(Activity.RESULT_OK, null); } public void finishBad(String error) { finishWithResult(Activity.RESULT_CANCELED, (new Intent()).setAction(error)); } public void finishWithResult(int resultCode, Intent data) { RuntimeException where = new RuntimeException("Original error was here"); where.fillInStackTrace(); finishWithResult(resultCode, data, where); } public void finishWithResult(int resultCode, Intent data, RuntimeException where) { synchronized (this) { //System.out.println("*** Activity finished!!"); mResultCode = resultCode; mData = data; mResultStack = where; mFinished = true; notifyAll(); } } public int runLaunchpad(String action) { LaunchpadActivity.setCallingTest(this); synchronized (this) { mIntent.setAction(action); mFinished = false; //System.out.println("*** Starting: " + mIntent); mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); mContext.startActivity(mIntent); } return waitForResultOrThrow(60 * 1000); } public int waitForResultOrThrow(int timeoutMs) { return waitForResultOrThrow(timeoutMs, null); } public int waitForResultOrThrow(int timeoutMs, String expected) { int res = waitForResult(timeoutMs, expected); if (res == Activity.RESULT_CANCELED) { if (mResultStack != null) { throw new RuntimeException( mData != null ? mData.toString() : "Unable to launch", mResultStack); } else { throw new RuntimeException( mData != null ? mData.toString() : "Unable to launch"); } } return res; } public int waitForResult(int timeoutMs, String expected) { mExpecting = expected; long endTime = System.currentTimeMillis() + timeoutMs; boolean timeout = false; synchronized (this) { while (!mFinished) { long delay = endTime - System.currentTimeMillis(); if (delay < 0) { timeout = true; break; } try { wait(delay); } catch (java.lang.InterruptedException e) { // do nothing } } } mFinished = false; if (timeout) { mResultCode = Activity.RESULT_CANCELED; onTimeout(); } return mResultCode; } public int getResultCode() { return mResultCode; } public Intent getResultData() { return mData; } public RuntimeException getResultStack() { return mResultStack; } public void onTimeout() { String msg = mExpecting == null ? "Timeout" : ("Timeout while expecting " + mExpecting); finishWithResult(Activity.RESULT_CANCELED, (new Intent()).setAction(msg)); } }