/* * Copyright (C) 2007 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 com.android.internal.R; import android.app.ListActivity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import junit.framework.Test; import junit.framework.TestSuite; import java.util.List; /** * @hide - This is part of a framework that is under development and should not be used for * active development. */ public abstract class TestBrowserActivity extends ListActivity implements android.test.TestBrowserView, AdapterView.OnItemClickListener, TestSuiteProvider { private TestBrowserController mTestBrowserController; public static final String BUNDLE_EXTRA_PACKAGE = "package"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getListView().setOnItemClickListener(this); mTestBrowserController = ServiceLocator.getTestBrowserController(); mTestBrowserController.setTargetPackageName(getPackageName()); mTestBrowserController.registerView(this); mTestBrowserController.setTargetBrowserActivityClassName(this.getClass().getName()); // Apk paths used to search for test classes when using TestSuiteBuilders. String[] apkPaths = {getPackageCodePath()}; ClassPathPackageInfoSource.setApkPaths(apkPaths); } @Override protected void onStart() { super.onStart(); TestSuite testSuite = getTestSuiteToBrowse(); mTestBrowserController.setTestSuite(testSuite); String name = testSuite.getName(); if (name != null) { setTitle(name.substring(name.lastIndexOf(".") + 1)); } } /** * Subclasses will override this method and return the TestSuite specific to their .apk. * When this method is invoked due to an intent fired from * {@link #onItemClick(android.widget.AdapterView, android.view.View, int, long)} then get the * targeted TestSuite from the intent. * * @return testSuite to browse */ @SuppressWarnings("unchecked") private TestSuite getTestSuiteToBrowse() { Intent intent = getIntent(); if (Intent.ACTION_RUN.equals(intent.getAction())) { String testClassName = intent.getData().toString(); try { Class<Test> testClass = (Class<Test>) getClassLoader().loadClass(testClassName); return TestCaseUtil.createTestSuite(testClass); } catch (ClassNotFoundException e) { Log.e("TestBrowserActivity", "ClassNotFoundException for " + testClassName, e); throw new RuntimeException(e); } catch (IllegalAccessException e) { Log.e("TestBrowserActivity", "IllegalAccessException for " + testClassName, e); throw new RuntimeException(e); } catch (InstantiationException e) { Log.e("TestBrowserActivity", "InstantiationException for " + testClassName, e); throw new RuntimeException(e); } } else { // get test classes to browwes from subclass return getTopTestSuite(); } } public TestSuite getTestSuite() { return getTopTestSuite(); } /** * @return A TestSuite that should be run for a given application. */ public abstract TestSuite getTopTestSuite(); public void onItemClick(AdapterView parent, View v, int position, long id) { Intent intent = mTestBrowserController.getIntentForTestAt(position); intent.putExtra(BUNDLE_EXTRA_PACKAGE, getPackageName()); startActivity(intent); } public void setTestNames(List<String> testNames) { ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, R.layout.test_list_item, testNames); setListAdapter(arrayAdapter); } }