/* * 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 android.app.ListActivity; import android.content.Intent; import android.database.MatrixCursor; import android.net.Uri; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.CursorAdapter; import android.widget.ListView; import android.widget.SimpleCursorAdapter; import java.util.Arrays; import java.util.Comparator; /** * Activity base class to use to implement your application's tests. * * <p>Implement the getTestSuite() method to return the name of your * test suite class. * * <p>See the android.test package documentation (click the more... link) * for a full description * * {@hide} Not needed for SDK */ public abstract class TestListActivity extends ListActivity { /** Supplied in the intent extras if we are running performance tests. */ public static final String PERFORMANCE_TESTS = "android.test.performance"; /** "Mode" group in the menu. */ static final int MODE_GROUP = Menu.FIRST; /** Our suite */ String mSuite; /** Our children tests */ String[] mTests; /** which mode, REGRESSION, PERFORMANCE or PROFILING */ private int mMode = TestRunner.REGRESSION; /** "Regression" menu item */ private MenuItem mRegressionItem; /** "Performance" menu item */ private MenuItem mPerformanceItem; /** "Profiling" menu item */ private MenuItem mProfilingItem; private final Comparator<String> sComparator = new Comparator<String>() { public final int compare(String a, String b) { String s1 = makeCompareName(a); String s2 = makeCompareName(b); return s1.compareToIgnoreCase(s2); } }; /** * Constructor that doesn't do much. */ public TestListActivity() { super(); } /** * Subclasses should implement this to return the names of the classes * of their tests. * * @return test suite class name */ public abstract String getTestSuite(); /** * Typical onCreate(Bundle icicle) implementation. */ public void onCreate(Bundle icicle) { super.onCreate(icicle); Intent intent = getIntent(); mMode = intent.getIntExtra(TestListActivity.PERFORMANCE_TESTS, mMode); if (intent.getAction().equals(Intent.ACTION_MAIN)) { // if we were called as MAIN, get the test suites, mSuite = getTestSuite(); } else if (intent.getAction().equals(Intent.ACTION_RUN)) { // We should have been provided a status channel. Bail out and // run the test instead. This is how the TestHarness gets us // loaded in our process for "Run All Tests." Intent ntent = new Intent(Intent.ACTION_RUN, intent.getData() != null ? intent.getData() : Uri.parse(getTestSuite())); ntent.setClassName("com.android.testharness", "com.android.testharness.RunTest"); ntent.putExtras(intent); ntent.putExtra("package", getPackageName()); startActivity(ntent); finish(); return; } else if (intent.getAction().equals(Intent.ACTION_VIEW)) { // otherwise use the one in the intent mSuite = intent.getData() != null ? intent.getData().toString() : null; } String[] children = TestRunner.getChildren(this, mSuite); Arrays.sort(children, sComparator); int len = children.length; mTests = new String[len]; System.arraycopy(children, 0, mTests, 0, len); setTitle(TestRunner.getTitle(mSuite)); MatrixCursor cursor = new MatrixCursor(new String[] { "name", "_id" }); addTestRows(cursor); CursorAdapter adapter = new SimpleCursorAdapter( this, com.android.internal.R.layout.simple_list_item_1, cursor, new String[] {"name"}, new int[] {com.android.internal.R.id.text1}); setListAdapter(adapter); } private void addTestRows(MatrixCursor cursor) { int id = 0; cursor.newRow().add("Run All").add(id++); for (String test : mTests) { String title = TestRunner.getTitle(test); String prefix = TestRunner.isTestSuite(this, test) ? "Browse " : "Run "; // I'd rather do this with an icon column, but I don't know how cursor.newRow().add(prefix + title).add(id++); } } @Override protected void onResume() { super.onResume(); } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); mRegressionItem = menu.add(MODE_GROUP, -1, 0, "Regression Mode"); mPerformanceItem = menu.add(MODE_GROUP, -1, 0, "Performance Mode"); mProfilingItem = menu.add(MODE_GROUP, -1, 0, "Profiling Mode"); menu.setGroupCheckable(MODE_GROUP, true, true); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item == mRegressionItem) { mMode = TestRunner.REGRESSION; } else if (item == mPerformanceItem) { mMode = TestRunner.PERFORMANCE; } else if (item == mProfilingItem) { mMode = TestRunner.PROFILING; } return true; } @Override public boolean onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); switch (mMode) { case TestRunner.REGRESSION: mRegressionItem.setChecked(true); break; case TestRunner.PERFORMANCE: mPerformanceItem.setChecked(true); break; case TestRunner.PROFILING: mProfilingItem.setChecked(true); break; } return true; } @Override protected void onListItemClick(ListView l, View v, int position, long id) { Intent intent = new Intent(); if (position == 0) { if (false) { intent.setClassName("com.android.testharness", "com.android.testharness.RunAll"); intent.putExtra("tests", new String[]{mSuite}); } else { intent.setClassName("com.android.testharness", "com.android.testharness.RunTest"); intent.setAction(Intent.ACTION_RUN); intent.setData(Uri.parse(mSuite)); } } else { String test = mTests[position - 1]; if (TestRunner.isTestSuite(this, test)) { intent.setClassName(getPackageName(), this.getClass().getName()); intent.setAction(Intent.ACTION_VIEW); } else { intent.setClassName("com.android.testharness", "com.android.testharness.RunTest"); } intent.setData(Uri.parse(test)); } intent.putExtra(PERFORMANCE_TESTS, mMode); intent.putExtra("package", getPackageName()); startActivity(intent); } private String makeCompareName(String s) { int index = s.lastIndexOf('.'); if (index == -1) { return s; } return s.substring(index + 1); } }