am 48cae1a0: am 03bf8716: Merge "CtsVerifier Test List Infrastructure" into froyo
Merge commit '48cae1a07e6e0f6bb437fba8f2cf3fce050f3421' into gingerbread
* commit '48cae1a07e6e0f6bb437fba8f2cf3fce050f3421':
CtsVerifier Test List Infrastructure
diff --git a/apps/CtsVerifier/AndroidManifest.xml b/apps/CtsVerifier/AndroidManifest.xml
index 54611c3..ebd0114 100644
--- a/apps/CtsVerifier/AndroidManifest.xml
+++ b/apps/CtsVerifier/AndroidManifest.xml
@@ -21,13 +21,23 @@
android:versionName="1.0">
<application android:label="@string/app_name">
- <activity android:name=".CtsVerifierActivity"
- android:label="@string/app_name">
+
+ <activity android:name=".CtsVerifierActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
+
+ <activity android:name=".TestListActivity" android:label="@string/test_list_title" />
+
+ <activity android:name=".suid.SuidBinariesActivity" android:label="@string/suid_binaries">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.cts.intent.category.MANUAL_TEST" />
+ </intent-filter>
+ </activity>
+
</application>
</manifest>
\ No newline at end of file
diff --git a/apps/CtsVerifier/res/layout/main.xml b/apps/CtsVerifier/res/layout/main.xml
index c1fa365..52da8b8 100644
--- a/apps/CtsVerifier/res/layout/main.xml
+++ b/apps/CtsVerifier/res/layout/main.xml
@@ -21,7 +21,14 @@
<TextView
android:id="@+id/welcome"
android:layout_width="fill_parent"
- android:layout_height="wrap_content"
+ android:layout_height="wrap_content"
android:text="@string/welcome_text"
/>
+ <Button
+ android:id="@+id/continue_button"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:onClick="continueButtonClickHandler"
+ android:text="@string/continue_button_text"
+ />
</LinearLayout>
diff --git a/apps/CtsVerifier/res/values/strings.xml b/apps/CtsVerifier/res/values/strings.xml
index 5137dd1..9c1399d 100644
--- a/apps/CtsVerifier/res/values/strings.xml
+++ b/apps/CtsVerifier/res/values/strings.xml
@@ -16,4 +16,7 @@
<resources>
<string name="app_name">CTS Verifier</string>
<string name="welcome_text">Welcome to the CTS Verifier!</string>
+ <string name="continue_button_text">Continue</string>
+ <string name="test_list_title">Manual Test List</string>
+ <string name="suid_binaries">SUID Binaries</string>
</resources>
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/CtsVerifierActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/CtsVerifierActivity.java
index f1b06d1..9c0566e 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/CtsVerifierActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/CtsVerifierActivity.java
@@ -17,8 +17,11 @@
package com.android.cts.verifier;
import android.app.Activity;
+import android.content.Intent;
import android.os.Bundle;
+import android.view.View;
+/** {@link Activity} that displays an introduction to the verifier. */
public class CtsVerifierActivity extends Activity {
/** Called when the activity is first created. */
@@ -27,4 +30,8 @@
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
+
+ public void continueButtonClickHandler(View target) {
+ startActivity(new Intent(this, TestListActivity.class));
+ }
}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/TestListActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/TestListActivity.java
new file mode 100644
index 0000000..7bd3488
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/TestListActivity.java
@@ -0,0 +1,120 @@
+/*
+ * 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 com.android.cts.verifier;
+
+import android.app.ListActivity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.ListAdapter;
+import android.widget.ListView;
+import android.widget.SimpleAdapter;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/** {@link ListActivity} that displays a list of manual tests. */
+public class TestListActivity extends ListActivity {
+
+ /** Activities implementing {@link Intent#ACTION_MAIN} and this will appear in the list. */
+ static final String CATEGORY_MANUAL_TEST = "android.cts.intent.category.MANUAL_TEST";
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setListAdapter(new TestListAdapter(this));
+ }
+
+
+ /** Launch the activity when its {@link ListView} item is clicked. */
+ @Override
+ protected void onListItemClick(ListView listView, View view, int position, long id) {
+ super.onListItemClick(listView, view, position, id);
+ ListAdapter adapter = getListAdapter();
+ Intent intent = getIntent(position);
+ startActivity(intent);
+ }
+
+ @SuppressWarnings("unchecked")
+ private Intent getIntent(int position) {
+ ListAdapter adapter = getListAdapter();
+ Map<String, ?> data = (Map<String, ?>) adapter.getItem(position);
+ return (Intent) data.get(TestListAdapter.INTENT);
+ }
+
+ /**
+ * Each {@link ListView} item will have a map associated it with containing the title to
+ * display and the intent used to launch it.
+ */
+ static class TestListAdapter extends SimpleAdapter {
+
+ static final String TITLE = "title";
+
+ static final String INTENT = "intent";
+
+ TestListAdapter(Context context) {
+ super(context, getData(context), android.R.layout.simple_list_item_1,
+ new String[] {TITLE}, new int[] {android.R.id.text1});
+ }
+
+ static List<Map<String, ?>> getData(Context context) {
+ List<Map<String, ?>> data = new ArrayList<Map<String,?>>();
+
+ Intent mainIntent = new Intent(Intent.ACTION_MAIN);
+ mainIntent.addCategory(CATEGORY_MANUAL_TEST);
+
+ PackageManager packageManager = context.getPackageManager();
+ List<ResolveInfo> list = packageManager.queryIntentActivities(mainIntent, 0);
+ for (int i = 0; i < list.size(); i++) {
+ ResolveInfo info = list.get(i);
+ String title = getTitle(context, info.activityInfo);
+ Intent intent = getActivityIntent(info.activityInfo);
+ addItem(data, title, intent);
+ }
+
+ return data;
+ }
+
+ static String getTitle(Context context, ActivityInfo activityInfo) {
+ if (activityInfo.labelRes != 0) {
+ return context.getString(activityInfo.labelRes);
+ } else {
+ return activityInfo.name;
+ }
+ }
+
+ static Intent getActivityIntent(ActivityInfo activityInfo) {
+ Intent intent = new Intent();
+ intent.setClassName(activityInfo.packageName, activityInfo.name);
+ return intent;
+ }
+
+ @SuppressWarnings("unchecked")
+ static void addItem(List<Map<String, ?>> data, String title, Intent intent) {
+ HashMap item = new HashMap(2);
+ item.put(TITLE, title);
+ item.put(INTENT, intent);
+ data.add(item);
+ }
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/suid/SuidBinariesActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/suid/SuidBinariesActivity.java
new file mode 100644
index 0000000..9f973bc
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/suid/SuidBinariesActivity.java
@@ -0,0 +1,28 @@
+/*
+ * 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 com.android.cts.verifier.suid;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class SuidBinariesActivity extends Activity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ }
+}
diff --git a/apps/CtsVerifier/tests/src/com/android/cts/verifier/CtsVerifierActivityTest.java b/apps/CtsVerifier/tests/src/com/android/cts/verifier/CtsVerifierActivityTest.java
index 8e45f7a..c3e01b2 100644
--- a/apps/CtsVerifier/tests/src/com/android/cts/verifier/CtsVerifierActivityTest.java
+++ b/apps/CtsVerifier/tests/src/com/android/cts/verifier/CtsVerifierActivityTest.java
@@ -17,15 +17,23 @@
package com.android.cts.verifier;
import android.app.Activity;
+import android.app.Instrumentation;
+import android.app.Instrumentation.ActivityMonitor;
import android.test.ActivityInstrumentationTestCase2;
+import android.widget.Button;
import android.widget.TextView;
+import java.util.concurrent.TimeUnit;
+
public class CtsVerifierActivityTest
extends ActivityInstrumentationTestCase2<CtsVerifierActivity> {
private Activity mActivity;
+ private Instrumentation mInstrumentation;
private TextView mWelcomeTextView;
+ private Button mContinueButton;
private String mWelcomeText;
+ private String mContinueText;
public CtsVerifierActivityTest() {
super(CtsVerifierActivity.class);
@@ -35,16 +43,39 @@
protected void setUp() throws Exception {
super.setUp();
mActivity = getActivity();
+ mInstrumentation = getInstrumentation();
mWelcomeTextView = (TextView) mActivity.findViewById(R.id.welcome);
mWelcomeText = mActivity.getString(R.string.welcome_text);
+ mContinueButton = (Button) mActivity.findViewById(R.id.continue_button);
+ mContinueText = mActivity.getString(R.string.continue_button_text);
}
public void testPreconditions() {
assertNotNull(mWelcomeTextView);
assertNotNull(mWelcomeText);
+ assertNotNull(mContinueButton);
}
public void testWelcome() {
assertEquals(mWelcomeText, mWelcomeTextView.getText().toString());
+ assertEquals(mContinueText, mContinueButton.getText().toString());
+ }
+
+ /** Check that the continue button leads to the test list successfully. */
+ public void testContinueButton() throws Throwable {
+ ActivityMonitor monitor =
+ new ActivityMonitor(TestListActivity.class.getName(), null, false);
+ mInstrumentation.addMonitor(monitor);
+
+ runTestOnUiThread(new Runnable() {
+ public void run() {
+ assertTrue(mContinueButton.performClick());
+ }
+ });
+
+ Activity activity = mInstrumentation.waitForMonitorWithTimeout(monitor,
+ TimeUnit.SECONDS.toMillis(10));
+ assertNotNull(activity);
+ activity.finish();
}
}
diff --git a/apps/CtsVerifier/tests/src/com/android/cts/verifier/TestListActivityTest.java b/apps/CtsVerifier/tests/src/com/android/cts/verifier/TestListActivityTest.java
new file mode 100644
index 0000000..5175f33
--- /dev/null
+++ b/apps/CtsVerifier/tests/src/com/android/cts/verifier/TestListActivityTest.java
@@ -0,0 +1,67 @@
+/*
+ * 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 com.android.cts.verifier;
+
+import android.app.Activity;
+import android.app.Instrumentation;
+import android.app.Instrumentation.ActivityMonitor;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.test.ActivityInstrumentationTestCase2;
+import android.view.KeyEvent;
+
+import java.util.concurrent.TimeUnit;
+
+public class TestListActivityTest
+ extends ActivityInstrumentationTestCase2<TestListActivity> {
+
+ private TestListActivity mActivity;
+ private Instrumentation mInstrumentation;
+
+ public TestListActivityTest() {
+ super(TestListActivity.class);
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ mActivity = getActivity();
+ mInstrumentation = getInstrumentation();
+ }
+
+ /** Check that querying the for manual tests somewhat works. */
+ public void testListAdapter() {
+ assertNotNull(mActivity.getListAdapter());
+ assertTrue(mActivity.getListAdapter().getCount() > 0);
+ }
+
+ /** Test that clicking on an item launches a test. */
+ public void testListItem() throws Throwable {
+ IntentFilter filter = new IntentFilter(Intent.ACTION_MAIN);
+ filter.addCategory(TestListActivity.CATEGORY_MANUAL_TEST);
+
+ ActivityMonitor monitor = new ActivityMonitor(filter, null, false);
+ mInstrumentation.addMonitor(monitor);
+
+ sendKeys(KeyEvent.KEYCODE_ENTER);
+
+ Activity activity = mInstrumentation.waitForMonitorWithTimeout(monitor,
+ TimeUnit.SECONDS.toMillis(10));
+ assertNotNull(activity);
+ activity.finish();
+ }
+}
diff --git a/development/ide/eclipse/.classpath b/development/ide/eclipse/.classpath
index f20ab22..e9fb45d 100644
--- a/development/ide/eclipse/.classpath
+++ b/development/ide/eclipse/.classpath
@@ -58,6 +58,8 @@
<classpathentry kind="src" path="cts/tools/test-progress-new/src"/>
<classpathentry kind="src" path="cts/tools/utils"/>
<classpathentry kind="src" path="cts/tools/vm-tests/src"/>
- <classpathentry kind="src" path="out/target/common/obj/APPS/CtsTestStubs_intermediates/src/src"/>
<classpathentry kind="src" path="out/target/common/obj/APPS/CtsAccessibilityServiceTestCases_intermediates/src/src"/>
+ <classpathentry kind="src" path="out/target/common/obj/APPS/CtsTestStubs_intermediates/src/src"/>
+ <classpathentry kind="src" path="out/target/common/obj/APPS/CtsVerifier_intermediates/src"/>
+ <classpathentry kind="src" path="out/target/common/obj/APPS/CtsVerifierTests_intermediates/src"/>
</classpath>