Merge "only compare YUV on EOS buffer if the size is non-zero" into lmp-dev
diff --git a/CtsTestCaseList.mk b/CtsTestCaseList.mk
index d90f4fb..a3ca867 100644
--- a/CtsTestCaseList.mk
+++ b/CtsTestCaseList.mk
@@ -13,21 +13,21 @@
# limitations under the License.
cts_security_apps_list := \
- CtsAppAccessData \
- CtsAppWithData \
- CtsExternalStorageApp \
- CtsInstrumentationAppDiffCert \
- CtsPermissionDeclareApp \
- CtsPermissionDeclareAppCompat \
- CtsReadExternalStorageApp \
- CtsSharedUidInstall \
- CtsSharedUidInstallDiffCert \
- CtsSimpleAppInstall \
- CtsSimpleAppInstallDiffCert \
- CtsTargetInstrumentationApp \
- CtsUsePermissionDiffCert \
- CtsWriteExternalStorageApp \
- CtsMultiUserStorageApp
+ CtsAppAccessData \
+ CtsAppWithData \
+ CtsExternalStorageApp \
+ CtsInstrumentationAppDiffCert \
+ CtsPermissionDeclareApp \
+ CtsPermissionDeclareAppCompat \
+ CtsReadExternalStorageApp \
+ CtsSharedUidInstall \
+ CtsSharedUidInstallDiffCert \
+ CtsSimpleAppInstall \
+ CtsSimpleAppInstallDiffCert \
+ CtsTargetInstrumentationApp \
+ CtsUsePermissionDiffCert \
+ CtsWriteExternalStorageApp \
+ CtsMultiUserStorageApp
cts_support_packages := \
CtsAccelerationTestStubs \
@@ -39,6 +39,7 @@
CtsDeviceUi \
CtsMonkeyApp \
CtsMonkeyApp2 \
+ CtsProfileOwnerApp \
CtsSomeAccessibilityServices \
CtsTestStubs \
CtsThemeDeviceApp \
@@ -49,13 +50,14 @@
$(cts_security_apps_list)
cts_external_packages := \
- com.replica.replicaisland
+ com.replica.replicaisland \
+ com.drawelements.deqp
# Any APKs that need to be copied to the CTS distribution's testcases
# directory but do not require an associated test package XML.
CTS_TEST_CASE_LIST := \
- $(cts_support_packages) \
- $(cts_external_packages)
+ $(cts_support_packages) \
+ $(cts_external_packages)
# Test packages that require an associated test package XML.
cts_test_packages := \
@@ -91,6 +93,7 @@
CtsJniTestCases \
CtsKeystoreTestCases \
CtsLocationTestCases \
+ CtsLocation2TestCases \
CtsMediaStressTestCases \
CtsMediaTestCases \
CtsNativeOpenGLTestCases \
@@ -111,7 +114,6 @@
CtsSaxTestCases \
CtsSecurityTestCases \
CtsSpeechTestCases \
- CtsTelecomTestCases \
CtsTelephonyTestCases \
CtsTextTestCases \
CtsTextureViewTestCases \
@@ -127,13 +129,14 @@
# All APKs that need to be scanned by the coverage utilities.
CTS_COVERAGE_TEST_CASE_LIST := \
- $(cts_support_packages) \
- $(cts_test_packages)
+ $(cts_support_packages) \
+ $(cts_test_packages)
# Host side only tests
cts_host_libraries := \
CtsAdbTests \
CtsAppSecurityTests \
+ CtsDevicePolicyManagerTestCases \
CtsHostJank \
CtsHostUi \
CtsMonkeyTestCases \
@@ -143,8 +146,8 @@
# Native test executables that need to have associated test XMLs.
cts_native_exes := \
- NativeMediaTest_SL \
- NativeMediaTest_XA \
+ NativeMediaTest_SL \
+ NativeMediaTest_XA \
ifeq ($(HOST_OS)-$(HOST_ARCH),$(filter $(HOST_OS)-$(HOST_ARCH),linux-x86 linux-x86_64))
cts_native_exes += bionic-unit-tests-cts
@@ -179,7 +182,9 @@
$(call cts-get-test-xmls,$(cts_test_packages)) \
$(call cts-get-test-xmls,$(cts_native_exes)) \
$(call cts-get-test-xmls,$(cts_target_junit_tests)) \
- $(call cts-get-test-xmls,$(cts_ui_tests))
+ $(call cts-get-test-xmls,$(cts_ui_tests)) \
+ external/deqp/android/cts/com.drawelements.deqp.gles3.xml \
+ external/deqp/android/cts/com.drawelements.deqp.gles31.xml
# The following files will be placed in the tools directory of the CTS distribution
CTS_TOOLS_LIST :=
diff --git a/apps/CtsVerifier/AndroidManifest.xml b/apps/CtsVerifier/AndroidManifest.xml
index 2b5b4f2..c655594 100644
--- a/apps/CtsVerifier/AndroidManifest.xml
+++ b/apps/CtsVerifier/AndroidManifest.xml
@@ -47,7 +47,6 @@
<uses-feature android:name="android.hardware.usb.accessory" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
- <uses-feature android:name="android.hardware.telephony" android:required="false" />
<!-- Needed by the Audio Quality Verifier to store the sound samples that will be mailed. -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
@@ -760,6 +759,16 @@
<meta-data android:name="test_category" android:value="@string/test_category_sensors"/>
</activity>
+ <activity android:name=".sensors.SensorBatchingTestsActivity"
+ android:label="@string/snsr_sensor_batching_tests"
+ android:screenOrientation="nosensor">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN"/>
+ <category android:name="android.cts.intent.category.MANUAL_TEST"/>
+ </intent-filter>
+ <meta-data android:name="test_category" android:value="@string/test_category_sensors"/>
+ </activity>
+
<activity android:name=".sensors.SensorIntegrationTestsActivity"
android:label="@string/snsr_sensor_integration_tests">
<intent-filter>
@@ -1139,67 +1148,6 @@
android:label="@string/projection_service_name"
android:process=":projectionservice" />
- <activity android:name=".telecom.TelecomTestActivity"
- android:label="@string/telecom_test_title">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.cts.intent.category.MANUAL_TEST" />
- </intent-filter>
- <meta-data android:name="test_category" android:value="@string/test_category_telecom" />
- </activity>
-
- <activity android:name=".telecom.CancelCallTestActivity"
- android:label="@string/telecom_cancel_call_title">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.cts.intent.category.MANUAL_TEST" />
- </intent-filter>
- <meta-data android:name="test_category" android:value="@string/test_category_telecom" />
- <meta-data android:name="test_parent" android:value="com.android.cts.verifier.telecom.TelecomTestActivity" />
- <meta-data android:name="test_required_features" android:value="android.hardware.telephony"/>
- </activity>
-
- <service android:name=".telecom.CancelCallTestActivity$ConnectionService"
- android:permission="android.permission.BIND_CONNECTION_SERVICE">
- <intent-filter>
- <action android:name="android.telecom.ConnectionService" />
- </intent-filter>
- </service>
-
- <activity android:name=".telecom.FailedCallTestActivity"
- android:label="@string/telecom_failed_call_title">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.cts.intent.category.MANUAL_TEST" />
- </intent-filter>
- <meta-data android:name="test_category" android:value="@string/test_category_telecom" />
- <meta-data android:name="test_parent" android:value="com.android.cts.verifier.telecom.TelecomTestActivity" />
- </activity>
-
- <service android:name=".telecom.FailedCallTestActivity$ConnectionService"
- android:permission="android.permission.BIND_CONNECTION_SERVICE">
- <intent-filter>
- <action android:name="android.telecom.ConnectionService" />
- </intent-filter>
- </service>
-
- <activity android:name=".telecom.BasicCallTestActivity"
- android:label="@string/telecom_basic_call_title">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.cts.intent.category.MANUAL_TEST" />
- </intent-filter>
- <meta-data android:name="test_category" android:value="@string/test_category_telecom" />
- <meta-data android:name="test_parent" android:value="com.android.cts.verifier.telecom.TelecomTestActivity" />
- </activity>
-
- <service android:name=".telecom.BasicCallTestActivity$ConnectionService"
- android:permission="android.permission.BIND_CONNECTION_SERVICE">
- <intent-filter>
- <action android:name="android.telecom.ConnectionService" />
- </intent-filter>
- </service>
-
</application>
</manifest>
diff --git a/apps/CtsVerifier/res/layout/snsr_instruction.xml b/apps/CtsVerifier/res/layout/snsr_instruction.xml
index 66c7386..e7369c7 100644
--- a/apps/CtsVerifier/res/layout/snsr_instruction.xml
+++ b/apps/CtsVerifier/res/layout/snsr_instruction.xml
@@ -14,6 +14,7 @@
limitations under the License.
-->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:textColor="?android:attr/textColorSecondary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/snsr_log_padding_bottom"
diff --git a/apps/CtsVerifier/res/layout/snsr_message.xml b/apps/CtsVerifier/res/layout/snsr_message.xml
new file mode 100644
index 0000000..cef35ca
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/snsr_message.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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.
+-->
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:textStyle="italic"
+ android:textColor="?android:attr/textColorTertiary"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="@dimen/snsr_log_padding_top"
+ android:paddingLeft="@dimen/snsr_boxed_padding_left"
+ android:paddingRight="@dimen/snsr_boxed_padding_right"
+ android:paddingBottom="@dimen/snsr_log_padding_bottom" />
diff --git a/apps/CtsVerifier/res/layout/snsr_test_title.xml b/apps/CtsVerifier/res/layout/snsr_test_title.xml
index 2a458e7..374fb54 100644
--- a/apps/CtsVerifier/res/layout/snsr_test_title.xml
+++ b/apps/CtsVerifier/res/layout/snsr_test_title.xml
@@ -14,10 +14,11 @@
limitations under the License.
-->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:textStyle="bold"
+ android:textColor="?android:attr/textColorPrimary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/snsr_boxed_padding_bottom"
android:paddingTop="@dimen/snsr_boxed_padding_top"
android:paddingLeft="@dimen/snsr_boxed_padding_left"
- android:paddingRight="@dimen/snsr_boxed_padding_right"
- android:textStyle="bold" />
+ android:paddingRight="@dimen/snsr_boxed_padding_right" />
diff --git a/apps/CtsVerifier/res/layout/telecom_test_activity.xml b/apps/CtsVerifier/res/layout/telecom_test_activity.xml
deleted file mode 100644
index 9ca7cde..0000000
--- a/apps/CtsVerifier/res/layout/telecom_test_activity.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2014 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.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:padding="10dip" >
- <Button android:id="@+id/open_settings"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/telecom_open_settings" />
- <EditText android:id="@+id/phone_number"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/telecom_default_phone_number"
- android:hint="@string/telecom_phone_number_hint" />
- <Button android:id="@+id/simulate_call"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/telecom_simulate_call" />
- <include layout="@layout/pass_fail_buttons" />
-</LinearLayout>
\ No newline at end of file
diff --git a/apps/CtsVerifier/res/values/strings.xml b/apps/CtsVerifier/res/values/strings.xml
index a3b920f..f5f919d 100644
--- a/apps/CtsVerifier/res/values/strings.xml
+++ b/apps/CtsVerifier/res/values/strings.xml
@@ -432,7 +432,6 @@
<string name="snsr_executing_test">\nExecuting test case \'%1$s\'..\n</string>
<string name="snsr_orientation_portrait">[Device orientation]: Portrait.</string>
<string name="snsr_orientation_landscape">[Device orientation]: Landscape.</string>
- <string name="snsr_register_listener">Expected to be able to register sensor listener. Found=%b.</string>
<!-- Strings to interact with users in Sensor Tests -->
<string name="snsr_test_play_sound">A sound will be played once the verification is complete...</string>
@@ -517,8 +516,6 @@
<string name="snsr_batch_test">Sensor Batching Tests</string>
<string name="snsr_batching_walking_needed">Once the test begins, you will have to walk.</string>
<string name="snsr_batching_fifo_count">FifoReservedEventCount=%1$d. Expected to be at most FifoMaxEventCount=%2$d.</string>
- <string name="snsr_batching_first_event_arrival">Batched events expected to arrive after %1$d ns. Found=%2$d ns.</string>
- <string name="snsr_batching_flush_complete">Event \'onFlushComplete\' expected. Found=%1$b.</string>
<!-- Sensor Synchronization -->
<string name="snsr_synch_test">Sensor Synchronization Test</string>
@@ -548,13 +545,14 @@
<string name="snsr_significant_motion_test_in_hand">Once you begin the test, hold the device in your hand while you perform natural hand movements.</string>
<string name="snsr_significant_motion_test_sitting">Once you begin the test, keep the device in your pocket and move naturally while sitting in a chair.</string>
<string name="snsr_significant_motion_test_deactivation">Once you begin the test, you will need to walk to ensure Significant Motion triggers only once.</string>
- <string name="snsr_significant_motion_registration">Expected to be able to register for TriggerSensor. Found=%b.</string>
+ <string name="snsr_significant_motion_registration">Expected to be able to register for TriggerSensor. Found=%1$b.</string>
<string name="snsr_significant_motion_cancelation">Expected to be able to cancel TriggerSensor. Found=%b.</string>
<!-- Strings for Sensor CTS tests inside CtsVerifier -->
<string name="snsr_single_sensor_tests">CTS Single Sensor Tests</string>
<string name="snsr_sensor_integration_tests">CTS Sensor Integration Tests</string>
<string name="snsr_sensor_test">CTS Sensor Test</string>
+ <string name="snsr_sensor_batching_tests">CTS Sensor Batching Tests</string>
<!-- Strings for Sample Test Activities -->
<string name="share_button_text">Share</string>
@@ -1121,29 +1119,4 @@
<string name="snsr_rotation_vector_set_final">Place the device back to the reference position.</string>
<string name="snsr_rotation_vector_verification">Angular deviation [%1$4.1f %2$4.1f %3$4.1f]. Current: %4$f deg. Max tolerated: %5$f.</string>
- <string name="test_category_telecom">Telecom</string>
- <string name="telecom_test_title">Telecom Tests</string>
- <string name="telecom_test_summary">These tests cover aspects of Telecom call routing.
- These tests may be run in any order, but each one will require user input before it can be run.
- </string>
- <string name="telecom_open_settings">Open settings</string>
- <string name="telecom_simulate_call">Place call</string>
- <string name="telecom_default_phone_number">555-263-7643</string>
- <string name="telecom_phone_number_hint">Phone number to call</string>
- <string name="telecom_cancel_call_title">Canceled Call Test</string>
- <string name="telecom_cancel_call_info">This tests to make sure that canceled calls are handled correctly.
- Press the \"Open settings\" button and make sure that \"Call Cancel Manager\" is the default Wi-Fi calling account.
- Then press the \"Place call\" button; the test will pass (or fail) automatically.
- </string>
- <string name="telecom_failed_call_title">Failed Call Test</string>
- <string name="telecom_failed_call_info">This tests to make sure that failed calls are handled correctly.
- Press the \"Open settings\" button and make sure that \"Call Failed Manager\" is the default Wi-Fi calling account.
- Then press the \"Place call\" button; the test will pass (or fail) automatically.
- </string>
- <string name="telecom_basic_call_title">Basic Call Test</string>
- <string name="telecom_basic_call_info">This tests to make sure that basic calls are handled correctly.
- Press the \"Open settings\" button and make sure that \"Basic Call Manager\" is the default Wi-Fi calling account.
- Then press the \"Place call\" button; the test will pass (or fail) automatically.
- </string>
-
</resources>
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleScannerHardwareScanFilterActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleScannerHardwareScanFilterActivity.java
index bf66acd..dd7e66c 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleScannerHardwareScanFilterActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleScannerHardwareScanFilterActivity.java
@@ -51,7 +51,6 @@
setPassFailButtonClickListeners();
setInfoResources(R.string.ble_scanner_scan_filter_name,
R.string.ble_scanner_scan_filter_info, -1);
- getPassButton().setEnabled(false);
mScanResultListView = (ListView)findViewById(R.id.ble_scan_result_list);
mAdapter = new MapAdapter();
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleServerService.java b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleServerService.java
index 5606041..91b3a6c 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleServerService.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleServerService.java
@@ -65,6 +65,8 @@
"com.android.cts.verifier.bluetooth.BLE_DESCRIPTOR_WRITE_REQUEST";
public static final String BLE_EXECUTE_WRITE =
"com.android.cts.verifier.bluetooth.BLE_EXECUTE_WRITE";
+ public static final String BLE_OPEN_FAIL =
+ "com.android.cts.verifier.bluetooth.BLE_OPEN_FAIL";
private static final UUID SERVICE_UUID =
UUID.fromString("00009999-0000-1000-8000-00805f9b34fb");
@@ -90,11 +92,16 @@
mBluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mGattServer = mBluetoothManager.openGattServer(this, mCallbacks);
mService = createService();
- mGattServer.addService(mService);
+ if (mGattServer != null) {
+ mGattServer.addService(mService);
+ }
mDevice = null;
mReliableWriteValue = null;
mHandler = new Handler();
+ if (mGattServer == null) {
+ notifyOpenFail();
+ }
}
@Override
@@ -110,6 +117,9 @@
@Override
public void onDestroy() {
super.onDestroy();
+ if (mGattServer == null) {
+ return;
+ }
if (mDevice != null) mGattServer.cancelConnection(mDevice);
mGattServer.close();
}
@@ -126,6 +136,12 @@
descriptor.setValue(writeValue.getBytes());
}
+ private void notifyOpenFail() {
+ if (DEBUG) Log.d(TAG, "notifyOpenFail");
+ Intent intent = new Intent(BLE_OPEN_FAIL);
+ sendBroadcast(intent);
+ }
+
private void notifyConnected() {
if (DEBUG) Log.d(TAG, "notifyConnected");
Intent intent = new Intent(BLE_SERVER_CONNECTED);
@@ -216,6 +232,10 @@
TimerTask task = new TimerTask() {
@Override
public void run() {
+ if (mGattServer == null) {
+ if (DEBUG) Log.d(TAG, "GattServer is null, return");
+ return;
+ }
BluetoothGattCharacteristic characteristic =
mService.getCharacteristic(UPDATE_CHARACTERISTIC_UUID);
if (characteristic == null) return;
@@ -268,7 +288,11 @@
@Override
public void onCharacteristicReadRequest(BluetoothDevice device, int requestId,
- int offset, BluetoothGattCharacteristic characteristic) {
+ int offset, BluetoothGattCharacteristic characteristic) {
+ if (mGattServer == null) {
+ if (DEBUG) Log.d(TAG, "GattServer is null, return");
+ return;
+ }
if (DEBUG) Log.d(TAG, "onCharacteristicReadRequest()");
notifyCharacteristicReadRequest();
@@ -278,9 +302,13 @@
@Override
public void onCharacteristicWriteRequest(BluetoothDevice device, int requestId,
- BluetoothGattCharacteristic characteristic,
- boolean preparedWrite, boolean responseNeeded,
- int offset, byte[] value) {
+ BluetoothGattCharacteristic characteristic,
+ boolean preparedWrite, boolean responseNeeded,
+ int offset, byte[] value) {
+ if (mGattServer == null) {
+ if (DEBUG) Log.d(TAG, "GattServer is null, return");
+ return;
+ }
if (DEBUG) Log.d(TAG, "onCharacteristicWriteRequest: preparedWrite=" + preparedWrite);
notifyCharacteristicWriteRequest();
@@ -293,7 +321,11 @@
@Override
public void onDescriptorReadRequest(BluetoothDevice device, int requestId,
- int offset, BluetoothGattDescriptor descriptor) {
+ int offset, BluetoothGattDescriptor descriptor) {
+ if (mGattServer == null) {
+ if (DEBUG) Log.d(TAG, "GattServer is null, return");
+ return;
+ }
if (DEBUG) Log.d(TAG, "onDescriptorReadRequest(): (descriptor == getDescriptor())="
+ (descriptor == getDescriptor()));
@@ -304,9 +336,13 @@
@Override
public void onDescriptorWriteRequest(BluetoothDevice device, int requestId,
- BluetoothGattDescriptor descriptor,
- boolean preparedWrite, boolean responseNeeded,
- int offset, byte[] value) {
+ BluetoothGattDescriptor descriptor,
+ boolean preparedWrite, boolean responseNeeded,
+ int offset, byte[] value) {
+ if (mGattServer == null) {
+ if (DEBUG) Log.d(TAG, "GattServer is null, return");
+ return;
+ }
if (DEBUG) Log.d(TAG, "onDescriptorWriteRequest(): (descriptor == getDescriptor())="
+ (descriptor == getDescriptor()));
@@ -318,6 +354,10 @@
@Override
public void onExecuteWrite(BluetoothDevice device, int requestId, boolean execute) {
+ if (mGattServer == null) {
+ if (DEBUG) Log.d(TAG, "GattServer is null, return");
+ return;
+ }
if (DEBUG) Log.d(TAG, "onExecuteWrite");
if (execute) {
notifyExecuteWrite();
@@ -326,4 +366,5 @@
}
}
};
-}
\ No newline at end of file
+}
+
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleServerStartActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleServerStartActivity.java
index 089afde..e8e35d5 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleServerStartActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleServerStartActivity.java
@@ -34,6 +34,7 @@
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
+import android.widget.Toast;
public class BleServerStartActivity extends PassFailButtons.Activity {
@@ -70,6 +71,7 @@
filter.addAction(BleServerService.BLE_DESCRIPTOR_WRITE_REQUEST);
filter.addAction(BleServerService.BLE_EXECUTE_WRITE);
filter.addAction(BleServerService.BLE_SERVER_DISCONNECTED);
+ filter.addAction(BleServerService.BLE_OPEN_FAIL);
registerReceiver(onBroadcast, filter);
}
@@ -126,6 +128,15 @@
} else if (action == BleServerService.BLE_SERVER_DISCONNECTED) {
mTestAdapter.setTestPass(7);
mAllPassed |= 0x80;
+ } else if (action == BleServerService.BLE_OPEN_FAIL) {
+ setTestResultAndFinish(false);
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ Toast.makeText(BleServerStartActivity.this, "Cannot open GattService",
+ Toast.LENGTH_SHORT).show();
+ }
+ });
}
mTestAdapter.notifyDataSetChanged();
if (mAllPassed == 0xFF) getPassButton().setEnabled(true);
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nls/NotificationListenerVerifierActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/nls/NotificationListenerVerifierActivity.java
index 842c024..5e9db53 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/nls/NotificationListenerVerifierActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nls/NotificationListenerVerifierActivity.java
@@ -425,7 +425,7 @@
new MockListener.StringListResultCatcher() {
@Override
public void accept(List<String> result) {
- if (result.size() > 0 && result.contains(mTag1)) {
+ if (result != null && result.size() > 0 && result.contains(mTag1)) {
mStatus[i] = PASS;
} else {
logWithStack("failed testNotificationRecieved");
@@ -444,7 +444,7 @@
public void accept(List<String> result) {
boolean pass = false;
Set<String> found = new HashSet<String>();
- if (result.size() > 0) {
+ if (result != null && result.size() > 0) {
pass = true;
for(String payloadData : result) {
try {
@@ -513,7 +513,7 @@
new MockListener.StringListResultCatcher() {
@Override
public void accept(List<String> result) {
- if (result.size() > 0 && result.contains(mTag1)) {
+ if (result != null && result.size() > 0 && result.contains(mTag1)) {
mStatus[i] = PASS;
next();
} else {
@@ -546,7 +546,8 @@
new MockListener.StringListResultCatcher() {
@Override
public void accept(List<String> result) {
- if (result.size() == 2 && result.contains(mTag2) && result.contains(mTag3)) {
+ if (result != null && result.size() == 2
+ && result.contains(mTag2) && result.contains(mTag3)) {
mStatus[i] = PASS;
next();
} else {
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/projection/offscreen/ProjectionOffscreenActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/projection/offscreen/ProjectionOffscreenActivity.java
index 5f32cfd..f992618 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/projection/offscreen/ProjectionOffscreenActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/projection/offscreen/ProjectionOffscreenActivity.java
@@ -185,6 +185,13 @@
}
Image image = reader.acquireLatestImage();
+
+ // No new images available
+ if (image == null) {
+ Log.w(TAG, "onImageAvailable called but no image!");
+ return;
+ }
+
if (mTestStatus == TestStatus.RUNNING) {
int ret = scanImage(image);
if (ret == -1) {
@@ -244,9 +251,7 @@
offset += rowPadding;
}
- // Return a color if it represents more than one quarter of the pixels.
- // We use this threshold in case the display is being letterboxed when
- // mirroring so there might be large black bars on the sides, which is normal.
+ // Return a color if it represents all of the pixels.
Log.d(TAG, "- Pixels: " + blackPixels + " black, "
+ bluePixels + " blue, "
+ otherPixels + " other");
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/AccelerometerMeasurementTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/AccelerometerMeasurementTestActivity.java
index 265f086..945e9ab 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/AccelerometerMeasurementTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/AccelerometerMeasurementTestActivity.java
@@ -21,6 +21,7 @@
import android.hardware.Sensor;
import android.hardware.SensorManager;
+import android.hardware.cts.helpers.TestSensorEnvironment;
import android.hardware.cts.helpers.sensoroperations.TestSensorOperation;
import android.hardware.cts.helpers.sensorverification.MeanVerification;
@@ -91,12 +92,12 @@
*/
private String verifyMeasurements(float ... expectations) throws Throwable {
Thread.sleep(500 /*ms*/);
- TestSensorOperation verifyMeasurements = new TestSensorOperation(
+ TestSensorEnvironment environment = new TestSensorEnvironment(
getApplicationContext(),
Sensor.TYPE_ACCELEROMETER,
- SensorManager.SENSOR_DELAY_FASTEST,
- 0 /*reportLatencyInUs*/,
- 100 /* event count */);
+ SensorManager.SENSOR_DELAY_FASTEST);
+ TestSensorOperation verifyMeasurements =
+ new TestSensorOperation(environment, 100 /* event count */);
verifyMeasurements.addVerification(new MeanVerification(
expectations,
new float[]{1.95f, 1.95f, 1.95f} /* m / s^2 */));
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/BatchingTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/BatchingTestActivity.java
index 009e644..4ba38a9 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/BatchingTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/BatchingTestActivity.java
@@ -19,22 +19,16 @@
import com.android.cts.verifier.R;
import com.android.cts.verifier.sensors.base.SensorCtsVerifierTestActivity;
-import junit.framework.Assert;
-
import android.content.Context;
import android.hardware.Sensor;
-import android.hardware.SensorEvent;
-import android.hardware.SensorEventListener2;
import android.hardware.SensorManager;
-import android.hardware.cts.helpers.SensorNotSupportedException;
-import android.hardware.cts.helpers.TestSensorEvent;
+import android.hardware.cts.helpers.TestSensorEnvironment;
+import android.hardware.cts.helpers.sensoroperations.TestSensorFlushOperation;
+import android.hardware.cts.helpers.sensoroperations.TestSensorOperation;
+import android.hardware.cts.helpers.sensoroperations.VerifiableSensorOperation;
import android.os.Bundle;
import android.os.PowerManager;
-import android.os.SystemClock;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
/**
@@ -44,27 +38,19 @@
* If a sensor supports the batching mode, FifoReservedEventCount for that sensor should be greater
* than one.
*/
-public class BatchingTestActivity
- extends SensorCtsVerifierTestActivity
- implements SensorEventListener2 {
+public class BatchingTestActivity extends SensorCtsVerifierTestActivity {
public BatchingTestActivity() {
super(BatchingTestActivity.class);
}
- private final long TWO_SECONDS_MILLIS = TimeUnit.SECONDS.toMillis(2);
- private static final long DATA_COLLECTION_TIME_IN_MS = TimeUnit.SECONDS.toMillis(10);
- private final long MIN_BATCH_TIME_NANOS = TimeUnit.SECONDS.toNanos(5);
- private final long MAX_BATCH_REPORT_LATENCY_US = DATA_COLLECTION_TIME_IN_MS * 500;
+ private static final int SENSOR_BATCHING_RATE_US = SensorManager.SENSOR_DELAY_FASTEST;
+ private static final int REPORT_LATENCY_10_SEC = 10;
+ private static final int BATCHING_PADDING_TIME_S = 2;
- private final List<TestSensorEvent> mSensorEvents = new ArrayList<TestSensorEvent>();
+ // we are testing sensors that only trigger based on external events, so leave enough time for
+ // such events to generate
+ private static final int REPORT_LATENCY_25_SEC = 25;
- private SensorManager mSensorManager;
-
- private volatile Sensor mSensorUnderTest;
- private volatile long mTimeFirstBatchedEventReceivedNanos;
-
- private CountDownLatch mSensorEventReceived;
- private CountDownLatch mFlushCompleteReceived;
private PowerManager.WakeLock mWakeLock;
@Override
@@ -74,161 +60,114 @@
@Override
protected void activitySetUp() throws InterruptedException {
- mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
mWakeLock = powerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "BatchingTests");
-
- deactivateSensorFeatures();
mWakeLock.acquire();
}
@Override
protected void activityCleanUp() throws InterruptedException {
mWakeLock.release();
- restoreSensorFeatures();
}
- // TODO: refactor to discover all available sensors of each type and dinamically generate test
+ // TODO: refactor to discover all available sensors of each type and dynamically generate test
// cases for all of them
- public String testStepCounter() throws Throwable {
- return runTest(Sensor.TYPE_STEP_COUNTER, R.string.snsr_batching_walking_needed);
+ public String testStepCounter_batching() throws Throwable {
+ return runBatchTest(
+ Sensor.TYPE_STEP_COUNTER,
+ REPORT_LATENCY_25_SEC,
+ R.string.snsr_batching_walking_needed);
}
- public String testStepDetector() throws Throwable {
- return runTest(Sensor.TYPE_STEP_DETECTOR, R.string.snsr_batching_walking_needed);
+ public String testStepCounter_flush() throws Throwable {
+ return runFlushTest(
+ Sensor.TYPE_STEP_COUNTER,
+ REPORT_LATENCY_25_SEC,
+ R.string.snsr_batching_walking_needed);
}
- public String testProximity() throws Throwable {
- return runTest(Sensor.TYPE_PROXIMITY, R.string.snsr_interaction_needed);
+ public String testStepDetector_batching() throws Throwable {
+ return runBatchTest(
+ Sensor.TYPE_STEP_DETECTOR,
+ REPORT_LATENCY_25_SEC,
+ R.string.snsr_batching_walking_needed);
}
- public String testLight() throws Throwable {
- return runTest(Sensor.TYPE_LIGHT, R.string.snsr_interaction_needed);
+ public String testStepDetector_flush() throws Throwable {
+ return runFlushTest(
+ Sensor.TYPE_STEP_DETECTOR,
+ REPORT_LATENCY_25_SEC,
+ R.string.snsr_batching_walking_needed);
}
- // TODO: move sensors that do not require interaction to CTS
- public String testGameRotationVector() throws Throwable {
- return runTest(Sensor.TYPE_GAME_ROTATION_VECTOR, R.string.snsr_no_interaction);
+ public String testProximity_batching() throws Throwable {
+ return runBatchTest(
+ Sensor.TYPE_PROXIMITY,
+ REPORT_LATENCY_10_SEC,
+ R.string.snsr_interaction_needed);
}
- public String testGeomagneticRotationVector() throws Throwable {
- return runTest(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR, R.string.snsr_no_interaction);
+ public String testProximity_flush() throws Throwable {
+ return runFlushTest(
+ Sensor.TYPE_PROXIMITY,
+ REPORT_LATENCY_10_SEC,
+ R.string.snsr_interaction_needed);
}
- public String testAccelerometer() throws Throwable {
- return runTest(Sensor.TYPE_ACCELEROMETER, R.string.snsr_no_interaction);
+ public String testLight_batching() throws Throwable {
+ return runBatchTest(
+ Sensor.TYPE_LIGHT,
+ REPORT_LATENCY_10_SEC,
+ R.string.snsr_interaction_needed);
}
- public String testGyroscope() throws Throwable {
- return runTest(Sensor.TYPE_GYROSCOPE, R.string.snsr_no_interaction);
+ public String testLight_flush() throws Throwable {
+ return runFlushTest(
+ Sensor.TYPE_LIGHT,
+ REPORT_LATENCY_10_SEC,
+ R.string.snsr_interaction_needed);
}
- public String testGyroscopeUncalibrated() throws Throwable {
- return runTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, R.string.snsr_no_interaction);
+ private String runBatchTest(int sensorType, int maxBatchReportLatencySec, int instructionsResId)
+ throws Throwable {
+ getTestLogger().logInstructions(instructionsResId);
+ waitForUserToBegin();
+
+ int maxBatchReportLatencyUs = (int) TimeUnit.SECONDS.toMicros(maxBatchReportLatencySec);
+ TestSensorEnvironment environment = new TestSensorEnvironment(
+ getApplicationContext(),
+ sensorType,
+ SENSOR_BATCHING_RATE_US,
+ maxBatchReportLatencyUs);
+
+ int testDurationSec = maxBatchReportLatencySec + BATCHING_PADDING_TIME_S;
+ TestSensorOperation operation =
+ new TestSensorOperation(environment, testDurationSec,TimeUnit.SECONDS);
+ return executeTest(operation);
}
- public String testMagneticField() throws Throwable {
- return runTest(Sensor.TYPE_MAGNETIC_FIELD, R.string.snsr_no_interaction);
+ private String runFlushTest(int sensorType, int maxBatchReportLatencySec, int instructionsResId)
+ throws Throwable {
+ getTestLogger().logInstructions(instructionsResId);
+ waitForUserToBegin();
+
+ int maxBatchReportLatencyUs = (int) TimeUnit.SECONDS.toMicros(maxBatchReportLatencySec);
+ TestSensorEnvironment environment = new TestSensorEnvironment(
+ getApplicationContext(),
+ sensorType,
+ SENSOR_BATCHING_RATE_US,
+ maxBatchReportLatencyUs);
+
+ int flushDurationSec = maxBatchReportLatencySec / 2;
+ TestSensorFlushOperation operation =
+ new TestSensorFlushOperation(environment, flushDurationSec, TimeUnit.SECONDS);
+ return executeTest(operation);
}
- public String testMagneticFieldUncalibrated() throws Throwable {
- return runTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, R.string.snsr_no_interaction);
- }
-
- public String testRotationVector() throws Throwable {
- return runTest(Sensor.TYPE_ROTATION_VECTOR, R.string.snsr_no_interaction);
- }
-
- // TODO: split batching and flush scenarios
- private String runTest(int sensorType, int instructionsResId) throws Throwable {
- mSensorUnderTest = mSensorManager.getDefaultSensor(sensorType);
- // TODO: add exception for batching not supported
- if (mSensorUnderTest == null || mSensorUnderTest.getFifoMaxEventCount() < 1) {
- throw new SensorNotSupportedException(Sensor.TYPE_STEP_COUNTER);
- }
-
- appendText(instructionsResId);
- waitForUser();
-
- // Register to wait for first sensor event arrival, and when FIFO has been flushed
- mSensorEventReceived = new CountDownLatch(1);
- mFlushCompleteReceived = new CountDownLatch(1);
- mSensorEvents.clear();
-
- int fifoReservedEventCount = mSensorUnderTest.getFifoReservedEventCount();
- int fifoMaxEventCount = mSensorUnderTest.getFifoMaxEventCount();
- String fifoMessage = getString(
- R.string.snsr_batching_fifo_count,
- fifoReservedEventCount,
- fifoMaxEventCount);
- Assert.assertTrue(fifoMessage, fifoReservedEventCount <= fifoMaxEventCount);
-
- // Time when start batching
- mTimeFirstBatchedEventReceivedNanos = 0;
- long timeBatchingStartedNanos = SystemClock.elapsedRealtimeNanos();
-
- // Batch with the fastest rate and set report latency large enough to ensure full batching
- // occurs
- boolean registerResult = mSensorManager.registerListener(
- this /* listener */,
- mSensorUnderTest,
- SensorManager.SENSOR_DELAY_FASTEST,
- (int) MAX_BATCH_REPORT_LATENCY_US);
- Assert.assertTrue(
- getString(R.string.snsr_register_listener, registerResult),
- registerResult);
-
- // add a buffer to the duration of the test for timeout
- mSensorEventReceived
- .await(DATA_COLLECTION_TIME_IN_MS + TWO_SECONDS_MILLIS, TimeUnit.MILLISECONDS);
- // TODO: add delayed assertion for await
-
- // verify the minimum batching time
- long firstTimeArrivalDelta = mTimeFirstBatchedEventReceivedNanos - timeBatchingStartedNanos;
- String firstTimeArrivalMessage = getString(
- R.string.snsr_batching_first_event_arrival,
- MIN_BATCH_TIME_NANOS,
- firstTimeArrivalDelta);
- Assert.assertTrue(firstTimeArrivalMessage, firstTimeArrivalDelta >= MIN_BATCH_TIME_NANOS);
-
- // batch a bit more to test the flush
- long sleepTime = TimeUnit.NANOSECONDS.toMillis(MIN_BATCH_TIME_NANOS / 2);
- Thread.sleep(sleepTime);
- mSensorManager.flush(this);
-
- boolean flushAwaitSuccess = mFlushCompleteReceived
- .await(DATA_COLLECTION_TIME_IN_MS + TWO_SECONDS_MILLIS, TimeUnit.MILLISECONDS);
- Assert.assertTrue(
- getString(R.string.snsr_batching_flush_complete, flushAwaitSuccess),
- flushAwaitSuccess);
-
- playSound();
- // TODO: use SensorTestVerifications to check for event ordering and event gap
+ private String executeTest(VerifiableSensorOperation operation) {
+ operation.addDefaultVerifications();
+ operation.setLogEvents(true);
+ operation.execute();
return null;
}
-
- @Override
- public void onSensorChanged(SensorEvent sensorEvent) {
- long elapsedTime = SystemClock.elapsedRealtimeNanos();
- if (sensorEvent.sensor.getType() != mSensorUnderTest.getType()) {
- // TODO: add delayed assertion
- return;
- }
-
- mSensorEvents.add(new TestSensorEvent(sensorEvent, elapsedTime));
- if (mTimeFirstBatchedEventReceivedNanos == 0) {
- mTimeFirstBatchedEventReceivedNanos = elapsedTime;
- mSensorEventReceived.countDown();
- }
- }
-
- @Override
- public void onAccuracyChanged(Sensor sensor, int accuracy) {
- }
-
- @Override
- public void onFlushCompleted(Sensor sensor) {
- mSensorManager.unregisterListener(this);
- mFlushCompleteReceived.countDown();
- }
}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/GyroscopeMeasurementTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/GyroscopeMeasurementTestActivity.java
index c4927e9..11a741b 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/GyroscopeMeasurementTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/GyroscopeMeasurementTestActivity.java
@@ -21,6 +21,7 @@
import android.hardware.Sensor;
import android.hardware.SensorManager;
+import android.hardware.cts.helpers.TestSensorEnvironment;
import android.hardware.cts.helpers.sensoroperations.TestSensorOperation;
import android.hardware.cts.helpers.sensorverification.SigNumVerification;
@@ -119,12 +120,13 @@
waitForUser();
Thread.sleep(500 /*ms*/);
- TestSensorOperation verifySignum = new TestSensorOperation(
+
+ TestSensorEnvironment environment = new TestSensorEnvironment(
getApplicationContext(),
Sensor.TYPE_GYROSCOPE,
- SensorManager.SENSOR_DELAY_FASTEST,
- 0 /*reportLatencyInUs*/,
- 100 /* event count */);
+ SensorManager.SENSOR_DELAY_FASTEST);
+ TestSensorOperation verifySignum =
+ new TestSensorOperation(environment, 100 /* event count */);
verifySignum.addVerification(new SigNumVerification(
expectations,
new float[]{0.2f, 0.2f, 0.2f} /*noiseThreshold*/));
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/MagneticFieldMeasurementTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/MagneticFieldMeasurementTestActivity.java
index 0e83a3e..c2a9207 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/MagneticFieldMeasurementTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/MagneticFieldMeasurementTestActivity.java
@@ -24,6 +24,7 @@
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener2;
import android.hardware.SensorManager;
+import android.hardware.cts.helpers.TestSensorEnvironment;
import android.hardware.cts.helpers.TestSensorEventListener;
import android.hardware.cts.helpers.TestSensorManager;
import android.hardware.cts.helpers.sensoroperations.TestSensorOperation;
@@ -77,9 +78,11 @@
public void onFlushCompleted(Sensor sensor) {}
};
- TestSensorManager magnetometer = new TestSensorManager(
- this.getApplicationContext(), Sensor.TYPE_MAGNETIC_FIELD,
- SensorManager.SENSOR_DELAY_NORMAL, 0);
+ TestSensorEnvironment environment = new TestSensorEnvironment(
+ getApplicationContext(),
+ Sensor.TYPE_MAGNETIC_FIELD,
+ SensorManager.SENSOR_DELAY_NORMAL);
+ TestSensorManager magnetometer = new TestSensorManager(environment);
try {
magnetometer.registerListener(new TestSensorEventListener(listener));
waitForUser();
@@ -109,16 +112,17 @@
* - the values sampled from the sensor
*/
private String verifyNorm() throws Throwable {
+ TestSensorEnvironment environment = new TestSensorEnvironment(
+ getApplicationContext(),
+ Sensor.TYPE_MAGNETIC_FIELD,
+ SensorManager.SENSOR_DELAY_FASTEST);
+ TestSensorOperation verifyNorm =
+ new TestSensorOperation(environment, 100 /* event count */);
+
float expectedMagneticFieldEarth =
(SensorManager.MAGNETIC_FIELD_EARTH_MAX + SensorManager.MAGNETIC_FIELD_EARTH_MIN) / 2;
float magneticFieldEarthThreshold =
expectedMagneticFieldEarth - SensorManager.MAGNETIC_FIELD_EARTH_MIN;
- TestSensorOperation verifyNorm = new TestSensorOperation(
- this.getApplicationContext(),
- Sensor.TYPE_MAGNETIC_FIELD,
- SensorManager.SENSOR_DELAY_FASTEST,
- 0 /*reportLatencyInUs*/,
- 100 /* event count */);
verifyNorm.addVerification(new MagnitudeVerification(
expectedMagneticFieldEarth,
magneticFieldEarthThreshold));
@@ -150,12 +154,12 @@
* the failure to help track down the issue.
*/
private String verifyStandardDeviation() throws Throwable {
- TestSensorOperation verifyStdDev = new TestSensorOperation(
- this.getApplicationContext(),
+ TestSensorEnvironment environment = new TestSensorEnvironment(
+ getApplicationContext(),
Sensor.TYPE_MAGNETIC_FIELD,
- SensorManager.SENSOR_DELAY_FASTEST,
- 0 /*reportLatencyInUs*/,
- 100 /* event count */);
+ SensorManager.SENSOR_DELAY_FASTEST);
+ TestSensorOperation verifyStdDev =
+ new TestSensorOperation(environment, 100 /* event count */);
verifyStdDev.addVerification(new StandardDeviationVerification(
new float[]{2f, 2f, 2f} /* uT */));
verifyStdDev.execute();
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorBatchingTestsActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorBatchingTestsActivity.java
new file mode 100644
index 0000000..d1923cc
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorBatchingTestsActivity.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2014 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.sensors;
+
+import com.android.cts.verifier.sensors.base.SensorCtsTestActivity;
+
+import android.hardware.cts.SensorBatchingTests;
+
+/**
+ * Activity to execute CTS sensor batching tests.
+ * It is a wrapper for {@link SensorBatchingTests} running with AndroidJUnitRunner.
+ */
+public class SensorBatchingTestsActivity extends SensorCtsTestActivity {
+ public SensorBatchingTestsActivity() {
+ super(SensorBatchingTests.class);
+ }
+}
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorPowerTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorPowerTestActivity.java
index 85ab6c5..245d115 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorPowerTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorPowerTestActivity.java
@@ -62,7 +62,6 @@
@Override
protected void activitySetUp() throws InterruptedException {
setScreenOffTimeout(15, TimeUnit.SECONDS);
- deactivateSensorFeatures();
}
@Override
@@ -70,8 +69,6 @@
if (mHostLink != null) {
mHostLink.close();
}
-
- restoreSensorFeatures();
resetScreenOffTimeout();
}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorValueAccuracyActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorValueAccuracyActivity.java
index d8075f0..4b74280 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorValueAccuracyActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorValueAccuracyActivity.java
@@ -27,6 +27,7 @@
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.hardware.cts.helpers.SensorNotSupportedException;
+import android.hardware.cts.helpers.TestSensorEnvironment;
import android.hardware.cts.helpers.TestSensorEvent;
import android.hardware.cts.helpers.sensoroperations.TestSensorOperation;
import android.hardware.cts.helpers.sensorverification.ISensorVerification;
@@ -57,8 +58,6 @@
private static final float RANGE_ATMOSPHERIC_PRESSURE = 35f;
private static final float AMBIENT_TEMPERATURE_AVERAGE = 22.5f;
private static final float AMBIENT_TEMPERATURE_THRESHOLD = 7.5f;
- private static final float PROXIMITY_AVERAGE = 50f;
- private static final float PROXIMITY_THRESHOLD = 50f;
private static final double ONE_HUNDRED_EIGHTY_DEGREES = 180.0f;
private static final double GYROSCOPE_INTEGRATION_THRESHOLD_DEGREES = 10.0f;
@@ -174,12 +173,10 @@
appendText(instructionsResId);
waitForUser();
- TestSensorOperation verifyNormOperation = new TestSensorOperation(
- getApplicationContext(),
- sensorType,
- SENSOR_RATE,
- 0 /* reportLatencyInUs */,
- EVENTS_TO_COLLECT);
+ TestSensorEnvironment environment =
+ new TestSensorEnvironment(getApplicationContext(), sensorType, SENSOR_RATE);
+ TestSensorOperation verifyNormOperation =
+ new TestSensorOperation(environment, EVENTS_TO_COLLECT);
// TODO: add event ordering and timestamp > 0 verifications
ISensorVerification magnitudeVerification =
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SignificantMotionTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SignificantMotionTestActivity.java
index 73608f1..936145d 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SignificantMotionTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SignificantMotionTestActivity.java
@@ -26,7 +26,7 @@
import android.hardware.SensorManager;
import android.hardware.TriggerEvent;
import android.hardware.TriggerEventListener;
-import android.os.Bundle;
+import android.hardware.cts.helpers.SensorNotSupportedException;
import android.os.SystemClock;
import java.util.concurrent.CountDownLatch;
@@ -144,9 +144,10 @@
}
TriggerVerifier verifier = new TriggerVerifier();
+ boolean success = mSensorManager.requestTriggerSensor(verifier, mSensorSignificantMotion);
Assert.assertTrue(
- getString(R.string.snsr_significant_motion_registration),
- mSensorManager.requestTriggerSensor(verifier, mSensorSignificantMotion));
+ getString(R.string.snsr_significant_motion_registration, success),
+ success);
if (cancelEventNotification) {
Assert.assertTrue(
getString(R.string.snsr_significant_motion_cancelation),
@@ -168,14 +169,13 @@
}
@Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
+ protected void activitySetUp() {
mSensorManager = (SensorManager) getApplicationContext()
.getSystemService(Context.SENSOR_SERVICE);
- mSensorSignificantMotion = mSensorManager
- .getDefaultSensor(Sensor.TYPE_SIGNIFICANT_MOTION);
-
+ mSensorSignificantMotion = mSensorManager.getDefaultSensor(Sensor.TYPE_SIGNIFICANT_MOTION);
+ if (mSensorSignificantMotion == null) {
+ throw new SensorNotSupportedException(Sensor.TYPE_SIGNIFICANT_MOTION);
+ }
}
/**
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/StepCounterTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/StepCounterTestActivity.java
index 78430e3..2868a0c 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/StepCounterTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/StepCounterTestActivity.java
@@ -27,10 +27,12 @@
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.hardware.cts.helpers.MovementDetectorHelper;
+import android.hardware.cts.helpers.SensorTestStateNotSupportedException;
import android.hardware.cts.helpers.TestSensorEvent;
import android.os.SystemClock;
+import android.view.MotionEvent;
import android.view.View;
-import android.view.View.OnClickListener;
+import android.widget.ScrollView;
import java.util.ArrayList;
import java.util.List;
@@ -66,6 +68,10 @@
private final List<TestSensorEvent> mStepCounterEvents = new ArrayList<TestSensorEvent>();
private final List<TestSensorEvent> mStepDetectorEvents = new ArrayList<TestSensorEvent>();
+ /**
+ * A flag that indicates if the test is interested in registering steps reported by the
+ * operator. The registration of events happens by tapping the screen throughout the test.
+ */
private volatile boolean mCheckForMotion;
@Override
@@ -74,16 +80,24 @@
mSensorStepCounter = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);
mSensorStepDetector = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR);
- View screen = findViewById(R.id.log_layout);
- screen.setOnClickListener(new OnClickListener() {
+ if (mSensorStepCounter == null && mSensorStepDetector == null) {
+ throw new SensorTestStateNotSupportedException(
+ "Sensors Step Counter/Detector are not supported.");
+ }
+
+ ScrollView scrollView = (ScrollView) findViewById(R.id.log_scroll_view);
+ scrollView.setOnTouchListener(new View.OnTouchListener() {
@Override
- public void onClick(View v) {
+ public boolean onTouch(View v, MotionEvent event) {
+ // during movement of the device, the ScrollView will detect user taps as attempts
+ // to scroll, when in reality they are taps in the layout
+ // to overcome the fact that a ScrollView cannot be disabled from scrolling, we
+ // listen for ACTION_UP events instead of click events in the child layout
long elapsedTime = SystemClock.elapsedRealtimeNanos();
- if (mCheckForMotion) {
- playSound();
- mTimestampsUserReported.add(SystemClock.elapsedRealtimeNanos());
- appendText(getString(R.string.snsr_step_reported, elapsedTime));
+ if (event.getAction() == MotionEvent.ACTION_UP) {
+ logUserReportedStep(elapsedTime);
}
+ return false;
}
});
}
@@ -123,8 +137,8 @@
mMoveDetected = false;
mCheckForMotion = false;
- appendText(instructionsResId);
- waitForUser();
+ getTestLogger().logInstructions(instructionsResId);
+ waitForUserToBegin();
mCheckForMotion = (expectedSteps > 0);
if (vibrate) {
@@ -140,7 +154,7 @@
return verifyMeasurements(expectedSteps);
}
- private void startMeasurements() throws Throwable {
+ private void startMeasurements() {
if (mSensorStepCounter != null) {
mSensorManager.registerListener(this, mSensorStepCounter,
SensorManager.SENSOR_DELAY_NORMAL);
@@ -160,7 +174,7 @@
mMovementDetectorHelper.start();
}
- private String verifyMeasurements(int stepsExpected) throws Throwable {
+ private String verifyMeasurements(int stepsExpected) {
mSensorManager.unregisterListener(this);
mMovementDetectorHelper.stop();
@@ -184,8 +198,12 @@
}
private void verifyStepCounterMeasurements() {
- final int userReportedSteps = mTimestampsUserReported.size();
+ if (mSensorStepCounter == null) {
+ // sensor not supported, so no-op
+ return;
+ }
+ final int userReportedSteps = mTimestampsUserReported.size();
int totalStepsCounted = 0;
int initialStepCount = -1;
for (TestSensorEvent counterEvent : mStepCounterEvents) {
@@ -255,8 +273,12 @@
}
private void verifyStepDetectorMeasurements() {
- final int userReportedSteps = mTimestampsUserReported.size();
+ if (mSensorStepDetector == null) {
+ // sensor not supported, so no-op
+ return;
+ }
+ final int userReportedSteps = mTimestampsUserReported.size();
int stepsDetected = mStepDetectorEvents.size();
int stepsDetectedDelta = Math.abs(stepsDetected - userReportedSteps);
String stepsDetectedMessage = getString(
@@ -299,16 +321,25 @@
int type = event.sensor.getType();
if (type == Sensor.TYPE_STEP_COUNTER) {
mStepCounterEvents.add(new TestSensorEvent(event, elapsedRealtimeNanos));
- String counterMessage = getString(
+ getTestLogger().logMessage(
R.string.snsr_step_counter_event,
elapsedRealtimeNanos,
(int) event.values[0]);
- appendText(counterMessage);
} else if (type == Sensor.TYPE_STEP_DETECTOR) {
mStepDetectorEvents.add(new TestSensorEvent(event, elapsedRealtimeNanos));
- appendText(getString(R.string.snsr_step_detector_event, elapsedRealtimeNanos));
+ getTestLogger().logMessage(R.string.snsr_step_detector_event, elapsedRealtimeNanos);
}
// TODO: with delayed assertions check events of other types are tracked
}
+
+ private void logUserReportedStep(long timestamp) {
+ if (!mCheckForMotion) {
+ return;
+ }
+
+ playSound();
+ mTimestampsUserReported.add(timestamp);
+ getTestLogger().logMessage(R.string.snsr_step_reported, timestamp);
+ }
}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/BaseSensorSemiAutomatedTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/BaseSensorSemiAutomatedTestActivity.java
index 7f32a07..9f2f5c4 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/BaseSensorSemiAutomatedTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/BaseSensorSemiAutomatedTestActivity.java
@@ -18,7 +18,7 @@
import com.android.cts.verifier.sensors.reporting.SensorTestDetails;
-import android.hardware.cts.helpers.SensorNotSupportedException;
+import android.hardware.cts.helpers.SensorTestStateNotSupportedException;
/**
* Base class to author a single Sensor semi-automated test case.
@@ -37,8 +37,8 @@
SensorTestDetails.ResultCode resultCode = SensorTestDetails.ResultCode.PASS;
try {
onRun();
- } catch(SensorNotSupportedException e) {
- // the sensor is not supported/available in the device, log a warning and skip the test
+ } catch(SensorTestStateNotSupportedException e) {
+ // the sensor state is not supported in the device, log a warning and skip the test
resultCode = SensorTestDetails.ResultCode.SKIPPED;
summary = e.getMessage();
} catch(Throwable e) {
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/BaseSensorTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/BaseSensorTestActivity.java
index 2938dff..d4ef516 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/BaseSensorTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/BaseSensorTestActivity.java
@@ -28,6 +28,7 @@
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
+import android.hardware.cts.helpers.SensorTestStateNotSupportedException;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Vibrator;
@@ -143,12 +144,18 @@
@Override
public void run() {
SensorTestDetails testDetails = null;
+ mSensorFeaturesDeactivator.requestDeactivationOfFeatures();
try {
activitySetUp();
- } catch (Throwable e) {
+ } catch (SensorTestStateNotSupportedException e) {
testDetails = new SensorTestDetails(
getTestClassName(),
SensorTestDetails.ResultCode.SKIPPED,
+ e.getMessage());
+ } catch (Throwable e) {
+ testDetails = new SensorTestDetails(
+ getTestClassName(),
+ SensorTestDetails.ResultCode.FAIL,
"[ActivitySetUp] " + e.getMessage());
}
@@ -167,6 +174,7 @@
SensorTestDetails.ResultCode.FAIL,
"[ActivityCleanUp] " + e.getMessage());
}
+ mSensorFeaturesDeactivator.requestToRestoreFeatures();
mTestLogger.logInstructions(R.string.snsr_test_complete);
// log to screen and save the overall test summary (activity level)
@@ -200,26 +208,6 @@
protected abstract SensorTestDetails executeTests();
/**
- * Guides the operator throughout the process of deactivating features that are known to use
- * Sensor data.
- *
- * @throws InterruptedException
- */
- protected void deactivateSensorFeatures() throws InterruptedException {
- mSensorFeaturesDeactivator.requestDeactivationOfFeatures();
- }
-
- /**
- * Guides the operator throughout the process of restoring the state of features that are known
- * to use Sensor data, to their original state.
- *
- * @throws InterruptedException
- */
- protected void restoreSensorFeatures() throws InterruptedException {
- mSensorFeaturesDeactivator.requestToRestoreFeatures();
- }
-
- /**
* Guides the operator throughout the process of setting the Screen Off timeout to a required
* value.
*
@@ -402,6 +390,12 @@
textAppender.append();
}
+ public void logMessage(int messageResId, Object ... params) {
+ TextAppender textAppender = new TextAppender(R.layout.snsr_message);
+ textAppender.setText(getString(messageResId, params));
+ textAppender.append();
+ }
+
public void logTestDetails(SensorTestDetails testDetails) {
String name = testDetails.getName();
String summary = testDetails.getSummary();
@@ -539,11 +533,15 @@
}
@Override
- public void launchAndWaitForSubactivity(String action) throws InterruptedException {
+ public void launchAndWaitForSubactivity(String action) {
mCountDownLatch = new CountDownLatch(1);
Intent intent = new Intent(action);
startActivityForResult(intent, SENSOR_FEATURES_DEACTIVATOR_RESULT);
- mCountDownLatch.await();
+ try {
+ mCountDownLatch.await();
+ } catch (InterruptedException e) {
+ Log.e(LOG_TAG, "Error waiting for sub-activity.", e);
+ }
}
public void onActivityResult() {
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsTestActivity.java
index 1479248..6bdc8d2 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsTestActivity.java
@@ -20,10 +20,11 @@
import com.android.cts.verifier.R;
import com.android.cts.verifier.sensors.reporting.SensorTestDetails;
-import junit.framework.TestResult;
+import junit.framework.Test;
import junit.framework.TestSuite;
import org.junit.internal.runners.JUnit38ClassRunner;
+import org.junit.internal.runners.SuiteMethod;
import org.junit.runner.Computer;
import org.junit.runner.Description;
import org.junit.runner.JUnitCore;
@@ -93,27 +94,35 @@
}
/**
- * A {@link RunnerBuilder} that is used to inject during execution a {@link SensorTestSuite}.
+ * A {@link RunnerBuilder} that is used to inject during execution a {@link SensorCtsTestSuite}.
*/
private class SensorRunnerBuilder extends RunnerBuilder {
@Override
public Runner runnerForClass(Class<?> testClass) throws Throwable {
- TestSuite testSuite = new SensorTestSuite(testClass);
- return new JUnit38ClassRunner(testSuite);
- }
- }
-
- /**
- * A {@link TestSuite} that is used to inject during execution a {@link SensorCtsTestResult}.
- */
- private class SensorTestSuite extends TestSuite {
- public SensorTestSuite(Class<?> testClass) {
- super(testClass);
+ TestSuite testSuite;
+ if (hasSuiteMethod(testClass)) {
+ Test test = SuiteMethod.testFromSuiteMethod(testClass);
+ if (test instanceof TestSuite) {
+ testSuite = (TestSuite) test;
+ } else {
+ throw new IllegalArgumentException(
+ testClass.getName() + "#suite() did not return a TestSuite.");
+ }
+ } else {
+ testSuite = new TestSuite(testClass);
+ }
+ SensorCtsTestSuite sensorTestSuite =
+ new SensorCtsTestSuite(getApplicationContext(), testSuite);
+ return new JUnit38ClassRunner(sensorTestSuite);
}
- @Override
- public void run(TestResult testResult) {
- super.run(new SensorCtsTestResult(getApplicationContext(), testResult));
+ private boolean hasSuiteMethod(Class testClass) {
+ try {
+ testClass.getMethod("suite");
+ return true;
+ } catch (NoSuchMethodException e) {
+ return false;
+ }
}
}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsTestResult.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsTestResult.java
index d07b4c4..851d405 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsTestResult.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsTestResult.java
@@ -124,6 +124,7 @@
if (testCase instanceof SensorTestCase) {
SensorTestCase sensorTestCase = (SensorTestCase) testCase;
sensorTestCase.setContext(mContext);
+ sensorTestCase.setEmulateSensorUnderLoad(false);
// TODO: set delayed assertion provider
} else {
throw new IllegalStateException("TestCase must be an instance of SensorTestCase.");
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsTestSuite.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsTestSuite.java
new file mode 100644
index 0000000..bbf76a7
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsTestSuite.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2014 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.sensors.base;
+
+import junit.framework.Test;
+import junit.framework.TestResult;
+import junit.framework.TestSuite;
+
+import android.content.Context;
+
+import java.util.Enumeration;
+
+/**
+ * A wrapper class for a {@link TestSuite}.
+ *
+ * It provides a way to inject a {@link SensorCtsTestResult} during execution.
+ */
+class SensorCtsTestSuite extends TestSuite {
+ private final Context mContext;
+ private final TestSuite mWrappedTestSuite;
+
+ public SensorCtsTestSuite(Context context, TestSuite testSuite) {
+ mContext = context;
+ mWrappedTestSuite = testSuite;
+ }
+
+ @Override
+ public void run(TestResult testResult) {
+ mWrappedTestSuite.run(new SensorCtsTestResult(mContext, testResult));
+ }
+
+ @Override
+ public void addTest(Test test) {
+ mWrappedTestSuite.addTest(test);
+ }
+
+ @Override
+ public int countTestCases() {
+ return mWrappedTestSuite.countTestCases();
+ }
+
+ @Override
+ public String getName() {
+ return mWrappedTestSuite.getName();
+ }
+
+ @Override
+ public void runTest(Test test, TestResult testResult) {
+ mWrappedTestSuite.runTest(test, testResult);
+ }
+
+ @Override
+ public void setName(String name) {
+ mWrappedTestSuite.setName(name);
+ }
+
+ @Override
+ public Test testAt(int index) {
+ return mWrappedTestSuite.testAt(index);
+ }
+
+ @Override
+ public int testCount() {
+ return mWrappedTestSuite.testCount();
+ }
+
+ @Override
+ public Enumeration<Test> tests() {
+ return mWrappedTestSuite.tests();
+ }
+
+ @Override
+ public String toString() {
+ return mWrappedTestSuite.toString();
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsVerifierTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsVerifierTestActivity.java
index 5987036..148e457 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsVerifierTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsVerifierTestActivity.java
@@ -19,7 +19,7 @@
import com.android.cts.verifier.sensors.reporting.SensorTestDetails;
-import android.hardware.cts.helpers.SensorNotSupportedException;
+import android.hardware.cts.helpers.SensorTestStateNotSupportedException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
@@ -114,7 +114,7 @@
// get the inner exception, because we use reflection APIs to execute the test
Throwable cause = e.getCause();
testSummary = cause.getMessage();
- if (cause instanceof SensorNotSupportedException) {
+ if (cause instanceof SensorTestStateNotSupportedException) {
testResultCode = SensorTestDetails.ResultCode.SKIPPED;
++mTestSkippedCounter;
} else {
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/helpers/SensorFeaturesDeactivator.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/helpers/SensorFeaturesDeactivator.java
index 48b069d..ed29e4c 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/helpers/SensorFeaturesDeactivator.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/helpers/SensorFeaturesDeactivator.java
@@ -52,7 +52,7 @@
ContentResolver getContentResolver();
void logInstructions(int instructionsResId, Object ... params);
void waitForUser();
- void launchAndWaitForSubactivity(String action) throws InterruptedException;
+ void launchAndWaitForSubactivity(String action);
String getString(int resId, Object ... params);
}
@@ -65,7 +65,7 @@
mLocationMode = new LocationModeSettingContainer();
}
- public synchronized void requestDeactivationOfFeatures() throws InterruptedException {
+ public synchronized void requestDeactivationOfFeatures() {
captureInitialState();
mAirplaneMode.requestToSetMode(true);
@@ -80,7 +80,7 @@
mActivityHandler.waitForUser();
}
- public synchronized void requestToRestoreFeatures() throws InterruptedException {
+ public synchronized void requestToRestoreFeatures() {
if (!isInitialStateCaptured()) {
return;
}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/helpers/SensorSettingContainer.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/helpers/SensorSettingContainer.java
index aa73d6c..00a96b5 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/helpers/SensorSettingContainer.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/helpers/SensorSettingContainer.java
@@ -47,7 +47,7 @@
mCapturedModeOn = getCurrentSettingMode();
}
- public synchronized void requestToSetMode(boolean modeOn) throws InterruptedException {
+ public synchronized void requestToSetMode(boolean modeOn) {
String settingName = mActivityHandler.getString(mSettingNameResId);
if (getCurrentSettingMode() == modeOn) {
mActivityHandler.logInstructions(R.string.snsr_setting_mode_set, settingName, modeOn);
@@ -66,7 +66,7 @@
}
}
- public synchronized void requestToResetMode() throws InterruptedException {
+ public synchronized void requestToResetMode() {
try {
requestToSetMode(mCapturedModeOn);
} catch (IllegalStateException e) {
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/reporting/SensorTestDetails.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/reporting/SensorTestDetails.java
index 9a9b1cb..6ca4e30 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/reporting/SensorTestDetails.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/reporting/SensorTestDetails.java
@@ -64,7 +64,7 @@
public SensorTestDetails(Context context, String name, Result result) {
this(context,
name,
- result.getRunCount(),
+ result.getRunCount() - result.getFailureCount() - result.getIgnoreCount(),
result.getIgnoreCount(),
result.getFailureCount());
}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/telecom/BasicCallTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/telecom/BasicCallTestActivity.java
deleted file mode 100644
index 2924ac5..0000000
--- a/apps/CtsVerifier/src/com/android/cts/verifier/telecom/BasicCallTestActivity.java
+++ /dev/null
@@ -1,149 +0,0 @@
-package com.android.cts.verifier.telecom;
-
-import com.android.cts.verifier.R;
-
-import android.net.Uri;
-import android.os.SystemClock;
-import android.telecom.Connection;
-import android.telecom.ConnectionRequest;
-import android.telecom.PhoneAccountHandle;
-import android.telecom.RemoteConnection;
-import android.telecom.StatusHints;
-
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Tests that a basic call with RemoteConnections will go through. When this ConnectionService is
- * notified of an outgoing call, it will create a Connection which wraps a RemoteConnection. Then,
- * once the RemoteConnection starts dialing, it will disconnect the call and the test will pass.
- */
-public class BasicCallTestActivity extends TelecomBaseTestActivity {
- private static final Semaphore sLock = new Semaphore(0);
-
- @Override
- protected int getTestTitleResource() {
- return R.string.telecom_basic_call_title;
- }
-
- @Override
- protected int getTestInfoResource() {
- return R.string.telecom_basic_call_info;
- }
-
- @Override
- protected Class<? extends android.telecom.ConnectionService> getConnectionService() {
- return ConnectionService.class;
- }
-
- @Override
- protected String getConnectionServiceLabel() {
- return "Basic Call Manager";
- }
-
- @Override
- protected boolean onCallPlacedBackgroundThread() {
- try {
- if (!sLock.tryAcquire(5000, TimeUnit.MILLISECONDS)) {
- return false;
- }
-
- // Wait for the listeners to be fired so the call is cleaned up.
- SystemClock.sleep(1000);
-
- return !getTelecomManager().isInCall();
- } catch (Exception e) {
- return false;
- }
- }
-
- public static class ConnectionService extends android.telecom.ConnectionService {
- @Override
- public Connection onCreateOutgoingConnection(
- PhoneAccountHandle connectionManagerPhoneAccount,
- ConnectionRequest request) {
- RemoteConnection remoteConnection =
- createRemoteOutgoingConnection(connectionManagerPhoneAccount, request);
- return new ProxyConnection(remoteConnection);
- }
- }
-
- private static class ProxyConnection extends Connection {
- private final RemoteConnection mRemoteConnection;
-
- private final RemoteConnection.Callback mCallback = new RemoteConnection.Callback() {
- @Override
- public void onStateChanged(RemoteConnection connection, int state) {
- switch (state) {
- case Connection.STATE_ACTIVE:
- setActive();
- break;
- case Connection.STATE_DIALING:
- setDialing();
- break;
- case Connection.STATE_DISCONNECTED:
- sLock.release();
- break;
- case Connection.STATE_HOLDING:
- setOnHold();
- break;
- case Connection.STATE_INITIALIZING:
- setInitializing();
- break;
- case Connection.STATE_NEW:
- setInitialized();
- break;
- case Connection.STATE_RINGING:
- setRinging();
- break;
- }
- }
-
- @Override
- public void onDisconnected(RemoteConnection connection, int disconnectCauseCode,
- String disconnectCauseMessage) {
- setDisconnected(disconnectCauseCode, disconnectCauseMessage);
- }
-
- @Override
- public void onStatusHintsChanged(RemoteConnection connection, StatusHints statusHints) {
- setStatusHints(statusHints);
- }
-
- @Override
- public void onAddressChanged(RemoteConnection connection, Uri address, int presentation) {
- setAddress(address, presentation);
- }
-
- @Override
- public void onCallerDisplayNameChanged(RemoteConnection connection,
- String callerDisplayName,
- int presentation) {
- setCallerDisplayName(callerDisplayName, presentation);
- }
-
- @Override
- public void onDestroyed(RemoteConnection connection) {
- destroy();
- }
- };
-
- public ProxyConnection(RemoteConnection connection) {
- mRemoteConnection = connection;
- if (connection.getState() == Connection.STATE_DISCONNECTED) {
- sLock.release();
- } else {
- mRemoteConnection.registerCallback(mCallback);
- }
- }
-
- @Override
- public void onStateChanged(int state) {
- if (state == Connection.STATE_DIALING) {
- // Good enough; let's disconnect this call.
- mRemoteConnection.disconnect();
- sLock.release();
- }
- }
- }
-}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/telecom/CancelCallTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/telecom/CancelCallTestActivity.java
deleted file mode 100644
index 58d71ce..0000000
--- a/apps/CtsVerifier/src/com/android/cts/verifier/telecom/CancelCallTestActivity.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2014 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.telecom;
-
-import android.os.SystemClock;
-import android.telecom.Connection;
-import android.telecom.ConnectionRequest;
-import android.telecom.PhoneAccountHandle;
-
-import com.android.cts.verifier.R;
-
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Tests that a call can be canceled by a ConnectionService (and that the cancelation is respected).
- * Once the ConnectionService returns a canceled connection, the test verifies that Telecomm does
- * not have any active calls. If this is the case, the test will pass.
- */
-public class CancelCallTestActivity extends TelecomBaseTestActivity {
- private static final Semaphore sLock = new Semaphore(0);
-
- @Override
- protected int getTestTitleResource() {
- return R.string.telecom_cancel_call_title;
- }
-
- @Override
- protected int getTestInfoResource() {
- return R.string.telecom_cancel_call_info;
- }
-
- @Override
- protected Class<? extends android.telecom.ConnectionService> getConnectionService() {
- return ConnectionService.class;
- }
-
- @Override
- protected String getConnectionServiceLabel() {
- return "Call Cancel Manager";
- }
-
- @Override
- protected boolean onCallPlacedBackgroundThread() {
- try {
- if (!sLock.tryAcquire(1000, TimeUnit.MILLISECONDS)) {
- return false;
- }
-
- // Wait for the listeners to be fired so the call is cleaned up.
- SystemClock.sleep(1000);
-
- // Make sure that there aren't any ongoing calls.
- return !getTelecomManager().isInCall();
- } catch (Exception e) {
- return false;
- }
- }
-
- public static class ConnectionService extends android.telecom.ConnectionService {
- @Override
- public Connection onCreateOutgoingConnection(
- PhoneAccountHandle connectionManagerPhoneAccount,
- ConnectionRequest request) {
- sLock.release();
- return Connection.createCanceledConnection();
- }
- }
-}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/telecom/FailedCallTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/telecom/FailedCallTestActivity.java
deleted file mode 100644
index a7ba7b0..0000000
--- a/apps/CtsVerifier/src/com/android/cts/verifier/telecom/FailedCallTestActivity.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (C) 2014 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.telecom;
-
-import android.os.SystemClock;
-import android.telecom.Connection;
-import android.telecom.ConnectionRequest;
-import android.telecom.PhoneAccountHandle;
-import android.telephony.DisconnectCause;
-
-import com.android.cts.verifier.R;
-
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Tests that a connection manager can fail calls and they're handled appropriately. That is, when
- * a call is failed, it will not go through. The flow here is that the ConnectionService will say
- * that the call failed because it's busy, and then make sure that there are no active calls. If
- * this is the case, the test will pass.
- */
-public class FailedCallTestActivity extends TelecomBaseTestActivity {
- private static final Semaphore sLock = new Semaphore(0);
-
- @Override
- protected int getTestTitleResource() {
- return R.string.telecom_failed_call_title;
- }
-
- @Override
- protected int getTestInfoResource() {
- return R.string.telecom_failed_call_info;
- }
-
- @Override
- protected Class<? extends android.telecom.ConnectionService> getConnectionService() {
- return ConnectionService.class;
- }
-
- @Override
- protected String getConnectionServiceLabel() {
- return "Call Failed Manager";
- }
-
- @Override
- protected boolean onCallPlacedBackgroundThread() {
- try {
- if (!sLock.tryAcquire(1000, TimeUnit.MILLISECONDS)) {
- return false;
- }
-
- // Wait for the listeners to be fired so the call is cleaned up.
- SystemClock.sleep(1000);
-
- // Make sure that there aren't any ongoing calls.
- return !getTelecomManager().isInCall();
- } catch (Exception e) {
- return false;
- }
- }
-
- public static class ConnectionService extends android.telecom.ConnectionService {
- @Override
- public Connection onCreateOutgoingConnection(
- PhoneAccountHandle connectionManagerPhoneAccount,
- ConnectionRequest request) {
- sLock.release();
- return Connection.createFailedConnection(DisconnectCause.BUSY,
- "Test; no need to continue");
- }
- }
-}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/telecom/TelecomBaseTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/telecom/TelecomBaseTestActivity.java
deleted file mode 100644
index 03a986b..0000000
--- a/apps/CtsVerifier/src/com/android/cts/verifier/telecom/TelecomBaseTestActivity.java
+++ /dev/null
@@ -1,120 +0,0 @@
-package com.android.cts.verifier.telecom;
-
-import android.content.ComponentName;
-import android.content.Intent;
-import android.net.Uri;
-import android.os.Bundle;
-import android.telecom.ConnectionService;
-import android.telecom.PhoneAccount;
-import android.telecom.PhoneAccountHandle;
-import android.telecom.TelecomManager;
-import android.view.View;
-import android.widget.Button;
-import android.widget.EditText;
-
-import com.android.cts.verifier.PassFailButtons;
-import com.android.cts.verifier.R;
-
-import java.util.Objects;
-
-public abstract class TelecomBaseTestActivity extends PassFailButtons.Activity {
- protected PhoneAccountHandle mPhoneAccountHandle;
-
- private Button mOpenSettingsBtn;
- private Button mPlaceCallBtn;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- setResult(RESULT_CANCELED);
- setContentView(R.layout.telecom_test_activity);
- setPassFailButtonClickListeners();
- setInfoResources(getTestTitleResource(), getTestInfoResource(), 0);
-
- mOpenSettingsBtn = (Button) findViewById(R.id.open_settings);
- mOpenSettingsBtn.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mPhoneAccountHandle = new PhoneAccountHandle(
- new ComponentName(getApplicationContext(), getConnectionService()),
- getClass().getSimpleName()
- );
- PhoneAccount account = new PhoneAccount.Builder(mPhoneAccountHandle,
- getConnectionServiceLabel())
- .setCapabilities(PhoneAccount.CAPABILITY_CONNECTION_MANAGER)
- .build();
-
- getTelecomManager().registerPhoneAccount(account);
-
- Intent i = new Intent(TelecomManager.ACTION_CHANGE_PHONE_ACCOUNTS);
- startActivity(i);
- }
- });
-
- mPlaceCallBtn = (Button) findViewById(R.id.simulate_call);
- mPlaceCallBtn.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- runTest();
- }
- });
- }
-
- @Override
- protected void onResume() {
- super.onResume();
-
- PhoneAccountHandle defaultConnectionManager = getTelecomManager().getConnectionManager();
- boolean isDefaultConnectionManager = mPhoneAccountHandle != null &&
- Objects.equals(mPhoneAccountHandle, defaultConnectionManager);
- mOpenSettingsBtn.setEnabled(!isDefaultConnectionManager);
- mPlaceCallBtn.setEnabled(isDefaultConnectionManager);
- }
-
- abstract protected int getTestTitleResource();
-
- abstract protected int getTestInfoResource();
-
- abstract protected Class<? extends ConnectionService> getConnectionService();
-
- abstract protected String getConnectionServiceLabel();
-
- /**
- * Perform any tests once the call has been placed. This is called from a background thread, so
- * it is safe to block until the result is known.
- *
- * @return True if the test passed.
- */
- abstract protected boolean onCallPlacedBackgroundThread();
-
- protected void runTest() {
- new Thread() {
- @Override
- public void run() {
- EditText phoneNumberEdit = (EditText) findViewById(R.id.phone_number);
- String numberText = phoneNumberEdit.getText().toString();
- Uri number = Uri.fromParts("tel", numberText, null);
-
- Intent call = new Intent(Intent.ACTION_CALL);
- call.setData(number);
- startActivity(call);
-
- boolean passed = onCallPlacedBackgroundThread();
- setTestResultAndFinish(passed);
- }
- }.start();
- }
-
- protected TelecomManager getTelecomManager() {
- return (TelecomManager) getSystemService(TELECOM_SERVICE);
- }
-
- @Override
- public void setTestResultAndFinish(boolean passed) {
- super.setTestResultAndFinish(passed);
- if (mPhoneAccountHandle != null) {
- getTelecomManager().unregisterPhoneAccount(mPhoneAccountHandle);
- }
- }
-}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/telecom/TelecomTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/telecom/TelecomTestActivity.java
deleted file mode 100644
index 3f7596a..0000000
--- a/apps/CtsVerifier/src/com/android/cts/verifier/telecom/TelecomTestActivity.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2014 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.telecom;
-
-import com.android.cts.verifier.ManifestTestListAdapter;
-import com.android.cts.verifier.PassFailButtons;
-import com.android.cts.verifier.R;
-
-import android.os.Bundle;
-
-public class TelecomTestActivity extends PassFailButtons.TestListActivity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.pass_fail_list);
- setPassFailButtonClickListeners();
- setInfoResources(R.string.telecom_test_title, R.string.telecom_test_summary, -1);
-
- setTestListAdapter(new ManifestTestListAdapter(this, getClass().getName()));
- }
-}
diff --git a/build/test_executable.mk b/build/test_executable.mk
index 1439663..5cccd1c 100644
--- a/build/test_executable.mk
+++ b/build/test_executable.mk
@@ -41,5 +41,4 @@
-p $(PRIVATE_TEST_PACKAGE) \
-e $(CTS_EXPECTATIONS) \
-b $(CTS_UNSUPPORTED_ABIS) \
- -a $(TARGET_ARCH) \
-o $@
diff --git a/build/test_gtest_package.mk b/build/test_gtest_package.mk
index eeb8bbe..c3471ed 100644
--- a/build/test_gtest_package.mk
+++ b/build/test_gtest_package.mk
@@ -50,5 +50,4 @@
-p $(PRIVATE_TEST_PACKAGE) \
-e $(CTS_EXPECTATIONS) \
-b $(CTS_UNSUPPORTED_ABIS) \
- -a $(TARGET_ARCH) \
-o $@
diff --git a/build/test_host_java_library.mk b/build/test_host_java_library.mk
index c502b83..cb44010 100644
--- a/build/test_host_java_library.mk
+++ b/build/test_host_java_library.mk
@@ -36,5 +36,4 @@
-p $(PRIVATE_TEST_PACKAGE) \
-e $(CTS_EXPECTATIONS) \
-b $(CTS_UNSUPPORTED_ABIS) \
- -a $(TARGET_ARCH) \
-o $@
diff --git a/build/test_package.mk b/build/test_package.mk
index 97f9c43..7f61e60 100644
--- a/build/test_package.mk
+++ b/build/test_package.mk
@@ -58,5 +58,4 @@
-p $(PRIVATE_TEST_PACKAGE) \
-e $(CTS_EXPECTATIONS) \
-b $(CTS_UNSUPPORTED_ABIS) \
- -a $(TARGET_ARCH) \
-o $@
diff --git a/build/test_target_java_library.mk b/build/test_target_java_library.mk
index 204bddc..d526805 100644
--- a/build/test_target_java_library.mk
+++ b/build/test_target_java_library.mk
@@ -41,6 +41,5 @@
-p $(PRIVATE_TEST_PACKAGE) \
-e $(CTS_EXPECTATIONS) \
-b $(CTS_UNSUPPORTED_ABIS) \
- -a $(TARGET_ARCH) \
-x "runtimeArgs->$(PRIVATE_RUNTIME_ARGS)" \
-o $@
diff --git a/build/test_uiautomator.mk b/build/test_uiautomator.mk
index be78f6c..7757027 100644
--- a/build/test_uiautomator.mk
+++ b/build/test_uiautomator.mk
@@ -49,5 +49,4 @@
-r $(PRIVATE_TEST_APP_PACKAGE) \
-e $(CTS_EXPECTATIONS) \
-b $(CTS_UNSUPPORTED_ABIS) \
- -a $(TARGET_ARCH) \
-o $@
diff --git a/development/ide/eclipse/.classpath b/development/ide/eclipse/.classpath
index b95d52a..fafcc32 100644
--- a/development/ide/eclipse/.classpath
+++ b/development/ide/eclipse/.classpath
@@ -1,25 +1,46 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="lib" path="prebuilt/common/ddmlib/ddmlib-prebuilt.jar"/>
- <classpathentry kind="lib" path="prebuilt/common/tradefed/tradefed-prebuilt.jar"/>
+ <classpathentry kind="lib" path="prebuilts/misc/common/ddmlib/ddmlib-prebuilt.jar"/>
+ <classpathentry kind="lib" path="prebuilts/misc/common/tradefed/tradefed-prebuilt.jar"/>
<classpathentry kind="src" path="cts/apps/CtsVerifier/src"/>
- <classpathentry kind="src" path="cts/apps/CtsVerifier/tests/src"/>
<classpathentry kind="src" path="cts/hostsidetests/appsecurity/src"/>
<classpathentry kind="src" path="cts/hostsidetests/appsecurity/test-apps/AppWithData/src"/>
<classpathentry kind="src" path="cts/hostsidetests/monkey/src"/>
<classpathentry kind="src" path="cts/hostsidetests/monkey/test-apps/CtsMonkeyApp/src"/>
<classpathentry kind="src" path="cts/hostsidetests/monkey/test-apps/CtsMonkeyApp2/src"/>
+ <classpathentry kind="src" path="cts/hostsidetests/sample/src"/>
+ <classpathentry kind="src" path="cts/hostsidetests/sample/app/src"/>
+ <classpathentry kind="src" path="cts/hostsidetests/theme/src"/>
+ <classpathentry kind="src" path="cts/hostsidetests/theme/app/src"/>
+ <classpathentry kind="src" path="cts/hostsidetests/usb/src"/>
<classpathentry kind="src" path="cts/libs/vogar-expect/src"/>
- <classpathentry kind="src" path="cts/tests/ApiDemosReferenceTest/src"/>
+ <classpathentry kind="src" path="cts/libs/commonutil/src"/>
+ <classpathentry kind="src" path="cts/libs/deviceutil/src"/>
+ <classpathentry kind="src" path="cts/libs/json/src"/>
+ <classpathentry kind="src" path="cts/libs/testserver/src"/>
+ <classpathentry kind="src" path="cts/libs/wrappedgtest/src"/>
+ <classpathentry kind="src" path="cts/suite/cts/deviceTests/browserbench/src"/>
+ <classpathentry kind="src" path="cts/suite/cts/deviceTests/dram/src"/>
+ <classpathentry kind="src" path="cts/suite/cts/deviceTests/filesystemperf/src"/>
+ <classpathentry kind="src" path="cts/suite/cts/deviceTests/opengl/src"/>
+ <classpathentry kind="src" path="cts/suite/cts/deviceTests/simplecpu/src"/>
+ <classpathentry kind="src" path="cts/suite/cts/deviceTests/ui/src"/>
+ <classpathentry kind="src" path="cts/suite/cts/deviceTests/videoperf/src"/>
+ <classpathentry kind="src" path="cts/suite/cts/hostTests/jank/app/src"/>
+ <classpathentry kind="src" path="cts/suite/cts/hostTests/jank/src"/>
+ <classpathentry kind="src" path="cts/suite/cts/hostTests/uihost/appA/src"/>
+ <classpathentry kind="src" path="cts/suite/cts/hostTests/uihost/appB/src"/>
+ <classpathentry kind="src" path="cts/suite/cts/hostTests/uihost/control/src"/>
+ <classpathentry kind="src" path="cts/suite/cts/hostTests/uihost/src"/>
<classpathentry kind="src" path="cts/tests/ProcessTest/src"/>
<classpathentry kind="src" path="cts/tests/ProcessTest/NoShareUidApp/src"/>
<classpathentry kind="src" path="cts/tests/ProcessTest/ShareUidApp/src"/>
<classpathentry kind="src" path="cts/tests/SignatureTest/src"/>
<classpathentry kind="src" path="cts/tests/SignatureTest/tests/src"/>
<classpathentry kind="src" path="cts/tests/acceleration/src"/>
- <classpathentry kind="src" path="cts/tests/accessibilityservice/src"/>
<classpathentry kind="src" path="cts/tests/core/runner/src"/>
<classpathentry kind="src" path="cts/tests/deviceadmin/src"/>
+ <classpathentry kind="src" path="cts/tests/sample/src"/>
<classpathentry kind="src" path="cts/tests/src"/>
<classpathentry kind="src" path="cts/tests/tests/acceleration/src"/>
<classpathentry kind="src" path="cts/tests/tests/accessibility/src"/>
@@ -34,12 +55,10 @@
<classpathentry kind="src" path="cts/tests/tests/dpi/src"/>
<classpathentry kind="src" path="cts/tests/tests/dpi2/src"/>
<classpathentry kind="src" path="cts/tests/tests/drm/src"/>
- <classpathentry kind="src" path="cts/tests/tests/example/src"/>
<classpathentry kind="src" path="cts/tests/tests/gesture/src"/>
<classpathentry kind="src" path="cts/tests/tests/graphics/src"/>
<classpathentry kind="src" path="cts/tests/tests/graphics2/src"/>
<classpathentry kind="src" path="cts/tests/tests/hardware/src"/>
- <classpathentry kind="src" path="cts/tests/tests/holo/src"/>
<classpathentry kind="src" path="cts/tests/tests/jni/src"/>
<classpathentry kind="src" path="cts/tests/tests/location/src"/>
<classpathentry kind="src" path="cts/tests/tests/media/src"/>
@@ -48,11 +67,6 @@
<classpathentry kind="src" path="cts/tests/tests/opengl/src"/>
<classpathentry kind="src" path="cts/tests/tests/openglperf/src"/>
<classpathentry kind="src" path="cts/tests/tests/os/src"/>
- <classpathentry kind="src" path="cts/tests/tests/performance/src"/>
- <classpathentry kind="src" path="cts/tests/tests/performance2/src"/>
- <classpathentry kind="src" path="cts/tests/tests/performance3/src"/>
- <classpathentry kind="src" path="cts/tests/tests/performance4/src"/>
- <classpathentry kind="src" path="cts/tests/tests/performance5/src"/>
<classpathentry kind="src" path="cts/tests/tests/permission/src"/>
<classpathentry kind="src" path="cts/tests/tests/permission2/src"/>
<classpathentry kind="src" path="cts/tests/tests/preference/src"/>
@@ -64,7 +78,6 @@
<classpathentry kind="src" path="cts/tests/tests/telephony/src"/>
<classpathentry kind="src" path="cts/tests/tests/text/src"/>
<classpathentry kind="src" path="cts/tests/tests/textureview/src"/>
- <classpathentry kind="src" path="cts/tests/tests/theme/src"/>
<classpathentry kind="src" path="cts/tests/tests/util/src"/>
<classpathentry kind="src" path="cts/tests/tests/view/src"/>
<classpathentry kind="src" path="cts/tests/tests/webkit/src"/>
@@ -78,19 +91,11 @@
<classpathentry kind="src" path="cts/tools/dasm/src"/>
<classpathentry kind="src" path="cts/tools/device-setup/TestDeviceSetup/src"/>
<classpathentry kind="src" path="cts/tools/dex-tools/src"/>
- <classpathentry kind="src" path="cts/tools/dx-tests/src"/>
- <classpathentry kind="src" path="cts/tools/host/src"/>
- <classpathentry kind="src" path="cts/tools/host/test"/>
<classpathentry kind="src" path="cts/tools/signature-tools/src"/>
<classpathentry kind="src" path="cts/tools/signature-tools/test"/>
<classpathentry kind="src" path="cts/tools/tradefed-host/src"/>
<classpathentry kind="src" path="cts/tools/tradefed-host/tests/src"/>
<classpathentry kind="src" path="cts/tools/utils"/>
- <classpathentry kind="src" path="cts/tools/vm-tests/src"/>
+ <classpathentry kind="src" path="cts/tools/vm-tests-tf/src"/>
<classpathentry kind="src" path="external/easymock/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/CtsTestStubs_intermediates/src/renderscript/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>
diff --git a/hostsidetests/appsecurity/src/com/android/cts/appsecurity/AppSecurityTests.java b/hostsidetests/appsecurity/src/com/android/cts/appsecurity/AppSecurityTests.java
index 702002c..a0590d9 100644
--- a/hostsidetests/appsecurity/src/com/android/cts/appsecurity/AppSecurityTests.java
+++ b/hostsidetests/appsecurity/src/com/android/cts/appsecurity/AppSecurityTests.java
@@ -17,6 +17,7 @@
package com.android.cts.appsecurity;
import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.cts.util.AbiUtils;
import com.android.ddmlib.Log;
import com.android.ddmlib.testrunner.InstrumentationResultParser;
import com.android.ddmlib.testrunner.RemoteAndroidTestRunner;
@@ -29,6 +30,8 @@
import com.android.tradefed.result.TestResult.TestStatus;
import com.android.tradefed.result.TestRunResult;
import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IAbi;
+import com.android.tradefed.testtype.IAbiReceiver;
import com.android.tradefed.testtype.IBuildReceiver;
import java.io.File;
@@ -38,7 +41,7 @@
/**
* Set of tests that verify various security checks involving multiple apps are properly enforced.
*/
-public class AppSecurityTests extends DeviceTestCase implements IBuildReceiver {
+public class AppSecurityTests extends DeviceTestCase implements IAbiReceiver, IBuildReceiver {
private static final String RUNNER = "android.support.test.runner.AndroidJUnitRunner";
@@ -104,8 +107,14 @@
private static final String LOG_TAG = "AppSecurityTests";
+ private IAbi mAbi;
private CtsBuildHelper mCtsBuild;
+ @Override
+ public void setAbi(IAbi abi) {
+ mAbi = abi;
+ }
+
/**
* {@inheritDoc}
*/
@@ -136,12 +145,13 @@
getDevice().uninstallPackage(SHARED_UI_PKG);
getDevice().uninstallPackage(SHARED_UI_DIFF_CERT_PKG);
+ String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
String installResult = getDevice().installPackage(getTestAppFile(SHARED_UI_APK),
- false);
+ false, options);
assertNull(String.format("failed to install shared uid app, Reason: %s", installResult),
installResult);
installResult = getDevice().installPackage(getTestAppFile(SHARED_UI_DIFF_CERT_APK),
- false);
+ false, options);
assertNotNull("shared uid app with different cert than existing app installed " +
"successfully", installResult);
assertEquals("INSTALL_FAILED_SHARED_USER_INCOMPATIBLE", installResult);
@@ -162,12 +172,13 @@
// cleanup test app that might be installed from previous partial test run
getDevice().uninstallPackage(SIMPLE_APP_PKG);
+ String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
String installResult = getDevice().installPackage(getTestAppFile(SIMPLE_APP_APK),
- false);
+ false, options);
assertNull(String.format("failed to install simple app. Reason: %s", installResult),
installResult);
installResult = getDevice().installPackage(getTestAppFile(SIMPLE_APP_DIFF_CERT_APK),
- true /* reinstall */);
+ true /* reinstall */, options);
assertNotNull("app upgrade with different cert than existing app installed " +
"successfully", installResult);
assertEquals("INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES", installResult);
@@ -187,8 +198,9 @@
getDevice().uninstallPackage(APP_WITH_DATA_PKG);
getDevice().uninstallPackage(APP_ACCESS_DATA_PKG);
+ String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
String installResult = getDevice().installPackage(getTestAppFile(APP_WITH_DATA_APK),
- false);
+ false, options);
assertNull(String.format("failed to install app with data. Reason: %s", installResult),
installResult);
// run appwithdata's tests to create private data
@@ -196,7 +208,7 @@
APP_WITH_DATA_CLASS, APP_WITH_DATA_CREATE_METHOD));
installResult = getDevice().installPackage(getTestAppFile(APP_ACCESS_DATA_APK),
- false);
+ false, options);
assertNull(String.format("failed to install app access data. Reason: %s",
installResult), installResult);
// run appaccessdata's tests which attempt to access appwithdata's private data
@@ -216,8 +228,9 @@
wipePrimaryExternalStorage(getDevice());
getDevice().uninstallPackage(EXTERNAL_STORAGE_APP_PKG);
+ String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
assertNull(getDevice()
- .installPackage(getTestAppFile(EXTERNAL_STORAGE_APP_APK), false));
+ .installPackage(getTestAppFile(EXTERNAL_STORAGE_APP_APK), false, options));
assertTrue("Failed external storage with no permissions",
runDeviceTests(EXTERNAL_STORAGE_APP_PKG));
} finally {
@@ -235,8 +248,9 @@
wipePrimaryExternalStorage(getDevice());
getDevice().uninstallPackage(READ_EXTERNAL_STORAGE_APP_PKG);
+ String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
assertNull(getDevice()
- .installPackage(getTestAppFile(READ_EXTERNAL_STORAGE_APP_APK), false));
+ .installPackage(getTestAppFile(READ_EXTERNAL_STORAGE_APP_APK), false, options));
assertTrue("Failed external storage with read permissions",
runDeviceTests(READ_EXTERNAL_STORAGE_APP_PKG));
} finally {
@@ -254,8 +268,9 @@
wipePrimaryExternalStorage(getDevice());
getDevice().uninstallPackage(WRITE_EXTERNAL_STORAGE_APP_PKG);
+ String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
assertNull(getDevice()
- .installPackage(getTestAppFile(WRITE_EXTERNAL_STORAGE_APP_APK), false));
+ .installPackage(getTestAppFile(WRITE_EXTERNAL_STORAGE_APP_APK), false, options));
assertTrue("Failed external storage with write permissions",
runDeviceTests(WRITE_EXTERNAL_STORAGE_APP_PKG));
} finally {
@@ -274,12 +289,13 @@
getDevice().uninstallPackage(EXTERNAL_STORAGE_APP_PKG);
getDevice().uninstallPackage(READ_EXTERNAL_STORAGE_APP_PKG);
getDevice().uninstallPackage(WRITE_EXTERNAL_STORAGE_APP_PKG);
+ String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
assertNull(getDevice()
- .installPackage(getTestAppFile(EXTERNAL_STORAGE_APP_APK), false));
+ .installPackage(getTestAppFile(EXTERNAL_STORAGE_APP_APK), false, options));
assertNull(getDevice()
- .installPackage(getTestAppFile(READ_EXTERNAL_STORAGE_APP_APK), false));
+ .installPackage(getTestAppFile(READ_EXTERNAL_STORAGE_APP_APK), false, options));
assertNull(getDevice()
- .installPackage(getTestAppFile(WRITE_EXTERNAL_STORAGE_APP_APK), false));
+ .installPackage(getTestAppFile(WRITE_EXTERNAL_STORAGE_APP_APK), false, options));
assertTrue("Failed to write gifts", runDeviceTests(WRITE_EXTERNAL_STORAGE_APP_PKG,
WRITE_EXTERNAL_STORAGE_APP_CLASS, "doWriteGifts"));
@@ -305,8 +321,9 @@
// cleanup test app that might be installed from previous partial test run
getDevice().uninstallPackage(APP_WITH_DATA_PKG);
+ String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
String installResult = getDevice().installPackage(getTestAppFile(APP_WITH_DATA_APK),
- false);
+ false, options);
assertNull(String.format("failed to install app with data. Reason: %s", installResult),
installResult);
// run appwithdata's tests to create private data
@@ -316,7 +333,7 @@
getDevice().uninstallPackage(APP_WITH_DATA_PKG);
installResult = getDevice().installPackage(getTestAppFile(APP_WITH_DATA_APK),
- false);
+ false, options);
assertNull(String.format("failed to install app with data second time. Reason: %s",
installResult), installResult);
// run appwithdata's 'check if file exists' test
@@ -339,14 +356,15 @@
getDevice().uninstallPackage(TARGET_INSTRUMENT_PKG);
getDevice().uninstallPackage(INSTRUMENT_DIFF_CERT_PKG);
+ String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
String installResult = getDevice().installPackage(
- getTestAppFile(TARGET_INSTRUMENT_APK), false);
+ getTestAppFile(TARGET_INSTRUMENT_APK), false, options);
assertNull(String.format("failed to install target instrumentation app. Reason: %s",
installResult), installResult);
// the app will install, but will get error at runtime when starting instrumentation
installResult = getDevice().installPackage(getTestAppFile(INSTRUMENT_DIFF_CERT_APK),
- false);
+ false, options);
assertNull(String.format(
"failed to install instrumentation app with diff cert. Reason: %s",
installResult), installResult);
@@ -374,19 +392,20 @@
getDevice().uninstallPackage(DECLARE_PERMISSION_COMPAT_PKG);
getDevice().uninstallPackage(PERMISSION_DIFF_CERT_PKG);
+ String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
String installResult = getDevice().installPackage(
- getTestAppFile(DECLARE_PERMISSION_APK), false);
+ getTestAppFile(DECLARE_PERMISSION_APK), false, options);
assertNull(String.format("failed to install declare permission app. Reason: %s",
installResult), installResult);
installResult = getDevice().installPackage(
- getTestAppFile(DECLARE_PERMISSION_COMPAT_APK), false);
+ getTestAppFile(DECLARE_PERMISSION_COMPAT_APK), false, options);
assertNull(String.format("failed to install declare permission compat app. Reason: %s",
installResult), installResult);
// the app will install, but will get error at runtime
installResult = getDevice().installPackage(getTestAppFile(PERMISSION_DIFF_CERT_APK),
- false);
+ false, options);
assertNull(String.format("failed to install permission app with diff cert. Reason: %s",
installResult), installResult);
// run PERMISSION_DIFF_CERT_PKG tests which try to access the permission
@@ -421,8 +440,9 @@
// Install our test app
getDevice().uninstallPackage(MULTIUSER_STORAGE_PKG);
+ String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
final String installResult = getDevice()
- .installPackage(getTestAppFile(MULTIUSER_STORAGE_APK), false);
+ .installPackage(getTestAppFile(MULTIUSER_STORAGE_APK), false, options);
assertNull("Failed to install: " + installResult, installResult);
// Clear data from previous tests
diff --git a/tests/tests/telecomm/Android.mk b/hostsidetests/devicepolicy/Android.mk
similarity index 62%
copy from tests/tests/telecomm/Android.mk
copy to hostsidetests/devicepolicy/Android.mk
index de1d8b3..1f51494 100644
--- a/tests/tests/telecomm/Android.mk
+++ b/hostsidetests/devicepolicy/Android.mk
@@ -12,28 +12,21 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
-# don't include this package in any target
+LOCAL_MODULE := CtsDevicePolicyManagerTestCases
+
LOCAL_MODULE_TAGS := optional
-# and when built explicitly put it in the data partition
-LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-
-#LOCAL_JAVA_LIBRARIES := Telecomm
-
-LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
LOCAL_SRC_FILES := $(call all-java-files-under, src)
-LOCAL_PACKAGE_NAME := CtsTelecomTestCases
+LOCAL_JAVA_LIBRARIES := junit ddmlib-prebuilt tradefed-prebuilt tools-common-prebuilt cts-tradefed
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
+LOCAL_CTS_TEST_PACKAGE := android.adminhostside
-# uncomment when b/13250611 is fixed
-#LOCAL_SDK_VERSION := current
-LOCAL_JAVA_LIBRARIES += android.test.runner
+include $(BUILD_CTS_HOST_JAVA_LIBRARY)
-include $(BUILD_CTS_PACKAGE)
+# Build the test APKs using their own makefiles
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/hostsidetests/devicepolicy/app/Android.mk b/hostsidetests/devicepolicy/app/Android.mk
new file mode 100644
index 0000000..a22ef3f
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/Android.mk
@@ -0,0 +1,20 @@
+# Copyright (C) 2014 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.
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+# Build the test APKs using their own makefiles
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/tests/telecomm/Android.mk b/hostsidetests/devicepolicy/app/ProfileOwner/Android.mk
similarity index 68%
rename from tests/tests/telecomm/Android.mk
rename to hostsidetests/devicepolicy/app/ProfileOwner/Android.mk
index de1d8b3..a845163 100644
--- a/tests/tests/telecomm/Android.mk
+++ b/hostsidetests/devicepolicy/app/ProfileOwner/Android.mk
@@ -12,28 +12,20 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
-# don't include this package in any target
+LOCAL_PACKAGE_NAME := CtsProfileOwnerApp
+
LOCAL_MODULE_TAGS := optional
-# and when built explicitly put it in the data partition
+
LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-#LOCAL_JAVA_LIBRARIES := Telecomm
-
-LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
-
LOCAL_SRC_FILES := $(call all-java-files-under, src)
-LOCAL_PACKAGE_NAME := CtsTelecomTestCases
+LOCAL_JAVA_LIBRARIES := android.test.runner
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
-
-# uncomment when b/13250611 is fixed
-#LOCAL_SDK_VERSION := current
-LOCAL_JAVA_LIBRARIES += android.test.runner
+LOCAL_SDK_VERSION := current
include $(BUILD_CTS_PACKAGE)
diff --git a/hostsidetests/devicepolicy/app/ProfileOwner/AndroidManifest.xml b/hostsidetests/devicepolicy/app/ProfileOwner/AndroidManifest.xml
new file mode 100644
index 0000000..1aaf99f
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/ProfileOwner/AndroidManifest.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.cts.profileowner">
+
+ <uses-sdk android:minSdkVersion="20"/>
+
+ <application>
+ <uses-library android:name="android.test.runner" />
+ <receiver
+ android:name="com.android.cts.profileowner.BaseProfileOwnerTest$BasicAdminReceiver"
+ android:permission="android.permission.BIND_DEVICE_ADMIN">
+ <meta-data android:name="android.app.device_admin"
+ android:resource="@xml/device_admin" />
+ <intent-filter>
+ <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
+ </intent-filter>
+ </receiver>
+ </application>
+
+ <instrumentation android:name="android.test.InstrumentationTestRunner"
+ android:targetPackage="com.android.cts.profileowner"
+ android:label="Profile Owner CTS Tests"/>
+</manifest>
diff --git a/hostsidetests/devicepolicy/app/ProfileOwner/res/values/strings.xml b/hostsidetests/devicepolicy/app/ProfileOwner/res/values/strings.xml
new file mode 100644
index 0000000..640b8b5
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/ProfileOwner/res/values/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- Label for this package -->
+ <string name="label">Android CTS - Profile Owner</string>
+</resources>
\ No newline at end of file
diff --git a/hostsidetests/devicepolicy/app/ProfileOwner/res/xml/device_admin.xml b/hostsidetests/devicepolicy/app/ProfileOwner/res/xml/device_admin.xml
new file mode 100644
index 0000000..8f39ed0
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/ProfileOwner/res/xml/device_admin.xml
@@ -0,0 +1,19 @@
+<!-- Copyright (C) 2014 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.
+-->
+<device-admin xmlns:android="http://schemas.android.com/apk/res/android" android:visible="false">
+ <uses-policies>
+ <wipe-data />
+ </uses-policies>
+</device-admin>
diff --git a/hostsidetests/devicepolicy/app/ProfileOwner/src/com/android/cts/profileowner/BaseProfileOwnerTest.java b/hostsidetests/devicepolicy/app/ProfileOwner/src/com/android/cts/profileowner/BaseProfileOwnerTest.java
new file mode 100644
index 0000000..e7ccc74
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/ProfileOwner/src/com/android/cts/profileowner/BaseProfileOwnerTest.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2014 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.profileowner;
+
+import android.app.admin.DeviceAdminReceiver;
+import android.app.admin.DevicePolicyManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.test.AndroidTestCase;
+
+/**
+ * Base class for profile-owner based tests.
+ *
+ * This class handles making sure that the test is the profile owner and that it has an active admin
+ * registered, so that all tests may assume these are done.
+ */
+public class BaseProfileOwnerTest extends AndroidTestCase {
+
+ public static class BasicAdminReceiver extends DeviceAdminReceiver {
+ }
+
+ static final ComponentName ADMIN_RECEIVER_COMPONENT = new ComponentName(
+ BasicAdminReceiver.class.getPackage().getName(), BasicAdminReceiver.class.getName());
+
+ protected DevicePolicyManager mDevicePolicyManager;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ mDevicePolicyManager = (DevicePolicyManager)
+ mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
+ assertNotNull(mDevicePolicyManager);
+ // TODO: Only check this if we are running as the profile user. Otherwise, maybe check
+ // that there is a profile and that the below holds for it? If we don't want to do these
+ // checks, we could get rid for this class altogether.
+ assertTrue(mDevicePolicyManager.isAdminActive(ADMIN_RECEIVER_COMPONENT));
+ assertTrue(mDevicePolicyManager.isProfileOwnerApp(
+ ADMIN_RECEIVER_COMPONENT.getPackageName()));
+ }
+}
diff --git a/tests/src/android/os/cts/TaggedPointer.java b/hostsidetests/devicepolicy/app/ProfileOwner/src/com/android/cts/profileowner/ProfileOwnerSetupTest.java
similarity index 61%
copy from tests/src/android/os/cts/TaggedPointer.java
copy to hostsidetests/devicepolicy/app/ProfileOwner/src/com/android/cts/profileowner/ProfileOwnerSetupTest.java
index 16e76c9..6fc0eb9 100644
--- a/tests/src/android/os/cts/TaggedPointer.java
+++ b/hostsidetests/devicepolicy/app/ProfileOwner/src/com/android/cts/profileowner/ProfileOwnerSetupTest.java
@@ -13,14 +13,15 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+package com.android.cts.profileowner;
-package android.os.cts;
-public class TaggedPointer {
+public class ProfileOwnerSetupTest extends BaseProfileOwnerTest {
- static {
- System.loadLibrary("cts_jni");
+ // This test verifies that the setUp assertions on the base class are working to verify
+ // we are the profile owner and have a valid active admin.
+ public void testProfileOwnerSetup() {
+ // Empty test. We just want the assertions from super.setUp() to be executed.
}
- public static native boolean hasTaggedPointer();
}
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ProfileOwnerTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ProfileOwnerTest.java
new file mode 100644
index 0000000..e2f2f4e
--- /dev/null
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ProfileOwnerTest.java
@@ -0,0 +1,227 @@
+/*
+ * Copyright (C) 2014 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.devicepolicy;
+
+import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.ddmlib.Log.LogLevel;
+import com.android.ddmlib.testrunner.InstrumentationResultParser;
+import com.android.ddmlib.testrunner.RemoteAndroidTestRunner;
+import com.android.ddmlib.testrunner.TestIdentifier;
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.device.DeviceNotAvailableException;
+import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.log.LogUtil.CLog;
+import com.android.tradefed.result.CollectingTestListener;
+import com.android.tradefed.result.TestResult;
+import com.android.tradefed.result.TestResult.TestStatus;
+import com.android.tradefed.result.TestRunResult;
+import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IBuildReceiver;
+
+import java.io.FileNotFoundException;
+import java.util.HashSet;
+import java.util.Map;
+
+import javax.annotation.Nullable;
+
+/**
+ * Set of tests for Profile Owner use cases.
+ */
+public class ProfileOwnerTest extends DeviceTestCase implements IBuildReceiver {
+
+ private static final String RUNNER = "android.test.InstrumentationTestRunner";
+
+ private static final String PROFILE_OWNER_PKG = "com.android.cts.profileowner";
+ private static final String PROFILE_OWNER_APK = "CtsProfileOwnerApp.apk";
+
+ private static final String ADMIN_RECEIVER_TEST_CLASS =
+ PROFILE_OWNER_PKG + ".BaseProfileOwnerTest$BasicAdminReceiver";
+
+ private static final String[] REQUIRED_DEVICE_FEATURES = new String[] {
+ "android.software.managed_users",
+ "android.software.device_admin" };
+
+ private CtsBuildHelper mCtsBuild;
+ private int mUserId;
+ private boolean mHasFeature;
+
+ @Override
+ public void setBuild(IBuildInfo buildInfo) {
+ mCtsBuild = CtsBuildHelper.createBuildHelper(buildInfo);
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ assertNotNull(mCtsBuild); // ensure build has been set before test is run.
+ mHasFeature = hasDeviceFeatures(REQUIRED_DEVICE_FEATURES);
+
+ if (mHasFeature) {
+ mUserId = createUser();
+ installApp(PROFILE_OWNER_APK);
+ setProfileOwner(PROFILE_OWNER_PKG + "/" + ADMIN_RECEIVER_TEST_CLASS);
+ }
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ if (mHasFeature) {
+ // Remove the user that we created on setUp(), and the app that we installed.
+ String removeUserCommand = "pm remove-user " + mUserId;
+ CLog.logAndDisplay(LogLevel.INFO, "Output for command " + removeUserCommand + ": "
+ + getDevice().executeShellCommand(removeUserCommand));
+ getDevice().uninstallPackage(PROFILE_OWNER_PKG);
+ }
+
+ super.tearDown();
+ }
+
+ public void testProfileOwner() throws Exception {
+ if (!mHasFeature) {
+ return;
+ }
+ // Runs all tests classes from the package, as the profile user.
+ assertTrue(runDeviceTestsAsUser(PROFILE_OWNER_PKG, null /*testClassName*/, mUserId));
+ }
+
+ private boolean hasDeviceFeatures(String[] requiredFeatures)
+ throws DeviceNotAvailableException {
+ // TODO: Move this logic to ITestDevice.
+ String command = "pm list features";
+ String commandOutput = getDevice().executeShellCommand(command);
+
+ // Extract the id of the new user.
+ HashSet<String> availableFeatures = new HashSet<String>();
+ for (String feature: commandOutput.split("\\s+")) {
+ // Each line in the output of the command has the format "feature:{FEATURE_VALUE}".
+ String[] tokens = feature.split(":");
+ assertTrue(tokens.length > 1);
+ assertEquals("feature", tokens[0]);
+ availableFeatures.add(tokens[1]);
+ }
+
+ for (String requiredFeature : requiredFeatures) {
+ if(!availableFeatures.contains(requiredFeature)) {
+ CLog.logAndDisplay(LogLevel.INFO, "Device doesn't have required feature "
+ + requiredFeature + ". Tests won't run.");
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private void installApp(String fileName)
+ throws FileNotFoundException, DeviceNotAvailableException {
+ String installResult = getDevice().installPackage(mCtsBuild.getTestApp(fileName), true);
+ assertNull(String.format("Failed to install %s, Reason: %s", fileName, installResult),
+ installResult);
+ }
+
+ private int createUser() throws DeviceNotAvailableException {
+ String command =
+ "pm create-user --profileOf 0 --managed TestProfile_" + System.currentTimeMillis();
+ String commandOutput = getDevice().executeShellCommand(command);
+ CLog.logAndDisplay(LogLevel.INFO, "Output for command " + command + ": " + commandOutput);
+
+ // Extract the id of the new user.
+ String[] tokens = commandOutput.split("\\s+");
+ assertTrue(tokens.length > 0);
+ assertEquals("Success:", tokens[0]);
+ return Integer.parseInt(tokens[tokens.length-1]);
+ }
+
+ private void setProfileOwner(String componentName) throws DeviceNotAvailableException {
+ String command = "dpm set-profile-owner '" + componentName + "' " + mUserId;
+ String commandOutput = getDevice().executeShellCommand(command);
+ CLog.logAndDisplay(LogLevel.INFO, "Output for command " + command + ": " + commandOutput);
+ assertTrue(commandOutput.startsWith("Success:"));
+ }
+
+ /** Returns true if the specified tests passed. Tests are run as user owner. */
+ private boolean runDeviceTests(String pkgName, @Nullable String testClassName)
+ throws DeviceNotAvailableException {
+ return runDeviceTests(pkgName, testClassName, null /*testMethodName*/, null /*userId*/);
+ }
+
+ /** Returns true if the specified tests passed. Tests are run as given user. */
+ private boolean runDeviceTestsAsUser(String pkgName, @Nullable String testClassName, int userId)
+ throws DeviceNotAvailableException {
+ return runDeviceTests(pkgName, testClassName, null /*testMethodName*/, userId);
+ }
+
+ private boolean runDeviceTests(String pkgName, @Nullable String testClassName,
+ @Nullable String testMethodName, @Nullable Integer userId)
+ throws DeviceNotAvailableException {
+ TestRunResult runResult = (userId == null)
+ ? doRunTests(pkgName, testClassName, testMethodName)
+ : doRunTestsAsUser(pkgName, testClassName, testMethodName, userId);
+ printTestResult(runResult);
+ return !runResult.hasFailedTests() && runResult.getNumPassedTests() > 0;
+ }
+
+ /** Helper method to run tests and return the listener that collected the results. */
+ private TestRunResult doRunTests(
+ String pkgName, @Nullable String testClassName, @Nullable String testMethodName)
+ throws DeviceNotAvailableException {
+ RemoteAndroidTestRunner testRunner = new RemoteAndroidTestRunner(
+ pkgName, RUNNER, getDevice().getIDevice());
+ if (testClassName != null && testMethodName != null) {
+ testRunner.setMethodName(testClassName, testMethodName);
+ } else if (testClassName != null) {
+ testRunner.setClassName(testClassName);
+ }
+
+ CollectingTestListener listener = new CollectingTestListener();
+ assertTrue(getDevice().runInstrumentationTests(testRunner, listener));
+ return listener.getCurrentRunResults();
+ }
+
+ private TestRunResult doRunTestsAsUser(String pkgName, @Nullable String testClassName,
+ @Nullable String testMethodName, int userId)
+ throws DeviceNotAvailableException {
+ // TODO: move this to RemoteAndroidTestRunner once it supports users. Should be straight
+ // forward to add a RemoteAndroidTestRunner.setUser(userId) method. Then we can merge both
+ // doRunTests* methods.
+ StringBuilder testsToRun = new StringBuilder();
+ if (testClassName != null) {
+ testsToRun.append("-e class " + testClassName);
+ if (testMethodName != null) {
+ testsToRun.append("#" + testMethodName);
+ }
+ }
+ String command = "am instrument --user " + userId + " -w -r " + testsToRun + " "
+ + pkgName + "/" + RUNNER;
+ CLog.i("Running " + command);
+
+ CollectingTestListener listener = new CollectingTestListener();
+ InstrumentationResultParser parser = new InstrumentationResultParser(pkgName, listener);
+ getDevice().executeShellCommand(command, parser);
+ return listener.getCurrentRunResults();
+ }
+
+ private void printTestResult(TestRunResult runResult) {
+ for (Map.Entry<TestIdentifier, TestResult> testEntry :
+ runResult.getTestResults().entrySet()) {
+ TestResult testResult = testEntry.getValue();
+ CLog.logAndDisplay(LogLevel.INFO,
+ "Test " + testEntry.getKey() + ": " + testResult.getStatus());
+ if (testResult.getStatus() != TestStatus.PASSED) {
+ CLog.logAndDisplay(LogLevel.WARN, testResult.getStackTrace());
+ }
+ }
+ }
+}
diff --git a/hostsidetests/monkey/src/com/android/cts/monkey/AbstractMonkeyTest.java b/hostsidetests/monkey/src/com/android/cts/monkey/AbstractMonkeyTest.java
index 9c27b62..9e04274 100644
--- a/hostsidetests/monkey/src/com/android/cts/monkey/AbstractMonkeyTest.java
+++ b/hostsidetests/monkey/src/com/android/cts/monkey/AbstractMonkeyTest.java
@@ -1,28 +1,37 @@
package com.android.cts.monkey;
import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.cts.util.AbiUtils;
import com.android.tradefed.build.IBuildInfo;
import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.device.ITestDevice;
import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IAbi;
+import com.android.tradefed.testtype.IAbiReceiver;
import com.android.tradefed.testtype.IBuildReceiver;
import java.io.File;
-abstract class AbstractMonkeyTest extends DeviceTestCase implements IBuildReceiver {
+abstract class AbstractMonkeyTest extends DeviceTestCase implements IAbiReceiver, IBuildReceiver {
static final String[] PKGS = {"com.android.cts.monkey", "com.android.cts.monkey2"};
static final String[] APKS = {"CtsMonkeyApp.apk", "CtsMonkeyApp2.apk"};
- /**
+ /**
* Base monkey command with flags to avoid side effects like airplane mode.
*/
static final String MONKEY_CMD = "monkey --pct-touch 0 --pct-motion 0 --pct-majornav 0 --pct-syskeys 0 --pct-anyevent 0 --pct-rotation 0";
+ IAbi mAbi;
CtsBuildHelper mBuild;
ITestDevice mDevice;
@Override
+ public void setAbi(IAbi abi) {
+ mAbi = abi;
+ }
+
+ @Override
public void setBuild(IBuildInfo buildInfo) {
mBuild = CtsBuildHelper.createBuildHelper(buildInfo);
}
@@ -31,10 +40,11 @@
protected void setUp() throws Exception {
super.setUp();
mDevice = getDevice();
+ String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
for (int i = 0; i < PKGS.length; i++) {
mDevice.uninstallPackage(PKGS[i]);
File app = mBuild.getTestApp(APKS[i]);
- mDevice.installPackage(app, false);
+ mDevice.installPackage(app, false, options);
}
clearLogCat();
}
diff --git a/hostsidetests/sample/src/android/sample/cts/SampleHostResultTest.java b/hostsidetests/sample/src/android/sample/cts/SampleHostResultTest.java
index a3bc08f..bed4c05 100644
--- a/hostsidetests/sample/src/android/sample/cts/SampleHostResultTest.java
+++ b/hostsidetests/sample/src/android/sample/cts/SampleHostResultTest.java
@@ -24,11 +24,12 @@
import com.android.cts.util.ResultUnit;
import com.android.cts.util.ReportLog;
import com.android.cts.util.Stat;
-import com.android.ddmlib.Log;
import com.android.ddmlib.IDevice;
import com.android.tradefed.build.IBuildInfo;
import com.android.tradefed.device.ITestDevice;
import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IAbi;
+import com.android.tradefed.testtype.IAbiReceiver;
import com.android.tradefed.testtype.IBuildReceiver;
import com.android.tradefed.util.CommandResult;
import com.android.tradefed.util.CommandStatus;
@@ -41,7 +42,7 @@
/**
* Test to measure the transfer time of a file from the host to the device.
*/
-public class SampleHostResultTest extends DeviceTestCase implements IBuildReceiver {
+public class SampleHostResultTest extends DeviceTestCase implements IAbiReceiver, IBuildReceiver {
private static final String TAG = SampleHostResultTest.class.getSimpleName();
@@ -67,6 +68,16 @@
*/
private ITestDevice mDevice;
+ /**
+ * A reference to the ABI under test.
+ */
+ private IAbi mAbi;
+
+ @Override
+ public void setAbi(IAbi abi) {
+ mAbi = abi;
+ }
+
@Override
public void setBuild(IBuildInfo buildInfo) {
// Get the build, this is used to access the APK.
@@ -122,7 +133,7 @@
// Compute the stats.
Stat.StatResult stat = Stat.getStat(result);
// Get the report for this test and add the results to record.
- HostReportLog report = new HostReportLog(mDevice.getSerialNumber(),
+ HostReportLog report = new HostReportLog(mDevice.getSerialNumber(), mAbi.getName(),
ReportLog.getClassMethodNames());
report.printArray("Times", result, ResultType.LOWER_BETTER, ResultUnit.MS);
report.printValue("Min", stat.mMin, ResultType.LOWER_BETTER, ResultUnit.MS);
diff --git a/hostsidetests/sample/src/android/sample/cts/SampleHostTest.java b/hostsidetests/sample/src/android/sample/cts/SampleHostTest.java
index 7ccde0e..3cc4aa9 100644
--- a/hostsidetests/sample/src/android/sample/cts/SampleHostTest.java
+++ b/hostsidetests/sample/src/android/sample/cts/SampleHostTest.java
@@ -17,9 +17,12 @@
package android.sample.cts;
import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.cts.util.AbiUtils;
import com.android.tradefed.build.IBuildInfo;
import com.android.tradefed.device.ITestDevice;
import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IAbi;
+import com.android.tradefed.testtype.IAbiReceiver;
import com.android.tradefed.testtype.IBuildReceiver;
import java.io.File;
@@ -29,11 +32,11 @@
/**
* Test to check the APK logs to Logcat.
*
- * When this test builds, it also builds {@see android.sample.app.SampleDeviceActivity} into an APK
+ * When this test builds, it also builds {@link android.sample.app.SampleDeviceActivity} into an APK
* which it then installs at runtime and starts. The activity simply prints a message to Logcat and
* then gets uninstalled.
*/
-public class SampleHostTest extends DeviceTestCase implements IBuildReceiver {
+public class SampleHostTest extends DeviceTestCase implements IAbiReceiver, IBuildReceiver {
/**
* The package name of the APK.
@@ -62,6 +65,11 @@
private static final String TEST_STRING = "SampleTestString";
/**
+ * The ABI to use.
+ */
+ private IAbi mAbi;
+
+ /**
* A reference to the build.
*/
private CtsBuildHelper mBuild;
@@ -72,6 +80,11 @@
private ITestDevice mDevice;
@Override
+ public void setAbi(IAbi abi) {
+ mAbi = abi;
+ }
+
+ @Override
public void setBuild(IBuildInfo buildInfo) {
// Get the build, this is used to access the APK.
mBuild = CtsBuildHelper.createBuildHelper(buildInfo);
@@ -86,8 +99,10 @@
mDevice.uninstallPackage(PACKAGE);
// Get the APK from the build.
File app = mBuild.getTestApp(APK);
+ // Get the ABI flag.
+ String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
// Install the APK on the device.
- mDevice.installPackage(app, false);
+ mDevice.installPackage(app, false, options);
}
@Override
@@ -118,6 +133,7 @@
testString = line.split(":")[1].trim();
}
}
+ in.close();
// Assert the logged string matches the test string.
assertEquals("Incorrect test string", TEST_STRING, testString);
}
diff --git a/hostsidetests/theme/app/Android.mk b/hostsidetests/theme/app/Android.mk
index d7ca509..1be2983 100644
--- a/hostsidetests/theme/app/Android.mk
+++ b/hostsidetests/theme/app/Android.mk
@@ -32,7 +32,7 @@
#Flags to tell the Android Asset Packaging Tool not to strip for some densities
LOCAL_AAPT_FLAGS = -c land -c xx_YY -c cs -c small -c normal -c large -c xlarge \
- -c 640dpi -c 480dpi -c 400dpi -c 320dpi -c 240dpi -c 213dpi -c 160dpi -c 120dpi
+ -c 640dpi -c 560dpi -c 480dpi -c 400dpi -c 320dpi -c 240dpi -c 213dpi -c 160dpi -c 120dpi
LOCAL_PACKAGE_NAME := CtsThemeDeviceApp
diff --git a/hostsidetests/theme/app/res/drawable-560dpi/display_info.png b/hostsidetests/theme/app/res/drawable-560dpi/display_info.png
new file mode 100644
index 0000000..babe0da
--- /dev/null
+++ b/hostsidetests/theme/app/res/drawable-560dpi/display_info.png
Binary files differ
diff --git a/hostsidetests/theme/app/src/android/theme/app/DisplayInfoActivity.java b/hostsidetests/theme/app/src/android/theme/app/DisplayInfoActivity.java
index 12504c1..f263eef 100644
--- a/hostsidetests/theme/app/src/android/theme/app/DisplayInfoActivity.java
+++ b/hostsidetests/theme/app/src/android/theme/app/DisplayInfoActivity.java
@@ -68,6 +68,9 @@
case DisplayMetrics.DENSITY_XXHIGH:
return "xxhdpi";
+ case DisplayMetrics.DENSITY_560:
+ return "560dpi";
+
case DisplayMetrics.DENSITY_XXXHIGH:
return "xxxhdpi";
diff --git a/hostsidetests/theme/assets/21/560dpi.zip b/hostsidetests/theme/assets/21/560dpi.zip
new file mode 100644
index 0000000..eff363c
--- /dev/null
+++ b/hostsidetests/theme/assets/21/560dpi.zip
Binary files differ
diff --git a/hostsidetests/theme/src/android/theme/cts/ComparisonTask.java b/hostsidetests/theme/src/android/theme/cts/ComparisonTask.java
index 19c37c0..33e67e5 100644
--- a/hostsidetests/theme/src/android/theme/cts/ComparisonTask.java
+++ b/hostsidetests/theme/src/android/theme/cts/ComparisonTask.java
@@ -49,7 +49,6 @@
private final String mStoragePath;
-
public ComparisonTask(ITestDevice device, File reference, String name) {
mDevice = device;
mReference = reference;
diff --git a/hostsidetests/theme/src/android/theme/cts/ThemeHostTest.java b/hostsidetests/theme/src/android/theme/cts/ThemeHostTest.java
index c88fb44..90a0c72 100644
--- a/hostsidetests/theme/src/android/theme/cts/ThemeHostTest.java
+++ b/hostsidetests/theme/src/android/theme/cts/ThemeHostTest.java
@@ -17,16 +17,18 @@
package android.theme.cts;
import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.cts.util.AbiUtils;
+import com.android.cts.util.TimeoutReq;
import com.android.ddmlib.Log;
import com.android.ddmlib.Log.LogLevel;
import com.android.ddmlib.IShellOutputReceiver;
import com.android.tradefed.build.IBuildInfo;
import com.android.tradefed.device.ITestDevice;
import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IAbi;
+import com.android.tradefed.testtype.IAbiReceiver;
import com.android.tradefed.testtype.IBuildReceiver;
-import com.android.cts.util.TimeoutReq;
-
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
@@ -46,7 +48,7 @@
/**
* Test to check the Holo theme has not been changed.
*/
-public class ThemeHostTest extends DeviceTestCase implements IBuildReceiver {
+public class ThemeHostTest extends DeviceTestCase implements IAbiReceiver, IBuildReceiver {
private static final String TAG = ThemeHostTest.class.getSimpleName();
@@ -172,6 +174,9 @@
private final HashMap<String, File> mReferences = new HashMap<String, File>();
+ /** The ABI to use. */
+ private IAbi mAbi;
+
/** A reference to the build. */
private CtsBuildHelper mBuild;
@@ -183,6 +188,11 @@
private ExecutorCompletionService<Boolean> mCompletionService;
@Override
+ public void setAbi(IAbi abi) {
+ mAbi = abi;
+ }
+
+ @Override
public void setBuild(IBuildInfo buildInfo) {
// Get the build, this is used to access the APK.
mBuild = CtsBuildHelper.createBuildHelper(buildInfo);
@@ -197,8 +207,10 @@
mDevice.uninstallPackage(PACKAGE);
// Get the APK from the build.
File app = mBuild.getTestApp(APK);
+ // Get the ABI flag.
+ String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
// Install the APK on the device.
- mDevice.installPackage(app, false);
+ mDevice.installPackage(app, false, options);
final String densityProp;
@@ -328,6 +340,7 @@
}
}
}
+ in.close();
}
return success;
@@ -349,6 +362,8 @@
return "400dpi";
case 480:
return "xxhdpi";
+ case 560:
+ return "560dpi";
case 640:
return "xxxhdpi";
default:
diff --git a/hostsidetests/usb/src/com/android/cts/usb/TestUsbTest.java b/hostsidetests/usb/src/com/android/cts/usb/TestUsbTest.java
index a8ac3e0..2a69e39 100644
--- a/hostsidetests/usb/src/com/android/cts/usb/TestUsbTest.java
+++ b/hostsidetests/usb/src/com/android/cts/usb/TestUsbTest.java
@@ -16,6 +16,7 @@
package com.android.cts.usb;
import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.cts.util.AbiUtils;
import com.android.ddmlib.IDevice;
import com.android.ddmlib.Log;
import com.android.ddmlib.testrunner.RemoteAndroidTestRunner;
@@ -29,6 +30,8 @@
import com.android.tradefed.result.InputStreamSource;
import com.android.tradefed.result.TestRunResult;
import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IAbi;
+import com.android.tradefed.testtype.IAbiReceiver;
import com.android.tradefed.testtype.IBuildReceiver;
import com.android.tradefed.util.CommandResult;
import com.android.tradefed.util.CommandStatus;
@@ -48,16 +51,23 @@
/**
* Functional tests for usb connection
*/
-public class TestUsbTest extends DeviceTestCase implements IBuildReceiver {
+public class TestUsbTest extends DeviceTestCase implements IAbiReceiver, IBuildReceiver {
private static final String LOG_TAG = "TestUsbTest";
private static final String CTS_RUNNER = "android.support.test.runner.AndroidJUnitRunner";
private static final String PACKAGE_NAME = "com.android.cts.usb.serialtest";
private static final String APK_NAME="CtsUsbSerialTestApp.apk";
private ITestDevice mDevice;
+ private IAbi mAbi;
+ private String mAbiBitness;
private CtsBuildHelper mBuild;
@Override
+ public void setAbi(IAbi abi) {
+ mAbi = abi;
+ }
+
+ @Override
public void setBuild(IBuildInfo buildInfo) {
mBuild = CtsBuildHelper.createBuildHelper(buildInfo);
}
@@ -68,7 +78,8 @@
mDevice = getDevice();
mDevice.uninstallPackage(PACKAGE_NAME);
File app = mBuild.getTestApp(APK_NAME);
- mDevice.installPackage(app, false);
+ String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
+ mDevice.installPackage(app, false, options);
}
@Override
diff --git a/libs/commonutil/src/com/android/cts/util/AbiUtils.java b/libs/commonutil/src/com/android/cts/util/AbiUtils.java
new file mode 100644
index 0000000..f28237c
--- /dev/null
+++ b/libs/commonutil/src/com/android/cts/util/AbiUtils.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2014 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.util;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Utility class for handling device ABIs
+ */
+public class AbiUtils {
+
+ /**
+ * The set of 32Bit ABIs.
+ */
+ private static final Set<String> ABIS_32BIT = new HashSet<String>();
+
+ /**
+ * The set of 64Bit ABIs.
+ */
+ private static final Set<String> ABIS_64BIT = new HashSet<String>();
+
+ /**
+ * The set of ARM ABIs.
+ */
+ private static final Set<String> ARM_ABIS = new HashSet<String>();
+
+ /**
+ * The set of Intel ABIs.
+ */
+ private static final Set<String> INTEL_ABIS = new HashSet<String>();
+
+ /**
+ * The set of Mips ABIs.
+ */
+ private static final Set<String> MIPS_ABIS = new HashSet<String>();
+
+ /**
+ * The set of ABI names which CTS supports.
+ */
+ private static final Set<String> ABIS_SUPPORTED_BY_CTS = new HashSet<String>();
+
+ /**
+ * The map of architecture to ABI.
+ */
+ private static final Map<String, Set<String>> ARCH_TO_ABIS = new HashMap<String, Set<String>>();
+ static {
+ ABIS_32BIT.add("armeabi-v7a");
+ ABIS_32BIT.add("x86");
+ ABIS_32BIT.add("mips");
+
+ ABIS_64BIT.add("arm64-v8a");
+ ABIS_64BIT.add("x86_64");
+ ABIS_64BIT.add("mips64");
+
+ ARM_ABIS.add("armeabi-v7a");
+ ARM_ABIS.add("arm64-v8a");
+
+ INTEL_ABIS.add("x86");
+ INTEL_ABIS.add("x86_64");
+
+ MIPS_ABIS.add("mips");
+ MIPS_ABIS.add("mips64");
+
+ ARCH_TO_ABIS.put("arm", ARM_ABIS);
+ ARCH_TO_ABIS.put("arm64", ARM_ABIS);
+ ARCH_TO_ABIS.put("x86", INTEL_ABIS);
+ ARCH_TO_ABIS.put("x86_64", INTEL_ABIS);
+ ARCH_TO_ABIS.put("mips", MIPS_ABIS);
+ ARCH_TO_ABIS.put("mips64", MIPS_ABIS);
+
+ ABIS_SUPPORTED_BY_CTS.addAll(ARM_ABIS);
+ ABIS_SUPPORTED_BY_CTS.addAll(INTEL_ABIS);
+ ABIS_SUPPORTED_BY_CTS.addAll(MIPS_ABIS);
+ }
+
+ /**
+ * Private constructor to avoid instantiation.
+ */
+ private AbiUtils() {}
+
+ /**
+ * Returns the set of ABIs associated with the given architecture.
+ * @param arch The architecture to look up.
+ * @return a new Set containing the ABIs.
+ */
+ public static Set<String> getAbisForArch(String arch) {
+ return new HashSet<String>(ARCH_TO_ABIS.get(arch));
+ }
+
+ /**
+ * Returns the set of ABIs supported by CTS.
+ * @return a new Set containing the supported ABIs.
+ */
+ public static Set<String> getAbisSupportedByCts() {
+ return new HashSet<String>(ABIS_SUPPORTED_BY_CTS);
+ }
+
+ /**
+ * @param abi The ABI name to test.
+ * @return true if the given ABI is supported by CTS.
+ */
+ public static boolean isAbiSupportedByCts(String abi) {
+ return ABIS_SUPPORTED_BY_CTS.contains(abi);
+ }
+
+ /**
+ * Creates a flag for the given ABI.
+ * @param abi the ABI to create the flag for.
+ * @return a string which can be add to a command sent to ADB.
+ */
+ public static String createAbiFlag(String abi) {
+ if (abi == null || abi.isEmpty() || !isAbiSupportedByCts(abi)) {
+ return "";
+ }
+ return String.format("--abi %s ", abi);
+ }
+
+ /**
+ * Creates a unique id from the given ABI and name.
+ * @param abi The ABI to use.
+ * @param name The name to use.
+ * @return a string which uniquely identifies a run.
+ */
+ public static String createId(String abi, String name) {
+ return String.format("%s %s", abi, name);
+ }
+
+ /**
+ * Parses a unique id into the ABI and name.
+ * @param id The id to parse.
+ * @return a string array containing the ABI and name.
+ */
+ public static String[] parseId(String id) {
+ if (id == null || !id.contains(" ")) {
+ return new String[] {"", ""};
+ }
+ return id.split(" ");
+ }
+
+ /**
+ * @param name The name of the ABI.
+ * @return The bitness of the ABI with the given name
+ */
+ public static String getBitness(String name) {
+ return ABIS_32BIT.contains(name) ? "32" : "64";
+ }
+}
diff --git a/libs/commonutil/src/com/android/cts/util/CtsException.java b/libs/commonutil/src/com/android/cts/util/CtsException.java
deleted file mode 100644
index 7e79590..0000000
--- a/libs/commonutil/src/com/android/cts/util/CtsException.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2012 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.util;
-
-/**
- * Exception throw by CTS test to pass the result to host
- * This should not be thrown by test app unless the result is complete.
- */
-@SuppressWarnings("serial")
-public class CtsException extends Exception {
- public CtsException(String message) {
- super(message);
- }
-}
diff --git a/libs/deviceutil/src/android/cts/util/DeviceReportLog.java b/libs/deviceutil/src/android/cts/util/DeviceReportLog.java
index a3ceecf..63b07b7 100644
--- a/libs/deviceutil/src/android/cts/util/DeviceReportLog.java
+++ b/libs/deviceutil/src/android/cts/util/DeviceReportLog.java
@@ -24,12 +24,12 @@
public class DeviceReportLog extends ReportLog {
private static final String TAG = "DeviceCtsReport";
- private static final String CTS_RESULT = "CTS_RESULT";
+ private static final String CTS_RESULT_KEY = "CTS_TEST_RESULT";
private static final int INST_STATUS_IN_PROGRESS = 2;
private static final int BASE_DEPTH = 4;
public DeviceReportLog() {
- mDepth = BASE_DEPTH;
+ this(0);
}
public DeviceReportLog(int depth) {
@@ -46,7 +46,7 @@
String report = generateReport();
if (!report.equals("")) {
Bundle output = new Bundle();
- output.putString(CTS_RESULT, report);
+ output.putString(CTS_RESULT_KEY, report);
instrumentation.sendStatus(INST_STATUS_IN_PROGRESS, output);
}
}
diff --git a/suite/cts/hostTests/jank/src/com/android/cts/jank/CtsHostJankTest.java b/suite/cts/hostTests/jank/src/com/android/cts/jank/CtsHostJankTest.java
index f8c7ec1..e196bfb 100644
--- a/suite/cts/hostTests/jank/src/com/android/cts/jank/CtsHostJankTest.java
+++ b/suite/cts/hostTests/jank/src/com/android/cts/jank/CtsHostJankTest.java
@@ -23,16 +23,19 @@
import com.android.tradefed.build.IBuildInfo;
import com.android.tradefed.device.ITestDevice;
import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IAbi;
+import com.android.tradefed.testtype.IAbiReceiver;
import com.android.tradefed.testtype.IBuildReceiver;
import java.io.File;
import java.util.HashMap;
import java.util.Scanner;
-public class CtsHostJankTest extends DeviceTestCase implements IBuildReceiver {
+public class CtsHostJankTest extends DeviceTestCase implements IAbiReceiver, IBuildReceiver {
private static final String TAG = CtsHostJankTest.class.getSimpleName();
private static final String DEVICE_LOCATION = "/data/local/tmp/";
+ // FIXME uiautomator is deprecated and does not support --abi flag
private static final String RUN_UI_AUTOMATOR_CMD = "uiautomator runtest %s -c %s";
private final String mHostTestClass;
private final String mDeviceTestClass;
@@ -40,6 +43,7 @@
private final String mJarPath;
protected ITestDevice mDevice;
protected CtsBuildHelper mBuild;
+ protected IAbi mAbi;
public CtsHostJankTest(String jarName, String deviceTestClass, String hostTestClass) {
this.mHostTestClass = hostTestClass;
@@ -49,6 +53,11 @@
}
@Override
+ public void setAbi(IAbi abi) {
+ mAbi = abi;
+ }
+
+ @Override
public void setBuild(IBuildInfo buildInfo) {
mBuild = CtsBuildHelper.createBuildHelper(buildInfo);
}
@@ -80,6 +89,7 @@
new IShellOutputReceiver() {
private StringBuilder sb = new StringBuilder();
+ @Override
public void addOutput(byte[] data, int offset, int length) {
byte[] raw = new byte[length];
for (int i = 0; i < length; i++) {
@@ -88,10 +98,12 @@
sb.append(new String(raw));
}
+ @Override
public void flush() {
Log.logAndDisplay(LogLevel.INFO, TAG, sb.toString());
}
+ @Override
public boolean isCancelled() {
return false;
}
@@ -109,6 +121,7 @@
results.put(parts[0], Double.parseDouble(parts[1]));
}
}
+ in.close();
Log.logAndDisplay(LogLevel.INFO, TAG, "Results: " + results);
assertEquals("Could not parse the results file: ", 4, results.size());
@@ -118,8 +131,8 @@
double avgMaxAccFrames = results.get("average of max accumulated frames");
// Create and deliver the report.
- HostReportLog report =
- new HostReportLog(mDevice.getSerialNumber(), mHostTestClass + "#" + testName);
+ HostReportLog report = new HostReportLog(mDevice.getSerialNumber(), mAbi.getName(),
+ mHostTestClass + "#" + testName);
report.printValue(
"Average Frame Rate", avgFrameRate, ResultType.HIGHER_BETTER, ResultUnit.COUNT);
report.printValue("Average of Maximum Accumulated Frames", avgMaxAccFrames,
diff --git a/suite/cts/hostTests/jank/src/com/android/cts/jank/opengl/CtsHostJankOpenGl.java b/suite/cts/hostTests/jank/src/com/android/cts/jank/opengl/CtsHostJankOpenGl.java
index ebd5bfa..2942ecf 100644
--- a/suite/cts/hostTests/jank/src/com/android/cts/jank/opengl/CtsHostJankOpenGl.java
+++ b/suite/cts/hostTests/jank/src/com/android/cts/jank/opengl/CtsHostJankOpenGl.java
@@ -14,7 +14,7 @@
package com.android.cts.jank.opengl;
import com.android.cts.jank.CtsHostJankTest;
-
+import com.android.cts.util.AbiUtils;
import java.io.File;
public class CtsHostJankOpenGl extends CtsHostJankTest {
@@ -36,7 +36,8 @@
// Install the app.
mDevice.uninstallPackage(APK_PACKAGE);
File app = mBuild.getTestApp(APK);
- mDevice.installPackage(app, false);
+ String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
+ mDevice.installPackage(app, false, options);
}
@Override
diff --git a/suite/cts/hostTests/jank/src/com/android/cts/jank/ui/CtsHostJankUi.java b/suite/cts/hostTests/jank/src/com/android/cts/jank/ui/CtsHostJankUi.java
index 3027899..a07171e 100644
--- a/suite/cts/hostTests/jank/src/com/android/cts/jank/ui/CtsHostJankUi.java
+++ b/suite/cts/hostTests/jank/src/com/android/cts/jank/ui/CtsHostJankUi.java
@@ -14,7 +14,7 @@
package com.android.cts.jank.ui;
import com.android.cts.jank.CtsHostJankTest;
-
+import com.android.cts.util.AbiUtils;
import java.io.File;
public class CtsHostJankUi extends CtsHostJankTest {
@@ -36,7 +36,8 @@
// Install the app.
mDevice.uninstallPackage(APK_PACKAGE);
File app = mBuild.getTestApp(APK);
- mDevice.installPackage(app, false);
+ String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
+ mDevice.installPackage(app, false, options);
}
@Override
diff --git a/suite/cts/hostTests/uihost/src/com/android/cts/uihost/InstallTimeTest.java b/suite/cts/hostTests/uihost/src/com/android/cts/uihost/InstallTimeTest.java
index 63c2d84..75a2e92 100644
--- a/suite/cts/hostTests/uihost/src/com/android/cts/uihost/InstallTimeTest.java
+++ b/suite/cts/hostTests/uihost/src/com/android/cts/uihost/InstallTimeTest.java
@@ -18,6 +18,7 @@
import com.android.cts.tradefed.build.CtsBuildHelper;
import com.android.cts.tradefed.util.HostReportLog;
+import com.android.cts.util.AbiUtils;
import com.android.cts.util.MeasureRun;
import com.android.cts.util.MeasureTime;
import com.android.cts.util.ResultType;
@@ -28,6 +29,8 @@
import com.android.tradefed.build.IBuildInfo;
import com.android.tradefed.device.ITestDevice;
import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IAbi;
+import com.android.tradefed.testtype.IAbiReceiver;
import com.android.tradefed.testtype.IBuildReceiver;
import java.io.File;
@@ -36,9 +39,10 @@
/**
* Test to measure installation time of a APK.
*/
-public class InstallTimeTest extends DeviceTestCase implements IBuildReceiver {
+public class InstallTimeTest extends DeviceTestCase implements IAbiReceiver, IBuildReceiver {
private CtsBuildHelper mBuild;
private ITestDevice mDevice;
+ private IAbi mAbi;
private static final String TAG = "InstallTimeTest";
static final String PACKAGE = "com.replica.replicaisland";
@@ -46,6 +50,11 @@
private static final double OUTLIER_THRESHOLD = 0.1;
@Override
+ public void setAbi(IAbi abi) {
+ mAbi = abi;
+ }
+
+ @Override
public void setBuild(IBuildInfo buildInfo) {
mBuild = CtsBuildHelper.createBuildHelper(buildInfo);
}
@@ -64,8 +73,8 @@
}
public void testInstallTime() throws Exception {
- HostReportLog report =
- new HostReportLog(mDevice.getSerialNumber(), ReportLog.getClassMethodNames());
+ HostReportLog report = new HostReportLog(mDevice.getSerialNumber(), mAbi.getName(),
+ ReportLog.getClassMethodNames());
final int NUMBER_REPEAT = 10;
final CtsBuildHelper build = mBuild;
final ITestDevice device = mDevice;
@@ -77,7 +86,8 @@
@Override
public void run(int i) throws Exception {
File app = build.getTestApp(APK);
- device.installPackage(app, false);
+ String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
+ device.installPackage(app, false, options);
}
});
report.printArray("install time", result, ResultType.LOWER_BETTER,
diff --git a/suite/cts/hostTests/uihost/src/com/android/cts/uihost/TaskSwitchingTest.java b/suite/cts/hostTests/uihost/src/com/android/cts/uihost/TaskSwitchingTest.java
index 50a2047..9ccff10 100644
--- a/suite/cts/hostTests/uihost/src/com/android/cts/uihost/TaskSwitchingTest.java
+++ b/suite/cts/hostTests/uihost/src/com/android/cts/uihost/TaskSwitchingTest.java
@@ -17,9 +17,9 @@
package com.android.cts.uihost;
import com.android.cts.tradefed.build.CtsBuildHelper;
-import com.android.cts.tradefed.result.CtsReportUtil;
import com.android.cts.tradefed.util.CtsHostStore;
import com.android.cts.tradefed.util.HostReportLog;
+import com.android.cts.util.AbiUtils;
import com.android.cts.util.ReportLog;
import com.android.cts.util.TimeoutReq;
import com.android.ddmlib.Log;
@@ -34,6 +34,8 @@
import com.android.tradefed.result.TestResult;
import com.android.tradefed.result.TestRunResult;
import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IAbi;
+import com.android.tradefed.testtype.IAbiReceiver;
import com.android.tradefed.testtype.IBuildReceiver;
import java.io.File;
@@ -45,12 +47,13 @@
* Actual test is done in device, but this host side code installs all necessary APKs
* and starts device test which is in CtsDeviceTaskswitchingControl.
*/
-public class TaskSwitchingTest extends DeviceTestCase implements IBuildReceiver {
+public class TaskSwitchingTest extends DeviceTestCase implements IAbiReceiver, IBuildReceiver {
private static final String TAG = "TaskSwitchingTest";
private final static String RUNNER = "android.support.test.runner.AndroidJUnitRunner";
private CtsBuildHelper mBuild;
private ITestDevice mDevice;
private String mCtsReport = null;
+ private IAbi mAbi;
static final String[] PACKAGES = {
"com.android.cts.taskswitching.control",
@@ -64,6 +67,11 @@
};
@Override
+ public void setAbi(IAbi abi) {
+ mAbi = abi;
+ }
+
+ @Override
public void setBuild(IBuildInfo buildInfo) {
mBuild = CtsBuildHelper.createBuildHelper(buildInfo);
}
@@ -72,10 +80,11 @@
protected void setUp() throws Exception {
super.setUp();
mDevice = getDevice();
+ String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
for (int i = 0; i < PACKAGES.length; i++) {
mDevice.uninstallPackage(PACKAGES[i]);
File app = mBuild.getTestApp(APKS[i]);
- mDevice.installPackage(app, false);
+ mDevice.installPackage(app, false, options);
}
}
@@ -90,8 +99,9 @@
@TimeoutReq(minutes = 30)
public void testTaskswitching() throws Exception {
- HostReportLog report =
- new HostReportLog(mDevice.getSerialNumber(), ReportLog.getClassMethodNames());
+ // TODO is this used?
+ HostReportLog report = new HostReportLog(mDevice.getSerialNumber(), mAbi.getName(),
+ ReportLog.getClassMethodNames());
RemoteAndroidTestRunner testRunner = new RemoteAndroidTestRunner(PACKAGES[0], RUNNER,
mDevice.getIDevice());
LocalListener listener = new LocalListener();
@@ -101,7 +111,7 @@
fail(result.getRunFailureMessage());
}
assertNotNull("no performance data", mCtsReport);
- CtsHostStore.storeCtsResult(mDevice.getSerialNumber(),
+ CtsHostStore.storeCtsResult(mDevice.getSerialNumber(), mAbi.getName(),
ReportLog.getClassMethodNames(), mCtsReport);
}
@@ -110,7 +120,7 @@
@Override
public void testEnded(TestIdentifier test, Map<String, String> testMetrics) {
// necessary as testMetrics passed from CollectingTestListerner is empty
- mCtsReport = CtsReportUtil.getCtsResultFromMetrics(testMetrics);
+ mCtsReport = testMetrics.get("CTS_TEST_REPORT");
super.testEnded(test, testMetrics);
}
}
diff --git a/tests/Android.mk b/tests/Android.mk
index f66946a..39a27fe 100644
--- a/tests/Android.mk
+++ b/tests/Android.mk
@@ -19,13 +19,9 @@
LOCAL_SRC_FILES := $(call all-java-files-under, src)\
$(call all-renderscript-files-under, src)\
- src/android/app/cts/ISecondary.aidl\
- src/android/os/cts/IEmptyService.aidl\
LOCAL_JAVA_LIBRARIES := android.test.runner
-LOCAL_JNI_SHARED_LIBRARIES := libcts_jni
-
# Resource unit tests use a private locale and some densities
LOCAL_AAPT_FLAGS = -c xx_YY -c cs -c small -c normal -c large -c xlarge \
-c 320dpi -c 240dpi -c 160dpi -c 32dpi \
diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml
index 645eb3b..b3798b1 100644
--- a/tests/AndroidManifest.xml
+++ b/tests/AndroidManifest.xml
@@ -158,14 +158,6 @@
</intent-filter>
</activity>
- <activity android:name="android.view.cts.ViewStubStubActivity"
- android:label="ViewStubStubActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN"/>
- <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
- </intent-filter>
- </activity>
-
<activity android:name="android.widget.cts.ViewFlipperStubActivity"
android:label="ViewFlipperStubActivity">
<intent-filter>
@@ -199,20 +191,6 @@
</intent-filter>
</activity>
- <activity android:name="android.view.cts.UsingViewsStubActivity"
- android:label="Using Views Test">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
- </intent-filter>
- </activity>
- <activity android:name="android.view.cts.FocusHandlingStubActivity"
- android:label="Focus Handling Test">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
- </intent-filter>
- </activity>
<activity android:name="android.app.cts.MockActivity" android:label="MockActivity">
<meta-data android:name="android.app.alias"
android:resource="@xml/alias" />
@@ -328,36 +306,6 @@
</intent-filter>
</activity>
- <activity android:name="android.view.cts.ViewGroupStubActivity" android:label="ViewGroupStubActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN"/>
- <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
- </intent-filter>
- </activity>
- <activity android:name="android.view.cts.ViewTestStubActivity"
- android:label="ViewTestStubActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
- </intent-filter>
- </activity>
- <activity android:name="android.view.cts.ViewLayoutPositionTestStubActivity"
- android:label="ViewTestStubActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
- </intent-filter>
- </activity>
-
- <activity android:name="android.view.cts.WindowStubActivity"
- android:theme="@android:style/Theme.Holo.NoActionBar"
- android:label="WindowStubActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
- </intent-filter>
- </activity>
-
<activity android:name="android.widget.cts.ViewGroupStubActivity"
android:label="WidgetViewGroupStubActivity">
<intent-filter>
@@ -367,7 +315,7 @@
</activity>
<activity android:name="android.widget.cts.VideoViewStubActivity"
- android:configChanges="keyboardHidden|orientation|screenSize">
+ android:configChanges="keyboardHidden|orientation|screenSize"
android:label="VideoViewStubActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -480,14 +428,6 @@
</intent-filter>
</activity>
- <activity android:name="android.view.animation.cts.AnimationTestStubActivity"
- android:label="AnimationTestStubActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN"/>
- <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
- </intent-filter>
- </activity>
-
<activity android:name="android.view.animation.cts.GridLayoutAnimStubActivity"
android:label="GridLayoutAnimStubActivity">
<intent-filter>
@@ -629,14 +569,6 @@
android:resource="@xml/method" />
</service>
- <activity android:name="android.view.cts.MenuInflaterStubActivity"
- android:label="MenuInflaterStubActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN"/>
- <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
- </intent-filter>
- </activity>
-
<activity android:name="android.text.method.cts.KeyListenerStubActivity"
android:label="KeyListenerStubActivity"/>
@@ -678,14 +610,6 @@
</intent-filter>
</activity>
- <activity android:name="android.view.cts.SurfaceViewStubActivity"
- android:label="SurfaceViewStubActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN"/>
- <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
- </intent-filter>
- </activity>
-
<activity android:name="android.app.cts.MockApplicationActivity"
android:label="MockApplicationActivity">
<intent-filter>
@@ -818,18 +742,6 @@
</intent-filter>
</activity>
- <activity android:name="android.view.cts.FocusFinderStubActivity"
- android:label="FocusFinderStubActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity>
-
- <activity android:name="android.view.cts.GestureDetectorStubActivity"
- android:label="GestureDetectorStubActivity"
- android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />
-
<!--Test for PackageManager-->
<activity android:name="android.content.pm.cts.TestPmActivity"
android:icon="@drawable/start">
@@ -858,16 +770,6 @@
</intent-filter>
</receiver>
- <!-- Used for PackageManager test, don't delete this MockContentProvider provider -->
- <provider android:name="android.content.cts.MockContentProvider" android:authorities="ctstest"
- android:multiprocess="false" />
- <provider android:name="android.content.cts.DummyProvider"
- android:authorities="android.content.cts.dummyprovider"
- android:multiprocess="true" />
- <provider android:name="android.content.cts.MockRemoteContentProvider"
- android:authorities="remotectstest"
- android:process=":remoteprovider" android:multiprocess="false" />
-
<activity android:name="android.app.cts.ChildTabActivity" android:label="ChildTabActivity" />
<activity android:name="android.app.cts.LauncherActivityStub"
diff --git a/tests/expectations/knownfailures.txt b/tests/expectations/knownfailures.txt
index 131b264..3cbe53c 100644
--- a/tests/expectations/knownfailures.txt
+++ b/tests/expectations/knownfailures.txt
@@ -60,6 +60,39 @@
names: [
"android.hardware.camera2.cts.RobustnessTest#testMandatoryOutputCombinations"
],
- bug: 16899526
+ bug: 17511208
+},
+{
+ description: "these tests require a good test scene, so they fail if run in random conditions",
+ names: [
+ "android.hardware.camera2.cts.AllocationTest#testBlackWhite",
+ "android.hardware.camera2.cts.AllocationTest#testParamSensitivity"
+ ],
+ bug: 17530117
+},
+{
+ description: "these tests locks the screen with an emtpy password or swipe-to-unlock, blocking subsequent test to dismiss keyguard",
+ names: [
+ "android.admin.cts.DevicePolicyManagerTest#testPasswordQuality_something",
+ "android.admin.cts.DevicePolicyManagerTest#testPasswordQuality_numeric",
+ "android.admin.cts.DevicePolicyManagerTest#testPasswordQuality_alphabetic",
+ "android.admin.cts.DevicePolicyManagerTest#testPasswordQuality_alphanumeric",
+ "android.admin.cts.DevicePolicyManagerTest#testGetMaximumFailedPasswordsForWipe"
+ ],
+ bug: 17496766
+},
+{
+ description: "instrumentation target context and test context are the same after move test target inside the test itself",
+ names: [
+ "android.app.cts.InstrumentationTest#testContext"
+ ],
+ bug: 17614217
+},
+{
+ description: "Current implementation of uninstallAllUserCaCerts does not throw expected security exception, wait for fix from framework",
+ names: [
+ "android.admin.cts.DevicePolicyManagerTest#testUninstallAllUserCaCerts_failIfNotProfileOwner"
+ ],
+ bug: 17508787
}
]
diff --git a/tests/expectations/unsupportedabis.txt b/tests/expectations/unsupportedabis.txt
index 7a244e3..520d750 100644
--- a/tests/expectations/unsupportedabis.txt
+++ b/tests/expectations/unsupportedabis.txt
@@ -2,182 +2,10 @@
{
description: "Tests not supporting: arm64-v8a, x86_64, mips64",
names: [
- "android.renderscript.cts.AllocationCopy2DRangeTest",
- "android.renderscript.cts.AllocationResize",
- "android.renderscript.cts.AllocationTest",
- "android.renderscript.cts.AtomicTest",
- "android.renderscript.cts.BaseObjTest",
- "android.renderscript.cts.ClearObjectTest",
- "android.renderscript.cts.CompilerTest",
- "android.renderscript.cts.ComputeTest",
- "android.renderscript.cts.DebugContext",
- "android.renderscript.cts.ElementTest",
- "android.renderscript.cts.ExceptionTest",
- "android.renderscript.cts.FieldPackerTest",
- "android.renderscript.cts.ForEachTest",
- "android.renderscript.cts.GetAllocationTest",
- "android.renderscript.cts.GetElementAt",
- "android.renderscript.cts.GlobalSync",
- "android.renderscript.cts.GlobalTest",
- "android.renderscript.cts.ImageProcessingTest",
- "android.renderscript.cts.InitTest",
- "android.renderscript.cts.Intrinsic3DLut",
- "android.renderscript.cts.IntrinsicBase",
- "android.renderscript.cts.IntrinsicBlur",
- "android.renderscript.cts.IntrinsicColorMatrix",
- "android.renderscript.cts.IntrinsicConvolve3x3",
- "android.renderscript.cts.IntrinsicConvolve5x5",
- "android.renderscript.cts.IntrinsicHistogram",
- "android.renderscript.cts.IsObjectTest",
- "android.renderscript.cts.KernelTest",
- "android.renderscript.cts.LeakTest",
- "android.renderscript.cts.Matrix2fTest",
- "android.renderscript.cts.Matrix3fTest",
- "android.renderscript.cts.Matrix4fTest",
- "android.renderscript.cts.RSBase",
- "android.renderscript.cts.RSBaseCompute",
- "android.renderscript.cts.RenderScriptTest",
- "android.renderscript.cts.RsPackColorTo8888Test",
- "android.renderscript.cts.RsUnpackColor8888Test",
- "android.renderscript.cts.SampleTest",
- "android.renderscript.cts.SamplerTest",
- "android.renderscript.cts.ScriptGroupTest",
- "android.renderscript.cts.ScriptTest",
- "android.renderscript.cts.SendToClient",
- "android.renderscript.cts.SendToClientBlockingTest",
- "android.renderscript.cts.SetObjectTest",
- "android.renderscript.cts.StructArrayTest",
- "android.renderscript.cts.StructPadTest",
- "android.renderscript.cts.TestAbs",
- "android.renderscript.cts.TestAcos",
- "android.renderscript.cts.TestAcosh",
- "android.renderscript.cts.TestAcospi",
- "android.renderscript.cts.TestAsin",
- "android.renderscript.cts.TestAsinh",
- "android.renderscript.cts.TestAsinpi",
- "android.renderscript.cts.TestAtan",
- "android.renderscript.cts.TestAtan2",
- "android.renderscript.cts.TestAtan2pi",
- "android.renderscript.cts.TestAtanh",
- "android.renderscript.cts.TestAtanpi",
- "android.renderscript.cts.TestCbrt",
- "android.renderscript.cts.TestCeil",
- "android.renderscript.cts.TestClamp",
- "android.renderscript.cts.TestClz",
- "android.renderscript.cts.TestConvert",
- "android.renderscript.cts.TestCopysign",
- "android.renderscript.cts.TestCos",
- "android.renderscript.cts.TestCosh",
- "android.renderscript.cts.TestCospi",
- "android.renderscript.cts.TestCross",
- "android.renderscript.cts.TestDegrees",
- "android.renderscript.cts.TestDistance",
- "android.renderscript.cts.TestDot",
- "android.renderscript.cts.TestErf",
- "android.renderscript.cts.TestErfc",
- "android.renderscript.cts.TestExp",
- "android.renderscript.cts.TestExp10",
- "android.renderscript.cts.TestExp2",
- "android.renderscript.cts.TestExpm1",
- "android.renderscript.cts.TestFabs",
- "android.renderscript.cts.TestFastDistance",
- "android.renderscript.cts.TestFastLength",
- "android.renderscript.cts.TestFastNormalize",
- "android.renderscript.cts.TestFdim",
- "android.renderscript.cts.TestFloor",
- "android.renderscript.cts.TestFma",
- "android.renderscript.cts.TestFmax",
- "android.renderscript.cts.TestFmin",
- "android.renderscript.cts.TestFmod",
- "android.renderscript.cts.TestFract",
- "android.renderscript.cts.TestFrexp",
- "android.renderscript.cts.TestHalfRecip",
- "android.renderscript.cts.TestHalfRsqrt",
- "android.renderscript.cts.TestHalfSqrt",
- "android.renderscript.cts.TestHypot",
- "android.renderscript.cts.TestIlogb",
- "android.renderscript.cts.TestLdexp",
- "android.renderscript.cts.TestLength",
- "android.renderscript.cts.TestLgamma",
- "android.renderscript.cts.TestLog",
- "android.renderscript.cts.TestLog10",
- "android.renderscript.cts.TestLog1p",
- "android.renderscript.cts.TestLog2",
- "android.renderscript.cts.TestLogb",
- "android.renderscript.cts.TestMad",
- "android.renderscript.cts.TestMax",
- "android.renderscript.cts.TestMin",
- "android.renderscript.cts.TestMix",
- "android.renderscript.cts.TestModf",
- "android.renderscript.cts.TestNan",
- "android.renderscript.cts.TestNativeAcos",
- "android.renderscript.cts.TestNativeAcosh",
- "android.renderscript.cts.TestNativeAcospi",
- "android.renderscript.cts.TestNativeAsin",
- "android.renderscript.cts.TestNativeAsinh",
- "android.renderscript.cts.TestNativeAsinpi",
- "android.renderscript.cts.TestNativeAtan",
- "android.renderscript.cts.TestNativeAtan2",
- "android.renderscript.cts.TestNativeAtan2pi",
- "android.renderscript.cts.TestNativeAtanh",
- "android.renderscript.cts.TestNativeAtanpi",
- "android.renderscript.cts.TestNativeCbrt",
- "android.renderscript.cts.TestNativeCos",
- "android.renderscript.cts.TestNativeCosh",
- "android.renderscript.cts.TestNativeCospi",
- "android.renderscript.cts.TestNativeDistance",
- "android.renderscript.cts.TestNativeDivide",
- "android.renderscript.cts.TestNativeExp",
- "android.renderscript.cts.TestNativeExp10",
- "android.renderscript.cts.TestNativeExp2",
- "android.renderscript.cts.TestNativeExpm1",
- "android.renderscript.cts.TestNativeHypot",
- "android.renderscript.cts.TestNativeLength",
- "android.renderscript.cts.TestNativeLog",
- "android.renderscript.cts.TestNativeLog10",
- "android.renderscript.cts.TestNativeLog1p",
- "android.renderscript.cts.TestNativeLog2",
- "android.renderscript.cts.TestNativeNormalize",
- "android.renderscript.cts.TestNativePowr",
- "android.renderscript.cts.TestNativeRecip",
- "android.renderscript.cts.TestNativeRootn",
- "android.renderscript.cts.TestNativeRsqrt",
- "android.renderscript.cts.TestNativeSin",
- "android.renderscript.cts.TestNativeSincos",
- "android.renderscript.cts.TestNativeSinh",
- "android.renderscript.cts.TestNativeSinpi",
- "android.renderscript.cts.TestNativeSqrt",
- "android.renderscript.cts.TestNativeTan",
- "android.renderscript.cts.TestNativeTanh",
- "android.renderscript.cts.TestNativeTanpi",
- "android.renderscript.cts.TestNextafter",
- "android.renderscript.cts.TestNormalize",
- "android.renderscript.cts.TestPow",
- "android.renderscript.cts.TestPown",
- "android.renderscript.cts.TestPowr",
- "android.renderscript.cts.TestRadians",
- "android.renderscript.cts.TestRemainder",
- "android.renderscript.cts.TestRemquo",
- "android.renderscript.cts.TestRint",
- "android.renderscript.cts.TestRootn",
- "android.renderscript.cts.TestRound",
- "android.renderscript.cts.TestRsqrt",
- "android.renderscript.cts.TestSign",
- "android.renderscript.cts.TestSin",
- "android.renderscript.cts.TestSincos",
- "android.renderscript.cts.TestSinh",
- "android.renderscript.cts.TestSinpi",
- "android.renderscript.cts.TestSqrt",
- "android.renderscript.cts.TestStep",
- "android.renderscript.cts.TestTan",
- "android.renderscript.cts.TestTanh",
- "android.renderscript.cts.TestTanpi",
- "android.renderscript.cts.TestTgamma",
- "android.renderscript.cts.TestTrunc",
- "android.renderscript.cts.TypeTest",
- "android.renderscript.cts.VersionTest",
- "android.renderscript.cts.VoidPtr",
- "android.renderscript.cts.YuvTest"
+ "android.sample.cts.SampleDeviceResultTest",
+ "android.sample.cts.SampleDeviceTest",
+ "android.sample.cts.SampleHostResultTest",
+ "android.sample.cts.SampleHostTest"
]
}
]
diff --git a/tests/res/layout/autocompletetextview_layout.xml b/tests/res/layout/autocompletetextview_layout.xml
index be1d284..c2404d5 100644
--- a/tests/res/layout/autocompletetextview_layout.xml
+++ b/tests/res/layout/autocompletetextview_layout.xml
@@ -28,5 +28,6 @@
android:completionThreshold="1"
android:completionHint="@string/tabs_1"
android:layout_width="match_parent"
- android:layout_height="wrap_content" />
+ android:layout_height="wrap_content"
+ android:inputType="none"/>
</LinearLayout>
diff --git a/tests/res/layout/popupwindow.xml b/tests/res/layout/popupwindow.xml
index e6b0aed..2508115 100644
--- a/tests/res/layout/popupwindow.xml
+++ b/tests/res/layout/popupwindow.xml
@@ -16,17 +16,16 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
+ android:layout_height="match_parent"
android:orientation="vertical">
<TextView android:id="@+id/anchor_upper"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:text="@string/text_view_hint"
- android:layout_weight="1"/>
+ android:text="@string/text_view_hint" />
<LinearLayout android:layout_width="match_parent"
- android:layout_height="wrap_content"
+ android:layout_height="0dp"
android:layout_weight="1">
<TextView android:id="@+id/anchor_middle_left"
@@ -46,7 +45,6 @@
<TextView android:id="@+id/anchor_lower"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:text="@string/text_view_hint"
- android:layout_weight="1"/>
+ android:text="@string/text_view_hint" />
</LinearLayout>
diff --git a/tests/res/layout/textview_layout.xml b/tests/res/layout/textview_layout.xml
index 108e3f0..d069df2 100644
--- a/tests/res/layout/textview_layout.xml
+++ b/tests/res/layout/textview_layout.xml
@@ -36,6 +36,7 @@
android:typeface="normal"
android:textSize="20px"
android:textStyle="normal"
+ android:textAppearance="@null"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
diff --git a/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityTextTraversalTest.java b/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityTextTraversalTest.java
index bdc0cd5..cb0877d 100644
--- a/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityTextTraversalTest.java
+++ b/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityTextTraversalTest.java
@@ -4532,7 +4532,7 @@
AccessibilityNodeInfo.ACTION_PASTE));
// Verify the content.
- assertEquals(editText.getText().toString(), textContent + " " + textContent);
+ assertEquals(editText.getText().toString(), textContent + textContent);
// Select all text.
arguments.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, 0);
diff --git a/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityWindowQueryTest.java b/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityWindowQueryTest.java
index 43acbcd..f8cf4dd 100644
--- a/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityWindowQueryTest.java
+++ b/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityWindowQueryTest.java
@@ -29,12 +29,14 @@
import android.graphics.Rect;
import android.os.SystemClock;
import android.test.suitebuilder.annotation.MediumTest;
-import android.util.Log;
+import android.view.Gravity;
+import android.view.WindowManager;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
import android.view.accessibility.AccessibilityWindowInfo;
+import android.widget.Button;
import com.android.cts.accessibilityservice.R;
import java.util.ArrayList;
@@ -268,152 +270,26 @@
}
@MediumTest
- public void testInteractWithNavBarWindow() throws Exception {
- setAccessInteractiveWindowsFlag();
- try {
- final UiAutomation uiAutomation = getInstrumentation().getUiAutomation();
- uiAutomation.executeAndWaitForEvent(new Runnable() {
- @Override
- public void run() {
- AccessibilityWindowInfo window = uiAutomation.getWindows().get(0);
- assertTrue(window.getRoot().performAction(
- AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS));
- }
- }, new UiAutomation.AccessibilityEventFilter() {
- @Override
- public boolean accept(AccessibilityEvent event) {
- return event.getEventType() ==
- AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED;
- }
- }, TIMEOUT_ASYNC_PROCESSING);
- } finally {
- ensureAccessibilityFocusCleared();
- clearAccessInteractiveWindowsFlag();
- }
- }
-
- @MediumTest
- public void testInteractWithStatusBarWindow() throws Exception {
- setAccessInteractiveWindowsFlag();
- try {
- final UiAutomation uiAutomation = getInstrumentation().getUiAutomation();
- uiAutomation.executeAndWaitForEvent(new Runnable() {
- @Override
- public void run() {
- AccessibilityWindowInfo window = uiAutomation.getWindows().get(1);
- assertTrue(window.getRoot().performAction(
- AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS));
-
- }
- }, new UiAutomation.AccessibilityEventFilter() {
- @Override
- public boolean accept(AccessibilityEvent event) {
- return event.getEventType() ==
- AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED;
- }
- }, TIMEOUT_ASYNC_PROCESSING);
- } finally {
- ensureAccessibilityFocusCleared();
- clearAccessInteractiveWindowsFlag();
- }
- }
-
- @MediumTest
public void testSingleAccessibilityFocusAcrossWindows() throws Exception {
setAccessInteractiveWindowsFlag();
try {
- final UiAutomation uiAutomation = getInstrumentation().getUiAutomation();
+ // Add two more windows.
+ addTwoAppPanelWindows();
- uiAutomation.waitForIdle(TIMEOUT_WINDOW_STATE_IDLE, TIMEOUT_ASYNC_PROCESSING);
-
- getInstrumentation().getUiAutomation().executeAndWaitForEvent(new Runnable() {
- @Override
- public void run() {
- // Set focus in the first window.
- List<AccessibilityWindowInfo> windows = uiAutomation.getWindows();
- AccessibilityNodeInfo firstWindowRoot = windows.get(0).getRoot();
- assertTrue(firstWindowRoot.performAction(
- AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS));
- }
- }, new UiAutomation.AccessibilityEventFilter() {
- @Override
- public boolean accept(AccessibilityEvent event) {
- return event.getEventType() == AccessibilityEvent.TYPE_WINDOWS_CHANGED;
- }
- }, TIMEOUT_ASYNC_PROCESSING);
-
- // Wait for things to settle.
- waitForIdle();
-
- List<AccessibilityWindowInfo> windows = uiAutomation.getWindows();
-
- AccessibilityNodeInfo firstWindowRoot = windows.get(0).getRoot();
- AccessibilityNodeInfo secondWindowRoot = windows.get(1).getRoot();
- AccessibilityNodeInfo thirdWindowRoot = windows.get(2).getRoot();
-
- // Ensure accessibility focus is where we put it.
- assertTrue(windows.get(0).isAccessibilityFocused());
-
+ // Put accessibility focus in the first app window.
+ ensureAppWindowFocusedOrFail(0);
// Make sure there only one accessibility focus.
- assertEquals(uiAutomation.findFocus(
- AccessibilityNodeInfo.FOCUS_ACCESSIBILITY), firstWindowRoot);
- assertEquals(firstWindowRoot.findFocus(
- AccessibilityNodeInfo.FOCUS_ACCESSIBILITY), firstWindowRoot);
- assertNull(secondWindowRoot.findFocus(
- AccessibilityNodeInfo.FOCUS_ACCESSIBILITY));
- assertNull(thirdWindowRoot.findFocus(
- AccessibilityNodeInfo.FOCUS_ACCESSIBILITY));
+ assertSingleAccessibilityFocus();
-
- // Set focus in the second window.
- assertTrue(secondWindowRoot.performAction(
- AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS));
-
- // Wait for things to settle.
- uiAutomation.waitForIdle(TIMEOUT_WINDOW_STATE_IDLE, TIMEOUT_ASYNC_PROCESSING);
-
+ // Put accessibility focus in the second app window.
+ ensureAppWindowFocusedOrFail(1);
// Make sure there only one accessibility focus.
- assertEquals(uiAutomation.findFocus(
- AccessibilityNodeInfo.FOCUS_ACCESSIBILITY), secondWindowRoot);
- assertEquals(secondWindowRoot.findFocus(
- AccessibilityNodeInfo.FOCUS_ACCESSIBILITY), secondWindowRoot);
- assertNull(firstWindowRoot.findFocus(
- AccessibilityNodeInfo.FOCUS_ACCESSIBILITY));
- assertNull(thirdWindowRoot.findFocus(
- AccessibilityNodeInfo.FOCUS_ACCESSIBILITY));
+ assertSingleAccessibilityFocus();
-
- // Set focus in the third window.
- assertTrue(thirdWindowRoot.performAction(
- AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS));
-
- // Wait for things to settle.
- uiAutomation.waitForIdle(TIMEOUT_WINDOW_STATE_IDLE, TIMEOUT_ASYNC_PROCESSING);
-
+ // Put accessibility focus in the third app window.
+ ensureAppWindowFocusedOrFail(2);
// Make sure there only one accessibility focus.
- assertEquals(uiAutomation.findFocus(
- AccessibilityNodeInfo.FOCUS_ACCESSIBILITY), thirdWindowRoot);
- assertEquals(thirdWindowRoot.findFocus(
- AccessibilityNodeInfo.FOCUS_ACCESSIBILITY), thirdWindowRoot);
- assertNull(firstWindowRoot.findFocus(
- AccessibilityNodeInfo.FOCUS_ACCESSIBILITY));
- assertNull(secondWindowRoot.findFocus(
- AccessibilityNodeInfo.FOCUS_ACCESSIBILITY));
-
-
- // Clear focus.
- assertTrue(thirdWindowRoot.performAction(
- AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS));
-
- // Make sure there is not accessibility focus.
- assertNull(uiAutomation.findFocus(
- AccessibilityNodeInfo.FOCUS_ACCESSIBILITY));
- assertNull(firstWindowRoot.findFocus(
- AccessibilityNodeInfo.FOCUS_ACCESSIBILITY));
- assertNull(secondWindowRoot.findFocus(
- AccessibilityNodeInfo.FOCUS_ACCESSIBILITY));
- assertNull(thirdWindowRoot.findFocus(
- AccessibilityNodeInfo.FOCUS_ACCESSIBILITY));
+ assertSingleAccessibilityFocus();
} finally {
ensureAccessibilityFocusCleared();
clearAccessInteractiveWindowsFlag();
@@ -761,6 +637,152 @@
}
}
+ private void assertSingleAccessibilityFocus() {
+ UiAutomation uiAutomation = getInstrumentation().getUiAutomation();
+ List<AccessibilityWindowInfo> windows = uiAutomation.getWindows();
+ AccessibilityWindowInfo focused = null;
+
+ final int windowCount = windows.size();
+ for (int i = 0; i < windowCount; i++) {
+ AccessibilityWindowInfo window = windows.get(i);
+
+ if (window.isAccessibilityFocused()) {
+ if (focused == null) {
+ focused = window;
+
+ AccessibilityNodeInfo root = window.getRoot();
+ assertEquals(uiAutomation.findFocus(
+ AccessibilityNodeInfo.FOCUS_ACCESSIBILITY), root);
+ assertEquals(root.findFocus(
+ AccessibilityNodeInfo.FOCUS_ACCESSIBILITY), root);
+ } else {
+ throw new AssertionError("Duplicate accessibility focus");
+ }
+ } else {
+ assertNull(window.getRoot().findFocus(
+ AccessibilityNodeInfo.FOCUS_ACCESSIBILITY));
+ }
+ }
+ }
+
+ private void ensureAppWindowFocusedOrFail(int appWindowIndex) throws TimeoutException {
+ UiAutomation uiAutomation = getInstrumentation().getUiAutomation();
+ List<AccessibilityWindowInfo> windows = uiAutomation.getWindows();
+ AccessibilityWindowInfo focusTareget = null;
+
+ int visitedAppWindows = -1;
+ final int windowCount = windows.size();
+ for (int i = 0; i < windowCount; i++) {
+ AccessibilityWindowInfo window = windows.get(i);
+ if (window.getType() == AccessibilityWindowInfo.TYPE_APPLICATION) {
+ visitedAppWindows++;
+ if (appWindowIndex <= visitedAppWindows) {
+ focusTareget = window;
+ break;
+ }
+ }
+ }
+
+ if (focusTareget == null) {
+ throw new IllegalStateException("Couldn't find app window: " + appWindowIndex);
+ }
+
+ if (focusTareget.isAccessibilityFocused()) {
+ return;
+ }
+
+ final AccessibilityWindowInfo finalFocusTarget = focusTareget;
+ uiAutomation.executeAndWaitForEvent(new Runnable() {
+ @Override
+ public void run() {
+ assertTrue(finalFocusTarget.getRoot().performAction(
+ AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS));
+ }
+ }, new UiAutomation.AccessibilityEventFilter() {
+ @Override
+ public boolean accept(AccessibilityEvent event) {
+ return event.getEventType() == AccessibilityEvent.TYPE_WINDOWS_CHANGED;
+ }
+ }, TIMEOUT_ASYNC_PROCESSING);
+
+ windows = uiAutomation.getWindows();
+ for (int i = 0; i < windowCount; i++) {
+ AccessibilityWindowInfo window = windows.get(i);
+ if (window.getId() == focusTareget.getId()) {
+ assertTrue(window.isAccessibilityFocused());
+ break;
+ }
+ }
+ }
+
+ private void addTwoAppPanelWindows() throws TimeoutException {
+ final UiAutomation uiAutomation = getInstrumentation().getUiAutomation();
+
+ uiAutomation.waitForIdle(TIMEOUT_WINDOW_STATE_IDLE, TIMEOUT_ASYNC_PROCESSING);
+
+ // Add the first window.
+ uiAutomation.executeAndWaitForEvent(new Runnable() {
+ @Override
+ public void run() {
+ getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ WindowManager.LayoutParams params = new WindowManager.LayoutParams();
+ params.gravity = Gravity.TOP;
+ params.width = WindowManager.LayoutParams.MATCH_PARENT;
+ params.height = WindowManager.LayoutParams.WRAP_CONTENT;
+ params.flags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
+ | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR
+ | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+ | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
+ params.type = WindowManager.LayoutParams.TYPE_APPLICATION_PANEL;
+ params.token = getActivity().getWindow().getDecorView().getWindowToken();
+
+ Button button = new Button(getActivity());
+ button.setText(R.string.button1);
+ getActivity().getWindowManager().addView(button, params);
+ }
+ });
+ }
+ }, new UiAutomation.AccessibilityEventFilter() {
+ @Override
+ public boolean accept(AccessibilityEvent event) {
+ return event.getEventType() == AccessibilityEvent.TYPE_WINDOWS_CHANGED;
+ }
+ }, TIMEOUT_ASYNC_PROCESSING);
+
+ // Add the second window.
+ uiAutomation.executeAndWaitForEvent(new Runnable() {
+ @Override
+ public void run() {
+ getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ WindowManager.LayoutParams params = new WindowManager.LayoutParams();
+ params.gravity = Gravity.BOTTOM;
+ params.width = WindowManager.LayoutParams.MATCH_PARENT;
+ params.height = WindowManager.LayoutParams.WRAP_CONTENT;
+ params.flags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
+ | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR
+ | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+ | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
+ params.type = WindowManager.LayoutParams.TYPE_APPLICATION_PANEL;
+ params.token = getActivity().getWindow().getDecorView().getWindowToken();
+
+ Button button = new Button(getActivity());
+ button.setText(R.string.button2);
+ getActivity().getWindowManager().addView(button, params);
+ }
+ });
+ }
+ }, new UiAutomation.AccessibilityEventFilter() {
+ @Override
+ public boolean accept(AccessibilityEvent event) {
+ return event.getEventType() == AccessibilityEvent.TYPE_WINDOWS_CHANGED;
+ }
+ }, TIMEOUT_ASYNC_PROCESSING);
+ }
+
private void setAccessInteractiveWindowsFlag () {
UiAutomation uiAutomation = getInstrumentation().getUiAutomation();
AccessibilityServiceInfo info = uiAutomation.getServiceInfo();
diff --git a/tests/tests/accounts/Android.mk b/tests/tests/accounts/Android.mk
index 39dbfb1..1579822 100644
--- a/tests/tests/accounts/Android.mk
+++ b/tests/tests/accounts/Android.mk
@@ -21,7 +21,7 @@
# and when built explicitly put it in the data partition
LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-LOCAL_STATIC_JAVA_LIBRARIES += android-common ctstestrunner
+LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
LOCAL_SRC_FILES := $(call all-java-files-under, src)
diff --git a/tests/tests/accounts/AndroidManifest.xml b/tests/tests/accounts/AndroidManifest.xml
index cf7f7d8..22362ab 100644
--- a/tests/tests/accounts/AndroidManifest.xml
+++ b/tests/tests/accounts/AndroidManifest.xml
@@ -28,6 +28,13 @@
<application>
<uses-library android:name="android.test.runner" />
+ <activity android:name="android.accounts.cts.AccountDummyActivity" >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+
<service android:name="MockAccountService" android:exported="true"
android:process="android.accounts.cts">
<intent-filter>
diff --git a/tests/src/android/os/cts/TaggedPointer.java b/tests/tests/accounts/src/android/accounts/cts/AccountDummyActivity.java
similarity index 78%
copy from tests/src/android/os/cts/TaggedPointer.java
copy to tests/tests/accounts/src/android/accounts/cts/AccountDummyActivity.java
index 16e76c9..a345dcc 100644
--- a/tests/src/android/os/cts/TaggedPointer.java
+++ b/tests/tests/accounts/src/android/accounts/cts/AccountDummyActivity.java
@@ -14,13 +14,12 @@
* limitations under the License.
*/
-package android.os.cts;
+package android.accounts.cts;
-public class TaggedPointer {
+import android.app.Activity;
- static {
- System.loadLibrary("cts_jni");
- }
-
- public static native boolean hasTaggedPointer();
+/**
+ * An activity.
+ */
+public class AccountDummyActivity extends Activity {
}
diff --git a/tests/tests/accounts/src/android/accounts/cts/AccountManagerTest.java b/tests/tests/accounts/src/android/accounts/cts/AccountManagerTest.java
index f443d30..e5cc45a 100644
--- a/tests/tests/accounts/src/android/accounts/cts/AccountManagerTest.java
+++ b/tests/tests/accounts/src/android/accounts/cts/AccountManagerTest.java
@@ -28,8 +28,9 @@
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
+import android.os.Looper;
import android.os.StrictMode;
-import android.test.AndroidTestCase;
+import android.test.ActivityInstrumentationTestCase2;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
@@ -41,9 +42,9 @@
* adb shell am instrument
* -e debug false -w
* -e class android.accounts.cts.AccountManagerTest
- * android.accounts.cts/android.test.InstrumentationTestRunner
+ * android.accounts.cts/android.support.test.runner.AndroidJUnitRunner
*/
-public class AccountManagerTest extends AndroidTestCase {
+public class AccountManagerTest extends ActivityInstrumentationTestCase2<AccountDummyActivity> {
public static final String ACCOUNT_NAME = "android.accounts.cts.account.name";
public static final String ACCOUNT_NEW_NAME = "android.accounts.cts.account.name.rename";
@@ -70,7 +71,6 @@
public static final String[] REQUIRED_FEATURES = new String[] { FEATURE_1, FEATURE_2 };
- public static final Activity ACTIVITY = new Activity();
public static final Bundle OPTIONS_BUNDLE = new Bundle();
public static final Bundle USERDATA_BUNDLE = new Bundle();
@@ -94,18 +94,27 @@
return mockAuthenticator;
}
+ private Activity mActivity;
+ private Context mContext;
+
+ public AccountManagerTest() {
+ super(AccountDummyActivity.class);
+ }
+
@Override
public void setUp() throws Exception {
super.setUp();
+ mActivity = getActivity();
+ mContext = getInstrumentation().getTargetContext();
OPTIONS_BUNDLE.putString(OPTION_NAME_1, OPTION_VALUE_1);
OPTIONS_BUNDLE.putString(OPTION_NAME_2, OPTION_VALUE_2);
USERDATA_BUNDLE.putString(USERDATA_NAME_1, USERDATA_VALUE_1);
- getMockAuthenticator(getContext());
+ getMockAuthenticator(mContext);
- am = AccountManager.get(getContext());
+ am = AccountManager.get(mContext);
}
@Override
@@ -264,7 +273,7 @@
* Test singleton
*/
public void testGet() {
- assertNotNull(AccountManager.get(getContext()));
+ assertNotNull(AccountManager.get(mContext));
}
/**
@@ -278,7 +287,7 @@
AUTH_TOKEN_TYPE,
REQUIRED_FEATURES,
OPTIONS_BUNDLE,
- ACTIVITY,
+ mActivity,
null /* callback */,
null /* handler */);
@@ -302,7 +311,7 @@
AuthenticatorException, OperationCanceledException {
testAddAccountWithCallbackAndHandler(null /* handler */);
- testAddAccountWithCallbackAndHandler(new Handler());
+ testAddAccountWithCallbackAndHandler(new Handler(Looper.getMainLooper()));
}
private void testAddAccountWithCallbackAndHandler(Handler handler) throws IOException,
@@ -343,7 +352,7 @@
AUTH_TOKEN_TYPE,
REQUIRED_FEATURES,
OPTIONS_BUNDLE,
- ACTIVITY,
+ mActivity,
callback,
handler);
@@ -549,7 +558,7 @@
addAccountExplicitly(ACCOUNT, ACCOUNT_PASSWORD, null /* userData */);
testGetAccountsByTypeAndFeaturesWithCallbackAndHandler(null /* handler */);
- testGetAccountsByTypeAndFeaturesWithCallbackAndHandler(new Handler());
+ testGetAccountsByTypeAndFeaturesWithCallbackAndHandler(new Handler(Looper.getMainLooper()));
}
private void testGetAccountsByTypeAndFeaturesWithCallbackAndHandler(Handler handler) throws
@@ -702,7 +711,7 @@
addAccountExplicitly(ACCOUNT, ACCOUNT_PASSWORD, null /* userData */);
testGetAuthTokenWithCallbackAndHandler(null /* handler */);
- testGetAuthTokenWithCallbackAndHandler(new Handler());
+ testGetAuthTokenWithCallbackAndHandler(new Handler(Looper.getMainLooper()));
}
private void testGetAuthTokenWithCallbackAndHandler(Handler handler) throws IOException,
@@ -764,7 +773,7 @@
AccountManagerFuture<Bundle> futureBundle = am.getAuthToken(ACCOUNT,
AUTH_TOKEN_TYPE,
OPTIONS_BUNDLE,
- ACTIVITY,
+ mActivity,
null /* no callback */,
null /* no handler */
);
@@ -793,7 +802,7 @@
addAccountExplicitly(ACCOUNT, ACCOUNT_PASSWORD, null /* userData */);
testGetAuthTokenWithOptionsAndCallbackAndHandler(null /* handler */);
- testGetAuthTokenWithOptionsAndCallbackAndHandler(new Handler());
+ testGetAuthTokenWithOptionsAndCallbackAndHandler(new Handler(Looper.getMainLooper()));
}
private void testGetAuthTokenWithOptionsAndCallbackAndHandler(Handler handler) throws
@@ -827,7 +836,7 @@
AccountManagerFuture<Bundle> futureBundle = am.getAuthToken(ACCOUNT,
AUTH_TOKEN_TYPE,
OPTIONS_BUNDLE,
- ACTIVITY,
+ mActivity,
callback,
handler
);
@@ -871,7 +880,7 @@
// Now test with existing features and an activity
resultBundle = getAuthTokenByFeature(
new String[] { NON_EXISTING_FEATURE },
- ACTIVITY
+ mActivity
);
// Assert returned result
@@ -903,7 +912,7 @@
// Now test with existing features and an activity
resultBundle = getAuthTokenByFeature(
REQUIRED_FEATURES,
- ACTIVITY
+ mActivity
);
// Assert returned result
@@ -926,7 +935,7 @@
AccountManagerFuture<Bundle> futureBundle = am.confirmCredentials(ACCOUNT,
OPTIONS_BUNDLE,
- ACTIVITY,
+ mActivity,
null /* callback*/,
null /* handler */);
@@ -945,7 +954,7 @@
addAccountExplicitly(ACCOUNT, ACCOUNT_PASSWORD, null /* userData */);
testConfirmCredentialsWithCallbackAndHandler(null /* handler */);
- testConfirmCredentialsWithCallbackAndHandler(new Handler());
+ testConfirmCredentialsWithCallbackAndHandler(new Handler(Looper.getMainLooper()));
}
private void testConfirmCredentialsWithCallbackAndHandler(Handler handler) throws IOException,
@@ -979,7 +988,7 @@
AccountManagerFuture<Bundle> futureBundle = am.confirmCredentials(ACCOUNT,
OPTIONS_BUNDLE,
- ACTIVITY,
+ mActivity,
callback,
handler);
@@ -1004,7 +1013,7 @@
AccountManagerFuture<Bundle> futureBundle = am.updateCredentials(ACCOUNT,
AUTH_TOKEN_TYPE,
OPTIONS_BUNDLE,
- ACTIVITY,
+ mActivity,
null /* callback*/,
null /* handler */);
@@ -1025,7 +1034,7 @@
addAccountExplicitly(ACCOUNT, ACCOUNT_PASSWORD, null /* userData */);
testUpdateCredentialsWithCallbackAndHandler(null /* handler */);
- testUpdateCredentialsWithCallbackAndHandler(new Handler());
+ testUpdateCredentialsWithCallbackAndHandler(new Handler(Looper.getMainLooper()));
}
private void testUpdateCredentialsWithCallbackAndHandler(Handler handler) throws IOException,
@@ -1060,7 +1069,7 @@
AccountManagerFuture<Bundle> futureBundle = am.updateCredentials(ACCOUNT,
AUTH_TOKEN_TYPE,
OPTIONS_BUNDLE,
- ACTIVITY,
+ mActivity,
callback,
handler);
@@ -1081,7 +1090,7 @@
OperationCanceledException {
AccountManagerFuture<Bundle> futureBundle = am.editProperties(ACCOUNT_TYPE,
- ACTIVITY,
+ mActivity,
null /* callback */,
null /* handler*/);
@@ -1098,7 +1107,7 @@
*/
public void testEditPropertiesWithCallbackAndHandler() {
testEditPropertiesWithCallbackAndHandler(null /* handler */);
- testEditPropertiesWithCallbackAndHandler(new Handler());
+ testEditPropertiesWithCallbackAndHandler(new Handler(Looper.getMainLooper()));
}
private void testEditPropertiesWithCallbackAndHandler(Handler handler) {
@@ -1117,7 +1126,7 @@
};
AccountManagerFuture<Bundle> futureBundle = am.editProperties(ACCOUNT_TYPE,
- ACTIVITY,
+ mActivity,
callback,
handler);
@@ -1147,13 +1156,13 @@
// Need to cleanup intermediate state
assertTrue(removeAccount(am, ACCOUNT, null /* callback */));
- testAddOnAccountsUpdatedListenerWithHandler(new Handler(),
+ testAddOnAccountsUpdatedListenerWithHandler(new Handler(Looper.getMainLooper()),
false /* updateImmediately */);
// Need to cleanup intermediate state
assertTrue(removeAccount(am, ACCOUNT, null /* callback */));
- testAddOnAccountsUpdatedListenerWithHandler(new Handler(),
+ testAddOnAccountsUpdatedListenerWithHandler(new Handler(Looper.getMainLooper()),
true /* updateImmediately */);
}
@@ -1197,7 +1206,7 @@
// Need to cleanup intermediate state
assertTrue(removeAccount(am, ACCOUNT, null /* callback */));
- testRemoveOnAccountsUpdatedListenerWithHandler(new Handler());
+ testRemoveOnAccountsUpdatedListenerWithHandler(new Handler(Looper.getMainLooper()));
}
private void testRemoveOnAccountsUpdatedListenerWithHandler(Handler handler) {
@@ -1234,10 +1243,10 @@
throws IOException, AuthenticatorException, OperationCanceledException {
assertHasFeature(null /* handler */);
- assertHasFeature(new Handler());
+ assertHasFeature(new Handler(Looper.getMainLooper()));
assertHasFeatureWithCallback(null /* handler */);
- assertHasFeatureWithCallback(new Handler());
+ assertHasFeatureWithCallback(new Handler(Looper.getMainLooper()));
}
private void assertHasFeature(Handler handler)
@@ -1247,7 +1256,7 @@
AUTH_TOKEN_TYPE,
REQUIRED_FEATURES,
OPTIONS_BUNDLE,
- ACTIVITY,
+ mActivity,
null /* callback */,
null /* handler */);
@@ -1338,7 +1347,7 @@
AUTH_TOKEN_TYPE,
REQUIRED_FEATURES,
OPTIONS_BUNDLE,
- ACTIVITY,
+ mActivity,
null /* callback */,
null /* handler */);
diff --git a/tests/tests/animation/src/android/animation/cts/AnimatorTest.java b/tests/tests/animation/src/android/animation/cts/AnimatorTest.java
index 5f07afb..fac9ff9 100644
--- a/tests/tests/animation/src/android/animation/cts/AnimatorTest.java
+++ b/tests/tests/animation/src/android/animation/cts/AnimatorTest.java
@@ -19,6 +19,7 @@
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.test.ActivityInstrumentationTestCase2;
+import android.test.UiThreadTest;
import android.view.animation.AccelerateInterpolator;
import java.util.List;
@@ -55,7 +56,8 @@
assertEquals(startDelay, mAnimator.getStartDelay());
}
- public void testStart() {
+ @UiThreadTest
+ public void testStart() throws Exception {
mAnimator.start();
assertTrue(mAnimator.isRunning());
assertTrue(mAnimator.isStarted());
@@ -135,10 +137,20 @@
assertFalse(listener.mEnd);
assertTrue(listener.mRepeat >= 0);
- mAnimator.cancel();
+ mActivity.runOnUiThread(new Runnable() {
+ public void run() {
+ mAnimator.cancel();
+ }
+ });
+ getInstrumentation().waitForIdleSync();
assertTrue(listener.mCancel);
- mAnimator.end();
+ mActivity.runOnUiThread(new Runnable() {
+ public void run() {
+ mAnimator.end();
+ }
+ });
+ getInstrumentation().waitForIdleSync();
assertTrue(listener.mEnd);
}
diff --git a/tests/tests/animation/src/android/animation/cts/ObjectAnimatorTest.java b/tests/tests/animation/src/android/animation/cts/ObjectAnimatorTest.java
index f8f1f43..f0db168 100644
--- a/tests/tests/animation/src/android/animation/cts/ObjectAnimatorTest.java
+++ b/tests/tests/animation/src/android/animation/cts/ObjectAnimatorTest.java
@@ -88,13 +88,18 @@
int startColor = mActivity.view.RED;
int endColor = mActivity.view.BLUE;
- ObjectAnimator colorAnimator = ObjectAnimator.ofInt(object, property,
+ final ObjectAnimator colorAnimator = ObjectAnimator.ofInt(object, property,
startColor, endColor);
colorAnimator.setDuration(1000);
colorAnimator.setEvaluator(new ArgbEvaluator());
colorAnimator.setRepeatCount(1);
colorAnimator.setRepeatMode(ValueAnimator.REVERSE);
- colorAnimator.start();
+ mActivity.runOnUiThread(new Runnable() {
+ public void run() {
+ colorAnimator.start();
+ }
+ });
+ getInstrumentation().waitForIdleSync();
startAnimation(mObjectAnimator, colorAnimator);
Thread.sleep(100);
Integer i = (Integer) colorAnimator.getAnimatedValue();
@@ -110,12 +115,17 @@
int endColor = mActivity.view.BLUE;
Object[] values = {new Integer(startColor), new Integer(endColor)};
ArgbEvaluator evaluator = new ArgbEvaluator();
- ObjectAnimator colorAnimator = ObjectAnimator.ofObject(object, property,
+ final ObjectAnimator colorAnimator = ObjectAnimator.ofObject(object, property,
evaluator, values);
colorAnimator.setDuration(1000);
colorAnimator.setRepeatCount(1);
colorAnimator.setRepeatMode(ValueAnimator.REVERSE);
- colorAnimator.start();
+ mActivity.runOnUiThread(new Runnable() {
+ public void run() {
+ colorAnimator.start();
+ }
+ });
+ getInstrumentation().waitForIdleSync();
startAnimation(mObjectAnimator, colorAnimator);
Thread.sleep(100);
Integer i = (Integer) colorAnimator.getAnimatedValue();
@@ -132,12 +142,17 @@
int values[] = {startColor, endColor};
ArgbEvaluator evaluator = new ArgbEvaluator();
PropertyValuesHolder propertyValuesHolder = PropertyValuesHolder.ofInt(propertyName, values);
- ObjectAnimator colorAnimator = ObjectAnimator.ofPropertyValuesHolder(object,
+ final ObjectAnimator colorAnimator = ObjectAnimator.ofPropertyValuesHolder(object,
propertyValuesHolder);
colorAnimator.setDuration(1000);
colorAnimator.setRepeatCount(1);
colorAnimator.setRepeatMode(ValueAnimator.REVERSE);
- colorAnimator.start();
+ mActivity.runOnUiThread(new Runnable() {
+ public void run() {
+ colorAnimator.start();
+ }
+ });
+ getInstrumentation().waitForIdleSync();
startAnimation(mObjectAnimator, colorAnimator);
Thread.sleep(100);
Integer i = (Integer) colorAnimator.getAnimatedValue();
diff --git a/tests/tests/app/Android.mk b/tests/tests/app/Android.mk
index d4387b4..136f072 100644
--- a/tests/tests/app/Android.mk
+++ b/tests/tests/app/Android.mk
@@ -23,12 +23,11 @@
LOCAL_JAVA_LIBRARIES := android.test.runner telephony-common voip-common
-LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
+LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner ctstestserver
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_SRC_FILES := $(call all-java-files-under, src) \
+ src/android/app/cts/ISecondary.aidl
LOCAL_PACKAGE_NAME := CtsAppTestCases
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
-
include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/app/AndroidManifest.xml b/tests/tests/app/AndroidManifest.xml
index 134df64..6cafe80 100644
--- a/tests/tests/app/AndroidManifest.xml
+++ b/tests/tests/app/AndroidManifest.xml
@@ -16,15 +16,273 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.app.cts">
+ package="com.android.cts.app">
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
- <application>
+
+ <permission android:name="android.app.cts.permission.TEST_GRANTED"
+ android:protectionLevel="normal"
+ android:label="@string/permlab_testGranted"
+ android:description="@string/permdesc_testGranted">
+ <meta-data android:name="android.app.cts.string" android:value="foo" />
+ <meta-data android:name="android.app.cts.boolean" android:value="true" />
+ <meta-data android:name="android.app.cts.integer" android:value="100" />
+ <meta-data android:name="android.app.cts.color" android:value="#ff000000" />
+ <meta-data android:name="android.app.cts.float" android:value="100.1" />
+ <meta-data android:name="android.app.cts.reference" android:resource="@xml/metadata" />
+ </permission>
+
+ <uses-permission android:name="android.app.cts.permission.TEST_GRANTED" />
+ <uses-permission android:name="android.permission.READ_CONTACTS" />
+ <uses-permission android:name="android.permission.WRITE_CONTACTS" />
+ <uses-permission android:name="android.permission.INTERNET" />
+ <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
+ <uses-permission android:name="android.permission.CAMERA" />
+ <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
+ <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
+ <uses-permission android:name="android.permission.SET_WALLPAPER_HINTS" />
+ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+
+ <application android:label="Android TestCase"
+ android:icon="@drawable/size_48x48"
+ android:maxRecents="1"
+ android:multiArch="true"
+ android:name="android.app.cts.MockApplication"
+ android:supportsRtl="true">
<uses-library android:name="android.test.runner" />
+
+ <activity android:name="android.app.cts.ActionBarActivity" />
+
+ <activity android:name="android.app.cts.DialogCtsActivity"
+ android:label="DialogCtsActivity"
+ android:configChanges="keyboardHidden|orientation|screenSize">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.app.cts.MockActivity" android:label="MockActivity">
+ <meta-data android:name="android.app.alias"
+ android:resource="@xml/alias" />
+ <meta-data android:name="android.app.intent.filter"
+ android:resource="@xml/intentfilter" />
+ </activity>
+
+ <activity android:name="android.app.cts.MockApplicationActivity"
+ android:label="MockApplicationActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN"/>
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.app.cts.InstrumentationTestActivity"
+ android:theme="@style/Theme_NoSwipeDismiss"
+ android:label="InstrumentationTestActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:mimeType="vnd.android.cursor.dir/person" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.app.cts.AliasActivityStub">
+ <meta-data android:name="android.app.alias"
+ android:resource="@xml/alias" />
+ </activity>
+
+ <activity android:name="android.app.cts.ChildActivity"
+ android:label="ChildActivity" />
+
+ <receiver android:name="android.app.cts.MockReceiver">
+ <intent-filter>
+ <action android:name="android.app.cts.PendingIntentTest.TEST_RECEIVER" />
+ </intent-filter>
+ </receiver>
+
+ <service android:name="android.app.cts.MockService" />
+
+ <activity android:name="android.app.cts.SearchManagerCtsActivity"
+ android:label="SearchManagerCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.SEARCH" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" />
+ </activity>
+
+ <service android:name="android.app.cts.LocalService">
+ <intent-filter>
+ <action android:name="android.app.cts.activity.SERVICE_LOCAL" />
+ </intent-filter>
+ <meta-data android:name="android.app.cts.string" android:value="foo" />
+ <meta-data android:name="android.app.cts.boolean" android:value="true" />
+ <meta-data android:name="android.app.cts.integer" android:value="100" />
+ <meta-data android:name="android.app.cts.color" android:value="#ff000000" />
+ <meta-data android:name="android.app.cts.float" android:value="100.1" />
+ <meta-data android:name="android.app.cts.reference" android:resource="@xml/metadata" />
+ </service>
+
+ <service android:name="android.app.cts.LocalGrantedService"
+ android:permission="android.app.cts.permission.TEST_GRANTED">
+ <intent-filter>
+ <action android:name="android.app.cts.activity.SERVICE_LOCAL_GRANTED" />
+ </intent-filter>
+ </service>
+
+ <service android:name="android.app.cts.LocalDeniedService"
+ android:permission="android.app.cts.permission.TEST_DENIED">
+ <intent-filter>
+ <action android:name="android.app.cts.activity.SERVICE_LOCAL_DENIED" />
+ </intent-filter>
+ </service>
+
+ <activity android:name="android.app.cts.TestedScreen"
+ android:process=":remoteScreen">
+ </activity>
+ <activity android:name="android.app.cts.LocalScreen" android:multiprocess="true">
+ </activity>
+ <activity android:name="android.app.cts.ClearTop" android:multiprocess="true"
+ android:launchMode="singleTop">
+ </activity>
+ <activity android:name="android.app.cts.LocalDialog" android:multiprocess="true"
+ android:theme="@android:style/Theme.Dialog">
+ </activity>
+
+ <activity android:name="android.app.cts.PendingIntentCtsActivity"
+ android:label="PendingIntentCtsActivity"/>
+
+ <activity android:name="android.app.cts.LocalActivityManagerCtsActivity"
+ android:label="LocalActivityManagerCtsActivity" />
+
+ <activity android:name="android.app.cts.LocalActivityManagerTestHelper"
+ android:label="LocalActivityManagerTestHelper" />
+
+ <activity android:name="android.app.cts.LaunchpadTabActivity" android:multiprocess="true">
+ </activity>
+
+ <activity android:name="android.app.cts.LocalActivity" android:multiprocess="true">
+ <meta-data android:name="android.app.cts.string" android:value="foo" />
+ <meta-data android:name="android.app.cts.boolean" android:value="true" />
+ <meta-data android:name="android.app.cts.integer" android:value="100" />
+ <meta-data android:name="android.app.cts.color" android:value="#ff000000" />
+ <meta-data android:name="android.app.cts.float" android:value="100.1" />
+ <meta-data android:name="android.app.cts.reference" android:resource="@xml/metadata" />
+ </activity>
+
+ <activity android:name="android.app.cts.TestedActivity"
+ android:process=":remoteActivity">
+ </activity>
+
+ <activity android:name="android.app.cts.ExpandableListTestActivity"
+ android:label="ExpandableListTestActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.app.cts.ChildTabActivity" android:label="ChildTabActivity" />
+
+ <activity android:name="android.app.cts.LauncherActivityStub"
+ android:label="LauncherActivityStub" >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN"/>
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.app.cts.MockTabActivity" android:label="MockTabActivity" />
+
+ <activity android:name="android.app.cts.AppCtsActivity" android:label="AppCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.app.cts.DialogCtsActivity"
+ android:theme="@style/Theme_NoSwipeDismiss"
+ android:label="DialogCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.app.cts.ActivityManagerStubFooActivity"
+ android:label="ActivityManagerStubFooActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.app.cts.ActivityManagerRecentOneActivity"
+ android:label="ActivityManagerRecentOneActivity"
+ android:allowTaskReparenting="true"
+ android:taskAffinity="android.app.cts.recentOne">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.app.cts.ActivityManagerRecentTwoActivity"
+ android:label="ActivityManagerRecentTwoActivity"
+ android:allowTaskReparenting="true"
+ android:taskAffinity="android.app.cts.recentTwo">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.app.cts.ActivityManagerStubCrashActivity"
+ android:label="ActivityManagerStubCrashActivity"
+ android:multiprocess="true"
+ android:process=":ActivityManagerStubCrashActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ </intent-filter>
+ </activity>
+
+ <service android:name="android.app.cts.StubRemoteService"
+ android:process=":remote">
+ <intent-filter>
+ <action
+ android:name="android.app.cts.ISecondary" />
+ <action
+ android:name="android.app.REMOTESERVICE" />
+ </intent-filter>
+ </service>
+
+ <activity android:name="android.app.ActivityGroup"
+ android:label="ActivityGroup" />
+
+ <activity android:name="android.app.cts.KeyguardManagerActivity"
+ android:label="KeyguardManagerActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <service android:name="android.app.cts.IntentServiceStub"/>
+
+ <activity android:name="android.app.cts.LaunchpadActivity"
+ android:configChanges="keyboardHidden|orientation|screenSize"
+ android:multiprocess="true">
+ </activity>
+
+ <activity android:name="android.app.cts.ActivityManagerMemoryClassLaunchActivity" />
+
+ <activity android:name="android.app.cts.ActivityManagerMemoryClassTestActivity"
+ android:process=":memoryclass" />
+
</application>
<instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
- android:targetPackage="com.android.cts.stub"
+ android:targetPackage="com.android.cts.app"
android:label="CTS tests of android.app">
<meta-data android:name="listener"
android:value="com.android.cts.runner.CtsTestRunListener" />
diff --git a/tests/assets/noiseandchirps b/tests/tests/app/assets/noiseandchirps
similarity index 100%
rename from tests/assets/noiseandchirps
rename to tests/tests/app/assets/noiseandchirps
Binary files differ
diff --git a/tests/assets/noiseandchirps.mp3 b/tests/tests/app/assets/noiseandchirps.mp3
similarity index 100%
rename from tests/assets/noiseandchirps.mp3
rename to tests/tests/app/assets/noiseandchirps.mp3
Binary files differ
diff --git a/tests/assets/noiseandchirps.ogg b/tests/tests/app/assets/noiseandchirps.ogg
similarity index 100%
rename from tests/assets/noiseandchirps.ogg
rename to tests/tests/app/assets/noiseandchirps.ogg
Binary files differ
diff --git a/tests/assets/noiseandchirps.wrong b/tests/tests/app/assets/noiseandchirps.wrong
similarity index 100%
rename from tests/assets/noiseandchirps.wrong
rename to tests/tests/app/assets/noiseandchirps.wrong
Binary files differ
diff --git a/tests/tests/app/res/drawable/icon_black.jpg b/tests/tests/app/res/drawable/icon_black.jpg
new file mode 100644
index 0000000..4c9062a
--- /dev/null
+++ b/tests/tests/app/res/drawable/icon_black.jpg
Binary files differ
diff --git a/tests/tests/app/res/drawable/icon_blue.jpg b/tests/tests/app/res/drawable/icon_blue.jpg
new file mode 100644
index 0000000..9e6c1c8
--- /dev/null
+++ b/tests/tests/app/res/drawable/icon_blue.jpg
Binary files differ
diff --git a/tests/tests/app/res/drawable/icon_green.jpg b/tests/tests/app/res/drawable/icon_green.jpg
new file mode 100644
index 0000000..55a78f2
--- /dev/null
+++ b/tests/tests/app/res/drawable/icon_green.jpg
Binary files differ
diff --git a/tests/tests/app/res/drawable/icon_red.jpg b/tests/tests/app/res/drawable/icon_red.jpg
new file mode 100644
index 0000000..6bc9e1f
--- /dev/null
+++ b/tests/tests/app/res/drawable/icon_red.jpg
Binary files differ
diff --git a/tests/tests/app/res/drawable/icon_yellow.jpg b/tests/tests/app/res/drawable/icon_yellow.jpg
new file mode 100644
index 0000000..e748059
--- /dev/null
+++ b/tests/tests/app/res/drawable/icon_yellow.jpg
Binary files differ
diff --git a/tests/tests/app/res/drawable/ninepatch_0.9.png b/tests/tests/app/res/drawable/ninepatch_0.9.png
new file mode 100644
index 0000000..24019d8
--- /dev/null
+++ b/tests/tests/app/res/drawable/ninepatch_0.9.png
Binary files differ
diff --git a/tests/tests/app/res/drawable/ninepatch_1.9.png b/tests/tests/app/res/drawable/ninepatch_1.9.png
new file mode 100644
index 0000000..c56b1db
--- /dev/null
+++ b/tests/tests/app/res/drawable/ninepatch_1.9.png
Binary files differ
diff --git a/tests/tests/app/res/drawable/pass.jpg b/tests/tests/app/res/drawable/pass.jpg
new file mode 100644
index 0000000..2f4b083
--- /dev/null
+++ b/tests/tests/app/res/drawable/pass.jpg
Binary files differ
diff --git a/tests/assets/images/robot.png b/tests/tests/app/res/drawable/robot.png
similarity index 100%
copy from tests/assets/images/robot.png
copy to tests/tests/app/res/drawable/robot.png
Binary files differ
diff --git a/tests/tests/app/res/drawable/size_48x48.jpg b/tests/tests/app/res/drawable/size_48x48.jpg
new file mode 100644
index 0000000..5c2291e
--- /dev/null
+++ b/tests/tests/app/res/drawable/size_48x48.jpg
Binary files differ
diff --git a/tests/tests/app/res/layout/alert_dialog_text_entry.xml b/tests/tests/app/res/layout/alert_dialog_text_entry.xml
new file mode 100644
index 0000000..8b87a5d
--- /dev/null
+++ b/tests/tests/app/res/layout/alert_dialog_text_entry.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <TextView
+ android:id="@+id/username_view"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip"
+ android:text="@string/alert_dialog_username"
+ android:gravity="left"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+
+ <EditText
+ android:id="@+id/username_edit"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip"
+ android:scrollHorizontally="true"
+ android:autoText="false"
+ android:capitalize="none"
+ android:gravity="fill_horizontal"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+
+ <TextView
+ android:id="@+id/password_view"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip"
+ android:text="@string/alert_dialog_password"
+ android:gravity="left"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+
+ <EditText
+ android:id="@+id/password_edit"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip"
+ android:scrollHorizontally="true"
+ android:autoText="false"
+ android:capitalize="none"
+ android:gravity="fill_horizontal"
+ android:password="true"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+
+</LinearLayout>
diff --git a/tests/tests/app/res/layout/alert_dialog_text_entry_2.xml b/tests/tests/app/res/layout/alert_dialog_text_entry_2.xml
new file mode 100644
index 0000000..848b342
--- /dev/null
+++ b/tests/tests/app/res/layout/alert_dialog_text_entry_2.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <TextView
+ android:id="@+id/username_view"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip"
+ android:text="@string/alert_dialog_username"
+ android:gravity="left" />
+
+ <EditText
+ android:id="@+id/username_edit"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip"
+ android:scrollHorizontally="true"
+ android:autoText="false"
+ android:capitalize="none"
+ android:gravity="fill_horizontal" />
+
+</LinearLayout>
diff --git a/tests/tests/app/res/layout/alertdialog_custom_title.xml b/tests/tests/app/res/layout/alertdialog_custom_title.xml
new file mode 100644
index 0000000..ff36f2a
--- /dev/null
+++ b/tests/tests/app/res/layout/alertdialog_custom_title.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/alertdialog_custom_title"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:gravity="center_vertical|center_horizontal"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:text="@string/hello_world"/>
diff --git a/tests/tests/app/res/layout/app_activity.xml b/tests/tests/app/res/layout/app_activity.xml
new file mode 100644
index 0000000..8b7206f
--- /dev/null
+++ b/tests/tests/app/res/layout/app_activity.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 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.
+ -->
+
+<!-- Demonstrates receiving activity results.
+ See corresponding Java code com.android.sdk.app.ReceiveResult.java. -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:padding="4dip"
+ android:gravity="center_horizontal"
+ android:layout_width="match_parent" android:layout_height="match_parent">
+
+ <TextView
+ android:layout_width="match_parent" android:layout_height="wrap_content"
+ android:layout_weight="0"
+ android:paddingBottom="4dip"
+ android:text="@string/forwarding"/>
+
+ <Button android:id="@+id/go"
+ android:layout_width="wrap_content" android:layout_height="wrap_content"
+ android:text="@string/go">
+ <requestFocus />
+ </Button>
+
+</LinearLayout>
+
diff --git a/tests/tests/app/res/layout/checkbox_layout.xml b/tests/tests/app/res/layout/checkbox_layout.xml
new file mode 100644
index 0000000..a1f1718
--- /dev/null
+++ b/tests/tests/app/res/layout/checkbox_layout.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 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.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <CheckBox android:id="@+id/check_box"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/hello_world" />
+
+</LinearLayout>
diff --git a/tests/tests/app/res/layout/dialog_stub_layout.xml b/tests/tests/app/res/layout/dialog_stub_layout.xml
new file mode 100644
index 0000000..c6eb10d
--- /dev/null
+++ b/tests/tests/app/res/layout/dialog_stub_layout.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ >
+</LinearLayout>
diff --git a/tests/tests/app/res/menu/browser.xml b/tests/tests/app/res/menu/browser.xml
new file mode 100644
index 0000000..29e5149
--- /dev/null
+++ b/tests/tests/app/res/menu/browser.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+ <group android:id="@+id/MAIN_MENU">
+ <item android:id="@+id/goto_menu_id"
+ android:title="@string/hello_world"
+ android:alphabeticShortcut="l"/>
+ </group>
+
+</menu>
diff --git a/tests/tests/app/res/values/arrays.xml b/tests/tests/app/res/values/arrays.xml
new file mode 100644
index 0000000..71e0133
--- /dev/null
+++ b/tests/tests/app/res/values/arrays.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 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.
+ -->
+
+<resources>
+ <item type="integer" name="reference" format="integer">101</item>
+
+ <string-array name="strings">
+ <item>zero</item>
+ <item>1</item>
+ <item>@string/reference</item>
+ </string-array>
+
+ <integer-array name="integers">
+ <item>0</item>
+ <item>1</item>
+ <item>@integer/reference</item>
+ </integer-array>
+
+ <array name="difficultyLevel">
+ <item>Easy</item>
+ <item>Medium</item>
+ <item>Hard</item>
+ </array>
+
+ <string-array name="string">
+ <item>Test String 1</item>
+ <item>Test String 2</item>
+ <item>Test String 3</item>
+ </string-array>
+
+ <integer-array name="table_row_layout">
+ <item>1</item>
+ <item>2</item>
+ <item>3</item>
+ <item>4</item>
+ <item>5</item>
+ <item>6</item>
+ <item>7</item>
+ <item>8</item>
+ <item>9</item>
+ <item>10</item>
+ </integer-array>
+</resources>
diff --git a/tests/tests/app/res/values/attrs.xml b/tests/tests/app/res/values/attrs.xml
new file mode 100644
index 0000000..4c3d9db
--- /dev/null
+++ b/tests/tests/app/res/values/attrs.xml
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 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.
+ -->
+
+<resources>
+ <declare-styleable name="Style1">
+ <attr name="Type1" format="integer">
+ <enum name="type" value="28" />
+ <enum name="data" value="0xff00ff00" />
+ <enum name="asset_cookie" value="0" />
+ <enum name="resource_id" value="0" />
+ <enum name="changing_config" value="0" />
+ </attr>
+ <attr name="Type2" format="integer">
+ <enum name="type" value="28" />
+ <enum name="data" value="0xff0000ff" />
+ <enum name="asset_cookie" value="0" />
+ <enum name="resource_id" value="0" />
+ <enum name="changing_config" value="0" />
+ </attr>
+ </declare-styleable>
+ <attr name="type1" format="boolean"/>
+ <attr name="type2" format="boolean"/>
+ <attr name="type3" format="color"/>
+ <attr name="type4" format="reference|color"/>
+ <attr name="type5" format="dimension"/>
+ <attr name="type6" format="dimension"/>
+ <attr name="type7" format="dimension"/>
+ <attr name="type8" format="reference"/>
+ <attr name="type9" format="float"/>
+ <attr name="type10" format="fraction"/>
+ <attr name="type11" format="integer"/>
+ <attr name="type12" format="integer"/>
+ <attr name="type13" format="reference|string"/>
+ <attr name="type14" format="string"/>
+ <attr name="type15" format="reference"/>
+ <attr name="type16" format="string"/>
+ <declare-styleable name="style1">
+ <attr name="type1"/>
+ <attr name="type2"/>
+ <attr name="type3"/>
+ <attr name="type4"/>
+ <attr name="type5"/>
+ <attr name="type6"/>
+ <attr name="type7"/>
+ <attr name="type8"/>
+ <attr name="type9"/>
+ <attr name="type10"/>
+ <attr name="type11"/>
+ <attr name="type12"/>
+ <attr name="type13"/>
+ <attr name="type14"/>
+ <attr name="type15"/>
+ <attr name="type16"/>
+ </declare-styleable>
+ <attr name="testEnum">
+ <enum name="val1" value="1" />
+ <enum name="val2" value="2" />
+ <enum name="val10" value="10" />
+ </attr>
+ <attr name="testFlags">
+ <flag name="bit1" value="0x1" />
+ <flag name="bit2" value="0x2" />
+ <flag name="bit31" value="0x40000000" />
+ </attr>
+ <attr name="testString" format="string" />
+ <declare-styleable name="EnumStyle">
+ <attr name="testEnum" />
+ </declare-styleable>
+ <declare-styleable name="FlagStyle">
+ <attr name="testFlags" />
+ </declare-styleable>
+ <declare-styleable name="TestConfig">
+ <attr name="testString" />
+ </declare-styleable>
+ <!-- Size of text. Recommended dimension type for text is "sp" for scaled-pixels (example: 15sp).
+ Supported values include the following:<p/>
+ <ul>
+ <li><b>px</b> Pixels</li>
+ <li><b>sp</b> Scaled pixels (scaled to relative pixel size on screen). See {@link android.util.DisplayMetrics} for more information.</li>
+ <li><b>pt</b> Points</li>
+ <li><b>dip</b> Device independent pixels. See {@link android.util.DisplayMetrics} for more information.</li>
+ </ul>
+ -->
+ <attr name="textSize" format="dimension" />
+ <attr name="typeface">
+ <enum name="normal" value="0" />
+ <enum name="sans" value="1" />
+ <enum name="serif" value="2" />
+ <enum name="monospace" value="3" />
+ </attr>
+ <!-- Default text typeface style. -->
+ <attr name="textStyle">
+ <flag name="normal" value="0" />
+ <flag name="bold" value="1" />
+ <flag name="italic" value="2" />
+ </attr>
+ <!-- Color of text (usually same as colorForeground). -->
+ <attr name="textColor" format="reference|color" />
+ <!-- Color of highlighted text. -->
+ <attr name="textColorHighlight" format="reference|color" />
+ <!-- Color of hint text (displayed when the field is empty). -->
+ <attr name="textColorHint" format="reference|color" />
+ <!-- Color of link text (URLs). -->
+ <attr name="textColorLink" format="reference|color" />
+ <declare-styleable name="TextAppearance">
+ <attr name="textColor"/>
+ <attr name="textSize"/>
+ <attr name="textStyle"/>
+ <attr name="typeface"/>
+ <attr name="textColorHighlight"/>
+ <attr name="textColorHint"/>
+ <attr name="textColorLink"/>
+ </declare-styleable>
+ <!-- Integer used to uniquely identify theme overrides. -->
+ <attr name="themeType" format="integer"/>
+ <!-- Theme reference used to override parent theme. -->
+ <attr name="themeOverrideAttr" format="reference"/>
+
+ <!-- Drawable theming attributes -->
+ <attr name="themeBoolean" />
+ <attr name="themeColor" />
+ <attr name="themeFloat" />
+ <attr name="themeInteger" />
+ <attr name="themeDimension" />
+ <attr name="themeDrawable" />
+ <attr name="themeBitmap" />
+ <attr name="themeNinePatch" />
+ <attr name="themeGravity" />
+ <attr name="themeTileMode" />
+ <attr name="themeAngle" />
+</resources>
diff --git a/tests/src/android/widget/cts/ProgressBarStubActivity.java b/tests/tests/app/res/values/colors.xml
similarity index 60%
copy from tests/src/android/widget/cts/ProgressBarStubActivity.java
copy to tests/tests/app/res/values/colors.xml
index 57cfa1a..f3cc325 100644
--- a/tests/src/android/widget/cts/ProgressBarStubActivity.java
+++ b/tests/tests/app/res/values/colors.xml
@@ -1,4 +1,5 @@
-/*
+<?xml version="1.0" encoding="utf-8"?>
+<!--
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -12,23 +13,14 @@
* 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.widget.cts;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-/**
- * An application for ProgressBar test
- *
- */
-public class ProgressBarStubActivity extends Activity {
- /**
- * Called with the activity is first created.
- */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- }
-}
+<resources>
+ <drawable name="red">#7f00</drawable>
+ <drawable name="blue">#770000ff</drawable>
+ <drawable name="black">#77ffffff</drawable>
+ <drawable name="yellow">#77ffff00</drawable>
+ <color name="testcolor1">#ff00ff00</color>
+ <color name="testcolor2">#ffff0000</color>
+ <color name="failColor">#ff0000ff</color>
+</resources>
diff --git a/tests/tests/app/res/values/strings.xml b/tests/tests/app/res/values/strings.xml
new file mode 100644
index 0000000..c167278
--- /dev/null
+++ b/tests/tests/app/res/values/strings.xml
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="permlab_testGranted">Test Granted</string>
+ <string name="permdesc_testGranted">Used for running CTS tests, for testing operations
+ where we have the permission.</string>
+ <string name="permlab_testDynamic">Test Dynamic</string>
+ <string name="permdesc_testDynamic">Used for running CTS tests, for testing adding
+ dynamic permissions.</string>
+ <string name="permlab_testDenied">Test Denied</string>
+ <string name="permdesc_testDenied">Used for running CTS tests, for testing operations
+ where we do not have the permission.</string>
+ <string name="explain">1. click start. \n2. if above image shaked, then press pass button,
+ else press failed button.</string>
+ <string name="text_view_hello">Hello! Text view!</string>
+ <string name="text_view_hello_two_lines">Hello! \nText view!</string>
+ <string name="text_view_simple_hint">This is a hint.</string>
+ <string name="text_view_hint">This is a string for testing hint of textview.</string>
+ <string name="activity_forwarding">App/Forwarding</string>
+ <string name="forwarding">$$$</string>
+ <string name="go">Go</string>
+ <string name="back">Back</string>
+ <string name="forward_target">
+ Press back button and notice we don\'t see the previous activity.
+ </string>
+ <string name="edit_text">testing</string>
+ <string name="text">DialogTest</string>
+ <string name="text_country">Country</string>
+ <string name="text_name">Name</string>
+ <string name="hello_world">Hello, World!</string>
+ <string name="hello_android">Hello, Android!</string>
+ <string name="alert_dialog_username">Name:</string>
+ <string name="alert_dialog_password">Password:</string>
+ <string name="alert_dialog_positive">Positive</string>
+ <string name="alert_dialog_negative">Negative</string>
+ <string name="alert_dialog_neutral">Neutral</string>
+ <string name="notify">Notify </string>
+ <string name="tabs_1">testing</string>
+ <string name="table_layout_first">first</string>
+ <string name="table_layout_second">second</string>
+ <string name="table_layout_third">third</string>
+ <string name="table_layout_long">Very long to make the string out of the screen</string>
+ <string name="chronometer_text">Test Chronometer</string>
+ <string name="am">AM</string>
+ <string name="pm">PM</string>
+ <string name="viewgroup_test">ViewGroup test</string>
+ <string name="viewanimator_test">ViewAnimator test</string>
+ <string name="id_ok">OK</string>
+ <string name="id_cancel">Cancel</string>
+ <string name="context_test_string1">This is %s string.</string>
+ <string name="context_test_string2">This is test string.</string>
+ <string name="animationutils_test_instructions">Choose different animations</string>
+ <string name="animationutils_test_alpha">Alpha animation</string>
+ <string name="animationutils_test_scale">Scale animation</string>
+ <string name="animationutils_test_rotate">Rotate animation</string>
+ <string name="animationutils_test_translate">Translate animation</string>
+ <string name="animationutils_test_set">Animation set</string>
+ <string name="animationutils_test_layout">Layout animation</string>
+ <string name="animationutils_test_gridlayout">Grid layout animation</string>
+ <string name="twolinelistitem_test_text1">text1</string>
+ <string name="twolinelistitem_test_text2">text2</string>
+ <string name="metadata_text">metadata text</string>
+ <string name="horizontal_text_1">horizontal 1</string>
+ <string name="horizontal_text_2">horizontal 2</string>
+ <string name="horizontal_text_3">horizontal 3</string>
+ <string name="vertical_text_1">vertical 1</string>
+ <string name="vertical_text_2">vertical 2</string>
+ <string name="vertical_text_3">vertical 3</string>
+ <string name="reference">here</string>
+ <string name="coerceIntegerToString">100</string>
+ <string name="coerceBooleanToString">true</string>
+ <string name="coerceColorToString">#fff</string>
+ <string name="coerceFloatToString">100.0</string>
+ <string name="coerceDimensionToString">100px</string>
+ <string name="coerceFractionToString">100<xliff:g id="percent">%</xliff:g></string>
+ <string name="formattedStringNone">Format[]</string>
+ <string name="formattedStringOne">Format[<xliff:g id="format">%d</xliff:g>]</string>
+ <string name="formattedStringTwo">Format[<xliff:g id="format">%3$d,%2$s</xliff:g>]</string>
+ <string name="checkboxpref_key">checkboxpref_key</string>
+ <string name="checkboxpref_title">title of preference</string>
+ <string name="checkboxpref_summary">summary of preference</string>
+ <string name="checkboxpref_summary_on">summary on of preference</string>
+ <string name="checkboxpref_summary_off">summary off of preference</string>
+ <string name="checkboxpref_depend">checkboxpref_depend</string>
+ <string name="checkboxpref_depend_title"> depend title of preference</string>
+ <string name="checkboxpref_depend_summary"> depend summary of preference</string>
+ <string name="edittextpref_key">edittextpref_key</string>
+ <string name="edittextpref_default_value">default value of preference</string>
+ <string name="edittextpref_title">title of edit text preference</string>
+ <string name="edittextpref_summary">summary of edit text preference</string>
+ <string name="edittextpref_dialog_title">dialog title of edit text preference</string>
+ <string name="edittextpref_text">text of edit text preference</string>
+ <string name="listpref_key">listpref_key</string>
+ <string name="listpref_title">title of list preference</string>
+ <string name="listpref_summary">summary of list preference</string>
+ <string name="listpref_dialogtitle">dialog title of list preference</string>
+ <string name="easy">Easy</string>
+ <string name="medium">Medium</string>
+ <string name="hard">Hard</string>
+ <string name="footer_view">Footer view</string>
+ <string name="header_view">Header view</string>
+ <string name="dialogpref_title">title of dialog preference </string>
+ <string name="dialogpref_dialog_title">dialog title of dialog preference </string>
+ <string name="dialogpref_key">dialogpref_key</string>
+ <string name="dialogpref_default_value">default value of dialog preference</string>
+ <string name="dialogpref_summary">summary of dialog preference</string>
+ <string name="dialogpref_message">message of dialog preference</string>
+ <string name="dialogpref_sure">Sure</string>
+ <string name="dialogpref_cancel">Cancel</string>
+ <string name="pref_key">pref_key</string>
+ <string name="pref_title">title of preference</string>
+ <string name="pref_summary">summary of preference</string>
+ <string name="pref_depend_key">pref_depend_key</string>
+ <string name="pref_depend_title"> depend title of preference</string>
+ <string name="pref_depend_summary"> depend summary of preference</string>
+ <string name="android_intent_action_preference">android.intent.action.PREFERENCE</string>
+ <string name="def_pref_key">def_pref_key</string>
+ <string name="def_pref_title">default preference</string>
+ <string name="def_pref_summary">This is default preference of cts</string>
+ <string name="relative_view1">view 1</string>
+ <string name="relative_view2">view 2</string>
+ <string name="relative_view3">view 3</string>
+ <string name="relative_view4">view 4</string>
+ <string name="relative_view5">view 5</string>
+ <string name="relative_view6">view 6</string>
+ <string name="relative_view7">view 7</string>
+ <string name="relative_view8">view 8</string>
+ <string name="relative_view9">view 9</string>
+ <string name="relative_view10">view 10</string>
+ <string name="relative_view11">view 11</string>
+ <string name="relative_view12">view 12</string>
+ <string name="relative_view13">view 13</string>
+ <string name="country">Country:</string>
+ <string name="symbol">Symbol:</string>
+ <string name="country_warning">No such country registered</string>
+ <string name="version_cur">base</string>
+ <string name="version_old">base</string>
+ <string name="version_v3">base</string>
+ <string name="authenticator_label">Android CTS</string>
+ <string name="search_label">Android CTS</string>
+ <string name="tag1">tag 1</string>
+ <string name="tag2">tag 2</string>
+
+ <string name="button">Button</string>
+ <string name="holo_test">Holo Test</string>
+ <string name="holo_generator">Holo Generator</string>
+ <string name="holo_light_test">Holo Light Test</string>
+ <string name="holo_light_generator">Holo Light Generator</string>
+ <string name="reference_image">Reference Image: </string>
+ <string name="generated_image">Generated Image: </string>
+ <string name="themes_prompt">Select a Theme:</string>
+ <string name="sample_text">Sample text goes here. I wanted something creative and whimsical
+but then I just got bored...</string>
+ <string name="long_text">This is a really long string which exceeds the width of the view.
+New devices have a much larger screen which actually enables long strings to be displayed
+with no fading. I have made this string longer to fix this case. If you are correcting this
+text, I would love to see the kind of devices you guys now use! Guys, maybe some devices need longer string!
+I think so, so how about double this string, like copy and paste!
+This is a really long string which exceeds the width of the view.
+New devices have a much larger screen which actually enables long strings to be displayed
+with no fading. I have made this string longer to fix this case. If you are correcting this
+text, I would love to see the kind of devices you guys now use! Guys, maybe some devices need longer string!
+I think so, so how about double this string, like copy and paste! </string>
+ <string name="rectangle200">"M 0,0 l 200,0 l 0, 200 l -200, 0 z"</string>
+</resources>
diff --git a/tests/tests/app/res/values/styles.xml b/tests/tests/app/res/values/styles.xml
new file mode 100644
index 0000000..81925cc
--- /dev/null
+++ b/tests/tests/app/res/values/styles.xml
@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <style name="Whatever">
+ <item name="type1">true</item>
+ <item name="type2">false</item>
+ <item name="type3">#ff0000ff</item>
+ <item name="type4">#ff00ff00</item>
+ <item name="type5">0.75px</item>
+ <item name="type6">10px</item>
+ <item name="type7">18px</item>
+ <item name="type8">@drawable/pass</item>
+ <item name="type9">3.14</item>
+ <item name="type10">100%</item>
+ <item name="type11">365</item>
+ <item name="type12">86400</item>
+ <item name="type13">@string/hello_android</item>
+ <item name="type14">TypedArray Test!</item>
+ <item name="type15">@array/difficultyLevel</item>
+ <item name="type16">Typed Value!</item>
+ </style>
+
+ <style name="TextViewWithoutColorAndAppearance">
+ <item name="android:textSize">18sp</item>
+ </style>
+
+ <style name="TextViewWithColorButWithOutAppearance">
+ <item name="android:textColor">#ff0000ff</item>
+ </style>
+
+ <style name="TextViewWithColorAndAppearance">
+ <item name="android:textColor">#ff0000ff</item>
+ <item name="android:textAppearance">@style/TextAppearance.WithColor</item>
+ </style>
+
+ <style name="TextViewWithoutColorButWithAppearance">
+ <item name="android:textAppearance">@style/TextAppearance.WithColor</item>
+ </style>
+
+ <style name="TextAppearance" parent="android:TextAppearance">
+ </style>
+
+ <style name="TextAppearance.WithColor">
+ <item name="android:textColor">#ffff0000</item>
+ </style>
+
+ <style name="TextAppearance.All">
+ <item name="android:textColor">@drawable/black</item>
+ <item name="android:textSize">20px</item>
+ <item name="android:textStyle">bold</item>
+ <item name="android:textColorHint">@drawable/red</item>
+ <item name="android:textColorLink">@drawable/blue</item>
+ <item name="android:textColorHighlight">@drawable/yellow</item>
+ </style>
+
+ <style name="TextAppearance.Colors">
+ <item name="android:textColor">@drawable/black</item>
+ <item name="android:textColorHint">@drawable/blue</item>
+ <item name="android:textColorLink">@drawable/yellow</item>
+ <item name="android:textColorHighlight">@drawable/red</item>
+ </style>
+
+ <style name="TextAppearance.NotColors">
+ <item name="android:textSize">17px</item>
+ <item name="android:typeface">sans</item>
+ <item name="android:textStyle">normal</item>
+ </style>
+
+ <style name="TextAppearance.Style">
+ <item name="android:textStyle">normal</item>
+ </style>
+
+ <style name="TestEnum1">
+ <item name="testEnum">val1</item>
+ </style>
+
+ <style name="TestEnum2">
+ <item name="testEnum">val2</item>
+ </style>
+
+ <style name="TestEnum10">
+ <item name="testEnum">val10</item>
+ </style>
+
+ <style name="TestFlag1">
+ <item name="testFlags">bit1</item>
+ </style>
+
+ <style name="TestFlag2">
+ <item name="testFlags">bit2</item>
+ </style>
+
+ <style name="TestFlag31">
+ <item name="testFlags">bit31</item>
+ </style>
+
+ <style name="TestFlag1And2">
+ <item name="testFlags">bit1|bit2</item>
+ </style>
+
+ <style name="TestFlag1And2And31">
+ <item name="testFlags">bit1|bit2|bit31</item>
+ </style>
+
+ <style name="TestEnum1.EmptyInherit" />
+
+ <style name="Theme_AlertDialog">
+ <item name="android:textSize">18sp</item>
+ </style>
+
+ <style name="TestProgressBar">
+ <item name="android:indeterminateOnly">false</item>
+ <item name="android:progressDrawable">?android:drawable/progress_horizontal</item>
+ <item name="android:indeterminateDrawable">?android:drawable/progress_horizontal</item>
+ <item name="android:minHeight">20dip</item>
+ <item name="android:maxHeight">20dip</item>
+ <item name="android:focusable">true</item>
+ </style>
+
+ <style name="Test_Theme">
+ <item name="android:windowNoTitle">true</item>
+ <item name="android:panelColorForeground">#ff000000</item>
+ <item name="android:panelColorBackground">#ffffffff</item>
+ </style>
+
+ <style name="Theme_OverrideOuter">
+ <item name="themeType">1</item>
+ </style>
+
+ <style name="Theme_OverrideInner">
+ <item name="themeType">2</item>
+ <item name="themeOverrideAttr">@style/Theme_OverrideAttr</item>
+ </style>
+
+ <style name="Theme_OverrideAttr">
+ <item name="themeType">3</item>
+ </style>
+
+ <style name="Theme_ThemedDrawableTest">
+ <item name="themeBoolean">true</item>
+ <item name="themeColor">@android:color/black</item>
+ <item name="themeFloat">1.0</item>
+ <item name="themeAngle">45.0</item>
+ <item name="themeInteger">1</item>
+ <item name="themeDimension">1px</item>
+ <item name="themeDrawable">@drawable/icon_black</item>
+ <item name="themeBitmap">@drawable/icon_black</item>
+ <item name="themeNinePatch">@drawable/ninepatch_0</item>
+ <item name="themeGravity">48</item>
+ <item name="themeTileMode">2</item>
+ </style>
+
+ <style name="Theme_NoSwipeDismiss">
+ <item name="android:windowSwipeToDismiss">false</item>
+ </style>
+
+</resources>
diff --git a/tests/tests/app/res/xml/alias.xml b/tests/tests/app/res/xml/alias.xml
new file mode 100644
index 0000000..a03104f
--- /dev/null
+++ b/tests/tests/app/res/xml/alias.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2008 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.
+ */
+-->
+
+<alias xmlns:android="http://schemas.android.com/apk/res/android">
+ <intent android:action="android.intent.action.MAIN"
+ android:targetPackage="com.android.cts.app"
+ android:targetClass="android.app.cts.ChildActivity"
+ android:data="http://www.google.com/">
+ </intent>
+</alias>
+
diff --git a/tests/tests/app/res/xml/intentfilter.xml b/tests/tests/app/res/xml/intentfilter.xml
new file mode 100644
index 0000000..7ed3a53
--- /dev/null
+++ b/tests/tests/app/res/xml/intentfilter.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2008 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.
+ */
+-->
+<intent-filter xmlns="http://schemas.android.com/apk/res/android">
+ <action name="testAction"/>
+ <cat name="testCategory" />
+ <type name="vnd.android.cursor.dir/person"/>
+ <scheme name="testScheme"/>
+ <auth host="testHost" port="80"/>
+ <path name="testPath" literal="test"/>
+ <path name="testPath" prefix="test"/>
+ <path name="testPath" sglob="test"/>
+</intent-filter>
diff --git a/tests/tests/app/res/xml/metadata.xml b/tests/tests/app/res/xml/metadata.xml
new file mode 100644
index 0000000..336b931
--- /dev/null
+++ b/tests/tests/app/res/xml/metadata.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<thedata xmlns:android="http://schemas.android.com/apk/res/android"
+ rawText="some raw text"
+ rawColor="#ffffff00"
+ android:color="#f00"
+ android:text="@string/metadata_text"/>
diff --git a/tests/tests/app/res/xml/searchable.xml b/tests/tests/app/res/xml/searchable.xml
new file mode 100644
index 0000000..f09c917
--- /dev/null
+++ b/tests/tests/app/res/xml/searchable.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<searchable xmlns:android="http://schemas.android.com/apk/res/android"
+ android:label="@string/search_label"
+/>
diff --git a/tests/tests/app/src/android/app/backup/cts/BackupManagerTest.java b/tests/tests/app/src/android/app/backup/cts/BackupManagerTest.java
index f21f847..3ee1104 100644
--- a/tests/tests/app/src/android/app/backup/cts/BackupManagerTest.java
+++ b/tests/tests/app/src/android/app/backup/cts/BackupManagerTest.java
@@ -26,7 +26,7 @@
// Check that these don't crash as if they were called in an app...
BackupManager backupManager = new BackupManager(mContext);
backupManager.dataChanged();
- BackupManager.dataChanged("com.android.cts.stub");
+ BackupManager.dataChanged("com.android.cts.app");
// Backup isn't expected to work in this test but check for obvious bugs...
int result = backupManager.requestRestore(new RestoreObserver() {});
diff --git a/tests/src/android/app/cts/ActivityManagerMemoryClassLaunchActivity.java b/tests/tests/app/src/android/app/cts/ActivityManagerMemoryClassLaunchActivity.java
similarity index 100%
rename from tests/src/android/app/cts/ActivityManagerMemoryClassLaunchActivity.java
rename to tests/tests/app/src/android/app/cts/ActivityManagerMemoryClassLaunchActivity.java
diff --git a/tests/src/android/app/cts/ActivityManagerMemoryClassTestActivity.java b/tests/tests/app/src/android/app/cts/ActivityManagerMemoryClassTestActivity.java
similarity index 100%
rename from tests/src/android/app/cts/ActivityManagerMemoryClassTestActivity.java
rename to tests/tests/app/src/android/app/cts/ActivityManagerMemoryClassTestActivity.java
diff --git a/tests/src/android/app/cts/ActivityManagerRecentOneActivity.java b/tests/tests/app/src/android/app/cts/ActivityManagerRecentOneActivity.java
similarity index 100%
rename from tests/src/android/app/cts/ActivityManagerRecentOneActivity.java
rename to tests/tests/app/src/android/app/cts/ActivityManagerRecentOneActivity.java
diff --git a/tests/src/android/app/cts/ActivityManagerRecentTwoActivity.java b/tests/tests/app/src/android/app/cts/ActivityManagerRecentTwoActivity.java
similarity index 100%
rename from tests/src/android/app/cts/ActivityManagerRecentTwoActivity.java
rename to tests/tests/app/src/android/app/cts/ActivityManagerRecentTwoActivity.java
diff --git a/tests/src/android/app/cts/ActivityManagerStubCrashActivity.java b/tests/tests/app/src/android/app/cts/ActivityManagerStubCrashActivity.java
similarity index 100%
rename from tests/src/android/app/cts/ActivityManagerStubCrashActivity.java
rename to tests/tests/app/src/android/app/cts/ActivityManagerStubCrashActivity.java
diff --git a/tests/src/android/app/cts/ActivityManagerStubFooActivity.java b/tests/tests/app/src/android/app/cts/ActivityManagerStubFooActivity.java
similarity index 100%
rename from tests/src/android/app/cts/ActivityManagerStubFooActivity.java
rename to tests/tests/app/src/android/app/cts/ActivityManagerStubFooActivity.java
diff --git a/tests/tests/app/src/android/app/cts/ActivityManagerTest.java b/tests/tests/app/src/android/app/cts/ActivityManagerTest.java
index 6a1ccb5..dfec7db 100644
--- a/tests/tests/app/src/android/app/cts/ActivityManagerTest.java
+++ b/tests/tests/app/src/android/app/cts/ActivityManagerTest.java
@@ -35,7 +35,7 @@
import android.test.InstrumentationTestCase;
public class ActivityManagerTest extends InstrumentationTestCase {
- private static final String STUB_PACKAGE_NAME = "com.android.cts.stub";
+ private static final String STUB_PACKAGE_NAME = "com.android.cts.app";
private static final int WAITFOR_MSEC = 5000;
private static final String SERVICE_NAME = "android.app.cts.MockService";
private static final int WAIT_TIME = 2000;
@@ -222,13 +222,13 @@
assertTrue(hasSystemProcess && hasTestProcess);
for (RunningAppProcessInfo ra : list) {
- if (ra.processName.equals("com.android.cts.stub:remote")) {
- fail("should be no process named com.android.cts.stub:remote");
+ if (ra.processName.equals("com.android.cts.app:remote")) {
+ fail("should be no process named com.android.cts.app:remote");
}
}
// start a new process
mIntent = new Intent("android.app.REMOTESERVICE");
- mIntent.setPackage("com.android.cts.stub");
+ mIntent.setPackage("com.android.cts.app");
mInstrumentation.getTargetContext().startService(mIntent);
Thread.sleep(WAITFOR_MSEC);
@@ -236,11 +236,11 @@
assertTrue(list.size() <= listNew.size());
for (RunningAppProcessInfo ra : listNew) {
- if (ra.processName.equals("com.android.cts.stub:remote")) {
+ if (ra.processName.equals("com.android.cts.app:remote")) {
return;
}
}
- fail("com.android.cts.stub:remote process should be available");
+ fail("com.android.cts.app:remote process should be available");
}
public void testGetProcessInErrorState() throws Exception {
diff --git a/tests/src/android/app/cts/ActivityTestsBase.java b/tests/tests/app/src/android/app/cts/ActivityTestsBase.java
similarity index 100%
rename from tests/src/android/app/cts/ActivityTestsBase.java
rename to tests/tests/app/src/android/app/cts/ActivityTestsBase.java
diff --git a/tests/tests/app/src/android/app/cts/AlertDialogTest.java b/tests/tests/app/src/android/app/cts/AlertDialogTest.java
index aefcf01..a35fd9c 100644
--- a/tests/tests/app/src/android/app/cts/AlertDialogTest.java
+++ b/tests/tests/app/src/android/app/cts/AlertDialogTest.java
@@ -35,17 +35,17 @@
/*
* Test AlertDialog
*/
-public class AlertDialogTest extends ActivityInstrumentationTestCase2<DialogStubActivity> {
+public class AlertDialogTest extends ActivityInstrumentationTestCase2<DialogCtsActivity> {
private static final String ALERTDIALOG_CUSTOM_TITLE = "Hello, World!";
private Instrumentation mInstrumentation;
- private DialogStubActivity mActivity;
+ private DialogCtsActivity mActivity;
private Button mPositiveButton;
private Button mNegativeButton;
private Button mNeutralButton;
public AlertDialogTest() {
- super("com.android.cts.stub", DialogStubActivity.class);
+ super("com.android.cts.app", DialogCtsActivity.class);
}
@Override
@@ -55,7 +55,7 @@
}
protected void startDialogActivity(int dialogNumber) {
- mActivity = DialogStubActivity.startDialogActivity(this, dialogNumber);
+ mActivity = DialogCtsActivity.startDialogActivity(this, dialogNumber);
new PollingCheck() {
@Override
protected boolean check() {
@@ -65,7 +65,7 @@
}
public void testAlertDialog() throws Throwable {
- doTestAlertDialog(DialogStubActivity.TEST_ALERTDIALOG);
+ doTestAlertDialog(DialogCtsActivity.TEST_ALERTDIALOG);
}
private void doTestAlertDialog(int index) throws Throwable {
@@ -75,17 +75,17 @@
mPositiveButton = ((AlertDialog) (mActivity.getDialog())).getButton(
DialogInterface.BUTTON_POSITIVE);
assertNotNull(mPositiveButton);
- assertEquals(mActivity.getString(com.android.cts.stub.R.string.alert_dialog_positive),
+ assertEquals(mActivity.getString(com.android.cts.app.R.string.alert_dialog_positive),
mPositiveButton.getText());
mNeutralButton = ((AlertDialog) (mActivity.getDialog())).getButton(
DialogInterface.BUTTON_NEUTRAL);
assertNotNull(mNeutralButton);
- assertEquals(mActivity.getString(com.android.cts.stub.R.string.alert_dialog_neutral),
+ assertEquals(mActivity.getString(com.android.cts.app.R.string.alert_dialog_neutral),
mNeutralButton.getText());
mNegativeButton = ((AlertDialog) (mActivity.getDialog())).getButton(
DialogInterface.BUTTON_NEGATIVE);
assertNotNull(mNegativeButton);
- assertEquals(mActivity.getString(com.android.cts.stub.R.string.alert_dialog_negative),
+ assertEquals(mActivity.getString(com.android.cts.app.R.string.alert_dialog_negative),
mNegativeButton.getText());
assertFalse(mActivity.isPositiveButtonClicked);
@@ -102,40 +102,40 @@
}
public void testAlertDialogDeprecatedAPI() throws Throwable {
- doTestAlertDialog(DialogStubActivity.TEST_ALERTDIALOG_DEPRECATED);
+ doTestAlertDialog(DialogCtsActivity.TEST_ALERTDIALOG_DEPRECATED);
}
public void testAlertDialogDeprecatedAPIWithMessage() throws Throwable {
- startDialogActivity(DialogStubActivity.TEST_ALERTDIALOG_DEPRECATED_WITH_MESSAGE);
+ startDialogActivity(DialogCtsActivity.TEST_ALERTDIALOG_DEPRECATED_WITH_MESSAGE);
assertTrue(mActivity.getDialog().isShowing());
mPositiveButton = ((AlertDialog) (mActivity.getDialog())).getButton(
DialogInterface.BUTTON_POSITIVE);
assertNotNull(mPositiveButton);
- assertEquals(mActivity.getString(com.android.cts.stub.R.string.alert_dialog_positive),
+ assertEquals(mActivity.getString(com.android.cts.app.R.string.alert_dialog_positive),
mPositiveButton.getText());
mNegativeButton = ((AlertDialog) (mActivity.getDialog())).getButton(
DialogInterface.BUTTON_NEGATIVE);
assertNotNull(mNegativeButton);
- assertEquals(mActivity.getString(com.android.cts.stub.R.string.alert_dialog_negative),
+ assertEquals(mActivity.getString(com.android.cts.app.R.string.alert_dialog_negative),
mNegativeButton.getText());
mNeutralButton = ((AlertDialog) (mActivity.getDialog())).getButton(
DialogInterface.BUTTON_NEUTRAL);
assertNotNull(mNeutralButton);
- assertEquals(mActivity.getString(com.android.cts.stub.R.string.alert_dialog_neutral),
+ assertEquals(mActivity.getString(com.android.cts.app.R.string.alert_dialog_neutral),
mNeutralButton.getText());
- DialogStubActivity.buttonIndex = 0;
+ DialogCtsActivity.buttonIndex = 0;
performClick(mPositiveButton);
- assertEquals(DialogInterface.BUTTON_POSITIVE, DialogStubActivity.buttonIndex);
+ assertEquals(DialogInterface.BUTTON_POSITIVE, DialogCtsActivity.buttonIndex);
- DialogStubActivity.buttonIndex = 0;
+ DialogCtsActivity.buttonIndex = 0;
performClick(mNeutralButton);
- assertEquals(DialogInterface.BUTTON_NEUTRAL, DialogStubActivity.buttonIndex);
+ assertEquals(DialogInterface.BUTTON_NEUTRAL, DialogCtsActivity.buttonIndex);
- DialogStubActivity.buttonIndex = 0;
+ DialogCtsActivity.buttonIndex = 0;
performClick(mNegativeButton);
- assertEquals(DialogInterface.BUTTON_NEGATIVE, DialogStubActivity.buttonIndex);
+ assertEquals(DialogInterface.BUTTON_NEGATIVE, DialogCtsActivity.buttonIndex);
}
private void performClick(final Button button) throws Throwable {
@@ -148,18 +148,18 @@
}
public void testCustomAlertDialog() {
- startDialogActivity(DialogStubActivity.TEST_CUSTOM_ALERTDIALOG);
+ startDialogActivity(DialogCtsActivity.TEST_CUSTOM_ALERTDIALOG);
assertTrue(mActivity.getDialog().isShowing());
}
public void testCustomAlertDialogView() {
- startDialogActivity(DialogStubActivity.TEST_CUSTOM_ALERTDIALOG_VIEW);
+ startDialogActivity(DialogCtsActivity.TEST_CUSTOM_ALERTDIALOG_VIEW);
assertTrue(mActivity.getDialog().isShowing());
}
public void testCallback() {
- startDialogActivity(DialogStubActivity.TEST_ALERTDIALOG_CALLBACK);
+ startDialogActivity(DialogCtsActivity.TEST_ALERTDIALOG_CALLBACK);
assertTrue(mActivity.onCreateCalled);
mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_0);
@@ -169,12 +169,12 @@
}
public void testAlertDialogTheme() throws Exception {
- startDialogActivity(DialogStubActivity.TEST_ALERTDIALOG_THEME);
+ startDialogActivity(DialogCtsActivity.TEST_ALERTDIALOG_THEME);
assertTrue(mActivity.getDialog().isShowing());
}
public void testAlertDialogCancelable() throws Exception {
- startDialogActivity(DialogStubActivity.TEST_ALERTDIALOG_CANCELABLE);
+ startDialogActivity(DialogCtsActivity.TEST_ALERTDIALOG_CANCELABLE);
assertTrue(mActivity.getDialog().isShowing());
assertFalse(mActivity.onCancelCalled);
mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
@@ -183,7 +183,7 @@
}
public void testAlertDialogNotCancelable() throws Exception {
- startDialogActivity(DialogStubActivity.TEST_ALERTDIALOG_NOT_CANCELABLE);
+ startDialogActivity(DialogCtsActivity.TEST_ALERTDIALOG_NOT_CANCELABLE);
assertTrue(mActivity.getDialog().isShowing());
assertFalse(mActivity.onCancelCalled);
mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
diff --git a/tests/tests/app/src/android/app/cts/AlertDialog_BuilderTest.java b/tests/tests/app/src/android/app/cts/AlertDialog_BuilderTest.java
index 5f826eb..b07a4d5 100644
--- a/tests/tests/app/src/android/app/cts/AlertDialog_BuilderTest.java
+++ b/tests/tests/app/src/android/app/cts/AlertDialog_BuilderTest.java
@@ -47,7 +47,7 @@
import android.widget.AdapterView.OnItemSelectedListener;
-public class AlertDialog_BuilderTest extends ActivityInstrumentationTestCase2<DialogStubActivity> {
+public class AlertDialog_BuilderTest extends ActivityInstrumentationTestCase2<DialogCtsActivity> {
private Builder mBuilder;
private Context mContext;
private Instrumentation mInstrumentation;
@@ -127,7 +127,7 @@
}
public AlertDialog_BuilderTest() {
- super("com.android.cts.stub", DialogStubActivity.class);
+ super("com.android.cts.app", DialogCtsActivity.class);
}
public void testConstructor() {
@@ -208,14 +208,14 @@
runTestOnUiThread(new Runnable() {
public void run() {
mBuilder = new AlertDialog.Builder(mContext);
- mBuilder.setNegativeButton(com.android.cts.stub.R.string.notify, mOnClickListener);
+ mBuilder.setNegativeButton(com.android.cts.app.R.string.notify, mOnClickListener);
mDialog = mBuilder.show();
mButton = mDialog.getButton(DialogInterface.BUTTON_NEGATIVE);
mButton.performClick();
}
});
mInstrumentation.waitForIdleSync();
- assertEquals(mContext.getText(com.android.cts.stub.R.string.notify), mButton.getText());
+ assertEquals(mContext.getText(com.android.cts.app.R.string.notify), mButton.getText());
assertTrue(mResult);
}
@@ -223,14 +223,14 @@
runTestOnUiThread(new Runnable() {
public void run() {
mBuilder = new AlertDialog.Builder(mContext);
- mBuilder.setNeutralButton(com.android.cts.stub.R.string.notify, mOnClickListener);
+ mBuilder.setNeutralButton(com.android.cts.app.R.string.notify, mOnClickListener);
mDialog = mBuilder.show();
mButton = mDialog.getButton(DialogInterface.BUTTON_NEUTRAL);
mButton.performClick();
}
});
mInstrumentation.waitForIdleSync();
- assertEquals(mContext.getText(com.android.cts.stub.R.string.notify), mButton.getText());
+ assertEquals(mContext.getText(com.android.cts.app.R.string.notify), mButton.getText());
assertTrue(mResult);
}
@@ -321,7 +321,7 @@
runTestOnUiThread(new Runnable() {
public void run() {
mBuilder = new AlertDialog.Builder(mContext);
- mBuilder.setItems(com.android.cts.stub.R.array.difficultyLevel, mOnClickListener);
+ mBuilder.setItems(com.android.cts.app.R.array.difficultyLevel, mOnClickListener);
mDialog = mBuilder.show();
mListView = mDialog.getListView();
}
@@ -329,13 +329,13 @@
mInstrumentation.waitForIdleSync();
final CharSequence[] levels = mContext.getResources().getTextArray(
- com.android.cts.stub.R.array.difficultyLevel);
+ com.android.cts.app.R.array.difficultyLevel);
assertEquals(levels[0], mListView.getItemAtPosition(0));
}
public void testSetItemsWithParamCharSequence() throws Throwable {
final CharSequence[] expect = mContext.getResources().getTextArray(
- com.android.cts.stub.R.array.difficultyLevel);
+ com.android.cts.app.R.array.difficultyLevel);
runTestOnUiThread(new Runnable() {
public void run() {
@@ -386,12 +386,12 @@
public void testSetMultiChoiceItemsWithParamInt() throws Throwable {
final CharSequence[] items = mContext.getResources().getTextArray(
- com.android.cts.stub.R.array.difficultyLevel);
+ com.android.cts.app.R.array.difficultyLevel);
runTestOnUiThread(new Runnable() {
public void run() {
mBuilder = new AlertDialog.Builder(mContext);
- mBuilder.setMultiChoiceItems(com.android.cts.stub.R.array.difficultyLevel, null,
+ mBuilder.setMultiChoiceItems(com.android.cts.app.R.array.difficultyLevel, null,
mOnMultiChoiceClickListener);
mDialog = mBuilder.show();
mListView = mDialog.getListView();
@@ -409,7 +409,7 @@
public void testSetMultiChoiceItemsWithParamCharSequence() throws Throwable {
final CharSequence[] items = mContext.getResources().getTextArray(
- com.android.cts.stub.R.array.difficultyLevel);
+ com.android.cts.app.R.array.difficultyLevel);
runTestOnUiThread(new Runnable() {
public void run() {
@@ -454,12 +454,12 @@
public void testSetSingleChoiceItemsWithParamInt() throws Throwable {
final CharSequence[] items = mContext.getResources().getTextArray(
- com.android.cts.stub.R.array.difficultyLevel);
+ com.android.cts.app.R.array.difficultyLevel);
runTestOnUiThread(new Runnable() {
public void run() {
mBuilder = new AlertDialog.Builder(mContext);
- mBuilder.setSingleChoiceItems(com.android.cts.stub.R.array.difficultyLevel, 0,
+ mBuilder.setSingleChoiceItems(com.android.cts.app.R.array.difficultyLevel, 0,
mOnClickListener);
mDialog = mBuilder.show();
mListView = mDialog.getListView();
@@ -507,7 +507,7 @@
public void testSetSingleChoiceItemsWithParamCharSequence() throws Throwable {
final CharSequence[] items = mContext.getResources().getTextArray(
- com.android.cts.stub.R.array.difficultyLevel);
+ com.android.cts.app.R.array.difficultyLevel);
runTestOnUiThread(new Runnable() {
public void run() {
@@ -527,7 +527,7 @@
public void testSetSingleChoiceItems() throws Throwable {
final CharSequence[] items = mContext.getResources().getTextArray(
- com.android.cts.stub.R.array.difficultyLevel);
+ com.android.cts.app.R.array.difficultyLevel);
runTestOnUiThread(new Runnable() {
public void run() {
@@ -552,7 +552,7 @@
public void run() {
mBuilder = new AlertDialog.Builder(mContext);
mBuilder.setOnItemSelectedListener(mOnItemSelectedListener);
- mBuilder.setItems(com.android.cts.stub.R.array.difficultyLevel, mOnClickListener);
+ mBuilder.setItems(com.android.cts.app.R.array.difficultyLevel, mOnClickListener);
mDialog = mBuilder.show();
mListView = mDialog.getListView();
mListView.pointToPosition(0, 0);
diff --git a/tests/src/android/app/cts/AliasActivityStub.java b/tests/tests/app/src/android/app/cts/AliasActivityStub.java
similarity index 100%
rename from tests/src/android/app/cts/AliasActivityStub.java
rename to tests/tests/app/src/android/app/cts/AliasActivityStub.java
diff --git a/tests/tests/app/src/android/app/cts/AliasActivityTest.java b/tests/tests/app/src/android/app/cts/AliasActivityTest.java
index e668496..d44050f 100644
--- a/tests/tests/app/src/android/app/cts/AliasActivityTest.java
+++ b/tests/tests/app/src/android/app/cts/AliasActivityTest.java
@@ -17,23 +17,31 @@
package android.app.cts;
import android.app.AliasActivity;
+import android.app.Instrumentation;
+import android.content.Context;
import android.content.Intent;
-import android.test.AndroidTestCase;
+import android.test.InstrumentationTestCase;
-public class AliasActivityTest extends AndroidTestCase {
+public class AliasActivityTest extends InstrumentationTestCase {
private static final long SLEEP_TIME = 1000;
- public void testAliasActivity() throws InterruptedException {
- new AliasActivity();
+ public void testAliasActivity() throws Throwable {
+ runTestOnUiThread(new Runnable() {
+ public void run() {
+ new AliasActivity();
+ }
+ });
+ getInstrumentation().waitForIdleSync();
+ Context context = getInstrumentation().getTargetContext();
Intent intent = new Intent();
- intent.setClass(getContext(), AliasActivityStub.class);
+ intent.setClass(context, AliasActivityStub.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
assertFalse(ChildActivity.isStarted);
assertFalse(AliasActivityStub.isOnCreateCalled);
- getContext().startActivity(intent);
+ context.startActivity(intent);
Thread.sleep(SLEEP_TIME);
assertTrue(AliasActivityStub.isOnCreateCalled);
assertTrue(ChildActivity.isStarted);
diff --git a/tests/src/android/app/cts/AppStubActivity.java b/tests/tests/app/src/android/app/cts/AppCtsActivity.java
similarity index 97%
rename from tests/src/android/app/cts/AppStubActivity.java
rename to tests/tests/app/src/android/app/cts/AppCtsActivity.java
index fa786fa..a1722bb 100644
--- a/tests/src/android/app/cts/AppStubActivity.java
+++ b/tests/tests/app/src/android/app/cts/AppCtsActivity.java
@@ -26,12 +26,12 @@
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
-import com.android.cts.stub.R;
+import com.android.cts.app.R;
/**
* A minimal "Hello, World!" application.
*/
-public class AppStubActivity extends Activity {
+public class AppCtsActivity extends Activity {
private Dialog mDialog;
public boolean mOnPrepareDialog;
public boolean mOnOptionsMenuClosedCalled;
@@ -47,7 +47,7 @@
public boolean mCreateContextMenuCalled;
public boolean mRequestWinFeatureRet = false;
- public AppStubActivity() {
+ public AppCtsActivity() {
}
diff --git a/tests/src/android/app/cts/ChildActivity.java b/tests/tests/app/src/android/app/cts/ChildActivity.java
similarity index 100%
rename from tests/src/android/app/cts/ChildActivity.java
rename to tests/tests/app/src/android/app/cts/ChildActivity.java
diff --git a/tests/src/android/app/cts/ChildTabActivity.java b/tests/tests/app/src/android/app/cts/ChildTabActivity.java
similarity index 100%
rename from tests/src/android/app/cts/ChildTabActivity.java
rename to tests/tests/app/src/android/app/cts/ChildTabActivity.java
diff --git a/tests/src/android/app/cts/ClearTop.java b/tests/tests/app/src/android/app/cts/ClearTop.java
similarity index 100%
rename from tests/src/android/app/cts/ClearTop.java
rename to tests/tests/app/src/android/app/cts/ClearTop.java
diff --git a/tests/src/android/app/cts/DialogStubActivity.java b/tests/tests/app/src/android/app/cts/DialogCtsActivity.java
similarity index 97%
rename from tests/src/android/app/cts/DialogStubActivity.java
rename to tests/tests/app/src/android/app/cts/DialogCtsActivity.java
index 817e716..2fb293e 100644
--- a/tests/src/android/app/cts/DialogStubActivity.java
+++ b/tests/tests/app/src/android/app/cts/DialogCtsActivity.java
@@ -16,7 +16,7 @@
package android.app.cts;
-import com.android.cts.stub.R;
+import com.android.cts.app.R;
import android.app.Activity;
import android.app.AlertDialog;
@@ -43,7 +43,7 @@
/*
* Stub class for Dialog, AlertDialog, DatePickerDialog, TimePickerDialog etc.
*/
-public class DialogStubActivity extends Activity {
+public class DialogCtsActivity extends Activity {
public static final int TEST_DIALOG_WITHOUT_THEME = 0;
public static final int TEST_DIALOG_WITH_THEME = 1;
public static final int TEST_ALERTDIALOG = 2;
@@ -71,7 +71,7 @@
public static final String DEFAULT_ALERTDIALOG_TITLE = "AlertDialog";
public static final String DEFAULT_ALERTDIALOG_MESSAGE = "AlertDialog message";
- private static final String LOG_TAG = "DialogStubActivity";
+ private static final String LOG_TAG = "DialogCtsActivity";
public boolean isPositiveButtonClicked = false;
public boolean isNegativeButtonClicked = false;
@@ -235,8 +235,8 @@
@SuppressWarnings("deprecation")
private AlertDialog getAlertDialogInstance(boolean deprecated) {
- mAlertDialog = new AlertDialog.Builder(DialogStubActivity.this).create();
- mAlertDialog.setIcon(com.android.cts.stub.R.drawable.pass);
+ mAlertDialog = new AlertDialog.Builder(DialogCtsActivity.this).create();
+ mAlertDialog.setIcon(com.android.cts.app.R.drawable.pass);
mAlertDialog.setTitle(DEFAULT_ALERTDIALOG_TITLE);
mAlertDialog.setMessage(DEFAULT_ALERTDIALOG_MESSAGE);
mAlertDialog.setInverseBackgroundForced(true);
@@ -267,7 +267,7 @@
final LayoutInflater inflate = getLayoutInflater();
final View customTitleViewCustom = inflate.inflate(R.layout.alertdialog_custom_title, null);
final View textEntryView = inflate.inflate(R.layout.alert_dialog_text_entry_2, null);
- mAlertDialog = new AlertDialog.Builder(DialogStubActivity.this).create();
+ mAlertDialog = new AlertDialog.Builder(DialogCtsActivity.this).create();
mAlertDialog.setCustomTitle(customTitleViewCustom);
mAlertDialog.setMessage(DEFAULT_ALERTDIALOG_MESSAGE);
if (withSpacing) {
diff --git a/tests/tests/app/src/android/app/cts/DialogTest.java b/tests/tests/app/src/android/app/cts/DialogTest.java
index f0d00ba..2bbe346 100644
--- a/tests/tests/app/src/android/app/cts/DialogTest.java
+++ b/tests/tests/app/src/android/app/cts/DialogTest.java
@@ -15,7 +15,7 @@
*/
package android.app.cts;
-import com.android.cts.stub.R;
+import com.android.cts.app.R;
import android.app.Dialog;
import android.app.Instrumentation;
@@ -38,6 +38,7 @@
import android.os.Message;
import android.os.SystemClock;
import android.test.ActivityInstrumentationTestCase2;
+import android.test.UiThreadTest;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
@@ -49,10 +50,10 @@
import java.lang.ref.WeakReference;
-public class DialogTest extends ActivityInstrumentationTestCase2<DialogStubActivity> {
+public class DialogTest extends ActivityInstrumentationTestCase2<DialogCtsActivity> {
protected static final long SLEEP_TIME = 200;
- private static final String STUB_ACTIVITY_PACKAGE = "com.android.cts.stub";
+ private static final String STUB_ACTIVITY_PACKAGE = "com.android.cts.app";
private static final long TEST_TIMEOUT = 1000L;
/**
@@ -68,11 +69,11 @@
private Instrumentation mInstrumentation;
private Context mContext;
- private DialogStubActivity mActivity;
+ private DialogCtsActivity mActivity;
public DialogTest() {
- super(STUB_ACTIVITY_PACKAGE, DialogStubActivity.class);
+ super(STUB_ACTIVITY_PACKAGE, DialogCtsActivity.class);
}
@Override
@@ -83,10 +84,11 @@
}
private void startDialogActivity(int dialogNumber) {
- mActivity = DialogStubActivity.startDialogActivity(this, dialogNumber);
+ mActivity = DialogCtsActivity.startDialogActivity(this, dialogNumber);
}
- public void testConstructor(){
+ @UiThreadTest
+ public void testConstructor() {
new Dialog(mContext);
Dialog d = new Dialog(mContext, 0);
// According to javadoc of constructors, it will set theme to system default theme,
@@ -104,14 +106,14 @@
}
public void testConstructor_protectedCancellable() {
- startDialogActivity(DialogStubActivity.TEST_PROTECTED_CANCELABLE);
+ startDialogActivity(DialogCtsActivity.TEST_PROTECTED_CANCELABLE);
mActivity.onCancelListenerCalled = false;
sendKeys(KeyEvent.KEYCODE_BACK);
assertTrue(mActivity.onCancelListenerCalled);
}
public void testConstructor_protectedNotCancellable() {
- startDialogActivity(DialogStubActivity.TEST_PROTECTED_NOT_CANCELABLE);
+ startDialogActivity(DialogCtsActivity.TEST_PROTECTED_NOT_CANCELABLE);
mActivity.onCancelListenerCalled = false;
sendKeys(KeyEvent.KEYCODE_BACK);
assertFalse(mActivity.onCancelListenerCalled);
@@ -140,7 +142,7 @@
}
public void testOnStartCreateStop(){
- startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+ startDialogActivity(DialogCtsActivity.TEST_ONSTART_AND_ONSTOP);
final TestDialog d = (TestDialog) mActivity.getDialog();
assertTrue(d.isOnStartCalled);
@@ -151,8 +153,8 @@
assertTrue(d.isOnStopCalled);
}
- public void testAccessOwnerActivity() {
- startDialogActivity(DialogStubActivity.TEST_DIALOG_WITHOUT_THEME);
+ public void testAccessOwnerActivity() throws Throwable {
+ startDialogActivity(DialogCtsActivity.TEST_DIALOG_WITHOUT_THEME);
Dialog d = mActivity.getDialog();
assertNotNull(d);
assertSame(mActivity, d.getOwnerActivity());
@@ -166,12 +168,17 @@
// expected
}
- d = new Dialog(mContext);
- assertNull(d.getOwnerActivity());
+ runTestOnUiThread(new Runnable() {
+ public void run() {
+ Dialog dialog = new Dialog(mContext);
+ assertNull(dialog.getOwnerActivity());
+ }
+ });
+ mInstrumentation.waitForIdleSync();
}
public void testShow() throws Throwable {
- startDialogActivity(DialogStubActivity.TEST_DIALOG_WITHOUT_THEME);
+ startDialogActivity(DialogCtsActivity.TEST_DIALOG_WITHOUT_THEME);
final Dialog d = mActivity.getDialog();
final View decor = d.getWindow().getDecorView();
@@ -199,7 +206,7 @@
}
public void testOnSaveInstanceState() {
- startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+ startDialogActivity(DialogCtsActivity.TEST_ONSTART_AND_ONSTOP);
final TestDialog d = (TestDialog) mActivity.getDialog();
assertFalse(d.isOnSaveInstanceStateCalled);
@@ -219,7 +226,7 @@
}
public void testGetCurrentFocus() throws Throwable {
- startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+ startDialogActivity(DialogCtsActivity.TEST_ONSTART_AND_ONSTOP);
final TestDialog d = (TestDialog) mActivity.getDialog();
assertNull(d.getCurrentFocus());
runTestOnUiThread(new Runnable() {
@@ -236,7 +243,7 @@
}
public void testSetContentView() throws Throwable {
- startDialogActivity(DialogStubActivity.TEST_DIALOG_WITHOUT_THEME);
+ startDialogActivity(DialogCtsActivity.TEST_DIALOG_WITHOUT_THEME);
final Dialog d = mActivity.getDialog();
assertNotNull(d);
@@ -310,7 +317,7 @@
public void testSetTitle() {
final String expectedTitle = "Test Dialog Without theme";
- startDialogActivity(DialogStubActivity.TEST_DIALOG_WITHOUT_THEME);
+ startDialogActivity(DialogCtsActivity.TEST_DIALOG_WITHOUT_THEME);
assertNotNull(mActivity.getDialog());
mActivity.setUpTitle(expectedTitle);
@@ -326,7 +333,7 @@
}
public void testOnKeyDownKeyUp() {
- startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+ startDialogActivity(DialogCtsActivity.TEST_ONSTART_AND_ONSTOP);
final TestDialog d = (TestDialog) mActivity.getDialog();
assertFalse(d.isOnKeyDownCalled);
assertFalse(d.isOnKeyUpCalled);
@@ -345,7 +352,7 @@
}
public void testOnKeyMultiple() {
- startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+ startDialogActivity(DialogCtsActivity.TEST_ONSTART_AND_ONSTOP);
final TestDialog d = (TestDialog) mActivity.getDialog();
assertNull(d.keyMultipleEvent);
@@ -357,7 +364,7 @@
}
public void testTouchEvent() {
- startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+ startDialogActivity(DialogCtsActivity.TEST_ONSTART_AND_ONSTOP);
final TestDialog d = (TestDialog) mActivity.getDialog();
assertNull(d.onTouchEvent);
@@ -408,7 +415,7 @@
}
public void testTrackballEvent() {
- startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+ startDialogActivity(DialogCtsActivity.TEST_ONSTART_AND_ONSTOP);
final TestDialog d = (TestDialog) mActivity.getDialog();
long eventTime = SystemClock.uptimeMillis();
final MotionEvent trackBallEvent = MotionEvent.obtain(eventTime, eventTime,
@@ -437,7 +444,7 @@
}
public void testOnWindowAttributesChanged() throws Throwable {
- startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+ startDialogActivity(DialogCtsActivity.TEST_ONSTART_AND_ONSTOP);
final TestDialog d = (TestDialog) mActivity.getDialog();
assertTrue(d.isOnWindowAttributesChangedCalled);
@@ -457,7 +464,7 @@
}
public void testOnContentChanged() throws Throwable {
- startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+ startDialogActivity(DialogCtsActivity.TEST_ONSTART_AND_ONSTOP);
final TestDialog d = (TestDialog) mActivity.getDialog();
assertNotNull(d);
@@ -474,7 +481,7 @@
}
public void testOnWindowFocusChanged() throws Throwable {
- startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+ startDialogActivity(DialogCtsActivity.TEST_ONSTART_AND_ONSTOP);
final TestDialog d = (TestDialog) mActivity.getDialog();
assertTrue(d.isOnWindowFocusChangedCalled);
d.isOnWindowFocusChangedCalled = false;
@@ -482,7 +489,7 @@
// show a new dialog, the new dialog get focus
runTestOnUiThread(new Runnable() {
public void run() {
- mActivity.showDialog(DialogStubActivity.TEST_DIALOG_WITHOUT_THEME);
+ mActivity.showDialog(DialogCtsActivity.TEST_DIALOG_WITHOUT_THEME);
}
});
mInstrumentation.waitForIdleSync();
@@ -496,7 +503,7 @@
}
public void testDispatchKeyEvent() {
- startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+ startDialogActivity(DialogCtsActivity.TEST_ONSTART_AND_ONSTOP);
final TestDialog d = (TestDialog) mActivity.getDialog();
sendKeys(KeyEvent.KEYCODE_0);
@@ -544,7 +551,7 @@
* the user canceling the menu with the back/menu button, or when an item is selected).
*/
public void testContextMenu() throws Throwable {
- startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+ startDialogActivity(DialogCtsActivity.TEST_ONSTART_AND_ONSTOP);
final TestDialog d = (TestDialog) mActivity.getDialog();
final LinearLayout parent = new LinearLayout(mContext);
final MockView v = new MockView(mContext);
@@ -620,7 +627,7 @@
}
public void testTakeKeyEvents() throws Throwable {
- startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+ startDialogActivity(DialogCtsActivity.TEST_ONSTART_AND_ONSTOP);
final TestDialog d = (TestDialog) mActivity.getDialog();
final View v = d.getWindow().getDecorView();
assertNull(d.getCurrentFocus());
@@ -647,13 +654,13 @@
}
public void testRequestWindowFeature() {
- startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+ startDialogActivity(DialogCtsActivity.TEST_ONSTART_AND_ONSTOP);
// called requestWindowFeature at TestDialog onCreate method
assertTrue(((TestDialog) mActivity.getDialog()).isRequestWindowFeature);
}
public void testSetFeatureDrawableResource() throws Throwable {
- startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+ startDialogActivity(DialogCtsActivity.TEST_ONSTART_AND_ONSTOP);
runTestOnUiThread(new Runnable() {
public void run() {
mActivity.getDialog().setFeatureDrawableResource(Window.FEATURE_LEFT_ICON,
@@ -664,28 +671,28 @@
}
public void testSetFeatureDrawableUri() {
- startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+ startDialogActivity(DialogCtsActivity.TEST_ONSTART_AND_ONSTOP);
mActivity.getDialog().setFeatureDrawableUri(0, Uri.parse("http://www.google.com"));
}
public void testSetFeatureDrawable() {
- startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+ startDialogActivity(DialogCtsActivity.TEST_ONSTART_AND_ONSTOP);
mActivity.getDialog().setFeatureDrawable(0, new MockDrawable());
}
public void testSetFeatureDrawableAlpha() {
- startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+ startDialogActivity(DialogCtsActivity.TEST_ONSTART_AND_ONSTOP);
mActivity.getDialog().setFeatureDrawableAlpha(0, 0);
}
public void testGetLayoutInflater() {
- startDialogActivity(DialogStubActivity.TEST_DIALOG_WITHOUT_THEME);
+ startDialogActivity(DialogCtsActivity.TEST_DIALOG_WITHOUT_THEME);
final Dialog d = mActivity.getDialog();
assertEquals(d.getWindow().getLayoutInflater(), d.getLayoutInflater());
}
public void testSetCancelable_true() {
- startDialogActivity(DialogStubActivity.TEST_DIALOG_WITHOUT_THEME);
+ startDialogActivity(DialogCtsActivity.TEST_DIALOG_WITHOUT_THEME);
final Dialog d = mActivity.getDialog();
d.setCancelable(true);
@@ -695,7 +702,7 @@
}
public void testSetCancellable_false() {
- startDialogActivity(DialogStubActivity.TEST_DIALOG_WITHOUT_THEME);
+ startDialogActivity(DialogCtsActivity.TEST_DIALOG_WITHOUT_THEME);
final Dialog d = mActivity.getDialog();
d.setCancelable(false);
@@ -710,7 +717,7 @@
* 2. Set a listener to be invoked when the dialog is canceled.
*/
public void testCancel_listener() throws Throwable {
- startDialogActivity(DialogStubActivity.TEST_DIALOG_WITHOUT_THEME);
+ startDialogActivity(DialogCtsActivity.TEST_DIALOG_WITHOUT_THEME);
final Dialog d = mActivity.getDialog();
assertTrue(d.isShowing());
@@ -727,7 +734,7 @@
}
public void testCancel_noListener() throws Throwable {
- startDialogActivity(DialogStubActivity.TEST_DIALOG_WITHOUT_THEME);
+ startDialogActivity(DialogCtsActivity.TEST_DIALOG_WITHOUT_THEME);
final Dialog d = mActivity.getDialog();
assertTrue(d.isShowing());
@@ -741,7 +748,7 @@
public void testSetCancelMessage() throws Exception {
mCalledCallback = false;
- startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+ startDialogActivity(DialogCtsActivity.TEST_ONSTART_AND_ONSTOP);
final TestDialog d = (TestDialog) mActivity.getDialog();
final HandlerThread ht = new HandlerThread("DialogTest");
ht.start();
@@ -768,7 +775,7 @@
*/
public void testSetOnDismissListener_listener() throws Throwable {
mCalledCallback = false;
- startDialogActivity(DialogStubActivity.TEST_DIALOG_WITHOUT_THEME);
+ startDialogActivity(DialogCtsActivity.TEST_DIALOG_WITHOUT_THEME);
final Dialog d = mActivity.getDialog();
d.setOnDismissListener(new OnDismissListener() {
@@ -785,7 +792,7 @@
}
public void testSetOnDismissListener_noListener() throws Throwable {
- startDialogActivity(DialogStubActivity.TEST_DIALOG_WITHOUT_THEME);
+ startDialogActivity(DialogCtsActivity.TEST_DIALOG_WITHOUT_THEME);
final Dialog d = mActivity.getDialog();
assertTrue(d.isShowing());
mCalledCallback = false;
@@ -797,7 +804,7 @@
public void testSetDismissMessage() throws Throwable {
mCalledCallback = false;
- startDialogActivity(DialogStubActivity.TEST_DIALOG_WITHOUT_THEME);
+ startDialogActivity(DialogCtsActivity.TEST_DIALOG_WITHOUT_THEME);
final Dialog d = mActivity.getDialog();
final HandlerThread ht = new HandlerThread("DialogTest");
diff --git a/tests/src/android/app/cts/ExpandableListTestActivity.java b/tests/tests/app/src/android/app/cts/ExpandableListTestActivity.java
similarity index 100%
rename from tests/src/android/app/cts/ExpandableListTestActivity.java
rename to tests/tests/app/src/android/app/cts/ExpandableListTestActivity.java
diff --git a/tests/src/android/app/cts/IBinderParcelable.java b/tests/tests/app/src/android/app/cts/IBinderParcelable.java
similarity index 100%
rename from tests/src/android/app/cts/IBinderParcelable.java
rename to tests/tests/app/src/android/app/cts/IBinderParcelable.java
diff --git a/tests/src/android/app/cts/ISecondary.aidl b/tests/tests/app/src/android/app/cts/ISecondary.aidl
similarity index 100%
rename from tests/src/android/app/cts/ISecondary.aidl
rename to tests/tests/app/src/android/app/cts/ISecondary.aidl
diff --git a/tests/tests/app/src/android/app/cts/InstrumentationTest.java b/tests/tests/app/src/android/app/cts/InstrumentationTest.java
index 16a4ee1..f528789 100644
--- a/tests/tests/app/src/android/app/cts/InstrumentationTest.java
+++ b/tests/tests/app/src/android/app/cts/InstrumentationTest.java
@@ -16,8 +16,7 @@
package android.app.cts;
-import com.android.cts.stub.R;
-
+import com.android.cts.app.R;
import android.app.Activity;
import android.app.Application;
@@ -38,6 +37,7 @@
import android.os.IBinder;
import android.os.SystemClock;
import android.test.InstrumentationTestCase;
+import android.test.UiThreadTest;
import android.view.InputQueue;
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
@@ -58,6 +58,7 @@
private Intent mIntent;
private boolean mRunOnMainSyncResult;
private Context mContext;
+ private MockActivity mMockActivity;
@Override
protected void setUp() throws Exception {
@@ -254,14 +255,19 @@
}
public void testInvokeContextMenuAction() throws Exception {
- MockActivity activity = new MockActivity();
+ mActivity.runOnUiThread(new Runnable() {
+ public void run() {
+ mMockActivity = new MockActivity();
+ }
+ });
+ mInstrumentation.waitForIdleSync();
final int id = 1;
final int flag = 2;
- mInstrumentation.invokeContextMenuAction(activity, id, flag);
+ mInstrumentation.invokeContextMenuAction(mMockActivity, id, flag);
mInstrumentation.waitForIdleSync();
- assertEquals(id, activity.mWindow.mId);
- assertEquals(flag, activity.mWindow.mFlags);
+ assertEquals(id, mMockActivity.mWindow.mId);
+ assertEquals(flag, mMockActivity.mWindow.mFlags);
}
public void testSendStringSync() {
@@ -365,6 +371,7 @@
assertEquals(KeyEvent.KEYCODE_0, mActivity.getKeyDownList().get(0).getKeyCode());
}
+ @UiThreadTest
public void testNewActivity() throws Exception {
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
diff --git a/tests/src/android/app/cts/InstrumentationTestActivity.java b/tests/tests/app/src/android/app/cts/InstrumentationTestActivity.java
similarity index 99%
rename from tests/src/android/app/cts/InstrumentationTestActivity.java
rename to tests/tests/app/src/android/app/cts/InstrumentationTestActivity.java
index 1cedd9f..ac1039b 100644
--- a/tests/src/android/app/cts/InstrumentationTestActivity.java
+++ b/tests/tests/app/src/android/app/cts/InstrumentationTestActivity.java
@@ -29,7 +29,7 @@
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;
-import com.android.cts.stub.R;
+import com.android.cts.app.R;
public class InstrumentationTestActivity extends Activity {
diff --git a/tests/src/android/app/cts/IntentServiceStub.java b/tests/tests/app/src/android/app/cts/IntentServiceStub.java
similarity index 100%
rename from tests/src/android/app/cts/IntentServiceStub.java
rename to tests/tests/app/src/android/app/cts/IntentServiceStub.java
diff --git a/tests/src/android/app/cts/KeyguardManagerActivity.java b/tests/tests/app/src/android/app/cts/KeyguardManagerActivity.java
similarity index 100%
rename from tests/src/android/app/cts/KeyguardManagerActivity.java
rename to tests/tests/app/src/android/app/cts/KeyguardManagerActivity.java
diff --git a/tests/tests/app/src/android/app/cts/KeyguardManagerTest.java b/tests/tests/app/src/android/app/cts/KeyguardManagerTest.java
index 13264ac..3f04340 100644
--- a/tests/tests/app/src/android/app/cts/KeyguardManagerTest.java
+++ b/tests/tests/app/src/android/app/cts/KeyguardManagerTest.java
@@ -27,7 +27,7 @@
private static final String TAG = "KeyguardManagerTest";
public KeyguardManagerTest() {
- super("com.android.cts.stub", KeyguardManagerActivity.class);
+ super("com.android.cts.app", KeyguardManagerActivity.class);
}
public void testNewKeyguardLock() {
diff --git a/tests/src/android/app/cts/LauncherActivityStub.java b/tests/tests/app/src/android/app/cts/LauncherActivityStub.java
similarity index 100%
rename from tests/src/android/app/cts/LauncherActivityStub.java
rename to tests/tests/app/src/android/app/cts/LauncherActivityStub.java
diff --git a/tests/tests/app/src/android/app/cts/LauncherActivityTest.java b/tests/tests/app/src/android/app/cts/LauncherActivityTest.java
index a7e0481..040ff83 100644
--- a/tests/tests/app/src/android/app/cts/LauncherActivityTest.java
+++ b/tests/tests/app/src/android/app/cts/LauncherActivityTest.java
@@ -16,59 +16,54 @@
package android.app.cts;
-
+import android.app.Activity;
import android.app.Instrumentation;
import android.app.LauncherActivity;
import android.app.LauncherActivity.ListItem;
+import android.content.Context;
import android.content.Intent;
import android.test.InstrumentationTestCase;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.UiThreadTest;
import android.view.KeyEvent;
import java.util.List;
-public class LauncherActivityTest extends InstrumentationTestCase {
+public class LauncherActivityTest
+ extends ActivityInstrumentationTestCase2<LauncherActivityStub> {
+
private Instrumentation mInstrumentation;
private LauncherActivityStub mActivity;
+ public LauncherActivityTest() {
+ super("com.android.cts.app", LauncherActivityStub.class);
+ }
+
@Override
protected void setUp() throws Exception {
super.setUp();
mInstrumentation = getInstrumentation();
+ mActivity = getActivity();
}
- @Override
- protected void tearDown() throws Exception {
- if (mActivity != null) {
- if (!mActivity.isFinishing()) {
- mActivity.finish();
+ public void testLaunchActivity() throws Throwable {
+ runTestOnUiThread(new Runnable() {
+ public void run() {
+ // Test getTargetIntent. LaunchActivity#getTargetIntent() just returns a Intent() instance
+ // with no content, so we use LaunchActivityStub#getSuperIntent() to get the default Intent,
+ // and create a new intent for other tests.
+ assertNotNull(mActivity.getSuperIntent());
+
+ // Test makeListItems. Make sure the size > 0. The sorted order is related to the sort
+ // way, so it's mutable.
+ final List<ListItem> list = mActivity.makeListItems();
+ assertTrue(list.size() > 0);
+
+ // There should be an activity(but with uncertain content) in position 0.
+ assertNotNull(mActivity.intentForPosition(0));
}
- }
- super.tearDown();
- }
-
- public void testLaunchActivity() {
- // Constructor of LaunchActivity can't be invoked directly.
- new LauncherActivityStub();
- final String packageName = "com.android.cts.stub";
- final Intent intent = new Intent(Intent.ACTION_MAIN);
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- intent.setClassName(packageName, LauncherActivityStub.class.getName());
- mActivity = (LauncherActivityStub) mInstrumentation.startActivitySync(intent);
- // Test onCreate
- assertTrue(mActivity.isOnCreateCalled);
-
- // Test getTargetIntent. LaunchActivity#getTargetIntent() just returns a Intent() instance
- // with no content, so we use LaunchActivityStub#getSuperIntent() to get the default Intent,
- // and create a new intent for other tests.
- assertNotNull(mActivity.getSuperIntent());
-
- // Test makeListItems. Make sure the size > 0. The sorted order is related to the sort
- // way, so it's mutable.
- final List<ListItem> list = mActivity.makeListItems();
- assertTrue(list.size() > 0);
-
- // There should be an activity(but with uncertain content) in position 0.
- assertNotNull(mActivity.intentForPosition(0));
+ });
+ mInstrumentation.waitForIdleSync();
// Test onListItemClick
sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
diff --git a/tests/tests/app/src/android/app/cts/LauncherActivity_IconResizerTest.java b/tests/tests/app/src/android/app/cts/LauncherActivity_IconResizerTest.java
index 695050a..e36cf57 100644
--- a/tests/tests/app/src/android/app/cts/LauncherActivity_IconResizerTest.java
+++ b/tests/tests/app/src/android/app/cts/LauncherActivity_IconResizerTest.java
@@ -16,7 +16,7 @@
package android.app.cts;
-import com.android.cts.stub.R;
+import com.android.cts.app.R;
import android.app.LauncherActivity;
@@ -27,7 +27,7 @@
public class LauncherActivity_IconResizerTest extends
ActivityInstrumentationTestCase2<LauncherActivityStub> {
- private static final String PACKAGE = "com.android.cts.stub";
+ private static final String PACKAGE = "com.android.cts.app";
private LauncherActivityStub mActivity;
public LauncherActivity_IconResizerTest() {
diff --git a/tests/src/android/app/cts/LaunchpadActivity.java b/tests/tests/app/src/android/app/cts/LaunchpadActivity.java
similarity index 100%
rename from tests/src/android/app/cts/LaunchpadActivity.java
rename to tests/tests/app/src/android/app/cts/LaunchpadActivity.java
diff --git a/tests/src/android/app/cts/LaunchpadTabActivity.java b/tests/tests/app/src/android/app/cts/LaunchpadTabActivity.java
similarity index 100%
rename from tests/src/android/app/cts/LaunchpadTabActivity.java
rename to tests/tests/app/src/android/app/cts/LaunchpadTabActivity.java
diff --git a/tests/src/android/app/cts/LocalActivity.java b/tests/tests/app/src/android/app/cts/LocalActivity.java
similarity index 100%
rename from tests/src/android/app/cts/LocalActivity.java
rename to tests/tests/app/src/android/app/cts/LocalActivity.java
diff --git a/tests/src/android/app/cts/LocalActivityManagerStubActivity.java b/tests/tests/app/src/android/app/cts/LocalActivityManagerCtsActivity.java
similarity index 95%
rename from tests/src/android/app/cts/LocalActivityManagerStubActivity.java
rename to tests/tests/app/src/android/app/cts/LocalActivityManagerCtsActivity.java
index e64c75a..93da3e4 100644
--- a/tests/src/android/app/cts/LocalActivityManagerStubActivity.java
+++ b/tests/tests/app/src/android/app/cts/LocalActivityManagerCtsActivity.java
@@ -19,7 +19,7 @@
import android.app.Activity;
import android.os.Bundle;
-public class LocalActivityManagerStubActivity extends Activity{
+public class LocalActivityManagerCtsActivity extends Activity{
public static boolean sIsOnResumeCalled;
public static boolean sIsOnStopCalled;
diff --git a/tests/tests/app/src/android/app/cts/LocalActivityManagerTest.java b/tests/tests/app/src/android/app/cts/LocalActivityManagerTest.java
index 237a198..1b40476 100644
--- a/tests/tests/app/src/android/app/cts/LocalActivityManagerTest.java
+++ b/tests/tests/app/src/android/app/cts/LocalActivityManagerTest.java
@@ -21,6 +21,7 @@
import android.app.LocalActivityManager;
import android.content.Intent;
import android.test.InstrumentationTestCase;
+import android.test.UiThreadTest;
public class LocalActivityManagerTest extends InstrumentationTestCase implements CTSResult {
@@ -46,6 +47,7 @@
mInstrumentation.getTargetContext().startActivity(intent);
}
+ @UiThreadTest
public void testConstructor() {
new LocalActivityManager(new Activity(), true);
new LocalActivityManager(new Activity(), false);
diff --git a/tests/src/android/app/cts/LocalActivityManagerTestHelper.java b/tests/tests/app/src/android/app/cts/LocalActivityManagerTestHelper.java
similarity index 90%
rename from tests/src/android/app/cts/LocalActivityManagerTestHelper.java
rename to tests/tests/app/src/android/app/cts/LocalActivityManagerTestHelper.java
index 76af648..5c0aca0 100644
--- a/tests/src/android/app/cts/LocalActivityManagerTestHelper.java
+++ b/tests/tests/app/src/android/app/cts/LocalActivityManagerTestHelper.java
@@ -87,7 +87,7 @@
private void testRemoveAllActivity() {
final String id = "id_remove_activity";
- final Intent intent = new Intent(this, LocalActivityManagerStubActivity.class);
+ final Intent intent = new Intent(this, LocalActivityManagerCtsActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mLocalActivityManager.startActivity(id, intent);
@@ -98,7 +98,7 @@
}
if (!activity.getClass().getName().equals("android.app.cts."
- + "LocalActivityManagerStubActivity")) {
+ + "LocalActivityManagerCtsActivity")) {
fail();
return;
}
@@ -115,27 +115,27 @@
private void testDispatchDestroy() {
final String id1 = "id_dispatch_destroy1";
final String id2 = "id_dispatch_destroy2";
- final Intent intent = new Intent(this, LocalActivityManagerStubActivity.class);
+ final Intent intent = new Intent(this, LocalActivityManagerCtsActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mLocalActivityManager.startActivity(id1, intent);
- LocalActivityManagerStubActivity.sIsOnDestroyCalled = false;
+ LocalActivityManagerCtsActivity.sIsOnDestroyCalled = false;
mLocalActivityManager.dispatchDestroy(false);
if (mLocalActivityManager.getCurrentActivity().isFinishing()){
fail();
return;
}
- if (!LocalActivityManagerStubActivity.sIsOnDestroyCalled) {
+ if (!LocalActivityManagerCtsActivity.sIsOnDestroyCalled) {
fail();
return;
}
mLocalActivityManager.startActivity(id2, intent);
- LocalActivityManagerStubActivity.sIsOnDestroyCalled = false;
+ LocalActivityManagerCtsActivity.sIsOnDestroyCalled = false;
mLocalActivityManager.dispatchDestroy(true);
- if (!LocalActivityManagerStubActivity.sIsOnDestroyCalled) {
+ if (!LocalActivityManagerCtsActivity.sIsOnDestroyCalled) {
fail();
return;
}
@@ -157,7 +157,7 @@
}
final String id = "id_dispatch_pause";
- final Intent intent = new Intent(this, LocalActivityManagerStubActivity.class);
+ final Intent intent = new Intent(this, LocalActivityManagerCtsActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mLocalActivityManager.startActivity(id, intent);
@@ -176,12 +176,12 @@
private void testDispatchPauseFalse() {
final String id = "id_dispatch_pause";
- final Intent intent = new Intent(this, LocalActivityManagerStubActivity.class);
+ final Intent intent = new Intent(this, LocalActivityManagerCtsActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mLocalActivityManager.startActivity(id, intent);
- LocalActivityManagerStubActivity.sIsOnPauseCalled = false;
+ LocalActivityManagerCtsActivity.sIsOnPauseCalled = false;
mLocalActivityManager.dispatchPause(false);
- if (!LocalActivityManagerStubActivity.sIsOnPauseCalled) {
+ if (!LocalActivityManagerCtsActivity.sIsOnPauseCalled) {
fail();
return;
}
@@ -190,12 +190,12 @@
private void testDispatchPauseTrue() {
final String id = "id_dispatch_pause";
- final Intent intent = new Intent(this, LocalActivityManagerStubActivity.class);
+ final Intent intent = new Intent(this, LocalActivityManagerCtsActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mLocalActivityManager.startActivity(id, intent);
- LocalActivityManagerStubActivity.sIsOnPauseCalled = false;
+ LocalActivityManagerCtsActivity.sIsOnPauseCalled = false;
mLocalActivityManager.dispatchPause(true);
- if (!LocalActivityManagerStubActivity.sIsOnPauseCalled) {
+ if (!LocalActivityManagerCtsActivity.sIsOnPauseCalled) {
fail();
return;
}
@@ -204,7 +204,7 @@
private void testDispatchStop() {
final String id = "id_dispatch_stop";
- final Intent intent = new Intent(this, LocalActivityManagerStubActivity.class);
+ final Intent intent = new Intent(this, LocalActivityManagerCtsActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mLocalActivityManager.startActivity(id, intent);
if (mLocalActivityManager.getCurrentActivity() == null) {
@@ -212,10 +212,10 @@
return;
}
- LocalActivityManagerStubActivity.sIsOnStopCalled = false;
+ LocalActivityManagerCtsActivity.sIsOnStopCalled = false;
mLocalActivityManager.dispatchStop();
- if (!LocalActivityManagerStubActivity.sIsOnStopCalled) {
+ if (!LocalActivityManagerCtsActivity.sIsOnStopCalled) {
fail();
return;
}
@@ -226,7 +226,7 @@
final Bundle EXPECTED = new Bundle();
final String id = "id";
- final Intent intent = new Intent(this, LocalActivityManagerStubActivity.class);
+ final Intent intent = new Intent(this, LocalActivityManagerCtsActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mLocalActivityManager.startActivity("_id" + System.currentTimeMillis(), intent);
final Bundle bundle = mLocalActivityManager.saveInstanceState();
@@ -261,7 +261,7 @@
}
private void testStartActivity() {
- final Intent intent = new Intent(this, LocalActivityManagerStubActivity.class);
+ final Intent intent = new Intent(this, LocalActivityManagerCtsActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
final String id = "_id_resume_test";
final Window w = mLocalActivityManager.startActivity(id, intent);
@@ -315,13 +315,13 @@
}
private void testDispatchResume() {
- final Intent intent = new Intent(this, LocalActivityManagerStubActivity.class);
+ final Intent intent = new Intent(this, LocalActivityManagerCtsActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mLocalActivityManager.startActivity("_id_resume_test", intent);
mLocalActivityManager.dispatchStop();
- LocalActivityManagerStubActivity.sIsOnResumeCalled = false;
+ LocalActivityManagerCtsActivity.sIsOnResumeCalled = false;
mLocalActivityManager.dispatchResume();
- if (LocalActivityManagerStubActivity.sIsOnResumeCalled) {
+ if (LocalActivityManagerCtsActivity.sIsOnResumeCalled) {
pass();
} else {
fail();
diff --git a/tests/src/android/app/cts/LocalDeniedService.java b/tests/tests/app/src/android/app/cts/LocalDeniedService.java
similarity index 100%
rename from tests/src/android/app/cts/LocalDeniedService.java
rename to tests/tests/app/src/android/app/cts/LocalDeniedService.java
diff --git a/tests/src/android/app/cts/LocalDialog.java b/tests/tests/app/src/android/app/cts/LocalDialog.java
similarity index 100%
rename from tests/src/android/app/cts/LocalDialog.java
rename to tests/tests/app/src/android/app/cts/LocalDialog.java
diff --git a/tests/src/android/app/cts/LocalGrantedService.java b/tests/tests/app/src/android/app/cts/LocalGrantedService.java
similarity index 100%
rename from tests/src/android/app/cts/LocalGrantedService.java
rename to tests/tests/app/src/android/app/cts/LocalGrantedService.java
diff --git a/tests/src/android/app/cts/LocalScreen.java b/tests/tests/app/src/android/app/cts/LocalScreen.java
similarity index 100%
rename from tests/src/android/app/cts/LocalScreen.java
rename to tests/tests/app/src/android/app/cts/LocalScreen.java
diff --git a/tests/src/android/app/cts/LocalService.java b/tests/tests/app/src/android/app/cts/LocalService.java
similarity index 100%
rename from tests/src/android/app/cts/LocalService.java
rename to tests/tests/app/src/android/app/cts/LocalService.java
diff --git a/tests/src/android/app/cts/MockActivity.java b/tests/tests/app/src/android/app/cts/MockActivity.java
similarity index 100%
rename from tests/src/android/app/cts/MockActivity.java
rename to tests/tests/app/src/android/app/cts/MockActivity.java
diff --git a/tests/src/android/app/cts/MockAlarmReceiver.java b/tests/tests/app/src/android/app/cts/MockAlarmReceiver.java
similarity index 100%
rename from tests/src/android/app/cts/MockAlarmReceiver.java
rename to tests/tests/app/src/android/app/cts/MockAlarmReceiver.java
diff --git a/tests/src/android/app/cts/MockApplication.java b/tests/tests/app/src/android/app/cts/MockApplication.java
similarity index 100%
rename from tests/src/android/app/cts/MockApplication.java
rename to tests/tests/app/src/android/app/cts/MockApplication.java
diff --git a/tests/src/android/app/cts/MockApplicationActivity.java b/tests/tests/app/src/android/app/cts/MockApplicationActivity.java
similarity index 100%
rename from tests/src/android/app/cts/MockApplicationActivity.java
rename to tests/tests/app/src/android/app/cts/MockApplicationActivity.java
diff --git a/tests/src/android/app/cts/MockReceiver.java b/tests/tests/app/src/android/app/cts/MockReceiver.java
similarity index 100%
rename from tests/src/android/app/cts/MockReceiver.java
rename to tests/tests/app/src/android/app/cts/MockReceiver.java
diff --git a/tests/src/android/app/cts/MockService.java b/tests/tests/app/src/android/app/cts/MockService.java
similarity index 100%
rename from tests/src/android/app/cts/MockService.java
rename to tests/tests/app/src/android/app/cts/MockService.java
diff --git a/tests/src/android/app/cts/MockTabActivity.java b/tests/tests/app/src/android/app/cts/MockTabActivity.java
similarity index 95%
rename from tests/src/android/app/cts/MockTabActivity.java
rename to tests/tests/app/src/android/app/cts/MockTabActivity.java
index aca19f5..ebbeb7b 100644
--- a/tests/src/android/app/cts/MockTabActivity.java
+++ b/tests/tests/app/src/android/app/cts/MockTabActivity.java
@@ -46,7 +46,7 @@
.setContent(new Intent(this, MockActivity.class)));
tabHost.addTab(tabHost.newTabSpec(TAB3).setIndicator(TAB3).setContent(
- new Intent(this, AppStubActivity.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)));
+ new Intent(this, AppCtsActivity.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)));
}
diff --git a/tests/tests/app/src/android/app/cts/NotificationManagerTest.java b/tests/tests/app/src/android/app/cts/NotificationManagerTest.java
index 4add582..94b410f 100644
--- a/tests/tests/app/src/android/app/cts/NotificationManagerTest.java
+++ b/tests/tests/app/src/android/app/cts/NotificationManagerTest.java
@@ -24,7 +24,7 @@
import android.provider.Telephony.Threads;
import android.test.AndroidTestCase;
-import com.android.cts.stub.R;
+import com.android.cts.app.R;
public class NotificationManagerTest extends AndroidTestCase {
diff --git a/tests/src/android/app/cts/OrientationTestUtils.java b/tests/tests/app/src/android/app/cts/OrientationTestUtils.java
similarity index 100%
rename from tests/src/android/app/cts/OrientationTestUtils.java
rename to tests/tests/app/src/android/app/cts/OrientationTestUtils.java
diff --git a/tests/src/android/app/cts/PendingIntentStubActivity.java b/tests/tests/app/src/android/app/cts/PendingIntentCtsActivity.java
similarity index 93%
rename from tests/src/android/app/cts/PendingIntentStubActivity.java
rename to tests/tests/app/src/android/app/cts/PendingIntentCtsActivity.java
index a2a3bd8..f11fe10 100644
--- a/tests/src/android/app/cts/PendingIntentStubActivity.java
+++ b/tests/tests/app/src/android/app/cts/PendingIntentCtsActivity.java
@@ -19,7 +19,7 @@
import android.app.Activity;
import android.os.Bundle;
-public class PendingIntentStubActivity extends Activity {
+public class PendingIntentCtsActivity extends Activity {
public static final int INVALIDATE = -1;
public static final int ON_CREATE = 0;
diff --git a/tests/tests/app/src/android/app/cts/PendingIntentTest.java b/tests/tests/app/src/android/app/cts/PendingIntentTest.java
index d2c1b31..fb32291 100644
--- a/tests/tests/app/src/android/app/cts/PendingIntentTest.java
+++ b/tests/tests/app/src/android/app/cts/PendingIntentTest.java
@@ -95,11 +95,11 @@
}
public void testGetActivity() throws InterruptedException, CanceledException {
- PendingIntentStubActivity.status = PendingIntentStubActivity.INVALIDATE;
+ PendingIntentCtsActivity.status = PendingIntentCtsActivity.INVALIDATE;
mPendingIntent = null;
mIntent = new Intent();
- mIntent.setClass(mContext, PendingIntentStubActivity.class);
+ mIntent.setClass(mContext, PendingIntentCtsActivity.class);
mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mPendingIntent = PendingIntent.getActivity(mContext, 1, mIntent,
PendingIntent.FLAG_CANCEL_CURRENT);
@@ -109,7 +109,7 @@
Thread.sleep(WAIT_TIME);
assertNotNull(mPendingIntent);
- assertEquals(PendingIntentStubActivity.status, PendingIntentStubActivity.ON_CREATE);
+ assertEquals(PendingIntentCtsActivity.status, PendingIntentCtsActivity.ON_CREATE);
// test getActivity return null
mPendingIntent.cancel();
diff --git a/tests/tests/app/src/android/app/cts/ProgressDialogTest.java b/tests/tests/app/src/android/app/cts/ProgressDialogTest.java
index 1d08d30..106b504 100644
--- a/tests/tests/app/src/android/app/cts/ProgressDialogTest.java
+++ b/tests/tests/app/src/android/app/cts/ProgressDialogTest.java
@@ -48,10 +48,9 @@
private Context mContext;
private Instrumentation mInstrumentation;
private MockActivity mActivity;
- private ProgressDialog mProgressDialog;
public ProgressDialogTest() {
- super("com.android.cts.stub", MockActivity.class);
+ super("com.android.cts.app", MockActivity.class);
}
@Override
@@ -62,19 +61,21 @@
mInstrumentation = getInstrumentation();
mActivity = getActivity();
mContext = mActivity;
- mProgressDialog = new ProgressDialog(mContext);
mDrawable = getActivity().getResources().getDrawable(
- com.android.cts.stub.R.drawable.yellow);
+ com.android.cts.app.R.drawable.yellow);
}
+ @UiThreadTest
public void testProgressDialog1(){
new ProgressDialog(mContext);
}
+ @UiThreadTest
public void testProgressDialog2(){
- new ProgressDialog(mContext, com.android.cts.stub.R.style.Theme_AlertDialog);
+ new ProgressDialog(mContext, com.android.cts.app.R.style.Theme_AlertDialog);
}
+ @UiThreadTest
public void testOnStartCreateStop() {
MockProgressDialog pd = new MockProgressDialog(mContext);
@@ -91,21 +92,22 @@
@UiThreadTest
public void testShow1() {
- mProgressDialog = ProgressDialog.show(mContext, TITLE, MESSAGE);
+ ProgressDialog.show(mContext, TITLE, MESSAGE);
}
@UiThreadTest
public void testShow2() {
- mProgressDialog = ProgressDialog.show(mContext, TITLE, MESSAGE, false);
+ ProgressDialog dialog = buildDialog();
+ dialog = ProgressDialog.show(mContext, TITLE, MESSAGE, false);
/*
* note: the progress bar's style only supports indeterminate mode,
* so can't change indeterminate
*/
- assertTrue(mProgressDialog.isIndeterminate());
+ assertTrue(dialog.isIndeterminate());
- mProgressDialog = ProgressDialog.show(mContext, TITLE, MESSAGE, true);
- assertTrue(mProgressDialog.isIndeterminate());
+ dialog = ProgressDialog.show(mContext, TITLE, MESSAGE, true);
+ assertTrue(dialog.isIndeterminate());
}
public void testShow3() throws Throwable {
@@ -118,10 +120,11 @@
// cancelable is false
runTestOnUiThread(new Runnable() {
public void run() {
- mProgressDialog = ProgressDialog.show(mContext, TITLE, MESSAGE, true, false);
+ ProgressDialog dialog = buildDialog();
+ dialog = ProgressDialog.show(mContext, TITLE, MESSAGE, true, false);
- mProgressDialog.setOnCancelListener(cL);
- mProgressDialog.onBackPressed();
+ dialog.setOnCancelListener(cL);
+ dialog.onBackPressed();
}
});
mInstrumentation.waitForIdleSync();
@@ -131,11 +134,11 @@
// cancelable is true
runTestOnUiThread(new Runnable() {
public void run() {
- mProgressDialog = ProgressDialog.show(mContext, TITLE, MESSAGE, true, true);
-
+ ProgressDialog dialog = buildDialog();
+ dialog = ProgressDialog.show(mContext, TITLE, MESSAGE, true, true);
assertFalse(mCanceled);
- mProgressDialog.setOnCancelListener(cL);
- mProgressDialog.onBackPressed();
+ dialog.setOnCancelListener(cL);
+ dialog.onBackPressed();
}
});
mInstrumentation.waitForIdleSync();
@@ -153,9 +156,10 @@
// cancelable is false
runTestOnUiThread(new Runnable() {
public void run() {
- mProgressDialog = ProgressDialog.show(mContext, TITLE, MESSAGE, true, false, cL);
+ ProgressDialog dialog = buildDialog();
+ dialog = ProgressDialog.show(mContext, TITLE, MESSAGE, true, false, cL);
- mProgressDialog.onBackPressed();
+ dialog.onBackPressed();
}
});
mInstrumentation.waitForIdleSync();
@@ -165,10 +169,11 @@
// cancelable is true
runTestOnUiThread(new Runnable() {
public void run() {
- mProgressDialog = ProgressDialog.show(mContext, TITLE, MESSAGE, true, true, cL);
+ ProgressDialog dialog = buildDialog();
+ dialog = ProgressDialog.show(mContext, TITLE, MESSAGE, true, true, cL);
assertFalse(mCanceled);
- mProgressDialog.onBackPressed();
+ dialog.onBackPressed();
}
});
mInstrumentation.waitForIdleSync();
@@ -178,180 +183,152 @@
@UiThreadTest
public void testAccessMax() {
- // mProgress is null
- mProgressDialog.setMax(2008);
- assertEquals(2008, mProgressDialog.getMax());
+ // progressDialog is null
+ ProgressDialog progressDialog = buildDialog();
+ progressDialog.setMax(2008);
+ assertEquals(2008, progressDialog.getMax());
- // mProgress is not null
- mProgressDialog = ProgressDialog.show(mContext, TITLE, MESSAGE);
- mProgressDialog.setMax(2009);
- assertEquals(2009, mProgressDialog.getMax());
+ // progressDialog is not null
+ progressDialog = ProgressDialog.show(mContext, TITLE, MESSAGE);
+ progressDialog.setMax(2009);
+ assertEquals(2009, progressDialog.getMax());
}
@UiThreadTest
public void testAccessProgress() {
- // mProgress is null
- mProgressDialog.setProgress(11);
- assertEquals(11, mProgressDialog.getProgress());
+ // progressDialog is null
+ ProgressDialog progressDialog = buildDialog();
+ progressDialog.setProgress(11);
+ assertEquals(11, progressDialog.getProgress());
- /* mProgress is not null
+ /* progressDialog is not null
* note: the progress bar's style only supports indeterminate mode,
* so can't change progress
*/
- mProgressDialog = ProgressDialog.show(mContext, TITLE, MESSAGE);
- mProgressDialog.setProgress(12);
- assertEquals(0, mProgressDialog.getProgress());
+ progressDialog = ProgressDialog.show(mContext, TITLE, MESSAGE);
+ progressDialog.setProgress(12);
+ assertEquals(0, progressDialog.getProgress());
}
@UiThreadTest
public void testAccessSecondaryProgress() {
- // mProgress is null
- mProgressDialog.setSecondaryProgress(17);
- assertEquals(17, mProgressDialog.getSecondaryProgress());
+ // dialog is null
+ ProgressDialog dialog = buildDialog();
+ dialog.setSecondaryProgress(17);
+ assertEquals(17, dialog.getSecondaryProgress());
/* mProgress is not null
* note: the progress bar's style only supports indeterminate mode,
* so can't change secondary progress
*/
- mProgressDialog = ProgressDialog.show(mContext, TITLE, MESSAGE);
- mProgressDialog.setSecondaryProgress(18);
- assertEquals(0, mProgressDialog.getSecondaryProgress());
+ dialog = ProgressDialog.show(mContext, TITLE, MESSAGE);
+ dialog.setSecondaryProgress(18);
+ assertEquals(0, dialog.getSecondaryProgress());
}
@UiThreadTest
public void testSetIndeterminate() {
- // mProgress is null
- mProgressDialog.setIndeterminate(true);
- assertTrue(mProgressDialog.isIndeterminate());
- mProgressDialog.setIndeterminate(false);
- assertFalse(mProgressDialog.isIndeterminate());
+ // progress is null
+ ProgressDialog dialog = buildDialog();
+ dialog.setIndeterminate(true);
+ assertTrue(dialog.isIndeterminate());
+ dialog.setIndeterminate(false);
+ assertFalse(dialog.isIndeterminate());
/* mProgress is not null
* note: the progress bar's style only supports indeterminate mode,
* so can't change indeterminate
*/
- mProgressDialog = ProgressDialog.show(mContext, TITLE, MESSAGE);
- mProgressDialog.setIndeterminate(true);
- assertTrue(mProgressDialog.isIndeterminate());
- mProgressDialog.setIndeterminate(false);
- assertTrue(mProgressDialog.isIndeterminate());
+ dialog = ProgressDialog.show(mContext, TITLE, MESSAGE);
+ dialog.setIndeterminate(true);
+ assertTrue(dialog.isIndeterminate());
+ dialog.setIndeterminate(false);
+ assertTrue(dialog.isIndeterminate());
}
+ @UiThreadTest
public void testIncrementProgressBy() throws Throwable {
- runTestOnUiThread(new Runnable() {
- public void run() {
- mProgressDialog = new ProgressDialog(mContext);
- mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
- mProgressDialog.show();
- mProgressDialog.setProgress(10);
- mProgress1 = mProgressDialog.getProgress();
- mProgressDialog.incrementProgressBy(60);
- mProgress2 = mProgressDialog.getProgress();
- mProgressDialog.cancel();
- }
- });
- mInstrumentation.waitForIdleSync();
+ ProgressDialog dialog = new ProgressDialog(mContext);
+ dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
+ dialog.show();
+ dialog.setProgress(10);
+ mProgress1 = dialog.getProgress();
+ dialog.incrementProgressBy(60);
+ mProgress2 = dialog.getProgress();
+ dialog.cancel();
assertEquals(10, mProgress1);
assertEquals(70, mProgress2);
}
+ @UiThreadTest
public void testIncrementSecondaryProgressBy() throws Throwable {
- runTestOnUiThread(new Runnable() {
- public void run() {
- mProgressDialog = new ProgressDialog(mContext);
- mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
- mProgressDialog.show();
- mProgressDialog.setSecondaryProgress(10);
- mProgress1 = mProgressDialog.getSecondaryProgress();
- mProgressDialog.incrementSecondaryProgressBy(60);
- mProgress2 = mProgressDialog.getSecondaryProgress();
- }
- });
- mInstrumentation.waitForIdleSync();
+ ProgressDialog dialog = new ProgressDialog(mContext);
+ dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
+ dialog.show();
+ dialog.setSecondaryProgress(10);
+ mProgress1 = dialog.getSecondaryProgress();
+ dialog.incrementSecondaryProgressBy(60);
+ mProgress2 = dialog.getSecondaryProgress();
assertEquals(10, mProgress1);
assertEquals(70, mProgress2);
}
+ @UiThreadTest
public void testSetProgressDrawable() throws Throwable {
- runTestOnUiThread(new Runnable() {
- public void run() {
- mProgressDialog = ProgressDialog.show(mContext, TITLE, MESSAGE);
- final Window w = mProgressDialog.getWindow();
- final ProgressBar progressBar = (ProgressBar) w.findViewById(android.R.id.progress);
+ ProgressDialog dialog = ProgressDialog.show(mContext, TITLE, MESSAGE);
+ Window w = dialog.getWindow();
+ ProgressBar progressBar = (ProgressBar) w.findViewById(android.R.id.progress);
- mProgressDialog.setProgressDrawable(mDrawable);
- mActualDrawable = progressBar.getProgressDrawable();
+ dialog.setProgressDrawable(mDrawable);
+ mActualDrawable = progressBar.getProgressDrawable();
- mProgressDialog.setProgressDrawable(null);
- mActualDrawableNull = progressBar.getProgressDrawable();
- }
- });
- mInstrumentation.waitForIdleSync();
+ dialog.setProgressDrawable(null);
+ mActualDrawableNull = progressBar.getProgressDrawable();
assertEquals(mDrawable, mActualDrawable);
assertEquals(null, mActualDrawableNull);
}
+ @UiThreadTest
public void testSetIndeterminateDrawable() throws Throwable {
- runTestOnUiThread(new Runnable() {
- public void run() {
- mProgressDialog = ProgressDialog.show(mContext, TITLE, MESSAGE);
- final Window w = mProgressDialog.getWindow();
- mProgressBar = (ProgressBar) w.findViewById(android.R.id.progress);
+ ProgressDialog dialog = ProgressDialog.show(mContext, TITLE, MESSAGE);
+ Window w = dialog.getWindow();
+ mProgressBar = (ProgressBar) w.findViewById(android.R.id.progress);
- mProgressDialog.setIndeterminateDrawable(mDrawable);
- mActualDrawable = mProgressBar.getIndeterminateDrawable();
- assertEquals(mDrawable, mActualDrawable);
+ dialog.setIndeterminateDrawable(mDrawable);
+ mActualDrawable = mProgressBar.getIndeterminateDrawable();
+ assertEquals(mDrawable, mActualDrawable);
- mProgressDialog.setIndeterminateDrawable(null);
- mActualDrawableNull = mProgressBar.getIndeterminateDrawable();
- assertEquals(null, mActualDrawableNull);
- }
- });
- mInstrumentation.waitForIdleSync();
+ dialog.setIndeterminateDrawable(null);
+ mActualDrawableNull = mProgressBar.getIndeterminateDrawable();
+ assertEquals(null, mActualDrawableNull);
}
+ @UiThreadTest
public void testSetMessage() throws Throwable {
- runTestOnUiThread(new Runnable() {
- public void run() {
- // mProgress is null
- mProgressDialog = new ProgressDialog(mContext);
- mProgressDialog.setMessage(MESSAGE);
- mProgressDialog.show();
- }
- });
- mInstrumentation.waitForIdleSync();
-
- runTestOnUiThread(new Runnable() {
- public void run() {
- // mProgress is not null
- mProgressDialog = ProgressDialog.show(mContext, TITLE, MESSAGE);
- mProgressDialog.setMessage("Bruce Li");
- }
- });
- mInstrumentation.waitForIdleSync();
+ ProgressDialog dialog = new ProgressDialog(mContext);
+ dialog = new ProgressDialog(mContext);
+ dialog.setMessage(MESSAGE);
+ dialog.show();
+ // dialog is not null
+ dialog = ProgressDialog.show(mContext, TITLE, MESSAGE);
+ dialog.setMessage("Chuck Norris");
}
+ @UiThreadTest
public void testSetProgressStyle() throws Throwable {
- setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
-
- setProgressStyle(ProgressDialog.STYLE_SPINNER);
- setProgressStyle(100);
+ ProgressDialog dialog = new ProgressDialog(mContext);
+ setProgressStyle(dialog, ProgressDialog.STYLE_HORIZONTAL);
+ setProgressStyle(dialog, ProgressDialog.STYLE_SPINNER);
+ setProgressStyle(dialog, 100);
}
- private void setProgressStyle(final int style) throws Throwable {
- runTestOnUiThread(new Runnable() {
- public void run() {
- mProgressDialog = new ProgressDialog(mContext);
- mProgressDialog.setProgressStyle(style);
-
- mProgressDialog.show();
- mProgressDialog.setProgress(10);
- mProgressDialog.setMax(100);
- }
- });
- mInstrumentation.waitForIdleSync();
+ private void setProgressStyle(ProgressDialog dialog, int style) {
+ dialog.setProgressStyle(style);
+ dialog.show();
+ dialog.setProgress(10);
+ dialog.setMax(100);
}
private static class MockProgressDialog extends ProgressDialog {
@@ -381,4 +358,8 @@
mIsOnStopCalled = true;
}
}
+
+ private ProgressDialog buildDialog() {
+ return new ProgressDialog(mContext);
+ }
}
diff --git a/tests/src/android/app/cts/SearchManagerStubActivity.java b/tests/tests/app/src/android/app/cts/SearchManagerCtsActivity.java
similarity index 97%
rename from tests/src/android/app/cts/SearchManagerStubActivity.java
rename to tests/tests/app/src/android/app/cts/SearchManagerCtsActivity.java
index 6385fef..7198e8d 100644
--- a/tests/src/android/app/cts/SearchManagerStubActivity.java
+++ b/tests/tests/app/src/android/app/cts/SearchManagerCtsActivity.java
@@ -25,9 +25,9 @@
import android.os.Message;
import android.util.Log;
-public class SearchManagerStubActivity extends Activity {
+public class SearchManagerCtsActivity extends Activity {
- private static final String TAG = "SearchManagerStubActivity";
+ private static final String TAG = "SearchManagerCtsActivity";
public static final String TEST_STOP_SEARCH = "stopSearch";
public static final String TEST_ON_DISMISSLISTENER = "setOnDismissListener";
diff --git a/tests/tests/app/src/android/app/cts/SearchManagerTest.java b/tests/tests/app/src/android/app/cts/SearchManagerTest.java
index 8e465e8..ef7a0e0 100644
--- a/tests/tests/app/src/android/app/cts/SearchManagerTest.java
+++ b/tests/tests/app/src/android/app/cts/SearchManagerTest.java
@@ -24,25 +24,25 @@
Intent intent = new Intent();
intent.setAction(action);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- intent.setClass(getInstrumentation().getTargetContext(), SearchManagerStubActivity.class);
+ intent.setClass(getInstrumentation().getTargetContext(), SearchManagerCtsActivity.class);
getInstrumentation().getTargetContext().startActivity(intent);
}
public void testStopSearch() throws InterruptedException {
- SearchManagerStubActivity.setCTSResult(this);
- setupActivity(SearchManagerStubActivity.TEST_STOP_SEARCH);
+ SearchManagerCtsActivity.setCTSResult(this);
+ setupActivity(SearchManagerCtsActivity.TEST_STOP_SEARCH);
waitForResult();
}
public void testSetOnDismissListener() throws InterruptedException {
- SearchManagerStubActivity.setCTSResult(this);
- setupActivity(SearchManagerStubActivity.TEST_ON_DISMISSLISTENER);
+ SearchManagerCtsActivity.setCTSResult(this);
+ setupActivity(SearchManagerCtsActivity.TEST_ON_DISMISSLISTENER);
waitForResult();
}
public void testSetOnCancelListener() throws InterruptedException {
- SearchManagerStubActivity.setCTSResult(this);
- setupActivity(SearchManagerStubActivity.TEST_ON_CANCELLISTENER);
+ SearchManagerCtsActivity.setCTSResult(this);
+ setupActivity(SearchManagerCtsActivity.TEST_ON_CANCELLISTENER);
waitForResult();
}
}
diff --git a/tests/src/android/app/cts/StubRemoteService.java b/tests/tests/app/src/android/app/cts/StubRemoteService.java
similarity index 100%
rename from tests/src/android/app/cts/StubRemoteService.java
rename to tests/tests/app/src/android/app/cts/StubRemoteService.java
diff --git a/tests/tests/app/src/android/app/cts/SystemFeaturesTest.java b/tests/tests/app/src/android/app/cts/SystemFeaturesTest.java
index e3dca19..165e67b 100644
--- a/tests/tests/app/src/android/app/cts/SystemFeaturesTest.java
+++ b/tests/tests/app/src/android/app/cts/SystemFeaturesTest.java
@@ -136,9 +136,15 @@
}
if (frontCameraId > -1) {
- assertAvailable(PackageManager.FEATURE_CAMERA_FRONT);
+ assertTrue("Device has front-facing camera but does not report either " +
+ "the FEATURE_CAMERA_FRONT or FEATURE_CAMERA_EXTERNAL feature",
+ mPackageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT) ||
+ mPackageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_EXTERNAL));
} else {
- assertNotAvailable(PackageManager.FEATURE_CAMERA_FRONT);
+ assertFalse("Device does not have front-facing camera but reports either " +
+ "the FEATURE_CAMERA_FRONT or FEATURE_CAMERA_EXTERNAL feature",
+ mPackageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT) ||
+ mPackageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_EXTERNAL));
}
}
diff --git a/tests/tests/app/src/android/app/cts/TabActivityTest.java b/tests/tests/app/src/android/app/cts/TabActivityTest.java
index 04741b7..403b393 100644
--- a/tests/tests/app/src/android/app/cts/TabActivityTest.java
+++ b/tests/tests/app/src/android/app/cts/TabActivityTest.java
@@ -25,6 +25,7 @@
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.test.InstrumentationTestCase;
+import android.test.UiThreadTest;
import android.widget.TabHost;
public class TabActivityTest extends InstrumentationTestCase {
@@ -53,10 +54,14 @@
}
public void testTabActivity() throws Throwable {
- // Test constructor
- new TabActivity();
-
- final String packageName = "com.android.cts.stub";
+ runTestOnUiThread(new Runnable() {
+ public void run() {
+ // Test constructor
+ new TabActivity();
+ }
+ });
+ mInstrumentation.waitForIdleSync();
+ final String packageName = "com.android.cts.app";
final Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setClassName(packageName, MockTabActivity.class.getName());
@@ -77,6 +82,7 @@
assertNotNull(tabHost.getTabWidget());
}
+ @UiThreadTest
public void testChildTitleCallback() throws Exception {
final Context context = mInstrumentation.getTargetContext();
final Intent intent = new Intent(context, MockTabActivity.class);
diff --git a/tests/src/android/app/cts/TestDialog.java b/tests/tests/app/src/android/app/cts/TestDialog.java
similarity index 100%
rename from tests/src/android/app/cts/TestDialog.java
rename to tests/tests/app/src/android/app/cts/TestDialog.java
diff --git a/tests/src/android/app/cts/TestedActivity.java b/tests/tests/app/src/android/app/cts/TestedActivity.java
similarity index 100%
rename from tests/src/android/app/cts/TestedActivity.java
rename to tests/tests/app/src/android/app/cts/TestedActivity.java
diff --git a/tests/src/android/app/cts/TestedScreen.java b/tests/tests/app/src/android/app/cts/TestedScreen.java
similarity index 100%
rename from tests/src/android/app/cts/TestedScreen.java
rename to tests/tests/app/src/android/app/cts/TestedScreen.java
diff --git a/tests/tests/app/src/android/app/cts/TimePickerDialogTest.java b/tests/tests/app/src/android/app/cts/TimePickerDialogTest.java
index e03003b..2fe2d69 100644
--- a/tests/tests/app/src/android/app/cts/TimePickerDialogTest.java
+++ b/tests/tests/app/src/android/app/cts/TimePickerDialogTest.java
@@ -22,12 +22,13 @@
import android.content.Context;
import android.os.Bundle;
import android.test.ActivityInstrumentationTestCase2;
+import android.test.UiThreadTest;
import android.widget.TimePicker;
/**
* Test {@link TimePickerDialog}.
*/
-public class TimePickerDialogTest extends ActivityInstrumentationTestCase2<DialogStubActivity> {
+public class TimePickerDialogTest extends ActivityInstrumentationTestCase2<DialogCtsActivity> {
private static final String HOUR = "hour";
private static final String MINUTE = "minute";
private static final String IS_24_HOUR = "is24hour";
@@ -41,11 +42,10 @@
private OnTimeSetListener mOnTimeSetListener;
private Context mContext;
- private DialogStubActivity mActivity;
- private TimePickerDialog mTimePickerDialog;
+ private DialogCtsActivity mActivity;
public TimePickerDialogTest() {
- super("com.android.cts.stub", DialogStubActivity.class);
+ super("com.android.cts.app", DialogCtsActivity.class);
}
@Override
@@ -59,13 +59,12 @@
mCallbackMinute = minute;
}
};
- mTimePickerDialog = new TimePickerDialog( mContext, mOnTimeSetListener, TARGET_HOUR,
- TARGET_MINUTE, true);
}
- public void testSaveInstanceState(){
- TimePickerDialog tD = new TimePickerDialog( mContext, mOnTimeSetListener, TARGET_HOUR,
- TARGET_MINUTE, true);
+ @UiThreadTest
+ public void testSaveInstanceState() {
+ TimePickerDialog tD = new TimePickerDialog(
+ mContext, mOnTimeSetListener, TARGET_HOUR, TARGET_MINUTE, true);
Bundle b = tD.onSaveInstanceState();
@@ -74,8 +73,9 @@
assertTrue(b.getBoolean(IS_24_HOUR));
int minute = 13;
- tD = new TimePickerDialog( mContext, com.android.cts.stub.R.style.Theme_AlertDialog,
- mOnTimeSetListener, TARGET_HOUR, minute, false);
+ tD = new TimePickerDialog(
+ mContext, com.android.cts.app.R.style.Theme_AlertDialog,
+ mOnTimeSetListener, TARGET_HOUR, minute, false);
b = tD.onSaveInstanceState();
@@ -84,8 +84,10 @@
assertFalse(b.getBoolean(IS_24_HOUR));
}
- public void testOnClick(){
- mTimePickerDialog.onClick(null, TimePickerDialog.BUTTON_POSITIVE);
+ @UiThreadTest
+ public void testOnClick() {
+ TimePickerDialog timePickerDialog = buildDialog();
+ timePickerDialog.onClick(null, TimePickerDialog.BUTTON_POSITIVE);
assertEquals(TARGET_HOUR, mCallbackHour);
assertEquals(TARGET_MINUTE, mCallbackMinute);
@@ -93,7 +95,7 @@
public void testOnTimeChanged() throws Throwable {
final int minute = 34;
- startDialogActivity(DialogStubActivity.TEST_TIMEPICKERDIALOG);
+ startDialogActivity(DialogCtsActivity.TEST_TIMEPICKERDIALOG);
final TimePickerDialog d = (TimePickerDialog) mActivity.getDialog();
runTestOnUiThread(new Runnable() {
@@ -105,28 +107,32 @@
}
- public void testUpdateTime(){
+ @UiThreadTest
+ public void testUpdateTime() {
+ TimePickerDialog timePickerDialog = buildDialog();
int minute = 18;
- mTimePickerDialog.updateTime(TARGET_HOUR, minute);
+ timePickerDialog.updateTime(TARGET_HOUR, minute);
- //here call onSaveInstanceState is to check the data put by updateTime
- Bundle b = mTimePickerDialog.onSaveInstanceState();
+ // here call onSaveInstanceState is to check the data put by updateTime
+ Bundle b = timePickerDialog.onSaveInstanceState();
assertEquals(TARGET_HOUR, b.getInt(HOUR));
assertEquals(minute, b.getInt(MINUTE));
}
- public void testOnRestoreInstanceState(){
+ @UiThreadTest
+ public void testOnRestoreInstanceState() {
int minute = 27;
Bundle b1 = new Bundle();
b1.putInt(HOUR, TARGET_HOUR);
b1.putInt(MINUTE, minute);
b1.putBoolean(IS_24_HOUR, false);
- mTimePickerDialog.onRestoreInstanceState(b1);
+ TimePickerDialog timePickerDialog = buildDialog();
+ timePickerDialog.onRestoreInstanceState(b1);
//here call onSaveInstanceState is to check the data put by onRestoreInstanceState
- Bundle b2 = mTimePickerDialog.onSaveInstanceState();
+ Bundle b2 = timePickerDialog.onSaveInstanceState();
assertEquals(TARGET_HOUR, b2.getInt(HOUR));
assertEquals(minute, b2.getInt(MINUTE));
@@ -134,6 +140,11 @@
}
private void startDialogActivity(int dialogNumber) {
- mActivity = DialogStubActivity.startDialogActivity(this, dialogNumber);
+ mActivity = DialogCtsActivity.startDialogActivity(this, dialogNumber);
+ }
+
+ private TimePickerDialog buildDialog() {
+ return new TimePickerDialog(
+ mContext, mOnTimeSetListener, TARGET_HOUR, TARGET_MINUTE, true);
}
}
diff --git a/tests/tests/appwidget/src/android/appwidget/cts/AppWidgetTest.java b/tests/tests/appwidget/src/android/appwidget/cts/AppWidgetTest.java
index 654fb0d..5e72a78 100644
--- a/tests/tests/appwidget/src/android/appwidget/cts/AppWidgetTest.java
+++ b/tests/tests/appwidget/src/android/appwidget/cts/AppWidgetTest.java
@@ -40,7 +40,6 @@
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
-import android.content.pm.UserInfo;
import android.cts.appwidget.R;
import android.graphics.drawable.Drawable;
import android.net.Uri;
@@ -136,6 +135,7 @@
public void testBindAppWidget() throws Exception {
// Create a host and start listening.
AppWidgetHost host = new AppWidgetHost(getInstrumentation().getTargetContext(), 0);
+ host.deleteHost();
host.startListening();
// Allocate an app widget id to bind.
@@ -150,7 +150,7 @@
assertFalse(widgetBound);
// Well, app do not have this permission unless explicitly granted
- // by the user. Now we will pretent for the user and grant it.
+ // by the user. Now we will pretend for the user and grant it.
grantBindAppWidgetPermission();
try {
@@ -163,36 +163,28 @@
host.deleteAppWidgetId(appWidgetId);
} finally {
// Clean up.
+ host.deleteAppWidgetId(appWidgetId);
host.deleteHost();
revokeBindAppWidgetPermission();
}
}
public void testAppWidgetProviderCallbacks() throws Exception {
- final AtomicInteger disabledCallCounter = new AtomicInteger();
+ AtomicInteger invocationCounter = new AtomicInteger();
// Set a mock to intercept provider callbacks.
- AppWidgetProviderCallbacks callbacks = mock(AppWidgetProviderCallbacks.class);
- doAnswer(new Answer<Void>() {
- @Override
- public Void answer(InvocationOnMock invocation) throws Throwable {
- synchronized (mLock) {
- disabledCallCounter.incrementAndGet();
- mLock.notifyAll();
- }
- return null;
- }
- }).when(callbacks).onDeleted(any(Context.class), any(int[].class));
+ AppWidgetProviderCallbacks callbacks = createAppWidgetProviderCallbacks(invocationCounter);
FirstAppWidgetProvider.setCallbacks(callbacks);
- final int firstAppWidgetId;
- final int secondAppWidgetId;
+ int firstAppWidgetId = 0;
+ int secondAppWidgetId = 0;
final Bundle firstOptions;
final Bundle secondOptions;
// Create a host and start listening.
AppWidgetHost host = spy(new AppWidgetHost(getInstrumentation().getTargetContext(), 0));
+ host.deleteHost();
host.startListening();
// We want to bind a widget.
@@ -208,6 +200,9 @@
getAppWidgetManager().bindAppWidgetIdIfAllowed(firstAppWidgetId,
provider.getProfile(), provider.provider, null);
+ // Wait for onEnabled and onUpdate
+ waitForCallCount(invocationCounter, 2);
+
// Update the first widget options.
firstOptions = new Bundle();
firstOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH, 1);
@@ -216,6 +211,9 @@
firstOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT, 4);
getAppWidgetManager().updateAppWidgetOptions(firstAppWidgetId, firstOptions);
+ // Wait for onAppWidgetOptionsChanged
+ waitForCallCount(invocationCounter, 3);
+
// Allocate the second app widget id to bind.
secondAppWidgetId = host.allocateAppWidgetId();
@@ -223,6 +221,9 @@
getAppWidgetManager().bindAppWidgetIdIfAllowed(secondAppWidgetId,
provider.getProfile(), provider.provider, null);
+ // Wait for onUpdate
+ waitForCallCount(invocationCounter, 4);
+
// Update the second widget options.
secondOptions = new Bundle();
secondOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH, 5);
@@ -231,13 +232,20 @@
secondOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT, 8);
getAppWidgetManager().updateAppWidgetOptions(secondAppWidgetId, secondOptions);
+ // Wait for onAppWidgetOptionsChanged
+ waitForCallCount(invocationCounter, 5);
+
// Delete the first widget.
host.deleteAppWidgetId(firstAppWidgetId);
+ // Wait for onDeleted
+ waitForCallCount(invocationCounter, 6);
+
// Delete the second widget.
host.deleteAppWidgetId(secondAppWidgetId);
- waitForCallCount(disabledCallCounter, 1);
+ // Wait for onDeleted and onDisabled
+ waitForCallCount(invocationCounter, 8);
// Make sure the provider callbacks are correct.
InOrder inOrder = inOrder(callbacks);
@@ -260,38 +268,34 @@
inOrder.verify(callbacks).onDisabled(any(Context.class));
} finally {
// Clean up.
+ host.deleteAppWidgetId(firstAppWidgetId);
+ host.deleteAppWidgetId(secondAppWidgetId);
+ host.deleteHost();
FirstAppWidgetProvider.setCallbacks(null);
revokeBindAppWidgetPermission();
}
}
public void testTwoAppWidgetProviderCallbacks() throws Exception {
- final AtomicInteger disabledCallCounter = new AtomicInteger();
+ AtomicInteger invocationCounter = new AtomicInteger();
// Set a mock to intercept first provider callbacks.
- AppWidgetProviderCallbacks firstCallbacks = mock(AppWidgetProviderCallbacks.class);
+ AppWidgetProviderCallbacks firstCallbacks = createAppWidgetProviderCallbacks(
+ invocationCounter);
FirstAppWidgetProvider.setCallbacks(firstCallbacks);
// Set a mock to intercept second provider callbacks.
- AppWidgetProviderCallbacks secondCallbacks = mock(AppWidgetProviderCallbacks.class);
- doAnswer(new Answer<Void>() {
- @Override
- public Void answer(InvocationOnMock invocation) throws Throwable {
- synchronized (mLock) {
- disabledCallCounter.incrementAndGet();
- mLock.notifyAll();
- }
- return null;
- }
- }).when(firstCallbacks).onDisabled(any(Context.class));
+ AppWidgetProviderCallbacks secondCallbacks = createAppWidgetProviderCallbacks(
+ invocationCounter);
SecondAppWidgetProvider.setCallbacks(secondCallbacks);
- final int firstAppWidgetId;
- final int secondAppWidgetId;
+ int firstAppWidgetId = 0;
+ int secondAppWidgetId = 0;
// Create a host and start listening.
AppWidgetHost host = spy(new AppWidgetHost(
getInstrumentation().getTargetContext(), 0));
+ host.deleteHost();
host.startListening();
// We want to bind widgets.
@@ -310,6 +314,9 @@
getAppWidgetManager().bindAppWidgetIdIfAllowed(firstAppWidgetId,
firstProvider.getProfile(), firstProvider.provider, null);
+ // Wait for onEnabled and onUpdate
+ waitForCallCount(invocationCounter, 2);
+
// Grab the second provider we defined to be bound.
AppWidgetProviderInfo secondProvider = getSecondAppWidgetProviderInfo();
@@ -317,14 +324,20 @@
getAppWidgetManager().bindAppWidgetIdIfAllowed(secondAppWidgetId,
secondProvider.getProfile(), secondProvider.provider, null);
+ // Wait for onEnabled and onUpdate
+ waitForCallCount(invocationCounter, 4);
+
// Delete the first widget.
host.deleteAppWidgetId(firstAppWidgetId);
+ // Wait for onDeleted and onDisabled
+ waitForCallCount(invocationCounter, 6);
+
// Delete the second widget.
host.deleteAppWidgetId(secondAppWidgetId);
- // Wait for all callbacks to settle.
- waitForCallCount(disabledCallCounter, 1);
+ // Wait for onDeleted and onDisabled
+ waitForCallCount(invocationCounter, 8);
// Make sure the first provider callbacks are correct.
InOrder firstInOrder = inOrder(firstCallbacks);
@@ -345,6 +358,9 @@
secondInOrder.verify(secondCallbacks).onDisabled(any(Context.class));
} finally {
// Clean up.
+ host.deleteAppWidgetId(firstAppWidgetId);
+ host.deleteAppWidgetId(secondAppWidgetId);
+ host.deleteHost();
FirstAppWidgetProvider.setCallbacks(null);
SecondAppWidgetProvider.setCallbacks(null);
revokeBindAppWidgetPermission();
@@ -358,8 +374,12 @@
// Create a host and start listening.
AppWidgetHost host = new AppWidgetHost(
getInstrumentation().getTargetContext(), 0);
+ host.deleteHost();
host.startListening();
+ int firstAppWidgetId = 0;
+ int secondAppWidgetId = 0;
+
try {
// Grab the provider we defined to be bound.
AppWidgetProviderInfo provider = getFirstAppWidgetProviderInfo();
@@ -369,14 +389,14 @@
assertTrue(widgetsIds.length == 0);
// Allocate the first widget id to bind.
- final int firstAppWidgetId = host.allocateAppWidgetId();
+ firstAppWidgetId = host.allocateAppWidgetId();
// Bind the first widget.
getAppWidgetManager().bindAppWidgetIdIfAllowed(firstAppWidgetId,
provider.getProfile(), provider.provider, null);
// Allocate the second widget id to bind.
- final int secondAppWidgetId = host.allocateAppWidgetId();
+ secondAppWidgetId = host.allocateAppWidgetId();
// Bind the second widget.
getAppWidgetManager().bindAppWidgetIdIfAllowed(secondAppWidgetId,
@@ -387,6 +407,8 @@
assertTrue(Arrays.equals(widgetsIds, new int[]{firstAppWidgetId, secondAppWidgetId}));
} finally {
// Clean up.
+ host.deleteAppWidgetId(firstAppWidgetId);
+ host.deleteAppWidgetId(secondAppWidgetId);
host.deleteHost();
revokeBindAppWidgetPermission();
}
@@ -399,11 +421,14 @@
// Create a host and start listening.
AppWidgetHost host = new AppWidgetHost(
getInstrumentation().getTargetContext(), 0);
+ host.deleteHost();
host.startListening();
+ int appWidgetId = 0;
+
try {
// Allocate an widget id to bind.
- final int appWidgetId = host.allocateAppWidgetId();
+ appWidgetId = host.allocateAppWidgetId();
// The widget is not bound, so no info.
AppWidgetProviderInfo foundProvider = getAppWidgetManager()
@@ -435,6 +460,7 @@
assertNotNull(previewImage);
} finally {
// Clean up.
+ host.deleteAppWidgetId(appWidgetId);
host.deleteHost();
revokeBindAppWidgetPermission();
}
@@ -447,14 +473,17 @@
// Create a host and start listening.
AppWidgetHost host = new AppWidgetHost(
getInstrumentation().getTargetContext(), 0);
+ host.deleteHost();
host.startListening();
+ int appWidgetId = 0;
+
try {
// Grab the provider we defined to be bound.
AppWidgetProviderInfo provider = getFirstAppWidgetProviderInfo();
// Allocate an widget id to bind.
- final int appWidgetId = host.allocateAppWidgetId();
+ appWidgetId = host.allocateAppWidgetId();
// Initially we have no options.
Bundle foundOptions = getAppWidgetManager().getAppWidgetOptions(appWidgetId);
@@ -476,6 +505,7 @@
assertTrue(equalOptions(setOptions, foundOptions));
} finally {
// Clean up.
+ host.deleteAppWidgetId(appWidgetId);
host.deleteHost();
revokeBindAppWidgetPermission();
}
@@ -488,11 +518,14 @@
// Create a host and start listening.
AppWidgetHost host = new AppWidgetHost(
getInstrumentation().getTargetContext(), 0);
+ host.deleteHost();
host.startListening();
+ int appWidgetId = 0;
+
try {
// Allocate an widget id to bind.
- final int appWidgetId = host.allocateAppWidgetId();
+ appWidgetId = host.allocateAppWidgetId();
// Grab the provider we defined to be bound.
AppWidgetProviderInfo provider = getFirstAppWidgetProviderInfo();
@@ -513,6 +546,8 @@
assertTrue(widgetIds.length == 0);
} finally {
// Clean up.
+ host.deleteAppWidgetId(appWidgetId);
+ host.deleteHost();
revokeBindAppWidgetPermission();
}
}
@@ -524,26 +559,31 @@
// Create the first host and start listening.
AppWidgetHost firstHost = new AppWidgetHost(
getInstrumentation().getTargetContext(), 0);
+ firstHost.deleteHost();
firstHost.startListening();
// Create the second host and start listening.
AppWidgetHost secondHost = new AppWidgetHost(
getInstrumentation().getTargetContext(), 1);
+ secondHost.deleteHost();
secondHost.startListening();
+ int firstAppWidgetId = 0;
+ int secondAppWidgetId = 0;
+
try {
// Grab the provider we defined to be bound.
AppWidgetProviderInfo provider = getFirstAppWidgetProviderInfo();
// Allocate the first widget id to bind.
- final int firstAppWidgetId = firstHost.allocateAppWidgetId();
+ firstAppWidgetId = firstHost.allocateAppWidgetId();
// Bind the first app widget.
getAppWidgetManager().bindAppWidgetIdIfAllowed(firstAppWidgetId,
provider.getProfile(), provider.provider, null);
// Allocate the second widget id to bind.
- final int secondAppWidgetId = secondHost.allocateAppWidgetId();
+ secondAppWidgetId = secondHost.allocateAppWidgetId();
// Bind the second app widget.
getAppWidgetManager().bindAppWidgetIdIfAllowed(secondAppWidgetId,
@@ -561,6 +601,9 @@
assertTrue(widgetIds.length == 0);
} finally {
// Clean up.
+ firstHost.deleteAppWidgetId(firstAppWidgetId);
+ secondHost.deleteAppWidgetId(secondAppWidgetId);
+ AppWidgetHost.deleteAllHosts();
revokeBindAppWidgetPermission();
}
}
@@ -582,14 +625,17 @@
}
}
};
+ host.deleteHost();
host.startListening();
+ int appWidgetId = 0;
+
try {
// Grab the provider we defined to be bound.
AppWidgetProviderInfo firstLookupProvider = getFirstAppWidgetProviderInfo();
// Allocate a widget id to bind.
- final int appWidgetId = host.allocateAppWidgetId();
+ appWidgetId = host.allocateAppWidgetId();
// Bind the first app widget.
getAppWidgetManager().bindAppWidgetIdIfAllowed(appWidgetId,
@@ -609,7 +655,7 @@
AppWidgetProviderInfo secondLookupProvider = getFirstAppWidgetProviderInfo();
assertNull(secondLookupProvider);
- // Enable the provider we disbaled.
+ // Enable the provider we disabled.
packageManager.setComponentEnabledSetting(firstLookupProvider.provider,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
@@ -618,6 +664,7 @@
waitForCallCount(onProvidersChangedCallCounter, 2);
} finally {
// Clean up.
+ host.deleteAppWidgetId(appWidgetId);
host.deleteHost();
revokeBindAppWidgetPermission();
}
@@ -638,14 +685,18 @@
return new MyAppWidgetHostView(context);
}
};
+ host.deleteHost();
host.startListening();
+ int firstAppWidgetId = 0;
+ int secondAppWidgetId = 0;
+
try {
// Grab the provider to be bound.
AppWidgetProviderInfo provider = getFirstAppWidgetProviderInfo();
// Allocate the first widget id to bind.
- final int firstAppWidgetId = host.allocateAppWidgetId();
+ firstAppWidgetId = host.allocateAppWidgetId();
// Bind the first app widget.
getAppWidgetManager().bindAppWidgetIdIfAllowed(firstAppWidgetId,
@@ -659,7 +710,7 @@
firstHostView.setOnUpdateAppWidgetListener(firstAppHostViewListener);
// Allocate the second widget id to bind.
- final int secondAppWidgetId = host.allocateAppWidgetId();
+ secondAppWidgetId = host.allocateAppWidgetId();
// Bind the second app widget.
getAppWidgetManager().bindAppWidgetIdIfAllowed(secondAppWidgetId,
@@ -702,6 +753,8 @@
provider.provider.getPackageName())));
} finally {
// Clean up.
+ host.deleteAppWidgetId(firstAppWidgetId);
+ host.deleteAppWidgetId(secondAppWidgetId);
host.deleteHost();
revokeBindAppWidgetPermission();
}
@@ -722,14 +775,17 @@
return new MyAppWidgetHostView(context);
}
};
+ host.deleteHost();
host.startListening();
+ int firstAppWidgetId = 0;
+
try {
// Grab the provider to be bound.
AppWidgetProviderInfo provider = getFirstAppWidgetProviderInfo();
// Allocate the first widget id to bind.
- final int firstAppWidgetId = host.allocateAppWidgetId();
+ firstAppWidgetId = host.allocateAppWidgetId();
// Bind the first app widget.
getAppWidgetManager().bindAppWidgetIdIfAllowed(firstAppWidgetId,
@@ -768,6 +824,7 @@
));
} finally {
// Clean up.
+ host.deleteAppWidgetId(firstAppWidgetId);
host.deleteHost();
revokeBindAppWidgetPermission();
}
@@ -788,14 +845,18 @@
return new MyAppWidgetHostView(context);
}
};
+ host.deleteHost();
host.startListening();
+ int firstAppWidgetId = 0;
+ int secondAppWidgetId = 0;
+
try {
// Grab the provider to be bound.
AppWidgetProviderInfo provider = getFirstAppWidgetProviderInfo();
// Allocate the first widget id to bind.
- final int firstAppWidgetId = host.allocateAppWidgetId();
+ firstAppWidgetId = host.allocateAppWidgetId();
// Bind the first app widget.
getAppWidgetManager().bindAppWidgetIdIfAllowed(firstAppWidgetId,
@@ -809,7 +870,7 @@
firstHostView.setOnUpdateAppWidgetListener(firstAppHostViewListener);
// Allocate the second widget id to bind.
- final int secondAppWidgetId = host.allocateAppWidgetId();
+ secondAppWidgetId = host.allocateAppWidgetId();
// Bind the second app widget.
getAppWidgetManager().bindAppWidgetIdIfAllowed(secondAppWidgetId,
@@ -854,6 +915,8 @@
);
} finally {
// Clean up.
+ host.deleteAppWidgetId(firstAppWidgetId);
+ host.deleteAppWidgetId(secondAppWidgetId);
host.deleteHost();
revokeBindAppWidgetPermission();
}
@@ -874,15 +937,17 @@
return new MyAppWidgetHostView(context);
}
};
-
+ host.deleteHost();
host.startListening();
+ int firstAppWidgetId = 0;
+
try {
// Grab the provider to be bound.
AppWidgetProviderInfo provider = getFirstAppWidgetProviderInfo();
// Allocate the first widget id to bind.
- final int firstAppWidgetId = host.allocateAppWidgetId();
+ firstAppWidgetId = host.allocateAppWidgetId();
// Bind the first app widget.
getAppWidgetManager().bindAppWidgetIdIfAllowed(firstAppWidgetId,
@@ -913,7 +978,7 @@
waitForCallCount(updateAppWidgetCallCount, 1);
- // Partially update the content for all app widgets (pretent we changed somehting).
+ // Partially update the content for all app widgets (pretend we changed something).
getAppWidgetManager().partiallyUpdateAppWidget(firstAppWidgetId, content);
waitForCallCount(updateAppWidgetCallCount, 2);
@@ -925,6 +990,7 @@
provider.provider.getPackageName())));
} finally {
// Clean up.
+ host.deleteAppWidgetId(firstAppWidgetId);
host.deleteHost();
revokeBindAppWidgetPermission();
}
@@ -946,14 +1012,18 @@
return new MyAppWidgetHostView(context);
}
};
+ host.deleteHost();
host.startListening();
+ int firstAppWidgetId = 0;
+ int secondAppWidgetId = 0;
+
try {
// Grab the provider to be bound.
AppWidgetProviderInfo provider = getFirstAppWidgetProviderInfo();
// Allocate the first widget id to bind.
- final int firstAppWidgetId = host.allocateAppWidgetId();
+ firstAppWidgetId = host.allocateAppWidgetId();
// Bind the first app widget.
getAppWidgetManager().bindAppWidgetIdIfAllowed(firstAppWidgetId,
@@ -977,7 +1047,7 @@
firstHostView.setOnUpdateAppWidgetListener(firstAppHostViewListener);
// Allocate the second widget id to bind.
- final int secondAppWidgetId = host.allocateAppWidgetId();
+ secondAppWidgetId = host.allocateAppWidgetId();
// Bind the second app widget.
getAppWidgetManager().bindAppWidgetIdIfAllowed(secondAppWidgetId,
@@ -1010,7 +1080,7 @@
waitForCallCount(firstAppWidgetCallCounter, 1);
waitForCallCount(secondAppWidgetCallCounter, 1);
- // Partially update the content for all app widgets (pretend we changed somehting).
+ // Partially update the content for all app widgets (pretend we changed something).
getAppWidgetManager().partiallyUpdateAppWidget(new int[] {firstAppWidgetId,
secondAppWidgetId}, content);
@@ -1029,6 +1099,8 @@
provider.provider.getPackageName())));
} finally {
// Clean up.
+ host.deleteAppWidgetId(firstAppWidgetId);
+ host.deleteAppWidgetId(secondAppWidgetId);
host.deleteHost();
revokeBindAppWidgetPermission();
}
@@ -1038,16 +1110,20 @@
// We want to bind widgets.
grantBindAppWidgetPermission();
- final AtomicInteger getViewCounter = new AtomicInteger();
+ final AtomicInteger invocationCounter = new AtomicInteger();
final Context context = getInstrumentation().getTargetContext();
// Create a host and start listening.
- AppWidgetHost host = new AppWidgetHost(context, 0);
+ final AppWidgetHost host = new AppWidgetHost(context, 0);
+ host.deleteHost();
host.startListening();
+ final int appWidgetId;
+
try {
// Configure the provider behavior.
- AppWidgetProviderCallbacks callbacks = mock(AppWidgetProviderCallbacks.class);
+ AppWidgetProviderCallbacks callbacks = createAppWidgetProviderCallbacks(
+ invocationCounter);
doAnswer(new Answer<Void>() {
@Override
public Void answer(InvocationOnMock invocation) throws Throwable {
@@ -1063,6 +1139,11 @@
getAppWidgetManager().updateAppWidget(appWidgetId, removeViews);
+ synchronized (mLock) {
+ invocationCounter.incrementAndGet();
+ mLock.notifyAll();
+ }
+
return null;
}
}).when(callbacks).onUpdate(any(Context.class), any(AppWidgetManager.class),
@@ -1070,15 +1151,18 @@
FirstAppWidgetProvider.setCallbacks(callbacks);
// Grab the provider to be bound.
- AppWidgetProviderInfo provider = getFirstAppWidgetProviderInfo();
+ final AppWidgetProviderInfo provider = getFirstAppWidgetProviderInfo();
// Allocate a widget id to bind.
- final int appWidgetId = host.allocateAppWidgetId();
+ appWidgetId = host.allocateAppWidgetId();
// Bind the app widget.
getAppWidgetManager().bindAppWidgetIdIfAllowed(appWidgetId,
provider.getProfile(), provider.provider, null);
+ // Wait for onEnabled and onUpdate
+ waitForCallCount(invocationCounter, 2);
+
// Configure the app widget service behavior.
RemoteViewsFactory factory = mock(RemoteViewsFactory.class);
doAnswer(new Answer<Integer>() {
@@ -1094,7 +1178,7 @@
R.layout.collection_widget_item_layout);
remoteViews.setTextViewText(R.id.text_view, context.getText(R.string.foo));
synchronized (mLock) {
- getViewCounter.incrementAndGet();
+ invocationCounter.incrementAndGet();
}
return remoteViews;
}
@@ -1107,10 +1191,15 @@
}).when(factory).getViewTypeCount();
MyAppWidgetService.setFactory(factory);
- host.createView(context, appWidgetId, provider);
+ getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ host.createView(context, appWidgetId, provider);
+ }
+ });
// Wait for the interactions to occur.
- waitForCallCount(getViewCounter, 1);
+ waitForCallCount(invocationCounter, 3);
// Verify the interactions.
verify(factory, atLeastOnce()).hasStableIds();
@@ -1133,7 +1222,7 @@
final long elapsedTimeMillis = SystemClock.uptimeMillis() - startTimeMillis;
final long remainingTimeMillis = OPERATION_TIMEOUT - elapsedTimeMillis;
if (remainingTimeMillis <= 0) {
- fail("Did not get expected call to onUpdateAppWidget");
+ fail("Did not get expected call");
}
try {
mLock.wait(remainingTimeMillis);
@@ -1289,15 +1378,98 @@
.getSystemService(Context.APPWIDGET_SERVICE);
}
+ private AppWidgetProviderCallbacks createAppWidgetProviderCallbacks(
+ final AtomicInteger callCounter) {
+ // Set a mock to intercept provider callbacks.
+ AppWidgetProviderCallbacks callbacks = mock(AppWidgetProviderCallbacks.class);
+
+ // onEnabled
+ doAnswer(new Answer<Void>() {
+ @Override
+ public Void answer(InvocationOnMock invocation) throws Throwable {
+ synchronized (mLock) {
+ callCounter.incrementAndGet();
+ mLock.notifyAll();
+ }
+ return null;
+ }
+ }).when(callbacks).onEnabled(any(Context.class));
+
+ // onUpdate
+ doAnswer(new Answer<Void>() {
+ @Override
+ public Void answer(InvocationOnMock invocation) throws Throwable {
+ synchronized (mLock) {
+ callCounter.incrementAndGet();
+ mLock.notifyAll();
+ }
+ return null;
+ }
+ }).when(callbacks).onUpdate(any(Context.class), any(AppWidgetManager.class),
+ any(int[].class));
+
+ // onAppWidgetOptionsChanged
+ doAnswer(new Answer<Void>() {
+ @Override
+ public Void answer(InvocationOnMock invocation) throws Throwable {
+ synchronized (mLock) {
+ callCounter.incrementAndGet();
+ mLock.notifyAll();
+ }
+ return null;
+ }
+ }).when(callbacks).onAppWidgetOptionsChanged(any(Context.class),
+ any(AppWidgetManager.class), any(int.class), any(Bundle.class));
+
+ // onDeleted
+ doAnswer(new Answer<Void>() {
+ @Override
+ public Void answer(InvocationOnMock invocation) throws Throwable {
+ synchronized (mLock) {
+ callCounter.incrementAndGet();
+ mLock.notifyAll();
+ }
+ return null;
+ }
+ }).when(callbacks).onDeleted(any(Context.class), any(int[].class));
+
+ // onDisabled
+ doAnswer(new Answer<Void>() {
+ @Override
+ public Void answer(InvocationOnMock invocation) throws Throwable {
+ synchronized (mLock) {
+ callCounter.incrementAndGet();
+ mLock.notifyAll();
+ }
+ return null;
+ }
+ }).when(callbacks).onDisabled(any(Context.class));
+
+ // onRestored
+ doAnswer(new Answer<Void>() {
+ @Override
+ public Void answer(InvocationOnMock invocation) throws Throwable {
+ synchronized (mLock) {
+ callCounter.incrementAndGet();
+ mLock.notifyAll();
+ }
+ return null;
+ }
+ }).when(callbacks).onRestored(any(Context.class), any(int[].class),
+ any(int[].class));
+
+ return callbacks;
+ }
+
private static boolean equalOptions(Bundle first, Bundle second) {
return first.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH)
== second.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH)
&& first.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT)
== second.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT)
&& first.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH)
- == second.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH)
+ == second.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH)
&& first.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT)
- == second.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT);
+ == second.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT);
}
private static final class OptionsMatcher extends BaseMatcher<Bundle> {
diff --git a/tests/tests/content/Android.mk b/tests/tests/content/Android.mk
index 6f883b6..2c185d9 100644
--- a/tests/tests/content/Android.mk
+++ b/tests/tests/content/Android.mk
@@ -23,12 +23,15 @@
LOCAL_JAVA_LIBRARIES := android.test.runner
-LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
+LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner
+
+# Resource unit tests use a private locale and some densities
+LOCAL_AAPT_FLAGS = -c xx_YY -c cs -c small -c normal -c large -c xlarge \
+ -c 320dpi -c 240dpi -c 160dpi -c 32dpi \
+ -c kok,kok_IN,kok_419,kok_419_VARIANT,kok_Knda_419,kok_Knda_419_VARIANT,kok_VARIANT,kok_Knda,tgl,tgl_PH
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := CtsContentTestCases
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
-
include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/content/AndroidManifest.xml b/tests/tests/content/AndroidManifest.xml
index 8d57e49..b3de29f 100644
--- a/tests/tests/content/AndroidManifest.xml
+++ b/tests/tests/content/AndroidManifest.xml
@@ -18,9 +18,53 @@
package="com.android.cts.content">
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+ <!-- content sync tests -->
+ <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
+ <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
+ <uses-permission android:name="android.permission.GET_ACCOUNTS" />
+ <uses-permission android:name="android.permission.USE_CREDENTIALS" />
+ <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
+ <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
+ <uses-permission android:name="android.permission.READ_SYNC_STATS" />
+ <uses-permission android:name="android.permission.WRITE_SETTINGS" />
+ <uses-permission android:name="android.permission.SET_WALLPAPER" />
+ <uses-permission android:name="android.permission.BROADCAST_STICKY" />
+ <uses-permission android:name="android.content.cts.permission.TEST_GRANTED" />
- <application>
- <activity android:name="android.app.cts.MockActivity">
+ <!-- Used for PackageManager test, don't delete this INTERNET permission -->
+ <uses-permission android:name="android.permission.INTERNET" />
+
+ <!-- Used for PackageManager test, don't delete this permission-tree -->
+ <permission-tree android:name="com.android.cts.content.permission.TEST_DYNAMIC"
+ android:label="Test Tree"/>
+
+ <!-- Used for PackageManager test, don't delete this permission-group -->
+ <permission-group android:name="android.permission-group.COST_MONEY"/>
+ <!-- Used for PackageManager test, don't delete! -->
+ <uses-configuration/>
+ <uses-feature android:name="android.hardware.camera" />
+ <uses-feature android:glEsVersion="0x00020000" />
+ <feature-group/>
+ <feature-group>
+ <uses-feature android:glEsVersion="0x00030000" />
+ <uses-feature android:name="android.hardware.location" />
+ </feature-group>
+ <feature-group>
+ <uses-feature android:glEsVersion="0x00010001" />
+ <uses-feature android:name="android.hardware.camera" />
+ </feature-group>
+
+ <application android:label="Android TestCase"
+ android:icon="@drawable/size_48x48"
+ android:maxRecents="1"
+ android:multiArch="true"
+ android:name="android.content.cts.MockApplication"
+ android:supportsRtl="true">
+ <activity android:name="android.content.cts.MockActivity">
+ <meta-data android:name="android.app.alias"
+ android:resource="@xml/alias" />
+ <meta-data android:name="android.app.intent.filter"
+ android:resource="@xml/intentfilter" />
<intent-filter>
<action android:name="com.android.cts.content.action.TEST_ACTION" />
<category android:name="android.intent.category.DEFAULT" />
@@ -28,8 +72,8 @@
</intent-filter>
</activity>
- <activity-alias android:name="android.app.cts.MockActivity2"
- android:targetActivity="android.app.cts.MockActivity">
+ <activity-alias android:name="android.content.cts.MockActivity2"
+ android:targetActivity="android.content.cts.MockActivity">
<intent-filter>
<action android:name="com.android.cts.content.action.TEST_ACTION" />
<category android:name="android.intent.category.DEFAULT" />
@@ -37,13 +81,114 @@
</activity-alias>
<uses-library android:name="android.test.runner" />
+
+ <service android:name="android.content.cts.MockContextWrapperService" />
+ <activity android:name=".content.ContextWrapperCtsActivity"
+ android:label="ContextWrapperCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ </intent-filter>
+ </activity>
+
+ <receiver android:name="android.content.cts.MockReceiverFirst">
+ <intent-filter android:priority="3">
+ <action android:name="android.content.cts.BroadcastReceiverTest.BROADCAST_TESTABORT" />
+ </intent-filter>
+ </receiver>
+ <receiver android:name="android.content.cts.MockReceiverAbort">
+ <intent-filter android:priority="2">
+ <action android:name="android.content.cts.BroadcastReceiverTest.BROADCAST_TESTABORT" />
+ </intent-filter>
+ </receiver>
+ <receiver android:name="android.content.cts.MockReceiver">
+ <intent-filter android:priority="1">
+ <action android:name="android.content.cts.BroadcastReceiverTest.BROADCAST_MOCKTEST" />
+ <action android:name="android.content.cts.BroadcastReceiverTest.BROADCAST_TESTABORT" />
+ <action android:name="android.content.cts.ContextWrapperTest.BROADCAST_TESTORDER" />
+ </intent-filter>
+ </receiver>
+
+ <activity android:name="android.content.cts.AvailableIntentsActivity"
+ android:label="AvailableIntentsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <!--Test for PackageManager-->
+ <activity android:name="android.content.pm.cts.TestPmActivity"
+ android:icon="@drawable/start">
+ <intent-filter>
+ <action android:name="android.intent.action.PMTEST" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ <meta-data android:name="android.content.pm.cts.xmltest" android:resource="@xml/pm_test" />
+ </activity>
+ <activity android:name="android.content.pm.cts.TestPmCompare">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.INFO" />
+ </intent-filter>
+ </activity>
+ <!--Test for PackageManager-->
+ <service android:name="android.content.pm.cts.TestPmService">
+ <intent-filter>
+ <action android:name="android.content.pm.cts.activity.PMTEST_SERVICE" />
+ </intent-filter>
+ </service>
+ <!--Test for PackageManager-->
+ <receiver android:name="android.content.pm.cts.PmTestReceiver">
+ <intent-filter>
+ <action android:name="android.content.pm.cts.PackageManagerTest.PMTEST_RECEIVER" />
+ </intent-filter>
+ </receiver>
+
+ <!-- Used for PackageManager test, don't delete this MockContentProvider provider -->
+ <provider android:name="android.content.cts.MockContentProvider" android:authorities="ctstest"
+ android:multiprocess="false" />
+ <provider android:name="android.content.cts.DummyProvider"
+ android:authorities="android.content.cts.dummyprovider"
+ android:multiprocess="true" />
+ <provider android:name="android.content.cts.MockRemoteContentProvider"
+ android:authorities="remotectstest"
+ android:process=":remoteprovider" android:multiprocess="false" />
+
+ <service android:name="android.content.cts.MockService" />
+
+ <service android:name="android.content.cts.MockSyncAdapterService" android:exported="true">
+ <intent-filter>
+ <action android:name="android.content.SyncAdapter" />
+ </intent-filter>
+
+ <meta-data android:name="android.content.SyncAdapter"
+ android:resource="@xml/syncadapter" />
+ </service>
+
+ <service android:name="android.content.cts.MockAccountService" android:exported="true"
+ >
+ <intent-filter>
+ <action android:name="android.accounts.AccountAuthenticator" />
+ </intent-filter>
+
+ <meta-data android:name="android.accounts.AccountAuthenticator"
+ android:resource="@xml/authenticator" />
+ </service>
+
+ <activity android:name="android.content.cts.ClipboardManagerListenerActivity"/>
+
</application>
<instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
- android:targetPackage="com.android.cts.stub"
+ android:targetPackage="com.android.cts.content"
android:label="CTS tests of android.content">
<meta-data android:name="listener"
android:value="com.android.cts.runner.CtsTestRunListener" />
</instrumentation>
+
+ <!--Test for PackageManager, please put this at the very beginning-->
+ <instrumentation android:name="android.content.pm.cts.TestPmInstrumentation"
+ android:targetPackage="android"
+ android:label="PackageManager Instrumentation Test" />
</manifest>
diff --git a/tests/assets/text.txt b/tests/tests/content/assets/text.txt
similarity index 100%
rename from tests/assets/text.txt
rename to tests/tests/content/assets/text.txt
diff --git a/tests/src/android/widget/cts/ViewFlipperStubActivity.java b/tests/tests/content/res/anim/anim_rotate.xml
similarity index 62%
copy from tests/src/android/widget/cts/ViewFlipperStubActivity.java
copy to tests/tests/content/res/anim/anim_rotate.xml
index 2ac331e..4fbadcf 100644
--- a/tests/src/android/widget/cts/ViewFlipperStubActivity.java
+++ b/tests/tests/content/res/anim/anim_rotate.xml
@@ -1,4 +1,5 @@
-/*
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -12,21 +13,13 @@
* 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.widget.cts;
-
-import com.android.cts.stub.R;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class ViewFlipperStubActivity extends Activity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- setContentView(R.layout.viewflipper_layout);
- }
-}
-
+<rotate xmlns:android="http://schemas.android.com/apk/res/android"
+ android:interpolator="@android:anim/decelerate_interpolator"
+ android:fromDegrees="0"
+ android:toDegrees="-45"
+ android:toYScale="0.0"
+ android:pivotX="50%"
+ android:pivotY="50%"
+ android:duration="700" />
diff --git a/tests/tests/content/res/color/color1.xml b/tests/tests/content/res/color/color1.xml
new file mode 100755
index 0000000..87034fa
--- /dev/null
+++ b/tests/tests/content/res/color/color1.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_focused="true" android:color="@color/testcolor1"/>
+ <item android:color="@color/testcolor2"/>
+</selector>
diff --git a/tests/tests/content/res/drawable/ic_cts_minitab_selected.png b/tests/tests/content/res/drawable/ic_cts_minitab_selected.png
new file mode 100644
index 0000000..c730050
--- /dev/null
+++ b/tests/tests/content/res/drawable/ic_cts_minitab_selected.png
Binary files differ
diff --git a/tests/tests/content/res/drawable/ic_cts_selected.png b/tests/tests/content/res/drawable/ic_cts_selected.png
new file mode 100644
index 0000000..72a065c
--- /dev/null
+++ b/tests/tests/content/res/drawable/ic_cts_selected.png
Binary files differ
diff --git a/tests/tests/content/res/drawable/icon_black.jpg b/tests/tests/content/res/drawable/icon_black.jpg
new file mode 100644
index 0000000..4c9062a
--- /dev/null
+++ b/tests/tests/content/res/drawable/icon_black.jpg
Binary files differ
diff --git a/tests/tests/content/res/drawable/ninepatch_0.9.png b/tests/tests/content/res/drawable/ninepatch_0.9.png
new file mode 100644
index 0000000..24019d8
--- /dev/null
+++ b/tests/tests/content/res/drawable/ninepatch_0.9.png
Binary files differ
diff --git a/tests/tests/content/res/drawable/ninepatch_1.9.png b/tests/tests/content/res/drawable/ninepatch_1.9.png
new file mode 100644
index 0000000..c56b1db
--- /dev/null
+++ b/tests/tests/content/res/drawable/ninepatch_1.9.png
Binary files differ
diff --git a/tests/tests/content/res/drawable/pass.jpg b/tests/tests/content/res/drawable/pass.jpg
new file mode 100644
index 0000000..2f4b083
--- /dev/null
+++ b/tests/tests/content/res/drawable/pass.jpg
Binary files differ
diff --git a/tests/tests/content/res/drawable/scenery.jpg b/tests/tests/content/res/drawable/scenery.jpg
new file mode 100644
index 0000000..7a6145b
--- /dev/null
+++ b/tests/tests/content/res/drawable/scenery.jpg
Binary files differ
diff --git a/tests/tests/content/res/drawable/size_48x48.jpg b/tests/tests/content/res/drawable/size_48x48.jpg
new file mode 100644
index 0000000..5c2291e
--- /dev/null
+++ b/tests/tests/content/res/drawable/size_48x48.jpg
Binary files differ
diff --git a/tests/tests/content/res/drawable/start.jpg b/tests/tests/content/res/drawable/start.jpg
new file mode 100644
index 0000000..54e05e0
--- /dev/null
+++ b/tests/tests/content/res/drawable/start.jpg
Binary files differ
diff --git a/tests/tests/content/res/drawable/testcolor.xml b/tests/tests/content/res/drawable/testcolor.xml
new file mode 100644
index 0000000..d7b2718
--- /dev/null
+++ b/tests/tests/content/res/drawable/testcolor.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+ * Copyright (C) 2008 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.
+ */
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:color="#FFA6C839"/>
+</selector>
+
diff --git a/tests/tests/content/res/drawable/testimage.jpg b/tests/tests/content/res/drawable/testimage.jpg
new file mode 100644
index 0000000..754df0c
--- /dev/null
+++ b/tests/tests/content/res/drawable/testimage.jpg
Binary files differ
diff --git a/tests/tests/content/res/layout/abslistview_layout.xml b/tests/tests/content/res/layout/abslistview_layout.xml
new file mode 100644
index 0000000..a090ce3
--- /dev/null
+++ b/tests/tests/content/res/layout/abslistview_layout.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<ViewGroup_Layout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/abslistview_root"
+ android:layout_width="25px"
+ android:layout_height="25px" >
+
+ <GridView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+
+ <ListView>
+ <TextView
+ android:text="@string/table_layout_first"
+ android:padding="3dip" />
+ <TextView
+ android:text="@string/table_layout_second"
+ android:padding="3dip" />
+ <TextView
+ android:text="@string/table_layout_third"
+ android:padding="3dip" />
+ </ListView>
+</ViewGroup_Layout>
+
diff --git a/tests/tests/content/res/layout/available_intents_layout.xml b/tests/tests/content/res/layout/available_intents_layout.xml
new file mode 100644
index 0000000..5415657
--- /dev/null
+++ b/tests/tests/content/res/layout/available_intents_layout.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 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.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <TextView android:id="@+id/text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingLeft="4dip"
+ android:focusable="true"
+ android:focusableInTouchMode="true"
+ android:text="@string/text_view_hello"/>
+
+</LinearLayout>
diff --git a/tests/tests/content/res/layout/context_layout.xml b/tests/tests/content/res/layout/context_layout.xml
new file mode 100644
index 0000000..6ec6c76
--- /dev/null
+++ b/tests/tests/content/res/layout/context_layout.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<RelativeLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ <DatePicker
+ android:id="@+id/contextdatepicker_dp"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_centerInParent="true" />
+
+</RelativeLayout>
diff --git a/tests/tests/content/res/layout/local_sample.xml b/tests/tests/content/res/layout/local_sample.xml
new file mode 100644
index 0000000..6f02e78
--- /dev/null
+++ b/tests/tests/content/res/layout/local_sample.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 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.
+ -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:padding="4dip"
+ android:gravity="center_horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="0"
+ android:paddingBottom="4dip"
+ android:text="@string/text"/>
+
+ <Button android:id="@+id/go"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/text">
+ <requestFocus />
+ </Button>
+
+</LinearLayout>
+
diff --git a/tests/tests/content/res/raw/testimage.jpg b/tests/tests/content/res/raw/testimage.jpg
new file mode 100644
index 0000000..d3dae03
--- /dev/null
+++ b/tests/tests/content/res/raw/testimage.jpg
Binary files differ
diff --git a/tests/tests/content/res/raw/testmp3.mp3 b/tests/tests/content/res/raw/testmp3.mp3
new file mode 100755
index 0000000..657faf7
--- /dev/null
+++ b/tests/tests/content/res/raw/testmp3.mp3
Binary files differ
diff --git a/tests/assets/text.txt b/tests/tests/content/res/raw/text.txt
similarity index 100%
copy from tests/assets/text.txt
copy to tests/tests/content/res/raw/text.txt
diff --git a/tests/res/values-12key-63x57/configVarying.xml b/tests/tests/content/res/values-12key-63x57/configVarying.xml
similarity index 100%
rename from tests/res/values-12key-63x57/configVarying.xml
rename to tests/tests/content/res/values-12key-63x57/configVarying.xml
diff --git a/tests/res/values-12key-dpad/configVarying.xml b/tests/tests/content/res/values-12key-dpad/configVarying.xml
similarity index 100%
rename from tests/res/values-12key-dpad/configVarying.xml
rename to tests/tests/content/res/values-12key-dpad/configVarying.xml
diff --git a/tests/res/values-12key/configVarying.xml b/tests/tests/content/res/values-12key/configVarying.xml
similarity index 100%
rename from tests/res/values-12key/configVarying.xml
rename to tests/tests/content/res/values-12key/configVarying.xml
diff --git a/tests/res/values-240dpi/configVarying.xml b/tests/tests/content/res/values-240dpi/configVarying.xml
similarity index 100%
rename from tests/res/values-240dpi/configVarying.xml
rename to tests/tests/content/res/values-240dpi/configVarying.xml
diff --git a/tests/res/values-32dpi-keysexposed/configVarying.xml b/tests/tests/content/res/values-32dpi-keysexposed/configVarying.xml
similarity index 100%
rename from tests/res/values-32dpi-keysexposed/configVarying.xml
rename to tests/tests/content/res/values-32dpi-keysexposed/configVarying.xml
diff --git a/tests/res/values-32dpi-stylus/configVarying.xml b/tests/tests/content/res/values-32dpi-stylus/configVarying.xml
similarity index 100%
rename from tests/res/values-32dpi-stylus/configVarying.xml
rename to tests/tests/content/res/values-32dpi-stylus/configVarying.xml
diff --git a/tests/res/values-32dpi/configVarying.xml b/tests/tests/content/res/values-32dpi/configVarying.xml
similarity index 100%
rename from tests/res/values-32dpi/configVarying.xml
rename to tests/tests/content/res/values-32dpi/configVarying.xml
diff --git a/tests/res/values-480x320/configVarying.xml b/tests/tests/content/res/values-480x320/configVarying.xml
similarity index 100%
rename from tests/res/values-480x320/configVarying.xml
rename to tests/tests/content/res/values-480x320/configVarying.xml
diff --git a/tests/res/values-640x400/configVarying.xml b/tests/tests/content/res/values-640x400/configVarying.xml
similarity index 100%
rename from tests/res/values-640x400/configVarying.xml
rename to tests/tests/content/res/values-640x400/configVarying.xml
diff --git a/tests/res/values-b+kok+419+VARIANT/configVarying.xml b/tests/tests/content/res/values-b+kok+419+VARIANT/configVarying.xml
similarity index 100%
rename from tests/res/values-b+kok+419+VARIANT/configVarying.xml
rename to tests/tests/content/res/values-b+kok+419+VARIANT/configVarying.xml
diff --git a/tests/res/values-b+kok+419/configVarying.xml b/tests/tests/content/res/values-b+kok+419/configVarying.xml
similarity index 100%
rename from tests/res/values-b+kok+419/configVarying.xml
rename to tests/tests/content/res/values-b+kok+419/configVarying.xml
diff --git a/tests/res/values-b+kok+IN/configVarying.xml b/tests/tests/content/res/values-b+kok+IN/configVarying.xml
similarity index 100%
rename from tests/res/values-b+kok+IN/configVarying.xml
rename to tests/tests/content/res/values-b+kok+IN/configVarying.xml
diff --git a/tests/res/values-b+kok+Knda+419+VARIANT/configVarying.xml b/tests/tests/content/res/values-b+kok+Knda+419+VARIANT/configVarying.xml
similarity index 100%
rename from tests/res/values-b+kok+Knda+419+VARIANT/configVarying.xml
rename to tests/tests/content/res/values-b+kok+Knda+419+VARIANT/configVarying.xml
diff --git a/tests/res/values-b+kok+Knda+419/configVarying.xml b/tests/tests/content/res/values-b+kok+Knda+419/configVarying.xml
similarity index 100%
rename from tests/res/values-b+kok+Knda+419/configVarying.xml
rename to tests/tests/content/res/values-b+kok+Knda+419/configVarying.xml
diff --git a/tests/res/values-b+kok+Knda/configVarying.xml b/tests/tests/content/res/values-b+kok+Knda/configVarying.xml
similarity index 100%
rename from tests/res/values-b+kok+Knda/configVarying.xml
rename to tests/tests/content/res/values-b+kok+Knda/configVarying.xml
diff --git a/tests/res/values-b+kok+VARIANT/configVarying.xml b/tests/tests/content/res/values-b+kok+VARIANT/configVarying.xml
similarity index 100%
rename from tests/res/values-b+kok+VARIANT/configVarying.xml
rename to tests/tests/content/res/values-b+kok+VARIANT/configVarying.xml
diff --git a/tests/res/values-b+kok/configVarying.xml b/tests/tests/content/res/values-b+kok/configVarying.xml
similarity index 100%
rename from tests/res/values-b+kok/configVarying.xml
rename to tests/tests/content/res/values-b+kok/configVarying.xml
diff --git a/tests/res/values-b+tgl+PH/configVarying.xml b/tests/tests/content/res/values-b+tgl+PH/configVarying.xml
similarity index 100%
rename from tests/res/values-b+tgl+PH/configVarying.xml
rename to tests/tests/content/res/values-b+tgl+PH/configVarying.xml
diff --git a/tests/res/values-b+tgl/configVarying.xml b/tests/tests/content/res/values-b+tgl/configVarying.xml
similarity index 100%
rename from tests/res/values-b+tgl/configVarying.xml
rename to tests/tests/content/res/values-b+tgl/configVarying.xml
diff --git a/tests/res/values-cs/strings.xml b/tests/tests/content/res/values-cs/strings.xml
similarity index 100%
rename from tests/res/values-cs/strings.xml
rename to tests/tests/content/res/values-cs/strings.xml
diff --git a/tests/res/values-dpad-63x57/configVarying.xml b/tests/tests/content/res/values-dpad-63x57/configVarying.xml
similarity index 100%
rename from tests/res/values-dpad-63x57/configVarying.xml
rename to tests/tests/content/res/values-dpad-63x57/configVarying.xml
diff --git a/tests/res/values-dpad/configVarying.xml b/tests/tests/content/res/values-dpad/configVarying.xml
similarity index 100%
rename from tests/res/values-dpad/configVarying.xml
rename to tests/tests/content/res/values-dpad/configVarying.xml
diff --git a/tests/res/values-fr-rFR/configVarying.xml b/tests/tests/content/res/values-fr-rFR/configVarying.xml
similarity index 100%
rename from tests/res/values-fr-rFR/configVarying.xml
rename to tests/tests/content/res/values-fr-rFR/configVarying.xml
diff --git a/tests/res/values-fr/configVarying.xml b/tests/tests/content/res/values-fr/configVarying.xml
similarity index 100%
rename from tests/res/values-fr/configVarying.xml
rename to tests/tests/content/res/values-fr/configVarying.xml
diff --git a/tests/res/values-h550dp/configVarying.xml b/tests/tests/content/res/values-h550dp/configVarying.xml
similarity index 100%
rename from tests/res/values-h550dp/configVarying.xml
rename to tests/tests/content/res/values-h550dp/configVarying.xml
diff --git a/tests/res/values-h670dp/configVarying.xml b/tests/tests/content/res/values-h670dp/configVarying.xml
similarity index 100%
rename from tests/res/values-h670dp/configVarying.xml
rename to tests/tests/content/res/values-h670dp/configVarying.xml
diff --git a/tests/res/values-keysexposed-12key/configVarying.xml b/tests/tests/content/res/values-keysexposed-12key/configVarying.xml
similarity index 100%
rename from tests/res/values-keysexposed-12key/configVarying.xml
rename to tests/tests/content/res/values-keysexposed-12key/configVarying.xml
diff --git a/tests/res/values-keysexposed-dpad/configVarying.xml b/tests/tests/content/res/values-keysexposed-dpad/configVarying.xml
similarity index 100%
rename from tests/res/values-keysexposed-dpad/configVarying.xml
rename to tests/tests/content/res/values-keysexposed-dpad/configVarying.xml
diff --git a/tests/res/values-keysexposed/configVarying.xml b/tests/tests/content/res/values-keysexposed/configVarying.xml
similarity index 100%
rename from tests/res/values-keysexposed/configVarying.xml
rename to tests/tests/content/res/values-keysexposed/configVarying.xml
diff --git a/tests/res/values-land/configVarying.xml b/tests/tests/content/res/values-land/configVarying.xml
similarity index 100%
rename from tests/res/values-land/configVarying.xml
rename to tests/tests/content/res/values-land/configVarying.xml
diff --git a/tests/res/values-land/dimens.xml b/tests/tests/content/res/values-land/dimens.xml
similarity index 100%
rename from tests/res/values-land/dimens.xml
rename to tests/tests/content/res/values-land/dimens.xml
diff --git a/tests/res/values-large/configVarying.xml b/tests/tests/content/res/values-large/configVarying.xml
similarity index 100%
rename from tests/res/values-large/configVarying.xml
rename to tests/tests/content/res/values-large/configVarying.xml
diff --git a/tests/res/values-mcc110-xx/configVarying.xml b/tests/tests/content/res/values-mcc110-xx/configVarying.xml
similarity index 100%
rename from tests/res/values-mcc110-xx/configVarying.xml
rename to tests/tests/content/res/values-mcc110-xx/configVarying.xml
diff --git a/tests/res/values-mcc111-mnc222/configVarying.xml b/tests/tests/content/res/values-mcc111-mnc222/configVarying.xml
similarity index 100%
rename from tests/res/values-mcc111-mnc222/configVarying.xml
rename to tests/tests/content/res/values-mcc111-mnc222/configVarying.xml
diff --git a/tests/res/values-mcc111-xx-rYY/configVarying.xml b/tests/tests/content/res/values-mcc111-xx-rYY/configVarying.xml
similarity index 100%
rename from tests/res/values-mcc111-xx-rYY/configVarying.xml
rename to tests/tests/content/res/values-mcc111-xx-rYY/configVarying.xml
diff --git a/tests/res/values-mcc111-xx/configVarying.xml b/tests/tests/content/res/values-mcc111-xx/configVarying.xml
similarity index 100%
rename from tests/res/values-mcc111-xx/configVarying.xml
rename to tests/tests/content/res/values-mcc111-xx/configVarying.xml
diff --git a/tests/res/values-mcc111/configVarying.xml b/tests/tests/content/res/values-mcc111/configVarying.xml
similarity index 100%
rename from tests/res/values-mcc111/configVarying.xml
rename to tests/tests/content/res/values-mcc111/configVarying.xml
diff --git a/tests/res/values-mcc112/configVarying.xml b/tests/tests/content/res/values-mcc112/configVarying.xml
similarity index 100%
rename from tests/res/values-mcc112/configVarying.xml
rename to tests/tests/content/res/values-mcc112/configVarying.xml
diff --git a/tests/res/values-mnc220-xx/configVarying.xml b/tests/tests/content/res/values-mnc220-xx/configVarying.xml
similarity index 100%
rename from tests/res/values-mnc220-xx/configVarying.xml
rename to tests/tests/content/res/values-mnc220-xx/configVarying.xml
diff --git a/tests/res/values-mnc222-32dpi/configVarying.xml b/tests/tests/content/res/values-mnc222-32dpi/configVarying.xml
similarity index 100%
rename from tests/res/values-mnc222-32dpi/configVarying.xml
rename to tests/tests/content/res/values-mnc222-32dpi/configVarying.xml
diff --git a/tests/res/values-mnc222-square/configVarying.xml b/tests/tests/content/res/values-mnc222-square/configVarying.xml
similarity index 100%
rename from tests/res/values-mnc222-square/configVarying.xml
rename to tests/tests/content/res/values-mnc222-square/configVarying.xml
diff --git a/tests/res/values-mnc222-xx/configVarying.xml b/tests/tests/content/res/values-mnc222-xx/configVarying.xml
similarity index 100%
rename from tests/res/values-mnc222-xx/configVarying.xml
rename to tests/tests/content/res/values-mnc222-xx/configVarying.xml
diff --git a/tests/res/values-mnc222/configVarying.xml b/tests/tests/content/res/values-mnc222/configVarying.xml
similarity index 100%
rename from tests/res/values-mnc222/configVarying.xml
rename to tests/tests/content/res/values-mnc222/configVarying.xml
diff --git a/tests/res/values-mnc223/configVarying.xml b/tests/tests/content/res/values-mnc223/configVarying.xml
similarity index 100%
rename from tests/res/values-mnc223/configVarying.xml
rename to tests/tests/content/res/values-mnc223/configVarying.xml
diff --git a/tests/res/values-nokeys/configVarying.xml b/tests/tests/content/res/values-nokeys/configVarying.xml
similarity index 100%
rename from tests/res/values-nokeys/configVarying.xml
rename to tests/tests/content/res/values-nokeys/configVarying.xml
diff --git a/tests/res/values-nonav/configVarying.xml b/tests/tests/content/res/values-nonav/configVarying.xml
similarity index 100%
rename from tests/res/values-nonav/configVarying.xml
rename to tests/tests/content/res/values-nonav/configVarying.xml
diff --git a/tests/res/values-normal/configVarying.xml b/tests/tests/content/res/values-normal/configVarying.xml
similarity index 100%
rename from tests/res/values-normal/configVarying.xml
rename to tests/tests/content/res/values-normal/configVarying.xml
diff --git a/tests/res/values-notouch/configVarying.xml b/tests/tests/content/res/values-notouch/configVarying.xml
similarity index 100%
rename from tests/res/values-notouch/configVarying.xml
rename to tests/tests/content/res/values-notouch/configVarying.xml
diff --git a/tests/res/values-small/configVarying.xml b/tests/tests/content/res/values-small/configVarying.xml
similarity index 100%
rename from tests/res/values-small/configVarying.xml
rename to tests/tests/content/res/values-small/configVarying.xml
diff --git a/tests/res/values-square-32dpi/configVarying.xml b/tests/tests/content/res/values-square-32dpi/configVarying.xml
similarity index 100%
rename from tests/res/values-square-32dpi/configVarying.xml
rename to tests/tests/content/res/values-square-32dpi/configVarying.xml
diff --git a/tests/res/values-square-stylus/configVarying.xml b/tests/tests/content/res/values-square-stylus/configVarying.xml
similarity index 100%
rename from tests/res/values-square-stylus/configVarying.xml
rename to tests/tests/content/res/values-square-stylus/configVarying.xml
diff --git a/tests/res/values-square/configVarying.xml b/tests/tests/content/res/values-square/configVarying.xml
similarity index 100%
rename from tests/res/values-square/configVarying.xml
rename to tests/tests/content/res/values-square/configVarying.xml
diff --git a/tests/res/values-stylus-12key/configVarying.xml b/tests/tests/content/res/values-stylus-12key/configVarying.xml
similarity index 100%
rename from tests/res/values-stylus-12key/configVarying.xml
rename to tests/tests/content/res/values-stylus-12key/configVarying.xml
diff --git a/tests/res/values-stylus-keysexposed/configVarying.xml b/tests/tests/content/res/values-stylus-keysexposed/configVarying.xml
similarity index 100%
rename from tests/res/values-stylus-keysexposed/configVarying.xml
rename to tests/tests/content/res/values-stylus-keysexposed/configVarying.xml
diff --git a/tests/res/values-stylus/configVarying.xml b/tests/tests/content/res/values-stylus/configVarying.xml
similarity index 100%
rename from tests/res/values-stylus/configVarying.xml
rename to tests/tests/content/res/values-stylus/configVarying.xml
diff --git a/tests/res/values-sw590dp-hdpi/configVarying.xml b/tests/tests/content/res/values-sw590dp-hdpi/configVarying.xml
similarity index 100%
rename from tests/res/values-sw590dp-hdpi/configVarying.xml
rename to tests/tests/content/res/values-sw590dp-hdpi/configVarying.xml
diff --git a/tests/res/values-sw590dp-mdpi/configVarying.xml b/tests/tests/content/res/values-sw590dp-mdpi/configVarying.xml
similarity index 100%
rename from tests/res/values-sw590dp-mdpi/configVarying.xml
rename to tests/tests/content/res/values-sw590dp-mdpi/configVarying.xml
diff --git a/tests/res/values-sw590dp-xhdpi/configVarying.xml b/tests/tests/content/res/values-sw590dp-xhdpi/configVarying.xml
similarity index 100%
rename from tests/res/values-sw590dp-xhdpi/configVarying.xml
rename to tests/tests/content/res/values-sw590dp-xhdpi/configVarying.xml
diff --git a/tests/res/values-sw590dp/configVarying.xml b/tests/tests/content/res/values-sw590dp/configVarying.xml
similarity index 100%
rename from tests/res/values-sw590dp/configVarying.xml
rename to tests/tests/content/res/values-sw590dp/configVarying.xml
diff --git a/tests/res/values-sw591dp-hdpi/configVarying.xml b/tests/tests/content/res/values-sw591dp-hdpi/configVarying.xml
similarity index 100%
rename from tests/res/values-sw591dp-hdpi/configVarying.xml
rename to tests/tests/content/res/values-sw591dp-hdpi/configVarying.xml
diff --git a/tests/res/values-sw591dp/configVarying.xml b/tests/tests/content/res/values-sw591dp/configVarying.xml
similarity index 100%
rename from tests/res/values-sw591dp/configVarying.xml
rename to tests/tests/content/res/values-sw591dp/configVarying.xml
diff --git a/tests/res/values-sw600dp-land/configVarying.xml b/tests/tests/content/res/values-sw600dp-land/configVarying.xml
similarity index 100%
rename from tests/res/values-sw600dp-land/configVarying.xml
rename to tests/tests/content/res/values-sw600dp-land/configVarying.xml
diff --git a/tests/res/values-sw600dp-land/dimens.xml b/tests/tests/content/res/values-sw600dp-land/dimens.xml
similarity index 100%
rename from tests/res/values-sw600dp-land/dimens.xml
rename to tests/tests/content/res/values-sw600dp-land/dimens.xml
diff --git a/tests/res/values-sw600dp/configVarying.xml b/tests/tests/content/res/values-sw600dp/configVarying.xml
similarity index 100%
rename from tests/res/values-sw600dp/configVarying.xml
rename to tests/tests/content/res/values-sw600dp/configVarying.xml
diff --git a/tests/res/values-sw600dp/dimens.xml b/tests/tests/content/res/values-sw600dp/dimens.xml
similarity index 100%
rename from tests/res/values-sw600dp/dimens.xml
rename to tests/tests/content/res/values-sw600dp/dimens.xml
diff --git a/tests/res/values-sw720dp/configVarying.xml b/tests/tests/content/res/values-sw720dp/configVarying.xml
similarity index 100%
rename from tests/res/values-sw720dp/configVarying.xml
rename to tests/tests/content/res/values-sw720dp/configVarying.xml
diff --git a/tests/res/values-tl-rPH/configVarying.xml b/tests/tests/content/res/values-tl-rPH/configVarying.xml
similarity index 100%
rename from tests/res/values-tl-rPH/configVarying.xml
rename to tests/tests/content/res/values-tl-rPH/configVarying.xml
diff --git a/tests/res/values-tl/configVarying.xml b/tests/tests/content/res/values-tl/configVarying.xml
similarity index 100%
rename from tests/res/values-tl/configVarying.xml
rename to tests/tests/content/res/values-tl/configVarying.xml
diff --git a/tests/res/values-v10/strings.xml b/tests/tests/content/res/values-v10/strings.xml
similarity index 100%
rename from tests/res/values-v10/strings.xml
rename to tests/tests/content/res/values-v10/strings.xml
diff --git a/tests/res/values-v11/strings.xml b/tests/tests/content/res/values-v11/strings.xml
similarity index 100%
rename from tests/res/values-v11/strings.xml
rename to tests/tests/content/res/values-v11/strings.xml
diff --git a/tests/res/values-v12/strings.xml b/tests/tests/content/res/values-v12/strings.xml
similarity index 100%
rename from tests/res/values-v12/strings.xml
rename to tests/tests/content/res/values-v12/strings.xml
diff --git a/tests/res/values-v13/strings.xml b/tests/tests/content/res/values-v13/strings.xml
similarity index 100%
rename from tests/res/values-v13/strings.xml
rename to tests/tests/content/res/values-v13/strings.xml
diff --git a/tests/res/values-v14/strings.xml b/tests/tests/content/res/values-v14/strings.xml
similarity index 100%
rename from tests/res/values-v14/strings.xml
rename to tests/tests/content/res/values-v14/strings.xml
diff --git a/tests/res/values-v15/strings.xml b/tests/tests/content/res/values-v15/strings.xml
similarity index 100%
rename from tests/res/values-v15/strings.xml
rename to tests/tests/content/res/values-v15/strings.xml
diff --git a/tests/res/values-v16/strings.xml b/tests/tests/content/res/values-v16/strings.xml
similarity index 100%
rename from tests/res/values-v16/strings.xml
rename to tests/tests/content/res/values-v16/strings.xml
diff --git a/tests/res/values-v17/strings.xml b/tests/tests/content/res/values-v17/strings.xml
similarity index 100%
rename from tests/res/values-v17/strings.xml
rename to tests/tests/content/res/values-v17/strings.xml
diff --git a/tests/res/values-v18/strings.xml b/tests/tests/content/res/values-v18/strings.xml
similarity index 100%
rename from tests/res/values-v18/strings.xml
rename to tests/tests/content/res/values-v18/strings.xml
diff --git a/tests/res/values-v19/strings.xml b/tests/tests/content/res/values-v19/strings.xml
similarity index 100%
rename from tests/res/values-v19/strings.xml
rename to tests/tests/content/res/values-v19/strings.xml
diff --git a/tests/res/values-v20/strings.xml b/tests/tests/content/res/values-v20/strings.xml
similarity index 100%
rename from tests/res/values-v20/strings.xml
rename to tests/tests/content/res/values-v20/strings.xml
diff --git a/tests/res/values-v21/strings.xml b/tests/tests/content/res/values-v21/strings.xml
similarity index 100%
rename from tests/res/values-v21/strings.xml
rename to tests/tests/content/res/values-v21/strings.xml
diff --git a/tests/res/values-v22/strings.xml b/tests/tests/content/res/values-v22/strings.xml
similarity index 100%
rename from tests/res/values-v22/strings.xml
rename to tests/tests/content/res/values-v22/strings.xml
diff --git a/tests/res/values-v3/strings.xml b/tests/tests/content/res/values-v3/strings.xml
similarity index 100%
rename from tests/res/values-v3/strings.xml
rename to tests/tests/content/res/values-v3/strings.xml
diff --git a/tests/res/values-v4/strings.xml b/tests/tests/content/res/values-v4/strings.xml
similarity index 100%
rename from tests/res/values-v4/strings.xml
rename to tests/tests/content/res/values-v4/strings.xml
diff --git a/tests/res/values-v5/strings.xml b/tests/tests/content/res/values-v5/strings.xml
similarity index 100%
rename from tests/res/values-v5/strings.xml
rename to tests/tests/content/res/values-v5/strings.xml
diff --git a/tests/res/values-v6/strings.xml b/tests/tests/content/res/values-v6/strings.xml
similarity index 100%
rename from tests/res/values-v6/strings.xml
rename to tests/tests/content/res/values-v6/strings.xml
diff --git a/tests/res/values-v7/strings.xml b/tests/tests/content/res/values-v7/strings.xml
similarity index 100%
rename from tests/res/values-v7/strings.xml
rename to tests/tests/content/res/values-v7/strings.xml
diff --git a/tests/res/values-v8/strings.xml b/tests/tests/content/res/values-v8/strings.xml
similarity index 100%
rename from tests/res/values-v8/strings.xml
rename to tests/tests/content/res/values-v8/strings.xml
diff --git a/tests/res/values-v9/strings.xml b/tests/tests/content/res/values-v9/strings.xml
similarity index 100%
rename from tests/res/values-v9/strings.xml
rename to tests/tests/content/res/values-v9/strings.xml
diff --git a/tests/res/values-w600dp-h550dp/configVarying.xml b/tests/tests/content/res/values-w600dp-h550dp/configVarying.xml
similarity index 100%
rename from tests/res/values-w600dp-h550dp/configVarying.xml
rename to tests/tests/content/res/values-w600dp-h550dp/configVarying.xml
diff --git a/tests/res/values-w600dp/configVarying.xml b/tests/tests/content/res/values-w600dp/configVarying.xml
similarity index 100%
rename from tests/res/values-w600dp/configVarying.xml
rename to tests/tests/content/res/values-w600dp/configVarying.xml
diff --git a/tests/res/values-w720dp-h670dp/configVarying.xml b/tests/tests/content/res/values-w720dp-h670dp/configVarying.xml
similarity index 100%
rename from tests/res/values-w720dp-h670dp/configVarying.xml
rename to tests/tests/content/res/values-w720dp-h670dp/configVarying.xml
diff --git a/tests/res/values-w720dp/configVarying.xml b/tests/tests/content/res/values-w720dp/configVarying.xml
similarity index 100%
rename from tests/res/values-w720dp/configVarying.xml
rename to tests/tests/content/res/values-w720dp/configVarying.xml
diff --git a/tests/res/values-wheel/configVarying.xml b/tests/tests/content/res/values-wheel/configVarying.xml
similarity index 100%
rename from tests/res/values-wheel/configVarying.xml
rename to tests/tests/content/res/values-wheel/configVarying.xml
diff --git a/tests/res/values-xlarge/configVarying.xml b/tests/tests/content/res/values-xlarge/configVarying.xml
similarity index 100%
rename from tests/res/values-xlarge/configVarying.xml
rename to tests/tests/content/res/values-xlarge/configVarying.xml
diff --git a/tests/res/values-xx-32dpi/configVarying.xml b/tests/tests/content/res/values-xx-32dpi/configVarying.xml
similarity index 100%
rename from tests/res/values-xx-32dpi/configVarying.xml
rename to tests/tests/content/res/values-xx-32dpi/configVarying.xml
diff --git a/tests/res/values-xx-rYY/configVarying.xml b/tests/tests/content/res/values-xx-rYY/configVarying.xml
similarity index 100%
rename from tests/res/values-xx-rYY/configVarying.xml
rename to tests/tests/content/res/values-xx-rYY/configVarying.xml
diff --git a/tests/res/values-xx-square/configVarying.xml b/tests/tests/content/res/values-xx-square/configVarying.xml
similarity index 100%
rename from tests/res/values-xx-square/configVarying.xml
rename to tests/tests/content/res/values-xx-square/configVarying.xml
diff --git a/tests/res/values-xx/configVarying.xml b/tests/tests/content/res/values-xx/configVarying.xml
similarity index 100%
rename from tests/res/values-xx/configVarying.xml
rename to tests/tests/content/res/values-xx/configVarying.xml
diff --git a/tests/tests/content/res/values/arrays.xml b/tests/tests/content/res/values/arrays.xml
new file mode 100644
index 0000000..71e0133
--- /dev/null
+++ b/tests/tests/content/res/values/arrays.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 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.
+ -->
+
+<resources>
+ <item type="integer" name="reference" format="integer">101</item>
+
+ <string-array name="strings">
+ <item>zero</item>
+ <item>1</item>
+ <item>@string/reference</item>
+ </string-array>
+
+ <integer-array name="integers">
+ <item>0</item>
+ <item>1</item>
+ <item>@integer/reference</item>
+ </integer-array>
+
+ <array name="difficultyLevel">
+ <item>Easy</item>
+ <item>Medium</item>
+ <item>Hard</item>
+ </array>
+
+ <string-array name="string">
+ <item>Test String 1</item>
+ <item>Test String 2</item>
+ <item>Test String 3</item>
+ </string-array>
+
+ <integer-array name="table_row_layout">
+ <item>1</item>
+ <item>2</item>
+ <item>3</item>
+ <item>4</item>
+ <item>5</item>
+ <item>6</item>
+ <item>7</item>
+ <item>8</item>
+ <item>9</item>
+ <item>10</item>
+ </integer-array>
+</resources>
diff --git a/tests/tests/content/res/values/attrs.xml b/tests/tests/content/res/values/attrs.xml
new file mode 100644
index 0000000..4c3d9db
--- /dev/null
+++ b/tests/tests/content/res/values/attrs.xml
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 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.
+ -->
+
+<resources>
+ <declare-styleable name="Style1">
+ <attr name="Type1" format="integer">
+ <enum name="type" value="28" />
+ <enum name="data" value="0xff00ff00" />
+ <enum name="asset_cookie" value="0" />
+ <enum name="resource_id" value="0" />
+ <enum name="changing_config" value="0" />
+ </attr>
+ <attr name="Type2" format="integer">
+ <enum name="type" value="28" />
+ <enum name="data" value="0xff0000ff" />
+ <enum name="asset_cookie" value="0" />
+ <enum name="resource_id" value="0" />
+ <enum name="changing_config" value="0" />
+ </attr>
+ </declare-styleable>
+ <attr name="type1" format="boolean"/>
+ <attr name="type2" format="boolean"/>
+ <attr name="type3" format="color"/>
+ <attr name="type4" format="reference|color"/>
+ <attr name="type5" format="dimension"/>
+ <attr name="type6" format="dimension"/>
+ <attr name="type7" format="dimension"/>
+ <attr name="type8" format="reference"/>
+ <attr name="type9" format="float"/>
+ <attr name="type10" format="fraction"/>
+ <attr name="type11" format="integer"/>
+ <attr name="type12" format="integer"/>
+ <attr name="type13" format="reference|string"/>
+ <attr name="type14" format="string"/>
+ <attr name="type15" format="reference"/>
+ <attr name="type16" format="string"/>
+ <declare-styleable name="style1">
+ <attr name="type1"/>
+ <attr name="type2"/>
+ <attr name="type3"/>
+ <attr name="type4"/>
+ <attr name="type5"/>
+ <attr name="type6"/>
+ <attr name="type7"/>
+ <attr name="type8"/>
+ <attr name="type9"/>
+ <attr name="type10"/>
+ <attr name="type11"/>
+ <attr name="type12"/>
+ <attr name="type13"/>
+ <attr name="type14"/>
+ <attr name="type15"/>
+ <attr name="type16"/>
+ </declare-styleable>
+ <attr name="testEnum">
+ <enum name="val1" value="1" />
+ <enum name="val2" value="2" />
+ <enum name="val10" value="10" />
+ </attr>
+ <attr name="testFlags">
+ <flag name="bit1" value="0x1" />
+ <flag name="bit2" value="0x2" />
+ <flag name="bit31" value="0x40000000" />
+ </attr>
+ <attr name="testString" format="string" />
+ <declare-styleable name="EnumStyle">
+ <attr name="testEnum" />
+ </declare-styleable>
+ <declare-styleable name="FlagStyle">
+ <attr name="testFlags" />
+ </declare-styleable>
+ <declare-styleable name="TestConfig">
+ <attr name="testString" />
+ </declare-styleable>
+ <!-- Size of text. Recommended dimension type for text is "sp" for scaled-pixels (example: 15sp).
+ Supported values include the following:<p/>
+ <ul>
+ <li><b>px</b> Pixels</li>
+ <li><b>sp</b> Scaled pixels (scaled to relative pixel size on screen). See {@link android.util.DisplayMetrics} for more information.</li>
+ <li><b>pt</b> Points</li>
+ <li><b>dip</b> Device independent pixels. See {@link android.util.DisplayMetrics} for more information.</li>
+ </ul>
+ -->
+ <attr name="textSize" format="dimension" />
+ <attr name="typeface">
+ <enum name="normal" value="0" />
+ <enum name="sans" value="1" />
+ <enum name="serif" value="2" />
+ <enum name="monospace" value="3" />
+ </attr>
+ <!-- Default text typeface style. -->
+ <attr name="textStyle">
+ <flag name="normal" value="0" />
+ <flag name="bold" value="1" />
+ <flag name="italic" value="2" />
+ </attr>
+ <!-- Color of text (usually same as colorForeground). -->
+ <attr name="textColor" format="reference|color" />
+ <!-- Color of highlighted text. -->
+ <attr name="textColorHighlight" format="reference|color" />
+ <!-- Color of hint text (displayed when the field is empty). -->
+ <attr name="textColorHint" format="reference|color" />
+ <!-- Color of link text (URLs). -->
+ <attr name="textColorLink" format="reference|color" />
+ <declare-styleable name="TextAppearance">
+ <attr name="textColor"/>
+ <attr name="textSize"/>
+ <attr name="textStyle"/>
+ <attr name="typeface"/>
+ <attr name="textColorHighlight"/>
+ <attr name="textColorHint"/>
+ <attr name="textColorLink"/>
+ </declare-styleable>
+ <!-- Integer used to uniquely identify theme overrides. -->
+ <attr name="themeType" format="integer"/>
+ <!-- Theme reference used to override parent theme. -->
+ <attr name="themeOverrideAttr" format="reference"/>
+
+ <!-- Drawable theming attributes -->
+ <attr name="themeBoolean" />
+ <attr name="themeColor" />
+ <attr name="themeFloat" />
+ <attr name="themeInteger" />
+ <attr name="themeDimension" />
+ <attr name="themeDrawable" />
+ <attr name="themeBitmap" />
+ <attr name="themeNinePatch" />
+ <attr name="themeGravity" />
+ <attr name="themeTileMode" />
+ <attr name="themeAngle" />
+</resources>
diff --git a/tests/src/android/os/cts/TaggedPointer.java b/tests/tests/content/res/values/bools.xml
old mode 100644
new mode 100755
similarity index 70%
copy from tests/src/android/os/cts/TaggedPointer.java
copy to tests/tests/content/res/values/bools.xml
index 16e76c9..f119cda
--- a/tests/src/android/os/cts/TaggedPointer.java
+++ b/tests/tests/content/res/values/bools.xml
@@ -1,5 +1,6 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 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.
@@ -12,15 +13,9 @@
* 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.os.cts;
-
-public class TaggedPointer {
-
- static {
- System.loadLibrary("cts_jni");
- }
-
- public static native boolean hasTaggedPointer();
-}
+<resources>
+ <bool name="trueRes">true</bool>
+ <bool name="falseRes">false</bool>
+</resources>
diff --git a/tests/src/android/widget/cts/ProgressBarStubActivity.java b/tests/tests/content/res/values/colors.xml
similarity index 60%
copy from tests/src/android/widget/cts/ProgressBarStubActivity.java
copy to tests/tests/content/res/values/colors.xml
index 57cfa1a..f3cc325 100644
--- a/tests/src/android/widget/cts/ProgressBarStubActivity.java
+++ b/tests/tests/content/res/values/colors.xml
@@ -1,4 +1,5 @@
-/*
+<?xml version="1.0" encoding="utf-8"?>
+<!--
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -12,23 +13,14 @@
* 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.widget.cts;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-/**
- * An application for ProgressBar test
- *
- */
-public class ProgressBarStubActivity extends Activity {
- /**
- * Called with the activity is first created.
- */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- }
-}
+<resources>
+ <drawable name="red">#7f00</drawable>
+ <drawable name="blue">#770000ff</drawable>
+ <drawable name="black">#77ffffff</drawable>
+ <drawable name="yellow">#77ffff00</drawable>
+ <color name="testcolor1">#ff00ff00</color>
+ <color name="testcolor2">#ffff0000</color>
+ <color name="failColor">#ff0000ff</color>
+</resources>
diff --git a/tests/tests/content/res/values/configVarying.xml b/tests/tests/content/res/values/configVarying.xml
new file mode 100755
index 0000000..7b7d576
--- /dev/null
+++ b/tests/tests/content/res/values/configVarying.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 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.
+-->
+
+<resources>
+ <item type="configVarying" name="simple">simple default</item>
+ <bag type="configVarying" name="bag">
+ <item name="testString">bag default</item>
+ </bag>
+ <item type="configVarying" name="small">default</item>
+ <item type="configVarying" name="normal">default</item>
+ <item type="configVarying" name="large">default</item>
+ <item type="configVarying" name="xlarge">default</item>
+ <item type="configVarying" name="sw">default</item>
+ <item type="configVarying" name="w">default</item>
+ <item type="configVarying" name="h">default</item>
+ <item type="configVarying" name="wh">default</item>
+</resources>
diff --git a/tests/tests/content/res/values/dimens.xml b/tests/tests/content/res/values/dimens.xml
new file mode 100755
index 0000000..bae216f
--- /dev/null
+++ b/tests/tests/content/res/values/dimens.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 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.
+ -->
+
+<resources>
+ <item name="frac100perc" type="dimen" format="fraction">100%</item>
+ <item name="frac1perc" type="dimen" format="fraction">1%</item>
+ <item name="fracp1perc" type="dimen" format="fraction">.1%</item>
+ <item name="fracp01perc" type="dimen" format="fraction">.01%</item>
+ <item name="frac0perc" type="dimen" format="fraction">0%</item>
+ <item name="frac1p1perc" type="dimen" format="fraction">1.1%</item>
+ <item name="frac100p1perc" type="dimen" format="fraction">100.1%</item>
+ <item name="frac25510perc" type="dimen" format="fraction">25510%</item>
+ <item name="frac25610perc" type="dimen" format="fraction">25610%</item>
+ <item name="frac6553510perc" type="dimen" format="fraction">6553510%</item>
+ <item name="frac6553610perc" type="dimen" format="fraction">6553610%</item>
+
+ <item name="frac100pperc" type="dimen" format="fraction">100%p</item>
+ <item name="frac1pperc" type="dimen" format="fraction">1%p</item>
+ <item name="fracp1pperc" type="dimen" format="fraction">.1%p</item>
+ <item name="fracp01pperc" type="dimen" format="fraction">.01%p</item>
+ <item name="frac0pperc" type="dimen" format="fraction">0%p</item>
+ <item name="frac1p1pperc" type="dimen" format="fraction">1.1%p</item>
+ <item name="frac100p1pperc" type="dimen" format="fraction">100.1%p</item>
+ <item name="frac25510pperc" type="dimen" format="fraction">25510%p</item>
+ <item name="frac25610pperc" type="dimen" format="fraction">25610%p</item>
+ <item name="frac6553510pperc" type="dimen" format="fraction">6553510%p</item>
+ <item name="frac6553610pperc" type="dimen" format="fraction">6553610%p</item>
+</resources>
+
diff --git a/tests/tests/content/res/values/resources_test.xml b/tests/tests/content/res/values/resources_test.xml
new file mode 100644
index 0000000..91c2c4a
--- /dev/null
+++ b/tests/tests/content/res/values/resources_test.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+<resources>
+ <!-- The width that is used when creating thumbnails of applications. -->
+ <dimen name="thumbnail_width">84dp</dimen>
+ <!-- The height that is used when creating thumbnails of applications. -->
+ <dimen name="thumbnail_height">63dp</dimen>
+ <!-- The standard size (both width and height) of an application icon that
+ will be displayed in the app launcher and elsewhere. -->
+ <dimen name="app_icon_size">48px</dimen>
+ <dimen name="toast_y_offset">64dip</dimen>
+ <plurals name="plurals_test">
+ <item quantity="one">A dog</item>
+ <item quantity="other">Some dogs</item>
+ </plurals>
+ <color name="resource_test_color">#003B3B3B</color>
+ <integer name="resource_test_int">10</integer>
+</resources>
diff --git a/tests/tests/content/res/values/strings.xml b/tests/tests/content/res/values/strings.xml
new file mode 100644
index 0000000..c167278
--- /dev/null
+++ b/tests/tests/content/res/values/strings.xml
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="permlab_testGranted">Test Granted</string>
+ <string name="permdesc_testGranted">Used for running CTS tests, for testing operations
+ where we have the permission.</string>
+ <string name="permlab_testDynamic">Test Dynamic</string>
+ <string name="permdesc_testDynamic">Used for running CTS tests, for testing adding
+ dynamic permissions.</string>
+ <string name="permlab_testDenied">Test Denied</string>
+ <string name="permdesc_testDenied">Used for running CTS tests, for testing operations
+ where we do not have the permission.</string>
+ <string name="explain">1. click start. \n2. if above image shaked, then press pass button,
+ else press failed button.</string>
+ <string name="text_view_hello">Hello! Text view!</string>
+ <string name="text_view_hello_two_lines">Hello! \nText view!</string>
+ <string name="text_view_simple_hint">This is a hint.</string>
+ <string name="text_view_hint">This is a string for testing hint of textview.</string>
+ <string name="activity_forwarding">App/Forwarding</string>
+ <string name="forwarding">$$$</string>
+ <string name="go">Go</string>
+ <string name="back">Back</string>
+ <string name="forward_target">
+ Press back button and notice we don\'t see the previous activity.
+ </string>
+ <string name="edit_text">testing</string>
+ <string name="text">DialogTest</string>
+ <string name="text_country">Country</string>
+ <string name="text_name">Name</string>
+ <string name="hello_world">Hello, World!</string>
+ <string name="hello_android">Hello, Android!</string>
+ <string name="alert_dialog_username">Name:</string>
+ <string name="alert_dialog_password">Password:</string>
+ <string name="alert_dialog_positive">Positive</string>
+ <string name="alert_dialog_negative">Negative</string>
+ <string name="alert_dialog_neutral">Neutral</string>
+ <string name="notify">Notify </string>
+ <string name="tabs_1">testing</string>
+ <string name="table_layout_first">first</string>
+ <string name="table_layout_second">second</string>
+ <string name="table_layout_third">third</string>
+ <string name="table_layout_long">Very long to make the string out of the screen</string>
+ <string name="chronometer_text">Test Chronometer</string>
+ <string name="am">AM</string>
+ <string name="pm">PM</string>
+ <string name="viewgroup_test">ViewGroup test</string>
+ <string name="viewanimator_test">ViewAnimator test</string>
+ <string name="id_ok">OK</string>
+ <string name="id_cancel">Cancel</string>
+ <string name="context_test_string1">This is %s string.</string>
+ <string name="context_test_string2">This is test string.</string>
+ <string name="animationutils_test_instructions">Choose different animations</string>
+ <string name="animationutils_test_alpha">Alpha animation</string>
+ <string name="animationutils_test_scale">Scale animation</string>
+ <string name="animationutils_test_rotate">Rotate animation</string>
+ <string name="animationutils_test_translate">Translate animation</string>
+ <string name="animationutils_test_set">Animation set</string>
+ <string name="animationutils_test_layout">Layout animation</string>
+ <string name="animationutils_test_gridlayout">Grid layout animation</string>
+ <string name="twolinelistitem_test_text1">text1</string>
+ <string name="twolinelistitem_test_text2">text2</string>
+ <string name="metadata_text">metadata text</string>
+ <string name="horizontal_text_1">horizontal 1</string>
+ <string name="horizontal_text_2">horizontal 2</string>
+ <string name="horizontal_text_3">horizontal 3</string>
+ <string name="vertical_text_1">vertical 1</string>
+ <string name="vertical_text_2">vertical 2</string>
+ <string name="vertical_text_3">vertical 3</string>
+ <string name="reference">here</string>
+ <string name="coerceIntegerToString">100</string>
+ <string name="coerceBooleanToString">true</string>
+ <string name="coerceColorToString">#fff</string>
+ <string name="coerceFloatToString">100.0</string>
+ <string name="coerceDimensionToString">100px</string>
+ <string name="coerceFractionToString">100<xliff:g id="percent">%</xliff:g></string>
+ <string name="formattedStringNone">Format[]</string>
+ <string name="formattedStringOne">Format[<xliff:g id="format">%d</xliff:g>]</string>
+ <string name="formattedStringTwo">Format[<xliff:g id="format">%3$d,%2$s</xliff:g>]</string>
+ <string name="checkboxpref_key">checkboxpref_key</string>
+ <string name="checkboxpref_title">title of preference</string>
+ <string name="checkboxpref_summary">summary of preference</string>
+ <string name="checkboxpref_summary_on">summary on of preference</string>
+ <string name="checkboxpref_summary_off">summary off of preference</string>
+ <string name="checkboxpref_depend">checkboxpref_depend</string>
+ <string name="checkboxpref_depend_title"> depend title of preference</string>
+ <string name="checkboxpref_depend_summary"> depend summary of preference</string>
+ <string name="edittextpref_key">edittextpref_key</string>
+ <string name="edittextpref_default_value">default value of preference</string>
+ <string name="edittextpref_title">title of edit text preference</string>
+ <string name="edittextpref_summary">summary of edit text preference</string>
+ <string name="edittextpref_dialog_title">dialog title of edit text preference</string>
+ <string name="edittextpref_text">text of edit text preference</string>
+ <string name="listpref_key">listpref_key</string>
+ <string name="listpref_title">title of list preference</string>
+ <string name="listpref_summary">summary of list preference</string>
+ <string name="listpref_dialogtitle">dialog title of list preference</string>
+ <string name="easy">Easy</string>
+ <string name="medium">Medium</string>
+ <string name="hard">Hard</string>
+ <string name="footer_view">Footer view</string>
+ <string name="header_view">Header view</string>
+ <string name="dialogpref_title">title of dialog preference </string>
+ <string name="dialogpref_dialog_title">dialog title of dialog preference </string>
+ <string name="dialogpref_key">dialogpref_key</string>
+ <string name="dialogpref_default_value">default value of dialog preference</string>
+ <string name="dialogpref_summary">summary of dialog preference</string>
+ <string name="dialogpref_message">message of dialog preference</string>
+ <string name="dialogpref_sure">Sure</string>
+ <string name="dialogpref_cancel">Cancel</string>
+ <string name="pref_key">pref_key</string>
+ <string name="pref_title">title of preference</string>
+ <string name="pref_summary">summary of preference</string>
+ <string name="pref_depend_key">pref_depend_key</string>
+ <string name="pref_depend_title"> depend title of preference</string>
+ <string name="pref_depend_summary"> depend summary of preference</string>
+ <string name="android_intent_action_preference">android.intent.action.PREFERENCE</string>
+ <string name="def_pref_key">def_pref_key</string>
+ <string name="def_pref_title">default preference</string>
+ <string name="def_pref_summary">This is default preference of cts</string>
+ <string name="relative_view1">view 1</string>
+ <string name="relative_view2">view 2</string>
+ <string name="relative_view3">view 3</string>
+ <string name="relative_view4">view 4</string>
+ <string name="relative_view5">view 5</string>
+ <string name="relative_view6">view 6</string>
+ <string name="relative_view7">view 7</string>
+ <string name="relative_view8">view 8</string>
+ <string name="relative_view9">view 9</string>
+ <string name="relative_view10">view 10</string>
+ <string name="relative_view11">view 11</string>
+ <string name="relative_view12">view 12</string>
+ <string name="relative_view13">view 13</string>
+ <string name="country">Country:</string>
+ <string name="symbol">Symbol:</string>
+ <string name="country_warning">No such country registered</string>
+ <string name="version_cur">base</string>
+ <string name="version_old">base</string>
+ <string name="version_v3">base</string>
+ <string name="authenticator_label">Android CTS</string>
+ <string name="search_label">Android CTS</string>
+ <string name="tag1">tag 1</string>
+ <string name="tag2">tag 2</string>
+
+ <string name="button">Button</string>
+ <string name="holo_test">Holo Test</string>
+ <string name="holo_generator">Holo Generator</string>
+ <string name="holo_light_test">Holo Light Test</string>
+ <string name="holo_light_generator">Holo Light Generator</string>
+ <string name="reference_image">Reference Image: </string>
+ <string name="generated_image">Generated Image: </string>
+ <string name="themes_prompt">Select a Theme:</string>
+ <string name="sample_text">Sample text goes here. I wanted something creative and whimsical
+but then I just got bored...</string>
+ <string name="long_text">This is a really long string which exceeds the width of the view.
+New devices have a much larger screen which actually enables long strings to be displayed
+with no fading. I have made this string longer to fix this case. If you are correcting this
+text, I would love to see the kind of devices you guys now use! Guys, maybe some devices need longer string!
+I think so, so how about double this string, like copy and paste!
+This is a really long string which exceeds the width of the view.
+New devices have a much larger screen which actually enables long strings to be displayed
+with no fading. I have made this string longer to fix this case. If you are correcting this
+text, I would love to see the kind of devices you guys now use! Guys, maybe some devices need longer string!
+I think so, so how about double this string, like copy and paste! </string>
+ <string name="rectangle200">"M 0,0 l 200,0 l 0, 200 l -200, 0 z"</string>
+</resources>
diff --git a/tests/tests/content/res/values/styles.xml b/tests/tests/content/res/values/styles.xml
new file mode 100644
index 0000000..20c80f8
--- /dev/null
+++ b/tests/tests/content/res/values/styles.xml
@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <style name="Whatever">
+ <item name="type1">true</item>
+ <item name="type2">false</item>
+ <item name="type3">#ff0000ff</item>
+ <item name="type4">#ff00ff00</item>
+ <item name="type5">0.75px</item>
+ <item name="type6">10px</item>
+ <item name="type7">18px</item>
+ <item name="type8">@drawable/pass</item>
+ <item name="type9">3.14</item>
+ <item name="type10">100%</item>
+ <item name="type11">365</item>
+ <item name="type12">86400</item>
+ <item name="type13">@string/hello_android</item>
+ <item name="type14">TypedArray Test!</item>
+ <item name="type15">@array/difficultyLevel</item>
+ <item name="type16">Typed Value!</item>
+ </style>
+
+ <style name="TextViewWithoutColorAndAppearance">
+ <item name="android:textSize">18sp</item>
+ </style>
+
+ <style name="TextViewWithColorButWithOutAppearance">
+ <item name="android:textColor">#ff0000ff</item>
+ </style>
+
+ <style name="TextViewWithColorAndAppearance">
+ <item name="android:textColor">#ff0000ff</item>
+ <item name="android:textAppearance">@style/TextAppearance.WithColor</item>
+ </style>
+
+ <style name="TextViewWithoutColorButWithAppearance">
+ <item name="android:textAppearance">@style/TextAppearance.WithColor</item>
+ </style>
+
+ <style name="TextAppearance" parent="android:TextAppearance">
+ </style>
+
+ <style name="TextAppearance.WithColor">
+ <item name="android:textColor">#ffff0000</item>
+ </style>
+
+ <style name="TextAppearance.All">
+ <item name="android:textColor">@drawable/black</item>
+ <item name="android:textSize">20px</item>
+ <item name="android:textStyle">bold</item>
+ <item name="android:textColorHint">@drawable/red</item>
+ <item name="android:textColorLink">@drawable/blue</item>
+ <item name="android:textColorHighlight">@drawable/yellow</item>
+ </style>
+
+ <style name="TextAppearance.Colors">
+ <item name="android:textColor">@drawable/black</item>
+ <item name="android:textColorHint">@drawable/blue</item>
+ <item name="android:textColorLink">@drawable/yellow</item>
+ <item name="android:textColorHighlight">@drawable/red</item>
+ </style>
+
+ <style name="TextAppearance.NotColors">
+ <item name="android:textSize">17px</item>
+ <item name="android:typeface">sans</item>
+ <item name="android:textStyle">normal</item>
+ </style>
+
+ <style name="TextAppearance.Style">
+ <item name="android:textStyle">normal</item>
+ </style>
+
+ <style name="TestEnum1">
+ <item name="testEnum">val1</item>
+ </style>
+
+ <style name="TestEnum2">
+ <item name="testEnum">val2</item>
+ </style>
+
+ <style name="TestEnum10">
+ <item name="testEnum">val10</item>
+ </style>
+
+ <style name="TestFlag1">
+ <item name="testFlags">bit1</item>
+ </style>
+
+ <style name="TestFlag2">
+ <item name="testFlags">bit2</item>
+ </style>
+
+ <style name="TestFlag31">
+ <item name="testFlags">bit31</item>
+ </style>
+
+ <style name="TestFlag1And2">
+ <item name="testFlags">bit1|bit2</item>
+ </style>
+
+ <style name="TestFlag1And2And31">
+ <item name="testFlags">bit1|bit2|bit31</item>
+ </style>
+
+ <style name="TestEnum1.EmptyInherit" />
+
+ <style name="Theme_AlertDialog">
+ <item name="android:textSize">18sp</item>
+ </style>
+
+ <style name="TestProgressBar">
+ <item name="android:indeterminateOnly">false</item>
+ <item name="android:progressDrawable">?android:drawable/progress_horizontal</item>
+ <item name="android:indeterminateDrawable">?android:drawable/progress_horizontal</item>
+ <item name="android:minHeight">20dip</item>
+ <item name="android:maxHeight">20dip</item>
+ <item name="android:focusable">true</item>
+ </style>
+
+ <style name="Test_Theme">
+ <item name="android:windowNoTitle">true</item>
+ <item name="android:panelColorForeground">#ff000000</item>
+ <item name="android:panelColorBackground">#ffffffff</item>
+ </style>
+
+ <style name="Theme_OverrideOuter">
+ <item name="themeType">1</item>
+ </style>
+
+ <style name="Theme_OverrideInner">
+ <item name="themeType">2</item>
+ <item name="themeOverrideAttr">@style/Theme_OverrideAttr</item>
+ </style>
+
+ <style name="Theme_OverrideAttr">
+ <item name="themeType">3</item>
+ </style>
+
+ <style name="Theme_ThemedDrawableTest">
+ <item name="themeBoolean">true</item>
+ <item name="themeColor">@android:color/black</item>
+ <item name="themeFloat">1.0</item>
+ <item name="themeAngle">45.0</item>
+ <item name="themeInteger">1</item>
+ <item name="themeDimension">1px</item>
+ <item name="themeDrawable">@drawable/icon_black</item>
+ <item name="themeBitmap">@drawable/icon_black</item>
+ <item name="themeNinePatch">@drawable/ninepatch_0</item>
+ <item name="themeGravity">48</item>
+ <item name="themeTileMode">2</item>
+ </style>
+
+ <style name="Theme_NoSwipeDismiss">
+ <item name="android:windowSwipeToDismiss">false</item>
+ </style>
+
+</resources>
diff --git a/tests/tests/content/res/xml/alias.xml b/tests/tests/content/res/xml/alias.xml
new file mode 100644
index 0000000..c245ba8
--- /dev/null
+++ b/tests/tests/content/res/xml/alias.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2008 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.
+ */
+-->
+
+<alias xmlns:android="http://schemas.android.com/apk/res/android">
+ <intent android:action="android.intent.action.MAIN"
+ android:targetPackage="com.android.cts.content"
+ android:targetClass="android.content.cts.ChildActivity"
+ android:data="http://www.google.com/">
+ </intent>
+</alias>
+
diff --git a/tests/tests/content/res/xml/authenticator.xml b/tests/tests/content/res/xml/authenticator.xml
new file mode 100644
index 0000000..1e298b1
--- /dev/null
+++ b/tests/tests/content/res/xml/authenticator.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright (c) 2009, 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.
+ */
+-->
+
+<!-- The attributes in this XML file provide configuration information -->
+<!-- for the Account Manager. -->
+
+<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
+ android:accountType="android.content.cts.account.type"
+ android:icon="@drawable/ic_cts_selected"
+ android:smallIcon="@drawable/ic_cts_minitab_selected"
+ android:label="@string/authenticator_label"
+/>
\ No newline at end of file
diff --git a/tests/tests/content/res/xml/colors.xml b/tests/tests/content/res/xml/colors.xml
new file mode 100644
index 0000000..8c44a66
--- /dev/null
+++ b/tests/tests/content/res/xml/colors.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2008 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.
+ */
+-->
+<resources>
+ <color name="testcolor1">#ff00ff00</color>
+ <color name="testcolor2">#ffff0000</color>
+ <color name="failColor">#ff0000ff</color>
+</resources>
+
diff --git a/tests/src/android/os/cts/TaggedPointer.java b/tests/tests/content/res/xml/extra.xml
old mode 100644
new mode 100755
similarity index 65%
copy from tests/src/android/os/cts/TaggedPointer.java
copy to tests/tests/content/res/xml/extra.xml
index 16e76c9..b3bffb4
--- a/tests/src/android/os/cts/TaggedPointer.java
+++ b/tests/tests/content/res/xml/extra.xml
@@ -1,5 +1,6 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 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.
@@ -12,15 +13,8 @@
* 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.os.cts;
-
-public class TaggedPointer {
-
- static {
- System.loadLibrary("cts_jni");
- }
-
- public static native boolean hasTaggedPointer();
-}
+ -->
+<tag xmlns:android="http://schemas.android.com/apk/res/android" android:name="Bruce" android:value="Lee">
+ <extra android:name="google" android:value="android">
+ </extra>
+</tag>
diff --git a/tests/tests/content/res/xml/intentfilter.xml b/tests/tests/content/res/xml/intentfilter.xml
new file mode 100644
index 0000000..7ed3a53
--- /dev/null
+++ b/tests/tests/content/res/xml/intentfilter.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2008 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.
+ */
+-->
+<intent-filter xmlns="http://schemas.android.com/apk/res/android">
+ <action name="testAction"/>
+ <cat name="testCategory" />
+ <type name="vnd.android.cursor.dir/person"/>
+ <scheme name="testScheme"/>
+ <auth host="testHost" port="80"/>
+ <path name="testPath" literal="test"/>
+ <path name="testPath" prefix="test"/>
+ <path name="testPath" sglob="test"/>
+</intent-filter>
diff --git a/tests/src/android/os/cts/TaggedPointer.java b/tests/tests/content/res/xml/pm_test.xml
similarity index 70%
copy from tests/src/android/os/cts/TaggedPointer.java
copy to tests/tests/content/res/xml/pm_test.xml
index 16e76c9..4db24cf 100644
--- a/tests/src/android/os/cts/TaggedPointer.java
+++ b/tests/tests/content/res/xml/pm_test.xml
@@ -1,5 +1,6 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Copyright (C) 2008 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.
@@ -12,15 +13,7 @@
* 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.os.cts;
-
-public class TaggedPointer {
-
- static {
- System.loadLibrary("cts_jni");
- }
-
- public static native boolean hasTaggedPointer();
-}
+ -->
+ <!-- This xml is just test for PackageManager Test -->
+<resources>
+</resources>
diff --git a/tests/tests/content/res/xml/syncadapter.xml b/tests/tests/content/res/xml/syncadapter.xml
new file mode 100644
index 0000000..1c0bb72
--- /dev/null
+++ b/tests/tests/content/res/xml/syncadapter.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright (c) 2009, 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.
+ */
+-->
+
+<!-- The attributes in this XML file provide configuration information -->
+<!-- for the SyncAdapter. -->
+
+<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
+ android:contentAuthority="android.content.cts.authority"
+ android:accountType="android.content.cts.account.type"
+/>
diff --git a/tests/tests/content/res/xml/test_color.xml b/tests/tests/content/res/xml/test_color.xml
new file mode 100644
index 0000000..97f7dec
--- /dev/null
+++ b/tests/tests/content/res/xml/test_color.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ android:versionName="testNonResourcesString">
+ <color name="testcolor1">#ff00ff00</color>
+ <color name="testcolor2">#ffff0000</color>
+ <color name="failColor">#ff0000ff</color>
+</resources>
diff --git a/tests/tests/content/src/android/content/cts/AsyncQueryHandlerTest.java b/tests/tests/content/src/android/content/cts/AsyncQueryHandlerTest.java
index 18e0b2e..3d4ca81 100644
--- a/tests/tests/content/src/android/content/cts/AsyncQueryHandlerTest.java
+++ b/tests/tests/content/src/android/content/cts/AsyncQueryHandlerTest.java
@@ -25,14 +25,15 @@
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
-import android.test.AndroidTestCase;
+import android.test.InstrumentationTestCase;
+import android.test.UiThreadTest;
/**
* Test {@link AsyncQueryHandler} and {@link WorkerHandler}}.
*
* @see DummyProvider
*/
-public class AsyncQueryHandlerTest extends AndroidTestCase {
+public class AsyncQueryHandlerTest extends InstrumentationTestCase {
private static final long TEST_TIME_OUT = DummyProvider.MOCK_OPERATION_SLEEP_TIME + 5000;
private static final int INSERT_TOKEN_1 = 100;
@@ -74,7 +75,7 @@
protected void setUp() throws Exception {
super.setUp();
- mResolver = mContext.getContentResolver();
+ mResolver = getInstrumentation().getTargetContext().getContentResolver();
ContentValues values0 = new ContentValues();
values0.put(DummyProvider.NAME, NAME0);
@@ -96,9 +97,9 @@
super.tearDown();
}
+ @UiThreadTest
public void testConstructor() {
new AsyncQueryHandler(mResolver) {};
-
new AsyncQueryHandler(null) {};
}
@@ -257,9 +258,10 @@
}
}
+ @UiThreadTest
public void testCreateHandler() {
MockAsyncQueryHandler wrapper = new MockAsyncQueryHandler(mResolver);
- Handler result = wrapper.createHandler(Looper.myLooper());
+ Handler result = wrapper.createHandler(Looper.getMainLooper());
assertNotNull(result);
assertSame(Looper.myLooper(), result.getLooper());
diff --git a/tests/src/android/content/cts/AvailableIntentsActivity.java b/tests/tests/content/src/android/content/cts/AvailableIntentsActivity.java
similarity index 96%
rename from tests/src/android/content/cts/AvailableIntentsActivity.java
rename to tests/tests/content/src/android/content/cts/AvailableIntentsActivity.java
index ac676de..773defc 100644
--- a/tests/src/android/content/cts/AvailableIntentsActivity.java
+++ b/tests/tests/content/src/android/content/cts/AvailableIntentsActivity.java
@@ -16,7 +16,7 @@
package android.content.cts;
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
import android.app.Activity;
import android.os.Bundle;
diff --git a/tests/tests/content/src/android/content/cts/BroadcastReceiverTest.java b/tests/tests/content/src/android/content/cts/BroadcastReceiverTest.java
index 2865f9e..526087b 100644
--- a/tests/tests/content/src/android/content/cts/BroadcastReceiverTest.java
+++ b/tests/tests/content/src/android/content/cts/BroadcastReceiverTest.java
@@ -18,8 +18,6 @@
import android.app.Service;
-import android.app.cts.MockActivity;
-import android.app.cts.MockService;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
@@ -52,7 +50,7 @@
private static final long START_SERVICE_TIMEOUT = 3000;
public BroadcastReceiverTest() {
- super("com.android.cts.stub", MockActivity.class);
+ super("com.android.cts.content", MockActivity.class);
}
@Override
diff --git a/tests/src/android/widget/cts/StubActivity.java b/tests/tests/content/src/android/content/cts/ChildActivity.java
similarity index 74%
copy from tests/src/android/widget/cts/StubActivity.java
copy to tests/tests/content/src/android/content/cts/ChildActivity.java
index fe4002c..c8092ed 100644
--- a/tests/src/android/widget/cts/StubActivity.java
+++ b/tests/tests/content/src/android/content/cts/ChildActivity.java
@@ -13,14 +13,17 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
-package android.widget.cts;
+package android.content.cts;
import android.app.Activity;
-/**
- * Stub activity for helping test. It's an empty activity.
- */
-public class StubActivity extends Activity {
+public class ChildActivity extends Activity {
+ public static boolean isStarted = false;
+
+ @Override
+ protected void onStart() {
+ super.onStart();
+ isStarted = true;
+ }
}
diff --git a/tests/src/android/content/cts/ClipboardManagerListenerActivity.java b/tests/tests/content/src/android/content/cts/ClipboardManagerListenerActivity.java
similarity index 100%
rename from tests/src/android/content/cts/ClipboardManagerListenerActivity.java
rename to tests/tests/content/src/android/content/cts/ClipboardManagerListenerActivity.java
diff --git a/tests/tests/content/src/android/content/cts/ClipboardManagerTest.java b/tests/tests/content/src/android/content/cts/ClipboardManagerTest.java
index bf0a175..e92834c 100644
--- a/tests/tests/content/src/android/content/cts/ClipboardManagerTest.java
+++ b/tests/tests/content/src/android/content/cts/ClipboardManagerTest.java
@@ -23,39 +23,44 @@
import android.content.Intent;
import android.content.ClipData.Item;
import android.net.Uri;
-import android.test.AndroidTestCase;
+import android.test.InstrumentationTestCase;
+import android.test.UiThreadTest;
-public class ClipboardManagerTest extends AndroidTestCase {
-
- private ClipboardManager mClipboardManager;
+public class ClipboardManagerTest extends InstrumentationTestCase {
+ private Context mContext;
@Override
protected void setUp() throws Exception {
super.setUp();
- mClipboardManager = (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE);
+ mContext = getInstrumentation().getTargetContext();
}
+ @UiThreadTest
public void testSetGetText() {
- mClipboardManager.setText("Test Text 1");
- assertEquals("Test Text 1", mClipboardManager.getText());
+ ClipboardManager clipboardManager = makeClipboardManager();
+ clipboardManager.setText("Test Text 1");
+ assertEquals("Test Text 1", clipboardManager.getText());
- mClipboardManager.setText("Test Text 2");
- assertEquals("Test Text 2", mClipboardManager.getText());
+ clipboardManager.setText("Test Text 2");
+ assertEquals("Test Text 2", clipboardManager.getText());
}
+ @UiThreadTest
public void testHasPrimaryClip() {
- if (mClipboardManager.hasPrimaryClip()) {
- assertNotNull(mClipboardManager.getPrimaryClip());
- assertNotNull(mClipboardManager.getPrimaryClipDescription());
+ ClipboardManager clipboardManager = makeClipboardManager();
+ if (clipboardManager.hasPrimaryClip()) {
+ assertNotNull(clipboardManager.getPrimaryClip());
+ assertNotNull(clipboardManager.getPrimaryClipDescription());
} else {
- assertNull(mClipboardManager.getPrimaryClip());
- assertNull(mClipboardManager.getPrimaryClipDescription());
+ assertNull(clipboardManager.getPrimaryClip());
+ assertNull(clipboardManager.getPrimaryClipDescription());
}
- mClipboardManager.setPrimaryClip(ClipData.newPlainText("Label", "Text"));
- assertTrue(mClipboardManager.hasPrimaryClip());
+ clipboardManager.setPrimaryClip(ClipData.newPlainText("Label", "Text"));
+ assertTrue(clipboardManager.hasPrimaryClip());
}
+ @UiThreadTest
public void testSetPrimaryClip_plainText() {
ClipData textData = ClipData.newPlainText("TextLabel", "Text");
assertSetPrimaryClip(textData, "TextLabel",
@@ -63,6 +68,7 @@
new ExpectedClipItem("Text", null, null));
}
+ @UiThreadTest
public void testSetPrimaryClip_intent() {
Intent intent = new Intent(mContext, ClipboardManagerTest.class);
ClipData intentData = ClipData.newIntent("IntentLabel", intent);
@@ -71,6 +77,7 @@
new ExpectedClipItem(null, intent, null));
}
+ @UiThreadTest
public void testSetPrimaryClip_rawUri() {
Uri uri = Uri.parse("http://www.google.com");
ClipData uriData = ClipData.newRawUri("UriLabel", uri);
@@ -79,15 +86,17 @@
new ExpectedClipItem(null, null, uri));
}
+ @UiThreadTest
public void testSetPrimaryClip_contentUri() {
Uri contentUri = Uri.parse("content://cts/test/for/clipboardmanager");
- ClipData contentUriData = ClipData.newUri(getContext().getContentResolver(),
+ ClipData contentUriData = ClipData.newUri(mContext.getContentResolver(),
"ContentUriLabel", contentUri);
assertSetPrimaryClip(contentUriData, "ContentUriLabel",
new String[] {ClipDescription.MIMETYPE_TEXT_URILIST},
new ExpectedClipItem(null, null, contentUri));
}
+ @UiThreadTest
public void testSetPrimaryClip_complexItem() {
Intent intent = new Intent(mContext, ClipboardManagerTest.class);
Uri uri = Uri.parse("http://www.google.com");
@@ -103,6 +112,7 @@
new ExpectedClipItem("Text", intent, uri));
}
+ @UiThreadTest
public void testSetPrimaryClip_multipleItems() {
Intent intent = new Intent(mContext, ClipboardManagerTest.class);
Uri uri = Uri.parse("http://www.google.com");
@@ -134,22 +144,23 @@
String expectedLabel,
String[] expectedMimeTypes,
ExpectedClipItem... expectedClipItems) {
+ ClipboardManager clipboardManager = makeClipboardManager();
- mClipboardManager.setPrimaryClip(clipData);
- assertTrue(mClipboardManager.hasPrimaryClip());
+ clipboardManager.setPrimaryClip(clipData);
+ assertTrue(clipboardManager.hasPrimaryClip());
if (expectedClipItems != null
&& expectedClipItems.length > 0
&& expectedClipItems[0].mText != null) {
- assertTrue(mClipboardManager.hasText());
+ assertTrue(clipboardManager.hasText());
} else {
- assertFalse(mClipboardManager.hasText());
+ assertFalse(clipboardManager.hasText());
}
- assertNotNull(mClipboardManager.getPrimaryClip());
- assertNotNull(mClipboardManager.getPrimaryClipDescription());
+ assertNotNull(clipboardManager.getPrimaryClip());
+ assertNotNull(clipboardManager.getPrimaryClipDescription());
- ClipData data = mClipboardManager.getPrimaryClip();
+ ClipData data = clipboardManager.getPrimaryClip();
if (expectedClipItems != null) {
assertEquals(expectedClipItems.length, data.getItemCount());
for (int i = 0; i < expectedClipItems.length; i++) {
@@ -162,7 +173,7 @@
assertClipDescription(data.getDescription(),
expectedLabel, expectedMimeTypes);
- assertClipDescription(mClipboardManager.getPrimaryClipDescription(),
+ assertClipDescription(clipboardManager.getPrimaryClipDescription(),
expectedLabel, expectedMimeTypes);
}
@@ -189,4 +200,8 @@
assertNull(item.getUri());
}
}
+
+ private ClipboardManager makeClipboardManager() {
+ return (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE);
+ }
}
diff --git a/tests/tests/content/src/android/content/cts/ComponentNameTest.java b/tests/tests/content/src/android/content/cts/ComponentNameTest.java
index d14a95b..6277bd6 100644
--- a/tests/tests/content/src/android/content/cts/ComponentNameTest.java
+++ b/tests/tests/content/src/android/content/cts/ComponentNameTest.java
@@ -85,7 +85,7 @@
}
public void testFlattenToString() {
- assertEquals("com.android.cts.stub/android.content.cts.ComponentNameTest",
+ assertEquals("com.android.cts.content/android.content.cts.ComponentNameTest",
getComponentName().flattenToString());
}
@@ -121,7 +121,7 @@
public void testGetPackageName() {
final String actual = getComponentName().getPackageName();
- assertEquals("com.android.cts.stub", actual);
+ assertEquals("com.android.cts.content", actual);
}
public void testUnflattenFromString() {
@@ -135,7 +135,7 @@
public void testFlattenToShortString() {
// Test normal
String actual = getComponentName().flattenToShortString();
- assertEquals("com.android.cts.stub/android.content.cts.ComponentNameTest", actual);
+ assertEquals("com.android.cts.content/android.content.cts.ComponentNameTest", actual);
// Test long class name
final ComponentName componentName = new ComponentName("com.android.view",
@@ -168,7 +168,7 @@
public void testToShortString() {
// Test normal string
final String shortString = getComponentName().toShortString();
- assertEquals("{com.android.cts.stub/android.content.cts.ComponentNameTest}", shortString);
+ assertEquals("{com.android.cts.content/android.content.cts.ComponentNameTest}", shortString);
}
public void testGetClassName() {
@@ -196,7 +196,7 @@
ComponentName.writeToParcel(componentName, parcel);
parcel.setDataPosition(0);
assertFalse(0 == parcel.dataAvail());
- assertEquals("com.android.cts.stub", parcel.readString());
+ assertEquals("com.android.cts.content", parcel.readString());
assertEquals("android.content.cts.ComponentNameTest", parcel.readString());
// Test null data
diff --git a/tests/tests/content/src/android/content/cts/ContentProviderTest.java b/tests/tests/content/src/android/content/cts/ContentProviderTest.java
index 5ced37c..0b4d9aa 100644
--- a/tests/tests/content/src/android/content/cts/ContentProviderTest.java
+++ b/tests/tests/content/src/android/content/cts/ContentProviderTest.java
@@ -27,7 +27,7 @@
import android.os.ParcelFileDescriptor;
import android.test.AndroidTestCase;
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
import java.io.File;
import java.io.FileNotFoundException;
@@ -37,7 +37,7 @@
* Test {@link ContentProvider}.
*/
public class ContentProviderTest extends AndroidTestCase {
- private static final String TEST_PACKAGE_NAME = "com.android.cts.stub";
+ private static final String TEST_PACKAGE_NAME = "com.android.cts.content";
private static final String TEST_FILE_NAME = "testFile.tmp";
private static final String TEST_DB_NAME = "test.db";
diff --git a/tests/tests/content/src/android/content/cts/ContentQueryMapTest.java b/tests/tests/content/src/android/content/cts/ContentQueryMapTest.java
index ac23a5b..2385b0f 100644
--- a/tests/tests/content/src/android/content/cts/ContentQueryMapTest.java
+++ b/tests/tests/content/src/android/content/cts/ContentQueryMapTest.java
@@ -20,11 +20,13 @@
import android.content.ContentQueryMap;
import android.content.ContentResolver;
import android.content.ContentValues;
+import android.content.Context;
import android.database.Cursor;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
-import android.test.AndroidTestCase;
+import android.test.InstrumentationTestCase;
+import android.test.UiThreadTest;
import java.util.Map;
import java.util.Observable;
@@ -33,7 +35,7 @@
/**
* Test {@link ContentQueryMap}.
*/
-public class ContentQueryMapTest extends AndroidTestCase {
+public class ContentQueryMapTest extends InstrumentationTestCase {
private static final int TEST_TIME_OUT = 5000;
private static final String NAME0 = "name0";
@@ -52,10 +54,12 @@
private ContentResolver mResolver;
private Cursor mCursor;
private ContentQueryMap mContentQueryMap;
+ private Context mContext;
@Override
protected void setUp() throws Exception {
super.setUp();
+ mContext = getInstrumentation().getTargetContext();
mResolver = mContext.getContentResolver();
ContentValues values0 = new ContentValues();
@@ -88,6 +92,7 @@
super.tearDown();
}
+ @UiThreadTest
public void testConstructor() {
new ContentQueryMap(mCursor, DummyProvider.NAME, true, null);
@@ -106,6 +111,7 @@
}
}
+ @UiThreadTest
public void testGetRows() {
// handler can be null
mContentQueryMap = new ContentQueryMap(mCursor, DummyProvider.NAME, true, null);
diff --git a/tests/tests/content/src/android/content/cts/ContentResolverTest.java b/tests/tests/content/src/android/content/cts/ContentResolverTest.java
index 47371cc..4176da3 100644
--- a/tests/tests/content/src/android/content/cts/ContentResolverTest.java
+++ b/tests/tests/content/src/android/content/cts/ContentResolverTest.java
@@ -16,7 +16,7 @@
package android.content.cts;
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
import android.accounts.Account;
@@ -75,7 +75,7 @@
private static final int VALUE2 = 2;
private static final int VALUE3 = 3;
- private static final String TEST_PACKAGE_NAME = "com.android.cts.stub";
+ private static final String TEST_PACKAGE_NAME = "com.android.cts.content";
private Context mContext;
private ContentResolver mContentResolver;
diff --git a/tests/tests/content/src/android/content/cts/ContextTest.java b/tests/tests/content/src/android/content/cts/ContextTest.java
index 70abe1f..7c5dc50 100644
--- a/tests/tests/content/src/android/content/cts/ContextTest.java
+++ b/tests/tests/content/src/android/content/cts/ContextTest.java
@@ -16,7 +16,7 @@
package android.content.cts;
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
import com.android.internal.util.XmlUtils;
diff --git a/tests/src/android/content/cts/ContextWrapperStubActivity.java b/tests/tests/content/src/android/content/cts/ContextWrapperCtsActivity.java
similarity index 90%
rename from tests/src/android/content/cts/ContextWrapperStubActivity.java
rename to tests/tests/content/src/android/content/cts/ContextWrapperCtsActivity.java
index 977cedc..9ff4df9 100644
--- a/tests/src/android/content/cts/ContextWrapperStubActivity.java
+++ b/tests/tests/content/src/android/content/cts/ContextWrapperCtsActivity.java
@@ -21,9 +21,9 @@
import android.app.Activity;
import android.os.Bundle;
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
-public class ContextWrapperStubActivity extends Activity {
+public class ContextWrapperCtsActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
diff --git a/tests/tests/content/src/android/content/cts/ContextWrapperTest.java b/tests/tests/content/src/android/content/cts/ContextWrapperTest.java
index 59fae2f..e7b6ed7 100644
--- a/tests/tests/content/src/android/content/cts/ContextWrapperTest.java
+++ b/tests/tests/content/src/android/content/cts/ContextWrapperTest.java
@@ -16,7 +16,7 @@
package android.content.cts;
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
import android.content.ActivityNotFoundException;
@@ -79,8 +79,8 @@
private final static String MOCK_ACTION1 = ACTION_BROADCAST_TESTORDER + "1";
private final static String MOCK_ACTION2 = ACTION_BROADCAST_TESTORDER + "2";
- public static final String PERMISSION_GRANTED = "android.app.cts.permission.TEST_GRANTED";
- public static final String PERMISSION_DENIED = "android.app.cts.permission.TEST_DENIED";
+ public static final String PERMISSION_GRANTED = "android.content.cts.permission.TEST_GRANTED";
+ public static final String PERMISSION_DENIED = "android.content.cts.permission.TEST_DENIED";
private static final int BROADCAST_TIMEOUT = 10000;
@@ -402,7 +402,7 @@
}
public void testStartActivity() {
- Intent intent = new Intent(mContext, ContextWrapperStubActivity.class);
+ Intent intent = new Intent(mContext, ContextWrapperCtsActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
try {
mContextWrapper.startActivity(intent);
@@ -474,7 +474,7 @@
}
public void testGetPackageName() {
- assertEquals("com.android.cts.stub", mContextWrapper.getPackageName());
+ assertEquals("com.android.cts.content", mContextWrapper.getPackageName());
}
public void testGetCacheDir() {
diff --git a/tests/src/android/content/cts/DummyProvider.java b/tests/tests/content/src/android/content/cts/DummyProvider.java
similarity index 100%
rename from tests/src/android/content/cts/DummyProvider.java
rename to tests/tests/content/src/android/content/cts/DummyProvider.java
diff --git a/tests/src/android/content/cts/HighPriorityBroadcastReceiver.java b/tests/tests/content/src/android/content/cts/HighPriorityBroadcastReceiver.java
similarity index 100%
rename from tests/src/android/content/cts/HighPriorityBroadcastReceiver.java
rename to tests/tests/content/src/android/content/cts/HighPriorityBroadcastReceiver.java
diff --git a/tests/tests/content/src/android/content/cts/IntentFilterTest.java b/tests/tests/content/src/android/content/cts/IntentFilterTest.java
index d067b9e..d0e70f2 100644
--- a/tests/tests/content/src/android/content/cts/IntentFilterTest.java
+++ b/tests/tests/content/src/android/content/cts/IntentFilterTest.java
@@ -33,7 +33,6 @@
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;
-import android.app.cts.MockActivity;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Intent;
diff --git a/tests/tests/content/src/android/content/cts/IntentTest.java b/tests/tests/content/src/android/content/cts/IntentTest.java
index d7bf6f4..d4fac55 100644
--- a/tests/tests/content/src/android/content/cts/IntentTest.java
+++ b/tests/tests/content/src/android/content/cts/IntentTest.java
@@ -22,8 +22,6 @@
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
-import android.app.cts.MockActivity;
-import android.app.cts.MockReceiver;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
@@ -730,18 +728,18 @@
// Should only have one activity responding to narrow category
final ComponentName target = intent.resolveActivity(mPm);
assertEquals("com.android.cts.content", target.getPackageName());
- assertEquals("android.app.cts.MockActivity", target.getClassName());
+ assertEquals("android.content.cts.MockActivity", target.getClassName());
}
public void testResolveActivityShortcutMatch() {
final Intent intent = new Intent("com.android.cts.content.action.TEST_ACTION");
intent.setComponent(
- new ComponentName("com.android.cts.content", "android.app.cts.MockActivity2"));
+ new ComponentName("com.android.cts.content", "android.content.cts.MockActivity2"));
// Multiple activities match, but we asked for explicit component
final ComponentName target = intent.resolveActivity(mPm);
assertEquals("com.android.cts.content", target.getPackageName());
- assertEquals("android.app.cts.MockActivity2", target.getClassName());
+ assertEquals("android.content.cts.MockActivity2", target.getClassName());
}
public void testResolveActivityMultipleMatch() {
diff --git a/tests/tests/content/src/android/content/cts/Intent_ShortcutIconResourceTest.java b/tests/tests/content/src/android/content/cts/Intent_ShortcutIconResourceTest.java
index b38f3fc..062ef90 100644
--- a/tests/tests/content/src/android/content/cts/Intent_ShortcutIconResourceTest.java
+++ b/tests/tests/content/src/android/content/cts/Intent_ShortcutIconResourceTest.java
@@ -29,7 +29,7 @@
ShortcutIconResource mShortcutIconResource;
Context mContext;
- final int resourceId = com.android.cts.stub.R.string.notify;
+ final int resourceId = com.android.cts.content.R.string.notify;
@Override
protected void setUp() throws Exception {
@@ -63,7 +63,7 @@
public void testWriteToParcel() {
mShortcutIconResource = ShortcutIconResource.fromContext(mContext,
- com.android.cts.stub.R.string.notify);
+ com.android.cts.content.R.string.notify);
assertNotNull(mShortcutIconResource);
Parcel parce = Parcel.obtain();
mShortcutIconResource.writeToParcel(parce, 1);
diff --git a/tests/src/android/content/cts/LowPriorityBroadcastReceiver.java b/tests/tests/content/src/android/content/cts/LowPriorityBroadcastReceiver.java
similarity index 100%
rename from tests/src/android/content/cts/LowPriorityBroadcastReceiver.java
rename to tests/tests/content/src/android/content/cts/LowPriorityBroadcastReceiver.java
diff --git a/tests/src/android/content/cts/MockAccountAuthenticator.java b/tests/tests/content/src/android/content/cts/MockAccountAuthenticator.java
similarity index 100%
rename from tests/src/android/content/cts/MockAccountAuthenticator.java
rename to tests/tests/content/src/android/content/cts/MockAccountAuthenticator.java
diff --git a/tests/src/android/content/cts/MockAccountService.java b/tests/tests/content/src/android/content/cts/MockAccountService.java
similarity index 100%
rename from tests/src/android/content/cts/MockAccountService.java
rename to tests/tests/content/src/android/content/cts/MockAccountService.java
diff --git a/tests/src/android/widget/cts/StubActivity.java b/tests/tests/content/src/android/content/cts/MockActivity.java
similarity index 75%
copy from tests/src/android/widget/cts/StubActivity.java
copy to tests/tests/content/src/android/content/cts/MockActivity.java
index fe4002c..19834df 100644
--- a/tests/src/android/widget/cts/StubActivity.java
+++ b/tests/tests/content/src/android/content/cts/MockActivity.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009 The Android Open Source Project
+ * Copyright (C) 2008 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.
@@ -14,13 +14,10 @@
* limitations under the License.
*/
-package android.widget.cts;
+package android.content.cts;
import android.app.Activity;
-/**
- * Stub activity for helping test. It's an empty activity.
- */
-public class StubActivity extends Activity {
+public class MockActivity extends Activity {
}
diff --git a/tests/tests/content/src/android/content/cts/MockApplication.java b/tests/tests/content/src/android/content/cts/MockApplication.java
new file mode 100644
index 0000000..cca34d6
--- /dev/null
+++ b/tests/tests/content/src/android/content/cts/MockApplication.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2008 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.content.cts;
+
+import android.app.Application;
+import android.content.res.Configuration;
+
+
+public class MockApplication extends Application {
+
+ public boolean isOnCreateCalled;
+ public boolean isConstructorCalled;
+ public boolean isOnConfigurationChangedCalled;
+ public boolean isOnLowMemoryCalled;
+
+ public MockApplication() {
+ super();
+ isConstructorCalled = true;
+ }
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ isOnCreateCalled = true;
+ }
+
+ @Override
+ public void onTerminate() {
+ super.onTerminate();
+ // The documentation states that one cannot rely on this method being called. No need to
+ // test it here.
+ }
+
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ isOnConfigurationChangedCalled = true;
+ }
+
+ @Override
+ public void onLowMemory() {
+ super.onLowMemory();
+ isOnLowMemoryCalled = true;
+ }
+}
diff --git a/tests/src/android/content/cts/MockContentProvider.java b/tests/tests/content/src/android/content/cts/MockContentProvider.java
similarity index 100%
rename from tests/src/android/content/cts/MockContentProvider.java
rename to tests/tests/content/src/android/content/cts/MockContentProvider.java
diff --git a/tests/src/android/content/cts/MockContextWrapperService.java b/tests/tests/content/src/android/content/cts/MockContextWrapperService.java
similarity index 100%
rename from tests/src/android/content/cts/MockContextWrapperService.java
rename to tests/tests/content/src/android/content/cts/MockContextWrapperService.java
diff --git a/tests/src/android/content/cts/MockReceiver.java b/tests/tests/content/src/android/content/cts/MockReceiver.java
similarity index 100%
rename from tests/src/android/content/cts/MockReceiver.java
rename to tests/tests/content/src/android/content/cts/MockReceiver.java
diff --git a/tests/src/android/content/cts/MockReceiverAbort.java b/tests/tests/content/src/android/content/cts/MockReceiverAbort.java
similarity index 100%
rename from tests/src/android/content/cts/MockReceiverAbort.java
rename to tests/tests/content/src/android/content/cts/MockReceiverAbort.java
diff --git a/tests/src/android/content/cts/MockReceiverFirst.java b/tests/tests/content/src/android/content/cts/MockReceiverFirst.java
similarity index 100%
rename from tests/src/android/content/cts/MockReceiverFirst.java
rename to tests/tests/content/src/android/content/cts/MockReceiverFirst.java
diff --git a/tests/src/android/content/cts/MockRemoteContentProvider.java b/tests/tests/content/src/android/content/cts/MockRemoteContentProvider.java
similarity index 100%
rename from tests/src/android/content/cts/MockRemoteContentProvider.java
rename to tests/tests/content/src/android/content/cts/MockRemoteContentProvider.java
diff --git a/tests/src/android/content/cts/MockSRSProvider.java b/tests/tests/content/src/android/content/cts/MockSRSProvider.java
similarity index 100%
rename from tests/src/android/content/cts/MockSRSProvider.java
rename to tests/tests/content/src/android/content/cts/MockSRSProvider.java
diff --git a/tests/tests/content/src/android/content/cts/MockService.java b/tests/tests/content/src/android/content/cts/MockService.java
new file mode 100644
index 0000000..6726f8b
--- /dev/null
+++ b/tests/tests/content/src/android/content/cts/MockService.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2008 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.content.cts;
+
+import android.app.Service;
+import android.content.Intent;
+import android.os.Binder;
+import android.os.IBinder;
+
+public class MockService extends Service {
+ public static boolean result = false;
+ private final IBinder mBinder = new MockBinder();
+
+ public class MockBinder extends Binder {
+ MockService getService() {
+ return MockService.this;
+ }
+ }
+
+ /**
+ * set the result as true when service bind
+ */
+ @Override
+ public IBinder onBind(Intent intent) {
+ result = true;
+ return mBinder;
+ }
+
+ /**
+ * set the result as true when service start
+ */
+ @Override
+ public void onStart(Intent intent, int startId) {
+ super.onStart(intent, startId);
+ result = true;
+ }
+}
+
diff --git a/tests/src/android/content/cts/MockSyncAdapter.java b/tests/tests/content/src/android/content/cts/MockSyncAdapter.java
similarity index 100%
rename from tests/src/android/content/cts/MockSyncAdapter.java
rename to tests/tests/content/src/android/content/cts/MockSyncAdapter.java
diff --git a/tests/src/android/content/cts/MockSyncAdapterService.java b/tests/tests/content/src/android/content/cts/MockSyncAdapterService.java
similarity index 100%
rename from tests/src/android/content/cts/MockSyncAdapterService.java
rename to tests/tests/content/src/android/content/cts/MockSyncAdapterService.java
diff --git a/tests/tests/content/src/android/content/cts/MutableContextWrapperTest.java b/tests/tests/content/src/android/content/cts/MutableContextWrapperTest.java
index b81ca71..e7288af 100644
--- a/tests/tests/content/src/android/content/cts/MutableContextWrapperTest.java
+++ b/tests/tests/content/src/android/content/cts/MutableContextWrapperTest.java
@@ -16,12 +16,12 @@
package android.content.cts;
-import android.app.cts.MockActivity;
import android.content.Context;
import android.content.MutableContextWrapper;
-import android.test.AndroidTestCase;
+import android.test.InstrumentationTestCase;
+import android.test.UiThreadTest;
-public class MutableContextWrapperTest extends AndroidTestCase {
+public class MutableContextWrapperTest extends InstrumentationTestCase {
MutableContextWrapper mMutableContextWrapper;
Context mContext;
@@ -30,7 +30,7 @@
protected void setUp() throws Exception {
super.setUp();
mMutableContextWrapper = null;
- mContext = getContext();
+ mContext = getInstrumentation().getTargetContext();
}
public void testConstructor() {
@@ -39,6 +39,7 @@
assertNotNull(mMutableContextWrapper);
}
+ @UiThreadTest
public void testSetBaseContext() {
mMutableContextWrapper = new MutableContextWrapper(mContext);
assertTrue(mContext.equals(mMutableContextWrapper.getBaseContext()));
diff --git a/tests/src/android/content/cts/ResultReceiver.java b/tests/tests/content/src/android/content/cts/ResultReceiver.java
similarity index 100%
rename from tests/src/android/content/cts/ResultReceiver.java
rename to tests/tests/content/src/android/content/cts/ResultReceiver.java
diff --git a/tests/tests/content/src/android/content/cts/SharedPreferencesTest.java b/tests/tests/content/src/android/content/cts/SharedPreferencesTest.java
index 2354926..c271483 100644
--- a/tests/tests/content/src/android/content/cts/SharedPreferencesTest.java
+++ b/tests/tests/content/src/android/content/cts/SharedPreferencesTest.java
@@ -54,8 +54,8 @@
// Duplicated from ContextImpl.java. Not ideal, but there wasn't a better
// way to reach into Context{Wrapper,Impl} to ask where this file lives.
- mPrefsFile = new File("/data/data/com.android.cts.stub/shared_prefs",
- "com.android.cts.stub_preferences.xml");
+ mPrefsFile = new File("/data/data/com.android.cts.content/shared_prefs",
+ "com.android.cts.content_preferences.xml");
mPrefsFile.delete();
}
diff --git a/tests/tests/content/src/android/content/pm/cts/ActivityInfoTest.java b/tests/tests/content/src/android/content/pm/cts/ActivityInfoTest.java
index 6c1ae40..caabdb4 100644
--- a/tests/tests/content/src/android/content/pm/cts/ActivityInfoTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/ActivityInfoTest.java
@@ -17,7 +17,7 @@
package android.content.pm.cts;
-import android.app.cts.MockActivity;
+import android.content.cts.MockActivity;
import android.content.ComponentName;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
diff --git a/tests/tests/content/src/android/content/pm/cts/ApplicationInfoTest.java b/tests/tests/content/src/android/content/pm/cts/ApplicationInfoTest.java
index 3055e57..1e9f5a2 100644
--- a/tests/tests/content/src/android/content/pm/cts/ApplicationInfoTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/ApplicationInfoTest.java
@@ -16,7 +16,7 @@
package android.content.pm.cts;
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
import android.content.pm.ApplicationInfo;
diff --git a/tests/tests/content/src/android/content/pm/cts/ApplicationInfo_DisplayNameComparatorTest.java b/tests/tests/content/src/android/content/pm/cts/ApplicationInfo_DisplayNameComparatorTest.java
index ebd75cc..211a2ca 100644
--- a/tests/tests/content/src/android/content/pm/cts/ApplicationInfo_DisplayNameComparatorTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/ApplicationInfo_DisplayNameComparatorTest.java
@@ -26,7 +26,7 @@
* Test {@link DisplayNameComparator}.
*/
public class ApplicationInfo_DisplayNameComparatorTest extends AndroidTestCase {
- private static final String PACKAGE_NAME = "com.android.cts.stub";
+ private static final String PACKAGE_NAME = "com.android.cts.content";
DisplayNameComparator mDisplayNameComparator;
@Override
diff --git a/tests/tests/content/src/android/content/pm/cts/ComponentInfoTest.java b/tests/tests/content/src/android/content/pm/cts/ComponentInfoTest.java
index 7850e1e..361bfe4 100644
--- a/tests/tests/content/src/android/content/pm/cts/ComponentInfoTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/ComponentInfoTest.java
@@ -26,16 +26,15 @@
import android.test.AndroidTestCase;
import android.util.Printer;
import android.util.StringBuilderPrinter;
-import android.widget.cts.WidgetTestUtils;
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
/**
* Test {@link ComponentInfo}.
*/
public class ComponentInfoTest extends AndroidTestCase {
- private final String PACKAGE_NAME = "com.android.cts.stub";
+ private final String PACKAGE_NAME = "com.android.cts.content";
private ComponentInfo mComponentInfo;
public void testConstructor() {
diff --git a/tests/tests/content/src/android/content/pm/cts/InstrumentationInfoTest.java b/tests/tests/content/src/android/content/pm/cts/InstrumentationInfoTest.java
index 4656949..5b7747d 100644
--- a/tests/tests/content/src/android/content/pm/cts/InstrumentationInfoTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/InstrumentationInfoTest.java
@@ -25,7 +25,7 @@
import android.test.AndroidTestCase;
public class InstrumentationInfoTest extends AndroidTestCase {
- private static final String PACKAGE_NAME = "com.android.cts.stub";
+ private static final String PACKAGE_NAME = "com.android.cts.content";
private static final String INSTRUMENTATION_NAME =
"android.content.pm.cts.TestPmInstrumentation";
diff --git a/tests/tests/content/src/android/content/pm/cts/PackageInfoTest.java b/tests/tests/content/src/android/content/pm/cts/PackageInfoTest.java
index cefe1a6..0540e0b 100644
--- a/tests/tests/content/src/android/content/pm/cts/PackageInfoTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/PackageInfoTest.java
@@ -32,7 +32,7 @@
private PackageManager mPackageManager;
private PackageInfo mPackageInfo;
private PackageInfo mPackageInfoCmp;
- private static final String PACKAGE_NAME = "com.android.cts.stub";
+ private static final String PACKAGE_NAME = "com.android.cts.content";
@Override
protected void setUp() throws Exception {
diff --git a/tests/tests/content/src/android/content/pm/cts/PackageItemInfoTest.java b/tests/tests/content/src/android/content/pm/cts/PackageItemInfoTest.java
index d3372c6..53e69da 100644
--- a/tests/tests/content/src/android/content/pm/cts/PackageItemInfoTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/PackageItemInfoTest.java
@@ -16,7 +16,7 @@
package android.content.pm.cts;
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
import android.content.ComponentName;
@@ -30,7 +30,7 @@
import android.util.Printer;
public class PackageItemInfoTest extends AndroidTestCase {
- private static final String PACKAGE_NAME = "com.android.cts.stub";
+ private static final String PACKAGE_NAME = "com.android.cts.content";
private static final String ACTIVITY_NAME = "android.content.pm.cts.TestPmActivity";
private static final String METADATA_NAME = "android.content.pm.cts.xmltest";
private PackageManager mPackageManager;
diff --git a/tests/tests/content/src/android/content/pm/cts/PackageItemInfo_DisplayNameComparatorTest.java b/tests/tests/content/src/android/content/pm/cts/PackageItemInfo_DisplayNameComparatorTest.java
index f332d6e..0cfd1dd 100644
--- a/tests/tests/content/src/android/content/pm/cts/PackageItemInfo_DisplayNameComparatorTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/PackageItemInfo_DisplayNameComparatorTest.java
@@ -26,7 +26,7 @@
import android.test.AndroidTestCase;
public class PackageItemInfo_DisplayNameComparatorTest extends AndroidTestCase {
- private static final String PACKAGE_NAME = "com.android.cts.stub";
+ private static final String PACKAGE_NAME = "com.android.cts.content";
private static final String ACTIVITY_NAME = "android.content.pm.cts.TestPmActivity";
private static final String CMPACTIVITY_NAME = "android.content.pm.cts.TestPmCompare";
diff --git a/tests/tests/content/src/android/content/pm/cts/PackageManagerTest.java b/tests/tests/content/src/android/content/pm/cts/PackageManagerTest.java
index d1e1252..aaab8c4 100644
--- a/tests/tests/content/src/android/content/pm/cts/PackageManagerTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/PackageManagerTest.java
@@ -16,7 +16,7 @@
package android.content.pm.cts;
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
import android.content.ComponentName;
@@ -44,7 +44,7 @@
*/
public class PackageManagerTest extends AndroidTestCase {
private PackageManager mPackageManager;
- private static final String PACKAGE_NAME = "com.android.cts.stub";
+ private static final String PACKAGE_NAME = "com.android.cts.content";
private static final String CONTENT_PKG_NAME = "com.android.cts.content";
private static final String ACTIVITY_ACTION_NAME = "android.intent.action.PMTEST";
private static final String MAIN_ACTION_NAME = "android.intent.action.MAIN";
@@ -395,7 +395,7 @@
public void testOpPermission() {
PermissionInfo permissionInfo = new PermissionInfo();
- String permissionName = "com.android.cts.stub.permission.TEST_DYNAMIC.ADD";
+ String permissionName = "com.android.cts.content.permission.TEST_DYNAMIC.ADD";
permissionInfo.name = permissionName;
permissionInfo.labelRes = R.string.permlab_testDynamic;
permissionInfo.nonLocalizedLabel = "Test Tree";
@@ -450,7 +450,7 @@
public void testGetResources() throws NameNotFoundException {
ComponentName componentName = new ComponentName(PACKAGE_NAME, ACTIVITY_NAME);
int resourceId = R.xml.pm_test;
- String xmlName = "com.android.cts.stub:xml/pm_test";
+ String xmlName = "com.android.cts.content:xml/pm_test";
ApplicationInfo appInfo = mPackageManager.getApplicationInfo(PACKAGE_NAME, 0);
assertNotNull(mPackageManager.getXml(PACKAGE_NAME, resourceId, appInfo));
assertEquals(xmlName, mPackageManager.getResourcesForActivity(componentName)
diff --git a/tests/tests/content/src/android/content/pm/cts/PackageStatsTest.java b/tests/tests/content/src/android/content/pm/cts/PackageStatsTest.java
index dca51e9..6425209 100644
--- a/tests/tests/content/src/android/content/pm/cts/PackageStatsTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/PackageStatsTest.java
@@ -22,7 +22,7 @@
import android.test.AndroidTestCase;
public class PackageStatsTest extends AndroidTestCase {
- private static final String PACKAGE_NAME = "com.android.cts.stub";
+ private static final String PACKAGE_NAME = "com.android.cts.content";
public void testPackageStats() {
// Set mock data to make sure the functionality of constructor
diff --git a/tests/tests/content/src/android/content/pm/cts/ProviderInfoTest.java b/tests/tests/content/src/android/content/pm/cts/ProviderInfoTest.java
index c585568..6256a69 100644
--- a/tests/tests/content/src/android/content/pm/cts/ProviderInfoTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/ProviderInfoTest.java
@@ -28,7 +28,7 @@
import java.util.List;
public class ProviderInfoTest extends AndroidTestCase {
- private static final String PACKAGE_NAME = "com.android.cts.stub";
+ private static final String PACKAGE_NAME = "com.android.cts.content";
private static final String PROVIDER_NAME = "android.content.cts.MockContentProvider";
public void testProviderInfo() throws NameNotFoundException {
diff --git a/tests/tests/content/src/android/content/pm/cts/ResolveInfoTest.java b/tests/tests/content/src/android/content/pm/cts/ResolveInfoTest.java
index 3501e86..af3f161 100644
--- a/tests/tests/content/src/android/content/pm/cts/ResolveInfoTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/ResolveInfoTest.java
@@ -26,7 +26,7 @@
import android.util.Printer;
public class ResolveInfoTest extends AndroidTestCase {
- private static final String PACKAGE_NAME = "com.android.cts.stub";
+ private static final String PACKAGE_NAME = "com.android.cts.content";
private static final String MAIN_ACTION_NAME = "android.intent.action.MAIN";
private static final String ACTIVITY_NAME = "android.content.pm.cts.TestPmActivity";
private static final String SERVICE_NAME = "android.content.pm.cts.activity.PMTEST_SERVICE";
diff --git a/tests/tests/content/src/android/content/pm/cts/ServiceInfoTest.java b/tests/tests/content/src/android/content/pm/cts/ServiceInfoTest.java
index 8508c15..297ab69 100644
--- a/tests/tests/content/src/android/content/pm/cts/ServiceInfoTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/ServiceInfoTest.java
@@ -25,7 +25,7 @@
import android.test.AndroidTestCase;
public class ServiceInfoTest extends AndroidTestCase {
- private static final String PACKAGE_NAME = "com.android.cts.stub";
+ private static final String PACKAGE_NAME = "com.android.cts.content";
private static final String SERVICE_NAME = "android.content.pm.cts.TestPmService";
public void testServiceInfo() throws NameNotFoundException {
diff --git a/tests/tests/content/src/android/content/pm/cts/WidgetTestUtils.java b/tests/tests/content/src/android/content/pm/cts/WidgetTestUtils.java
new file mode 100644
index 0000000..6efd8b1
--- /dev/null
+++ b/tests/tests/content/src/android/content/pm/cts/WidgetTestUtils.java
@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) 2008 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.content.pm.cts;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+
+import java.io.IOException;
+
+import junit.framework.Assert;
+
+/**
+ * The useful methods for widget test.
+ */
+public class WidgetTestUtils {
+ /**
+ * Assert that two bitmaps are equal.
+ *
+ * @param Bitmap b1 the first bitmap which needs to compare.
+ * @param Bitmap b2 the second bitmap which needs to compare.
+ */
+ public static void assertEquals(Bitmap b1, Bitmap b2) {
+ if (b1 == b2) {
+ return;
+ }
+
+ if (b1 == null || b2 == null) {
+ Assert.fail("the bitmaps are not equal");
+ }
+
+ // b1 and b2 are all not null.
+ if (b1.getWidth() != b2.getWidth() || b1.getHeight() != b2.getHeight()
+ || b1.getConfig() != b2.getConfig()) {
+ Assert.fail("the bitmaps are not equal");
+ }
+
+ int w = b1.getWidth();
+ int h = b1.getHeight();
+ int s = w * h;
+ int[] pixels1 = new int[s];
+ int[] pixels2 = new int[s];
+
+ b1.getPixels(pixels1, 0, w, 0, 0, w, h);
+ b2.getPixels(pixels2, 0, w, 0, 0, w, h);
+
+ for (int i = 0; i < s; i++) {
+ if (pixels1[i] != pixels2[i]) {
+ Assert.fail("the bitmaps are not equal");
+ }
+ }
+ }
+
+ /**
+ * Find beginning of the special element.
+ * @param parser XmlPullParser will be parsed.
+ * @param firstElementName the target element name.
+ *
+ * @throws XmlPullParserException if XML Pull Parser related faults occur.
+ * @throws IOException if I/O-related error occur when parsing.
+ */
+ public static final void beginDocument(XmlPullParser parser, String firstElementName)
+ throws XmlPullParserException, IOException {
+ Assert.assertNotNull(parser);
+ Assert.assertNotNull(firstElementName);
+
+ int type;
+ while ((type = parser.next()) != XmlPullParser.START_TAG
+ && type != XmlPullParser.END_DOCUMENT) {
+ ;
+ }
+
+ if (!parser.getName().equals(firstElementName)) {
+ throw new XmlPullParserException("Unexpected start tag: found " + parser.getName()
+ + ", expected " + firstElementName);
+ }
+ }
+
+ /**
+ * Compare the expected pixels with actual, scaling for the target context density
+ *
+ * @throws AssertionFailedError
+ */
+ public static void assertScaledPixels(int expected, int actual, Context context) {
+ Assert.assertEquals(expected * context.getResources().getDisplayMetrics().density,
+ actual, 3);
+ }
+
+ /** Converts dips into pixels using the {@link Context}'s density. */
+ public static int convertDipToPixels(Context context, int dip) {
+ float density = context.getResources().getDisplayMetrics().density;
+ return Math.round(density * dip);
+ }
+
+ /**
+ * Retrieve a bitmap that can be used for comparison on any density
+ * @param resources
+ * @return the {@link Bitmap} or <code>null</code>
+ */
+ public static Bitmap getUnscaledBitmap(Resources resources, int resId) {
+ BitmapFactory.Options options = new BitmapFactory.Options();
+ options.inScaled = false;
+ return BitmapFactory.decodeResource(resources, resId, options);
+ }
+
+ /**
+ * Retrieve a dithered bitmap that can be used for comparison on any density
+ * @param resources
+ * @param config the preferred config for the returning bitmap
+ * @return the {@link Bitmap} or <code>null</code>
+ */
+ public static Bitmap getUnscaledAndDitheredBitmap(Resources resources,
+ int resId, Bitmap.Config config) {
+ BitmapFactory.Options options = new BitmapFactory.Options();
+ options.inDither = true;
+ options.inScaled = false;
+ options.inPreferredConfig = config;
+ return BitmapFactory.decodeResource(resources, resId, options);
+ }
+}
diff --git a/tests/tests/content/src/android/content/res/cts/ArrayTest.java b/tests/tests/content/src/android/content/res/cts/ArrayTest.java
index 1b1fcdf..909fbf6 100644
--- a/tests/tests/content/src/android/content/res/cts/ArrayTest.java
+++ b/tests/tests/content/src/android/content/res/cts/ArrayTest.java
@@ -20,7 +20,7 @@
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
public class ArrayTest extends AndroidTestCase {
private Resources mResources;
diff --git a/tests/tests/content/src/android/content/res/cts/AssetManagerTest.java b/tests/tests/content/src/android/content/res/cts/AssetManagerTest.java
index cbf20ec..2870fee 100644
--- a/tests/tests/content/src/android/content/res/cts/AssetManagerTest.java
+++ b/tests/tests/content/src/android/content/res/cts/AssetManagerTest.java
@@ -30,7 +30,7 @@
import android.test.AndroidTestCase;
import android.util.TypedValue;
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
import com.android.internal.util.XmlUtils;
diff --git a/tests/tests/content/src/android/content/res/cts/ColorStateListTest.java b/tests/tests/content/src/android/content/res/cts/ColorStateListTest.java
index cd1ac8b..88f5798 100644
--- a/tests/tests/content/src/android/content/res/cts/ColorStateListTest.java
+++ b/tests/tests/content/src/android/content/res/cts/ColorStateListTest.java
@@ -27,7 +27,7 @@
import android.os.Parcel;
import android.test.AndroidTestCase;
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
public class ColorStateListTest extends AndroidTestCase {
diff --git a/tests/tests/content/src/android/content/res/cts/ConfigTest.java b/tests/tests/content/src/android/content/res/cts/ConfigTest.java
index bfc7887..0b94b6f 100644
--- a/tests/tests/content/src/android/content/res/cts/ConfigTest.java
+++ b/tests/tests/content/src/android/content/res/cts/ConfigTest.java
@@ -31,7 +31,7 @@
import android.util.DisplayMetrics;
import android.util.Log;
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
public class ConfigTest extends AndroidTestCase {
enum Properties {
diff --git a/tests/tests/content/src/android/content/res/cts/FractionTest.java b/tests/tests/content/src/android/content/res/cts/FractionTest.java
index 9fa896c..2c3e797 100644
--- a/tests/tests/content/src/android/content/res/cts/FractionTest.java
+++ b/tests/tests/content/src/android/content/res/cts/FractionTest.java
@@ -20,7 +20,7 @@
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
import android.util.TypedValue;
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
public class FractionTest extends AndroidTestCase {
diff --git a/tests/tests/content/src/android/content/res/cts/PluralResourcesTest.java b/tests/tests/content/src/android/content/res/cts/PluralResourcesTest.java
index 074d10a..1fd204d 100644
--- a/tests/tests/content/src/android/content/res/cts/PluralResourcesTest.java
+++ b/tests/tests/content/src/android/content/res/cts/PluralResourcesTest.java
@@ -25,7 +25,7 @@
import android.test.suitebuilder.annotation.SmallTest;
import android.util.Log;
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
public class PluralResourcesTest extends AndroidTestCase {
public static boolean DEBUG = false;
diff --git a/tests/tests/content/src/android/content/res/cts/PrimitiveTest.java b/tests/tests/content/src/android/content/res/cts/PrimitiveTest.java
index c7da6d8..8eeb086 100644
--- a/tests/tests/content/src/android/content/res/cts/PrimitiveTest.java
+++ b/tests/tests/content/src/android/content/res/cts/PrimitiveTest.java
@@ -21,7 +21,7 @@
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
import android.util.TypedValue;
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
public class PrimitiveTest extends AndroidTestCase {
private Resources mResources;
diff --git a/tests/tests/content/src/android/content/res/cts/RawResourceTest.java b/tests/tests/content/src/android/content/res/cts/RawResourceTest.java
index 9c8dae0..c92efc7 100644
--- a/tests/tests/content/src/android/content/res/cts/RawResourceTest.java
+++ b/tests/tests/content/src/android/content/res/cts/RawResourceTest.java
@@ -19,7 +19,7 @@
import android.content.res.Resources;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
import java.io.IOException;
import java.io.InputStream;
diff --git a/tests/tests/content/src/android/content/res/cts/ResourceNameTest.java b/tests/tests/content/src/android/content/res/cts/ResourceNameTest.java
index eacf00d..a7cc03b 100644
--- a/tests/tests/content/src/android/content/res/cts/ResourceNameTest.java
+++ b/tests/tests/content/src/android/content/res/cts/ResourceNameTest.java
@@ -20,7 +20,7 @@
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
public class ResourceNameTest extends AndroidTestCase {
@@ -29,10 +29,10 @@
final Resources res = mContext.getResources();
final String fullName = res.getResourceName(R.configVarying.simple);
- assertEquals("com.android.cts.stub:configVarying/simple", fullName);
+ assertEquals("com.android.cts.content:configVarying/simple", fullName);
final String packageName = res.getResourcePackageName(R.configVarying.simple);
- assertEquals("com.android.cts.stub", packageName);
+ assertEquals("com.android.cts.content", packageName);
final String typeName = res.getResourceTypeName(R.configVarying.simple);
assertEquals("configVarying", typeName);
@@ -45,16 +45,16 @@
public void testGetResourceIdentifier() {
final Resources res = mContext.getResources();
int resid = res.getIdentifier(
- "com.android.cts.stub:configVarying/simple",
+ "com.android.cts.content:configVarying/simple",
null, null);
assertEquals(R.configVarying.simple, resid);
resid = res.getIdentifier("configVarying/simple", null,
- "com.android.cts.stub");
+ "com.android.cts.content");
assertEquals(R.configVarying.simple, resid);
resid = res.getIdentifier("simple", "configVarying",
- "com.android.cts.stub");
+ "com.android.cts.content");
assertEquals(R.configVarying.simple, resid);
}
}
diff --git a/tests/tests/content/src/android/content/res/cts/ResourcesTest.java b/tests/tests/content/src/android/content/res/cts/ResourcesTest.java
index 058076c..88caa6f 100644
--- a/tests/tests/content/src/android/content/res/cts/ResourcesTest.java
+++ b/tests/tests/content/src/android/content/res/cts/ResourcesTest.java
@@ -16,7 +16,7 @@
package android.content.res.cts;
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
import com.android.internal.util.XmlUtils;
@@ -49,9 +49,9 @@
private static final String CONFIG_VARYING = "configVarying";
private static final String SIMPLE = "simple";
private static final String CONFIG_VARYING_SIMPLE = "configVarying/simple";
- private static final String PACKAGE_NAME = "com.android.cts.stub";
+ private static final String PACKAGE_NAME = "com.android.cts.content";
private static final String COM_ANDROID_CTS_STUB_IDENTIFIER =
- "com.android.cts.stub:configVarying/simple";
+ "com.android.cts.content:configVarying/simple";
private Resources mResources;
@Override
@@ -320,7 +320,7 @@
//expected
}
- mResources.getValue("com.android.cts.stub:raw/text", tv, false);
+ mResources.getValue("com.android.cts.content:raw/text", tv, false);
assertNotNull(tv);
assertEquals("res/raw/text.txt", tv.coerceToString());
}
diff --git a/tests/tests/content/src/android/content/res/cts/Resources_ThemeTest.java b/tests/tests/content/src/android/content/res/cts/Resources_ThemeTest.java
index 4a4991f..349cb47 100644
--- a/tests/tests/content/src/android/content/res/cts/Resources_ThemeTest.java
+++ b/tests/tests/content/src/android/content/res/cts/Resources_ThemeTest.java
@@ -26,7 +26,7 @@
import android.util.TypedValue;
import android.util.Xml;
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
public class Resources_ThemeTest extends AndroidTestCase {
diff --git a/tests/tests/content/src/android/content/res/cts/TypedArrayTest.java b/tests/tests/content/src/android/content/res/cts/TypedArrayTest.java
index c51405a..cc6c5ec 100644
--- a/tests/tests/content/src/android/content/res/cts/TypedArrayTest.java
+++ b/tests/tests/content/src/android/content/res/cts/TypedArrayTest.java
@@ -27,7 +27,7 @@
import android.util.TypedValue;
import android.view.ContextThemeWrapper;
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
import com.android.internal.util.XmlUtils;
diff --git a/tests/tests/drm/Android.mk b/tests/tests/drm/Android.mk
index 9404f4b..74422a0 100644
--- a/tests/tests/drm/Android.mk
+++ b/tests/tests/drm/Android.mk
@@ -27,8 +27,6 @@
LOCAL_PACKAGE_NAME := CtsDrmTestCases
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
-
LOCAL_JNI_SHARED_LIBRARIES := \
libctsdrm_jni \
libdrmtestplugin
diff --git a/tests/tests/drm/AndroidManifest.xml b/tests/tests/drm/AndroidManifest.xml
index dd70f02..527d498 100644
--- a/tests/tests/drm/AndroidManifest.xml
+++ b/tests/tests/drm/AndroidManifest.xml
@@ -23,7 +23,7 @@
</application>
<instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
- android:targetPackage="com.android.cts.stub"
+ android:targetPackage="com.android.cts.drm"
android:label="CTS tests of android.drm">
<meta-data android:name="listener"
android:value="com.android.cts.runner.CtsTestRunListener" />
diff --git a/tests/tests/graphics/AndroidManifest.xml b/tests/tests/graphics/AndroidManifest.xml
index 1a1e3e6..0006634 100644
--- a/tests/tests/graphics/AndroidManifest.xml
+++ b/tests/tests/graphics/AndroidManifest.xml
@@ -19,6 +19,7 @@
package="com.android.cts.graphics">
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application>
<uses-library android:name="android.test.runner" />
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_render_order_1_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_render_order_1_golden.png
index ea3be94..2fca8eb 100644
--- a/tests/tests/graphics/res/drawable-nodpi/vector_icon_render_order_1_golden.png
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_render_order_1_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_6_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_6_golden.png
index 64d07fa..3da7969 100644
--- a/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_6_golden.png
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_6_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/vector_icon_render_order_1.xml b/tests/tests/graphics/res/drawable/vector_icon_render_order_1.xml
index 8639096..d4472e2 100644
--- a/tests/tests/graphics/res/drawable/vector_icon_render_order_1.xml
+++ b/tests/tests/graphics/res/drawable/vector_icon_render_order_1.xml
@@ -21,65 +21,65 @@
<group
android:name="FirstLevelGroup"
- android:alpha="0.9"
android:translateX="100.0"
android:translateY="0.0" >
<path
android:fillColor="#FFFF0000"
+ android:fillAlpha="0.9"
android:pathData="@string/rectangle200" />
<group
android:name="SecondLevelGroup1"
- android:alpha="0.9"
android:translateX="-100.0"
android:translateY="50.0" >
<path
android:fillColor="#FF00FF00"
+ android:fillAlpha="0.81"
android:pathData="@string/rectangle200" />
<group
android:name="ThridLevelGroup1"
- android:alpha="0.9"
android:translateX="-100.0"
android:translateY="50.0" >
<path
android:fillColor="#FF0000FF"
+ android:fillAlpha="0.729"
android:pathData="@string/rectangle200" />
</group>
<group
android:name="ThridLevelGroup2"
- android:alpha="0.8"
android:translateX="100.0"
android:translateY="50.0" >
<path
+ android:fillAlpha="0.72"
android:fillColor="#FF000000"
android:pathData="@string/rectangle200" />
</group>
</group>
<group
android:name="SecondLevelGroup2"
- android:alpha="0.8"
android:translateX="100.0"
android:translateY="50.0" >
<path
android:fillColor="#FF0000FF"
+ android:fillAlpha="0.72"
android:pathData="@string/rectangle200" />
<group
android:name="ThridLevelGroup3"
- android:alpha="0.9"
android:translateX="-100.0"
android:translateY="50.0" >
<path
+ android:fillAlpha="0.648"
android:fillColor="#FFFF0000"
android:pathData="@string/rectangle200" />
</group>
<group
android:name="ThridLevelGroup4"
- android:alpha="0.8"
android:translateX="100.0"
android:translateY="50.0" >
<path
+ android:fillAlpha="0.576"
android:fillColor="#FF00FF00"
android:pathData="@string/rectangle200" />
</group>
diff --git a/tests/tests/graphics/res/drawable/vector_icon_render_order_2.xml b/tests/tests/graphics/res/drawable/vector_icon_render_order_2.xml
index 069a531..6fcb355 100644
--- a/tests/tests/graphics/res/drawable/vector_icon_render_order_2.xml
+++ b/tests/tests/graphics/res/drawable/vector_icon_render_order_2.xml
@@ -21,67 +21,67 @@
<group
android:name="FirstLevelGroup"
- android:alpha="0.9"
android:translateX="100.0"
android:translateY="0.0" >
<group
android:name="SecondLevelGroup1"
- android:alpha="0.9"
android:translateX="-100.0"
android:translateY="50.0" >
<path
+ android:fillAlpha="0.81"
android:fillColor="#FF00FF00"
android:pathData="@string/rectangle200" />
<group
android:name="ThridLevelGroup1"
- android:alpha="0.9"
android:translateX="-100.0"
android:translateY="50.0" >
<path
+ android:fillAlpha="0.729"
android:fillColor="#FF0000FF"
android:pathData="@string/rectangle200" />
</group>
<group
android:name="ThridLevelGroup2"
- android:alpha="0.8"
android:translateX="100.0"
android:translateY="50.0" >
<path
+ android:fillAlpha="0.648"
android:fillColor="#FF000000"
android:pathData="@string/rectangle200" />
</group>
</group>
<group
android:name="SecondLevelGroup2"
- android:alpha="0.8"
android:translateX="100.0"
android:translateY="50.0" >
<path
+ android:fillAlpha="0.72"
android:fillColor="#FF0000FF"
android:pathData="@string/rectangle200" />
<group
android:name="ThridLevelGroup3"
- android:alpha="0.9"
android:translateX="-100.0"
android:translateY="50.0" >
<path
+ android:fillAlpha="0.648"
android:fillColor="#FFFF0000"
android:pathData="@string/rectangle200" />
</group>
<group
android:name="ThridLevelGroup4"
- android:alpha="0.8"
android:translateX="100.0"
android:translateY="50.0" >
<path
+ android:fillAlpha="0.576"
android:fillColor="#FF00FF00"
android:pathData="@string/rectangle200" />
</group>
</group>
<path
+ android:fillAlpha="0.9"
android:fillColor="#FFFF0000"
android:pathData="@string/rectangle200" />
</group>
diff --git a/tests/tests/graphics/res/drawable/vector_icon_transformation_6.xml b/tests/tests/graphics/res/drawable/vector_icon_transformation_6.xml
index 5e60c4a..2c174fb 100644
--- a/tests/tests/graphics/res/drawable/vector_icon_transformation_6.xml
+++ b/tests/tests/graphics/res/drawable/vector_icon_transformation_6.xml
@@ -17,10 +17,10 @@
android:height="64dp"
android:width="64dp"
android:viewportHeight="400"
- android:viewportWidth="400" >
-
- <group android:name="backgroundGroup"
+ android:viewportWidth="400"
android:alpha = "0.5" >
+
+ <group android:name="backgroundGroup">
<path
android:name="background1"
android:fillColor="#FF000000"
@@ -33,8 +33,7 @@
<group
android:name="translateToCenterGroup"
android:translateX="50.0"
- android:translateY="90.0"
- android:alpha = "0.5" >
+ android:translateY="90.0">
<path
android:name="twoLines"
android:pathData="M 0,0 v 100 M 0,0 h 100"
@@ -45,39 +44,39 @@
android:name="rotationGroup"
android:pivotX="0.0"
android:pivotY="0.0"
- android:rotation="-45.0"
- android:alpha = "0.5" >
+ android:rotation="-45.0" >
<path
android:name="twoLines1"
android:pathData="M 0,0 v 100 M 0,0 h 100"
android:strokeColor="#FF00FF00"
- android:strokeWidth="20" />
+ android:strokeWidth="20"
+ android:strokeAlpha="0.5" />
<group
android:name="translateGroup"
android:translateX="130.0"
- android:translateY="160.0"
- android:alpha = "0.5">
+ android:translateY="160.0">
<group android:name="scaleGroup" >
<path
android:name="twoLines3"
android:pathData="M 0,0 v 100 M 0,0 h 100"
android:strokeColor="#FF0000FF"
- android:strokeWidth="20" />
+ android:strokeWidth="20"
+ android:strokeAlpha="0.25" />
</group>
</group>
<group
android:name="translateGroupHalf"
android:translateX="65.0"
- android:translateY="80.0"
- android:alpha = "0.5">
+ android:translateY="80.0">
<group android:name="scaleGroup" >
<path
android:name="twoLines2"
android:pathData="M 0,0 v 100 M 0,0 h 100"
android:strokeColor="#FF0000FF"
- android:strokeWidth="20" />
+ android:strokeWidth="20"
+ android:strokeAlpha="0.5" />
</group>
</group>
</group>
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/VectorDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/VectorDrawableTest.java
index 323a2a7..3578d3c 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/VectorDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/VectorDrawableTest.java
@@ -57,6 +57,9 @@
R.drawable.vector_icon_transformation_3,
R.drawable.vector_icon_transformation_4,
R.drawable.vector_icon_transformation_5,
+ R.drawable.vector_icon_transformation_6,
+ R.drawable.vector_icon_render_order_1,
+ R.drawable.vector_icon_render_order_2,
R.drawable.vector_icon_stroke_1,
R.drawable.vector_icon_stroke_2,
R.drawable.vector_icon_stroke_3,
@@ -80,6 +83,9 @@
R.drawable.vector_icon_transformation_3_golden,
R.drawable.vector_icon_transformation_4_golden,
R.drawable.vector_icon_transformation_5_golden,
+ R.drawable.vector_icon_transformation_6_golden,
+ R.drawable.vector_icon_render_order_1_golden,
+ R.drawable.vector_icon_render_order_2_golden,
R.drawable.vector_icon_stroke_1_golden,
R.drawable.vector_icon_stroke_2_golden,
R.drawable.vector_icon_stroke_3_golden,
diff --git a/tests/tests/hardware/Android.mk b/tests/tests/hardware/Android.mk
index dec0d5d..e5203e5 100644
--- a/tests/tests/hardware/Android.mk
+++ b/tests/tests/hardware/Android.mk
@@ -29,6 +29,7 @@
src/android/hardware/cts/SensorTestCase.java \
src/android/hardware/cts/SingleSensorTests.java \
src/android/hardware/cts/SensorIntegrationTests.java \
+ src/android/hardware/cts/SensorBatchingTests.java \
src/android/hardware/cts/SensorTest.java \
LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java
index 6fee8ce..9f50b43 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java
@@ -48,7 +48,9 @@
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
@@ -78,6 +80,14 @@
CameraDevice.TEMPLATE_VIDEO_SNAPSHOT
};
+ // Request templates that are unsupported by LEGACY mode.
+ private static Set<Integer> sLegacySkipTemplates = new HashSet<>();
+ static {
+ sLegacySkipTemplates.add(CameraDevice.TEMPLATE_VIDEO_SNAPSHOT);
+ sLegacySkipTemplates.add(CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG);
+ sLegacySkipTemplates.add(CameraDevice.TEMPLATE_MANUAL);
+ }
+
@Override
public void setContext(Context context) {
super.setContext(context);
@@ -744,11 +754,14 @@
.onError(
any(CameraDevice.class),
anyInt());
- }
- finally {
+ } catch (Exception e) {
+ mCollector.addError(e);
+ } finally {
try {
closeSession();
- } finally {
+ } catch (Exception e) {
+ mCollector.addError(e);
+ }finally {
closeDevice(mCameraIds[i], mCameraMockListener);
}
}
@@ -828,7 +841,7 @@
}
waitForSessionState(SESSION_ACTIVE, SESSION_READY_TIMEOUT_MS);
- int expectedResultCount = len;
+ int expectedResultCount = requests.size();
if (repeating) {
expectedResultCount *= REPEATING_CAPTURE_EXPECTED_RESULT_COUNT;
}
@@ -1294,7 +1307,7 @@
!mStaticInfo.isCapabilitySupported(CameraCharacteristics.
REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR)) {
// OK
- } else if (template == CameraDevice.TEMPLATE_VIDEO_SNAPSHOT &&
+ } else if (sLegacySkipTemplates.contains(template) &&
mStaticInfo.isHardwareLevelLegacy()) {
// OK
} else {
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureRequestTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureRequestTest.java
index 3d55c85..006b32c 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureRequestTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureRequestTest.java
@@ -351,10 +351,14 @@
* Test tone map modes and controls.
*/
public void testToneMapControl() throws Exception {
- for (int i = 0; i < mCameraIds.length; i++) {
+ for (String id : mCameraIds) {
try {
- openDevice(mCameraIds[i]);
-
+ openDevice(id);
+ if (!mStaticInfo.isManualToneMapSupported()) {
+ Log.i(TAG, "Camera " + id +
+ " doesn't support tone mapping controls, skipping test");
+ continue;
+ }
toneMapTestByCamera();
} finally {
closeDevice();
@@ -369,7 +373,11 @@
for (String id : mCameraIds) {
try {
openDevice(id);
-
+ if (!mStaticInfo.isManualColorCorrectionSupported()) {
+ Log.i(TAG, "Camera " + id +
+ " doesn't support color correction controls, skipping test");
+ continue;
+ }
colorCorrectionTestByCamera();
} finally {
closeDevice();
@@ -381,9 +389,9 @@
for (String id : mCameraIds) {
try {
openDevice(id);
- if (!mStaticInfo.getCharacteristics().getKeys().
- contains(CameraCharacteristics.EDGE_AVAILABLE_EDGE_MODES)) {
- Log.i(TAG, "Camera " + id + " doesn't support EDGE_MODE controls.");
+ if (!mStaticInfo.isEdgeModeControlSupported()) {
+ Log.i(TAG, "Camera " + id +
+ " doesn't support EDGE_MODE controls, skipping test");
continue;
}
@@ -402,7 +410,14 @@
try {
openDevice(id);
if (!mStaticInfo.hasFocuser()) {
- Log.i(TAG, "Camera " + id + " has no focuser");
+ Log.i(TAG, "Camera " + id + " has no focuser, skipping test");
+ continue;
+ }
+
+ if (!mStaticInfo.isCapabilitySupported(
+ CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR)) {
+ Log.i(TAG, "Camera " + id +
+ " does not support MANUAL_SENSOR, skipping test");
continue;
}
@@ -417,9 +432,9 @@
for (String id : mCameraIds) {
try {
openDevice(id);
- if (!mStaticInfo.getCharacteristics().getKeys().contains(
- CameraCharacteristics.NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES)) {
- Log.i(TAG, "Camera " + id + " doesn't support noise reduction mode");
+ if (!mStaticInfo.isNoiseReductionModeControlSupported()) {
+ Log.i(TAG, "Camera " + id +
+ " doesn't support noise reduction mode, skipping test");
continue;
}
@@ -1542,9 +1557,13 @@
verifyCaptureResultForKey(CaptureResult.CONTROL_AF_MODE, mode, listener,
NUM_FRAMES_VERIFIED);
- // Verify AF can finish a scan for CONTROL_AF_MODE_CONTINUOUS_* modes
- if (mode == CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE ||
- mode == CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_VIDEO) {
+ // Verify AF can finish a scan for CONTROL_AF_MODE_CONTINUOUS_* modes.
+ // In LEGACY mode, a transition to one of the continuous AF modes does not necessarily
+ // result in a passive AF call if the camera has already been focused, and the scene has
+ // not changed enough to trigger an AF pass. Skip this constraint for LEGACY.
+ if (mStaticInfo.isHardwareLevelLimitedOrBetter() &&
+ (mode == CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE ||
+ mode == CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_VIDEO)) {
List<Integer> afStateList = new ArrayList<Integer>();
afStateList.add(CaptureResult.CONTROL_AF_STATE_PASSIVE_FOCUSED);
afStateList.add(CaptureResult.CONTROL_AF_STATE_PASSIVE_UNFOCUSED);
@@ -2041,9 +2060,13 @@
fpsRange = fpsRanges[i];
Size previewSz = getMaxPreviewSizeForFpsRange(fpsRange);
// If unable to find a preview size, then log the failure, and skip this run.
- if (!mCollector.expectTrue(String.format(
- "Unable to find a preview size supporting given fps range %s",
- fpsRange), previewSz != null)) {
+ if (previewSz == null) {
+ if (mStaticInfo.isCapabilitySupported(
+ CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR)) {
+ mCollector.addMessage(String.format(
+ "Unable to find a preview size supporting given fps range %s",
+ fpsRange));
+ }
continue;
}
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureResultTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureResultTest.java
index f81e2be..61bf36c 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureResultTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureResultTest.java
@@ -504,6 +504,10 @@
waiverKeys.add(CaptureResult.NOISE_REDUCTION_MODE);
}
+ if (!mStaticInfo.isManualLensShadingMapSupported()) {
+ waiverKeys.add(CaptureResult.SHADING_MODE);
+ }
+
//Keys not required if manual sensor control is not supported
if (!mStaticInfo.isCapabilitySupported(
CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR)) {
@@ -511,6 +515,11 @@
waiverKeys.add(CaptureResult.SENSOR_FRAME_DURATION);
waiverKeys.add(CaptureResult.SENSOR_SENSITIVITY);
waiverKeys.add(CaptureResult.BLACK_LEVEL_LOCK);
+ waiverKeys.add(CaptureResult.LENS_FOCUS_RANGE);
+ waiverKeys.add(CaptureResult.LENS_FOCUS_DISTANCE);
+ waiverKeys.add(CaptureResult.LENS_STATE);
+ waiverKeys.add(CaptureResult.LENS_APERTURE);
+ waiverKeys.add(CaptureResult.LENS_FILTER_DENSITY);
}
if (mStaticInfo.isHardwareLevelLimited()) {
@@ -525,16 +534,12 @@
waiverKeys.add(CaptureResult.CONTROL_AWB_STATE);
waiverKeys.add(CaptureResult.FLASH_STATE);
waiverKeys.add(CaptureResult.LENS_OPTICAL_STABILIZATION_MODE);
- waiverKeys.add(CaptureResult.LENS_FOCUS_RANGE);
- waiverKeys.add(CaptureResult.LENS_FOCUS_DISTANCE);
- waiverKeys.add(CaptureResult.LENS_STATE);
- waiverKeys.add(CaptureResult.LENS_APERTURE);
- waiverKeys.add(CaptureResult.LENS_FILTER_DENSITY);
waiverKeys.add(CaptureResult.SENSOR_ROLLING_SHUTTER_SKEW);
- waiverKeys.add(CaptureResult.SHADING_MODE);
waiverKeys.add(CaptureResult.STATISTICS_LENS_SHADING_MAP_MODE);
waiverKeys.add(CaptureResult.STATISTICS_SCENE_FLICKER);
waiverKeys.add(CaptureResult.STATISTICS_HOT_PIXEL_MAP_MODE);
+ waiverKeys.add(CaptureResult.CONTROL_AE_TARGET_FPS_RANGE);
+ waiverKeys.add(CaptureResult.CONTROL_AF_TRIGGER);
return waiverKeys;
}
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/ExtendedCameraCharacteristicsTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/ExtendedCameraCharacteristicsTest.java
index 2ddff9f..1a00d9e 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/ExtendedCameraCharacteristicsTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/ExtendedCameraCharacteristicsTest.java
@@ -65,7 +65,7 @@
private static final int LEGACY = CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY;
private static final int LIMITED = CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED;
private static final int FULL = CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL;
- private static final int OPT = -1; // For keys that are optional on all hardware levels.
+ private static final int OPT = Integer.MAX_VALUE; // For keys that are optional on all hardware levels.
/*
* Capabilities short hand
@@ -340,9 +340,7 @@
/**
* Check key is present in characteristics if the hardware level is at least {@code hwLevel};
- * check that the key is present if the actual capabilities are one of {@code capabilities};
- * lastly check that {@code LEGACY} devices don't list any addition keys that they shouldn't
- * be.
+ * check that the key is present if the actual capabilities are one of {@code capabilities}.
*
* @return value of the {@code key} from {@code c}
*/
@@ -387,23 +385,14 @@
allKeys.contains(key));
} else {
if (actualHwLevel == LEGACY && hwLevel != OPT) {
- mCollector.expectTrue(
- String.format("Key (%s) must not be in characteristics for LEGACY devices",
- key.getName()),
- value == null);
-
- mCollector.expectTrue(
- String.format("Key (%s) must not be in characteristics list of keys" +
- "for LEGACY devices",
- key.getName()),
- !allKeys.contains(key));
-
- // TODO: a few keys like aeLock, awbLock are optional in api1. Revisit this.
+ if (value != null || allKeys.contains(key)) {
+ Log.w(TAG, String.format(
+ "Key (%s) is not required for LEGACY devices but still appears",
+ key.getName()));
+ }
}
-
// OK: Key may or may not be present.
}
-
return value;
}
@@ -478,7 +467,7 @@
private static int remapHardwareLevel(int level) {
switch (level) {
case OPT:
- return -1;
+ return Integer.MAX_VALUE;
case LEGACY:
return 0; // lowest
case LIMITED:
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/PerformanceTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/PerformanceTest.java
index aeab4cf..d4a0e73 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/PerformanceTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/PerformanceTest.java
@@ -194,8 +194,10 @@
for (String id : mCameraIds) {
try {
openDevice(id);
+
+ boolean partialsExpected = mStaticInfo.getPartialResultCount() > 1;
long startTimeMs;
- boolean isPartialTimingValid = true;
+ boolean isPartialTimingValid = partialsExpected;
for (int i = 0; i < NUM_TEST_LOOPS; i++) {
// setup builders and listeners
@@ -209,8 +211,11 @@
new SimpleTimingResultListener();
SimpleImageListener imageListener = new SimpleImageListener();
+ Size maxYuvSize = CameraTestUtils.getSupportedPreviewSizes(id, mCameraManager,
+ /*bound*/null).get(0);
+
prepareCaptureAndStartPreview(previewBuilder, captureBuilder,
- mOrderedPreviewSizes.get(0), mOrderedStillSizes.get(0),
+ mOrderedPreviewSizes.get(0), maxYuvSize,
ImageFormat.YUV_420_888, previewResultListener,
NUM_MAX_IMAGES, imageListener);
@@ -219,9 +224,16 @@
CaptureRequest request = captureBuilder.build();
mSession.capture(request, captureResultListener, mHandler);
- Pair<CaptureResult, Long> partialResultNTime =
- captureResultListener.getPartialResultNTimeForRequest(
- request, NUM_RESULTS_WAIT);
+ Pair<CaptureResult, Long> partialResultNTime = null;
+ if (partialsExpected) {
+ partialResultNTime = captureResultListener.getPartialResultNTimeForRequest(
+ request, NUM_RESULTS_WAIT);
+ // Even if maxPartials > 1, may not see partials for some devices
+ if (partialResultNTime == null) {
+ partialsExpected = false;
+ isPartialTimingValid = false;
+ }
+ }
Pair<CaptureResult, Long> captureResultNTime =
captureResultListener.getCaptureResultNTimeForRequest(
request, NUM_RESULTS_WAIT);
@@ -229,9 +241,11 @@
CameraTestUtils.CAPTURE_IMAGE_TIMEOUT_MS);
captureTimes[i] = imageListener.getTimeReceivedImage() - startTimeMs;
- getPartialTimes[i] = partialResultNTime.second - startTimeMs;
- if (getPartialTimes[i] < 0) {
- isPartialTimingValid = false;
+ if (partialsExpected) {
+ getPartialTimes[i] = partialResultNTime.second - startTimeMs;
+ if (getPartialTimes[i] < 0) {
+ isPartialTimingValid = false;
+ }
}
getResultTimes[i] = captureResultNTime.second - startTimeMs;
@@ -422,7 +436,6 @@
try {
Pair<CaptureResult, Long> result =
mPartialResultQueue.poll(timeout, TimeUnit.MILLISECONDS);
- assertNotNull("Wait for a partial result timed out in " + timeout + "ms", result);
return result;
} catch (InterruptedException e) {
throw new UnsupportedOperationException("Unhandled interrupted exception", e);
@@ -450,13 +463,17 @@
int i = 0;
do {
result = getPartialResultNTime(CameraTestUtils.CAPTURE_RESULT_TIMEOUT_MS);
+ // The result may be null if no partials are produced on this particular path, so
+ // stop trying
+ if (result == null) break;
if (result.first.getRequest().equals(myRequest)) {
return result;
}
} while (i++ < numResultsWait);
- throw new TimeoutRuntimeException("Unable to get the expected capture result after "
- + "waiting for " + numResultsWait + " results");
+ // No partials produced - this may not be an error, since a given device may not
+ // produce any partials on this testing path
+ return null;
}
public Pair<CaptureResult, Long> getCaptureResultNTimeForRequest(CaptureRequest myRequest,
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/RecordingTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/RecordingTest.java
index 83c3afb..3e041c7 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/RecordingTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/RecordingTest.java
@@ -549,9 +549,26 @@
assertTrue("Video size " + videoSz.toString() + " for profile ID " + profileId +
" must be one of the camera device supported video size!",
mSupportedVideoSizes.contains(videoSz));
+ assertTrue("Video size " + videoSz.toString() + " for profile ID " + profileId +
+ " must be one of the camera device supported JPEG sizes!",
+ mStaticInfo.isHardwareLevelLegacy() ||
+ mOrderedStillSizes.contains(videoSz));
Size maxPreviewSize = mOrderedPreviewSizes.get(0);
- Size videoSnapshotSz = videoSz;
+
+ // For LEGACY, find closest supported smaller or equal JPEG size to the current video
+ // size; if no size is smaller than the video, pick the smallest JPEG size. The assert
+ // for video size above guarantees that for LIMITED or FULL, we select videoSz here.
+ Size videoSnapshotSz = mOrderedStillSizes.get(mOrderedStillSizes.size() - 1);
+ for (int i = mOrderedStillSizes.size() - 2; i >= 0; i--) {
+ Size candidateSize = mOrderedStillSizes.get(i);
+ if (candidateSize.getWidth() > videoSz.getWidth() ||
+ candidateSize.getHeight() > videoSz.getHeight()) {
+ break;
+ }
+ videoSnapshotSz = candidateSize;
+ }
+
/**
* Only test full res snapshot when below conditions are all true.
* 1. Camera is a FULL device
@@ -584,7 +601,8 @@
SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
SimpleImageReaderListener imageListener = new SimpleImageReaderListener();
CaptureRequest.Builder videoSnapshotRequestBuilder =
- mCamera.createCaptureRequest(CameraDevice.TEMPLATE_VIDEO_SNAPSHOT);
+ mCamera.createCaptureRequest((mStaticInfo.isHardwareLevelLegacy()) ?
+ CameraDevice.TEMPLATE_RECORD : CameraDevice.TEMPLATE_VIDEO_SNAPSHOT);
// prepare preview surface by using video size.
updatePreviewSurfaceWithVideoSize(videoSz);
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/RobustnessTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/RobustnessTest.java
index c394b47..11ba02c 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/RobustnessTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/RobustnessTest.java
@@ -331,6 +331,10 @@
// Set up outputs
List<Object> outputTargets = new ArrayList<>();
List<Surface> outputSurfaces = new ArrayList<>();
+ List<SurfaceTexture> privTargets = new ArrayList<SurfaceTexture>();
+ List<ImageReader> jpegTargets = new ArrayList<ImageReader>();
+ List<ImageReader> yuvTargets = new ArrayList<ImageReader>();
+ List<ImageReader> rawTargets = new ArrayList<ImageReader>();
for (int i = 0; i < config.length; i += 2) {
int format = config[i];
int sizeLimit = config[i + 1];
@@ -342,6 +346,7 @@
target.setDefaultBufferSize(targetSize.getWidth(), targetSize.getHeight());
outputTargets.add(target);
outputSurfaces.add(new Surface(target));
+ privTargets.add(target);
break;
}
case JPEG: {
@@ -350,6 +355,7 @@
targetSize.getWidth(), targetSize.getHeight(), JPEG, MIN_RESULT_COUNT);
outputTargets.add(target);
outputSurfaces.add(target.getSurface());
+ jpegTargets.add(target);
break;
}
case YUV: {
@@ -358,6 +364,7 @@
targetSize.getWidth(), targetSize.getHeight(), YUV, MIN_RESULT_COUNT);
outputTargets.add(target);
outputSurfaces.add(target.getSurface());
+ yuvTargets.add(target);
break;
}
case RAW: {
@@ -366,6 +373,7 @@
targetSize.getWidth(), targetSize.getHeight(), RAW, MIN_RESULT_COUNT);
outputTargets.add(target);
outputSurfaces.add(target.getSurface());
+ rawTargets.add(target);
break;
}
default:
@@ -417,6 +425,19 @@
MaxOutputSizes.configToString(config), e.getMessage()));
}
}
+
+ for (SurfaceTexture target : privTargets) {
+ target.release();
+ }
+ for (ImageReader target : jpegTargets) {
+ target.close();
+ }
+ for (ImageReader target : yuvTargets) {
+ target.close();
+ }
+ for (ImageReader target : rawTargets) {
+ target.close();
+ }
}
private static Size getMaxRecordingSize(String cameraId) {
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/StaticMetadataTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/StaticMetadataTest.java
index f0d8293..ec7ecf8 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/StaticMetadataTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/StaticMetadataTest.java
@@ -31,14 +31,16 @@
import junit.framework.Assert;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
/**
* <p>
* This class covers the {@link CameraCharacteristics} tests that are not
- * covered by {@link CaptureRequestTest} and {@link CameraCharacteristicsTest}
- * (auto-generated tests that only do the non-null checks).
+ * covered by {@link CaptureRequestTest} and {@link ExtendedCameraCharacteristicsTest}
* </p>
* <p>
* Note that most of the tests in this class don't require camera open.
@@ -137,14 +139,79 @@
* @return {@code true} if request keys' presence match expectation. Otherwise {@code false}
*/
private boolean validateRequestKeysPresence(String capabilityName,
- List<CaptureRequest.Key<?>> requestKeys, boolean expectedPresence) {
+ Collection<CaptureRequest.Key<?>> requestKeys, boolean expectedPresence) {
boolean actualPresence = mStaticInfo.areRequestKeysAvailable(requestKeys);
if (expectedPresence != actualPresence) {
if (expectedPresence) {
for (CaptureRequest.Key<?> key : requestKeys) {
if (!mStaticInfo.areKeysAvailable(key)) {
mCollector.addMessage(String.format(
- "Camera %s list capability %s but doesn't contain key %s",
+ "Camera %s list capability %s but doesn't contain request key %s",
+ mCameraId, capabilityName, key.getName()));
+ }
+ }
+ } else {
+ Log.w(TAG, String.format(
+ "Camera %s doesn't list capability %s but contain all required keys",
+ mCameraId, capabilityName));
+ }
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Check if result keys' presence match expectation.
+ *
+ * @param capabilityName The name string of capability being tested. Used for output messages.
+ * @param resultKeys The capture result keys to be checked
+ * @param expectedPresence Expected presence of {@code resultKeys}. {@code true} for expecting
+ * all keys are available. Otherwise {@code false}
+ * @return {@code true} if result keys' presence match expectation. Otherwise {@code false}
+ */
+ private boolean validateResultKeysPresence(String capabilityName,
+ Collection<CaptureResult.Key<?>> resultKeys, boolean expectedPresence) {
+ boolean actualPresence = mStaticInfo.areResultKeysAvailable(resultKeys);
+ if (expectedPresence != actualPresence) {
+ if (expectedPresence) {
+ for (CaptureResult.Key<?> key : resultKeys) {
+ if (!mStaticInfo.areKeysAvailable(key)) {
+ mCollector.addMessage(String.format(
+ "Camera %s list capability %s but doesn't contain result key %s",
+ mCameraId, capabilityName, key.getName()));
+ }
+ }
+ } else {
+ Log.w(TAG, String.format(
+ "Camera %s doesn't list capability %s but contain all required keys",
+ mCameraId, capabilityName));
+ }
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Check if characteristics keys' presence match expectation.
+ *
+ * @param capabilityName The name string of capability being tested. Used for output messages.
+ * @param characteristicsKeys The characteristics keys to be checked
+ * @param expectedPresence Expected presence of {@code characteristicsKeys}. {@code true} for
+ * expecting all keys are available. Otherwise {@code false}
+ * @return {@code true} if characteristics keys' presence match expectation.
+ * Otherwise {@code false}
+ */
+ private boolean validateCharacteristicsKeysPresence(String capabilityName,
+ Collection<CameraCharacteristics.Key<?>> characteristicsKeys,
+ boolean expectedPresence) {
+ boolean actualPresence = mStaticInfo.areCharacteristicsKeysAvailable(characteristicsKeys);
+ if (expectedPresence != actualPresence) {
+ if (expectedPresence) {
+ for (CameraCharacteristics.Key<?> key : characteristicsKeys) {
+ if (!mStaticInfo.areKeysAvailable(key)) {
+ mCollector.addMessage(String.format(
+ "Camera %s list capability %s but doesn't contain" +
+ "characteristics key %s",
mCameraId, capabilityName, key.getName()));
}
}
@@ -160,8 +227,8 @@
private void validateCapability(Integer capability, boolean isCapabilityAvailable) {
List<CaptureRequest.Key<?>> requestKeys = new ArrayList<>();
- /* Only test request keys in this test
- Characteristics keys are tested in CameraCharacteristicsTest
+ /* For available capabilities, only check request keys in this test
+ Characteristics keys are tested in ExtendedCameraCharacteristicsTest
Result keys are tested in CaptureResultTest */
String capabilityName;
switch (capability) {
@@ -172,7 +239,6 @@
requestKeys.add(CaptureRequest.CONTROL_AE_LOCK);
requestKeys.add(CaptureRequest.CONTROL_AE_MODE);
requestKeys.add(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE);
- requestKeys.add(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER);
requestKeys.add(CaptureRequest.CONTROL_AF_MODE);
requestKeys.add(CaptureRequest.CONTROL_AF_TRIGGER);
requestKeys.add(CaptureRequest.CONTROL_AWB_LOCK);
@@ -188,7 +254,6 @@
requestKeys.add(CaptureRequest.JPEG_QUALITY);
requestKeys.add(CaptureRequest.JPEG_THUMBNAIL_QUALITY);
requestKeys.add(CaptureRequest.JPEG_THUMBNAIL_SIZE);
- requestKeys.add(CaptureRequest.LENS_FOCUS_DISTANCE);
requestKeys.add(CaptureRequest.SCALER_CROP_REGION);
requestKeys.add(CaptureRequest.STATISTICS_FACE_DETECT_MODE);
if (mStaticInfo.getAeMaxRegionsChecked() > 0) {
@@ -239,38 +304,74 @@
requestKeys.add(CaptureRequest.BLACK_LEVEL_LOCK);
break;
case REQUEST_AVAILABLE_CAPABILITIES_RAW:
- capabilityName = "REQUEST_AVAILABLE_CAPABILITIES_RAW";
- boolean rawOutputSupported = mStaticInfo.getRawOutputSizesChecked().length > 0;
- if (isCapabilityAvailable) {
- mCollector.expectTrue(
- "REQUEST_AVAILABLE_CAPABILITIES_RAW should support RAW_SENSOR output",
- rawOutputSupported);
- }
- requestKeys.add(CaptureRequest.HOT_PIXEL_MODE);
- requestKeys.add(CaptureRequest.STATISTICS_HOT_PIXEL_MAP_MODE);
- break;
+ // RAW_CAPABILITY needs to check for not just capture request keys
+ validateRawCapability(isCapabilityAvailable);
+ return;
default:
capabilityName = "Unknown";
Assert.fail(String.format("Unknown capability: %d", capability));
}
+
boolean matchExpectation =
validateRequestKeysPresence(capabilityName, requestKeys, isCapabilityAvailable);
-
// In case of isCapabilityAvailable == true, error has been filed in
// validateRequestKeysPresence
if (!matchExpectation && !isCapabilityAvailable) {
- if (capability == REQUEST_AVAILABLE_CAPABILITIES_RAW) {
- // RAW capability needs to also check raw output capability
- boolean rawOutputSupported = mStaticInfo.getRawOutputSizesChecked().length > 0;
- if (rawOutputSupported) {
- mCollector.addMessage(String.format(
- "Camera %s doesn't list capability %s but contain all required keys" +
- " and RAW format output",
- mCameraId, capabilityName));
- }
+ mCollector.addMessage(String.format(
+ "Camera %s doesn't list capability %s but contain all required keys",
+ mCameraId, capabilityName));
+ }
+ }
+
+ private void validateRawCapability(boolean isCapabilityAvailable) {
+ String capabilityName = "REQUEST_AVAILABLE_CAPABILITIES_RAW";
+
+ Set<CaptureRequest.Key<?>> requestKeys = new HashSet<>();
+ requestKeys.add(CaptureRequest.HOT_PIXEL_MODE);
+ requestKeys.add(CaptureRequest.STATISTICS_HOT_PIXEL_MAP_MODE);
+
+ Set<CameraCharacteristics.Key<?>> characteristicsKeys = new HashSet<>();
+ characteristicsKeys.add(HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES);
+ characteristicsKeys.add(SENSOR_BLACK_LEVEL_PATTERN);
+ characteristicsKeys.add(SENSOR_CALIBRATION_TRANSFORM1);
+ characteristicsKeys.add(SENSOR_CALIBRATION_TRANSFORM2);
+ characteristicsKeys.add(SENSOR_COLOR_TRANSFORM1);
+ characteristicsKeys.add(SENSOR_COLOR_TRANSFORM2);
+ characteristicsKeys.add(SENSOR_FORWARD_MATRIX1);
+ characteristicsKeys.add(SENSOR_FORWARD_MATRIX2);
+ characteristicsKeys.add(SENSOR_INFO_ACTIVE_ARRAY_SIZE);
+ characteristicsKeys.add(SENSOR_INFO_COLOR_FILTER_ARRANGEMENT);
+ characteristicsKeys.add(SENSOR_INFO_WHITE_LEVEL);
+ characteristicsKeys.add(SENSOR_REFERENCE_ILLUMINANT1);
+ characteristicsKeys.add(SENSOR_REFERENCE_ILLUMINANT2);
+ characteristicsKeys.add(STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES);
+
+ Set<CaptureResult.Key<?>> resultKeys = new HashSet<>();
+ resultKeys.add(CaptureResult.SENSOR_NEUTRAL_COLOR_POINT);
+ resultKeys.add(CaptureResult.SENSOR_GREEN_SPLIT);
+ resultKeys.add(CaptureResult.SENSOR_NOISE_PROFILE);
+
+ boolean rawOutputSupported = mStaticInfo.getRawOutputSizesChecked().length > 0;
+ boolean requestKeysPresent = mStaticInfo.areRequestKeysAvailable(requestKeys);
+ boolean characteristicsKeysPresent =
+ mStaticInfo.areCharacteristicsKeysAvailable(characteristicsKeys);
+ boolean resultKeysPresent = mStaticInfo.areResultKeysAvailable(resultKeys);
+ boolean expectCapabilityPresent = rawOutputSupported && requestKeysPresent &&
+ characteristicsKeysPresent && resultKeysPresent;
+
+ if (isCapabilityAvailable != expectCapabilityPresent) {
+ if (isCapabilityAvailable) {
+ mCollector.expectTrue(
+ "REQUEST_AVAILABLE_CAPABILITIES_RAW should support RAW_SENSOR output",
+ rawOutputSupported);
+ validateRequestKeysPresence(capabilityName, requestKeys, isCapabilityAvailable);
+ validateResultKeysPresence(capabilityName, resultKeys, isCapabilityAvailable);
+ validateCharacteristicsKeysPresence(capabilityName, characteristicsKeys,
+ isCapabilityAvailable);
} else {
mCollector.addMessage(String.format(
- "Camera %s doesn't list capability %s but contain all required keys",
+ "Camera %s doesn't list capability %s but contain all required keys" +
+ " and RAW format output",
mCameraId, capabilityName));
}
}
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/StillCaptureTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/StillCaptureTest.java
index b60df08..c99ff7e 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/StillCaptureTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/StillCaptureTest.java
@@ -680,8 +680,6 @@
dumpFile(rawFileName, rawBuffer);
}
- verifyRawCaptureResult(rawRequest, resultListener.getCaptureResultForRequest(rawRequest,
- NUM_RESULTS_WAIT_TIMEOUT));
stopPreview();
}
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/StaticMetadata.java b/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/StaticMetadata.java
index 578d03e..11d7ac0 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/StaticMetadata.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/StaticMetadata.java
@@ -630,10 +630,15 @@
checkTrueForKey(key, " value must be 0 if only OFF mode is supported in "
+ "availableFaceDetectionModes", count == 0);
} else {
- int maxFaceCountAtLeat = STATISTICS_INFO_MAX_FACE_COUNT_MIN_AT_LEAST;
- checkTrueForKey(key, " value must be no less than " + maxFaceCountAtLeat + " if SIMPLE"
+ int maxFaceCountAtLeast = STATISTICS_INFO_MAX_FACE_COUNT_MIN_AT_LEAST;
+
+ // Legacy mode may support fewer than STATISTICS_INFO_MAX_FACE_COUNT_MIN_AT_LEAST faces.
+ if (isHardwareLevelLegacy()) {
+ maxFaceCountAtLeast = 1;
+ }
+ checkTrueForKey(key, " value must be no less than " + maxFaceCountAtLeast + " if SIMPLE"
+ "or FULL is also supported in availableFaceDetectionModes",
- count >= maxFaceCountAtLeat);
+ count >= maxFaceCountAtLeast);
}
return count;
@@ -1047,8 +1052,11 @@
}
List<Integer> modesList = Arrays.asList(CameraTestUtils.toObject(afModes));
- checkTrueForKey(key, " All camera devices must support OFF mode",
- modesList.contains(CameraMetadata.CONTROL_AF_MODE_OFF));
+ if (isHardwareLevelLimitedOrBetter()) {
+ // Some LEGACY mode devices do not support AF OFF
+ checkTrueForKey(key, " All camera devices must support OFF mode",
+ modesList.contains(CameraMetadata.CONTROL_AF_MODE_OFF));
+ }
if (hasFocuser()) {
checkTrueForKey(key, " Camera devices that have focuser units must support AUTO mode",
modesList.contains(CameraMetadata.CONTROL_AF_MODE_AUTO));
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/rs/AllocationCache.java b/tests/tests/hardware/src/android/hardware/camera2/cts/rs/AllocationCache.java
index e65e819..b89f9bb 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/rs/AllocationCache.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/rs/AllocationCache.java
@@ -74,34 +74,30 @@
* @throws NullPointerException if type was null
* @throws IllegalStateException if the cache was closed with {@link #close}
*/
- public synchronized Allocation getOrCreateTyped(Type type, int usage) {
- checkNotNull("type", type);
- checkNotClosed();
+ public Allocation getOrCreateTyped(Type type, int usage) {
+ synchronized (this) {
+ checkNotNull("type", type);
+ checkNotClosed();
- AllocationKey key = new AllocationKey(type, usage);
- List<Allocation> list = mAllocationMap.get(key);
+ AllocationKey key = new AllocationKey(type, usage);
+ List<Allocation> list = mAllocationMap.get(key);
- Allocation alloc;
-
- if (list == null || list.isEmpty()) {
- alloc = Allocation.createTyped(mRS, type, usage);
-
- if (DEBUG) {
- sDebugMisses++;
- Log.d(TAG, String.format(
- "Cache MISS (%d): type = '%s', usage = '%x'", sDebugMisses, type, usage));
- }
- } else {
- alloc = list.remove(list.size() - 1);
-
- if (DEBUG) {
- sDebugHits++;
- Log.d(TAG, String.format(
- "Cache HIT (%d): type = '%s', usage = '%x'", sDebugHits, type, usage));
- }
+ if (list != null && !list.isEmpty()) {
+ Allocation alloc = list.remove(list.size() - 1);
+ if (DEBUG) {
+ sDebugHits++;
+ Log.d(TAG, String.format(
+ "Cache HIT (%d): type = '%s', usage = '%x'", sDebugHits, type, usage));
+ }
+ return alloc;
+ }
+ if (DEBUG) {
+ sDebugMisses++;
+ Log.d(TAG, String.format(
+ "Cache MISS (%d): type = '%s', usage = '%x'", sDebugMisses, type, usage));
+ }
}
-
- return alloc;
+ return Allocation.createTyped(mRS, type, usage);
}
/**
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2SurfaceViewTestCase.java b/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2SurfaceViewTestCase.java
index 31fe8e3..bcc4061 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2SurfaceViewTestCase.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2SurfaceViewTestCase.java
@@ -34,6 +34,7 @@
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCaptureSession;
import android.hardware.camera2.CameraCaptureSession.CaptureCallback;
+import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.CameraMetadata;
@@ -679,8 +680,12 @@
Long minDuration = mMinPreviewFrameDurationMap.get(size);
if (minDuration == null ||
minDuration == 0) {
- throw new IllegalArgumentException(
- "No min frame duration available for the selected format.");
+ if (mStaticInfo.isCapabilitySupported(
+ CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR)) {
+ throw new IllegalArgumentException(
+ "No min frame duration available for the size " + size);
+ }
+ continue;
}
if (minDuration <= frameDurationRange[0]) {
return size;
diff --git a/tests/tests/hardware/src/android/hardware/cts/SensorBatchingTests.java b/tests/tests/hardware/src/android/hardware/cts/SensorBatchingTests.java
new file mode 100644
index 0000000..d00194f
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/SensorBatchingTests.java
@@ -0,0 +1,329 @@
+/*
+ * Copyright (C) 2014 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.hardware.cts;
+
+import android.hardware.Sensor;
+import android.hardware.SensorManager;
+import android.hardware.cts.helpers.SensorCtsHelper;
+import android.hardware.cts.helpers.SensorStats;
+import android.hardware.cts.helpers.SensorTestInformation;
+import android.hardware.cts.helpers.TestSensorEnvironment;
+import android.hardware.cts.helpers.sensoroperations.TestSensorFlushOperation;
+import android.hardware.cts.helpers.sensoroperations.TestSensorOperation;
+import android.hardware.cts.helpers.sensoroperations.VerifiableSensorOperation;
+import android.hardware.cts.helpers.sensorverification.ISensorVerification;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Set of tests to verify that sensors operate correctly when operating in batching mode.
+ * This class defines tests for continuous sensors when the device is awake.
+ * On-change and special sensors are tested separately inside CtsVerifier, and they are defined in:
+ * {@link com.android.cts.verifier.sensors.BatchingTestActivity}.
+ *
+ * Each test is expected to pass even if batching is not supported for a particular sensor. This is
+ * usually achieved by ensuring that {@link ISensorVerification}s fallback accordingly.
+ *
+ * <p>To execute these test cases, the following command can be used:</p>
+ * <pre>
+ * adb shell am instrument -e class android.hardware.cts.SensorBatchingTests \
+ * -w com.android.cts.hardware/android.test.AndroidJUnitRunner
+ * </pre>
+ */
+public class SensorBatchingTests extends SensorTestCase {
+ private static final String TAG = "SensorBatchingTests";
+
+ private static final int BATCHING_10S = 10;
+ private static final int RATE_50HZ = 20000;
+ private static final int RATE_FASTEST = SensorManager.SENSOR_DELAY_FASTEST;
+
+ /**
+ * An arbitrary 'padding' time slot to wait for events after batching latency expires.
+ * This allows for the test to wait for event arrivals after batching was expected.
+ */
+ private static final int BATCHING_PADDING_TIME_S = 2;
+
+ public void testAccelerometer_fastest_batching() throws Throwable {
+ runBatchingSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_FASTEST, BATCHING_10S);
+ }
+
+ public void testAccelerometer_50hz_batching() throws Throwable {
+ runBatchingSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_50HZ, BATCHING_10S);
+ }
+
+ public void testAccelerometer_fastest_flush() throws Throwable {
+ runFlushSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_FASTEST, BATCHING_10S);
+ }
+
+ public void testAccelerometer_50hz_flush() throws Throwable {
+ runFlushSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_50HZ, BATCHING_10S);
+ }
+
+ public void testMagneticField_fastest_batching() throws Throwable {
+ runBatchingSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_FASTEST, BATCHING_10S);
+ }
+
+ public void testMagneticField_50hz_batching() throws Throwable {
+ runBatchingSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_50HZ, BATCHING_10S);
+ }
+
+ public void testMagneticField_fastest_flush() throws Throwable {
+ runFlushSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_FASTEST, BATCHING_10S);
+ }
+
+ public void testMagneticField_50hz_flush() throws Throwable {
+ runFlushSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_50HZ, BATCHING_10S);
+ }
+
+ @SuppressWarnings("deprecation")
+ public void testOrientation_fastest_batching() throws Throwable {
+ runBatchingSensorTest(Sensor.TYPE_ORIENTATION, RATE_FASTEST, BATCHING_10S);
+ }
+
+ @SuppressWarnings("deprecation")
+ public void testOrientation_50hz_batching() throws Throwable {
+ runBatchingSensorTest(Sensor.TYPE_ORIENTATION, RATE_50HZ, BATCHING_10S);
+ }
+
+ @SuppressWarnings("deprecation")
+ public void testOrientation_fastest_flush() throws Throwable {
+ runFlushSensorTest(Sensor.TYPE_ORIENTATION, RATE_FASTEST, BATCHING_10S);
+ }
+
+ @SuppressWarnings("deprecation")
+ public void testOrientation_50hz_flush() throws Throwable {
+ runFlushSensorTest(Sensor.TYPE_ORIENTATION, RATE_50HZ, BATCHING_10S);
+ }
+
+ public void testGyroscope_fastest_batching() throws Throwable {
+ runBatchingSensorTest(Sensor.TYPE_GYROSCOPE, RATE_FASTEST, BATCHING_10S);
+ }
+
+ public void testGyroscope_50hz_batching() throws Throwable {
+ runBatchingSensorTest(Sensor.TYPE_GYROSCOPE, RATE_50HZ, BATCHING_10S);
+ }
+
+ public void testGyroscope_fastest_flush() throws Throwable {
+ runFlushSensorTest(Sensor.TYPE_GYROSCOPE, SensorManager.SENSOR_DELAY_FASTEST, BATCHING_10S);
+ }
+
+ public void testGyroscope_50hz_flush() throws Throwable {
+ runFlushSensorTest(Sensor.TYPE_GYROSCOPE, RATE_50HZ, BATCHING_10S);
+ }
+
+ public void testPressure_fastest_batching() throws Throwable {
+ runBatchingSensorTest(Sensor.TYPE_PRESSURE, RATE_FASTEST, BATCHING_10S);
+ }
+
+ public void testPressure_50hz_batching() throws Throwable {
+ runBatchingSensorTest(Sensor.TYPE_PRESSURE, RATE_50HZ, BATCHING_10S);
+ }
+
+ public void testPressure_fastest_flush() throws Throwable {
+ runFlushSensorTest(Sensor.TYPE_PRESSURE, SensorManager.SENSOR_DELAY_FASTEST, BATCHING_10S);
+ }
+
+ public void testPressure_50hz_flush() throws Throwable {
+ runFlushSensorTest(Sensor.TYPE_PRESSURE, RATE_50HZ, BATCHING_10S);
+ }
+
+ public void testGravity_fastest_batching() throws Throwable {
+ runBatchingSensorTest(Sensor.TYPE_GRAVITY, RATE_FASTEST, BATCHING_10S);
+ }
+
+ public void testGravity_50hz_batching() throws Throwable {
+ runBatchingSensorTest(Sensor.TYPE_GRAVITY, RATE_50HZ, BATCHING_10S);
+ }
+
+ public void testGravity_fastest_flush() throws Throwable {
+ runFlushSensorTest(Sensor.TYPE_GRAVITY, SensorManager.SENSOR_DELAY_FASTEST, BATCHING_10S);
+ }
+
+ public void testGravity_50hz_flush() throws Throwable {
+ runFlushSensorTest(Sensor.TYPE_GRAVITY, RATE_50HZ, BATCHING_10S);
+ }
+
+ public void testRotationVector_fastest_batching() throws Throwable {
+ runBatchingSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_FASTEST, BATCHING_10S);
+ }
+
+ public void testRotationVector_50hz_batching() throws Throwable {
+ runBatchingSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_50HZ, BATCHING_10S);
+ }
+
+ public void testRotationVector_fastest_flush() throws Throwable {
+ runFlushSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_FASTEST, BATCHING_10S);
+ }
+
+ public void testRotationVector_50hz_flush() throws Throwable {
+ runFlushSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_50HZ, BATCHING_10S);
+ }
+
+ public void testMagneticFieldUncalibrated_fastest_batching() throws Throwable {
+ runBatchingSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_FASTEST, BATCHING_10S);
+ }
+
+ public void testMagneticFieldUncalibrated_50hz_batching() throws Throwable {
+ runBatchingSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_50HZ, BATCHING_10S);
+ }
+
+ public void testMagneticFieldUncalibrated_fastest_flush() throws Throwable {
+ runFlushSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_FASTEST, BATCHING_10S);
+ }
+
+ public void testMagneticFieldUncalibrated_50hz_flush() throws Throwable {
+ runFlushSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_50HZ, BATCHING_10S);
+ }
+
+ public void testGameRotationVector_fastest_batching() throws Throwable {
+ runBatchingSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_FASTEST, BATCHING_10S);
+ }
+
+ public void testGameRotationVector_50hz_batching() throws Throwable {
+ runBatchingSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_50HZ, BATCHING_10S);
+ }
+
+ public void testGameRotationVector_fastest_flush() throws Throwable {
+ runFlushSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_FASTEST, BATCHING_10S);
+ }
+
+ public void testGameRotationVector_50hz_flush() throws Throwable {
+ runFlushSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_50HZ, BATCHING_10S);
+ }
+
+ public void testGyroscopeUncalibrated_fastest_batching() throws Throwable {
+ runBatchingSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_FASTEST, BATCHING_10S);
+ }
+
+ public void testGyroscopeUncalibrated_50hz_batching() throws Throwable {
+ runBatchingSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_50HZ, BATCHING_10S);
+ }
+
+ public void testGyroscopeUncalibrated_fastest_flush() throws Throwable {
+ runFlushSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_FASTEST, BATCHING_10S);
+ }
+
+ public void testGyroscopeUncalibrated_50hz_flush() throws Throwable {
+ runFlushSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_50HZ, BATCHING_10S);
+ }
+
+ public void testLinearAcceleration_fastest_batching() throws Throwable {
+ runBatchingSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_FASTEST, BATCHING_10S);
+ }
+
+ public void testLinearAcceleration_50hz_batching() throws Throwable {
+ runBatchingSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_50HZ, BATCHING_10S);
+ }
+
+ public void testLinearAcceleration_fastest_flush() throws Throwable {
+ runFlushSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_FASTEST, BATCHING_10S);
+ }
+
+ public void testLinearAcceleration_50hz_flush() throws Throwable {
+ runFlushSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_50HZ, BATCHING_10S);
+ }
+
+ public void testGeomagneticRotationVector_fastest_batching() throws Throwable {
+ runBatchingSensorTest(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR, RATE_FASTEST, BATCHING_10S);
+ }
+
+ public void testGeomagneticRotationVector_50hz_batching() throws Throwable {
+ runBatchingSensorTest(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR, RATE_50HZ, BATCHING_10S);
+ }
+
+ public void testGeomagneticRotationVector_fastest_flush() throws Throwable {
+ runFlushSensorTest(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR, RATE_FASTEST, BATCHING_10S);
+ }
+
+ public void testGeomagneticRotationVector_50hz_flush() throws Throwable {
+ runFlushSensorTest(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR, RATE_50HZ, BATCHING_10S);
+ }
+
+ private void runBatchingSensorTest(int sensorType, int rateUs, int maxBatchReportLatencySec)
+ throws Throwable {
+ int maxBatchReportLatencyUs = (int) TimeUnit.SECONDS.toMicros(maxBatchReportLatencySec);
+ int testDurationSec = maxBatchReportLatencySec + BATCHING_PADDING_TIME_S;
+
+ TestSensorEnvironment environment = new TestSensorEnvironment(
+ getContext(),
+ sensorType,
+ shouldEmulateSensorUnderLoad(),
+ rateUs,
+ maxBatchReportLatencyUs);
+ TestSensorOperation operation =
+ new TestSensorOperation(environment, testDurationSec, TimeUnit.SECONDS);
+
+ executeTest(
+ operation,
+ sensorType,
+ rateUs,
+ maxBatchReportLatencyUs,
+ false /* flushExpected */);
+ }
+
+ private void runFlushSensorTest(int sensorType, int rateUs, int maxBatchReportLatencySec)
+ throws Throwable {
+ int maxBatchReportLatencyUs = (int) TimeUnit.SECONDS.toMicros(maxBatchReportLatencySec);
+ int flushDurationSec = maxBatchReportLatencySec / 2;
+
+ TestSensorEnvironment environment = new TestSensorEnvironment(
+ getContext(),
+ sensorType,
+ shouldEmulateSensorUnderLoad(),
+ rateUs,
+ maxBatchReportLatencyUs);
+ TestSensorFlushOperation operation =
+ new TestSensorFlushOperation(environment, flushDurationSec, TimeUnit.SECONDS);
+
+ executeTest(
+ operation,
+ sensorType,
+ rateUs,
+ maxBatchReportLatencyUs,
+ true /* flushExpected */);
+ }
+
+ private void executeTest(
+ VerifiableSensorOperation operation,
+ int sensorType,
+ int rateUs,
+ int maxBatchReportLatencyUs,
+ boolean flushExpected) throws Throwable {
+ operation.addDefaultVerifications();
+ operation.setLogEvents(true);
+
+ try {
+ operation.execute();
+ } finally {
+ SensorStats.logStats(TAG, operation.getStats());
+
+ String sensorName = SensorTestInformation.getSanitizedSensorName(sensorType);
+ String sensorRate;
+ if (rateUs == SensorManager.SENSOR_DELAY_FASTEST) {
+ sensorRate = "fastest";
+ } else {
+ sensorRate = String.format("%.0fhz",
+ SensorCtsHelper.getFrequency(rateUs, TimeUnit.MICROSECONDS));
+ }
+ String batching = maxBatchReportLatencyUs > 0 ? "_batching" : "";
+ String flush = flushExpected ? "_flush" : "";
+ String fileName = String.format("sensor_batching_%s_%s%s%s.txt",
+ sensorName, sensorRate, batching, flush);
+ SensorStats.logStatsToFile(fileName, operation.getStats());
+ }
+ }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/SensorIntegrationTests.java b/tests/tests/hardware/src/android/hardware/cts/SensorIntegrationTests.java
index 1b923fc..3c9eef9 100644
--- a/tests/tests/hardware/src/android/hardware/cts/SensorIntegrationTests.java
+++ b/tests/tests/hardware/src/android/hardware/cts/SensorIntegrationTests.java
@@ -15,20 +15,22 @@
*/
package android.hardware.cts;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.hardware.cts.helpers.SensorCtsHelper;
import android.hardware.cts.helpers.SensorStats;
+import android.hardware.cts.helpers.TestSensorEnvironment;
import android.hardware.cts.helpers.sensoroperations.ParallelSensorOperation;
import android.hardware.cts.helpers.sensoroperations.RepeatingSensorOperation;
import android.hardware.cts.helpers.sensoroperations.SequentialSensorOperation;
import android.hardware.cts.helpers.sensoroperations.TestSensorOperation;
+import android.hardware.cts.helpers.sensoroperations.VerifiableSensorOperation;
import android.hardware.cts.helpers.sensorverification.EventOrderingVerification;
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
import java.util.Random;
/**
@@ -86,7 +88,7 @@
public void testSensorsWithSeveralClients() throws Throwable {
final int ITERATIONS = 50;
final int MAX_REPORTING_LATENCY_IN_SECONDS = 5;
- final Context context = this.getContext();
+ final Context context = getContext();
int sensorTypes[] = {
Sensor.TYPE_ACCELEROMETER,
@@ -95,21 +97,25 @@
ParallelSensorOperation operation = new ParallelSensorOperation();
for(int sensorType : sensorTypes) {
- TestSensorOperation continuousOperation = new TestSensorOperation(
+ TestSensorEnvironment environment = new TestSensorEnvironment(
context,
sensorType,
- SensorManager.SENSOR_DELAY_FASTEST,
- 0 /* reportLatencyInUs */,
- 100 /* event count */);
+ shouldEmulateSensorUnderLoad(),
+ SensorManager.SENSOR_DELAY_FASTEST);
+ TestSensorOperation continuousOperation =
+ new TestSensorOperation(environment, 100 /* eventCount */);
continuousOperation.addVerification(new EventOrderingVerification());
operation.add(new RepeatingSensorOperation(continuousOperation, ITERATIONS));
- TestSensorOperation batchingOperation = new TestSensorOperation(
+ Sensor sensor = TestSensorEnvironment.getSensor(context, sensorType);
+ TestSensorEnvironment batchingEnvironment = new TestSensorEnvironment(
context,
sensorType,
- SensorCtsHelper.getSensor(getContext(), sensorType).getMinDelay(),
- SensorCtsHelper.getSecondsAsMicroSeconds(MAX_REPORTING_LATENCY_IN_SECONDS),
- 100);
+ shouldEmulateSensorUnderLoad(),
+ sensor.getMinDelay(),
+ SensorCtsHelper.getSecondsAsMicroSeconds(MAX_REPORTING_LATENCY_IN_SECONDS));
+ TestSensorOperation batchingOperation =
+ new TestSensorOperation(batchingEnvironment, 100 /* eventCount */);
batchingOperation.addVerification(new EventOrderingVerification());
operation.add(new RepeatingSensorOperation(batchingOperation, ITERATIONS));
}
@@ -149,16 +155,19 @@
Sensor.TYPE_MAGNETIC_FIELD,
Sensor.TYPE_GYROSCOPE };
+ Context context = getContext();
for(int sensorType : sensorTypes) {
for(int instance = 0; instance < INSTANCES_TO_USE; ++instance) {
SequentialSensorOperation sequentialOperation = new SequentialSensorOperation();
for(int iteration = 0; iteration < ITERATIONS_TO_EXECUTE; ++iteration) {
- TestSensorOperation sensorOperation = new TestSensorOperation(
- this.getContext(),
+ TestSensorEnvironment environment = new TestSensorEnvironment(
+ context,
sensorType,
- this.generateSamplingRateInUs(sensorType),
- this.generateReportLatencyInUs(),
- 100);
+ shouldEmulateSensorUnderLoad(),
+ generateSamplingRateInUs(sensorType),
+ generateReportLatencyInUs());
+ TestSensorOperation sensorOperation =
+ new TestSensorOperation(environment, 100 /* eventCount */);
sensorOperation.addVerification(new EventOrderingVerification());
sequentialOperation.add(sensorOperation);
}
@@ -215,22 +224,24 @@
* of several clients can lead to the failing state.
*/
public void testSensorStoppingInteraction() throws Throwable {
- Context context = this.getContext();
+ Context context = getContext();
- TestSensorOperation tester = new TestSensorOperation(
+ TestSensorEnvironment testerEnvironment = new TestSensorEnvironment(
context,
mSensorTypeTester,
- SensorManager.SENSOR_DELAY_FASTEST,
- 0 /*reportLatencyInUs*/,
- 100 /* event count */);
+ shouldEmulateSensorUnderLoad(),
+ SensorManager.SENSOR_DELAY_FASTEST);
+ TestSensorOperation tester =
+ new TestSensorOperation(testerEnvironment, 100 /* event count */);
tester.addVerification(new EventOrderingVerification());
- TestSensorOperation testee = new TestSensorOperation(
+ TestSensorEnvironment testeeEnvironment = new TestSensorEnvironment(
context,
mSensorTypeTestee,
- SensorManager.SENSOR_DELAY_FASTEST,
- 0 /*reportLatencyInUs*/,
- 100 /* event count */);
+ shouldEmulateSensorUnderLoad(),
+ SensorManager.SENSOR_DELAY_FASTEST);
+ VerifiableSensorOperation testee =
+ new TestSensorOperation(testeeEnvironment, 100 /* event count */);
testee.addVerification(new EventOrderingVerification());
ParallelSensorOperation operation = new ParallelSensorOperation();
@@ -255,8 +266,8 @@
rate = SensorManager.SENSOR_DELAY_FASTEST;
break;
default:
- int maxSamplingRate = SensorCtsHelper.getSensor(getContext(), sensorType)
- .getMinDelay();
+ Sensor sensor = TestSensorEnvironment.getSensor(getContext(), sensorType);
+ int maxSamplingRate = sensor.getMinDelay();
rate = maxSamplingRate * mGenerator.nextInt(10);
}
return rate;
diff --git a/tests/tests/hardware/src/android/hardware/cts/SensorTest.java b/tests/tests/hardware/src/android/hardware/cts/SensorTest.java
index 5607123..a4d4157 100644
--- a/tests/tests/hardware/src/android/hardware/cts/SensorTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/SensorTest.java
@@ -518,8 +518,11 @@
assertTrue(sensor.getResolution() >= 0);
assertNotNull(sensor.getVendor());
assertTrue(sensor.getVersion() > 0);
- assertTrue(sensor.getFifoMaxEventCount() >= 0);
- assertTrue(sensor.getFifoReservedEventCount() >= 0);
+ int fifoMaxEventCount = sensor.getFifoMaxEventCount();
+ int fifoReservedEventCount = sensor.getFifoReservedEventCount();
+ assertTrue(fifoMaxEventCount >= 0);
+ assertTrue(fifoReservedEventCount >= 0);
+ assertTrue(fifoReservedEventCount <= fifoMaxEventCount);
if (sensor.getReportingMode() == Sensor.REPORTING_MODE_ONE_SHOT) {
assertTrue("One shot sensors should have zero FIFO Size",
sensor.getFifoMaxEventCount() == 0);
diff --git a/tests/tests/hardware/src/android/hardware/cts/SensorTestCase.java b/tests/tests/hardware/src/android/hardware/cts/SensorTestCase.java
index aee00ed..6454678 100644
--- a/tests/tests/hardware/src/android/hardware/cts/SensorTestCase.java
+++ b/tests/tests/hardware/src/android/hardware/cts/SensorTestCase.java
@@ -22,8 +22,11 @@
import android.app.Instrumentation;
import android.cts.util.DeviceReportLog;
-import android.hardware.cts.helpers.SensorNotSupportedException;
+import android.hardware.Sensor;
import android.hardware.cts.helpers.SensorStats;
+import android.hardware.cts.helpers.SensorTestStateNotSupportedException;
+import android.hardware.cts.helpers.TestSensorEnvironment;
+import android.hardware.cts.helpers.sensoroperations.ISensorOperation;
import android.test.AndroidTestCase;
import android.util.Log;
@@ -34,18 +37,37 @@
// TODO: consolidate all log tags
protected final String LOG_TAG = "TestRunner";
+ /**
+ * By default tests need to run in a {@link TestSensorEnvironment} that assumes each sensor is
+ * running with a load of several listeners, requesting data at different rates.
+ *
+ * In a better world the component acting as builder of {@link ISensorOperation} would compute
+ * this value based on the tests composed.
+ *
+ * Ideally, each {@link Sensor} object would expose this information to clients.
+ */
+ private volatile boolean mEmulateSensorUnderLoad = true;
+
protected SensorTestCase() {}
@Override
public void runTest() throws Throwable {
try {
super.runTest();
- } catch (SensorNotSupportedException e) {
- // the sensor is not supported/available in the device, log a warning and skip the test
+ } catch (SensorTestStateNotSupportedException e) {
+ // the sensor state is not supported in the device, log a warning and skip the test
Log.w(LOG_TAG, e.getMessage());
}
}
+ public void setEmulateSensorUnderLoad(boolean value) {
+ mEmulateSensorUnderLoad = value;
+ }
+
+ protected boolean shouldEmulateSensorUnderLoad() {
+ return mEmulateSensorUnderLoad;
+ }
+
/**
* Utility method to log selected stats to a {@link ReportLog} object. The stats must be
* a number or an array of numbers.
diff --git a/tests/tests/hardware/src/android/hardware/cts/SingleSensorTests.java b/tests/tests/hardware/src/android/hardware/cts/SingleSensorTests.java
index cc7f71c..a323ffa 100644
--- a/tests/tests/hardware/src/android/hardware/cts/SingleSensorTests.java
+++ b/tests/tests/hardware/src/android/hardware/cts/SingleSensorTests.java
@@ -16,11 +16,13 @@
package android.hardware.cts;
+import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.hardware.cts.helpers.SensorCtsHelper;
import android.hardware.cts.helpers.SensorStats;
import android.hardware.cts.helpers.SensorTestInformation;
+import android.hardware.cts.helpers.TestSensorEnvironment;
import android.hardware.cts.helpers.sensoroperations.TestSensorOperation;
import java.util.HashMap;
@@ -34,7 +36,7 @@
* To execute these test cases, the following command can be used:
* </p><pre>
* adb shell am instrument -e class android.hardware.cts.SingleSensorTests \
- * -w com.android.cts.hardware/android.test.InstrumentationCtsTestRunner
+ * -w com.android.cts.hardware/android.test.AndroidJUnitRunner
* </pre><p>
* For each sensor that reports continuously, it takes a set of samples. The test suite verifies
* that the event ordering, frequency, and jitter pass for the collected sensor events. It
@@ -86,9 +88,6 @@
public class SingleSensorTests extends SensorTestCase {
private static final String TAG = "SingleSensorTests";
- private static final int BATCHING_OFF = 0;
- private static final int BATCHING_5S = 5000000;
-
private static final int RATE_200HZ = 5000;
private static final int RATE_100HZ = 10000;
private static final int RATE_50HZ = 20000;
@@ -98,17 +97,8 @@
private static final int RATE_5HZ = 200000;
private static final int RATE_1HZ = 1000000;
- private static final String[] STAT_KEYS = {
- SensorStats.FREQUENCY_KEY,
- SensorStats.JITTER_95_PERCENTILE_KEY,
- SensorStats.EVENT_OUT_OF_ORDER_COUNT_KEY,
- SensorStats.MAGNITUDE_KEY,
- SensorStats.MEAN_KEY,
- SensorStats.STANDARD_DEVIATION_KEY,
- };
-
/**
- * This test verifies that the sensor's properties complies with the required properites set in
+ * This test verifies that the sensor's properties complies with the required properties set in
* the CDD.
* <p>
* It checks that the sampling rate advertised by the sensor under test matches that which is
@@ -122,15 +112,20 @@
expectedProperties.put(Sensor.TYPE_GYROSCOPE, new Object[]{10000});
expectedProperties.put(Sensor.TYPE_MAGNETIC_FIELD, new Object[]{100000});
+ SensorManager sensorManager =
+ (SensorManager) getContext().getSystemService(Context.SENSOR_SERVICE);
+ assertNotNull("SensorManager not present in the system.", sensorManager);
for (Entry<Integer, Object[]> entry : expectedProperties.entrySet()) {
- Sensor sensor = SensorCtsHelper.getSensor(getContext(), entry.getKey());
- String sensorName = SensorTestInformation.getSensorName(entry.getKey());
- if (entry.getValue()[0] != null) {
- int expected = (Integer) entry.getValue()[0];
- String msg = String.format(
- "%s: min delay %dus expected to be less than or equal to %dus",
- sensorName, sensor.getMinDelay(), expected);
- assertTrue(msg, sensor.getMinDelay() <= expected);
+ Sensor sensor = sensorManager.getDefaultSensor(entry.getKey());
+ if (sensor != null) {
+ String sensorName = SensorTestInformation.getSensorName(entry.getKey());
+ if (entry.getValue()[0] != null) {
+ int expected = (Integer) entry.getValue()[0];
+ String msg = String.format(
+ "%s: min delay %dus expected to be less than or equal to %dus",
+ sensorName, sensor.getMinDelay(), expected);
+ assertTrue(msg, sensor.getMinDelay() <= expected);
+ }
}
}
}
@@ -138,513 +133,417 @@
// TODO: Figure out if a better way to enumerate test cases programmatically exists that works
// with CTS framework.
public void testAccelerometer_fastest() throws Throwable {
- runSensorTest(Sensor.TYPE_ACCELEROMETER, SensorManager.SENSOR_DELAY_FASTEST, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_ACCELEROMETER, SensorManager.SENSOR_DELAY_FASTEST);
}
public void testAccelerometer_100hz() throws Throwable {
- runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_100HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_100HZ);
}
public void testAccelerometer_200hz() throws Throwable {
- runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_200HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_200HZ);
}
public void testAccelerometer_50hz() throws Throwable {
- runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_50HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_50HZ);
}
public void testAccelerometer_25hz() throws Throwable {
- runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_25HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_25HZ);
}
public void testAccelerometer_15hz() throws Throwable {
- runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_15HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_15HZ);
}
public void testAccelerometer_10hz() throws Throwable {
- runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_10HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_10HZ);
}
public void testAccelerometer_5hz() throws Throwable {
- runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_5HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_5HZ);
}
public void testAccelerometer_1hz() throws Throwable {
- runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_1HZ, BATCHING_OFF);
- }
-
- public void testAccelerometer_fastest_batching() throws Throwable {
- runSensorTest(Sensor.TYPE_ACCELEROMETER, SensorManager.SENSOR_DELAY_FASTEST, BATCHING_5S);
- }
-
- public void testAccelerometer_50hz_batching() throws Throwable {
- runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_50HZ, BATCHING_5S);
+ runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_1HZ);
}
public void testMagneticField_fastest() throws Throwable {
- runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, SensorManager.SENSOR_DELAY_FASTEST, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, SensorManager.SENSOR_DELAY_FASTEST);
}
public void testMagneticField_200hz() throws Throwable {
- runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_200HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_200HZ);
}
public void testMagneticField_100hz() throws Throwable {
- runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_100HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_100HZ);
}
public void testMagneticField_50hz() throws Throwable {
- runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_50HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_50HZ);
}
public void testMagneticField_25hz() throws Throwable {
- runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_25HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_25HZ);
}
public void testMagneticField_15hz() throws Throwable {
- runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_15HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_15HZ);
}
public void testMagneticField_10hz() throws Throwable {
- runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_10HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_10HZ);
}
public void testMagneticField_5hz() throws Throwable {
- runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_5HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_5HZ);
}
public void testMagneticField_1hz() throws Throwable {
- runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_1HZ, BATCHING_OFF);
- }
-
- public void testMagneticField_fastest_batching() throws Throwable {
- runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, SensorManager.SENSOR_DELAY_FASTEST, BATCHING_5S);
- }
-
- public void testMagneticField_50hz_batching() throws Throwable {
- runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_50HZ, BATCHING_5S);
+ runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_1HZ);
}
@SuppressWarnings("deprecation")
public void testOrientation_fastest() throws Throwable {
- runSensorTest(Sensor.TYPE_ORIENTATION, SensorManager.SENSOR_DELAY_FASTEST, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_ORIENTATION, SensorManager.SENSOR_DELAY_FASTEST);
}
@SuppressWarnings("deprecation")
public void testOrientation_200hz() throws Throwable {
- runSensorTest(Sensor.TYPE_ORIENTATION, RATE_200HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_ORIENTATION, RATE_200HZ);
}
@SuppressWarnings("deprecation")
public void testOrientation_100hz() throws Throwable {
- runSensorTest(Sensor.TYPE_ORIENTATION, RATE_100HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_ORIENTATION, RATE_100HZ);
}
@SuppressWarnings("deprecation")
public void testOrientation_50hz() throws Throwable {
- runSensorTest(Sensor.TYPE_ORIENTATION, RATE_50HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_ORIENTATION, RATE_50HZ);
}
@SuppressWarnings("deprecation")
public void testOrientation_25hz() throws Throwable {
- runSensorTest(Sensor.TYPE_ORIENTATION, RATE_25HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_ORIENTATION, RATE_25HZ);
}
@SuppressWarnings("deprecation")
public void testOrientation_15hz() throws Throwable {
- runSensorTest(Sensor.TYPE_ORIENTATION, RATE_15HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_ORIENTATION, RATE_15HZ);
}
@SuppressWarnings("deprecation")
public void testOrientation_10hz() throws Throwable {
- runSensorTest(Sensor.TYPE_ORIENTATION, RATE_10HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_ORIENTATION, RATE_10HZ);
}
@SuppressWarnings("deprecation")
public void testOrientation_5hz() throws Throwable {
- runSensorTest(Sensor.TYPE_ORIENTATION, RATE_5HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_ORIENTATION, RATE_5HZ);
}
@SuppressWarnings("deprecation")
public void testOrientation_1hz() throws Throwable {
- runSensorTest(Sensor.TYPE_ORIENTATION, RATE_1HZ, BATCHING_OFF);
- }
-
- @SuppressWarnings("deprecation")
- public void testOrientation_fastest_batching() throws Throwable {
- runSensorTest(Sensor.TYPE_ORIENTATION, SensorManager.SENSOR_DELAY_FASTEST, BATCHING_5S);
- }
-
- @SuppressWarnings("deprecation")
- public void testOrientation_50hz_batching() throws Throwable {
- runSensorTest(Sensor.TYPE_ORIENTATION, RATE_50HZ, BATCHING_5S);
+ runSensorTest(Sensor.TYPE_ORIENTATION, RATE_1HZ);
}
public void testGyroscope_fastest() throws Throwable {
- runSensorTest(Sensor.TYPE_GYROSCOPE, SensorManager.SENSOR_DELAY_FASTEST, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_GYROSCOPE, SensorManager.SENSOR_DELAY_FASTEST);
}
public void testGyroscope_200hz() throws Throwable {
- runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_200HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_200HZ);
}
public void testGyroscope_100hz() throws Throwable {
- runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_100HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_100HZ);
}
public void testGyroscope_50hz() throws Throwable {
- runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_50HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_50HZ);
}
public void testGyroscope_25hz() throws Throwable {
- runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_25HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_25HZ);
}
public void testGyroscope_15hz() throws Throwable {
- runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_15HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_15HZ);
}
public void testGyroscope_10hz() throws Throwable {
- runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_10HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_10HZ);
}
public void testGyroscope_5hz() throws Throwable {
- runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_5HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_5HZ);
}
public void testGyroscope_1hz() throws Throwable {
- runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_1HZ, BATCHING_OFF);
- }
-
- public void testGyroscope_fastest_batching() throws Throwable {
- runSensorTest(Sensor.TYPE_GYROSCOPE, SensorManager.SENSOR_DELAY_FASTEST, BATCHING_5S);
- }
-
- public void testGyroscope_50hz_batching() throws Throwable {
- runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_50HZ, BATCHING_5S);
+ runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_1HZ);
}
public void testPressure_fastest() throws Throwable {
- runSensorTest(Sensor.TYPE_PRESSURE, SensorManager.SENSOR_DELAY_FASTEST, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_PRESSURE, SensorManager.SENSOR_DELAY_FASTEST);
}
public void testPressure_200hz() throws Throwable {
- runSensorTest(Sensor.TYPE_PRESSURE, RATE_200HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_PRESSURE, RATE_200HZ);
}
public void testPressure_100hz() throws Throwable {
- runSensorTest(Sensor.TYPE_PRESSURE, RATE_100HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_PRESSURE, RATE_100HZ);
}
public void testPressure_50hz() throws Throwable {
- runSensorTest(Sensor.TYPE_PRESSURE, RATE_50HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_PRESSURE, RATE_50HZ);
}
public void testPressure_25hz() throws Throwable {
- runSensorTest(Sensor.TYPE_PRESSURE, RATE_25HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_PRESSURE, RATE_25HZ);
}
public void testPressure_15hz() throws Throwable {
- runSensorTest(Sensor.TYPE_PRESSURE, RATE_15HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_PRESSURE, RATE_15HZ);
}
public void testPressure_10hz() throws Throwable {
- runSensorTest(Sensor.TYPE_PRESSURE, RATE_10HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_PRESSURE, RATE_10HZ);
}
public void testPressure_5hz() throws Throwable {
- runSensorTest(Sensor.TYPE_PRESSURE, RATE_5HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_PRESSURE, RATE_5HZ);
}
public void testPressure_1hz() throws Throwable {
- runSensorTest(Sensor.TYPE_PRESSURE, RATE_1HZ, BATCHING_OFF);
- }
-
- public void testPressure_fastest_batching() throws Throwable {
- runSensorTest(Sensor.TYPE_PRESSURE, SensorManager.SENSOR_DELAY_FASTEST, BATCHING_5S);
- }
-
- public void testPressure_50hz_batching() throws Throwable {
- runSensorTest(Sensor.TYPE_PRESSURE, RATE_50HZ, BATCHING_5S);
+ runSensorTest(Sensor.TYPE_PRESSURE, RATE_1HZ);
}
public void testGravity_fastest() throws Throwable {
- runSensorTest(Sensor.TYPE_GRAVITY, SensorManager.SENSOR_DELAY_FASTEST, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_GRAVITY, SensorManager.SENSOR_DELAY_FASTEST);
}
public void testGravity_200hz() throws Throwable {
- runSensorTest(Sensor.TYPE_GRAVITY, RATE_200HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_GRAVITY, RATE_200HZ);
}
public void testGravity_100hz() throws Throwable {
- runSensorTest(Sensor.TYPE_GRAVITY, RATE_100HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_GRAVITY, RATE_100HZ);
}
public void testGravity_50hz() throws Throwable {
- runSensorTest(Sensor.TYPE_GRAVITY, RATE_50HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_GRAVITY, RATE_50HZ);
}
public void testGravity_25hz() throws Throwable {
- runSensorTest(Sensor.TYPE_GRAVITY, RATE_25HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_GRAVITY, RATE_25HZ);
}
public void testGravity_15hz() throws Throwable {
- runSensorTest(Sensor.TYPE_GRAVITY, RATE_15HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_GRAVITY, RATE_15HZ);
}
public void testGravity_10hz() throws Throwable {
- runSensorTest(Sensor.TYPE_GRAVITY, RATE_10HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_GRAVITY, RATE_10HZ);
}
public void testGravity_5hz() throws Throwable {
- runSensorTest(Sensor.TYPE_GRAVITY, RATE_5HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_GRAVITY, RATE_5HZ);
}
public void testGravity_1hz() throws Throwable {
- runSensorTest(Sensor.TYPE_GRAVITY, RATE_1HZ, BATCHING_OFF);
- }
-
- public void testGravity_fastest_batching() throws Throwable {
- runSensorTest(Sensor.TYPE_GRAVITY, SensorManager.SENSOR_DELAY_FASTEST, BATCHING_5S);
- }
-
- public void testGravity_50hz_batching() throws Throwable {
- runSensorTest(Sensor.TYPE_GRAVITY, RATE_50HZ, BATCHING_5S);
+ runSensorTest(Sensor.TYPE_GRAVITY, RATE_1HZ);
}
public void testRotationVector_fastest() throws Throwable {
- runSensorTest(Sensor.TYPE_ROTATION_VECTOR, SensorManager.SENSOR_DELAY_FASTEST,
- BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_ROTATION_VECTOR, SensorManager.SENSOR_DELAY_FASTEST);
}
public void testRotationVector_200hz() throws Throwable {
- runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_200HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_200HZ);
}
public void testRotationVector_100hz() throws Throwable {
- runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_100HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_100HZ);
}
public void testRotationVector_50hz() throws Throwable {
- runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_50HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_50HZ);
}
public void testRotationVector_25hz() throws Throwable {
- runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_25HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_25HZ);
}
public void testRotationVector_15hz() throws Throwable {
- runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_15HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_15HZ);
}
public void testRotationVector_10hz() throws Throwable {
- runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_10HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_10HZ);
}
public void testRotationVector_5hz() throws Throwable {
- runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_5HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_5HZ);
}
public void testRotationVector_1hz() throws Throwable {
- runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_1HZ, BATCHING_OFF);
- }
-
- public void testRotationVector_fastest_batching() throws Throwable {
- runSensorTest(Sensor.TYPE_ROTATION_VECTOR, SensorManager.SENSOR_DELAY_FASTEST, BATCHING_5S);
- }
-
- public void testRotationVector_50hz_batching() throws Throwable {
- runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_50HZ, BATCHING_5S);
+ runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_1HZ);
}
public void testMagneticFieldUncalibrated_fastest() throws Throwable {
- runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, SensorManager.SENSOR_DELAY_FASTEST,
- BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, SensorManager.SENSOR_DELAY_FASTEST);
}
public void testMagneticFieldUncalibrated_200hz() throws Throwable {
- runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_200HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_200HZ);
}
public void testMagneticFieldUncalibrated_100hz() throws Throwable {
- runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_100HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_100HZ);
}
public void testMagneticFieldUncalibrated_50hz() throws Throwable {
- runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_50HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_50HZ);
}
public void testMagneticFieldUncalibrated_25hz() throws Throwable {
- runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_25HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_25HZ);
}
public void testMagneticFieldUncalibrated_15hz() throws Throwable {
- runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_15HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_15HZ);
}
public void testMagneticFieldUncalibrated_10hz() throws Throwable {
- runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_10HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_10HZ);
}
public void testMagneticFieldUncalibrated_5hz() throws Throwable {
- runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_5HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_5HZ);
}
public void testMagneticFieldUncalibrated_1hz() throws Throwable {
- runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_1HZ, BATCHING_OFF);
- }
-
- public void testMagneticFieldUncalibrated_fastest_batching() throws Throwable {
- runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, SensorManager.SENSOR_DELAY_FASTEST,
- BATCHING_5S);
- }
-
- public void testMagneticFieldUncalibrated_50hz_batching() throws Throwable {
- runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_50HZ, BATCHING_5S);
+ runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_1HZ);
}
public void testGameRotationVector_fastest() throws Throwable {
- runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, SensorManager.SENSOR_DELAY_FASTEST,
- BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, SensorManager.SENSOR_DELAY_FASTEST);
}
public void testGameRotationVector_200hz() throws Throwable {
- runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_200HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_200HZ);
}
public void testGameRotationVector_100hz() throws Throwable {
- runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_100HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_100HZ);
}
public void testGameRotationVector_50hz() throws Throwable {
- runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_50HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_50HZ);
}
public void testGameRotationVector_25hz() throws Throwable {
- runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_25HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_25HZ);
}
public void testGameRotationVector_15hz() throws Throwable {
- runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_15HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_15HZ);
}
public void testGameRotationVector_10hz() throws Throwable {
- runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_10HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_10HZ);
}
public void testGameRotationVector_5hz() throws Throwable {
- runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_5HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_5HZ);
}
public void testGameRotationVector_1hz() throws Throwable {
- runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_1HZ, BATCHING_OFF);
- }
-
- public void testGameRotationVector_fastest_batching() throws Throwable {
- runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, SensorManager.SENSOR_DELAY_FASTEST,
- BATCHING_5S);
- }
-
- public void testGameRotationVector_50hz_batching() throws Throwable {
- runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_50HZ, BATCHING_5S);
+ runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_1HZ);
}
public void testGyroscopeUncalibrated_fastest() throws Throwable {
- runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, SensorManager.SENSOR_DELAY_FASTEST,
- BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, SensorManager.SENSOR_DELAY_FASTEST);
}
public void testGyroscopeUncalibrated_200hz() throws Throwable {
- runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_200HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_200HZ);
}
public void testGyroscopeUncalibrated_100hz() throws Throwable {
- runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_100HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_100HZ);
}
public void testGyroscopeUncalibrated_50hz() throws Throwable {
- runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_50HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_50HZ);
}
public void testGyroscopeUncalibrated_25hz() throws Throwable {
- runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_25HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_25HZ);
}
public void testGyroscopeUncalibrated_15hz() throws Throwable {
- runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_15HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_15HZ);
}
public void testGyroscopeUncalibrated_10hz() throws Throwable {
- runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_10HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_10HZ);
}
public void testGyroscopeUncalibrated_5hz() throws Throwable {
- runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_5HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_5HZ);
}
public void testGyroscopeUncalibrated_1hz() throws Throwable {
- runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_1HZ, BATCHING_OFF);
- }
-
- public void testGyroscopeUncalibrated_fastest_batching() throws Throwable {
- runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, SensorManager.SENSOR_DELAY_FASTEST,
- BATCHING_5S);
- }
-
- public void testGyroscopeUncalibrated_50hz_batching() throws Throwable {
- runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_50HZ, BATCHING_5S);
+ runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_1HZ);
}
public void testGeomagneticRotationVector_fastest() throws Throwable {
- runSensorTest(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR, SensorManager.SENSOR_DELAY_FASTEST,
- BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR, SensorManager.SENSOR_DELAY_FASTEST);
}
public void testLinearAcceleration_200hz() throws Throwable {
- runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_200HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_200HZ);
}
public void testLinearAcceleration_100hz() throws Throwable {
- runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_100HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_100HZ);
}
public void testLinearAcceleration_50hz() throws Throwable {
- runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_50HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_50HZ);
}
public void testLinearAcceleration_25hz() throws Throwable {
- runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_25HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_25HZ);
}
public void testLinearAcceleration_15hz() throws Throwable {
- runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_15HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_15HZ);
}
public void testLinearAcceleration_10hz() throws Throwable {
- runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_10HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_10HZ);
}
public void testLinearAcceleration_5hz() throws Throwable {
- runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_5HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_5HZ);
}
public void testLinearAcceleration_1hz() throws Throwable {
- runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_1HZ, BATCHING_OFF);
+ runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_1HZ);
}
- public void testLinearAcceleration_fastest_batching() throws Throwable {
- runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, SensorManager.SENSOR_DELAY_FASTEST,
- BATCHING_5S);
- }
-
- public void testLinearAcceleration_50hz_batching() throws Throwable {
- runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_50HZ, BATCHING_5S);
- }
-
- private void runSensorTest(int sensorType, int rateUs, int maxBatchReportLatencyUs)
- throws Throwable {
- TestSensorOperation op = new TestSensorOperation(this.getContext(), sensorType,
- rateUs, maxBatchReportLatencyUs, 5, TimeUnit.SECONDS);
- op.setDefaultVerifications();
+ private void runSensorTest(int sensorType, int rateUs) throws Throwable {
+ TestSensorEnvironment environment = new TestSensorEnvironment(
+ getContext(),
+ sensorType,
+ shouldEmulateSensorUnderLoad(),
+ rateUs);
+ TestSensorOperation op = new TestSensorOperation(environment, 5, TimeUnit.SECONDS);
+ op.addDefaultVerifications();
op.setLogEvents(true);
try {
op.execute();
@@ -659,9 +558,7 @@
sensorRate = String.format("%.0fhz",
SensorCtsHelper.getFrequency(rateUs, TimeUnit.MICROSECONDS));
}
- String batching = maxBatchReportLatencyUs > 0 ? "_batching" : "";
- String fileName = String.format("single_sensor_%s_%s%s.txt",
- sensorName, sensorRate, batching);
+ String fileName = String.format("single_sensor_%s_%s.txt", sensorName, sensorRate);
SensorStats.logStatsToFile(fileName, op.getStats());
}
}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/SensorCtsHelper.java b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorCtsHelper.java
index b3f9fec..52f37e8 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/SensorCtsHelper.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorCtsHelper.java
@@ -15,10 +15,6 @@
*/
package android.hardware.cts.helpers;
-import android.content.Context;
-import android.hardware.Sensor;
-import android.hardware.SensorManager;
-
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -104,30 +100,6 @@
}
/**
- * Get the default sensor for a given type.
- */
- public static Sensor getSensor(Context context, int sensorType) {
- SensorManager sensorManager = getSensorManager(context);
- Sensor sensor = sensorManager.getDefaultSensor(sensorType);
- if(sensor == null) {
- throw new SensorNotSupportedException(sensorType);
- }
- return sensor;
- }
-
- /**
- * Get all the sensors for a given type.
- */
- public static List<Sensor> getSensors(Context context, int sensorType) {
- SensorManager sensorManager = getSensorManager(context);
- List<Sensor> sensors = sensorManager.getSensorList(sensorType);
- if (sensors.size() == 0) {
- throw new SensorNotSupportedException(sensorType);
- }
- return sensors;
- }
-
- /**
* Convert a period to frequency in Hz.
*/
public static <TValue extends Number> double getFrequency(TValue period, TimeUnit unit) {
@@ -149,37 +121,6 @@
}
/**
- * Convert the sensor delay or rate in microseconds into delay in microseconds.
- * <p>
- * The flags SensorManager.SENSOR_DELAY_[GAME|UI|NORMAL] are not supported since the CDD does
- * not specify values for these flags. The rate is set to the max of
- * {@link Sensor#getMinDelay()} and the rate given.
- * </p>
- */
- public static int getDelay(Sensor sensor, int rateUs) {
- if (!isDelayRateTestable(rateUs)) {
- throw new IllegalArgumentException("rateUs cannot be SENSOR_DELAY_[GAME|UI|NORMAL]");
- }
- int delay;
- if (rateUs == SensorManager.SENSOR_DELAY_FASTEST) {
- delay = 0;
- } else {
- delay = rateUs;
- }
- return Math.max(delay, sensor.getMinDelay());
- }
-
- /**
- * Return true if the operation rate is not one of {@link SensorManager#SENSOR_DELAY_GAME},
- * {@link SensorManager#SENSOR_DELAY_UI}, or {@link SensorManager#SENSOR_DELAY_NORMAL}.
- */
- public static boolean isDelayRateTestable(int rateUs) {
- return (rateUs != SensorManager.SENSOR_DELAY_GAME
- && rateUs != SensorManager.SENSOR_DELAY_UI
- && rateUs != SensorManager.SENSOR_DELAY_NORMAL);
- }
-
- /**
* Helper method to sleep for a given duration.
*/
public static void sleep(long duration, TimeUnit timeUnit) {
@@ -194,34 +135,53 @@
/**
* Format an assertion message.
*
- * @param sensor the {@link Sensor}
* @param label the verification name
- * @param rateUs the rate of the sensor
- * @param maxBatchReportLatencyUs the max batch report latency of the sensor
+ * @param environment the environment of the test
+ *
* @return The formatted string
*/
- public static String formatAssertionMessage(Sensor sensor, String label, int rateUs,
- int maxBatchReportLatencyUs) {
- return String.format("%s | %s", label,
- SensorTestInformation.getSensorName(sensor.getType()));
+ public static String formatAssertionMessage(String label, TestSensorEnvironment environment) {
+ return formatAssertionMessage(label, environment, "");
}
/**
* Format an assertion message with a custom message.
*
- * @param sensor the {@link Sensor}
* @param label the verification name
- * @param rateUs the rate of the sensor
- * @param maxBatchReportLatencyUs the max batch report latency of the sensor
+ * @param environment the environment of the test
* @param format the additional format string
* @param params the additional format params
+ *
* @return The formatted string
*/
- public static String formatAssertionMessage(Sensor sensor, String label, int rateUs,
- int maxBatchReportLatencyUs, String format, Object ... params) {
- return String.format("%s | %s, rateUs: %d, maxBatchReportLatencyUs: %d | %s",
- label, SensorTestInformation.getSensorName(sensor.getType()),
- rateUs, maxBatchReportLatencyUs, String.format(format, params));
+ public static String formatAssertionMessage(
+ String label,
+ TestSensorEnvironment environment,
+ String format,
+ Object ... params) {
+ return formatAssertionMessage(label, environment, String.format(format, params));
+ }
+
+ /**
+ * Format an assertion message.
+ *
+ * @param label the verification name
+ * @param environment the environment of the test
+ * @param extras the additional information for the assertion
+ *
+ * @return The formatted string
+ */
+ public static String formatAssertionMessage(
+ String label,
+ TestSensorEnvironment environment,
+ String extras) {
+ return String.format(
+ "%s | sensor=%s, rateUs=%d, maxBatchReportLatenchUs=%d | %s",
+ label,
+ SensorTestInformation.getSensorName(environment.getSensor().getType()),
+ environment.getRequestedSamplingPeriodUs(),
+ environment.getMaxReportLatencyUs(),
+ extras);
}
/**
@@ -234,18 +194,4 @@
throw new IllegalStateException("Collection cannot be null or empty");
}
}
-
- /**
- * Get the SensorManager.
- *
- * @throws IllegalStateException if the SensorManager is not present in the system.
- */
- private static SensorManager getSensorManager(Context context) {
- SensorManager sensorManager = (SensorManager) context.getSystemService(
- Context.SENSOR_SERVICE);
- if(sensorManager == null) {
- throw new IllegalStateException("SensorService is not present in the system.");
- }
- return sensorManager;
- }
}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/SensorNotSupportedException.java b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorNotSupportedException.java
index 4c413d7..53e4cae 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/SensorNotSupportedException.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorNotSupportedException.java
@@ -18,14 +18,11 @@
/**
* Exception that indicates that a given sensor is not supported in the device.
- * This exception can be caught in tests to safely ignore test cases that are not necessary in a
- * given environment.
*/
-public class SensorNotSupportedException extends RuntimeException {
+public class SensorNotSupportedException extends SensorTestStateNotSupportedException {
public SensorNotSupportedException(int sensorType) {
- super(String.format(
- "Sensor '%s' of type %d is not supported.",
+ super("Sensor '%s' of type %d is not supported.",
SensorTestInformation.getSensorName(sensorType),
- sensorType));
+ sensorType);
}
}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/SensorTestInformation.java b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorTestInformation.java
index b220b00..86c164d 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/SensorTestInformation.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorTestInformation.java
@@ -25,41 +25,8 @@
public class SensorTestInformation {
private SensorTestInformation() {}
- public enum SensorReportingMode {
- CONTINUOUS,
- ON_CHANGE,
- ONE_SHOT,
- }
-
- @SuppressWarnings("deprecation")
- public static SensorReportingMode getReportingMode(int sensorType) {
- switch(sensorType) {
- case Sensor.TYPE_ACCELEROMETER:
- case Sensor.TYPE_MAGNETIC_FIELD:
- case Sensor.TYPE_ORIENTATION:
- case Sensor.TYPE_GYROSCOPE:
- case Sensor.TYPE_PRESSURE:
- case Sensor.TYPE_GRAVITY:
- case Sensor.TYPE_LINEAR_ACCELERATION:
- case Sensor.TYPE_ROTATION_VECTOR:
- case Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED:
- case Sensor.TYPE_GAME_ROTATION_VECTOR:
- case Sensor.TYPE_GYROSCOPE_UNCALIBRATED:
- case Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR:
- return SensorReportingMode.CONTINUOUS;
- case Sensor.TYPE_LIGHT:
- case Sensor.TYPE_TEMPERATURE:
- case Sensor.TYPE_PROXIMITY:
- case Sensor.TYPE_RELATIVE_HUMIDITY:
- case Sensor.TYPE_AMBIENT_TEMPERATURE:
- case Sensor.TYPE_STEP_DETECTOR:
- case Sensor.TYPE_STEP_COUNTER:
- return SensorReportingMode.ON_CHANGE;
- case Sensor.TYPE_SIGNIFICANT_MOTION:
- return SensorReportingMode.ONE_SHOT;
- default:
- return null;
- }
+ public static String getSensorName(Sensor sensor) {
+ return getSensorName(sensor.getType());
}
public static String getSensorName(int sensorType) {
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/SensorTestStateNotSupportedException.java b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorTestStateNotSupportedException.java
new file mode 100644
index 0000000..435632d
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorTestStateNotSupportedException.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2014 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.hardware.cts.helpers;
+
+/**
+ * Exception that indicates that a given state in sensor tests is not supported in the device.
+ * This exception can be caught in tests to safely ignore test cases that are not necessary in a
+ * given environment.
+ */
+public class SensorTestStateNotSupportedException extends RuntimeException {
+ public SensorTestStateNotSupportedException(String format, Object ... params) {
+ super(String.format(format, params));
+ }
+
+ public SensorTestStateNotSupportedException(String message) {
+ super(message);
+ }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorEnvironment.java b/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorEnvironment.java
new file mode 100644
index 0000000..b1ffd85
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorEnvironment.java
@@ -0,0 +1,231 @@
+/*
+ * Copyright (C) 2014 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.hardware.cts.helpers;
+
+import android.content.Context;
+import android.hardware.Sensor;
+import android.hardware.SensorManager;
+import android.hardware.cts.helpers.sensoroperations.ISensorOperation;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * A class that encapsulates base environment information for the {@link ISensorOperation}.
+ * The environment is self contained and carries its state around all the sensor test framework.
+ */
+public class TestSensorEnvironment {
+ private final Context mContext;
+ private final Sensor mSensor;
+ private final boolean mSensorMightHaveMoreListeners;
+ private final int mSamplingPeriodUs;
+ private final int mMaxReportLatencyUs;
+
+ /**
+ * Constructs an environment for sensor testing.
+ *
+ * @param context The context for the test
+ * @param sensorType The type of the sensor under test
+ * @param samplingPeriodUs The requested collection period for the sensor under test
+ */
+ public TestSensorEnvironment(Context context, int sensorType, int samplingPeriodUs) {
+ this(context, sensorType, false /* sensorMightHaveMoreListeners */, samplingPeriodUs);
+ }
+
+ /**
+ * Constructs an environment for sensor testing.
+ *
+ * @param context The context for the test
+ * @param sensorType The type of the sensor under test
+ * @param samplingPeriodUs The requested collection period for the sensor under test
+ * @param maxReportLatencyUs The requested collection report latency for the sensor under test
+ */
+ public TestSensorEnvironment(
+ Context context,
+ int sensorType,
+ int samplingPeriodUs,
+ int maxReportLatencyUs) {
+ this(context,
+ sensorType,
+ false /* sensorMightHaveMoreListeners */,
+ samplingPeriodUs,
+ maxReportLatencyUs);
+ }
+
+ /**
+ * Constructs an environment for sensor testing.
+ *
+ * @param context The context for the test
+ * @param sensorType The type of the sensor under test
+ * @param sensorMightHaveMoreListeners Whether the sensor under test is acting under load
+ * @param samplingPeriodUs The requested collection period for the sensor under test
+ */
+ public TestSensorEnvironment(
+ Context context,
+ int sensorType,
+ boolean sensorMightHaveMoreListeners,
+ int samplingPeriodUs) {
+ this(context,
+ sensorType,
+ sensorMightHaveMoreListeners,
+ samplingPeriodUs,
+ 0 /* maxReportLatencyUs */);
+ }
+
+ /**
+ * Constructs an environment for sensor testing.
+ *
+ * @param context The context for the test
+ * @param sensorType The type of the sensor under test
+ * @param sensorMightHaveMoreListeners Whether the sensor under test is acting under load
+ * @param samplingPeriodUs The requested collection period for the sensor under test
+ * @param maxReportLatencyUs The requested collection report latency for the sensor under test
+ */
+ public TestSensorEnvironment(
+ Context context,
+ int sensorType,
+ boolean sensorMightHaveMoreListeners,
+ int samplingPeriodUs,
+ int maxReportLatencyUs) {
+ this(context,
+ getSensor(context, sensorType),
+ sensorMightHaveMoreListeners,
+ samplingPeriodUs,
+ maxReportLatencyUs);
+ }
+
+ /**
+ * Constructs an environment for sensor testing.
+ *
+ * @param context The context for the test
+ * @param sensor The sensor under test
+ * @param sensorMightHaveMoreListeners Whether the sensor under test is acting under load (this
+ * usually implies that there are several listeners
+ * requesting different sampling periods)
+ * @param samplingPeriodUs The requested collection period for the sensor under test
+ * @param maxReportLatencyUs The requested collection report latency for the sensor under test
+ */
+ public TestSensorEnvironment(
+ Context context,
+ Sensor sensor,
+ boolean sensorMightHaveMoreListeners,
+ int samplingPeriodUs,
+ int maxReportLatencyUs) {
+ mContext = context;
+ mSensor = sensor;
+ mSensorMightHaveMoreListeners = sensorMightHaveMoreListeners;
+ mSamplingPeriodUs = samplingPeriodUs;
+ mMaxReportLatencyUs = maxReportLatencyUs;
+ }
+
+ /**
+ * @return The context instance associated with the test.
+ */
+ public Context getContext() {
+ return mContext;
+ }
+
+ /**
+ * @return The sensor under test.
+ */
+ public Sensor getSensor() {
+ return mSensor;
+ }
+
+ /**
+ * @return The requested collection rate in microseconds.
+ */
+ public int getRequestedSamplingPeriodUs() {
+ return mSamplingPeriodUs;
+ }
+
+ /**
+ * @return The frequency equivalent to {@link #getRequestedSamplingPeriodUs()}.
+ */
+ public double getFrequencyHz() {
+ return SensorCtsHelper.getFrequency(mSamplingPeriodUs, TimeUnit.MICROSECONDS);
+ }
+
+ /**
+ * @return The requested collection max batch report latency in microseconds.
+ */
+ public int getMaxReportLatencyUs() {
+ return mMaxReportLatencyUs;
+ }
+
+ /**
+ * Returns {@code true} if there might be other listeners of {@link #getSensor()} requesting
+ * data at different sampling rates (the rates are unknown); false otherwise.
+ */
+ public boolean isSensorSamplingRateOverloaded() {
+ return mSensorMightHaveMoreListeners && mSamplingPeriodUs != SensorManager.SENSOR_DELAY_FASTEST;
+ }
+
+ /**
+ * Convert the {@link #getRequestedSamplingPeriodUs()} into delay in microseconds.
+ * <p>
+ * The flags SensorManager.SENSOR_DELAY_[GAME|UI|NORMAL] are not supported since the CDD does
+ * not specify values for these flags. The rate is set to the max of
+ * {@link Sensor#getMinDelay()} and the rate given.
+ * </p>
+ */
+ public int getExpectedSamplingPeriodUs() {
+ if (!isDelayRateTestable()) {
+ throw new IllegalArgumentException("rateUs cannot be SENSOR_DELAY_[GAME|UI|NORMAL]");
+ }
+
+ int expectedSamplingPeriodUs = mSamplingPeriodUs;
+ int sensorMaxDelay = mSensor.getMaxDelay();
+ if (sensorMaxDelay > 0) {
+ expectedSamplingPeriodUs = Math.min(expectedSamplingPeriodUs, sensorMaxDelay);
+ }
+
+ return Math.max(expectedSamplingPeriodUs, mSensor.getMinDelay());
+ }
+
+ /**
+ * Get the default sensor for a given type.
+ *
+ * @deprecated Used for historical reasons, sensor tests must be written around Sensor objects,
+ * so all sensors of a given type are exercised.
+ */
+ @Deprecated
+ public static Sensor getSensor(Context context, int sensorType) {
+ SensorManager sensorManager =
+ (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
+ if (sensorManager == null) {
+ throw new IllegalStateException("SensorService is not present in the system.");
+ }
+
+ Sensor sensor = sensorManager.getDefaultSensor(sensorType);
+ if(sensor == null) {
+ throw new SensorNotSupportedException(sensorType);
+ }
+ return sensor;
+ }
+
+ /**
+ * Return true if {@link #getRequestedSamplingPeriodUs()} is not one of
+ * {@link SensorManager#SENSOR_DELAY_GAME}, {@link SensorManager#SENSOR_DELAY_UI}, or
+ * {@link SensorManager#SENSOR_DELAY_NORMAL}.
+ */
+ private boolean isDelayRateTestable() {
+ return (mSamplingPeriodUs >= 0
+ && mSamplingPeriodUs != SensorManager.SENSOR_DELAY_GAME
+ && mSamplingPeriodUs != SensorManager.SENSOR_DELAY_UI
+ && mSamplingPeriodUs != SensorManager.SENSOR_DELAY_NORMAL);
+ }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorEventListener.java b/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorEventListener.java
index f06b9d7..5197184 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorEventListener.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorEventListener.java
@@ -40,13 +40,10 @@
private final SensorEventListener2 mListener;
- private volatile CountDownLatch mEventLatch = null;
+ private volatile CountDownLatch mEventLatch;
private volatile CountDownLatch mFlushLatch = new CountDownLatch(1);
-
- private Sensor mSensor = null;
- private int mRateUs = 0;
- private int mMaxBatchReportLatencyUs = 0;
- private boolean mLogEvents = false;
+ private volatile TestSensorEnvironment mEnvironment;
+ private volatile boolean mLogEvents;
/**
* Construct a {@link TestSensorEventListener}.
@@ -74,10 +71,8 @@
/**
* Set the sensor, rate, and batch report latency used for the assertions.
*/
- public void setSensorInfo(Sensor sensor, int rateUs, int maxBatchReportLatencyUs) {
- mSensor = sensor;
- mRateUs = rateUs;
- mMaxBatchReportLatencyUs = maxBatchReportLatencyUs;
+ public void setEnvironment(TestSensorEnvironment environment) {
+ mEnvironment = environment;
}
/**
@@ -111,7 +106,9 @@
Log.v(LOG_TAG, String.format(
"Sensor %d: sensor_timestamp=%d, received_timestamp=%d, values=%s",
- mSensor.getType(), event.timestamp, System.nanoTime(),
+ mEnvironment.getSensor().getType(),
+ event.timestamp,
+ System.nanoTime(),
Arrays.toString(event.values)));
}
}
@@ -146,9 +143,9 @@
CountDownLatch latch = mFlushLatch;
try {
if(latch != null) {
- String message = SensorCtsHelper.formatAssertionMessage(mSensor, "WaitForFlush",
- mRateUs, mMaxBatchReportLatencyUs);
- Assert.assertTrue(message, latch.await(FLUSH_TIMEOUT_US, TimeUnit.MICROSECONDS));
+ Assert.assertTrue(
+ SensorCtsHelper.formatAssertionMessage("WaitForFlush", mEnvironment),
+ latch.await(FLUSH_TIMEOUT_US, TimeUnit.MICROSECONDS));
}
} catch(InterruptedException e) {
// Ignore
@@ -163,14 +160,17 @@
public void waitForEvents(int eventCount) {
mEventLatch = new CountDownLatch(eventCount);
try {
- int rateUs = SensorCtsHelper.getDelay(mSensor, mRateUs);
+ int rateUs = mEnvironment.getExpectedSamplingPeriodUs();
// Timeout is 2 * event count * expected period + batch timeout + default wait
long timeoutUs = ((2 * eventCount * rateUs)
- + mMaxBatchReportLatencyUs + EVENT_TIMEOUT_US);
+ + mEnvironment.getMaxReportLatencyUs()
+ + EVENT_TIMEOUT_US);
- String message = SensorCtsHelper.formatAssertionMessage(mSensor, "WaitForEvents",
- mRateUs, mMaxBatchReportLatencyUs, "count:%d, available:%d", eventCount,
- mEventLatch.getCount());
+ String message = SensorCtsHelper.formatAssertionMessage(
+ "WaitForEvents",
+ mEnvironment,
+ "count:%d, available:%d",
+ eventCount, mEventLatch.getCount());
Assert.assertTrue(message, mEventLatch.await(timeoutUs, TimeUnit.MICROSECONDS));
} catch(InterruptedException e) {
// Ignore
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorManager.java b/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorManager.java
index a45ad70..a62107b 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorManager.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorManager.java
@@ -16,6 +16,8 @@
package android.hardware.cts.helpers;
+import junit.framework.Assert;
+
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEventListener;
@@ -23,8 +25,6 @@
import android.hardware.SensorManager;
import android.util.Log;
-import junit.framework.Assert;
-
import java.util.concurrent.TimeUnit;
/**
@@ -53,21 +53,29 @@
private static final String LOG_TAG = "TestSensorManager";
private final SensorManager mSensorManager;
- private final Sensor mSensor;
- private final int mRateUs;
- private final int mMaxBatchReportLatencyUs;
+ private final TestSensorEnvironment mEnvironment;
- private TestSensorEventListener mTestSensorEventListener = null;
+ private TestSensorEventListener mTestSensorEventListener;
+
+ /**
+ * @Deprecated Use {@link #TestSensorManager(TestSensorEnvironment)} instead.
+ */
+ @Deprecated
+ public TestSensorManager(
+ Context context,
+ int sensorType,
+ int rateUs,
+ int maxBatchReportLatencyUs) {
+ this(new TestSensorEnvironment(context, sensorType, rateUs, maxBatchReportLatencyUs));
+ }
/**
* Construct a {@link TestSensorManager}.
*/
- public TestSensorManager(Context context, int sensorType, int rateUs,
- int maxBatchReportLatencyUs) {
- mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
- mSensor = SensorCtsHelper.getSensor(context, sensorType);
- mRateUs = rateUs;
- mMaxBatchReportLatencyUs = maxBatchReportLatencyUs;
+ public TestSensorManager(TestSensorEnvironment environment) {
+ mSensorManager =
+ (SensorManager) environment.getContext().getSystemService(Context.SENSOR_SERVICE);
+ mEnvironment = environment;
}
/**
@@ -83,12 +91,14 @@
}
mTestSensorEventListener = listener != null ? listener : new TestSensorEventListener();
- mTestSensorEventListener.setSensorInfo(mSensor, mRateUs, mMaxBatchReportLatencyUs);
+ mTestSensorEventListener.setEnvironment(mEnvironment);
- String message = SensorCtsHelper.formatAssertionMessage(mSensor, "registerListener",
- mRateUs, mMaxBatchReportLatencyUs);
- boolean result = mSensorManager.registerListener(mTestSensorEventListener, mSensor, mRateUs,
- mMaxBatchReportLatencyUs);
+ String message = SensorCtsHelper.formatAssertionMessage("registerListener", mEnvironment);
+ boolean result = mSensorManager.registerListener(
+ mTestSensorEventListener,
+ mEnvironment.getSensor(),
+ mEnvironment.getRequestedSamplingPeriodUs(),
+ mEnvironment.getMaxReportLatencyUs());
Assert.assertTrue(message, result);
}
@@ -101,7 +111,9 @@
return;
}
- mSensorManager.unregisterListener(mTestSensorEventListener, mSensor);
+ mSensorManager.unregisterListener(
+ mTestSensorEventListener,
+ mEnvironment.getSensor());
mTestSensorEventListener = null;
}
@@ -140,9 +152,9 @@
return;
}
- String message = SensorCtsHelper.formatAssertionMessage(mSensor, "Flush", mRateUs,
- mMaxBatchReportLatencyUs);
- Assert.assertTrue(message, mSensorManager.flush(mTestSensorEventListener));
+ Assert.assertTrue(
+ SensorCtsHelper.formatAssertionMessage("Flush", mEnvironment),
+ mSensorManager.flush(mTestSensorEventListener));
}
/**
@@ -213,9 +225,25 @@
}
/**
- * Get the sensor under test.
+ * Registers a listener, waits for a specific duration, calls flush, and waits for flush to
+ * complete.
*/
- public Sensor getSensor() {
- return mSensor;
+ public void runSensorAndFlush(
+ TestSensorEventListener listener,
+ long duration,
+ TimeUnit timeUnit) {
+ if (mTestSensorEventListener != null) {
+ Log.w(LOG_TAG, "Listener already registered, returning.");
+ return;
+ }
+
+ try {
+ registerListener(listener);
+ SensorCtsHelper.sleep(duration, timeUnit);
+ startFlush();
+ listener.waitForFlushComplete();
+ } finally {
+ unregisterListener();
+ }
}
}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensoroperations/TestSensorFlushOperation.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensoroperations/TestSensorFlushOperation.java
new file mode 100644
index 0000000..1fb6bef
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensoroperations/TestSensorFlushOperation.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2014 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.hardware.cts.helpers.sensoroperations;
+
+import android.hardware.cts.helpers.TestSensorEnvironment;
+import android.hardware.cts.helpers.TestSensorEventListener;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * A {@link ISensorOperation} used to verify that sensor events and sensor values are correct.
+ * <p>
+ * Provides methods to set test expectations as well as providing a set of default expectations
+ * depending on sensor type. When {{@link #execute()} is called, the sensor will collect the
+ * events, call flush, and then run all the tests.
+ * </p>
+ */
+public class TestSensorFlushOperation extends VerifiableSensorOperation {
+ private final Long mDuration;
+ private final TimeUnit mTimeUnit;
+
+ /**
+ * Create a {@link TestSensorOperation}.
+ *
+ * @param environment the test environment
+ * @param duration the duration to gather events before calling {@code SensorManager.flush()}
+ * @param timeUnit the time unit of the duration
+ */
+ public TestSensorFlushOperation(
+ TestSensorEnvironment environment,
+ long duration,
+ TimeUnit timeUnit) {
+ super(environment);
+ mDuration = duration;
+ mTimeUnit = timeUnit;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected void doExecute(TestSensorEventListener listener) {
+ mSensorManager.runSensorAndFlush(listener, mDuration, mTimeUnit);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected VerifiableSensorOperation doClone() {
+ return new TestSensorFlushOperation(mEnvironment, mDuration,mTimeUnit);
+ }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensoroperations/TestSensorOperation.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensoroperations/TestSensorOperation.java
index b841eda..6c3851e 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/sensoroperations/TestSensorOperation.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensoroperations/TestSensorOperation.java
@@ -16,26 +16,9 @@
package android.hardware.cts.helpers.sensoroperations;
-import android.content.Context;
-import android.hardware.Sensor;
-import android.hardware.cts.helpers.SensorCtsHelper;
-import android.hardware.cts.helpers.SensorStats;
-import android.hardware.cts.helpers.SensorTestInformation;
-import android.hardware.cts.helpers.TestSensorManager;
-import android.hardware.cts.helpers.ValidatingSensorEventListener;
-import android.hardware.cts.helpers.sensorverification.EventGapVerification;
-import android.hardware.cts.helpers.sensorverification.EventOrderingVerification;
-import android.hardware.cts.helpers.sensorverification.FrequencyVerification;
-import android.hardware.cts.helpers.sensorverification.ISensorVerification;
-import android.hardware.cts.helpers.sensorverification.JitterVerification;
-import android.hardware.cts.helpers.sensorverification.MagnitudeVerification;
-import android.hardware.cts.helpers.sensorverification.MeanVerification;
-import android.hardware.cts.helpers.sensorverification.StandardDeviationVerification;
+import android.hardware.cts.helpers.TestSensorEnvironment;
+import android.hardware.cts.helpers.TestSensorEventListener;
-import junit.framework.Assert;
-
-import java.util.Collection;
-import java.util.HashSet;
import java.util.concurrent.TimeUnit;
/**
@@ -46,158 +29,70 @@
* events and then run all the tests.
* </p>
*/
-public class TestSensorOperation extends AbstractSensorOperation {
- private final TestSensorManager mSensorManager;
- private final Context mContext;
- private final int mSensorType;
- private final int mRateUs;
- private final int mMaxBatchReportLatencyUs;
+public class TestSensorOperation extends VerifiableSensorOperation {
private final Integer mEventCount;
private final Long mDuration;
private final TimeUnit mTimeUnit;
- private final Collection<ISensorVerification> mVerifications =
- new HashSet<ISensorVerification>();
-
- private boolean mLogEvents = false;
-
/**
* Create a {@link TestSensorOperation}.
*
- * @param context the {@link Context}.
- * @param sensorType the sensor type
- * @param rateUs the rate that
- * @param maxBatchReportLatencyUs the max batch report latency
+ * @param environment the test environment
* @param eventCount the number of events to gather
*/
- public TestSensorOperation(Context context, int sensorType, int rateUs,
- int maxBatchReportLatencyUs, int eventCount) {
- this(context, sensorType, rateUs, maxBatchReportLatencyUs, eventCount, null, null);
+ public TestSensorOperation(TestSensorEnvironment environment, int eventCount) {
+ this(environment, eventCount, null /* duration */, null /* timeUnit */);
}
/**
* Create a {@link TestSensorOperation}.
*
- * @param context the {@link Context}.
- * @param sensorType the sensor type
- * @param rateUs the rate that
- * @param maxBatchReportLatencyUs the max batch report latency
+ * @param environment the test environment
* @param duration the duration to gather events for
* @param timeUnit the time unit of the duration
*/
- public TestSensorOperation(Context context, int sensorType, int rateUs,
- int maxBatchReportLatencyUs, long duration, TimeUnit timeUnit) {
- this(context, sensorType, rateUs, maxBatchReportLatencyUs, null, duration, timeUnit);
+ public TestSensorOperation(
+ TestSensorEnvironment environment,
+ long duration,
+ TimeUnit timeUnit) {
+ this(environment, null /* eventCount */, duration, timeUnit);
}
/**
* Private helper constructor.
*/
- private TestSensorOperation(Context context, int sensorType, int rateUs,
- int maxBatchReportLatencyUs, Integer eventCount, Long duration, TimeUnit timeUnit) {
- mContext = context;
- mSensorType = sensorType;
- mRateUs = rateUs;
- mMaxBatchReportLatencyUs = maxBatchReportLatencyUs;
+ private TestSensorOperation(
+ TestSensorEnvironment environment,
+ Integer eventCount,
+ Long duration,
+ TimeUnit timeUnit) {
+ super(environment);
mEventCount = eventCount;
mDuration = duration;
mTimeUnit = timeUnit;
- mSensorManager = new TestSensorManager(mContext, mSensorType, mRateUs,
- mMaxBatchReportLatencyUs);
}
/**
- * Set whether to log events.
- */
- public void setLogEvents(boolean logEvents) {
- mLogEvents = logEvents;
- }
-
- /**
- * Set all of the default test expectations.
- */
- public void setDefaultVerifications() {
- Sensor sensor = mSensorManager.getSensor();
- addVerification(EventGapVerification.getDefault(sensor, mRateUs));
- addVerification(EventOrderingVerification.getDefault(sensor));
- addVerification(FrequencyVerification.getDefault(sensor, mRateUs));
- addVerification(JitterVerification.getDefault(sensor, mRateUs));
- addVerification(MagnitudeVerification.getDefault(sensor));
- addVerification(MeanVerification.getDefault(sensor));
- // Skip SigNumVerification since it has no default
- addVerification(StandardDeviationVerification.getDefault(sensor));
- }
-
- public void addVerification(ISensorVerification verification) {
- if (verification != null) {
- mVerifications.add(verification);
- }
- }
-
- /**
- * Collect the specified number of events from the sensor and run all enabled verifications.
+ * {@inheritDoc}
*/
@Override
- public void execute() {
- getStats().addValue("sensor_name", SensorTestInformation.getSensorName(mSensorType));
-
- ValidatingSensorEventListener listener = new ValidatingSensorEventListener(mVerifications);
- listener.setLogEvents(mLogEvents);
-
+ protected void doExecute(TestSensorEventListener listener) {
if (mEventCount != null) {
mSensorManager.runSensor(listener, mEventCount);
} else {
mSensorManager.runSensor(listener, mDuration, mTimeUnit);
}
-
- boolean failed = false;
- StringBuilder sb = new StringBuilder();
-
- for (ISensorVerification verification : mVerifications) {
- failed |= evaluateResults(verification, sb);
- }
-
- if (failed) {
- String msg = SensorCtsHelper.formatAssertionMessage(mSensorManager.getSensor(),
- "VerifySensorOperation", mRateUs, mMaxBatchReportLatencyUs, sb.toString());
- getStats().addValue(SensorStats.ERROR, msg);
- Assert.fail(msg);
- }
}
/**
* {@inheritDoc}
*/
@Override
- public TestSensorOperation clone() {
- TestSensorOperation operation;
+ protected VerifiableSensorOperation doClone() {
if (mEventCount != null) {
- operation = new TestSensorOperation(mContext, mSensorType, mRateUs,
- mMaxBatchReportLatencyUs, mEventCount);
+ return new TestSensorOperation(mEnvironment, mEventCount);
} else {
- operation = new TestSensorOperation(mContext, mSensorType, mRateUs,
- mMaxBatchReportLatencyUs, mDuration, mTimeUnit);
+ return new TestSensorOperation(mEnvironment, mDuration, mTimeUnit);
}
-
- for (ISensorVerification verification : mVerifications) {
- operation.addVerification(verification.clone());
- }
- return operation;
- }
-
- /**
- * Evaluate the results of a test, aggregate the stats, and build the error message.
- */
- private boolean evaluateResults(ISensorVerification verification, StringBuilder sb) {
- try {
- verification.verify(getStats());
- } catch (AssertionError e) {
- if (sb.length() > 0) {
- sb.append(", ");
- }
- sb.append(e.getMessage());
- return true;
- }
- return false;
}
}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensoroperations/VerifiableSensorOperation.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensoroperations/VerifiableSensorOperation.java
new file mode 100644
index 0000000..55a880a
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensoroperations/VerifiableSensorOperation.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright (C) 2014 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.hardware.cts.helpers.sensoroperations;
+
+import junit.framework.Assert;
+
+import android.hardware.cts.helpers.SensorCtsHelper;
+import android.hardware.cts.helpers.SensorStats;
+import android.hardware.cts.helpers.SensorTestInformation;
+import android.hardware.cts.helpers.TestSensorEnvironment;
+import android.hardware.cts.helpers.TestSensorEventListener;
+import android.hardware.cts.helpers.TestSensorManager;
+import android.hardware.cts.helpers.ValidatingSensorEventListener;
+import android.hardware.cts.helpers.sensorverification.EventGapVerification;
+import android.hardware.cts.helpers.sensorverification.EventOrderingVerification;
+import android.hardware.cts.helpers.sensorverification.FrequencyVerification;
+import android.hardware.cts.helpers.sensorverification.ISensorVerification;
+import android.hardware.cts.helpers.sensorverification.JitterVerification;
+import android.hardware.cts.helpers.sensorverification.MagnitudeVerification;
+import android.hardware.cts.helpers.sensorverification.MeanVerification;
+import android.hardware.cts.helpers.sensorverification.StandardDeviationVerification;
+
+import java.util.Collection;
+import java.util.HashSet;
+
+/**
+ * A {@link ISensorOperation} used to verify that sensor events and sensor values are correct.
+ * <p>
+ * Provides methods to set test expectations as well as providing a set of default expectations
+ * depending on sensor type. When {{@link #execute()} is called, the sensor will collect the
+ * events and then run all the tests.
+ * </p>
+ */
+public abstract class VerifiableSensorOperation extends AbstractSensorOperation {
+ protected final TestSensorManager mSensorManager;
+ protected final TestSensorEnvironment mEnvironment;
+
+ private final Collection<ISensorVerification> mVerifications =
+ new HashSet<ISensorVerification>();
+
+ private boolean mLogEvents = false;
+
+ /**
+ * Create a {@link TestSensorOperation}.
+ *
+ * @param environment the test environment
+ */
+ public VerifiableSensorOperation(TestSensorEnvironment environment) {
+ mEnvironment = environment;
+ mSensorManager = new TestSensorManager(mEnvironment);
+ }
+
+ /**
+ * Set whether to log events.
+ */
+ public void setLogEvents(boolean logEvents) {
+ mLogEvents = logEvents;
+ }
+
+ /**
+ * Set all of the default test expectations.
+ */
+ public void addDefaultVerifications() {
+ addVerification(EventGapVerification.getDefault(mEnvironment));
+ addVerification(EventOrderingVerification.getDefault(mEnvironment));
+ addVerification(FrequencyVerification.getDefault(mEnvironment));
+ addVerification(JitterVerification.getDefault(mEnvironment));
+ addVerification(MagnitudeVerification.getDefault(mEnvironment));
+ addVerification(MeanVerification.getDefault(mEnvironment));
+ // Skip SigNumVerification since it has no default
+ addVerification(StandardDeviationVerification.getDefault(mEnvironment));
+ }
+
+ public void addVerification(ISensorVerification verification) {
+ if (verification != null) {
+ mVerifications.add(verification);
+ }
+ }
+
+ /**
+ * Collect the specified number of events from the sensor and run all enabled verifications.
+ */
+ @Override
+ public void execute() {
+ getStats().addValue(
+ "sensor_name",
+ SensorTestInformation.getSensorName(mEnvironment.getSensor()));
+
+ ValidatingSensorEventListener listener = new ValidatingSensorEventListener(mVerifications);
+ listener.setLogEvents(mLogEvents);
+
+ doExecute(listener);
+
+ boolean failed = false;
+ StringBuilder sb = new StringBuilder();
+ for (ISensorVerification verification : mVerifications) {
+ failed |= evaluateResults(verification, sb);
+ }
+
+ if (failed) {
+ String msg = SensorCtsHelper
+ .formatAssertionMessage("VerifySensorOperation", mEnvironment, sb.toString());
+ getStats().addValue(SensorStats.ERROR, msg);
+ Assert.fail(msg);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public VerifiableSensorOperation clone() {
+ VerifiableSensorOperation operation = doClone();
+ for (ISensorVerification verification : mVerifications) {
+ operation.addVerification(verification.clone());
+ }
+ return operation;
+ }
+
+ /**
+ * Execute operations in a {@link TestSensorManager}.
+ */
+ protected abstract void doExecute(TestSensorEventListener listener);
+
+ /**
+ * Clone the subclass operation.
+ */
+ protected abstract VerifiableSensorOperation doClone();
+
+ /**
+ * Evaluate the results of a test, aggregate the stats, and build the error message.
+ */
+ private boolean evaluateResults(ISensorVerification verification, StringBuilder sb) {
+ try {
+ verification.verify(mEnvironment, getStats());
+ } catch (AssertionError e) {
+ if (sb.length() > 0) {
+ sb.append(", ");
+ }
+ sb.append(e.getMessage());
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/AbstractMeanVerification.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/AbstractMeanVerification.java
index 8d132a3..b755304 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/AbstractMeanVerification.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/AbstractMeanVerification.java
@@ -16,10 +16,10 @@
package android.hardware.cts.helpers.sensorverification;
-import android.hardware.cts.helpers.TestSensorEvent;
-
import junit.framework.Assert;
+import android.hardware.cts.helpers.TestSensorEvent;
+
/**
* Abstract class that calculates of the mean event values.
*/
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/EventGapVerification.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/EventGapVerification.java
index 251ef3c..962e5ad 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/EventGapVerification.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/EventGapVerification.java
@@ -1,14 +1,12 @@
package android.hardware.cts.helpers.sensorverification;
-import android.hardware.Sensor;
-import android.hardware.cts.helpers.SensorCtsHelper;
-import android.hardware.cts.helpers.SensorStats;
-import android.hardware.cts.helpers.SensorTestInformation;
-import android.hardware.cts.helpers.SensorTestInformation.SensorReportingMode;
-import android.hardware.cts.helpers.TestSensorEvent;
-
import junit.framework.Assert;
+import android.hardware.Sensor;
+import android.hardware.cts.helpers.SensorStats;
+import android.hardware.cts.helpers.TestSensorEnvironment;
+import android.hardware.cts.helpers.TestSensorEvent;
+
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.TimeUnit;
@@ -45,23 +43,27 @@
/**
* Get the default {@link EventGapVerification}.
*
- * @param sensor the {@link Sensor}
- * @param rateUs the requested rate in us
+ * @param environment the test environment
* @return the verification or null if the verification is not a continuous mode sensor.
*/
- public static EventGapVerification getDefault(Sensor sensor, int rateUs) {
- if (!SensorReportingMode.CONTINUOUS.equals(SensorTestInformation.getReportingMode(
- sensor.getType()))) {
+ public static EventGapVerification getDefault(TestSensorEnvironment environment) {
+ if (environment.getSensor().getReportingMode() != Sensor.REPORTING_MODE_CONTINUOUS) {
return null;
}
- return new EventGapVerification(SensorCtsHelper.getDelay(sensor, rateUs));
+ return new EventGapVerification(environment.getExpectedSamplingPeriodUs());
}
/**
* {@inheritDoc}
*/
@Override
- public void verify(SensorStats stats) {
+ public void verify(TestSensorEnvironment environment, SensorStats stats) {
+ if (environment.isSensorSamplingRateOverloaded()) {
+ // the verification is not reliable on environments under load
+ stats.addValue(PASSED_KEY, true);
+ return;
+ }
+
final int count = mEventGaps.size();
stats.addValue(PASSED_KEY, count == 0);
stats.addValue(SensorStats.EVENT_GAP_COUNT_KEY, count);
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/EventGapVerificationTest.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/EventGapVerificationTest.java
index b7861b2..d01e108 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/EventGapVerificationTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/EventGapVerificationTest.java
@@ -16,11 +16,12 @@
package android.hardware.cts.helpers.sensorverification;
-import android.hardware.cts.helpers.SensorStats;
-import android.hardware.cts.helpers.TestSensorEvent;
-
import junit.framework.TestCase;
+import android.hardware.cts.helpers.SensorStats;
+import android.hardware.cts.helpers.TestSensorEnvironment;
+import android.hardware.cts.helpers.TestSensorEvent;
+
/**
* Tests for {@link EventGapVerification}.
*/
@@ -65,12 +66,13 @@
int[] indices) {
SensorStats stats = new SensorStats();
ISensorVerification verification = getVerification(expected, timestamps);
+ TestSensorEnvironment environment = new TestSensorEnvironment(null, null, false, 0, 0);
if (pass) {
- verification.verify(stats);
+ verification.verify(environment, stats);
} else {
boolean failed = false;
try {
- verification.verify(stats);
+ verification.verify(environment, stats);
} catch (AssertionError e) {
// Expected;
failed = true;
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/EventOrderingVerification.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/EventOrderingVerification.java
index c74c826..6598725 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/EventOrderingVerification.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/EventOrderingVerification.java
@@ -16,14 +16,13 @@
package android.hardware.cts.helpers.sensorverification;
+import junit.framework.Assert;
+
import android.hardware.Sensor;
import android.hardware.cts.helpers.SensorStats;
-import android.hardware.cts.helpers.SensorTestInformation;
-import android.hardware.cts.helpers.SensorTestInformation.SensorReportingMode;
+import android.hardware.cts.helpers.TestSensorEnvironment;
import android.hardware.cts.helpers.TestSensorEvent;
-import junit.framework.Assert;
-
import java.util.LinkedList;
import java.util.List;
@@ -44,14 +43,14 @@
/**
* Get the default {@link EventOrderingVerification} for a sensor.
*
- * @param sensor a {@link Sensor}
+ * @param environment the test environment
* @return the verification or null if the verification does not apply to the sensor.
*/
@SuppressWarnings("deprecation")
- public static EventOrderingVerification getDefault(Sensor sensor) {
- SensorReportingMode mode = SensorTestInformation.getReportingMode(sensor.getType());
- if (!SensorReportingMode.CONTINUOUS.equals(mode)
- && !SensorReportingMode.ON_CHANGE.equals(mode)) {
+ public static EventOrderingVerification getDefault(TestSensorEnvironment environment) {
+ int reportingMode = environment.getSensor().getReportingMode();
+ if (reportingMode != Sensor.REPORTING_MODE_CONTINUOUS
+ && reportingMode != Sensor.REPORTING_MODE_ON_CHANGE) {
return null;
}
return new EventOrderingVerification();
@@ -65,7 +64,14 @@
* @throws AssertionError if the verification failed.
*/
@Override
- public void verify(SensorStats stats) {
+ public void verify(TestSensorEnvironment environment, SensorStats stats) {
+ verify(stats);
+ }
+
+ /**
+ * Visible for unit tests only.
+ */
+ void verify(SensorStats stats) {
final int count = mOutOfOrderEvents.size();
stats.addValue(PASSED_KEY, count == 0);
stats.addValue(SensorStats.EVENT_OUT_OF_ORDER_COUNT_KEY, count);
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/EventOrderingVerificationTest.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/EventOrderingVerificationTest.java
index 28cbd01..88d5c19 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/EventOrderingVerificationTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/EventOrderingVerificationTest.java
@@ -16,11 +16,11 @@
package android.hardware.cts.helpers.sensorverification;
+import junit.framework.TestCase;
+
import android.hardware.cts.helpers.SensorStats;
import android.hardware.cts.helpers.TestSensorEvent;
-import junit.framework.TestCase;
-
import java.util.ArrayList;
import java.util.List;
@@ -34,7 +34,7 @@
*/
public void testNoEvents() {
SensorStats stats = new SensorStats();
- ISensorVerification verification = getVerification();
+ EventOrderingVerification verification = getVerification();
verification.verify(stats);
verifyStats(stats, true, 0);
}
@@ -44,7 +44,7 @@
*/
public void testSameTimestamp() {
SensorStats stats = new SensorStats();
- ISensorVerification verification = getVerification(0, 0, 0, 0, 0);
+ EventOrderingVerification verification = getVerification(0, 0, 0, 0, 0);
verification.verify(stats);
verifyStats(stats, true, 0);
}
@@ -54,7 +54,7 @@
*/
public void testSequentialTimestamp() {
SensorStats stats = new SensorStats();
- ISensorVerification verification = getVerification(0, 1, 2, 3, 4);
+ EventOrderingVerification verification = getVerification(0, 1, 2, 3, 4);
verification.verify(stats);
verifyStats(stats, true, 0);
}
@@ -64,7 +64,7 @@
*/
public void testSingleOutofOrder() {
SensorStats stats = new SensorStats();
- ISensorVerification verification = getVerification(0, 2, 1, 3, 4);
+ EventOrderingVerification verification = getVerification(0, 2, 1, 3, 4);
try {
verification.verify(stats);
fail("Expected an AssertionError");
@@ -81,7 +81,7 @@
*/
public void testMultipleOutOfOrder() {
SensorStats stats = new SensorStats();
- ISensorVerification verification = getVerification(4, 0, 1, 2, 3);
+ EventOrderingVerification verification = getVerification(4, 0, 1, 2, 3);
try {
verification.verify(stats);
fail("Expected an AssertionError");
@@ -96,8 +96,8 @@
assertTrue(indices.contains(4));
}
- private ISensorVerification getVerification(long ... timestamps) {
- ISensorVerification verification = new EventOrderingVerification();
+ private EventOrderingVerification getVerification(long ... timestamps) {
+ EventOrderingVerification verification = new EventOrderingVerification();
for (long timestamp : timestamps) {
verification.addSensorEvent(new TestSensorEvent(null, timestamp, 0, null));
}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/FrequencyVerification.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/FrequencyVerification.java
index b6704b6..cf34f28 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/FrequencyVerification.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/FrequencyVerification.java
@@ -16,16 +16,15 @@
package android.hardware.cts.helpers.sensorverification;
+import junit.framework.Assert;
+
import android.hardware.Sensor;
import android.hardware.cts.helpers.SensorCtsHelper;
import android.hardware.cts.helpers.SensorStats;
-import android.hardware.cts.helpers.SensorTestInformation;
-import android.hardware.cts.helpers.SensorTestInformation.SensorReportingMode;
+import android.hardware.cts.helpers.TestSensorEnvironment;
import android.hardware.cts.helpers.TestSensorEvent;
import android.util.Log;
-import junit.framework.Assert;
-
import java.util.concurrent.TimeUnit;
/**
@@ -41,10 +40,8 @@
// Highest acceptable frequency, as percentage of the requested one.
private static final int DEFAULT_UPPER_THRESHOLD = 220;
- private final double mRequestedFrequencyHz;
private final double mLowerThresholdHz;
private final double mUpperThresholdHz;
- private final String mSensorName;
private long mMinTimestamp = 0;
private long mMaxTimestamp = 0;
@@ -53,34 +50,31 @@
/**
* Construct a {@link FrequencyVerification}.
*
- * @param expected the expected frequency in Hz.
* @param lowerTheshold Lowest acceptable frequency Hz.
* @param upperThreshold Highest acceptable frequency Hz.
*/
- public FrequencyVerification(double expected, double lowerTheshold, double upperThreshold,
- String sensorName) {
- mRequestedFrequencyHz = expected;
+ public FrequencyVerification(double lowerTheshold, double upperThreshold) {
mLowerThresholdHz = lowerTheshold;
mUpperThresholdHz = upperThreshold;
- mSensorName = sensorName;
}
/**
* Get the default {@link FrequencyVerification} for a sensor.
*
- * @param sensor a {@link Sensor}
- * @param rateUs the desired rate of the sensor
+ * @param environment the test environment
* @return the verification or null if the verification does not apply to the sensor.
*/
- public static FrequencyVerification getDefault(Sensor sensor, int rateUs) {
- if (!SensorReportingMode.CONTINUOUS.equals(
- SensorTestInformation.getReportingMode(sensor.getType()))) {
+ public static FrequencyVerification getDefault(TestSensorEnvironment environment) {
+ Sensor sensor = environment.getSensor();
+ if (sensor.getReportingMode() != Sensor.REPORTING_MODE_CONTINUOUS) {
return null;
}
- Log.i(LOG_TAG, String.format("Preparing frequency test for \"%s\" for which "
- + "minDelay=%dus and maxDelay=%dus",
- sensor.getName(), sensor.getMinDelay(), sensor.getMaxDelay()));
+ Log.i(LOG_TAG, String.format(
+ "Preparing frequency test for \"%s\" for which minDelay=%dus and maxDelay=%dus",
+ sensor.getName(),
+ sensor.getMinDelay(),
+ sensor.getMaxDelay()));
double maxDelayUs = sensor.getMaxDelay();
if (maxDelayUs <= 0) {
// This sensor didn't report its maxDelay.
@@ -92,10 +86,12 @@
maxDelayUs = sensor.getMinDelay();
}
+ if (environment.isSensorSamplingRateOverloaded()) {
+ maxDelayUs = sensor.getMinDelay();
+ }
+
// Convert the rateUs parameter into a delay in microseconds and rate in Hz.
- double delayUs = SensorCtsHelper.getDelay(sensor, rateUs);
- double requestedFrequencyHz = SensorCtsHelper.getFrequency(
- delayUs, TimeUnit.MICROSECONDS);
+ double delayUs = environment.getRequestedSamplingPeriodUs();
// When rateUs > maxDelay, the sensor can do as if we requested maxDelay.
double upperExpectedHz = SensorCtsHelper.getFrequency(
@@ -108,8 +104,7 @@
double lowerThresholdHz = lowerExpectedHz * DEFAULT_LOWER_THRESHOLD / 100;
double upperThresholdHz = upperExpectedHz * DEFAULT_UPPER_THRESHOLD / 100;
- return new FrequencyVerification(requestedFrequencyHz, lowerThresholdHz, upperThresholdHz,
- sensor.getName());
+ return new FrequencyVerification(lowerThresholdHz, upperThresholdHz);
}
/**
@@ -119,7 +114,7 @@
* @throws AssertionError if the verification failed.
*/
@Override
- public void verify(SensorStats stats) {
+ public void verify(TestSensorEnvironment environment, SensorStats stats) {
if (mCount < 2) {
stats.addValue(PASSED_KEY, true);
return;
@@ -132,9 +127,13 @@
stats.addValue(SensorStats.FREQUENCY_KEY, measuredFrequencyHz);
stats.addValue(PASSED_KEY, !failed);
- String resultString = String.format("Requested \"" + mSensorName + "\" at %.2fHz "
- + "(expecting between %.2fHz and %.2fHz, measured %.2fHz)",
- mRequestedFrequencyHz, mLowerThresholdHz, mUpperThresholdHz, measuredFrequencyHz);
+ String resultString = String.format(
+ "Requested \"%s\" at %.2fHz (expecting between %.2fHz and %.2fHz, measured %.2fHz)",
+ environment.getSensor().getName(),
+ environment.getFrequencyHz(),
+ mLowerThresholdHz,
+ mUpperThresholdHz,
+ measuredFrequencyHz);
if (failed) {
Log.e(LOG_TAG, "Frequency test FAIL: " + resultString);
@@ -149,8 +148,7 @@
*/
@Override
public FrequencyVerification clone() {
- return new FrequencyVerification(mRequestedFrequencyHz, mLowerThresholdHz,
- mUpperThresholdHz, mSensorName);
+ return new FrequencyVerification(mLowerThresholdHz, mUpperThresholdHz);
}
/**
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/FrequencyVerificationTest.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/FrequencyVerificationTest.java
index 82d93e5..24349ce 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/FrequencyVerificationTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/FrequencyVerificationTest.java
@@ -16,15 +16,16 @@
package android.hardware.cts.helpers.sensorverification;
+import android.hardware.Sensor;
+import android.hardware.cts.SensorTestCase;
import android.hardware.cts.helpers.SensorStats;
+import android.hardware.cts.helpers.TestSensorEnvironment;
import android.hardware.cts.helpers.TestSensorEvent;
-import junit.framework.TestCase;
-
/**
* Tests for {@link EventOrderingVerification}.
*/
-public class FrequencyVerificationTest extends TestCase {
+public class FrequencyVerificationTest extends SensorTestCase {
/**
* Test that the verifications passes/fails based on threshold given.
@@ -33,24 +34,24 @@
long[] timestamps = {0, 1000000, 2000000, 3000000, 4000000}; // 1000Hz
SensorStats stats = new SensorStats();
- ISensorVerification verification = getVerification(1000.0, 999.0, 1001.0, timestamps);
- verification.verify(stats);
+ ISensorVerification verification = getVerification(999.0, 1001.0, timestamps);
+ verification.verify(getEnvironment(1000), stats);
verifyStats(stats, true, 1000.0);
stats = new SensorStats();
- verification = getVerification(950.0, 850.0, 1050.0, timestamps);
- verification.verify(stats);
+ verification = getVerification(850.0, 1050.0, timestamps);
+ verification.verify(getEnvironment(950), stats);
verifyStats(stats, true, 1000.0);
stats = new SensorStats();
- verification = getVerification(1050.0, 950.0, 1150.0, timestamps);
- verification.verify(stats);
+ verification = getVerification(950.0, 1150.0, timestamps);
+ verification.verify(getEnvironment(1050), stats);
verifyStats(stats, true, 1000.0);
stats = new SensorStats();
- verification = getVerification(950.0, 850.0, 975.0, timestamps);
+ verification = getVerification(850.0, 975.0, timestamps);
try {
- verification.verify(stats);
+ verification.verify(getEnvironment(950), stats);
fail("Expected an AssertionError");
} catch (AssertionError e) {
// Expected;
@@ -58,9 +59,9 @@
verifyStats(stats, false, 1000.0);
stats = new SensorStats();
- verification = getVerification(1050.0, 1025.0, 1150.0, timestamps);
+ verification = getVerification(1025.0, 1150.0, timestamps);
try {
- verification.verify(stats);
+ verification.verify(getEnvironment(1050), stats);
fail("Expected an AssertionError");
} catch (AssertionError e) {
// Expected;
@@ -68,10 +69,16 @@
verifyStats(stats, false, 1000.0);
}
- private ISensorVerification getVerification(double expected, double lowerThreshold,
- double upperThreshold, long ... timestamps) {
- ISensorVerification verification = new FrequencyVerification(expected, lowerThreshold,
- upperThreshold, "Test sensor");
+ private TestSensorEnvironment getEnvironment(int rateUs) {
+ return new TestSensorEnvironment(getContext(), Sensor.TYPE_ALL, rateUs);
+ }
+
+ private ISensorVerification getVerification(
+ double lowerThreshold,
+ double upperThreshold,
+ long ... timestamps) {
+ ISensorVerification verification =
+ new FrequencyVerification(lowerThreshold, upperThreshold);
for (long timestamp : timestamps) {
verification.addSensorEvent(new TestSensorEvent(null, timestamp, 0, null));
}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/ISensorVerification.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/ISensorVerification.java
index 07af392..4f7b65a 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/ISensorVerification.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/ISensorVerification.java
@@ -17,13 +17,15 @@
package android.hardware.cts.helpers.sensorverification;
import android.hardware.cts.helpers.SensorStats;
+import android.hardware.cts.helpers.TestSensorEnvironment;
import android.hardware.cts.helpers.TestSensorEvent;
/**
* Interface describing the sensor verification. This class was designed for to handle streaming
* events. The methods {@link #addSensorEvent(TestSensorEvent)} and
* {@link #addSensorEvents(TestSensorEvent...)} should be called in the order that the events are
- * received. The method {@link #verify(SensorStats)} should be called after all events are added.
+ * received. The method {@link #verify(TestSensorEnvironment, SensorStats)} should be called after
+ * all events are added.
*/
public interface ISensorVerification {
@@ -43,7 +45,7 @@
* @param stats a {@link SensorStats} object used to keep track of the stats.
* @throws AssertionError if the verification fails.
*/
- public void verify(SensorStats stats);
+ public void verify(TestSensorEnvironment environment, SensorStats stats);
/**
* Clones the {@link ISensorVerification}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/JitterVerification.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/JitterVerification.java
index 6feceb8..97d2f5b 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/JitterVerification.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/JitterVerification.java
@@ -16,13 +16,14 @@
package android.hardware.cts.helpers.sensorverification;
+import junit.framework.Assert;
+
import android.hardware.Sensor;
import android.hardware.cts.helpers.SensorCtsHelper;
import android.hardware.cts.helpers.SensorStats;
+import android.hardware.cts.helpers.TestSensorEnvironment;
import android.hardware.cts.helpers.TestSensorEvent;
-import junit.framework.Assert;
-
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
@@ -62,18 +63,18 @@
/**
* Get the default {@link JitterVerification} for a sensor.
*
- * @param sensor a {@link Sensor}
- * @param rateUs the desired rate of the sensor
+ * @param environment the test environment
* @return the verification or null if the verification does not apply to the sensor.
*/
- public static JitterVerification getDefault(Sensor sensor, int rateUs) {
- if (!DEFAULTS.containsKey(sensor.getType())) {
+ public static JitterVerification getDefault(TestSensorEnvironment environment) {
+ int sensorType = environment.getSensor().getType();
+ if (!DEFAULTS.containsKey(sensorType)) {
return null;
}
- int expected = (int) TimeUnit.NANOSECONDS.convert(SensorCtsHelper.getDelay(sensor, rateUs),
- TimeUnit.MICROSECONDS);
- return new JitterVerification(expected, DEFAULTS.get(sensor.getType()));
+ int expected = (int) TimeUnit.NANOSECONDS
+ .convert(environment.getExpectedSamplingPeriodUs(), TimeUnit.MICROSECONDS);
+ return new JitterVerification(expected, DEFAULTS.get(sensorType));
}
/**
@@ -84,8 +85,9 @@
* @throws AssertionError if the verification failed.
*/
@Override
- public void verify(SensorStats stats) {
- if (mTimestamps.size() < 2) {
+ public void verify(TestSensorEnvironment environment, SensorStats stats) {
+ if (mTimestamps.size() < 2 || environment.isSensorSamplingRateOverloaded()) {
+ // the verification is not reliable in environments under load
stats.addValue(PASSED_KEY, true);
return;
}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/JitterVerificationTest.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/JitterVerificationTest.java
index a9e872a..26e3fa3 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/JitterVerificationTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/JitterVerificationTest.java
@@ -16,11 +16,12 @@
package android.hardware.cts.helpers.sensorverification;
-import android.hardware.cts.helpers.SensorStats;
-import android.hardware.cts.helpers.TestSensorEvent;
-
import junit.framework.TestCase;
+import android.hardware.cts.helpers.SensorStats;
+import android.hardware.cts.helpers.TestSensorEnvironment;
+import android.hardware.cts.helpers.TestSensorEvent;
+
import java.util.List;
/**
@@ -31,6 +32,14 @@
public void testVerify() {
final int SAMPLE_SIZE = 100;
+ // for unit testing the verification, only the parameter 'sensorMightHaveMoreListeners' is
+ // required
+ TestSensorEnvironment environment = new TestSensorEnvironment(
+ null /* context */,
+ null /* sensor */,
+ false /* sensorMightHaveMoreListeners */,
+ 0 /*samplingPeriodUs */,
+ 0 /* maxReportLatencyUs */);
// 100 samples at 1000Hz
long[] timestamps = new long[SAMPLE_SIZE];
@@ -39,7 +48,7 @@
}
SensorStats stats = new SensorStats();
ISensorVerification verification = getVerification(1000, 1, timestamps);
- verification.verify(stats);
+ verification.verify(environment, stats);
verifyStats(stats, true, 0.0);
// 90 samples at 1000Hz, 10 samples at 2000Hz
@@ -51,7 +60,7 @@
stats = new SensorStats();
verification = getVerification(1000, 1, timestamps);
try {
- verification.verify(stats);
+ verification.verify(environment, stats);
fail("Expected an AssertionError");
} catch (AssertionError e) {
// Expected;
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/MagnitudeVerification.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/MagnitudeVerification.java
index 5e44273..2c90127 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/MagnitudeVerification.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/MagnitudeVerification.java
@@ -16,13 +16,14 @@
package android.hardware.cts.helpers.sensorverification;
+import junit.framework.Assert;
+
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.hardware.cts.helpers.SensorStats;
+import android.hardware.cts.helpers.TestSensorEnvironment;
import android.hardware.cts.helpers.TestSensorEvent;
-import junit.framework.Assert;
-
import java.util.HashMap;
import java.util.Map;
@@ -60,15 +61,16 @@
/**
* Get the default {@link MagnitudeVerification} for a sensor.
*
- * @param sensor a {@link Sensor}
+ * @param environment the test environment
* @return the verification or null if the verification does not apply to the sensor.
*/
- public static MagnitudeVerification getDefault(Sensor sensor) {
- if (!DEFAULTS.containsKey(sensor.getType())) {
+ public static MagnitudeVerification getDefault(TestSensorEnvironment environment) {
+ int sensorType = environment.getSensor().getType();
+ if (!DEFAULTS.containsKey(sensorType)) {
return null;
}
- Float expected = DEFAULTS.get(sensor.getType())[0];
- Float threshold = DEFAULTS.get(sensor.getType())[1];
+ Float expected = DEFAULTS.get(sensorType)[0];
+ Float threshold = DEFAULTS.get(sensorType)[1];
return new MagnitudeVerification(expected, threshold);
}
@@ -79,7 +81,14 @@
* @throws AssertionError if the verification failed.
*/
@Override
- public void verify(SensorStats stats) {
+ public void verify(TestSensorEnvironment environment, SensorStats stats) {
+ verify(stats);
+ }
+
+ /**
+ * Visible for unit tests only.
+ */
+ void verify(SensorStats stats) {
if (mCount < 1) {
stats.addValue(PASSED_KEY, true);
return;
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/MagnitudeVerificationTest.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/MagnitudeVerificationTest.java
index 9a50753..bb29330 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/MagnitudeVerificationTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/MagnitudeVerificationTest.java
@@ -16,18 +16,19 @@
package android.hardware.cts.helpers.sensorverification;
-import android.hardware.cts.helpers.SensorStats;
-import android.hardware.cts.helpers.TestSensorEvent;
-
import junit.framework.TestCase;
+import android.hardware.cts.helpers.SensorStats;
+import android.hardware.cts.helpers.TestSensorEnvironment;
+import android.hardware.cts.helpers.TestSensorEvent;
+
/**
* Tests for {@link MagnitudeVerification}.
*/
public class MagnitudeVerificationTest extends TestCase {
/**
- * Test {@link MagnitudeVerification#verify(SensorStats)}.
+ * Test {@link MagnitudeVerification#verify(TestSensorEnvironment, SensorStats)}.
*/
public void testVerify() {
float[][] values = {
@@ -47,7 +48,7 @@
private void runStats(float expected, float threshold, float[][] values, boolean pass, float magnitude) {
SensorStats stats = new SensorStats();
- ISensorVerification verification = getVerification(expected, threshold, values);
+ MagnitudeVerification verification = getVerification(expected, threshold, values);
if (pass) {
verification.verify(stats);
} else {
@@ -62,9 +63,9 @@
assertEquals(magnitude, (Float) stats.getValue(SensorStats.MAGNITUDE_KEY), 0.01);
}
- private ISensorVerification getVerification(float expected, float threshold,
+ private MagnitudeVerification getVerification(float expected, float threshold,
float[] ... values) {
- ISensorVerification verification = new MagnitudeVerification(expected, threshold);
+ MagnitudeVerification verification = new MagnitudeVerification(expected, threshold);
for (float[] value : values) {
verification.addSensorEvent(new TestSensorEvent(null, 0, 0, value));
}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/MeanVerification.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/MeanVerification.java
index d6769d0..6603895 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/MeanVerification.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/MeanVerification.java
@@ -16,11 +16,12 @@
package android.hardware.cts.helpers.sensorverification;
+import junit.framework.Assert;
+
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.hardware.cts.helpers.SensorStats;
-
-import junit.framework.Assert;
+import android.hardware.cts.helpers.TestSensorEnvironment;
import java.util.HashMap;
import java.util.Map;
@@ -55,15 +56,16 @@
/**
* Get the default {@link MeanVerification} for a sensor.
*
- * @param sensor a {@link Sensor}
+ * @param environment the test environment
* @return the verification or null if the verification does not apply to the sensor.
*/
- public static MeanVerification getDefault(Sensor sensor) {
- if (!DEFAULTS.containsKey(sensor.getType())) {
+ public static MeanVerification getDefault(TestSensorEnvironment environment) {
+ int sensorType = environment.getSensor().getType();
+ if (!DEFAULTS.containsKey(sensorType)) {
return null;
}
- float[] expected = (float[]) DEFAULTS.get(sensor.getType())[0];
- float[] threshold = (float[]) DEFAULTS.get(sensor.getType())[1];
+ float[] expected = (float[]) DEFAULTS.get(sensorType)[0];
+ float[] threshold = (float[]) DEFAULTS.get(sensorType)[1];
return new MeanVerification(expected, threshold);
}
@@ -74,7 +76,14 @@
* @throws AssertionError if the verification failed.
*/
@Override
- public void verify(SensorStats stats) {
+ public void verify(TestSensorEnvironment environment, SensorStats stats) {
+ verify(stats);
+ }
+
+ /**
+ * Visible for unit tests only.
+ */
+ void verify(SensorStats stats) {
if (getCount() < 1) {
stats.addValue(PASSED_KEY, true);
return;
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/MeanVerificationTest.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/MeanVerificationTest.java
index 94b6362..b07ea50 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/MeanVerificationTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/MeanVerificationTest.java
@@ -16,18 +16,19 @@
package android.hardware.cts.helpers.sensorverification;
-import android.hardware.cts.helpers.SensorStats;
-import android.hardware.cts.helpers.TestSensorEvent;
-
import junit.framework.TestCase;
+import android.hardware.cts.helpers.SensorStats;
+import android.hardware.cts.helpers.TestSensorEnvironment;
+import android.hardware.cts.helpers.TestSensorEvent;
+
/**
* Tests for {@link MeanVerification}.
*/
public class MeanVerificationTest extends TestCase {
/**
- * Test {@link MeanVerification#verify(SensorStats)}.
+ * Test {@link MeanVerification#verify(TestSensorEnvironment, SensorStats)}.
*/
public void testVerify() {
float[][] values = {
@@ -41,7 +42,7 @@
float[] expected = {2.0f, 3.0f, 6.0f};
float[] threshold = {0.1f, 0.1f, 0.1f};
SensorStats stats = new SensorStats();
- ISensorVerification verification = getVerification(expected, threshold, values);
+ MeanVerification verification = getVerification(expected, threshold, values);
verification.verify(stats);
verifyStats(stats, true, new float[]{2.0f, 3.0f, 6.0f});
@@ -76,7 +77,6 @@
}
verifyStats(stats, false, new float[]{2.0f, 3.0f, 6.0f});
- threshold = new float[]{2.5f, 2.5f, 5.5f};
threshold = new float[]{0.6f, 0.6f, 0.1f};
stats = new SensorStats();
verification = getVerification(expected, threshold, values);
@@ -89,9 +89,9 @@
verifyStats(stats, false, new float[]{2.0f, 3.0f, 6.0f});
}
- private ISensorVerification getVerification(float[] expected, float[] threshold,
+ private MeanVerification getVerification(float[] expected, float[] threshold,
float[] ... values) {
- ISensorVerification verification = new MeanVerification(expected, threshold);
+ MeanVerification verification = new MeanVerification(expected, threshold);
for (float[] value : values) {
verification.addSensorEvent(new TestSensorEvent(null, 0, 0, value));
}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/SigNumVerification.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/SigNumVerification.java
index 9428d1d..94a4c96 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/SigNumVerification.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/SigNumVerification.java
@@ -16,10 +16,11 @@
package android.hardware.cts.helpers.sensorverification;
-import android.hardware.cts.helpers.SensorStats;
-
import junit.framework.Assert;
+import android.hardware.cts.helpers.SensorStats;
+import android.hardware.cts.helpers.TestSensorEnvironment;
+
/**
* A {@link ISensorVerification} which verifies that the sign of each of the sensor values is
* correct.
@@ -60,7 +61,14 @@
* @throws AssertionError if the verification failed.
*/
@Override
- public void verify(SensorStats stats) {
+ public void verify(TestSensorEnvironment environment, SensorStats stats) {
+ verify(stats);
+ }
+
+ /**
+ * Visible for unit tests only.
+ */
+ void verify(SensorStats stats) {
if (getCount() < 1) {
stats.addValue(PASSED_KEY, true);
return;
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/SigNumVerificationTest.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/SigNumVerificationTest.java
index 009ab65..c8ce87e 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/SigNumVerificationTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/SigNumVerificationTest.java
@@ -16,18 +16,19 @@
package android.hardware.cts.helpers.sensorverification;
-import android.hardware.cts.helpers.SensorStats;
-import android.hardware.cts.helpers.TestSensorEvent;
-
import junit.framework.TestCase;
+import android.hardware.cts.helpers.SensorStats;
+import android.hardware.cts.helpers.TestSensorEnvironment;
+import android.hardware.cts.helpers.TestSensorEvent;
+
/**
* Tests for {@link SigNumVerification}.
*/
public class SigNumVerificationTest extends TestCase {
/**
- * Test {@link SigNumVerification#verify(SensorStats)}.
+ * Test {@link SigNumVerification#verify(TestSensorEnvironment, SensorStats)}.
*/
public void testVerify() {
float[][] values = {{1.0f, 0.2f, 0.0f, -0.2f, -1.0f}};
@@ -65,7 +66,7 @@
private void runVerification(boolean passed, int[] expected, float[] threshold,
float[][] values) {
SensorStats stats = new SensorStats();
- ISensorVerification verification = getVerification(expected, threshold, values);
+ SigNumVerification verification = getVerification(expected, threshold, values);
if (passed) {
verification.verify(stats);
} else {
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/StandardDeviationVerification.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/StandardDeviationVerification.java
index 57b34b0..f7c2c53 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/StandardDeviationVerification.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/StandardDeviationVerification.java
@@ -16,12 +16,13 @@
package android.hardware.cts.helpers.sensorverification;
+import junit.framework.Assert;
+
import android.hardware.Sensor;
import android.hardware.cts.helpers.SensorStats;
+import android.hardware.cts.helpers.TestSensorEnvironment;
import android.hardware.cts.helpers.TestSensorEvent;
-import junit.framework.Assert;
-
import java.util.HashMap;
import java.util.Map;
@@ -57,15 +58,16 @@
/**
* Get the default {@link StandardDeviationVerification} for a sensor.
*
- * @param sensor a {@link Sensor}
+ * @param environment the test environment
* @return the verification or null if the verification does not apply to the sensor.
*/
- public static StandardDeviationVerification getDefault(Sensor sensor) {
- if (!DEFAULTS.containsKey(sensor.getType())) {
+ public static StandardDeviationVerification getDefault(TestSensorEnvironment environment) {
+ int sensorType = environment.getSensor().getType();
+ if (!DEFAULTS.containsKey(sensorType)) {
return null;
}
- return new StandardDeviationVerification(DEFAULTS.get(sensor.getType()));
+ return new StandardDeviationVerification(DEFAULTS.get(sensorType));
}
/**
@@ -75,7 +77,14 @@
* @throws AssertionError if the verification failed.
*/
@Override
- public void verify(SensorStats stats) {
+ public void verify(TestSensorEnvironment environment, SensorStats stats) {
+ verify(stats);
+ }
+
+ /**
+ * Visible for unit tests only.
+ */
+ void verify(SensorStats stats) {
if (mCount < 2) {
stats.addValue(PASSED_KEY, true);
return;
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/StandardDeviationVerificationTest.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/StandardDeviationVerificationTest.java
index 308f114..5d958f5 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/StandardDeviationVerificationTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/StandardDeviationVerificationTest.java
@@ -16,18 +16,19 @@
package android.hardware.cts.helpers.sensorverification;
-import android.hardware.cts.helpers.SensorStats;
-import android.hardware.cts.helpers.TestSensorEvent;
-
import junit.framework.TestCase;
+import android.hardware.cts.helpers.SensorStats;
+import android.hardware.cts.helpers.TestSensorEnvironment;
+import android.hardware.cts.helpers.TestSensorEvent;
+
/**
* Tests for {@link StandardDeviationVerification}.
*/
public class StandardDeviationVerificationTest extends TestCase {
/**
- * Test {@link StandardDeviationVerification#verify(SensorStats)}.
+ * Test {@link StandardDeviationVerification#verify(TestSensorEnvironment, SensorStats)}.
*/
public void testVerify() {
// Stddev should be {sqrt(2.5), sqrt(2.5), sqrt(2.5)}
@@ -58,7 +59,7 @@
private void runVerification(float[] threshold, float[][] values, boolean pass,
float[] standardDeviations) {
SensorStats stats = new SensorStats();
- ISensorVerification verification = getVerification(threshold, values);
+ StandardDeviationVerification verification = getVerification(threshold, values);
if (pass) {
verification.verify(stats);
} else {
@@ -78,8 +79,8 @@
}
}
- private ISensorVerification getVerification(float[] threshold, float[] ... values) {
- ISensorVerification verification = new StandardDeviationVerification(threshold);
+ private StandardDeviationVerification getVerification(float[] threshold, float[] ... values) {
+ StandardDeviationVerification verification = new StandardDeviationVerification(threshold);
for (float[] value : values) {
verification.addSensorEvent(new TestSensorEvent(null, 0, 0, value));
}
diff --git a/tests/tests/location/Android.mk b/tests/tests/location/Android.mk
index 2503fc7..02de2f2 100644
--- a/tests/tests/location/Android.mk
+++ b/tests/tests/location/Android.mk
@@ -27,8 +27,6 @@
LOCAL_PACKAGE_NAME := CtsLocationTestCases
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
-
LOCAL_SDK_VERSION := current
include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/location/src/android/location/cts/LocationManagerTest.java b/tests/tests/location/src/android/location/cts/LocationManagerTest.java
index ab11b3c..a985aee 100644
--- a/tests/tests/location/src/android/location/cts/LocationManagerTest.java
+++ b/tests/tests/location/src/android/location/cts/LocationManagerTest.java
@@ -37,6 +37,7 @@
import android.os.SystemClock;
import android.provider.Settings;
import android.test.InstrumentationTestCase;
+import android.test.UiThreadTest;
import java.util.List;
@@ -615,6 +616,7 @@
}
}
+ @UiThreadTest
public void testGpsStatusListener() {
MockGpsStatusListener listener = new MockGpsStatusListener();
mManager.addGpsStatusListener(listener);
diff --git a/tests/tests/location2/Android.mk b/tests/tests/location2/Android.mk
index 6daca72..5b227b2 100644
--- a/tests/tests/location2/Android.mk
+++ b/tests/tests/location2/Android.mk
@@ -27,8 +27,6 @@
LOCAL_PACKAGE_NAME := CtsLocation2TestCases
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
-
# uncomment when Location.EXTRA_NO_GPS_LOCATION is removed
#LOCAL_SDK_VERSION := curren
diff --git a/tests/tests/media/res/raw/camera_click.ogg b/tests/tests/media/res/raw/camera_click.ogg
new file mode 100644
index 0000000..b836e10
--- /dev/null
+++ b/tests/tests/media/res/raw/camera_click.ogg
Binary files differ
diff --git a/tests/tests/media/src/android/media/cts/AudioTrackTest.java b/tests/tests/media/src/android/media/cts/AudioTrackTest.java
index 5eaf725..7de3716 100644
--- a/tests/tests/media/src/android/media/cts/AudioTrackTest.java
+++ b/tests/tests/media/src/android/media/cts/AudioTrackTest.java
@@ -16,19 +16,22 @@
package android.media.cts;
+import android.cts.util.CtsAndroidTestCase;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTimestamp;
import android.media.AudioTrack;
-import android.test.AndroidTestCase;
import android.util.Log;
+import com.android.cts.util.ReportLog;
+import com.android.cts.util.ResultType;
+import com.android.cts.util.ResultUnit;
import java.nio.ByteOrder;
import java.nio.ByteBuffer;
import java.nio.ShortBuffer;
import java.nio.FloatBuffer;
-public class AudioTrackTest extends AndroidTestCase {
+public class AudioTrackTest extends CtsAndroidTestCase {
private String TAG = "AudioTrackTest";
private final long WAIT_MSEC = 200;
private final int OFFSET_DEFAULT = 0;
@@ -1535,70 +1538,127 @@
// constants for test
final String TEST_NAME = "testGetTimestamp";
final int TEST_SR = 22050;
- final int TEST_CONF = AudioFormat.CHANNEL_CONFIGURATION_MONO;
+ final int TEST_CONF = AudioFormat.CHANNEL_OUT_MONO;
final int TEST_FORMAT = AudioFormat.ENCODING_PCM_16BIT;
final int TEST_MODE = AudioTrack.MODE_STREAM;
final int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC;
final int TEST_LOOP_CNT = 10;
-
- final int MILLIS_PER_SEC = 1000;
- final int NANOS_PER_MILLI = 1000000;
+ // For jitter we allow 30 msec in frames. This is a large margin.
+ // Often this is just 0 or 1 frames, but that can depend on hardware.
+ final int TEST_JITTER_FRAMES_ALLOWED = TEST_SR * 30 / 1000;
// -------- initialization --------------
- final int BYTES_PER_FRAME = 2;
- final int FRAMES_PER_100_MILLIS =
+ final int bytesPerFrame =
+ AudioFormat.getBytesPerSample(TEST_FORMAT)
+ * AudioFormat.channelCountFromOutChannelMask(TEST_CONF);
+ final int minBufferSizeInBytes =
AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT);
- final int FRAMES_PER_SEC = FRAMES_PER_100_MILLIS * 10;
- byte[] data = new byte[FRAMES_PER_100_MILLIS * BYTES_PER_FRAME];
+ final int bufferSizeInBytes = minBufferSizeInBytes * 3;
+ byte[] data = new byte[bufferSizeInBytes];
AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT,
- FRAMES_PER_SEC * BYTES_PER_FRAME, TEST_MODE);
+ minBufferSizeInBytes, TEST_MODE);
// -------- test --------------
assertTrue(TEST_NAME, track.getState() == AudioTrack.STATE_INITIALIZED);
- long framesWritten = 0, framesSeen = 0, framesPresented = 0;
- long lastFramesPresented = 0, lastFrameTime = 0, lastOutputFrequency = FRAMES_PER_SEC;
AudioTimestamp timestamp = new AudioTimestamp();
+ boolean hasPlayed = false;
+ long framesWritten = 0, lastFramesPresented = 0, lastFramesPresentedAt = 0;
+ int cumulativeJitterCount = 0;
+ float cumulativeJitter = 0;
+ float maxJitter = 0;
for (int i = 0; i < TEST_LOOP_CNT; i++) {
- for (int j = 0; j < FRAMES_PER_SEC; j += FRAMES_PER_100_MILLIS) {
- track.write(data, 0, data.length);
- framesWritten += FRAMES_PER_100_MILLIS;
+ final long writeTime = System.nanoTime();
+
+ for (int written = 0; written < data.length;) {
+ int ret = track.write(data, written,
+ Math.min(data.length - written, minBufferSizeInBytes));
+ assertTrue(TEST_NAME, ret >= 0);
+ written += ret;
+ if (!hasPlayed) {
+ track.play();
+ hasPlayed = true;
+ }
+ }
+ framesWritten += data.length / bytesPerFrame;
+
+ // track.getTimestamp may return false if there are no physical HAL outputs.
+ // This may occur on TV devices without connecting an HDMI monitor.
+ // It may also be true immediately after start-up, as the mixing thread could
+ // be idle, but since we've already pushed much more than the minimum buffer size,
+ // that is unlikely.
+ // Nevertheless, we don't want to have unnecessary failures, so we ignore the
+ // first iteration if we don't get a timestamp.
+ final boolean result = track.getTimestamp(timestamp);
+ assertTrue(TEST_NAME, result || i == 0);
+ if (!result) {
+ continue;
}
- track.play();
- Thread.sleep(MILLIS_PER_SEC);
- track.pause();
+ final long framesPresented = timestamp.framePosition;
+ final long framesPresentedAt = timestamp.nanoTime;
- framesSeen = track.getPlaybackHeadPosition();
+ // We read timestamp here to ensure that seen is greater than presented.
+ // This is an "on-the-fly" read without pausing because pausing may cause the
+ // timestamp to become stale and affect our jitter measurements.
+ final int framesSeen = track.getPlaybackHeadPosition();
assertTrue(TEST_NAME, framesWritten >= framesSeen);
-
- assertTrue(TEST_NAME, track.getTimestamp(timestamp));
- framesPresented = timestamp.framePosition;
assertTrue(TEST_NAME, framesSeen >= framesPresented);
- // check output frequency
- long outFrequency = framesPresented - lastFramesPresented;
- long freqDiff = Math.abs(FRAMES_PER_SEC - outFrequency);
- assertTrue(TEST_NAME, freqDiff < FRAMES_PER_100_MILLIS);
+ if (i > 1) { // need delta info from previous iteration (skipping first)
+ final long deltaFrames = framesPresented - lastFramesPresented;
+ final long deltaTime = framesPresentedAt - lastFramesPresentedAt;
+ final long NANOSECONDS_PER_SECOND = 1000000000;
+ final long expectedFrames = deltaTime * TEST_SR / NANOSECONDS_PER_SECOND;
+ final long jitterFrames = Math.abs(deltaFrames - expectedFrames);
- // check output frequency jitter
- freqDiff = Math.abs(outFrequency - lastOutputFrequency);
- assertTrue(TEST_NAME, freqDiff < FRAMES_PER_100_MILLIS);
+ //Log.d(TAG, "framesWritten(" + framesWritten
+ // + ") framesSeen(" + framesSeen
+ // + ") framesPresented(" + framesPresented
+ // + ") jitter(" + jitterFrames + ")");
+ // We check that the timestamp position is reasonably accurate.
+ assertTrue(TEST_NAME, deltaTime >= 0);
+ assertTrue(TEST_NAME, deltaFrames >= 0);
+ if (i > 2) {
+ // The first two periods may have inherent jitter as the audio pipe
+ // is filling up. We check jitter only after that.
+ assertTrue(TEST_NAME, jitterFrames < TEST_JITTER_FRAMES_ALLOWED);
+ cumulativeJitter += jitterFrames;
+ cumulativeJitterCount++;
+ if (jitterFrames > maxJitter) {
+ maxJitter = jitterFrames;
+ }
+ }
+
+ //Log.d(TAG, "lastFramesPresentedAt(" + lastFramesPresentedAt
+ // + ") writeTime(" + writeTime
+ // + ") framesPresentedAt(" + framesPresentedAt + ")");
+
+ // We check that the timestamp time is reasonably current.
+ assertTrue(TEST_NAME, framesPresentedAt >= writeTime);
+ assertTrue(TEST_NAME, writeTime >= lastFramesPresentedAt);
+ }
lastFramesPresented = framesPresented;
- lastOutputFrequency = outFrequency;
-
- long frameTime = timestamp.nanoTime;
- assertTrue(TEST_NAME, frameTime >= lastFrameTime);
- lastFrameTime = frameTime;
-
- long curTime = System.nanoTime();
- assertTrue(TEST_NAME, curTime >= frameTime);
- assertTrue(TEST_NAME, curTime - frameTime < 100 * NANOS_PER_MILLI);
+ lastFramesPresentedAt = framesPresentedAt;
}
+ // Full drain.
+ Thread.sleep(WAIT_MSEC);
track.stop();
- // -------- tear down --------------
+ Thread.sleep(WAIT_MSEC);
track.release();
+ // Log the average jitter
+ if (cumulativeJitterCount > 0) {
+ ReportLog log = getReportLog();
+ final float averageJitterInFrames = cumulativeJitter / cumulativeJitterCount;
+ final float averageJitterInMs = averageJitterInFrames * 1000 / TEST_SR;
+ final float maxJitterInMs = maxJitter * 1000 / TEST_SR;
+ // ReportLog needs at least one Value and Summary.
+ log.printValue("Maximum Jitter", maxJitterInMs,
+ ResultType.LOWER_BETTER, ResultUnit.MS);
+ log.printSummary("Average Jitter", averageJitterInMs,
+ ResultType.LOWER_BETTER, ResultUnit.MS);
+ }
}
/* Do not run in JB-MR1. will be re-opened in the next platform release.
diff --git a/tests/tests/media/src/android/media/cts/MediaCodecCapabilitiesTest.java b/tests/tests/media/src/android/media/cts/MediaCodecCapabilitiesTest.java
index a3f1815..e6530ec 100644
--- a/tests/tests/media/src/android/media/cts/MediaCodecCapabilitiesTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaCodecCapabilitiesTest.java
@@ -212,6 +212,10 @@
continue;
}
+ if (!supportsMimeType(codecInfo, mimeType)) {
+ continue;
+ }
+
CodecCapabilities capabilities = codecInfo.getCapabilitiesForType(mimeType);
for (CodecProfileLevel profileLevel : capabilities.profileLevels) {
if (profileLevel.profile == profile
@@ -224,4 +228,14 @@
return false;
}
+ private static boolean supportsMimeType(MediaCodecInfo codecInfo, String mimeType) {
+ String[] supportedMimeTypes = codecInfo.getSupportedTypes();
+ for (String supportedMimeType : supportedMimeTypes) {
+ if (mimeType.equalsIgnoreCase(supportedMimeType)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
}
diff --git a/tests/tests/media/src/android/media/cts/MediaPlayerTest.java b/tests/tests/media/src/android/media/cts/MediaPlayerTest.java
index 30d164c..10ec741 100644
--- a/tests/tests/media/src/android/media/cts/MediaPlayerTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaPlayerTest.java
@@ -237,6 +237,98 @@
}
}
+ static class OutputListener {
+ int mSession;
+ AudioEffect mVc;
+ Visualizer mVis;
+ byte [] mVisData;
+ boolean mSoundDetected;
+ OutputListener(int session) {
+ mSession = session;
+ // creating a volume controller on output mix ensures that ro.audio.silent mutes
+ // audio after the effects and not before
+ mVc = new AudioEffect(
+ AudioEffect.EFFECT_TYPE_NULL,
+ UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b"),
+ 0,
+ session);
+ mVc.setEnabled(true);
+ mVis = new Visualizer(session);
+ int size = 256;
+ int[] range = Visualizer.getCaptureSizeRange();
+ if (size < range[0]) {
+ size = range[0];
+ }
+ if (size > range[1]) {
+ size = range[1];
+ }
+ assertTrue(mVis.setCaptureSize(size) == Visualizer.SUCCESS);
+
+ mVis.setDataCaptureListener(new Visualizer.OnDataCaptureListener() {
+ @Override
+ public void onWaveFormDataCapture(Visualizer visualizer,
+ byte[] waveform, int samplingRate) {
+ if (!mSoundDetected) {
+ for (int i = 0; i < waveform.length; i++) {
+ // 8 bit unsigned PCM, zero level is at 128, which is -128 when
+ // seen as a signed byte
+ if (waveform[i] != -128) {
+ mSoundDetected = true;
+ break;
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onFftDataCapture(Visualizer visualizer, byte[] fft, int samplingRate) {
+ }
+ }, 10000 /* milliHertz */, true /* PCM */, false /* FFT */);
+ assertTrue(mVis.setEnabled(true) == Visualizer.SUCCESS);
+ }
+
+ void reset() {
+ mSoundDetected = false;
+ }
+
+ boolean heardSound() {
+ return mSoundDetected;
+ }
+
+ void release() {
+ mVis.release();
+ mVc.release();
+ }
+ }
+
+ public void testPlayAudioTwice() throws Exception {
+ final int resid = R.raw.camera_click;
+
+ MediaPlayer mp = MediaPlayer.create(mContext, resid);
+ try {
+ mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
+ mp.setWakeMode(mContext, PowerManager.PARTIAL_WAKE_LOCK);
+
+ OutputListener listener = new OutputListener(mp.getAudioSessionId());
+
+ Thread.sleep(SLEEP_TIME);
+ assertFalse("noise heard before test started", listener.heardSound());
+
+ mp.start();
+ Thread.sleep(SLEEP_TIME);
+ assertFalse("player was still playing after " + SLEEP_TIME + " ms", mp.isPlaying());
+ assertTrue("nothing heard while test ran", listener.heardSound());
+ listener.reset();
+ mp.seekTo(0);
+ mp.start();
+ Thread.sleep(SLEEP_TIME);
+ assertTrue("nothing heard when sound was replayed", listener.heardSound());
+ listener.release();
+ } finally {
+ mp.release();
+ }
+ }
+
public void testPlayVideo() throws Exception {
playVideoTest(R.raw.testvideo, 352, 288);
}
@@ -945,24 +1037,24 @@
// Waits until at least one subtitle is fired. Timeout is 1 sec.
selectSubtitleTrack(0);
mOnTimedTextCalled.reset();
- assertTrue(mOnTimedTextCalled.waitForSignal(1000));
+ assertTrue(mOnTimedTextCalled.waitForSignal(1500));
// Try deselecting track.
deselectSubtitleTrack(0);
mOnTimedTextCalled.reset();
- assertFalse(mOnTimedTextCalled.waitForSignal(1000));
+ assertFalse(mOnTimedTextCalled.waitForSignal(1500));
}
// Run the same test for external subtitle track.
for (int i = 0; i < 2; i++) {
selectSubtitleTrack(2);
mOnTimedTextCalled.reset();
- assertTrue(mOnTimedTextCalled.waitForSignal(1000));
+ assertTrue(mOnTimedTextCalled.waitForSignal(1500));
// Try deselecting track.
deselectSubtitleTrack(2);
mOnTimedTextCalled.reset();
- assertFalse(mOnTimedTextCalled.waitForSignal(1000));
+ assertFalse(mOnTimedTextCalled.waitForSignal(1500));
}
try {
@@ -985,7 +1077,7 @@
mMediaPlayer.setOnTimedTextListener(new MediaPlayer.OnTimedTextListener() {
@Override
public void onTimedText(MediaPlayer mp, TimedText text) {
- final int toleranceMs = 150;
+ final int toleranceMs = 500;
final int durationMs = 500;
int posMs = mMediaPlayer.getCurrentPosition();
if (text != null) {
@@ -1030,19 +1122,19 @@
// Waits until at least two subtitles are fired. Timeout is 2 sec.
// Please refer the test srt files:
// test_subtitle1_srt.3gp and test_subtitle2_srt.3gp
- assertTrue(mOnTimedTextCalled.waitForCountedSignals(2, 2000) >= 2);
+ assertTrue(mOnTimedTextCalled.waitForCountedSignals(2, 2500) >= 2);
selectSubtitleTrack(1);
mOnTimedTextCalled.reset();
- assertTrue(mOnTimedTextCalled.waitForCountedSignals(2, 2000) >= 2);
+ assertTrue(mOnTimedTextCalled.waitForCountedSignals(2, 2500) >= 2);
selectSubtitleTrack(2);
mOnTimedTextCalled.reset();
- assertTrue(mOnTimedTextCalled.waitForCountedSignals(2, 2000) >= 2);
+ assertTrue(mOnTimedTextCalled.waitForCountedSignals(2, 2500) >= 2);
selectSubtitleTrack(3);
mOnTimedTextCalled.reset();
- assertTrue(mOnTimedTextCalled.waitForCountedSignals(2, 2000) >= 2);
+ assertTrue(mOnTimedTextCalled.waitForCountedSignals(2, 2500) >= 2);
mMediaPlayer.stop();
}
diff --git a/tests/tests/media/src/android/media/cts/Vp8CodecTestBase.java b/tests/tests/media/src/android/media/cts/Vp8CodecTestBase.java
index a4051c9..5e38842 100644
--- a/tests/tests/media/src/android/media/cts/Vp8CodecTestBase.java
+++ b/tests/tests/media/src/android/media/cts/Vp8CodecTestBase.java
@@ -390,6 +390,32 @@
return yuv;
}
+ /**
+ * Packs YUV420 frame by moving it to a smaller size buffer with stride and slice
+ * height equal to the original frame width and height.
+ */
+ private static byte[] PackYUV420(int width, int height,
+ int stride, int sliceHeight, byte[] src) {
+ byte[] dst = new byte[width * height * 3 / 2];
+ // Y copy.
+ for (int i = 0; i < height; i++) {
+ System.arraycopy(src, i * stride, dst, i * width, width);
+ }
+ // U and V copy.
+ int u_src_offset = stride * sliceHeight;
+ int v_src_offset = u_src_offset + u_src_offset / 4;
+ int u_dst_offset = width * height;
+ int v_dst_offset = u_dst_offset + u_dst_offset / 4;
+ for (int i = 0; i < height / 2; i++) {
+ System.arraycopy(src, u_src_offset + i * (stride / 2),
+ dst, u_dst_offset + i * (width / 2), width / 2);
+ System.arraycopy(src, v_src_offset + i * (stride / 2),
+ dst, v_dst_offset + i * (width / 2), width / 2);
+ }
+ return dst;
+ }
+
+
private static void imageUpscale1To2(byte[] src, int srcByteOffset, int srcStride,
byte[] dst, int dstByteOffset, int dstWidth, int dstHeight) {
for (int i = 0; i < dstHeight/2 - 1; i++) {
@@ -624,6 +650,8 @@
}
Log.d(TAG, "Frame stride and slice height: " + frameStride +
" x " + frameSliceHeight);
+ frameStride = Math.max(frameWidth, frameStride);
+ frameSliceHeight = Math.max(frameHeight, frameSliceHeight);
}
result = decoder.dequeueOutputBuffer(bufferInfo, DEFAULT_DEQUEUE_TIMEOUT_US);
}
@@ -645,12 +673,19 @@
byte[] frame = new byte[bufferInfo.size];
outputBuffers[outputBufIndex].position(bufferInfo.offset);
outputBuffers[outputBufIndex].get(frame, 0, bufferInfo.size);
- // Convert NV12 to YUV420 if necessary
+ // Convert NV12 to YUV420 if necessary.
if (frameColorFormat != CodecCapabilities.COLOR_FormatYUV420Planar) {
frame = NV12ToYUV420(frameWidth, frameHeight,
frameStride, frameSliceHeight, frame);
}
- yuv.write(frame);
+ int writeLength = Math.min(frameWidth * frameHeight * 3 / 2, frame.length);
+ // Pack frame if necessary.
+ if (writeLength < frame.length &&
+ (frameStride > frameWidth || frameSliceHeight > frameHeight)) {
+ frame = PackYUV420(frameWidth, frameHeight,
+ frameStride, frameSliceHeight, frame);
+ }
+ yuv.write(frame, 0, writeLength);
}
outputFrameIndex++;
diff --git a/tests/tests/opengl/AndroidManifest.xml b/tests/tests/opengl/AndroidManifest.xml
index 914b2d2..363b9aa 100644
--- a/tests/tests/opengl/AndroidManifest.xml
+++ b/tests/tests/opengl/AndroidManifest.xml
@@ -27,9 +27,11 @@
<meta-data android:name="listener"
android:value="com.android.cts.runner.CtsTestRunListener" />
</instrumentation>
+
<application
android:icon="@drawable/ic_launcher"
- android:label="@string/app_name" >
+ android:label="@string/app_name"
+ android:hardwareAccelerated="false" >
<activity
android:label="@string/app_name"
diff --git a/tests/tests/os/Android.mk b/tests/tests/os/Android.mk
index 0007a54..f0fb88a 100644
--- a/tests/tests/os/Android.mk
+++ b/tests/tests/os/Android.mk
@@ -23,17 +23,21 @@
LOCAL_PROGUARD_ENABLED := disabled
-LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner guava
+LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner guava
+
+LOCAL_JNI_SHARED_LIBRARIES := libctsos_jni
LOCAL_SRC_FILES := $(call all-java-files-under, src) \
- src/android/os/cts/IParcelFileDescriptorPeer.aidl
+ src/android/os/cts/IParcelFileDescriptorPeer.aidl \
+ src/android/os/cts/IEmptyService.aidl \
+ src/android/os/cts/ISecondary.aidl
LOCAL_PACKAGE_NAME := CtsOsTestCases
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
-
# uncomment when b/13282254 is fixed
#LOCAL_SDK_VERSION := current
LOCAL_JAVA_LIBRARIES += android.test.runner
include $(BUILD_CTS_PACKAGE)
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/tests/os/AndroidManifest.xml b/tests/tests/os/AndroidManifest.xml
index 155e772..f225903 100644
--- a/tests/tests/os/AndroidManifest.xml
+++ b/tests/tests/os/AndroidManifest.xml
@@ -18,11 +18,52 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.cts.os">
+ <permission android:name="android.os.cts.permission.TEST_GRANTED"
+ android:protectionLevel="normal"
+ android:label="@string/permlab_testGranted"
+ android:description="@string/permdesc_testGranted">
+ <meta-data android:name="android.os.cts.string" android:value="foo" />
+ <meta-data android:name="android.os.cts.boolean" android:value="true" />
+ <meta-data android:name="android.os.cts.integer" android:value="100" />
+ <meta-data android:name="android.os.cts.color" android:value="#ff000000" />
+ <meta-data android:name="android.os.cts.float" android:value="100.1" />
+ <meta-data android:name="android.os.cts.reference" android:resource="@xml/metadata" />
+ </permission>
+
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
<uses-permission android:name="android.permission.INTERNET" />
+ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+ <uses-permission android:name="android.permission.WAKE_LOCK" />
+ <uses-permission android:name="android.permission.VIBRATE" />
+ <uses-permission android:name="android.permission.SEND_SMS" />
+ <uses-permission android:name="android.permission.RECEIVE_SMS" />
+ <uses-permission android:name="android.permission.READ_SMS"/>
+ <uses-permission android:name="android.permission.WRITE_SMS"/>
+ <uses-permission android:name="android.permission.CALL_PHONE" />
+ <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
+ <uses-permission android:name="android.permission.DEVICE_POWER" />
+ <uses-permission android:name="android.os.cts.permission.TEST_GRANTED" />
<application>
+ <activity android:name="android.os.cts.LaunchpadActivity"
+ android:configChanges="keyboardHidden|orientation|screenSize"
+ android:multiprocess="true">
+ </activity>
+
+ <activity android:name="android.os.cts.AliasActivityStub">
+ <meta-data android:name="android.os.alias"
+ android:resource="@xml/alias" />
+ </activity>
+
+ <activity android:name="android.os.cts.CountDownTimerTestStub"
+ android:label="CountDownTimerTestStub">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
<service
android:name="android.os.cts.ParcelFileDescriptorPeer$Red"
android:process=":red"
@@ -31,11 +72,63 @@
android:name="android.os.cts.ParcelFileDescriptorPeer$Blue"
android:process=":blue"
android:exported="true" />
+
+ <service android:name="android.os.cts.LocalService">
+ <intent-filter>
+ <action android:name="android.os.cts.activity.SERVICE_LOCAL" />
+ </intent-filter>
+ <meta-data android:name="android.os.cts.string" android:value="foo" />
+ <meta-data android:name="android.os.cts.boolean" android:value="true" />
+ <meta-data android:name="android.os.cts.integer" android:value="100" />
+ <meta-data android:name="android.os.cts.color" android:value="#ff000000" />
+ <meta-data android:name="android.os.cts.float" android:value="100.1" />
+ <meta-data android:name="android.os.cts.reference" android:resource="@xml/metadata" />
+ </service>
+
+ <service android:name="android.os.cts.LocalGrantedService"
+ android:permission="android.os.cts.permission.TEST_GRANTED">
+ <intent-filter>
+ <action android:name="android.os.cts.activity.SERVICE_LOCAL_GRANTED" />
+ </intent-filter>
+ </service>
+
+ <service android:name="android.os.cts.LocalDeniedService"
+ android:permission="android.os.cts.permission.TEST_DENIED">
+ <intent-filter>
+ <action android:name="android.os.cts.activity.SERVICE_LOCAL_DENIED" />
+ </intent-filter>
+ </service>
+
+
+ <service android:name="android.os.cts.EmptyService"
+ android:process=":remote">
+ <intent-filter>
+ <action
+ android:name="android.os.cts.IEmptyService" />
+ <action
+ android:name="android.os.REMOTESERVICE" />
+ </intent-filter>
+ </service>
+
+ <service android:name="android.os.cts.CtsRemoteService"
+ android:process=":remote">
+ <intent-filter>
+ <action
+ android:name="android.os.cts.ISecondary" />
+ <action
+ android:name="android.os.REMOTESERVICE" />
+ </intent-filter>
+ </service>
+
+ <service android:name="android.os.cts.MessengerService"
+ android:process=":messengerService">
+ </service>
+
<uses-library android:name="android.test.runner" />
</application>
<instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
- android:targetPackage="com.android.cts.stub"
+ android:targetPackage="com.android.cts.os"
android:label="CTS tests of android.os">
<meta-data android:name="listener"
android:value="com.android.cts.runner.CtsTestRunListener" />
diff --git a/tests/assets/alter-footer.zip b/tests/tests/os/assets/alter-footer.zip
similarity index 100%
rename from tests/assets/alter-footer.zip
rename to tests/tests/os/assets/alter-footer.zip
Binary files differ
diff --git a/tests/assets/alter-metadata.zip b/tests/tests/os/assets/alter-metadata.zip
similarity index 100%
rename from tests/assets/alter-metadata.zip
rename to tests/tests/os/assets/alter-metadata.zip
Binary files differ
diff --git a/tests/assets/fake-eocd.zip b/tests/tests/os/assets/fake-eocd.zip
similarity index 100%
rename from tests/assets/fake-eocd.zip
rename to tests/tests/os/assets/fake-eocd.zip
Binary files differ
diff --git a/tests/assets/jarsigned.zip b/tests/tests/os/assets/jarsigned.zip
similarity index 100%
rename from tests/assets/jarsigned.zip
rename to tests/tests/os/assets/jarsigned.zip
Binary files differ
diff --git a/tests/assets/otacerts.zip b/tests/tests/os/assets/otacerts.zip
similarity index 100%
rename from tests/assets/otacerts.zip
rename to tests/tests/os/assets/otacerts.zip
Binary files differ
diff --git a/tests/assets/otasigned.zip b/tests/tests/os/assets/otasigned.zip
similarity index 100%
rename from tests/assets/otasigned.zip
rename to tests/tests/os/assets/otasigned.zip
Binary files differ
diff --git a/tests/assets/random.zip b/tests/tests/os/assets/random.zip
similarity index 100%
rename from tests/assets/random.zip
rename to tests/tests/os/assets/random.zip
Binary files differ
diff --git a/tests/assets/unsigned.zip b/tests/tests/os/assets/unsigned.zip
similarity index 100%
rename from tests/assets/unsigned.zip
rename to tests/tests/os/assets/unsigned.zip
Binary files differ
diff --git a/tests/jni/Android.mk b/tests/tests/os/jni/Android.mk
similarity index 95%
rename from tests/jni/Android.mk
rename to tests/tests/os/jni/Android.mk
index a3e401e..a39b5d1 100644
--- a/tests/jni/Android.mk
+++ b/tests/tests/os/jni/Android.mk
@@ -16,13 +16,13 @@
include $(CLEAR_VARS)
-LOCAL_MODULE := libcts_jni
+LOCAL_MODULE := libctsos_jni
# Don't include this package in any configuration by default.
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := \
- CtsJniOnLoad.cpp \
+ CtsOsJniOnLoad.cpp \
android_os_cts_CpuInstructions.cpp.arm \
android_os_cts_TaggedPointer.cpp \
android_os_cts_OSFeatures.cpp \
diff --git a/tests/jni/CtsJniOnLoad.cpp b/tests/tests/os/jni/CtsOsJniOnLoad.cpp
similarity index 100%
rename from tests/jni/CtsJniOnLoad.cpp
rename to tests/tests/os/jni/CtsOsJniOnLoad.cpp
diff --git a/tests/jni/android_os_cts_CpuFeatures.cpp b/tests/tests/os/jni/android_os_cts_CpuFeatures.cpp
similarity index 100%
rename from tests/jni/android_os_cts_CpuFeatures.cpp
rename to tests/tests/os/jni/android_os_cts_CpuFeatures.cpp
diff --git a/tests/jni/android_os_cts_CpuInstructions.cpp b/tests/tests/os/jni/android_os_cts_CpuInstructions.cpp
similarity index 100%
rename from tests/jni/android_os_cts_CpuInstructions.cpp
rename to tests/tests/os/jni/android_os_cts_CpuInstructions.cpp
diff --git a/tests/jni/android_os_cts_FileUtils.cpp b/tests/tests/os/jni/android_os_cts_FileUtils.cpp
similarity index 100%
rename from tests/jni/android_os_cts_FileUtils.cpp
rename to tests/tests/os/jni/android_os_cts_FileUtils.cpp
diff --git a/tests/jni/android_os_cts_OSFeatures.cpp b/tests/tests/os/jni/android_os_cts_OSFeatures.cpp
similarity index 100%
rename from tests/jni/android_os_cts_OSFeatures.cpp
rename to tests/tests/os/jni/android_os_cts_OSFeatures.cpp
diff --git a/tests/jni/android_os_cts_TaggedPointer.cpp b/tests/tests/os/jni/android_os_cts_TaggedPointer.cpp
similarity index 100%
rename from tests/jni/android_os_cts_TaggedPointer.cpp
rename to tests/tests/os/jni/android_os_cts_TaggedPointer.cpp
diff --git a/tests/tests/os/res/raw/test1.obb b/tests/tests/os/res/raw/test1.obb
new file mode 100644
index 0000000..33479aa
--- /dev/null
+++ b/tests/tests/os/res/raw/test1.obb
Binary files differ
diff --git a/tests/tests/os/res/raw/test1_nosig.obb b/tests/tests/os/res/raw/test1_nosig.obb
new file mode 100644
index 0000000..5c3573f
--- /dev/null
+++ b/tests/tests/os/res/raw/test1_nosig.obb
Binary files differ
diff --git a/tests/tests/os/res/raw/test1_wrongpackage.obb b/tests/tests/os/res/raw/test1_wrongpackage.obb
new file mode 100644
index 0000000..d0aafe1
--- /dev/null
+++ b/tests/tests/os/res/raw/test1_wrongpackage.obb
Binary files differ
diff --git a/tests/tests/os/res/values/strings.xml b/tests/tests/os/res/values/strings.xml
new file mode 100644
index 0000000..c167278
--- /dev/null
+++ b/tests/tests/os/res/values/strings.xml
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="permlab_testGranted">Test Granted</string>
+ <string name="permdesc_testGranted">Used for running CTS tests, for testing operations
+ where we have the permission.</string>
+ <string name="permlab_testDynamic">Test Dynamic</string>
+ <string name="permdesc_testDynamic">Used for running CTS tests, for testing adding
+ dynamic permissions.</string>
+ <string name="permlab_testDenied">Test Denied</string>
+ <string name="permdesc_testDenied">Used for running CTS tests, for testing operations
+ where we do not have the permission.</string>
+ <string name="explain">1. click start. \n2. if above image shaked, then press pass button,
+ else press failed button.</string>
+ <string name="text_view_hello">Hello! Text view!</string>
+ <string name="text_view_hello_two_lines">Hello! \nText view!</string>
+ <string name="text_view_simple_hint">This is a hint.</string>
+ <string name="text_view_hint">This is a string for testing hint of textview.</string>
+ <string name="activity_forwarding">App/Forwarding</string>
+ <string name="forwarding">$$$</string>
+ <string name="go">Go</string>
+ <string name="back">Back</string>
+ <string name="forward_target">
+ Press back button and notice we don\'t see the previous activity.
+ </string>
+ <string name="edit_text">testing</string>
+ <string name="text">DialogTest</string>
+ <string name="text_country">Country</string>
+ <string name="text_name">Name</string>
+ <string name="hello_world">Hello, World!</string>
+ <string name="hello_android">Hello, Android!</string>
+ <string name="alert_dialog_username">Name:</string>
+ <string name="alert_dialog_password">Password:</string>
+ <string name="alert_dialog_positive">Positive</string>
+ <string name="alert_dialog_negative">Negative</string>
+ <string name="alert_dialog_neutral">Neutral</string>
+ <string name="notify">Notify </string>
+ <string name="tabs_1">testing</string>
+ <string name="table_layout_first">first</string>
+ <string name="table_layout_second">second</string>
+ <string name="table_layout_third">third</string>
+ <string name="table_layout_long">Very long to make the string out of the screen</string>
+ <string name="chronometer_text">Test Chronometer</string>
+ <string name="am">AM</string>
+ <string name="pm">PM</string>
+ <string name="viewgroup_test">ViewGroup test</string>
+ <string name="viewanimator_test">ViewAnimator test</string>
+ <string name="id_ok">OK</string>
+ <string name="id_cancel">Cancel</string>
+ <string name="context_test_string1">This is %s string.</string>
+ <string name="context_test_string2">This is test string.</string>
+ <string name="animationutils_test_instructions">Choose different animations</string>
+ <string name="animationutils_test_alpha">Alpha animation</string>
+ <string name="animationutils_test_scale">Scale animation</string>
+ <string name="animationutils_test_rotate">Rotate animation</string>
+ <string name="animationutils_test_translate">Translate animation</string>
+ <string name="animationutils_test_set">Animation set</string>
+ <string name="animationutils_test_layout">Layout animation</string>
+ <string name="animationutils_test_gridlayout">Grid layout animation</string>
+ <string name="twolinelistitem_test_text1">text1</string>
+ <string name="twolinelistitem_test_text2">text2</string>
+ <string name="metadata_text">metadata text</string>
+ <string name="horizontal_text_1">horizontal 1</string>
+ <string name="horizontal_text_2">horizontal 2</string>
+ <string name="horizontal_text_3">horizontal 3</string>
+ <string name="vertical_text_1">vertical 1</string>
+ <string name="vertical_text_2">vertical 2</string>
+ <string name="vertical_text_3">vertical 3</string>
+ <string name="reference">here</string>
+ <string name="coerceIntegerToString">100</string>
+ <string name="coerceBooleanToString">true</string>
+ <string name="coerceColorToString">#fff</string>
+ <string name="coerceFloatToString">100.0</string>
+ <string name="coerceDimensionToString">100px</string>
+ <string name="coerceFractionToString">100<xliff:g id="percent">%</xliff:g></string>
+ <string name="formattedStringNone">Format[]</string>
+ <string name="formattedStringOne">Format[<xliff:g id="format">%d</xliff:g>]</string>
+ <string name="formattedStringTwo">Format[<xliff:g id="format">%3$d,%2$s</xliff:g>]</string>
+ <string name="checkboxpref_key">checkboxpref_key</string>
+ <string name="checkboxpref_title">title of preference</string>
+ <string name="checkboxpref_summary">summary of preference</string>
+ <string name="checkboxpref_summary_on">summary on of preference</string>
+ <string name="checkboxpref_summary_off">summary off of preference</string>
+ <string name="checkboxpref_depend">checkboxpref_depend</string>
+ <string name="checkboxpref_depend_title"> depend title of preference</string>
+ <string name="checkboxpref_depend_summary"> depend summary of preference</string>
+ <string name="edittextpref_key">edittextpref_key</string>
+ <string name="edittextpref_default_value">default value of preference</string>
+ <string name="edittextpref_title">title of edit text preference</string>
+ <string name="edittextpref_summary">summary of edit text preference</string>
+ <string name="edittextpref_dialog_title">dialog title of edit text preference</string>
+ <string name="edittextpref_text">text of edit text preference</string>
+ <string name="listpref_key">listpref_key</string>
+ <string name="listpref_title">title of list preference</string>
+ <string name="listpref_summary">summary of list preference</string>
+ <string name="listpref_dialogtitle">dialog title of list preference</string>
+ <string name="easy">Easy</string>
+ <string name="medium">Medium</string>
+ <string name="hard">Hard</string>
+ <string name="footer_view">Footer view</string>
+ <string name="header_view">Header view</string>
+ <string name="dialogpref_title">title of dialog preference </string>
+ <string name="dialogpref_dialog_title">dialog title of dialog preference </string>
+ <string name="dialogpref_key">dialogpref_key</string>
+ <string name="dialogpref_default_value">default value of dialog preference</string>
+ <string name="dialogpref_summary">summary of dialog preference</string>
+ <string name="dialogpref_message">message of dialog preference</string>
+ <string name="dialogpref_sure">Sure</string>
+ <string name="dialogpref_cancel">Cancel</string>
+ <string name="pref_key">pref_key</string>
+ <string name="pref_title">title of preference</string>
+ <string name="pref_summary">summary of preference</string>
+ <string name="pref_depend_key">pref_depend_key</string>
+ <string name="pref_depend_title"> depend title of preference</string>
+ <string name="pref_depend_summary"> depend summary of preference</string>
+ <string name="android_intent_action_preference">android.intent.action.PREFERENCE</string>
+ <string name="def_pref_key">def_pref_key</string>
+ <string name="def_pref_title">default preference</string>
+ <string name="def_pref_summary">This is default preference of cts</string>
+ <string name="relative_view1">view 1</string>
+ <string name="relative_view2">view 2</string>
+ <string name="relative_view3">view 3</string>
+ <string name="relative_view4">view 4</string>
+ <string name="relative_view5">view 5</string>
+ <string name="relative_view6">view 6</string>
+ <string name="relative_view7">view 7</string>
+ <string name="relative_view8">view 8</string>
+ <string name="relative_view9">view 9</string>
+ <string name="relative_view10">view 10</string>
+ <string name="relative_view11">view 11</string>
+ <string name="relative_view12">view 12</string>
+ <string name="relative_view13">view 13</string>
+ <string name="country">Country:</string>
+ <string name="symbol">Symbol:</string>
+ <string name="country_warning">No such country registered</string>
+ <string name="version_cur">base</string>
+ <string name="version_old">base</string>
+ <string name="version_v3">base</string>
+ <string name="authenticator_label">Android CTS</string>
+ <string name="search_label">Android CTS</string>
+ <string name="tag1">tag 1</string>
+ <string name="tag2">tag 2</string>
+
+ <string name="button">Button</string>
+ <string name="holo_test">Holo Test</string>
+ <string name="holo_generator">Holo Generator</string>
+ <string name="holo_light_test">Holo Light Test</string>
+ <string name="holo_light_generator">Holo Light Generator</string>
+ <string name="reference_image">Reference Image: </string>
+ <string name="generated_image">Generated Image: </string>
+ <string name="themes_prompt">Select a Theme:</string>
+ <string name="sample_text">Sample text goes here. I wanted something creative and whimsical
+but then I just got bored...</string>
+ <string name="long_text">This is a really long string which exceeds the width of the view.
+New devices have a much larger screen which actually enables long strings to be displayed
+with no fading. I have made this string longer to fix this case. If you are correcting this
+text, I would love to see the kind of devices you guys now use! Guys, maybe some devices need longer string!
+I think so, so how about double this string, like copy and paste!
+This is a really long string which exceeds the width of the view.
+New devices have a much larger screen which actually enables long strings to be displayed
+with no fading. I have made this string longer to fix this case. If you are correcting this
+text, I would love to see the kind of devices you guys now use! Guys, maybe some devices need longer string!
+I think so, so how about double this string, like copy and paste! </string>
+ <string name="rectangle200">"M 0,0 l 200,0 l 0, 200 l -200, 0 z"</string>
+</resources>
diff --git a/tests/tests/os/res/xml/alias.xml b/tests/tests/os/res/xml/alias.xml
new file mode 100644
index 0000000..1166669
--- /dev/null
+++ b/tests/tests/os/res/xml/alias.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2008 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.
+ */
+-->
+
+<alias xmlns:android="http://schemas.android.com/apk/res/android">
+ <intent android:action="android.intent.action.MAIN"
+ android:targetPackage="com.android.cts.os"
+ android:targetClass="android.os.cts.ChildActivity"
+ android:data="http://www.google.com/">
+ </intent>
+</alias>
+
diff --git a/tests/tests/os/res/xml/metadata.xml b/tests/tests/os/res/xml/metadata.xml
new file mode 100644
index 0000000..336b931
--- /dev/null
+++ b/tests/tests/os/res/xml/metadata.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<thedata xmlns:android="http://schemas.android.com/apk/res/android"
+ rawText="some raw text"
+ rawColor="#ffffff00"
+ android:color="#f00"
+ android:text="@string/metadata_text"/>
diff --git a/tests/tests/os/src/android/os/cts/ActivityTestsBase.java b/tests/tests/os/src/android/os/cts/ActivityTestsBase.java
new file mode 100644
index 0000000..3f7d91d
--- /dev/null
+++ b/tests/tests/os/src/android/os/cts/ActivityTestsBase.java
@@ -0,0 +1,211 @@
+/*
+ * Copyright (C) 2008 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.os.cts;
+
+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 = "android.os.cts.permission.TEST_GRANTED";
+ public static final String PERMISSION_DENIED = "android.os.cts.permission.TEST_DENIED";
+
+ private static final int TIMEOUT_MS = 60 * 1000;
+
+ 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;
+ }
+
+ @Override
+ 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) {
+ final 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) {
+ mResultCode = resultCode;
+ mData = data;
+ mResultStack = where;
+ mFinished = true;
+ notifyAll();
+ }
+ }
+
+ public int runLaunchpad(String action) {
+ startLaunchpadActivity(action);
+ return waitForResultOrThrow(TIMEOUT_MS);
+ }
+
+ private void startLaunchpadActivity(String action) {
+ LaunchpadActivity.setCallingTest(this);
+
+ synchronized (this) {
+ mIntent.setAction(action);
+ mFinished = false;
+ mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ mContext.startActivity(mIntent);
+ }
+ }
+
+ public int waitForResultOrThrow(int timeoutMs) {
+ return waitForResultOrThrow(timeoutMs, null);
+ }
+
+ public int waitForResultOrThrow(int timeoutMs, String expected) {
+ final 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;
+
+ final long endTime = System.currentTimeMillis() + timeoutMs;
+
+ boolean timeout = false;
+ synchronized (this) {
+ while (!mFinished) {
+ final long delay = endTime - System.currentTimeMillis();
+ if (delay < 0) {
+ timeout = true;
+ break;
+ }
+
+ try {
+ wait(delay);
+ } catch (final 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() {
+ final String msg = mExpecting == null ? "Timeout" : "Timeout while expecting " + mExpecting;
+ finishWithResult(Activity.RESULT_CANCELED, new Intent().setAction(msg));
+ }
+}
diff --git a/tests/src/android/widget/cts/MockPopupWindowStubActivity.java b/tests/tests/os/src/android/os/cts/AliasActivityStub.java
similarity index 64%
copy from tests/src/android/widget/cts/MockPopupWindowStubActivity.java
copy to tests/tests/os/src/android/os/cts/AliasActivityStub.java
index 2ca81de..cff405e 100644
--- a/tests/src/android/widget/cts/MockPopupWindowStubActivity.java
+++ b/tests/tests/os/src/android/os/cts/AliasActivityStub.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008 The Android Open Source Project
+ * Copyright (C) 2009 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.
@@ -13,23 +13,25 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+package android.os.cts;
-package android.widget.cts;
-
-import com.android.cts.stub.R;
-
-import android.app.Activity;
+import android.app.AliasActivity;
import android.os.Bundle;
-import android.widget.PopupWindow;
-/**
- * Stub activity for testing {@link PopupWindow}
- */
-public class MockPopupWindowStubActivity extends Activity {
+public class AliasActivityStub extends AliasActivity {
+
+ public static boolean isOnCreateCalled = false;
+ public static boolean isFinished = false;
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setContentView(R.layout.popupwindow);
+ isOnCreateCalled = true;
+ }
+
+ @Override
+ public void finish() {
+ super.finish();
+ isFinished = true;
}
}
-
diff --git a/tests/tests/os/src/android/os/cts/BinderTest.java b/tests/tests/os/src/android/os/cts/BinderTest.java
index 7a30169..435e247 100644
--- a/tests/tests/os/src/android/os/cts/BinderTest.java
+++ b/tests/tests/os/src/android/os/cts/BinderTest.java
@@ -20,8 +20,6 @@
import java.io.FileDescriptor;
import java.io.PrintWriter;
-import android.app.cts.ActivityTestsBase;
-import android.app.cts.LocalService;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
diff --git a/tests/tests/os/src/android/os/cts/ClearTop.java b/tests/tests/os/src/android/os/cts/ClearTop.java
new file mode 100644
index 0000000..278336c
--- /dev/null
+++ b/tests/tests/os/src/android/os/cts/ClearTop.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2008 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.os.cts;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+
+public class ClearTop extends Activity {
+ public static final String WAIT_CLEAR_TASK = "waitClearTask";
+ private static final String TAG = "ClearTop";
+ public ClearTop() {
+ }
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ final Intent intent = new Intent(getIntent()).setAction(LocalScreen.CLEAR_TASK).setClass(
+ this, LocalScreen.class);
+ startActivity(intent);
+ }
+
+ @Override
+ public void onNewIntent(Intent intent) {
+ Log.i(TAG, "onNewIntent");
+ if (LocalScreen.CLEAR_TASK.equals(intent.getAction())) {
+ setResult(RESULT_OK);
+ } else {
+ setResult(RESULT_CANCELED, new Intent().setAction("New intent received " + intent
+ + ", expecting action " + TestedScreen.CLEAR_TASK));
+ }
+ finish();
+ }
+}
diff --git a/tests/src/android/os/cts/CountDownTimerTestStub.java b/tests/tests/os/src/android/os/cts/CountDownTimerTestStub.java
similarity index 100%
rename from tests/src/android/os/cts/CountDownTimerTestStub.java
rename to tests/tests/os/src/android/os/cts/CountDownTimerTestStub.java
diff --git a/tests/src/android/os/cts/CpuFeatures.java b/tests/tests/os/src/android/os/cts/CpuFeatures.java
similarity index 97%
rename from tests/src/android/os/cts/CpuFeatures.java
rename to tests/tests/os/src/android/os/cts/CpuFeatures.java
index fa6628b..553f264 100644
--- a/tests/src/android/os/cts/CpuFeatures.java
+++ b/tests/tests/os/src/android/os/cts/CpuFeatures.java
@@ -41,7 +41,7 @@
public static final int HWCAP_IDIVT = (1 << 18);
static {
- System.loadLibrary("cts_jni");
+ System.loadLibrary("ctsos_jni");
}
public static native boolean isArmCpu();
diff --git a/tests/src/android/os/cts/CpuInstructions.java b/tests/tests/os/src/android/os/cts/CpuInstructions.java
similarity index 95%
rename from tests/src/android/os/cts/CpuInstructions.java
rename to tests/tests/os/src/android/os/cts/CpuInstructions.java
index e001ceb..45fb2f1 100644
--- a/tests/src/android/os/cts/CpuInstructions.java
+++ b/tests/tests/os/src/android/os/cts/CpuInstructions.java
@@ -19,7 +19,7 @@
public class CpuInstructions {
static {
- System.loadLibrary("cts_jni");
+ System.loadLibrary("ctsos_jni");
}
public static native boolean canReadCntvct();
diff --git a/tests/tests/os/src/android/os/cts/CtsRemoteService.java b/tests/tests/os/src/android/os/cts/CtsRemoteService.java
new file mode 100644
index 0000000..daae49e
--- /dev/null
+++ b/tests/tests/os/src/android/os/cts/CtsRemoteService.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2008 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.os.cts;
+
+import android.app.Service;
+import android.content.Intent;
+import android.os.IBinder;
+import android.os.Process;
+
+public class CtsRemoteService extends Service{
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ android.util.Log.d("Process test stub", "CtsRemoteServiceProcessPid:" + Process.myPid());
+ }
+
+ private final ISecondary.Stub mSecondaryBinder = new ISecondary.Stub() {
+ public int getPid() {
+ return Process.myPid();
+ }
+
+ public long getElapsedCpuTime() {
+ return Process.getElapsedCpuTime();
+ }
+
+ public String getTimeZoneID() {
+ return java.util.TimeZone.getDefault().getID();
+ }
+ };
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ if (ISecondary.class.getName().equals(intent.getAction())) {
+ return mSecondaryBinder;
+ }
+ return null;
+ }
+
+}
diff --git a/tests/src/android/os/cts/EmptyService.java b/tests/tests/os/src/android/os/cts/EmptyService.java
similarity index 100%
rename from tests/src/android/os/cts/EmptyService.java
rename to tests/tests/os/src/android/os/cts/EmptyService.java
diff --git a/tests/src/android/os/cts/FileUtils.java b/tests/tests/os/src/android/os/cts/FileUtils.java
similarity index 98%
rename from tests/src/android/os/cts/FileUtils.java
rename to tests/tests/os/src/android/os/cts/FileUtils.java
index ea31c54..8600d8b 100644
--- a/tests/src/android/os/cts/FileUtils.java
+++ b/tests/tests/os/src/android/os/cts/FileUtils.java
@@ -54,7 +54,7 @@
public static final int S_IXOTH = 00001;
static {
- System.loadLibrary("cts_jni");
+ System.loadLibrary("ctsos_jni");
}
public static class FileStatus {
diff --git a/tests/tests/os/src/android/os/cts/HandlerTest.java b/tests/tests/os/src/android/os/cts/HandlerTest.java
index 326218d..fc775e4 100644
--- a/tests/tests/os/src/android/os/cts/HandlerTest.java
+++ b/tests/tests/os/src/android/os/cts/HandlerTest.java
@@ -22,6 +22,7 @@
import android.os.Message;
import android.os.SystemClock;
import android.os.Handler.Callback;
+import android.test.UiThreadTest;
import android.util.Printer;
public class HandlerTest extends TestCase {
@@ -35,8 +36,9 @@
static final long DELAYED = RUNTIME + 50;
// Handler
- Handler mHandler = new Handler();
- MockHandler mHandler1 = new MockHandler();
+ private final Handler mHandler = new Handler(Looper.getMainLooper());
+ private final MockHandler mHandler1 = new MockHandler(Looper.getMainLooper());
+ private final Object mLock = new Object();
@Override
protected void tearDown() throws Exception {
@@ -44,18 +46,24 @@
super.tearDown();
}
- public void testConstructor() {
- Callback cb = new Callback() {
+ public void testConstructor() throws Throwable {
+ final Callback cb = new Callback() {
public boolean handleMessage(Message msg) {
return false;
}
};
+ new TestThread(new Runnable() {
+ public void run() {
+ Looper.prepare();
+ new Handler();
+ new Handler(cb);
+ }
+ }).runTest(RUNTIME);
+
// new the Handler instance
- new Handler();
- new Handler(Looper.myLooper());
- new Handler(cb);
- new Handler(Looper.myLooper(), cb);
+ new Handler(Looper.getMainLooper());
+ new Handler(Looper.getMainLooper(), cb);
}
public void testPostAtTime1() {
@@ -162,9 +170,9 @@
public void testGetLooper() {
// new the Handler instance
- Looper looper = Looper.myLooper();
- mHandler = new Handler(looper);
- assertSame(looper, mHandler.getLooper());
+ Looper looper = Looper.getMainLooper();
+ Handler handler = new Handler(looper);
+ assertSame(looper, handler.getLooper());
}
public void testRemoveCallbacks() {
@@ -280,7 +288,7 @@
public void testObtainMessageWithInt() {
// new the Handler instance
- Handler handler = new Handler();
+ Handler handler = new Handler(Looper.getMainLooper());
Message msg = handler.obtainMessage();
msg.what = 100;
Message msg1 = mHandler.obtainMessage(msg.what);
@@ -291,7 +299,7 @@
public void testObtainMessageWithIntObject() {
// new the Handler instance
- Handler handler = new Handler();
+ Handler handler = new Handler(Looper.getMainLooper());
Message msg = handler.obtainMessage();
msg.what = 100;
msg.obj = new Object();
@@ -304,7 +312,7 @@
public void testObtainMessageWithMutiInt() {
// new the Handler instance
- Handler handler = new Handler();
+ Handler handler = new Handler(Looper.getMainLooper());
Message msg = handler.obtainMessage();
msg.what = 100;
msg.arg1 = 101;
@@ -319,7 +327,7 @@
public void testObtainMessageWithMutiIntObject() {
// new the Handler instance
- Handler handler = new Handler();
+ Handler handler = new Handler(Looper.getMainLooper());
Message msg = handler.obtainMessage();
msg.what = 100;
msg.arg1 = 1000;
@@ -464,6 +472,14 @@
public Message message;
public int what;
+ MockHandler() {
+ super(Looper.getMainLooper());
+ }
+
+ MockHandler(Looper looper) {
+ super(looper);
+ }
+
@Override
public void handleMessage(Message msg) {
message = msg;
diff --git a/tests/tests/os/src/android/os/cts/IBinderParcelable.java b/tests/tests/os/src/android/os/cts/IBinderParcelable.java
new file mode 100644
index 0000000..e48f58a
--- /dev/null
+++ b/tests/tests/os/src/android/os/cts/IBinderParcelable.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2009 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.os.cts;
+
+import android.os.IBinder;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class IBinderParcelable implements Parcelable {
+ public IBinder binder;
+
+ public IBinderParcelable(IBinder source) {
+ binder = source;
+ }
+
+ public int describeContents() {
+ return 0;
+ }
+
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeStrongBinder(binder);
+ }
+
+ public static final Parcelable.Creator<IBinderParcelable>
+ CREATOR = new Parcelable.Creator<IBinderParcelable>() {
+
+ public IBinderParcelable createFromParcel(Parcel source) {
+ return new IBinderParcelable(source);
+ }
+
+ public IBinderParcelable[] newArray(int size) {
+ return new IBinderParcelable[size];
+ }
+ };
+
+ private IBinderParcelable(Parcel source) {
+ binder = source.readStrongBinder();
+ }
+}
diff --git a/tests/src/android/os/cts/IEmptyService.aidl b/tests/tests/os/src/android/os/cts/IEmptyService.aidl
similarity index 100%
rename from tests/src/android/os/cts/IEmptyService.aidl
rename to tests/tests/os/src/android/os/cts/IEmptyService.aidl
diff --git a/tests/src/android/os/cts/TaggedPointer.java b/tests/tests/os/src/android/os/cts/ISecondary.aidl
similarity index 74%
copy from tests/src/android/os/cts/TaggedPointer.java
copy to tests/tests/os/src/android/os/cts/ISecondary.aidl
index 16e76c9..2c60149 100644
--- a/tests/src/android/os/cts/TaggedPointer.java
+++ b/tests/tests/os/src/android/os/cts/ISecondary.aidl
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2014 The Android Open Source Project
+ * Copyright (C) 2008 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.
@@ -16,11 +16,11 @@
package android.os.cts;
-public class TaggedPointer {
+interface ISecondary {
- static {
- System.loadLibrary("cts_jni");
- }
+ int getPid();
- public static native boolean hasTaggedPointer();
+ long getElapsedCpuTime();
+
+ String getTimeZoneID();
}
diff --git a/tests/tests/os/src/android/os/cts/LaunchpadActivity.java b/tests/tests/os/src/android/os/cts/LaunchpadActivity.java
new file mode 100644
index 0000000..3919ece
--- /dev/null
+++ b/tests/tests/os/src/android/os/cts/LaunchpadActivity.java
@@ -0,0 +1,648 @@
+/*
+ * Copyright (C) 2008 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.os.cts;
+
+import android.app.Activity;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Binder;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Message;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.test.PerformanceTestCase;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+class MyBadParcelable implements Parcelable {
+ public MyBadParcelable() {
+ }
+
+ public void writeToParcel(Parcel out, int flags) {
+ out.writeString("I am bad");
+ }
+
+ public int describeContents() {
+ return 0;
+ }
+
+ public static final Parcelable.Creator<MyBadParcelable> CREATOR =
+ new Parcelable.Creator<MyBadParcelable>() {
+ public MyBadParcelable createFromParcel(Parcel in) {
+ return new MyBadParcelable(in);
+ }
+
+ public MyBadParcelable[] newArray(int size) {
+ return new MyBadParcelable[size];
+ }
+ };
+
+ public MyBadParcelable(Parcel in) {
+ in.readString();
+ }
+}
+
+public class LaunchpadActivity extends Activity {
+ public interface CallingTest extends PerformanceTestCase.Intermediates {
+ public void startTiming(boolean realTime);
+
+ public void addIntermediate(String name);
+
+ public void addIntermediate(String name, long timeInNS);
+
+ public void finishTiming(boolean realTime);
+
+ public void activityFinished(int resultCode, Intent data, RuntimeException where);
+ }
+
+ // Also used as the Binder interface descriptor string in these tests
+ public static final String LAUNCH = "android.os.cts.activity.LAUNCH";
+
+ public static final String FORWARD_RESULT = "android.os.cts.activity.FORWARD_RESULT";
+ public static final String RETURNED_RESULT = "android.os.cts.activity.RETURNED_RESULT";
+
+ public static final String BAD_PARCELABLE = "android.os.cts.activity.BAD_PARCELABLE";
+
+ public static final int LAUNCHED_RESULT = 1;
+ public static final int FORWARDED_RESULT = 2;
+
+ public static final String LIFECYCLE_BASIC = "android.os.cts.activity.LIFECYCLE_BASIC";
+ public static final String LIFECYCLE_SCREEN = "android.os.cts.activity.LIFECYCLE_SCREEN";
+ public static final String LIFECYCLE_DIALOG = "android.os.cts.activity.LIFECYCLE_DIALOG";
+
+ public static final String BROADCAST_REGISTERED = "android.os.cts.activity.BROADCAST_REGISTERED";
+ public static final String BROADCAST_LOCAL = "android.os.cts.activity.BROADCAST_LOCAL";
+ public static final String BROADCAST_REMOTE = "android.os.cts.activity.BROADCAST_REMOTE";
+ public static final String BROADCAST_ALL = "android.os.cts.activity.BROADCAST_ALL";
+ public static final String BROADCAST_REPEAT = "android.os.cts.activity.BROADCAST_REPEAT";
+ public static final String BROADCAST_MULTI = "android.os.cts.activity.BROADCAST_MULTI";
+ public static final String BROADCAST_ABORT = "android.os.cts.activity.BROADCAST_ABORT";
+
+ public static final String EXPANDLIST_SELECT = "EXPANDLIST_SELECT";
+ public static final String EXPANDLIST_VIEW = "EXPANDLIST_VIEW";
+ public static final String EXPANDLIST_CALLBACK = "EXPANDLIST_CALLBACK";
+
+ public static final String BROADCAST_STICKY1 = "android.os.cts.activity.BROADCAST_STICKY1";
+ public static final String BROADCAST_STICKY2 = "android.os.cts.activity.BROADCAST_STICKY2";
+
+ public static final String ALIAS_ACTIVITY = "android.os.cts.activity.ALIAS_ACTIVITY";
+
+ public static final String RECEIVER_REG = "receiver-reg";
+ public static final String RECEIVER_LOCAL = "receiver-local";
+ public static final String RECEIVER_REMOTE = "receiver-remote";
+ public static final String RECEIVER_ABORT = "receiver-abort";
+
+ public static final String DATA_1 = "one";
+ public static final String DATA_2 = "two";
+
+ public static final String ON_START = "onStart";
+ public static final String ON_RESTART = "onRestart";
+ public static final String ON_RESUME = "onResume";
+ public static final String ON_FREEZE = "onSaveInstanceState";
+ public static final String ON_PAUSE = "onPause";
+
+ // ON_STOP and ON_DESTROY are not tested because they may not be called.
+
+ public static final String DO_FINISH = "finish";
+ public static final String DO_LOCAL_SCREEN = "local-screen";
+ public static final String DO_LOCAL_DIALOG = "local-dialog";
+
+ private static final String TAG = "LaunchpadActivity";
+
+ private boolean mBadParcelable = false;
+
+ private boolean mStarted = false;
+
+ private int mResultCode = RESULT_CANCELED;
+ private Intent mData = new Intent().setAction("No result received");
+ private RuntimeException mResultStack = null;
+
+ /** Index into the {@link #mNextLifecycle} array. */
+ private int mNextLifecycle;
+
+ /** Current lifecycle expected to be followed. */
+ private String[] mExpectedLifecycle;
+
+ /** Other possible lifecycles. Never includes the current {@link #mExpectedLifecycle}. */
+ private List<String[]> mOtherPossibleLifecycles = new ArrayList<String[]>(2);
+
+ /** Map from lifecycle arrays to debugging log names. */
+ private Map<String[], String> mLifecycleNames = new HashMap<String[], String>(2);
+
+ private String[] mExpectedReceivers = null;
+ private int mNextReceiver;
+
+ private String[] mExpectedData = null;
+ private boolean[] mReceivedData = null;
+
+ boolean mReceiverRegistered = false;
+
+ private static CallingTest sCallingTest = null;
+
+ public static void setCallingTest(CallingTest ct) {
+ sCallingTest = ct;
+ }
+
+ public LaunchpadActivity() {
+ }
+
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ resetLifecycles();
+
+ // ON_STOP and ON_DESTROY are not tested because they may not be called.
+
+ final String action = getIntent().getAction();
+ if (LIFECYCLE_BASIC.equals(action)) {
+ addPossibleLifecycle(LIFECYCLE_BASIC, new String[] {
+ ON_START, ON_RESUME, DO_FINISH, ON_PAUSE
+ });
+ } else if (LIFECYCLE_SCREEN.equals(action)) {
+ addPossibleLifecycle(LIFECYCLE_SCREEN + "_RESTART", new String[] {
+ ON_START, ON_RESUME, DO_LOCAL_SCREEN, ON_PAUSE,
+ ON_RESTART, ON_START, ON_RESUME, DO_FINISH, ON_PAUSE
+ });
+ addPossibleLifecycle(LIFECYCLE_SCREEN + "_RESUME", new String[] {
+ ON_START, ON_RESUME, DO_LOCAL_SCREEN, ON_PAUSE,
+ ON_RESUME, DO_FINISH, ON_PAUSE
+ });
+ } else if (LIFECYCLE_DIALOG.equals(action)) {
+ addPossibleLifecycle(LIFECYCLE_DIALOG + "_RESTART", new String[] {
+ ON_START, ON_RESUME, DO_LOCAL_DIALOG, ON_PAUSE,
+ ON_RESTART, ON_START, ON_RESUME, DO_FINISH, ON_PAUSE
+ });
+ addPossibleLifecycle(LIFECYCLE_DIALOG + "_RESUME", new String[] {
+ ON_START, ON_RESUME, DO_LOCAL_DIALOG, ON_PAUSE,
+ ON_RESUME, DO_FINISH, ON_PAUSE
+ });
+ }
+ }
+
+ private void resetLifecycles() {
+ mNextLifecycle = 0;
+ mExpectedLifecycle = null;
+ mOtherPossibleLifecycles.clear();
+ mLifecycleNames.clear();
+ }
+
+ /**
+ * Add a potential lifecycle that this activity may follow, since there
+ * are usually multiple valid lifecycles. For instance, sometimes onPause
+ * will lead to onResume rather than onStop when another activity is
+ * raised over the current one.
+ *
+ * @param debugName for the lifecycle shown in the logs
+ * @param lifecycle array containing tokens indicating the expected lifecycle
+ */
+ private void addPossibleLifecycle(String debugName, String[] lifecycle) {
+ mLifecycleNames.put(lifecycle, debugName);
+ if (mExpectedLifecycle == null) {
+ mExpectedLifecycle = lifecycle;
+ } else {
+ mOtherPossibleLifecycles.add(lifecycle);
+ }
+ }
+
+ /**
+ * Switch to the next possible lifecycle and return if switching was
+ * successful. Call this method when mExpectedLifecycle doesn't match
+ * the current lifecycle and you need to check another possible lifecycle.
+ *
+ * @return whether on not there was a lifecycle to switch to
+ */
+ private boolean switchToNextPossibleLifecycle() {
+ if (!mOtherPossibleLifecycles.isEmpty()) {
+ String[] newLifecycle = mOtherPossibleLifecycles.remove(0);
+ Log.w(TAG, "Switching expected lifecycles from "
+ + mLifecycleNames.get(mExpectedLifecycle) + " to "
+ + mLifecycleNames.get(newLifecycle));
+ mExpectedLifecycle = newLifecycle;
+ return true;
+ } else {
+ Log.w(TAG, "No more lifecycles after "
+ + mLifecycleNames.get(mExpectedLifecycle));
+ mExpectedLifecycle = null;
+ return false;
+ }
+ }
+
+ @Override
+ protected void onStart() {
+ super.onStart();
+ checkLifecycle(ON_START);
+ }
+
+ @Override
+ protected void onRestart() {
+ super.onStart();
+ checkLifecycle(ON_RESTART);
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+ checkLifecycle(ON_RESUME);
+
+ if (!mStarted) {
+ mStarted = true;
+
+ mHandler.postDelayed(mTimeout, 10 * 1000);
+
+ final String action = getIntent().getAction();
+
+ sCallingTest.startTiming(true);
+
+ if (LAUNCH.equals(action)) {
+ final Intent intent = getIntent();
+ intent.setFlags(0);
+ intent.setComponent((ComponentName) intent.getParcelableExtra("component"));
+ startActivityForResult(intent, LAUNCHED_RESULT);
+
+ } else if (FORWARD_RESULT.equals(action)) {
+ final Intent intent = getIntent();
+ intent.setFlags(0);
+ intent.setClass(this, LocalScreen.class);
+ startActivityForResult(intent, FORWARDED_RESULT);
+ } else if (BAD_PARCELABLE.equals(action)) {
+ mBadParcelable = true;
+ final Intent intent = getIntent();
+ intent.setFlags(0);
+ intent.setClass(this, LocalScreen.class);
+ startActivityForResult(intent, LAUNCHED_RESULT);
+ } else if (BROADCAST_REGISTERED.equals(action)) {
+ setExpectedReceivers(new String[] {
+ RECEIVER_REG
+ });
+ registerMyReceiver(new IntentFilter(BROADCAST_REGISTERED));
+ sCallingTest.addIntermediate("after-register");
+ sendBroadcast(makeBroadcastIntent(BROADCAST_REGISTERED));
+ } else if (BROADCAST_LOCAL.equals(action)) {
+ setExpectedReceivers(new String[] {
+ RECEIVER_LOCAL
+ });
+ sendBroadcast(makeBroadcastIntent(BROADCAST_LOCAL));
+ } else if (BROADCAST_REMOTE.equals(action)) {
+ setExpectedReceivers(new String[] {
+ RECEIVER_REMOTE
+ });
+ sendBroadcast(makeBroadcastIntent(BROADCAST_REMOTE));
+ } else if (BROADCAST_ALL.equals(action)) {
+ setExpectedReceivers(new String[] {
+ RECEIVER_REMOTE, RECEIVER_REG, RECEIVER_LOCAL
+ });
+ registerMyReceiver(new IntentFilter(BROADCAST_ALL));
+ sCallingTest.addIntermediate("after-register");
+ sendOrderedBroadcast(makeBroadcastIntent(BROADCAST_ALL), null);
+ } else if (BROADCAST_MULTI.equals(action)) {
+ setExpectedReceivers(new String[] {
+ RECEIVER_REMOTE, RECEIVER_REG, RECEIVER_LOCAL, RECEIVER_REMOTE,
+ RECEIVER_REG, RECEIVER_LOCAL, RECEIVER_REMOTE, RECEIVER_REG,
+ RECEIVER_LOCAL, RECEIVER_LOCAL, RECEIVER_REMOTE, RECEIVER_LOCAL,
+ RECEIVER_REMOTE, RECEIVER_REMOTE, RECEIVER_REG, RECEIVER_LOCAL,
+ RECEIVER_REMOTE, RECEIVER_REG, RECEIVER_LOCAL, RECEIVER_REMOTE,
+ RECEIVER_REG, RECEIVER_LOCAL, RECEIVER_REMOTE, RECEIVER_LOCAL,
+ RECEIVER_REMOTE, RECEIVER_LOCAL
+ });
+ registerMyReceiver(new IntentFilter(BROADCAST_ALL));
+ sCallingTest.addIntermediate("after-register");
+ sendOrderedBroadcast(makeBroadcastIntent(BROADCAST_ALL), null);
+ sendOrderedBroadcast(makeBroadcastIntent(BROADCAST_ALL), null);
+ sendOrderedBroadcast(makeBroadcastIntent(BROADCAST_ALL), null);
+ sendOrderedBroadcast(makeBroadcastIntent(BROADCAST_LOCAL), null);
+ sendOrderedBroadcast(makeBroadcastIntent(BROADCAST_REMOTE), null);
+ sendOrderedBroadcast(makeBroadcastIntent(BROADCAST_LOCAL), null);
+ sendOrderedBroadcast(makeBroadcastIntent(BROADCAST_REMOTE), null);
+ sendOrderedBroadcast(makeBroadcastIntent(BROADCAST_ALL), null);
+ sendOrderedBroadcast(makeBroadcastIntent(BROADCAST_ALL), null);
+ sendOrderedBroadcast(makeBroadcastIntent(BROADCAST_ALL), null);
+ sendOrderedBroadcast(makeBroadcastIntent(BROADCAST_REPEAT), null);
+ } else if (BROADCAST_ABORT.equals(action)) {
+ setExpectedReceivers(new String[] {
+ RECEIVER_REMOTE, RECEIVER_ABORT
+ });
+ registerMyReceiver(new IntentFilter(BROADCAST_ABORT));
+ sCallingTest.addIntermediate("after-register");
+ sendOrderedBroadcast(makeBroadcastIntent(BROADCAST_ABORT), null);
+ } else if (BROADCAST_STICKY1.equals(action)) {
+ setExpectedReceivers(new String[] {
+ RECEIVER_REG
+ });
+ setExpectedData(new String[] {
+ DATA_1
+ });
+ registerMyReceiver(new IntentFilter(BROADCAST_STICKY1));
+ sCallingTest.addIntermediate("after-register");
+ } else if (BROADCAST_STICKY2.equals(action)) {
+ setExpectedReceivers(new String[] {
+ RECEIVER_REG, RECEIVER_REG
+ });
+ setExpectedData(new String[] {
+ DATA_1, DATA_2
+ });
+ final IntentFilter filter = new IntentFilter(BROADCAST_STICKY1);
+ filter.addAction(BROADCAST_STICKY2);
+ registerMyReceiver(filter);
+ sCallingTest.addIntermediate("after-register");
+ } else if (ALIAS_ACTIVITY.equals(action)) {
+ final Intent intent = getIntent();
+ intent.setFlags(0);
+ intent.setClass(this, AliasActivityStub.class);
+ startActivityForResult(intent, LAUNCHED_RESULT);
+ } else if (EXPANDLIST_SELECT.equals(action)) {
+ final Intent intent = getIntent();
+ intent.setFlags(0);
+ intent.setAction(action);
+ intent.setComponent((ComponentName) intent.getParcelableExtra("component"));
+ startActivityForResult(intent, LAUNCHED_RESULT);
+ } else if (EXPANDLIST_VIEW.equals(action)) {
+ final Intent intent = getIntent();
+ intent.setFlags(0);
+ intent.setAction(action);
+ intent.setComponent((ComponentName) intent.getParcelableExtra("component"));
+ startActivityForResult(intent, LAUNCHED_RESULT);
+ } else if (EXPANDLIST_CALLBACK.equals(action)) {
+ final Intent intent = getIntent();
+ intent.setFlags(0);
+ intent.setAction(action);
+ intent.setComponent((ComponentName) intent.getParcelableExtra("component"));
+ startActivityForResult(intent, LAUNCHED_RESULT);
+ }
+ }
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle icicle) {
+ super.onSaveInstanceState(icicle);
+ if (mBadParcelable) {
+ icicle.putParcelable("baddy", new MyBadParcelable());
+ }
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ checkLifecycle(ON_PAUSE);
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ switch (requestCode) {
+ case LAUNCHED_RESULT:
+ sCallingTest.finishTiming(true);
+ finishWithResult(resultCode, data);
+ break;
+ case FORWARDED_RESULT:
+ sCallingTest.finishTiming(true);
+ if (RETURNED_RESULT.equals(data.getAction())) {
+ finishWithResult(resultCode, data);
+ } else {
+ finishWithResult(RESULT_CANCELED, new Intent().setAction("Bad data returned: "
+ + data));
+ }
+ break;
+ default:
+ sCallingTest.finishTiming(true);
+ finishWithResult(RESULT_CANCELED, new Intent()
+ .setAction("Unexpected request code: " + requestCode));
+ break;
+ }
+ }
+
+ private void checkLifecycle(String where) {
+ String action = getIntent().getAction();
+
+ if (mExpectedLifecycle == null) {
+ return;
+ }
+
+ if (mNextLifecycle >= mExpectedLifecycle.length) {
+ finishBad("Activity lifecycle for " + action + " incorrect: received " + where
+ + " but don't expect any more calls");
+ mExpectedLifecycle = null;
+ return;
+ }
+
+ do {
+ if (mExpectedLifecycle[mNextLifecycle].equals(where)) {
+ Log.w(TAG, "Matched: " + where);
+ break;
+ } else {
+ Log.w(TAG, "Expected " + mExpectedLifecycle[mNextLifecycle] + " but got " + where);
+ }
+ } while (switchToNextPossibleLifecycle());
+
+ if (mExpectedLifecycle == null) {
+ finishBad("Activity lifecycle for " + action + " incorrect: received " + where
+ + " at " + mNextLifecycle);
+ return;
+ }
+
+ mNextLifecycle++;
+
+ if (mNextLifecycle >= mExpectedLifecycle.length) {
+ finishGood();
+ return;
+ }
+
+ final String next = mExpectedLifecycle[mNextLifecycle];
+ if (next.equals(DO_FINISH)) {
+ mNextLifecycle++;
+ if (mNextLifecycle >= mExpectedLifecycle.length) {
+ setTestResult(RESULT_OK, null);
+ }
+ if (!isFinishing()) {
+ finish();
+ }
+ } else if (next.equals(DO_LOCAL_SCREEN)) {
+ mNextLifecycle++;
+ final Intent intent = new Intent(TestedScreen.WAIT_BEFORE_FINISH);
+ intent.setClass(this, LocalScreen.class);
+ startActivity(intent);
+ } else if (next.equals(DO_LOCAL_DIALOG)) {
+ mNextLifecycle++;
+ final Intent intent = new Intent(TestedScreen.WAIT_BEFORE_FINISH);
+ intent.setClass(this, LocalDialog.class);
+ startActivity(intent);
+ }
+ }
+
+ private void setExpectedReceivers(String[] receivers) {
+ mExpectedReceivers = receivers;
+ mNextReceiver = 0;
+ }
+
+ private void setExpectedData(String[] data) {
+ mExpectedData = data;
+ mReceivedData = new boolean[data.length];
+ }
+
+ @SuppressWarnings("deprecation")
+ private Intent makeBroadcastIntent(String action) {
+ final Intent intent = new Intent(action, null);
+ intent.putExtra("caller", mCallTarget);
+ return intent;
+ }
+
+ private void finishGood() {
+ finishWithResult(RESULT_OK, null);
+ }
+
+ private void finishBad(String error) {
+ finishWithResult(RESULT_CANCELED, new Intent().setAction(error));
+ }
+
+ private void finishWithResult(int resultCode, Intent data) {
+ setTestResult(resultCode, data);
+ finish();
+
+ // Member fields set by calling setTestResult above...
+ sCallingTest.activityFinished(mResultCode, mData, mResultStack);
+ }
+
+ private void setTestResult(int resultCode, Intent data) {
+ mHandler.removeCallbacks(mTimeout);
+ unregisterMyReceiver();
+ mResultCode = resultCode;
+ mData = data;
+ mResultStack = new RuntimeException("Original error was here");
+ mResultStack.fillInStackTrace();
+ }
+
+ private void registerMyReceiver(IntentFilter filter) {
+ mReceiverRegistered = true;
+ registerReceiver(mReceiver, filter);
+ }
+
+ private void unregisterMyReceiver() {
+ if (mReceiverRegistered) {
+ mReceiverRegistered = false;
+ unregisterReceiver(mReceiver);
+ }
+ }
+
+ private final Handler mHandler = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ }
+ };
+
+ static final int GOT_RECEIVE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION;
+ static final int ERROR_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 1;
+
+ private final Binder mCallTarget = new Binder() {
+ @Override
+ public boolean onTransact(int code, Parcel data, Parcel reply, int flags) {
+ data.setDataPosition(0);
+ data.enforceInterface(LaunchpadActivity.LAUNCH);
+ if (code == GOT_RECEIVE_TRANSACTION) {
+ final String name = data.readString();
+ gotReceive(name, null);
+ return true;
+ } else if (code == ERROR_TRANSACTION) {
+ finishBad(data.readString());
+ return true;
+ }
+ return false;
+ }
+ };
+
+ private final void gotReceive(String name, Intent intent) {
+ synchronized (this) {
+
+ sCallingTest.addIntermediate(mNextReceiver + "-" + name);
+
+ if (mExpectedData != null) {
+ final int n = mExpectedData.length;
+ int i;
+ boolean prev = false;
+ for (i = 0; i < n; i++) {
+ if (mExpectedData[i].equals(intent.getStringExtra("test"))) {
+ if (mReceivedData[i]) {
+ prev = true;
+ continue;
+ }
+ mReceivedData[i] = true;
+ break;
+ }
+ }
+ if (i >= n) {
+ if (prev) {
+ finishBad("Receive got data too many times: "
+ + intent.getStringExtra("test"));
+ } else {
+ finishBad("Receive got unexpected data: " + intent.getStringExtra("test"));
+ }
+ return;
+ }
+ }
+
+ if (mNextReceiver >= mExpectedReceivers.length) {
+ finishBad("Got too many onReceiveIntent() calls!");
+ } else if (!mExpectedReceivers[mNextReceiver].equals(name)) {
+ finishBad("Receive out of order: got " + name + " but expected "
+ + mExpectedReceivers[mNextReceiver] + " at " + mNextReceiver);
+ } else {
+ mNextReceiver++;
+ if (mNextReceiver == mExpectedReceivers.length) {
+ mHandler.post(mUnregister);
+ }
+ }
+
+ }
+ }
+
+ private final Runnable mUnregister = new Runnable() {
+ public void run() {
+ if (mReceiverRegistered) {
+ sCallingTest.addIntermediate("before-unregister");
+ unregisterMyReceiver();
+ }
+ sCallingTest.finishTiming(true);
+ finishGood();
+ }
+ };
+
+ private final Runnable mTimeout = new Runnable() {
+ public void run() {
+ Log.i(TAG, "timeout");
+ String msg = "Timeout";
+ if (mExpectedReceivers != null && mNextReceiver < mExpectedReceivers.length) {
+ msg = msg + " waiting for " + mExpectedReceivers[mNextReceiver];
+ }
+ finishBad(msg);
+ }
+ };
+
+ private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ gotReceive(RECEIVER_REG, intent);
+ }
+ };
+}
diff --git a/tests/src/android/os/cts/TaggedPointer.java b/tests/tests/os/src/android/os/cts/LocalDialog.java
similarity index 75%
copy from tests/src/android/os/cts/TaggedPointer.java
copy to tests/tests/os/src/android/os/cts/LocalDialog.java
index 16e76c9..6ccca57 100644
--- a/tests/src/android/os/cts/TaggedPointer.java
+++ b/tests/tests/os/src/android/os/cts/LocalDialog.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2014 The Android Open Source Project
+ * Copyright (C) 2008 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.
@@ -16,11 +16,7 @@
package android.os.cts;
-public class TaggedPointer {
-
- static {
- System.loadLibrary("cts_jni");
+public class LocalDialog extends TestedScreen {
+ public LocalDialog() {
}
-
- public static native boolean hasTaggedPointer();
}
diff --git a/tests/src/android/os/cts/TaggedPointer.java b/tests/tests/os/src/android/os/cts/LocalScreen.java
similarity index 75%
copy from tests/src/android/os/cts/TaggedPointer.java
copy to tests/tests/os/src/android/os/cts/LocalScreen.java
index 16e76c9..0a017c4 100644
--- a/tests/src/android/os/cts/TaggedPointer.java
+++ b/tests/tests/os/src/android/os/cts/LocalScreen.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2014 The Android Open Source Project
+ * Copyright (C) 2008 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.
@@ -16,11 +16,7 @@
package android.os.cts;
-public class TaggedPointer {
-
- static {
- System.loadLibrary("cts_jni");
+public class LocalScreen extends TestedScreen {
+ public LocalScreen() {
}
-
- public static native boolean hasTaggedPointer();
}
diff --git a/tests/tests/os/src/android/os/cts/LocalService.java b/tests/tests/os/src/android/os/cts/LocalService.java
new file mode 100644
index 0000000..0353c23
--- /dev/null
+++ b/tests/tests/os/src/android/os/cts/LocalService.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2008 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.os.cts;
+
+import android.app.Service;
+import android.content.Intent;
+import android.os.Binder;
+import android.os.IBinder;
+import android.os.Parcel;
+import android.os.RemoteException;
+
+public class LocalService extends Service {
+ public static final String SERVICE_LOCAL =
+ "android.os.cts.activity.SERVICE_LOCAL";
+ public static final String SERVICE_LOCAL_GRANTED =
+ "android.os.cts.activity.SERVICE_LOCAL_GRANTED";
+ public static final String SERVICE_LOCAL_DENIED =
+ "android.os.cts.activity.SERVICE_LOCAL_DENIED";
+
+ public static final String REPORT_OBJ_NAME = "report";
+
+ public static final int STARTED_CODE = 1;
+ public static final int DESTROYED_CODE = 2;
+ public static final int SET_REPORTER_CODE = 3;
+ public static final int UNBIND_CODE = 4;
+ public static final int REBIND_CODE = 5;
+
+ private IBinder mReportObject;
+ private int mStartCount = 1;
+
+ private final IBinder mBinder = new Binder() {
+ @Override
+ protected boolean onTransact(int code, Parcel data, Parcel reply,
+ int flags) throws RemoteException {
+ if (code == SET_REPORTER_CODE) {
+ data.enforceInterface(SERVICE_LOCAL);
+ mReportObject = data.readStrongBinder();
+ return true;
+ } else {
+ return super.onTransact(code, data, reply, flags);
+ }
+ }
+ };
+
+
+ public LocalService() {
+ }
+
+ @Override
+ public void onStart(Intent intent, int startId) {
+ if (intent.getExtras() != null) {
+ IBinderParcelable parcelable
+ = (IBinderParcelable) intent.getExtras().getParcelable(REPORT_OBJ_NAME);
+ mReportObject = parcelable.binder;
+ if (mReportObject != null) {
+ bindAction(STARTED_CODE);
+ }
+ }
+ }
+
+ @Override
+ public void onDestroy() {
+ if (mReportObject != null) {
+ bindAction(DESTROYED_CODE);
+ }
+ }
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ return mBinder;
+ }
+
+ @Override
+ public boolean onUnbind(Intent intent) {
+ if (mReportObject != null) {
+ bindAction(UNBIND_CODE);
+ }
+ return true;
+ }
+
+ @Override
+ public void onRebind(Intent intent) {
+ if (mReportObject != null) {
+ bindAction(REBIND_CODE);
+ }
+ }
+
+ private void bindAction(final int bindCode) {
+ try {
+ Parcel data = Parcel.obtain();
+ data.writeInterfaceToken(SERVICE_LOCAL);
+ if (bindCode == STARTED_CODE) {
+ data.writeInt(mStartCount);
+ mStartCount++;
+ }
+ mReportObject.transact(
+ bindCode, data, null, 0);
+ data.recycle();
+ } catch (RemoteException e) {
+ // fail
+ }
+ }
+}
diff --git a/tests/tests/os/src/android/os/cts/LooperTest.java b/tests/tests/os/src/android/os/cts/LooperTest.java
index 6631599..e71b752 100644
--- a/tests/tests/os/src/android/os/cts/LooperTest.java
+++ b/tests/tests/os/src/android/os/cts/LooperTest.java
@@ -38,7 +38,7 @@
public void testDump() {
StringBuilderPrinter printer = new StringBuilderPrinter(new StringBuilder());
final String prefix = "LooperTest";
- Looper.myLooper().dump(printer, prefix);
+ Looper.getMainLooper().dump(printer, prefix);
}
public void testGetMainLooper() {
@@ -78,9 +78,6 @@
}
public void testMyQueue() throws Throwable {
- MessageQueue mq = Looper.myQueue();
- assertNotNull(mq);
-
TestThread t = new TestThread(new Runnable() {
public void run() {
try {
@@ -89,6 +86,9 @@
} catch (Throwable e) {
// expected
}
+ Looper.prepare();
+ MessageQueue mq = Looper.myQueue();
+ assertNotNull(mq);
}
});
@@ -96,13 +96,6 @@
}
public void testPrepare() throws Throwable {
- try {
- Looper.prepare();
- fail("should throw exception because current thread already has a looper");
- } catch (RuntimeException e) {
- //expected
- }
-
TestThread t = new TestThread(new Runnable() {
public void run() {
Looper.prepare();
@@ -191,7 +184,7 @@
}
public void testToString() {
- assertNotNull(Looper.myLooper().toString());
+ assertNotNull(Looper.getMainLooper().toString());
}
class MockPrinter implements Printer {
diff --git a/tests/tests/os/src/android/os/cts/MessageQueueTest.java b/tests/tests/os/src/android/os/cts/MessageQueueTest.java
index 8c38d5f..5b5bf5c 100644
--- a/tests/tests/os/src/android/os/cts/MessageQueueTest.java
+++ b/tests/tests/os/src/android/os/cts/MessageQueueTest.java
@@ -208,17 +208,17 @@
public void testReleaseSyncBarrierThrowsIfTokenNotValid() throws Exception {
// Invalid token
try {
- Looper.myLooper().removeSyncBarrier(-1);
+ Looper.getMainLooper().removeSyncBarrier(-1);
fail("Should have thrown IllegalStateException");
} catch (IllegalStateException ex) {
// expected
}
// Token already removed.
- int barrierToken = Looper.myLooper().postSyncBarrier();
- Looper.myLooper().removeSyncBarrier(barrierToken);
+ int barrierToken = Looper.getMainLooper().postSyncBarrier();
+ Looper.getMainLooper().removeSyncBarrier(barrierToken);
try {
- Looper.myLooper().removeSyncBarrier(barrierToken);
+ Looper.getMainLooper().removeSyncBarrier(barrierToken);
fail("Should have thrown IllegalStateException");
} catch (IllegalStateException ex) {
// expected
diff --git a/tests/tests/os/src/android/os/cts/MessageTest.java b/tests/tests/os/src/android/os/cts/MessageTest.java
index cc45c4b..978897b 100644
--- a/tests/tests/os/src/android/os/cts/MessageTest.java
+++ b/tests/tests/os/src/android/os/cts/MessageTest.java
@@ -18,6 +18,7 @@
import android.os.Bundle;
import android.os.Handler;
+import android.os.Looper;
import android.os.Message;
import android.os.Parcel;
import android.test.AndroidTestCase;
@@ -33,7 +34,7 @@
private Message mMessage;
private boolean mMessageHandlerCalled;
- private Handler mHandler = new Handler() {
+ private Handler mHandler = new Handler(Looper.getMainLooper()) {
public void handleMessage(Message msg) {
mMessageHandlerCalled = true;
}
diff --git a/tests/src/android/os/cts/MessengerService.java b/tests/tests/os/src/android/os/cts/MessengerService.java
similarity index 100%
rename from tests/src/android/os/cts/MessengerService.java
rename to tests/tests/os/src/android/os/cts/MessengerService.java
diff --git a/tests/tests/os/src/android/os/cts/MessengerTest.java b/tests/tests/os/src/android/os/cts/MessengerTest.java
index 0512b23..72bf247 100644
--- a/tests/tests/os/src/android/os/cts/MessengerTest.java
+++ b/tests/tests/os/src/android/os/cts/MessengerTest.java
@@ -43,7 +43,7 @@
private static final int MSG_ARG1 = 100;
private static final int MSG_ARG2 = 1000;
private static final int WHAT = 2008;
- private Handler mHandler = new Handler() {
+ private Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
public boolean sendMessageAtTime(Message msg, long uptimeMillis) {
mResult = true;
diff --git a/tests/src/android/os/cts/OSFeatures.java b/tests/tests/os/src/android/os/cts/OSFeatures.java
similarity index 95%
rename from tests/src/android/os/cts/OSFeatures.java
rename to tests/tests/os/src/android/os/cts/OSFeatures.java
index 59556db..9c4660c 100644
--- a/tests/src/android/os/cts/OSFeatures.java
+++ b/tests/tests/os/src/android/os/cts/OSFeatures.java
@@ -18,7 +18,7 @@
public class OSFeatures {
static {
- System.loadLibrary("cts_jni");
+ System.loadLibrary("ctsos_jni");
}
public static native int getNoNewPrivs();
diff --git a/tests/tests/os/src/android/os/cts/ProcessTest.java b/tests/tests/os/src/android/os/cts/ProcessTest.java
index 90c2eb9..2ca0fd0 100644
--- a/tests/tests/os/src/android/os/cts/ProcessTest.java
+++ b/tests/tests/os/src/android/os/cts/ProcessTest.java
@@ -16,7 +16,6 @@
package android.os.cts;
-import android.app.cts.ISecondary;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
diff --git a/tests/src/android/os/cts/ReadElf.java b/tests/tests/os/src/android/os/cts/ReadElf.java
similarity index 100%
rename from tests/src/android/os/cts/ReadElf.java
rename to tests/tests/os/src/android/os/cts/ReadElf.java
diff --git a/tests/tests/os/src/android/os/cts/RemoteCallbackListTest.java b/tests/tests/os/src/android/os/cts/RemoteCallbackListTest.java
index 4c3f3cf..e00fe89 100644
--- a/tests/tests/os/src/android/os/cts/RemoteCallbackListTest.java
+++ b/tests/tests/os/src/android/os/cts/RemoteCallbackListTest.java
@@ -17,7 +17,6 @@
package android.os.cts;
-import android.app.cts.ISecondary;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
diff --git a/tests/tests/os/src/android/os/cts/ResultReceiverTest.java b/tests/tests/os/src/android/os/cts/ResultReceiverTest.java
index e784444..47a5d99 100644
--- a/tests/tests/os/src/android/os/cts/ResultReceiverTest.java
+++ b/tests/tests/os/src/android/os/cts/ResultReceiverTest.java
@@ -16,16 +16,15 @@
package android.os.cts;
-
-
import android.os.Bundle;
import android.os.Handler;
+import android.os.Looper;
import android.os.Parcel;
import android.os.ResultReceiver;
import android.test.AndroidTestCase;
public class ResultReceiverTest extends AndroidTestCase {
- private Handler mHandler = new Handler();
+ private Handler mHandler = new Handler(Looper.getMainLooper());
private static final long DURATION = 100l;
public void testResultReceiver() throws InterruptedException {
diff --git a/tests/src/android/os/cts/TaggedPointer.java b/tests/tests/os/src/android/os/cts/TaggedPointer.java
similarity index 94%
rename from tests/src/android/os/cts/TaggedPointer.java
rename to tests/tests/os/src/android/os/cts/TaggedPointer.java
index 16e76c9..11c3eba 100644
--- a/tests/src/android/os/cts/TaggedPointer.java
+++ b/tests/tests/os/src/android/os/cts/TaggedPointer.java
@@ -19,7 +19,7 @@
public class TaggedPointer {
static {
- System.loadLibrary("cts_jni");
+ System.loadLibrary("ctsos_jni");
}
public static native boolean hasTaggedPointer();
diff --git a/tests/tests/os/src/android/os/cts/TestThread.java b/tests/tests/os/src/android/os/cts/TestThread.java
new file mode 100644
index 0000000..1a28a20
--- /dev/null
+++ b/tests/tests/os/src/android/os/cts/TestThread.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2009 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.os.cts;
+
+/**
+ * Thread class for executing a Runnable containing assertions in a separate thread.
+ * Uncaught exceptions in the Runnable are rethrown in the context of the the thread
+ * calling the <code>runTest()</code> method.
+ */
+public final class TestThread extends Thread {
+ private Throwable mThrowable;
+ private Runnable mTarget;
+
+ public TestThread(Runnable target) {
+ mTarget = target;
+ }
+
+ @Override
+ public final void run() {
+ try {
+ mTarget.run();
+ } catch (Throwable t) {
+ mThrowable = t;
+ }
+ }
+
+ /**
+ * Run the target Runnable object and wait until the test finish or throw
+ * out Exception if test fail.
+ *
+ * @param runTime
+ * @throws Throwable
+ */
+ public void runTest(long runTime) throws Throwable {
+ start();
+ joinAndCheck(runTime);
+ }
+
+ /**
+ * Get the Throwable object which is thrown when test running
+ * @return The Throwable object
+ */
+ public Throwable getThrowable() {
+ return mThrowable;
+ }
+
+ /**
+ * Set the Throwable object which is thrown when test running
+ * @param t The Throwable object
+ */
+ public void setThrowable(Throwable t) {
+ mThrowable = t;
+ }
+
+ /**
+ * Wait for the test thread to complete and throw the stored exception if there is one.
+ *
+ * @param runTime The time to wait for the test thread to complete.
+ * @throws Throwable
+ */
+ public void joinAndCheck(long runTime) throws Throwable {
+ this.join(runTime);
+ if (this.isAlive()) {
+ this.interrupt();
+ this.join(runTime);
+ throw new Exception("Thread did not finish within allotted time.");
+ }
+ checkException();
+ }
+
+ /**
+ * Check whether there is an exception when running Runnable object.
+ * @throws Throwable
+ */
+ public void checkException() throws Throwable {
+ if (mThrowable != null) {
+ throw mThrowable;
+ }
+ }
+}
diff --git a/tests/tests/os/src/android/os/cts/TestedScreen.java b/tests/tests/os/src/android/os/cts/TestedScreen.java
new file mode 100644
index 0000000..49f3e70
--- /dev/null
+++ b/tests/tests/os/src/android/os/cts/TestedScreen.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2008 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.os.cts;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.os.MessageQueue;
+import android.os.SystemClock;
+import android.util.Log;
+
+public class TestedScreen extends Activity {
+ public static final String WAIT_BEFORE_FINISH = "TestedScreen.WAIT_BEFORE_FINISH";
+ public static final String DELIVER_RESULT = "TestedScreen.DELIVER_RESULT";
+ public static final String CLEAR_TASK = "TestedScreen.CLEAR_TASK";
+ private static final String TAG = "TestedScreen" ;
+ public TestedScreen() {
+ }
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ if (LaunchpadActivity.FORWARD_RESULT.equals(getIntent().getAction())) {
+ final Intent intent = new Intent(getIntent());
+ intent.setAction(DELIVER_RESULT);
+ intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
+ startActivity(intent);
+ finish();
+ } else if (DELIVER_RESULT.equals(getIntent().getAction())) {
+ setResult(RESULT_OK, new Intent().setAction(LaunchpadActivity.RETURNED_RESULT));
+ finish();
+ } else if (CLEAR_TASK.equals(getIntent().getAction())) {
+ if (!getIntent().getBooleanExtra(ClearTop.WAIT_CLEAR_TASK, false)) {
+ launchClearTask();
+ }
+ }
+ }
+
+ @Override
+ protected void onRestoreInstanceState(Bundle state) {
+ super.onRestoreInstanceState(state);
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ if (CLEAR_TASK.equals(getIntent().getAction())) {
+ if (getIntent().getBooleanExtra(ClearTop.WAIT_CLEAR_TASK, false)) {
+ Looper.myLooper();
+ Looper.myQueue().addIdleHandler(new Idler());
+ }
+ } else {
+ Looper.myLooper();
+ Looper.myQueue().addIdleHandler(new Idler());
+ }
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ }
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+ }
+
+ private void launchClearTask() {
+ final Intent intent = new Intent(getIntent()).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
+ .setClass(this, ClearTop.class);
+ startActivity(intent);
+ }
+
+ private final Handler mHandler = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ if (CLEAR_TASK.equals(getIntent().getAction())) {
+ launchClearTask();
+ } else {
+ setResult(RESULT_OK);
+ finish();
+ }
+ }
+ };
+
+ private class Idler implements MessageQueue.IdleHandler {
+ public final boolean queueIdle() {
+ Log.i(TAG, "idle");
+ if (WAIT_BEFORE_FINISH.equals(getIntent().getAction())) {
+ final Message m = Message.obtain();
+ mHandler.sendMessageAtTime(m, SystemClock.uptimeMillis() + 1000);
+ } else if (CLEAR_TASK.equals(getIntent().getAction())) {
+ final Message m = Message.obtain();
+ mHandler.sendMessageAtTime(m, SystemClock.uptimeMillis() + 1000);
+ } else {
+ setResult(RESULT_OK);
+ finish();
+ }
+ return false;
+ }
+ }
+}
diff --git a/tests/tests/os/src/android/os/storage/cts/StorageManagerTest.java b/tests/tests/os/src/android/os/storage/cts/StorageManagerTest.java
index 45c5e45..a4a5759 100644
--- a/tests/tests/os/src/android/os/storage/cts/StorageManagerTest.java
+++ b/tests/tests/os/src/android/os/storage/cts/StorageManagerTest.java
@@ -16,7 +16,7 @@
package android.os.storage.cts;
-import com.android.cts.stub.R;
+import com.android.cts.os.R;
import android.content.Context;
import android.content.res.Resources;
diff --git a/tests/tests/permission/src/android/permission/cts/AppWidgetManagerPermissionTest.java b/tests/tests/permission/src/android/permission/cts/AppWidgetManagerPermissionTest.java
index 4223f08..1328f88 100644
--- a/tests/tests/permission/src/android/permission/cts/AppWidgetManagerPermissionTest.java
+++ b/tests/tests/permission/src/android/permission/cts/AppWidgetManagerPermissionTest.java
@@ -51,11 +51,11 @@
}
try {
- mAppWidgetManager.bindAppWidgetId(1, new ComponentName(mContext, "foo"));
- fail("Was able to call bindAppWidgetId");
+ final boolean bound = mAppWidgetManager.bindAppWidgetIdIfAllowed(1,
+ new ComponentName(mContext, "foo"));
+ assertFalse("Was able to call bindAppWidgetId", bound);
} catch (SecurityException e) {
// expected
}
}
}
-
diff --git a/tests/tests/permission/src/android/permission/cts/NoLocationPermissionTest.java b/tests/tests/permission/src/android/permission/cts/NoLocationPermissionTest.java
index a2cbfb7..93e26ac 100644
--- a/tests/tests/permission/src/android/permission/cts/NoLocationPermissionTest.java
+++ b/tests/tests/permission/src/android/permission/cts/NoLocationPermissionTest.java
@@ -28,28 +28,31 @@
import android.os.Looper;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
-import android.test.AndroidTestCase;
+import android.test.InstrumentationTestCase;
import android.test.suitebuilder.annotation.SmallTest;
+import android.test.UiThreadTest;
import java.util.List;
/**
* Verify the location access without specific permissions.
*/
-public class NoLocationPermissionTest extends AndroidTestCase {
+public class NoLocationPermissionTest extends InstrumentationTestCase {
private static final String TEST_PROVIDER_NAME = "testProvider";
private LocationManager mLocationManager;
private List<String> mAllProviders;
private boolean mHasTelephony;
+ private Context mContext;
@Override
protected void setUp() throws Exception {
super.setUp();
- mLocationManager = (LocationManager) getContext().getSystemService(
+ mContext = getInstrumentation().getTargetContext();
+ mLocationManager = (LocationManager) mContext.getSystemService(
Context.LOCATION_SERVICE);
mAllProviders = mLocationManager.getAllProviders();
- mHasTelephony = getContext().getPackageManager().hasSystemFeature(
+ mHasTelephony = mContext.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_TELEPHONY);
assertNotNull(mLocationManager);
@@ -66,13 +69,13 @@
* Requires Permission: {@link
* android.Manifest.permission#ACCESS_COARSE_LOCATION.}
*/
- @SmallTest
+ @UiThreadTest
public void testListenCellLocation() {
if (!mHasTelephony) {
return;
}
- TelephonyManager telephonyManager = (TelephonyManager) getContext().getSystemService(
+ TelephonyManager telephonyManager = (TelephonyManager) mContext.getSystemService(
Context.TELEPHONY_SERVICE);
PhoneStateListener phoneStateListener = new PhoneStateListener();
try {
@@ -97,13 +100,13 @@
* Requires Permission: {@link
* android.Manifest.permission#ACCESS_COARSE_LOCATION.}
*/
- @SmallTest
+ @UiThreadTest
public void testListenCellLocation2() {
if (!mHasTelephony) {
return;
}
- TelephonyManager telephonyManager = (TelephonyManager) getContext().getSystemService(
+ TelephonyManager telephonyManager = (TelephonyManager) mContext.getSystemService(
Context.TELEPHONY_SERVICE);
PhoneStateListener phoneStateListener = new PhoneStateListener();
@@ -159,7 +162,7 @@
* Requires Permission:
* {@link android.Manifest.permission#ACCESS_FINE_LOCATION}.
*/
- @SmallTest
+ @UiThreadTest
public void testRequestLocationUpdatesNetwork() {
checkRequestLocationUpdates(LocationManager.NETWORK_PROVIDER);
}
@@ -170,7 +173,7 @@
* Requires Permission:
* {@link android.Manifest.permission#ACCESS_FINE_LOCATION}.
*/
- @SmallTest
+ @UiThreadTest
public void testRequestLocationUpdatesGps() {
checkRequestLocationUpdates(LocationManager.GPS_PROVIDER);
}
@@ -183,7 +186,7 @@
*/
@SmallTest
public void testAddProximityAlert() {
- PendingIntent mockPendingIntent = PendingIntent.getBroadcast(getContext(),
+ PendingIntent mockPendingIntent = PendingIntent.getBroadcast(mContext,
0, new Intent("mockIntent"), PendingIntent.FLAG_ONE_SHOT);
try {
mLocationManager.addProximityAlert(0, 0, 100, -1, mockPendingIntent);
diff --git a/tests/tests/permission/src/android/permission/cts/NoReadLogsPermissionTest.java b/tests/tests/permission/src/android/permission/cts/NoReadLogsPermissionTest.java
index 9441319..8979a07 100644
--- a/tests/tests/permission/src/android/permission/cts/NoReadLogsPermissionTest.java
+++ b/tests/tests/permission/src/android/permission/cts/NoReadLogsPermissionTest.java
@@ -16,7 +16,10 @@
package android.permission.cts;
-import android.permission.cts.FileUtils.FileStatus;
+import android.system.ErrnoException;
+import android.system.Os;
+import android.system.OsConstants;
+import android.system.StructStat;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.MediumTest;
import android.util.Log;
@@ -72,19 +75,30 @@
}
}
- public void testLogFilePermissions() {
- File logDir = new File("/dev/log");
- File[] logFiles = logDir.listFiles();
- assertTrue("Where are the log files? Please check that they are not world readable.",
- logFiles.length > 0);
+ public void testEventsLogSane() throws ErrnoException {
+ testLogIsSane("/dev/log/events");
+ }
- FileStatus status = new FileStatus();
- for (File log : logFiles) {
- if (FileUtils.getFileStatus(log.getAbsolutePath(), status, false)) {
- assertEquals("Log file " + log.getAbsolutePath() + " should have user root.",
- 0, status.uid);
- assertTrue("Log file " + log.getAbsolutePath() + " should have group log.",
- "log".equals(FileUtils.getGroupName(status.gid)));
+ public void testMainLogSane() throws ErrnoException {
+ testLogIsSane("/dev/log/main");
+ }
+
+ public void testRadioLogSane() throws ErrnoException {
+ testLogIsSane("/dev/log/radio");
+ }
+
+ public void testSystemLogSane() throws ErrnoException {
+ testLogIsSane("/dev/log/system");
+ }
+
+ private static void testLogIsSane(String log) throws ErrnoException {
+ try {
+ StructStat stat = Os.stat(log);
+ assertEquals("not owned by uid=0", 0, stat.st_uid);
+ assertEquals("not owned by gid=logs", "log", FileUtils.getGroupName(stat.st_gid));
+ } catch (ErrnoException e) {
+ if (e.errno != OsConstants.ENOENT && e.errno != OsConstants.EACCES) {
+ throw e;
}
}
}
diff --git a/tests/tests/print/src/android/print/cts/BasePrintTest.java b/tests/tests/print/src/android/print/cts/BasePrintTest.java
index a8e8a95..1493bc9 100644
--- a/tests/tests/print/src/android/print/cts/BasePrintTest.java
+++ b/tests/tests/print/src/android/print/cts/BasePrintTest.java
@@ -39,8 +39,10 @@
import android.print.PrintDocumentAdapter.WriteResultCallback;
import android.print.PrintManager;
import android.print.PrinterId;
+import android.print.cts.services.FirstPrintService;
import android.print.cts.services.PrintServiceCallbacks;
import android.print.cts.services.PrinterDiscoverySessionCallbacks;
+import android.print.cts.services.SecondPrintService;
import android.print.cts.services.StubbablePrinterDiscoverySession;
import android.print.pdf.PrintedPdfDocument;
import android.printservice.PrintJob;
@@ -68,7 +70,7 @@
*/
public abstract class BasePrintTest extends UiAutomatorTestCase {
- private static final long OPERATION_TIMEOUT = 10000;
+ private static final long OPERATION_TIMEOUT = 100000000;
private static final String ARG_PRIVILEGED_OPS = "ARG_PRIVILEGED_OPS";
diff --git a/tests/tests/print/src/android/print/cts/PrintDocumentAdapterContractTest.java b/tests/tests/print/src/android/print/cts/PrintDocumentAdapterContractTest.java
index 64bc5d6..516db56 100644
--- a/tests/tests/print/src/android/print/cts/PrintDocumentAdapterContractTest.java
+++ b/tests/tests/print/src/android/print/cts/PrintDocumentAdapterContractTest.java
@@ -122,6 +122,9 @@
// Wait for finish.
waitForAdapterFinishCallbackCalled();
+ // Wait for the session to be destroyed to isolate tests.
+ waitForPrinterDiscoverySessionDestroyCallbackCalled();
+
// Verify the expected calls.
InOrder inOrder = inOrder(adapter);
@@ -229,6 +232,9 @@
// Wait for finish.
waitForAdapterFinishCallbackCalled();
+ // Wait for the session to be destroyed to isolate tests.
+ waitForPrinterDiscoverySessionDestroyCallbackCalled();
+
// Verify the expected calls.
InOrder inOrder = inOrder(adapter);
@@ -344,6 +350,9 @@
// Wait for a finish.
waitForAdapterFinishCallbackCalled();
+ // Wait for the session to be destroyed to isolate tests.
+ waitForPrinterDiscoverySessionDestroyCallbackCalled();
+
// Verify the expected calls.
InOrder inOrder = inOrder(adapter);
@@ -510,6 +519,9 @@
// Wait for a finish.
waitForAdapterFinishCallbackCalled();
+ // Wait for the session to be destroyed to isolate tests.
+ waitForPrinterDiscoverySessionDestroyCallbackCalled();
+
// Verify the expected calls.
InOrder inOrder = inOrder(adapter);
@@ -649,6 +661,9 @@
// Wait for a finish.
waitForAdapterFinishCallbackCalled();
+ // Wait for the session to be destroyed to isolate tests.
+ waitForPrinterDiscoverySessionDestroyCallbackCalled();
+
// Verify the expected calls.
InOrder inOrder = inOrder(adapter);
@@ -765,6 +780,9 @@
// Wait for a finish.
waitForAdapterFinishCallbackCalled();
+ // Wait for the session to be destroyed to isolate tests.
+ waitForPrinterDiscoverySessionDestroyCallbackCalled();
+
// Verify the expected calls.
InOrder inOrder = inOrder(adapter);
@@ -868,6 +886,9 @@
// Wait for a finish.
waitForAdapterFinishCallbackCalled();
+ // Wait for the session to be destroyed to isolate tests.
+ waitForPrinterDiscoverySessionDestroyCallbackCalled();
+
// Verify the expected calls.
InOrder inOrder = inOrder(adapter);
@@ -967,6 +988,9 @@
// Wait for a finish.
waitForAdapterFinishCallbackCalled();
+ // Wait for the session to be destroyed to isolate tests.
+ waitForPrinterDiscoverySessionDestroyCallbackCalled();
+
// Verify the expected calls.
InOrder inOrder = inOrder(adapter);
@@ -1055,6 +1079,9 @@
// Wait for a finish.
waitForAdapterFinishCallbackCalled();
+ // Wait for the session to be destroyed to isolate tests.
+ waitForPrinterDiscoverySessionDestroyCallbackCalled();
+
// Verify the expected calls.
InOrder inOrder = inOrder(adapter);
@@ -1121,6 +1148,9 @@
// Wait for a finish.
waitForAdapterFinishCallbackCalled();
+ // Wait for the session to be destroyed to isolate tests.
+ waitForPrinterDiscoverySessionDestroyCallbackCalled();
+
// Verify the expected calls.
InOrder inOrder = inOrder(adapter);
@@ -1197,6 +1227,9 @@
// Wait for a finish.
waitForAdapterFinishCallbackCalled();
+ // Wait for the session to be destroyed to isolate tests.
+ waitForPrinterDiscoverySessionDestroyCallbackCalled();
+
// Verify the expected calls.
InOrder inOrder = inOrder(adapter);
@@ -1283,6 +1316,9 @@
// Wait for a finish.
waitForAdapterFinishCallbackCalled();
+ // Wait for the session to be destroyed to isolate tests.
+ waitForPrinterDiscoverySessionDestroyCallbackCalled();
+
// Verify the expected calls.
InOrder inOrder = inOrder(adapter);
@@ -1348,6 +1384,9 @@
// Wait for a finish.
waitForAdapterFinishCallbackCalled();
+ // Wait for the session to be destroyed to isolate tests.
+ waitForPrinterDiscoverySessionDestroyCallbackCalled();
+
// Verify the expected calls.
InOrder inOrder = inOrder(adapter);
@@ -1421,6 +1460,9 @@
// Wait for a finish.
waitForAdapterFinishCallbackCalled();
+ // Wait for the session to be destroyed to isolate tests.
+ waitForPrinterDiscoverySessionDestroyCallbackCalled();
+
// Verify the expected calls.
InOrder inOrder = inOrder(adapter);
@@ -1517,7 +1559,14 @@
}
return null;
}
- }, null, null, null, null, null);
+ }, null, null, null, null, new Answer<Void>() {
+ @Override
+ public Void answer(InvocationOnMock invocation) throws Throwable {
+ // Take a note onDestroy was called.
+ onPrinterDiscoverySessionDestroyCalled();
+ return null;
+ }
+ });
return createMockPrintServiceCallbacks(new Answer<PrinterDiscoverySessionCallbacks>() {
@Override
public PrinterDiscoverySessionCallbacks answer(InvocationOnMock invocation) {
diff --git a/tests/tests/provider/Android.mk b/tests/tests/provider/Android.mk
index 4c5875b..81ff9ee 100644
--- a/tests/tests/provider/Android.mk
+++ b/tests/tests/provider/Android.mk
@@ -23,12 +23,10 @@
LOCAL_JAVA_LIBRARIES := android.test.runner telephony-common
-LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
+LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := CtsProviderTestCases
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
-
include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/provider/AndroidManifest.xml b/tests/tests/provider/AndroidManifest.xml
index 7bf44b7..abda46c 100644
--- a/tests/tests/provider/AndroidManifest.xml
+++ b/tests/tests/provider/AndroidManifest.xml
@@ -23,10 +23,36 @@
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
+ <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
+ <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
+ <uses-permission android:name="com.android.browser.permission.READ_HISTORY_BOOKMARKS" />
+ <uses-permission android:name="com.android.browser.permission.WRITE_HISTORY_BOOKMARKS" />
+ <uses-permission android:name="android.permission.WRITE_CALENDAR" />
+ <uses-permission android:name="android.permission.READ_CALENDAR" />
+ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+ <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+ <uses-permission android:name="android.permission.WRITE_SETTINGS" />
+ <uses-permission android:name="android.permission.WRITE_USER_DICTIONARY" />
+ <uses-permission android:name="android.permission.READ_USER_DICTIONARY" />
+ <uses-permission android:name="com.android.voicemail.permission.ADD_VOICEMAIL" />
+ <uses-permission android:name="android.permission.WRITE_CALL_LOG" />
+ <uses-permission android:name="android.permission.WRITE_CONTACTS" />
+ <uses-permission android:name="android.permission.WRITE_SOCIAL_STREAM" />
+ <uses-permission android:name="android.permission.READ_CALL_LOG" />
+ <uses-permission android:name="android.permission.READ_CONTACTS" />
+ <uses-permission android:name="android.permission.READ_SOCIAL_STREAM" />
<application>
<uses-library android:name="android.test.runner"/>
+ <activity android:name="android.provider.cts.BrowserStubActivity"
+ android:label="BrowserStubActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
<service android:name="android.provider.cts.contacts.account.MockAccountService"
process="com.android.cts.provider"
android:exported="true">
@@ -41,14 +67,14 @@
</application>
<instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
- android:targetPackage="com.android.cts.stub"
+ android:targetPackage="com.android.cts.provider"
android:label="CTS tests of android.provider">
<meta-data android:name="listener"
android:value="com.android.cts.runner.CtsTestRunListener" />
</instrumentation>
<instrumentation android:name="android.provider.cts.CalendarTest$CalendarEmmaTestRunner"
- android:targetPackage="com.android.cts.stub"
+ android:targetPackage="com.android.cts.provider"
android:label="Augmented CTS tests of Calendar provider"/>
</manifest>
diff --git a/tests/tests/provider/res/drawable/scenery.jpg b/tests/tests/provider/res/drawable/scenery.jpg
new file mode 100644
index 0000000..7a6145b
--- /dev/null
+++ b/tests/tests/provider/res/drawable/scenery.jpg
Binary files differ
diff --git a/tests/tests/provider/res/drawable/size_48x48.jpg b/tests/tests/provider/res/drawable/size_48x48.jpg
new file mode 100644
index 0000000..5c2291e
--- /dev/null
+++ b/tests/tests/provider/res/drawable/size_48x48.jpg
Binary files differ
diff --git a/tests/tests/provider/res/drawable/testimage.jpg b/tests/tests/provider/res/drawable/testimage.jpg
new file mode 100644
index 0000000..754df0c
--- /dev/null
+++ b/tests/tests/provider/res/drawable/testimage.jpg
Binary files differ
diff --git a/tests/tests/provider/res/raw/scenery.jpg b/tests/tests/provider/res/raw/scenery.jpg
new file mode 100644
index 0000000..7d1f5e1
--- /dev/null
+++ b/tests/tests/provider/res/raw/scenery.jpg
Binary files differ
diff --git a/tests/tests/provider/res/raw/testmp3.mp3 b/tests/tests/provider/res/raw/testmp3.mp3
new file mode 100755
index 0000000..657faf7
--- /dev/null
+++ b/tests/tests/provider/res/raw/testmp3.mp3
Binary files differ
diff --git a/tests/tests/provider/res/raw/testmp3_2.mp3 b/tests/tests/provider/res/raw/testmp3_2.mp3
new file mode 100644
index 0000000..6a70c69
--- /dev/null
+++ b/tests/tests/provider/res/raw/testmp3_2.mp3
Binary files differ
diff --git a/tests/tests/provider/res/raw/testvideo.3gp b/tests/tests/provider/res/raw/testvideo.3gp
new file mode 100644
index 0000000..1503272
--- /dev/null
+++ b/tests/tests/provider/res/raw/testvideo.3gp
Binary files differ
diff --git a/tests/tests/provider/res/values/arrays.xml b/tests/tests/provider/res/values/arrays.xml
new file mode 100644
index 0000000..71e0133
--- /dev/null
+++ b/tests/tests/provider/res/values/arrays.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 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.
+ -->
+
+<resources>
+ <item type="integer" name="reference" format="integer">101</item>
+
+ <string-array name="strings">
+ <item>zero</item>
+ <item>1</item>
+ <item>@string/reference</item>
+ </string-array>
+
+ <integer-array name="integers">
+ <item>0</item>
+ <item>1</item>
+ <item>@integer/reference</item>
+ </integer-array>
+
+ <array name="difficultyLevel">
+ <item>Easy</item>
+ <item>Medium</item>
+ <item>Hard</item>
+ </array>
+
+ <string-array name="string">
+ <item>Test String 1</item>
+ <item>Test String 2</item>
+ <item>Test String 3</item>
+ </string-array>
+
+ <integer-array name="table_row_layout">
+ <item>1</item>
+ <item>2</item>
+ <item>3</item>
+ <item>4</item>
+ <item>5</item>
+ <item>6</item>
+ <item>7</item>
+ <item>8</item>
+ <item>9</item>
+ <item>10</item>
+ </integer-array>
+</resources>
diff --git a/tests/tests/provider/res/values/strings.xml b/tests/tests/provider/res/values/strings.xml
index b599c31..eb10ca1 100644
--- a/tests/tests/provider/res/values/strings.xml
+++ b/tests/tests/provider/res/values/strings.xml
@@ -15,6 +15,168 @@
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="permlab_testGranted">Test Granted</string>
+ <string name="permdesc_testGranted">Used for running CTS tests, for testing operations
+ where we have the permission.</string>
+ <string name="permlab_testDynamic">Test Dynamic</string>
+ <string name="permdesc_testDynamic">Used for running CTS tests, for testing adding
+ dynamic permissions.</string>
+ <string name="permlab_testDenied">Test Denied</string>
+ <string name="permdesc_testDenied">Used for running CTS tests, for testing operations
+ where we do not have the permission.</string>
+ <string name="explain">1. click start. \n2. if above image shaked, then press pass button,
+ else press failed button.</string>
+ <string name="text_view_hello">Hello! Text view!</string>
+ <string name="text_view_hello_two_lines">Hello! \nText view!</string>
+ <string name="text_view_simple_hint">This is a hint.</string>
+ <string name="text_view_hint">This is a string for testing hint of textview.</string>
+ <string name="activity_forwarding">App/Forwarding</string>
+ <string name="forwarding">$$$</string>
+ <string name="go">Go</string>
+ <string name="back">Back</string>
+ <string name="forward_target">
+ Press back button and notice we don\'t see the previous activity.
+ </string>
+ <string name="edit_text">testing</string>
+ <string name="text">DialogTest</string>
+ <string name="text_country">Country</string>
+ <string name="text_name">Name</string>
+ <string name="hello_world">Hello, World!</string>
+ <string name="hello_android">Hello, Android!</string>
+ <string name="alert_dialog_username">Name:</string>
+ <string name="alert_dialog_password">Password:</string>
+ <string name="alert_dialog_positive">Positive</string>
+ <string name="alert_dialog_negative">Negative</string>
+ <string name="alert_dialog_neutral">Neutral</string>
+ <string name="notify">Notify </string>
+ <string name="tabs_1">testing</string>
+ <string name="table_layout_first">first</string>
+ <string name="table_layout_second">second</string>
+ <string name="table_layout_third">third</string>
+ <string name="table_layout_long">Very long to make the string out of the screen</string>
+ <string name="chronometer_text">Test Chronometer</string>
+ <string name="am">AM</string>
+ <string name="pm">PM</string>
+ <string name="viewgroup_test">ViewGroup test</string>
+ <string name="viewanimator_test">ViewAnimator test</string>
+ <string name="id_ok">OK</string>
+ <string name="id_cancel">Cancel</string>
+ <string name="context_test_string1">This is %s string.</string>
+ <string name="context_test_string2">This is test string.</string>
+ <string name="animationutils_test_instructions">Choose different animations</string>
+ <string name="animationutils_test_alpha">Alpha animation</string>
+ <string name="animationutils_test_scale">Scale animation</string>
+ <string name="animationutils_test_rotate">Rotate animation</string>
+ <string name="animationutils_test_translate">Translate animation</string>
+ <string name="animationutils_test_set">Animation set</string>
+ <string name="animationutils_test_layout">Layout animation</string>
+ <string name="animationutils_test_gridlayout">Grid layout animation</string>
+ <string name="twolinelistitem_test_text1">text1</string>
+ <string name="twolinelistitem_test_text2">text2</string>
+ <string name="metadata_text">metadata text</string>
+ <string name="horizontal_text_1">horizontal 1</string>
+ <string name="horizontal_text_2">horizontal 2</string>
+ <string name="horizontal_text_3">horizontal 3</string>
+ <string name="vertical_text_1">vertical 1</string>
+ <string name="vertical_text_2">vertical 2</string>
+ <string name="vertical_text_3">vertical 3</string>
+ <string name="reference">here</string>
+ <string name="coerceIntegerToString">100</string>
+ <string name="coerceBooleanToString">true</string>
+ <string name="coerceColorToString">#fff</string>
+ <string name="coerceFloatToString">100.0</string>
+ <string name="coerceDimensionToString">100px</string>
+ <string name="coerceFractionToString">100<xliff:g id="percent">%</xliff:g></string>
+ <string name="formattedStringNone">Format[]</string>
+ <string name="formattedStringOne">Format[<xliff:g id="format">%d</xliff:g>]</string>
+ <string name="formattedStringTwo">Format[<xliff:g id="format">%3$d,%2$s</xliff:g>]</string>
+ <string name="checkboxpref_key">checkboxpref_key</string>
+ <string name="checkboxpref_title">title of preference</string>
+ <string name="checkboxpref_summary">summary of preference</string>
+ <string name="checkboxpref_summary_on">summary on of preference</string>
+ <string name="checkboxpref_summary_off">summary off of preference</string>
+ <string name="checkboxpref_depend">checkboxpref_depend</string>
+ <string name="checkboxpref_depend_title"> depend title of preference</string>
+ <string name="checkboxpref_depend_summary"> depend summary of preference</string>
+ <string name="edittextpref_key">edittextpref_key</string>
+ <string name="edittextpref_default_value">default value of preference</string>
+ <string name="edittextpref_title">title of edit text preference</string>
+ <string name="edittextpref_summary">summary of edit text preference</string>
+ <string name="edittextpref_dialog_title">dialog title of edit text preference</string>
+ <string name="edittextpref_text">text of edit text preference</string>
+ <string name="listpref_key">listpref_key</string>
+ <string name="listpref_title">title of list preference</string>
+ <string name="listpref_summary">summary of list preference</string>
+ <string name="listpref_dialogtitle">dialog title of list preference</string>
+ <string name="easy">Easy</string>
+ <string name="medium">Medium</string>
+ <string name="hard">Hard</string>
+ <string name="footer_view">Footer view</string>
+ <string name="header_view">Header view</string>
+ <string name="dialogpref_title">title of dialog preference </string>
+ <string name="dialogpref_dialog_title">dialog title of dialog preference </string>
+ <string name="dialogpref_key">dialogpref_key</string>
+ <string name="dialogpref_default_value">default value of dialog preference</string>
+ <string name="dialogpref_summary">summary of dialog preference</string>
+ <string name="dialogpref_message">message of dialog preference</string>
+ <string name="dialogpref_sure">Sure</string>
+ <string name="dialogpref_cancel">Cancel</string>
+ <string name="pref_key">pref_key</string>
+ <string name="pref_title">title of preference</string>
+ <string name="pref_summary">summary of preference</string>
+ <string name="pref_depend_key">pref_depend_key</string>
+ <string name="pref_depend_title"> depend title of preference</string>
+ <string name="pref_depend_summary"> depend summary of preference</string>
+ <string name="android_intent_action_preference">android.intent.action.PREFERENCE</string>
+ <string name="def_pref_key">def_pref_key</string>
+ <string name="def_pref_title">default preference</string>
+ <string name="def_pref_summary">This is default preference of cts</string>
+ <string name="relative_view1">view 1</string>
+ <string name="relative_view2">view 2</string>
+ <string name="relative_view3">view 3</string>
+ <string name="relative_view4">view 4</string>
+ <string name="relative_view5">view 5</string>
+ <string name="relative_view6">view 6</string>
+ <string name="relative_view7">view 7</string>
+ <string name="relative_view8">view 8</string>
+ <string name="relative_view9">view 9</string>
+ <string name="relative_view10">view 10</string>
+ <string name="relative_view11">view 11</string>
+ <string name="relative_view12">view 12</string>
+ <string name="relative_view13">view 13</string>
+ <string name="country">Country:</string>
+ <string name="symbol">Symbol:</string>
+ <string name="country_warning">No such country registered</string>
+ <string name="version_cur">base</string>
+ <string name="version_old">base</string>
+ <string name="version_v3">base</string>
+ <string name="authenticator_label">Android CTS</string>
+ <string name="search_label">Android CTS</string>
+ <string name="tag1">tag 1</string>
+ <string name="tag2">tag 2</string>
+
+ <string name="button">Button</string>
+ <string name="holo_test">Holo Test</string>
+ <string name="holo_generator">Holo Generator</string>
+ <string name="holo_light_test">Holo Light Test</string>
+ <string name="holo_light_generator">Holo Light Generator</string>
+ <string name="reference_image">Reference Image: </string>
+ <string name="generated_image">Generated Image: </string>
+ <string name="themes_prompt">Select a Theme:</string>
+ <string name="sample_text">Sample text goes here. I wanted something creative and whimsical
+ but then I just got bored...</string>
+ <string name="long_text">This is a really long string which exceeds the width of the view.
+New devices have a much larger screen which actually enables long strings to be displayed
+with no fading. I have made this string longer to fix this case. If you are correcting this
+text, I would love to see the kind of devices you guys now use! Guys, maybe some devices need longer string!
+I think so, so how about double this string, like copy and paste!
+This is a really long string which exceeds the width of the view.
+New devices have a much larger screen which actually enables long strings to be displayed
+with no fading. I have made this string longer to fix this case. If you are correcting this
+text, I would love to see the kind of devices you guys now use! Guys, maybe some devices need longer string!
+I think so, so how about double this string, like copy and paste! </string>
+ <string name="rectangle200">"M 0,0 l 200,0 l 0, 200 l -200, 0 z"</string>
+
<!-- Label for this package -->
<string name="label">Contacts provider</string>
</resources>
diff --git a/tests/src/android/provider/cts/BrowserStubActivity.java b/tests/tests/provider/src/android/provider/cts/BrowserStubActivity.java
similarity index 100%
rename from tests/src/android/provider/cts/BrowserStubActivity.java
rename to tests/tests/provider/src/android/provider/cts/BrowserStubActivity.java
diff --git a/tests/tests/provider/src/android/provider/cts/BrowserTest.java b/tests/tests/provider/src/android/provider/cts/BrowserTest.java
index ffeb2a1..2f0432a 100644
--- a/tests/tests/provider/src/android/provider/cts/BrowserTest.java
+++ b/tests/tests/provider/src/android/provider/cts/BrowserTest.java
@@ -36,7 +36,7 @@
public class BrowserTest extends ActivityInstrumentationTestCase2<BrowserStubActivity> {
public BrowserTest() {
- super("com.android.cts.stub", BrowserStubActivity.class);
+ super("com.android.cts.provider", BrowserStubActivity.class);
}
private Context mContext;
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsContract_PhotoTest.java b/tests/tests/provider/src/android/provider/cts/ContactsContract_PhotoTest.java
index fbd092f..45ba8b8 100644
--- a/tests/tests/provider/src/android/provider/cts/ContactsContract_PhotoTest.java
+++ b/tests/tests/provider/src/android/provider/cts/ContactsContract_PhotoTest.java
@@ -19,7 +19,6 @@
import android.content.ContentProviderClient;
import android.content.ContentResolver;
import android.content.Context;
-import android.os.cts.FileUtils;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Photo;
import android.provider.ContactsContract.Contacts;
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsTest.java b/tests/tests/provider/src/android/provider/cts/ContactsTest.java
index db1c4f7..9a3fc19 100644
--- a/tests/tests/provider/src/android/provider/cts/ContactsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/ContactsTest.java
@@ -219,12 +219,12 @@
try {
Context context = getInstrumentation().getTargetContext();
InputStream inputStream = context.getResources().openRawResource(
- com.android.cts.stub.R.drawable.testimage);
+ com.android.cts.provider.R.drawable.testimage);
int size = inputStream.available();
byte[] data = new byte[size];
inputStream.read(data);
BitmapDrawable sourceDrawable = (BitmapDrawable) context.getResources().getDrawable(
- com.android.cts.stub.R.drawable.testimage);
+ com.android.cts.provider.R.drawable.testimage);
// Test: insert
ContentValues value = new ContentValues();
value.put(Photos.PERSON_ID, 1);
diff --git a/tests/tests/provider/src/android/provider/cts/Contacts_PeopleTest.java b/tests/tests/provider/src/android/provider/cts/Contacts_PeopleTest.java
index e5085b8..6b5de96 100644
--- a/tests/tests/provider/src/android/provider/cts/Contacts_PeopleTest.java
+++ b/tests/tests/provider/src/android/provider/cts/Contacts_PeopleTest.java
@@ -257,7 +257,7 @@
Context context = getInstrumentation().getTargetContext();
try {
InputStream inputStream = context.getResources().openRawResource(
- com.android.cts.stub.R.drawable.testimage);
+ com.android.cts.provider.R.drawable.testimage);
int size = inputStream.available();
byte[] data = new byte[size];
inputStream.read(data);
@@ -275,12 +275,12 @@
assertNull(photoStream);
bitmap = People.loadContactPhoto(context, mPeopleRowsAdded.get(0),
- com.android.cts.stub.R.drawable.size_48x48, null);
+ com.android.cts.provider.R.drawable.size_48x48, null);
assertEquals(96, bitmap.getWidth());
assertEquals(64, bitmap.getHeight());
bitmap = People.loadContactPhoto(context, null,
- com.android.cts.stub.R.drawable.size_48x48, null);
+ com.android.cts.provider.R.drawable.size_48x48, null);
assertNotNull(bitmap);
} catch (IOException e) {
fail("Unexpected IOException");
diff --git a/tests/tests/provider/src/android/provider/cts/FileUtils.java b/tests/tests/provider/src/android/provider/cts/FileUtils.java
new file mode 100644
index 0000000..0766e6d
--- /dev/null
+++ b/tests/tests/provider/src/android/provider/cts/FileUtils.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2011 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.provider.cts;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+/** Bits and pieces copied from hidden API of android.os.FileUtils. */
+public class FileUtils {
+
+ /**
+ * Copy data from a source stream to destFile.
+ * Return true if succeed, return false if failed.
+ */
+ public static boolean copyToFile(InputStream inputStream, File destFile) {
+ try {
+ if (destFile.exists()) {
+ destFile.delete();
+ }
+ FileOutputStream out = new FileOutputStream(destFile);
+ try {
+ byte[] buffer = new byte[4096];
+ int bytesRead;
+ while ((bytesRead = inputStream.read(buffer)) >= 0) {
+ out.write(buffer, 0, bytesRead);
+ }
+ } finally {
+ out.flush();
+ try {
+ out.getFD().sync();
+ } catch (IOException e) {
+ }
+ out.close();
+ }
+ return true;
+ } catch (IOException e) {
+ return false;
+ }
+ }
+
+ public static void createFile(File file, int numBytes) throws IOException {
+ File parentFile = file.getParentFile();
+ if (parentFile != null) {
+ parentFile.mkdirs();
+ }
+ byte[] buffer = new byte[numBytes];
+ FileOutputStream output = new FileOutputStream(file);
+ try {
+ output.write(buffer);
+ } finally {
+ output.close();
+ }
+ }
+
+ public static byte[] readInputStreamFully(InputStream is) {
+ ByteArrayOutputStream os = new ByteArrayOutputStream();
+ byte[] buffer = new byte[32768];
+ int count;
+ try {
+ while ((count = is.read(buffer)) != -1) {
+ os.write(buffer, 0, count);
+ }
+ is.close();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ return os.toByteArray();
+ }
+}
diff --git a/tests/src/android/provider/cts/MediaStoreAudioTestHelper.java b/tests/tests/provider/src/android/provider/cts/MediaStoreAudioTestHelper.java
similarity index 98%
rename from tests/src/android/provider/cts/MediaStoreAudioTestHelper.java
rename to tests/tests/provider/src/android/provider/cts/MediaStoreAudioTestHelper.java
index a87cd3a..c9eb506 100644
--- a/tests/src/android/provider/cts/MediaStoreAudioTestHelper.java
+++ b/tests/tests/provider/src/android/provider/cts/MediaStoreAudioTestHelper.java
@@ -107,7 +107,7 @@
public static final String DISPLAY_NAME = "Jam -Michael Jackson";
public static final String INTERNAL_DATA =
- "/data/data/com.android.cts.stub/files/Jam.mp3";
+ "/data/data/com.android.cts.provider/files/Jam.mp3";
public static final String FILE_NAME = "Jam.mp3";
@@ -190,7 +190,7 @@
Environment.getExternalStorageDirectory().getPath() + "/" + FILE_NAME;
public static final String INTERNAL_DATA =
- "/data/data/com.android.cts.stub/files/Jam_live.mp3";
+ "/data/data/com.android.cts.provider/files/Jam_live.mp3";
diff --git a/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_AlbumsTest.java b/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_AlbumsTest.java
index b265cbf..bad1108 100644
--- a/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_AlbumsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_AlbumsTest.java
@@ -16,7 +16,7 @@
package android.provider.cts;
-import com.android.cts.stub.R;
+import com.android.cts.provider.R;
import android.content.ContentResolver;
import android.content.ContentValues;
diff --git a/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_PlaylistsTest.java b/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_PlaylistsTest.java
index 03a81b8..8dcb1a8 100644
--- a/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_PlaylistsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_PlaylistsTest.java
@@ -112,7 +112,7 @@
public void testStoreAudioPlaylistsInternal() {
ContentValues values = new ContentValues();
values.put(Playlists.NAME, "My favourites");
- values.put(Playlists.DATA, "/data/data/com.android.cts.stub/files/my_favorites.pl");
+ values.put(Playlists.DATA, "/data/data/com.android.cts.provider/files/my_favorites.pl");
long dateAdded = System.currentTimeMillis();
values.put(Playlists.DATE_ADDED, dateAdded);
long dateModified = System.currentTimeMillis();
diff --git a/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_Playlists_MembersTest.java b/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_Playlists_MembersTest.java
index bf97848..58c1cdf 100644
--- a/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_Playlists_MembersTest.java
+++ b/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_Playlists_MembersTest.java
@@ -454,7 +454,7 @@
public void testStoreAudioPlaylistsMembersInternal() {
ContentValues values = new ContentValues();
values.put(Playlists.NAME, "My favourites");
- values.put(Playlists.DATA, "/data/data/com.android.cts.stub/files/my_favorites.pl");
+ values.put(Playlists.DATA, "/data/data/com.android.cts.provider/files/my_favorites.pl");
long dateAdded = System.currentTimeMillis();
values.put(Playlists.DATE_ADDED, dateAdded);
long dateModified = System.currentTimeMillis();
diff --git a/tests/tests/provider/src/android/provider/cts/MediaStore_FilesTest.java b/tests/tests/provider/src/android/provider/cts/MediaStore_FilesTest.java
index 356fe3c..67396d4 100644
--- a/tests/tests/provider/src/android/provider/cts/MediaStore_FilesTest.java
+++ b/tests/tests/provider/src/android/provider/cts/MediaStore_FilesTest.java
@@ -16,7 +16,7 @@
package android.provider.cts;
-import com.android.cts.stub.R;
+import com.android.cts.provider.R;
import android.content.ContentResolver;
import android.content.ContentUris;
diff --git a/tests/tests/provider/src/android/provider/cts/MediaStore_Images_MediaTest.java b/tests/tests/provider/src/android/provider/cts/MediaStore_Images_MediaTest.java
index e68286f..bc86b0a 100644
--- a/tests/tests/provider/src/android/provider/cts/MediaStore_Images_MediaTest.java
+++ b/tests/tests/provider/src/android/provider/cts/MediaStore_Images_MediaTest.java
@@ -16,7 +16,7 @@
package android.provider.cts;
-import com.android.cts.stub.R;
+import com.android.cts.provider.R;
import android.content.ContentResolver;
import android.content.ContentValues;
@@ -26,7 +26,6 @@
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Environment;
-import android.os.cts.FileUtils;
import android.provider.MediaStore.Images.Media;
import android.provider.MediaStore.Images.Thumbnails;
import android.test.InstrumentationTestCase;
diff --git a/tests/tests/provider/src/android/provider/cts/MediaStore_Images_ThumbnailsTest.java b/tests/tests/provider/src/android/provider/cts/MediaStore_Images_ThumbnailsTest.java
index 60bf011..025be2c 100644
--- a/tests/tests/provider/src/android/provider/cts/MediaStore_Images_ThumbnailsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/MediaStore_Images_ThumbnailsTest.java
@@ -16,7 +16,7 @@
package android.provider.cts;
-import com.android.cts.stub.R;
+import com.android.cts.provider.R;
import android.content.ContentResolver;
import android.content.ContentUris;
diff --git a/tests/tests/provider/src/android/provider/cts/MediaStore_VideoTest.java b/tests/tests/provider/src/android/provider/cts/MediaStore_VideoTest.java
index 366fc57..2c9ebd1 100644
--- a/tests/tests/provider/src/android/provider/cts/MediaStore_VideoTest.java
+++ b/tests/tests/provider/src/android/provider/cts/MediaStore_VideoTest.java
@@ -16,7 +16,7 @@
package android.provider.cts;
-import com.android.cts.stub.R;
+import com.android.cts.provider.R;
import android.content.ContentResolver;
import android.content.ContentValues;
diff --git a/tests/tests/provider/src/android/provider/cts/MediaStore_Video_MediaTest.java b/tests/tests/provider/src/android/provider/cts/MediaStore_Video_MediaTest.java
index c9461b4..c3f5070 100644
--- a/tests/tests/provider/src/android/provider/cts/MediaStore_Video_MediaTest.java
+++ b/tests/tests/provider/src/android/provider/cts/MediaStore_Video_MediaTest.java
@@ -17,7 +17,7 @@
package android.provider.cts;
-import com.android.cts.stub.R;
+import com.android.cts.provider.R;
import android.content.ContentResolver;
import android.content.ContentValues;
@@ -25,7 +25,6 @@
import android.database.Cursor;
import android.net.Uri;
import android.os.Environment;
-import android.os.cts.FileUtils;
import android.provider.MediaStore;
import android.provider.MediaStore.Video.Media;
import android.provider.MediaStore.Video.VideoColumns;
diff --git a/tests/tests/provider/src/android/provider/cts/MediaStore_Video_ThumbnailsTest.java b/tests/tests/provider/src/android/provider/cts/MediaStore_Video_ThumbnailsTest.java
index ac0bc03..e74cce4 100644
--- a/tests/tests/provider/src/android/provider/cts/MediaStore_Video_ThumbnailsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/MediaStore_Video_ThumbnailsTest.java
@@ -16,7 +16,7 @@
package android.provider.cts;
-import com.android.cts.stub.R;
+import com.android.cts.provider.R;
import android.content.ContentResolver;
import android.content.ContentUris;
diff --git a/tests/src/android/provider/cts/PhotoUtil.java b/tests/tests/provider/src/android/provider/cts/PhotoUtil.java
similarity index 93%
rename from tests/src/android/provider/cts/PhotoUtil.java
rename to tests/tests/provider/src/android/provider/cts/PhotoUtil.java
index 9c3047f..3f5f873 100644
--- a/tests/src/android/provider/cts/PhotoUtil.java
+++ b/tests/tests/provider/src/android/provider/cts/PhotoUtil.java
@@ -16,10 +16,9 @@
package android.provider.cts;
-import com.android.cts.stub.R;
+import com.android.cts.provider.R;
import android.content.Context;
-import android.os.cts.FileUtils;
import java.io.InputStream;
diff --git a/tests/src/android/provider/cts/TestSearchRecentSuggestionsProvider.java b/tests/tests/provider/src/android/provider/cts/TestSearchRecentSuggestionsProvider.java
similarity index 100%
rename from tests/src/android/provider/cts/TestSearchRecentSuggestionsProvider.java
rename to tests/tests/provider/src/android/provider/cts/TestSearchRecentSuggestionsProvider.java
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/CoreMathVerifier.java b/tests/tests/renderscript/src/android/renderscript/cts/CoreMathVerifier.java
index c237ede..dfcf1f5 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/CoreMathVerifier.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/CoreMathVerifier.java
@@ -1332,6 +1332,9 @@
lgamma(in.max32()));
}
+ /* TODO Until -0 handling is corrected in bionic & associated drivers, we temporarily
+ * disable the verification of -0. We do this with a custom verifier. Once bionic
+ * is fixed, we can restore computeLgamma and remove verifyLgamma.
static public void computeLgamma(TestLgamma.ArgumentsFloatIntFloat args, Target t) {
t.setPrecision(16, 128, false);
Target.Floaty in = t.new32(args.inX);
@@ -1340,13 +1343,33 @@
LgammaResult resultMax = lgamma2(in.max32());
args.out = t.new32(result.lgamma, resultMin.lgamma, resultMax.lgamma);
args.outY = result.gammaSign;
+ }
+ */
+ static public String verifyLgamma(TestLgamma.ArgumentsFloatIntFloat args, Target t) {
+ t.setPrecision(16, 128, false);
+ Target.Floaty in = t.new32(args.inX);
+ LgammaResult result = lgamma2(in.mid32());
+ LgammaResult resultMin = lgamma2(in.min32());
+ LgammaResult resultMax = lgamma2(in.max32());
+ Target.Floaty expectedOut = t.new32(result.lgamma, resultMin.lgamma, resultMax.lgamma);
+ boolean isNegativeZero = args.inX == 0.f && 1.f / args.inX < 0.f;
/* TODO The current implementation of bionic does not handle the -0.f case correctly.
- * It should set the sign to -1 but sets it to 1. We correct the verifier here
- * until bionic is fixed.
+ * It should set the sign to -1 but sets it to 1.
*/
- if (args.inX == 0.f && 1.f / args.inX < 0.f) {
- args.outY = -1;
+ if (!expectedOut.couldBe(args.out) ||
+ (args.outY != result.gammaSign && !isNegativeZero)) {
+ StringBuilder message = new StringBuilder();
+ message.append(String.format("Input in %14.8g {%8x}:\n", args.inX, Float.floatToRawIntBits(args.inX)));
+ message.append("Expected out: ");
+ message.append(expectedOut.toString());
+ message.append("\n");
+ message.append(String.format("Actual out: %14.8g {%8x}", args.out, Float.floatToRawIntBits(args.out)));
+ message.append(String.format("Expected outY: %d\n", result.gammaSign));
+ message.append(String.format("Actual outY: %d\n", args.outY));
+ return message.toString();
}
+
+ return null;
}
// TODO The relaxed ulf for the various log are taken from the old tests.
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestLgamma.java b/tests/tests/renderscript/src/android/renderscript/cts/TestLgamma.java
index 8ec06e7..113df19 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/TestLgamma.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestLgamma.java
@@ -278,7 +278,7 @@
public class ArgumentsFloatIntFloat {
public float inX;
public int outY;
- public Target.Floaty out;
+ public float out;
}
private void checkLgammaFloatIntFloat() {
@@ -315,42 +315,26 @@
// Extract the inputs.
ArgumentsFloatIntFloat args = new ArgumentsFloatIntFloat();
args.inX = arrayInX[i];
- // Figure out what the outputs should have been.
+ // Extract the outputs.
+ args.outY = arrayOutY[i * 1 + j];
+ args.out = arrayOut[i * 1 + j];
+ // Ask the CoreMathVerifier to validate.
Target target = new Target(relaxed);
- CoreMathVerifier.computeLgamma(args, target);
- // Validate the outputs.
- boolean valid = true;
- if (args.outY != arrayOutY[i * 1 + j]) {
- valid = false;
- }
- if (!args.out.couldBe(arrayOut[i * 1 + j])) {
- valid = false;
- }
+ String errorMessage = CoreMathVerifier.verifyLgamma(args, target);
+ boolean valid = errorMessage == null;
if (!valid) {
StringBuilder message = new StringBuilder();
message.append("Input inX: ");
message.append(String.format("%14.8g {%8x} %15a",
args.inX, Float.floatToRawIntBits(args.inX), args.inX));
message.append("\n");
- message.append("Expected output outY: ");
+ message.append("Output outY: ");
message.append(String.format("%d", args.outY));
message.append("\n");
- message.append("Actual output outY: ");
- message.append(String.format("%d", arrayOutY[i * 1 + j]));
- if (args.outY != arrayOutY[i * 1 + j]) {
- message.append(" FAIL");
- }
+ message.append("Output out: ");
+ message.append(Float.toString(args.out));
message.append("\n");
- message.append("Expected output out: ");
- message.append(args.out.toString());
- message.append("\n");
- message.append("Actual output out: ");
- message.append(String.format("%14.8g {%8x} %15a",
- arrayOut[i * 1 + j], Float.floatToRawIntBits(arrayOut[i * 1 + j]), arrayOut[i * 1 + j]));
- if (!args.out.couldBe(arrayOut[i * 1 + j])) {
- message.append(" FAIL");
- }
- message.append("\n");
+ message.append(errorMessage);
assertTrue("Incorrect output for checkLgammaFloatIntFloat" +
(relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
}
@@ -392,42 +376,26 @@
// Extract the inputs.
ArgumentsFloatIntFloat args = new ArgumentsFloatIntFloat();
args.inX = arrayInX[i * 2 + j];
- // Figure out what the outputs should have been.
+ // Extract the outputs.
+ args.outY = arrayOutY[i * 2 + j];
+ args.out = arrayOut[i * 2 + j];
+ // Ask the CoreMathVerifier to validate.
Target target = new Target(relaxed);
- CoreMathVerifier.computeLgamma(args, target);
- // Validate the outputs.
- boolean valid = true;
- if (args.outY != arrayOutY[i * 2 + j]) {
- valid = false;
- }
- if (!args.out.couldBe(arrayOut[i * 2 + j])) {
- valid = false;
- }
+ String errorMessage = CoreMathVerifier.verifyLgamma(args, target);
+ boolean valid = errorMessage == null;
if (!valid) {
StringBuilder message = new StringBuilder();
message.append("Input inX: ");
message.append(String.format("%14.8g {%8x} %15a",
args.inX, Float.floatToRawIntBits(args.inX), args.inX));
message.append("\n");
- message.append("Expected output outY: ");
+ message.append("Output outY: ");
message.append(String.format("%d", args.outY));
message.append("\n");
- message.append("Actual output outY: ");
- message.append(String.format("%d", arrayOutY[i * 2 + j]));
- if (args.outY != arrayOutY[i * 2 + j]) {
- message.append(" FAIL");
- }
+ message.append("Output out: ");
+ message.append(Float.toString(args.out));
message.append("\n");
- message.append("Expected output out: ");
- message.append(args.out.toString());
- message.append("\n");
- message.append("Actual output out: ");
- message.append(String.format("%14.8g {%8x} %15a",
- arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
- if (!args.out.couldBe(arrayOut[i * 2 + j])) {
- message.append(" FAIL");
- }
- message.append("\n");
+ message.append(errorMessage);
assertTrue("Incorrect output for checkLgammaFloat2Int2Float2" +
(relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
}
@@ -469,42 +437,26 @@
// Extract the inputs.
ArgumentsFloatIntFloat args = new ArgumentsFloatIntFloat();
args.inX = arrayInX[i * 4 + j];
- // Figure out what the outputs should have been.
+ // Extract the outputs.
+ args.outY = arrayOutY[i * 4 + j];
+ args.out = arrayOut[i * 4 + j];
+ // Ask the CoreMathVerifier to validate.
Target target = new Target(relaxed);
- CoreMathVerifier.computeLgamma(args, target);
- // Validate the outputs.
- boolean valid = true;
- if (args.outY != arrayOutY[i * 4 + j]) {
- valid = false;
- }
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
- valid = false;
- }
+ String errorMessage = CoreMathVerifier.verifyLgamma(args, target);
+ boolean valid = errorMessage == null;
if (!valid) {
StringBuilder message = new StringBuilder();
message.append("Input inX: ");
message.append(String.format("%14.8g {%8x} %15a",
args.inX, Float.floatToRawIntBits(args.inX), args.inX));
message.append("\n");
- message.append("Expected output outY: ");
+ message.append("Output outY: ");
message.append(String.format("%d", args.outY));
message.append("\n");
- message.append("Actual output outY: ");
- message.append(String.format("%d", arrayOutY[i * 4 + j]));
- if (args.outY != arrayOutY[i * 4 + j]) {
- message.append(" FAIL");
- }
+ message.append("Output out: ");
+ message.append(Float.toString(args.out));
message.append("\n");
- message.append("Expected output out: ");
- message.append(args.out.toString());
- message.append("\n");
- message.append("Actual output out: ");
- message.append(String.format("%14.8g {%8x} %15a",
- arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
- message.append(" FAIL");
- }
- message.append("\n");
+ message.append(errorMessage);
assertTrue("Incorrect output for checkLgammaFloat3Int3Float3" +
(relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
}
@@ -546,42 +498,26 @@
// Extract the inputs.
ArgumentsFloatIntFloat args = new ArgumentsFloatIntFloat();
args.inX = arrayInX[i * 4 + j];
- // Figure out what the outputs should have been.
+ // Extract the outputs.
+ args.outY = arrayOutY[i * 4 + j];
+ args.out = arrayOut[i * 4 + j];
+ // Ask the CoreMathVerifier to validate.
Target target = new Target(relaxed);
- CoreMathVerifier.computeLgamma(args, target);
- // Validate the outputs.
- boolean valid = true;
- if (args.outY != arrayOutY[i * 4 + j]) {
- valid = false;
- }
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
- valid = false;
- }
+ String errorMessage = CoreMathVerifier.verifyLgamma(args, target);
+ boolean valid = errorMessage == null;
if (!valid) {
StringBuilder message = new StringBuilder();
message.append("Input inX: ");
message.append(String.format("%14.8g {%8x} %15a",
args.inX, Float.floatToRawIntBits(args.inX), args.inX));
message.append("\n");
- message.append("Expected output outY: ");
+ message.append("Output outY: ");
message.append(String.format("%d", args.outY));
message.append("\n");
- message.append("Actual output outY: ");
- message.append(String.format("%d", arrayOutY[i * 4 + j]));
- if (args.outY != arrayOutY[i * 4 + j]) {
- message.append(" FAIL");
- }
+ message.append("Output out: ");
+ message.append(Float.toString(args.out));
message.append("\n");
- message.append("Expected output out: ");
- message.append(args.out.toString());
- message.append("\n");
- message.append("Actual output out: ");
- message.append(String.format("%14.8g {%8x} %15a",
- arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
- message.append(" FAIL");
- }
- message.append("\n");
+ message.append(errorMessage);
assertTrue("Incorrect output for checkLgammaFloat4Int4Float4" +
(relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcos.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcos.java
index bda06c7..430cf59 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcos.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcos.java
@@ -72,7 +72,7 @@
CoreMathVerifier.computeNativeAcos(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -87,7 +87,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 1 + j], Float.floatToRawIntBits(arrayOut[i * 1 + j]), arrayOut[i * 1 + j]));
- if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -131,7 +131,7 @@
CoreMathVerifier.computeNativeAcos(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -146,7 +146,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
- if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -190,7 +190,7 @@
CoreMathVerifier.computeNativeAcos(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -205,7 +205,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -249,7 +249,7 @@
CoreMathVerifier.computeNativeAcos(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -264,7 +264,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcosh.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcosh.java
index 7e84c96..d4a840a 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcosh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcosh.java
@@ -72,7 +72,7 @@
CoreMathVerifier.computeNativeAcosh(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -87,7 +87,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 1 + j], Float.floatToRawIntBits(arrayOut[i * 1 + j]), arrayOut[i * 1 + j]));
- if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -131,7 +131,7 @@
CoreMathVerifier.computeNativeAcosh(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -146,7 +146,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
- if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -190,7 +190,7 @@
CoreMathVerifier.computeNativeAcosh(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -205,7 +205,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -249,7 +249,7 @@
CoreMathVerifier.computeNativeAcosh(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -264,7 +264,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcospi.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcospi.java
index 75a29ae..187b787 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcospi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcospi.java
@@ -72,7 +72,7 @@
CoreMathVerifier.computeNativeAcospi(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -87,7 +87,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 1 + j], Float.floatToRawIntBits(arrayOut[i * 1 + j]), arrayOut[i * 1 + j]));
- if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -131,7 +131,7 @@
CoreMathVerifier.computeNativeAcospi(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -146,7 +146,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
- if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -190,7 +190,7 @@
CoreMathVerifier.computeNativeAcospi(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -205,7 +205,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -249,7 +249,7 @@
CoreMathVerifier.computeNativeAcospi(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -264,7 +264,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsin.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsin.java
index 30bab7e..b9f61a6 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsin.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsin.java
@@ -72,7 +72,7 @@
CoreMathVerifier.computeNativeAsin(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -87,7 +87,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 1 + j], Float.floatToRawIntBits(arrayOut[i * 1 + j]), arrayOut[i * 1 + j]));
- if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -131,7 +131,7 @@
CoreMathVerifier.computeNativeAsin(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -146,7 +146,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
- if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -190,7 +190,7 @@
CoreMathVerifier.computeNativeAsin(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -205,7 +205,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -249,7 +249,7 @@
CoreMathVerifier.computeNativeAsin(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -264,7 +264,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsinh.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsinh.java
index 8edf947..f8382a8 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsinh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsinh.java
@@ -72,7 +72,7 @@
CoreMathVerifier.computeNativeAsinh(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -87,7 +87,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 1 + j], Float.floatToRawIntBits(arrayOut[i * 1 + j]), arrayOut[i * 1 + j]));
- if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -131,7 +131,7 @@
CoreMathVerifier.computeNativeAsinh(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -146,7 +146,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
- if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -190,7 +190,7 @@
CoreMathVerifier.computeNativeAsinh(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -205,7 +205,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -249,7 +249,7 @@
CoreMathVerifier.computeNativeAsinh(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -264,7 +264,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsinpi.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsinpi.java
index 08eb07d..e0029b7 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsinpi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsinpi.java
@@ -72,7 +72,7 @@
CoreMathVerifier.computeNativeAsinpi(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -87,7 +87,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 1 + j], Float.floatToRawIntBits(arrayOut[i * 1 + j]), arrayOut[i * 1 + j]));
- if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -131,7 +131,7 @@
CoreMathVerifier.computeNativeAsinpi(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -146,7 +146,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
- if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -190,7 +190,7 @@
CoreMathVerifier.computeNativeAsinpi(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -205,7 +205,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -249,7 +249,7 @@
CoreMathVerifier.computeNativeAsinpi(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -264,7 +264,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan.java
index 316eb6d..26225c5 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan.java
@@ -72,7 +72,7 @@
CoreMathVerifier.computeNativeAtan(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -87,7 +87,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 1 + j], Float.floatToRawIntBits(arrayOut[i * 1 + j]), arrayOut[i * 1 + j]));
- if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -131,7 +131,7 @@
CoreMathVerifier.computeNativeAtan(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -146,7 +146,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
- if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -190,7 +190,7 @@
CoreMathVerifier.computeNativeAtan(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -205,7 +205,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -249,7 +249,7 @@
CoreMathVerifier.computeNativeAtan(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -264,7 +264,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan2.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan2.java
index 5ca8f05..c33523c 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan2.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan2.java
@@ -79,7 +79,7 @@
CoreMathVerifier.computeNativeAtan2(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -98,7 +98,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 1 + j], Float.floatToRawIntBits(arrayOut[i * 1 + j]), arrayOut[i * 1 + j]));
- if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -148,7 +148,7 @@
CoreMathVerifier.computeNativeAtan2(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -167,7 +167,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
- if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -217,7 +217,7 @@
CoreMathVerifier.computeNativeAtan2(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -236,7 +236,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -286,7 +286,7 @@
CoreMathVerifier.computeNativeAtan2(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -305,7 +305,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan2pi.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan2pi.java
index f05d924..dd62b78 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan2pi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan2pi.java
@@ -79,7 +79,7 @@
CoreMathVerifier.computeNativeAtan2pi(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -98,7 +98,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 1 + j], Float.floatToRawIntBits(arrayOut[i * 1 + j]), arrayOut[i * 1 + j]));
- if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -148,7 +148,7 @@
CoreMathVerifier.computeNativeAtan2pi(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -167,7 +167,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
- if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -217,7 +217,7 @@
CoreMathVerifier.computeNativeAtan2pi(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -236,7 +236,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -286,7 +286,7 @@
CoreMathVerifier.computeNativeAtan2pi(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -305,7 +305,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtanh.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtanh.java
index 95f4704..6161483 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtanh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtanh.java
@@ -72,7 +72,7 @@
CoreMathVerifier.computeNativeAtanh(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -87,7 +87,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 1 + j], Float.floatToRawIntBits(arrayOut[i * 1 + j]), arrayOut[i * 1 + j]));
- if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -131,7 +131,7 @@
CoreMathVerifier.computeNativeAtanh(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -146,7 +146,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
- if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -190,7 +190,7 @@
CoreMathVerifier.computeNativeAtanh(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -205,7 +205,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -249,7 +249,7 @@
CoreMathVerifier.computeNativeAtanh(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -264,7 +264,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtanpi.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtanpi.java
index bd07ad8..1e88568 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtanpi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtanpi.java
@@ -72,7 +72,7 @@
CoreMathVerifier.computeNativeAtanpi(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -87,7 +87,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 1 + j], Float.floatToRawIntBits(arrayOut[i * 1 + j]), arrayOut[i * 1 + j]));
- if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -131,7 +131,7 @@
CoreMathVerifier.computeNativeAtanpi(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -146,7 +146,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
- if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -190,7 +190,7 @@
CoreMathVerifier.computeNativeAtanpi(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -205,7 +205,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -249,7 +249,7 @@
CoreMathVerifier.computeNativeAtanpi(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -264,7 +264,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSincos.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSincos.java
index c497ed0..380f2b4 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSincos.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSincos.java
@@ -79,10 +79,10 @@
CoreMathVerifier.computeNativeSincos(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.outCosptr.couldBe(arrayOutCosptr[i * 1 + j])) {
+ if (!args.outCosptr.couldBe(arrayOutCosptr[i * 1 + j], 0.0005)) {
valid = false;
}
- if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -97,7 +97,7 @@
message.append("Actual output outCosptr: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOutCosptr[i * 1 + j], Float.floatToRawIntBits(arrayOutCosptr[i * 1 + j]), arrayOutCosptr[i * 1 + j]));
- if (!args.outCosptr.couldBe(arrayOutCosptr[i * 1 + j])) {
+ if (!args.outCosptr.couldBe(arrayOutCosptr[i * 1 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -107,7 +107,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 1 + j], Float.floatToRawIntBits(arrayOut[i * 1 + j]), arrayOut[i * 1 + j]));
- if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -157,10 +157,10 @@
CoreMathVerifier.computeNativeSincos(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.outCosptr.couldBe(arrayOutCosptr[i * 2 + j])) {
+ if (!args.outCosptr.couldBe(arrayOutCosptr[i * 2 + j], 0.0005)) {
valid = false;
}
- if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -175,7 +175,7 @@
message.append("Actual output outCosptr: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOutCosptr[i * 2 + j], Float.floatToRawIntBits(arrayOutCosptr[i * 2 + j]), arrayOutCosptr[i * 2 + j]));
- if (!args.outCosptr.couldBe(arrayOutCosptr[i * 2 + j])) {
+ if (!args.outCosptr.couldBe(arrayOutCosptr[i * 2 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -185,7 +185,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
- if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -235,10 +235,10 @@
CoreMathVerifier.computeNativeSincos(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.outCosptr.couldBe(arrayOutCosptr[i * 4 + j])) {
+ if (!args.outCosptr.couldBe(arrayOutCosptr[i * 4 + j], 0.0005)) {
valid = false;
}
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -253,7 +253,7 @@
message.append("Actual output outCosptr: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOutCosptr[i * 4 + j], Float.floatToRawIntBits(arrayOutCosptr[i * 4 + j]), arrayOutCosptr[i * 4 + j]));
- if (!args.outCosptr.couldBe(arrayOutCosptr[i * 4 + j])) {
+ if (!args.outCosptr.couldBe(arrayOutCosptr[i * 4 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -263,7 +263,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -313,10 +313,10 @@
CoreMathVerifier.computeNativeSincos(args, target);
// Validate the outputs.
boolean valid = true;
- if (!args.outCosptr.couldBe(arrayOutCosptr[i * 4 + j])) {
+ if (!args.outCosptr.couldBe(arrayOutCosptr[i * 4 + j], 0.0005)) {
valid = false;
}
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
valid = false;
}
if (!valid) {
@@ -331,7 +331,7 @@
message.append("Actual output outCosptr: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOutCosptr[i * 4 + j], Float.floatToRawIntBits(arrayOutCosptr[i * 4 + j]), arrayOutCosptr[i * 4 + j]));
- if (!args.outCosptr.couldBe(arrayOutCosptr[i * 4 + j])) {
+ if (!args.outCosptr.couldBe(arrayOutCosptr[i * 4 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
@@ -341,7 +341,7 @@
message.append("Actual output out: ");
message.append(String.format("%14.8g {%8x} %15a",
arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
- if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+ if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
message.append(" FAIL");
}
message.append("\n");
diff --git a/tests/tests/rscpp/librscpptest/setelementat.rs b/tests/tests/rscpp/librscpptest/setelementat.rs
index 1251ec1..5a84552 100644
--- a/tests/tests/rscpp/librscpptest/setelementat.rs
+++ b/tests/tests/rscpp/librscpptest/setelementat.rs
@@ -1,5 +1,5 @@
#pragma version(1)
-#pragma rs java_package_name(com.android.cts.stub)
+#pragma rs java_package_name(com.android.cts.rscpp)
#pragma rs_fp_relaxed
int memset_toValue = 0;
diff --git a/tests/tests/security/Android.mk b/tests/tests/security/Android.mk
index 032bec3..6a7833d 100644
--- a/tests/tests/security/Android.mk
+++ b/tests/tests/security/Android.mk
@@ -31,6 +31,22 @@
LOCAL_SDK_VERSION := current
+intermediates.COMMON := $(call intermediates-dir-for,APPS,$(LOCAL_PACKAGE_NAME),,COMMON)
+
+sepolicy_asset_dir := $(intermediates.COMMON)/assets
+
+LOCAL_ASSET_DIR := $(sepolicy_asset_dir)
+
include $(BUILD_CTS_PACKAGE)
+selinux_policy.xml := $(sepolicy_asset_dir)/selinux_policy.xml
+selinux_policy_parser := packages/experimental/SELinux/CTS/src/gen_SELinux_CTS.py
+general_sepolicy_policy.conf := $(call intermediates-dir-for,ETC,general_sepolicy.conf)/general_sepolicy.conf
+$(selinux_policy.xml): PRIVATE_POLICY_PARSER := $(selinux_policy_parser)
+$(selinux_policy.xml): $(general_sepolicy_policy.conf) $(selinux_policy_parser)
+ mkdir -p $(dir $@)
+ $(PRIVATE_POLICY_PARSER) $< $@ neverallow_only=t
+
+$(R_file_stamp): $(selinux_policy.xml)
+
include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/tests/security/assets/selinux_policy.xml b/tests/tests/security/assets/selinux_policy.xml
deleted file mode 100644
index f7e816a..0000000
--- a/tests/tests/security/assets/selinux_policy.xml
+++ /dev/null
@@ -1,1733 +0,0 @@
-<?xml version="1.0" ?>
-<SELinux_AVC_Rules>
- <avc_rule name="1" type="neverallow">
- <type type="source">shell</type>
- <type type="source">nfc</type>
- <type type="source">platform_app</type>
- <type type="source">bluetooth</type>
- <type type="source">radio</type>
- <type type="source">isolated_app</type>
- <type type="source">untrusted_app</type>
- <type type="source">media_app</type>
- <type type="source">system_app</type>
- <type type="source">release_app</type>
- <type type="source">shared_app</type>
- <type type="target">kernel</type>
- <obj_class name="security">
- <permission>load_policy</permission>
- </obj_class>
- </avc_rule>
- <avc_rule name="2" type="neverallow">
- <type type="source">sdcardd</type>
- <type type="source">init_shell</type>
- <type type="source">adbd</type>
- <type type="source">netd</type>
- <type type="source">tee</type>
- <type type="source">bluetooth</type>
- <type type="source">lmkd</type>
- <type type="source">surfaceflinger</type>
- <type type="source">mdnsd</type>
- <type type="source">radio</type>
- <type type="source">hci_attach</type>
- <type type="source">clatd</type>
- <type type="source">watchdogd</type>
- <type type="source">drmserver</type>
- <type type="source">keystore</type>
- <type type="source">runas</type>
- <type type="source">servicemanager</type>
- <type type="source">dhcp</type>
- <type type="source">shell</type>
- <type type="source">uncrypt</type>
- <type type="source">untrusted_app</type>
- <type type="source">gpsd</type>
- <type type="source">isolated_app</type>
- <type type="source">system_app</type>
- <type type="source">wpa</type>
- <type type="source">racoon</type>
- <type type="source">nfc</type>
- <type type="source">hostapd</type>
- <type type="source">platform_app</type>
- <type type="source">mtp</type>
- <type type="source">inputflinger</type>
- <type type="source">logd</type>
- <type type="source">zygote</type>
- <type type="source">rild</type>
- <type type="source">dnsmasq</type>
- <type type="source">healthd</type>
- <type type="source">mediaserver</type>
- <type type="source">bootanim</type>
- <type type="source">ppp</type>
- <type type="source">release_app</type>
- <type type="source">shared_app</type>
- <type type="target">audio_data_file</type>
- <type type="target">sysfs_nfc_power_writable</type>
- <type type="target">ion_device</type>
- <type type="target">debuggerd</type>
- <type type="target">netd</type>
- <type type="target">system_server_tmpfs</type>
- <type type="target">lmkd</type>
- <type type="target">uhid_device</type>
- <type type="target">init_shell</type>
- <type type="target">radio</type>
- <type type="target">zygote_socket</type>
- <type type="target">system_wpa_socket</type>
- <type type="target">sockfs</type>
- <type type="target">selinuxfs</type>
- <type type="target">dumpstate_socket</type>
- <type type="target">untrusted_app_devpts</type>
- <type type="target">shell_prop</type>
- <type type="target">property_socket</type>
- <type type="target">runas</type>
- <type type="target">debuggerd_exec</type>
- <type type="target">mqueue</type>
- <type type="target">shell_data_file</type>
- <type type="target">drmserver_tmpfs</type>
- <type type="target">debuggerd_tmpfs</type>
- <type type="target">init</type>
- <type type="target">netif</type>
- <type type="target">device</type>
- <type type="target">apk_tmp_file</type>
- <type type="target">logd</type>
- <type type="target">servicemanager</type>
- <type type="target">gpsd_tmpfs</type>
- <type type="target">bluetooth_socket</type>
- <type type="target">adb_keys_file</type>
- <type type="target">sdcardd_exec</type>
- <type type="target">system_app_tmpfs</type>
- <type type="target">mediaserver_exec</type>
- <type type="target">ppp_exec</type>
- <type type="target">media_rw_data_file</type>
- <type type="target">clatd_exec</type>
- <type type="target">ueventd</type>
- <type type="target">labeledfs</type>
- <type type="target">asec_image_file</type>
- <type type="target">camera_device</type>
- <type type="target">efs_file</type>
- <type type="target">media_app</type>
- <type type="target">tmpfs</type>
- <type type="target">bluetooth_prop</type>
- <type type="target">logdr_socket</type>
- <type type="target">nfc</type>
- <type type="target">zygote_tmpfs</type>
- <type type="target">cache_backup_file</type>
- <type type="target">drmserver_socket</type>
- <type type="target">logd_exec</type>
- <type type="target">nfc_tmpfs</type>
- <type type="target">zygote</type>
- <type type="target">hostapd</type>
- <type type="target">tee_data_file</type>
- <type type="target">lmkd_socket</type>
- <type type="target">zoneinfo_data_file</type>
- <type type="target">cgroup</type>
- <type type="target">platform_app</type>
- <type type="target">release_app</type>
- <type type="target">qtaguid_device</type>
- <type type="target">surfaceflinger_tmpfs</type>
- <type type="target">shm</type>
- <type type="target">hci_attach_tmpfs</type>
- <type type="target">rild_exec</type>
- <type type="target">kernel</type>
- <type type="target">system_ndebug_socket</type>
- <type type="target">hci_attach_dev</type>
- <type type="target">cpuctl_device</type>
- <type type="target">iio_device</type>
- <type type="target">dhcp</type>
- <type type="target">audio_device</type>
- <type type="target">bootanim_exec</type>
- <type type="target">tee</type>
- <type type="target">wpa_exec</type>
- <type type="target">bluetooth</type>
- <type type="target">sysfs_lowmemorykiller</type>
- <type type="target">mdnsd_exec</type>
- <type type="target">console_device</type>
- <type type="target">rild</type>
- <type type="target">hw_random_device</type>
- <type type="target">radio_prop</type>
- <type type="target">wallpaper_file</type>
- <type type="target">surfaceflinger_exec</type>
- <type type="target">audio_prop</type>
- <type type="target">port</type>
- <type type="target">gps_device</type>
- <type type="target">vcs_device</type>
- <type type="target">alarm_device</type>
- <type type="target">keystore_tmpfs</type>
- <type type="target">logd_socket</type>
- <type type="target">inputflinger_exec</type>
- <type type="target">gpu_device</type>
- <type type="target">unlabeled</type>
- <type type="target">racoon_exec</type>
- <type type="target">init_tmpfs</type>
- <type type="target">binder_device</type>
- <type type="target">servicemanager_tmpfs</type>
- <type type="target">sysfs_wake_lock</type>
- <type type="target">system_app</type>
- <type type="target">vold_exec</type>
- <type type="target">powerctl_prop</type>
- <type type="target">proc</type>
- <type type="target">tee_device</type>
- <type type="target">su_exec</type>
- <type type="target">usermodehelper</type>
- <type type="target">ppp_device</type>
- <type type="target">watchdog_device</type>
- <type type="target">netd_tmpfs</type>
- <type type="target">debugfs</type>
- <type type="target">wpa_socket</type>
- <type type="target">rpmsg_device</type>
- <type type="target">anr_data_file</type>
- <type type="target">lmkd_tmpfs</type>
- <type type="target">mdnsd_tmpfs</type>
- <type type="target">logd_tmpfs</type>
- <type type="target">proc_bluetooth_writable</type>
- <type type="target">dhcp_exec</type>
- <type type="target">gpsd</type>
- <type type="target">log_device</type>
- <type type="target">mediaserver_tmpfs</type>
- <type type="target">security_prop</type>
- <type type="target">vold_tmpfs</type>
- <type type="target">system_server</type>
- <type type="target">runas_exec</type>
- <type type="target">adbd_socket</type>
- <type type="target">radio_data_file</type>
- <type type="target">tee_exec</type>
- <type type="target">backup_data_file</type>
- <type type="target">full_device</type>
- <type type="target">kmsg_device</type>
- <type type="target">ram_device</type>
- <type type="target">inotify</type>
- <type type="target">loop_device</type>
- <type type="target">mtd_device</type>
- <type type="target">random_device</type>
- <type type="target">apk_private_tmp_file</type>
- <type type="target">installd_socket</type>
- <type type="target">camera_data_file</type>
- <type type="target">uncrypt</type>
- <type type="target">asec_public_file</type>
- <type type="target">mediaserver</type>
- <type type="target">graphics_device</type>
- <type type="target">dumpstate_tmpfs</type>
- <type type="target">usb_device</type>
- <type type="target">vold</type>
- <type type="target">drm_data_file</type>
- <type type="target">sdcard_external</type>
- <type type="target">gps_control</type>
- <type type="target">mdns_socket</type>
- <type type="target">logd_debug</type>
- <type type="target">rild_debug_socket</type>
- <type type="target">mtp_tmpfs</type>
- <type type="target">release_app_tmpfs</type>
- <type type="target">root_block_device</type>
- <type type="target">dnsmasq</type>
- <type type="target">sdcard_internal</type>
- <type type="target">dm_device</type>
- <type type="target">download_file</type>
- <type type="target">inputflinger_tmpfs</type>
- <type type="target">netd_socket</type>
- <type type="target">racoon_tmpfs</type>
- <type type="target">sensors_device</type>
- <type type="target">hostapd_exec</type>
- <type type="target">watchdogd</type>
- <type type="target">system_file</type>
- <type type="target">pipefs</type>
- <type type="target">fscklogs</type>
- <type type="target">rild_prop</type>
- <type type="target">hci_attach_exec</type>
- <type type="target">gpsd_exec</type>
- <type type="target">bootanim_tmpfs</type>
- <type type="target">servicemanager_exec</type>
- <type type="target">proc_net</type>
- <type type="target">shell_exec</type>
- <type type="target">null_device</type>
- <type type="target">debug_prop</type>
- <type type="target">serial_device</type>
- <type type="target">bluetooth_tmpfs</type>
- <type type="target">sysfs_writable</type>
- <type type="target">devpts</type>
- <type type="target">wpa_tmpfs</type>
- <type type="target">racoon</type>
- <type type="target">shell</type>
- <type type="target">video_device</type>
- <type type="target">racoon_socket</type>
- <type type="target">usbaccessory_device</type>
- <type type="target">dumpstate</type>
- <type type="target">adbd</type>
- <type type="target">bootanim</type>
- <type type="target">owntty_device</type>
- <type type="target">untrusted_app</type>
- <type type="target">sysfs_bluetooth_writable</type>
- <type type="target">mtp_device</type>
- <type type="target">vold_prop</type>
- <type type="target">ctl_default_prop</type>
- <type type="target">vpn_data_file</type>
- <type type="target">dnsmasq_exec</type>
- <type type="target">socket_device</type>
- <type type="target">keystore_data_file</type>
- <type type="target">installd_tmpfs</type>
- <type type="target">sysfs_devices_system_cpu</type>
- <type type="target">drmserver_exec</type>
- <type type="target">proc_security</type>
- <type type="target">sysfs</type>
- <type type="target">properties_device</type>
- <type type="target">block_device</type>
- <type type="target">gps_data_file</type>
- <type type="target">mtp</type>
- <type type="target">inputflinger</type>
- <type type="target">surfaceflinger</type>
- <type type="target">systemkeys_data_file</type>
- <type type="target">cache_file</type>
- <type type="target">dalvikcache_data_file</type>
- <type type="target">mdnsd</type>
- <type type="target">mdnsd_socket</type>
- <type type="target">lmkd_exec</type>
- <type type="target">netd_exec</type>
- <type type="target">nfc_device</type>
- <type type="target">kmem_device</type>
- <type type="target">ashmem_device</type>
- <type type="target">sdcardd</type>
- <type type="target">hci_attach</type>
- <type type="target">dnsproxyd_socket</type>
- <type type="target">wifi_data_file</type>
- <type type="target">gps_socket</type>
- <type type="target">fuse_device</type>
- <type type="target">dhcp_tmpfs</type>
- <type type="target">mtp_exec</type>
- <type type="target">nfc_data_file</type>
- <type type="target">tee_tmpfs</type>
- <type type="target">default_prop</type>
- <type type="target">input_device</type>
- <type type="target">dumpstate_exec</type>
- <type type="target">drmserver</type>
- <type type="target">logdw_socket</type>
- <type type="target">uncrypt_tmpfs</type>
- <type type="target">rild_tmpfs</type>
- <type type="target">zygote_exec</type>
- <type type="target">keystore</type>
- <type type="target">radio_tmpfs</type>
- <type type="target">clatd</type>
- <type type="target">zero_device</type>
- <type type="target">recovery</type>
- <type type="target">ctl_dumpstate_prop</type>
- <type type="target">adb_device</type>
- <type type="target">ppp</type>
- <type type="target">rild_socket</type>
- <type type="target">ptmx_device</type>
- <type type="target">apk_private_data_file</type>
- <type type="target">tun_device</type>
- <type type="target">uncrypt_exec</type>
- <type type="target">media_data_file</type>
- <type type="target">media_app_tmpfs</type>
- <type type="target">untrusted_app_tmpfs</type>
- <type type="target">ctl_rildaemon_prop</type>
- <type type="target">healthd</type>
- <type type="target">node</type>
- <type type="target">isolated_app_tmpfs</type>
- <type type="target">radio_device</type>
- <type type="target">urandom_device</type>
- <type type="target">tombstone_data_file</type>
- <type type="target">shared_app_tmpfs</type>
- <type type="target">security_file</type>
- <type type="target">system_data_file</type>
- <type type="target">qtaguid_proc</type>
- <type type="target">tty_device</type>
- <type type="target">sdcardd_tmpfs</type>
- <type type="target">isolated_app</type>
- <type type="target">ueventd_tmpfs</type>
- <type type="target">installd_exec</type>
- <type type="target">system_prop</type>
- <type type="target">platform_app_tmpfs</type>
- <type type="target">wpa</type>
- <type type="target">rootfs</type>
- <type type="target">app_data_file</type>
- <type type="target">apk_data_file</type>
- <type type="target">dhcp_data_file</type>
- <type type="target">asec_apk_file</type>
- <type type="target">platform_app_data_file</type>
- <type type="target">keystore_exec</type>
- <type type="target">bluetooth_data_file</type>
- <type type="target">klog_device</type>
- <type type="target">debuggerd_prop</type>
- <type type="target">vold_socket</type>
- <type type="target">bluetooth_efs_file</type>
- <type type="target">installd</type>
- <type type="target">shell_tmpfs</type>
- <type type="target">shared_app</type>
- <obj_class name="fifo_file">
- <permission>relabelto</permission>
- </obj_class>
- <obj_class name="chr_file">
- <permission>relabelto</permission>
- </obj_class>
- <obj_class name="file">
- <permission>relabelto</permission>
- </obj_class>
- <obj_class name="sock_file">
- <permission>relabelto</permission>
- </obj_class>
- <obj_class name="blk_file">
- <permission>relabelto</permission>
- </obj_class>
- <obj_class name="lnk_file">
- <permission>relabelto</permission>
- </obj_class>
- <obj_class name="dir">
- <permission>relabelto</permission>
- </obj_class>
- </avc_rule>
- <avc_rule name="3" type="neverallow">
- <type type="source">kernel</type>
- <type type="source">sdcardd</type>
- <type type="source">init_shell</type>
- <type type="source">adbd</type>
- <type type="source">netd</type>
- <type type="source">tee</type>
- <type type="source">bluetooth</type>
- <type type="source">lmkd</type>
- <type type="source">surfaceflinger</type>
- <type type="source">mdnsd</type>
- <type type="source">radio</type>
- <type type="source">hci_attach</type>
- <type type="source">clatd</type>
- <type type="source">watchdogd</type>
- <type type="source">drmserver</type>
- <type type="source">keystore</type>
- <type type="source">recovery</type>
- <type type="source">runas</type>
- <type type="source">init</type>
- <type type="source">servicemanager</type>
- <type type="source">dhcp</type>
- <type type="source">shell</type>
- <type type="source">uncrypt</type>
- <type type="source">untrusted_app</type>
- <type type="source">ueventd</type>
- <type type="source">gpsd</type>
- <type type="source">isolated_app</type>
- <type type="source">system_app</type>
- <type type="source">media_app</type>
- <type type="source">wpa</type>
- <type type="source">racoon</type>
- <type type="source">nfc</type>
- <type type="source">shared_app</type>
- <type type="source">hostapd</type>
- <type type="source">platform_app</type>
- <type type="source">mtp</type>
- <type type="source">inputflinger</type>
- <type type="source">logd</type>
- <type type="source">zygote</type>
- <type type="source">rild</type>
- <type type="source">dnsmasq</type>
- <type type="source">healthd</type>
- <type type="source">mediaserver</type>
- <type type="source">bootanim</type>
- <type type="source">ppp</type>
- <type type="source">release_app</type>
- <type type="source">installd</type>
- <type type="target">self</type>
- <obj_class name="capability">
- <permission>sys_ptrace</permission>
- </obj_class>
- </avc_rule>
- <avc_rule name="4" type="neverallow">
- <type type="source">sdcardd</type>
- <type type="source">init_shell</type>
- <type type="source">adbd</type>
- <type type="source">debuggerd</type>
- <type type="source">netd</type>
- <type type="source">tee</type>
- <type type="source">bluetooth</type>
- <type type="source">lmkd</type>
- <type type="source">surfaceflinger</type>
- <type type="source">mdnsd</type>
- <type type="source">radio</type>
- <type type="source">hci_attach</type>
- <type type="source">clatd</type>
- <type type="source">drmserver</type>
- <type type="source">keystore</type>
- <type type="source">runas</type>
- <type type="source">servicemanager</type>
- <type type="source">dhcp</type>
- <type type="source">shell</type>
- <type type="source">untrusted_app</type>
- <type type="source">gpsd</type>
- <type type="source">isolated_app</type>
- <type type="source">system_app</type>
- <type type="source">media_app</type>
- <type type="source">system_server</type>
- <type type="source">wpa</type>
- <type type="source">racoon</type>
- <type type="source">dumpstate</type>
- <type type="source">nfc</type>
- <type type="source">shared_app</type>
- <type type="source">hostapd</type>
- <type type="source">platform_app</type>
- <type type="source">mtp</type>
- <type type="source">inputflinger</type>
- <type type="source">logd</type>
- <type type="source">zygote</type>
- <type type="source">rild</type>
- <type type="source">dnsmasq</type>
- <type type="source">mediaserver</type>
- <type type="source">bootanim</type>
- <type type="source">ppp</type>
- <type type="source">release_app</type>
- <type type="source">installd</type>
- <type type="target">self</type>
- <obj_class name="capability">
- <permission>sys_rawio</permission>
- <permission>mknod</permission>
- </obj_class>
- </avc_rule>
- <avc_rule name="5" type="neverallow">
- <type type="source">kernel</type>
- <type type="source">sdcardd</type>
- <type type="source">init_shell</type>
- <type type="source">adbd</type>
- <type type="source">vold</type>
- <type type="source">debuggerd</type>
- <type type="source">netd</type>
- <type type="source">tee</type>
- <type type="source">bluetooth</type>
- <type type="source">lmkd</type>
- <type type="source">surfaceflinger</type>
- <type type="source">mdnsd</type>
- <type type="source">radio</type>
- <type type="source">hci_attach</type>
- <type type="source">clatd</type>
- <type type="source">watchdogd</type>
- <type type="source">drmserver</type>
- <type type="source">keystore</type>
- <type type="source">recovery</type>
- <type type="source">runas</type>
- <type type="source">init</type>
- <type type="source">servicemanager</type>
- <type type="source">dhcp</type>
- <type type="source">shell</type>
- <type type="source">uncrypt</type>
- <type type="source">untrusted_app</type>
- <type type="source">ueventd</type>
- <type type="source">gpsd</type>
- <type type="source">isolated_app</type>
- <type type="source">system_app</type>
- <type type="source">media_app</type>
- <type type="source">system_server</type>
- <type type="source">wpa</type>
- <type type="source">racoon</type>
- <type type="source">dumpstate</type>
- <type type="source">nfc</type>
- <type type="source">shared_app</type>
- <type type="source">hostapd</type>
- <type type="source">platform_app</type>
- <type type="source">mtp</type>
- <type type="source">inputflinger</type>
- <type type="source">logd</type>
- <type type="source">zygote</type>
- <type type="source">rild</type>
- <type type="source">dnsmasq</type>
- <type type="source">healthd</type>
- <type type="source">mediaserver</type>
- <type type="source">bootanim</type>
- <type type="source">ppp</type>
- <type type="source">release_app</type>
- <type type="source">installd</type>
- <type type="target">self</type>
- <obj_class name="capability2">
- <permission>mac_override</permission>
- </obj_class>
- </avc_rule>
- <avc_rule name="6" type="neverallow">
- <type type="source">kernel</type>
- <type type="source">sdcardd</type>
- <type type="source">init_shell</type>
- <type type="source">adbd</type>
- <type type="source">vold</type>
- <type type="source">debuggerd</type>
- <type type="source">netd</type>
- <type type="source">tee</type>
- <type type="source">bluetooth</type>
- <type type="source">lmkd</type>
- <type type="source">surfaceflinger</type>
- <type type="source">mdnsd</type>
- <type type="source">radio</type>
- <type type="source">hci_attach</type>
- <type type="source">clatd</type>
- <type type="source">watchdogd</type>
- <type type="source">drmserver</type>
- <type type="source">keystore</type>
- <type type="source">runas</type>
- <type type="source">init</type>
- <type type="source">servicemanager</type>
- <type type="source">dhcp</type>
- <type type="source">shell</type>
- <type type="source">uncrypt</type>
- <type type="source">untrusted_app</type>
- <type type="source">ueventd</type>
- <type type="source">gpsd</type>
- <type type="source">isolated_app</type>
- <type type="source">system_app</type>
- <type type="source">media_app</type>
- <type type="source">system_server</type>
- <type type="source">wpa</type>
- <type type="source">racoon</type>
- <type type="source">dumpstate</type>
- <type type="source">nfc</type>
- <type type="source">shared_app</type>
- <type type="source">hostapd</type>
- <type type="source">platform_app</type>
- <type type="source">mtp</type>
- <type type="source">inputflinger</type>
- <type type="source">logd</type>
- <type type="source">zygote</type>
- <type type="source">rild</type>
- <type type="source">dnsmasq</type>
- <type type="source">healthd</type>
- <type type="source">mediaserver</type>
- <type type="source">bootanim</type>
- <type type="source">ppp</type>
- <type type="source">release_app</type>
- <type type="source">installd</type>
- <type type="target">self</type>
- <obj_class name="capability2">
- <permission>mac_admin</permission>
- </obj_class>
- </avc_rule>
- <avc_rule name="7" type="neverallow">
- <type type="source">kernel</type>
- <type type="source">sdcardd</type>
- <type type="source">init_shell</type>
- <type type="source">adbd</type>
- <type type="source">vold</type>
- <type type="source">debuggerd</type>
- <type type="source">netd</type>
- <type type="source">tee</type>
- <type type="source">bluetooth</type>
- <type type="source">lmkd</type>
- <type type="source">surfaceflinger</type>
- <type type="source">mdnsd</type>
- <type type="source">radio</type>
- <type type="source">hci_attach</type>
- <type type="source">clatd</type>
- <type type="source">watchdogd</type>
- <type type="source">drmserver</type>
- <type type="source">keystore</type>
- <type type="source">recovery</type>
- <type type="source">runas</type>
- <type type="source">servicemanager</type>
- <type type="source">dhcp</type>
- <type type="source">shell</type>
- <type type="source">uncrypt</type>
- <type type="source">untrusted_app</type>
- <type type="source">ueventd</type>
- <type type="source">gpsd</type>
- <type type="source">isolated_app</type>
- <type type="source">system_app</type>
- <type type="source">media_app</type>
- <type type="source">system_server</type>
- <type type="source">wpa</type>
- <type type="source">racoon</type>
- <type type="source">dumpstate</type>
- <type type="source">nfc</type>
- <type type="source">shared_app</type>
- <type type="source">hostapd</type>
- <type type="source">platform_app</type>
- <type type="source">mtp</type>
- <type type="source">inputflinger</type>
- <type type="source">logd</type>
- <type type="source">zygote</type>
- <type type="source">rild</type>
- <type type="source">dnsmasq</type>
- <type type="source">healthd</type>
- <type type="source">mediaserver</type>
- <type type="source">bootanim</type>
- <type type="source">ppp</type>
- <type type="source">release_app</type>
- <type type="source">installd</type>
- <type type="target">kernel</type>
- <obj_class name="security">
- <permission>load_policy</permission>
- </obj_class>
- </avc_rule>
- <avc_rule name="8" type="neverallow">
- <type type="source">vold</type>
- <type type="source">sdcardd</type>
- <type type="source">init_shell</type>
- <type type="source">adbd</type>
- <type type="source">debuggerd</type>
- <type type="source">netd</type>
- <type type="source">tee</type>
- <type type="source">bluetooth</type>
- <type type="source">lmkd</type>
- <type type="source">surfaceflinger</type>
- <type type="source">mdnsd</type>
- <type type="source">radio</type>
- <type type="source">hci_attach</type>
- <type type="source">clatd</type>
- <type type="source">watchdogd</type>
- <type type="source">drmserver</type>
- <type type="source">keystore</type>
- <type type="source">recovery</type>
- <type type="source">runas</type>
- <type type="source">init</type>
- <type type="source">servicemanager</type>
- <type type="source">dhcp</type>
- <type type="source">shell</type>
- <type type="source">uncrypt</type>
- <type type="source">untrusted_app</type>
- <type type="source">ueventd</type>
- <type type="source">gpsd</type>
- <type type="source">isolated_app</type>
- <type type="source">system_app</type>
- <type type="source">media_app</type>
- <type type="source">system_server</type>
- <type type="source">wpa</type>
- <type type="source">racoon</type>
- <type type="source">dumpstate</type>
- <type type="source">nfc</type>
- <type type="source">shared_app</type>
- <type type="source">hostapd</type>
- <type type="source">platform_app</type>
- <type type="source">mtp</type>
- <type type="source">inputflinger</type>
- <type type="source">logd</type>
- <type type="source">zygote</type>
- <type type="source">rild</type>
- <type type="source">dnsmasq</type>
- <type type="source">healthd</type>
- <type type="source">mediaserver</type>
- <type type="source">bootanim</type>
- <type type="source">ppp</type>
- <type type="source">release_app</type>
- <type type="source">installd</type>
- <type type="target">kernel</type>
- <obj_class name="security">
- <permission>setenforce</permission>
- <permission>setcheckreqprot</permission>
- </obj_class>
- </avc_rule>
- <avc_rule name="9" type="neverallow">
- <type type="source">kernel</type>
- <type type="source">sdcardd</type>
- <type type="source">init_shell</type>
- <type type="source">adbd</type>
- <type type="source">vold</type>
- <type type="source">debuggerd</type>
- <type type="source">netd</type>
- <type type="source">tee</type>
- <type type="source">bluetooth</type>
- <type type="source">lmkd</type>
- <type type="source">surfaceflinger</type>
- <type type="source">mdnsd</type>
- <type type="source">radio</type>
- <type type="source">hci_attach</type>
- <type type="source">clatd</type>
- <type type="source">watchdogd</type>
- <type type="source">drmserver</type>
- <type type="source">keystore</type>
- <type type="source">recovery</type>
- <type type="source">runas</type>
- <type type="source">init</type>
- <type type="source">servicemanager</type>
- <type type="source">dhcp</type>
- <type type="source">shell</type>
- <type type="source">uncrypt</type>
- <type type="source">untrusted_app</type>
- <type type="source">ueventd</type>
- <type type="source">gpsd</type>
- <type type="source">isolated_app</type>
- <type type="source">system_app</type>
- <type type="source">media_app</type>
- <type type="source">system_server</type>
- <type type="source">wpa</type>
- <type type="source">racoon</type>
- <type type="source">dumpstate</type>
- <type type="source">nfc</type>
- <type type="source">shared_app</type>
- <type type="source">hostapd</type>
- <type type="source">platform_app</type>
- <type type="source">mtp</type>
- <type type="source">inputflinger</type>
- <type type="source">logd</type>
- <type type="source">zygote</type>
- <type type="source">rild</type>
- <type type="source">dnsmasq</type>
- <type type="source">healthd</type>
- <type type="source">mediaserver</type>
- <type type="source">bootanim</type>
- <type type="source">ppp</type>
- <type type="source">release_app</type>
- <type type="source">installd</type>
- <type type="target">system_server_tmpfs</type>
- <type type="target">logdr_socket</type>
- <type type="target">lmkd_socket</type>
- <type type="target">system_wpa_socket</type>
- <type type="target">ueventd_tmpfs</type>
- <type type="target">dumpstate_socket</type>
- <type type="target">wpa_tmpfs</type>
- <type type="target">property_socket</type>
- <type type="target">shell_data_file</type>
- <type type="target">debuggerd_tmpfs</type>
- <type type="target">bootanim_tmpfs</type>
- <type type="target">apk_tmp_file</type>
- <type type="target">gpsd_tmpfs</type>
- <type type="target">bluetooth_socket</type>
- <type type="target">adb_keys_file</type>
- <type type="target">system_app_tmpfs</type>
- <type type="target">media_rw_data_file</type>
- <type type="target">shared_app_tmpfs</type>
- <type type="target">backup_data_file</type>
- <type type="target">zygote_socket</type>
- <type type="target">tee_data_file</type>
- <type type="target">cache_backup_file</type>
- <type type="target">drmserver_socket</type>
- <type type="target">system_ndebug_socket</type>
- <type type="target">nfc_tmpfs</type>
- <type type="target">zoneinfo_data_file</type>
- <type type="target">radio_data_file</type>
- <type type="target">surfaceflinger_tmpfs</type>
- <type type="target">apk_private_tmp_file</type>
- <type type="target">hci_attach_tmpfs</type>
- <type type="target">rild_debug_socket</type>
- <type type="target">wallpaper_file</type>
- <type type="target">sdcardd_tmpfs</type>
- <type type="target">keystore_tmpfs</type>
- <type type="target">bluetooth_data_file</type>
- <type type="target">init_tmpfs</type>
- <type type="target">servicemanager_tmpfs</type>
- <type type="target">efs_file</type>
- <type type="target">installd_socket</type>
- <type type="target">inputflinger_tmpfs</type>
- <type type="target">netd_tmpfs</type>
- <type type="target">wpa_socket</type>
- <type type="target">anr_data_file</type>
- <type type="target">lmkd_tmpfs</type>
- <type type="target">mdnsd_tmpfs</type>
- <type type="target">logd_tmpfs</type>
- <type type="target">mediaserver_tmpfs</type>
- <type type="target">vold_tmpfs</type>
- <type type="target">dnsproxyd_socket</type>
- <type type="target">adbd_socket</type>
- <type type="target">camera_data_file</type>
- <type type="target">asec_public_file</type>
- <type type="target">dumpstate_tmpfs</type>
- <type type="target">drm_data_file</type>
- <type type="target">gps_control</type>
- <type type="target">logd_debug</type>
- <type type="target">mtp_tmpfs</type>
- <type type="target">release_app_tmpfs</type>
- <type type="target">download_file</type>
- <type type="target">netd_socket</type>
- <type type="target">racoon_tmpfs</type>
- <type type="target">system_file</type>
- <type type="target">asec_image_file</type>
- <type type="target">tombstone_data_file</type>
- <type type="target">racoon_socket</type>
- <type type="target">logd_socket</type>
- <type type="target">untrusted_app_tmpfs</type>
- <type type="target">vpn_data_file</type>
- <type type="target">keystore_data_file</type>
- <type type="target">bluetooth_tmpfs</type>
- <type type="target">drmserver_tmpfs</type>
- <type type="target">gps_data_file</type>
- <type type="target">systemkeys_data_file</type>
- <type type="target">cache_file</type>
- <type type="target">dalvikcache_data_file</type>
- <type type="target">installd_tmpfs</type>
- <type type="target">mdnsd_socket</type>
- <type type="target">mdns_socket</type>
- <type type="target">wifi_data_file</type>
- <type type="target">gps_socket</type>
- <type type="target">dhcp_tmpfs</type>
- <type type="target">nfc_data_file</type>
- <type type="target">tee_tmpfs</type>
- <type type="target">zygote_tmpfs</type>
- <type type="target">uncrypt_tmpfs</type>
- <type type="target">rild_tmpfs</type>
- <type type="target">isolated_app_tmpfs</type>
- <type type="target">radio_tmpfs</type>
- <type type="target">rild_socket</type>
- <type type="target">media_data_file</type>
- <type type="target">media_app_tmpfs</type>
- <type type="target">audio_data_file</type>
- <type type="target">unlabeled</type>
- <type type="target">security_file</type>
- <type type="target">system_data_file</type>
- <type type="target">bluetooth_efs_file</type>
- <type type="target">platform_app_tmpfs</type>
- <type type="target">app_data_file</type>
- <type type="target">dhcp_data_file</type>
- <type type="target">asec_apk_file</type>
- <type type="target">platform_app_data_file</type>
- <type type="target">logdw_socket</type>
- <type type="target">apk_private_data_file</type>
- <type type="target">vold_socket</type>
- <type type="target">apk_data_file</type>
- <type type="target">shell_tmpfs</type>
- <obj_class name="file">
- <permission>entrypoint</permission>
- </obj_class>
- </avc_rule>
- <avc_rule name="10" type="neverallow">
- <type type="source">vold</type>
- <type type="source">sdcardd</type>
- <type type="source">init_shell</type>
- <type type="source">adbd</type>
- <type type="source">debuggerd</type>
- <type type="source">netd</type>
- <type type="source">tee</type>
- <type type="source">bluetooth</type>
- <type type="source">lmkd</type>
- <type type="source">surfaceflinger</type>
- <type type="source">mdnsd</type>
- <type type="source">radio</type>
- <type type="source">hci_attach</type>
- <type type="source">clatd</type>
- <type type="source">watchdogd</type>
- <type type="source">drmserver</type>
- <type type="source">keystore</type>
- <type type="source">recovery</type>
- <type type="source">runas</type>
- <type type="source">servicemanager</type>
- <type type="source">dhcp</type>
- <type type="source">shell</type>
- <type type="source">uncrypt</type>
- <type type="source">untrusted_app</type>
- <type type="source">gpsd</type>
- <type type="source">isolated_app</type>
- <type type="source">system_app</type>
- <type type="source">media_app</type>
- <type type="source">system_server</type>
- <type type="source">wpa</type>
- <type type="source">racoon</type>
- <type type="source">dumpstate</type>
- <type type="source">nfc</type>
- <type type="source">shared_app</type>
- <type type="source">hostapd</type>
- <type type="source">platform_app</type>
- <type type="source">mtp</type>
- <type type="source">inputflinger</type>
- <type type="source">logd</type>
- <type type="source">zygote</type>
- <type type="source">rild</type>
- <type type="source">dnsmasq</type>
- <type type="source">healthd</type>
- <type type="source">mediaserver</type>
- <type type="source">bootanim</type>
- <type type="source">ppp</type>
- <type type="source">release_app</type>
- <type type="source">installd</type>
- <type type="target">kmem_device</type>
- <obj_class name="chr_file">
- <permission>rename</permission>
- <permission>lock</permission>
- <permission>quotaon</permission>
- <permission>execute_no_trans</permission>
- <permission>open</permission>
- <permission>append</permission>
- <permission>create</permission>
- <permission>write</permission>
- <permission>relabelfrom</permission>
- <permission>getattr</permission>
- <permission>entrypoint</permission>
- <permission>read</permission>
- <permission>mounton</permission>
- <permission>ioctl</permission>
- <permission>link</permission>
- <permission>unlink</permission>
- <permission>swapon</permission>
- <permission>execute</permission>
- <permission>setattr</permission>
- <permission>execmod</permission>
- <permission>relabelto</permission>
- <permission>audit_access</permission>
- </obj_class>
- </avc_rule>
- <avc_rule name="11" type="neverallow">
- <type type="source">kernel</type>
- <type type="source">sdcardd</type>
- <type type="source">init_shell</type>
- <type type="source">adbd</type>
- <type type="source">vold</type>
- <type type="source">debuggerd</type>
- <type type="source">netd</type>
- <type type="source">tee</type>
- <type type="source">bluetooth</type>
- <type type="source">lmkd</type>
- <type type="source">surfaceflinger</type>
- <type type="source">mdnsd</type>
- <type type="source">radio</type>
- <type type="source">hci_attach</type>
- <type type="source">clatd</type>
- <type type="source">watchdogd</type>
- <type type="source">drmserver</type>
- <type type="source">keystore</type>
- <type type="source">recovery</type>
- <type type="source">runas</type>
- <type type="source">init</type>
- <type type="source">servicemanager</type>
- <type type="source">dhcp</type>
- <type type="source">shell</type>
- <type type="source">uncrypt</type>
- <type type="source">untrusted_app</type>
- <type type="source">ueventd</type>
- <type type="source">gpsd</type>
- <type type="source">isolated_app</type>
- <type type="source">system_app</type>
- <type type="source">media_app</type>
- <type type="source">system_server</type>
- <type type="source">wpa</type>
- <type type="source">racoon</type>
- <type type="source">dumpstate</type>
- <type type="source">nfc</type>
- <type type="source">shared_app</type>
- <type type="source">hostapd</type>
- <type type="source">platform_app</type>
- <type type="source">mtp</type>
- <type type="source">inputflinger</type>
- <type type="source">logd</type>
- <type type="source">zygote</type>
- <type type="source">rild</type>
- <type type="source">dnsmasq</type>
- <type type="source">healthd</type>
- <type type="source">mediaserver</type>
- <type type="source">bootanim</type>
- <type type="source">ppp</type>
- <type type="source">release_app</type>
- <type type="source">installd</type>
- <type type="target">kmem_device</type>
- <obj_class name="chr_file">
- <permission>rename</permission>
- <permission>execute</permission>
- <permission>open</permission>
- <permission>read</permission>
- <permission>lock</permission>
- <permission>audit_access</permission>
- <permission>quotaon</permission>
- <permission>getattr</permission>
- <permission>execute_no_trans</permission>
- <permission>mounton</permission>
- <permission>write</permission>
- <permission>relabelfrom</permission>
- <permission>ioctl</permission>
- <permission>link</permission>
- <permission>entrypoint</permission>
- <permission>swapon</permission>
- <permission>execmod</permission>
- <permission>append</permission>
- </obj_class>
- </avc_rule>
- <avc_rule name="12" type="neverallow">
- <type type="source">kernel</type>
- <type type="source">sdcardd</type>
- <type type="source">init_shell</type>
- <type type="source">adbd</type>
- <type type="source">vold</type>
- <type type="source">debuggerd</type>
- <type type="source">netd</type>
- <type type="source">tee</type>
- <type type="source">bluetooth</type>
- <type type="source">lmkd</type>
- <type type="source">surfaceflinger</type>
- <type type="source">mdnsd</type>
- <type type="source">radio</type>
- <type type="source">hci_attach</type>
- <type type="source">clatd</type>
- <type type="source">watchdogd</type>
- <type type="source">drmserver</type>
- <type type="source">keystore</type>
- <type type="source">recovery</type>
- <type type="source">runas</type>
- <type type="source">servicemanager</type>
- <type type="source">dhcp</type>
- <type type="source">shell</type>
- <type type="source">uncrypt</type>
- <type type="source">untrusted_app</type>
- <type type="source">ueventd</type>
- <type type="source">gpsd</type>
- <type type="source">isolated_app</type>
- <type type="source">system_app</type>
- <type type="source">media_app</type>
- <type type="source">system_server</type>
- <type type="source">wpa</type>
- <type type="source">racoon</type>
- <type type="source">dumpstate</type>
- <type type="source">nfc</type>
- <type type="source">shared_app</type>
- <type type="source">hostapd</type>
- <type type="source">platform_app</type>
- <type type="source">mtp</type>
- <type type="source">inputflinger</type>
- <type type="source">logd</type>
- <type type="source">zygote</type>
- <type type="source">rild</type>
- <type type="source">dnsmasq</type>
- <type type="source">healthd</type>
- <type type="source">mediaserver</type>
- <type type="source">bootanim</type>
- <type type="source">ppp</type>
- <type type="source">release_app</type>
- <type type="source">installd</type>
- <type type="target">usermodehelper</type>
- <obj_class name="file">
- <permission>write</permission>
- <permission>append</permission>
- </obj_class>
- </avc_rule>
- <avc_rule name="13" type="neverallow">
- <type type="source">kernel</type>
- <type type="source">sdcardd</type>
- <type type="source">init_shell</type>
- <type type="source">adbd</type>
- <type type="source">vold</type>
- <type type="source">debuggerd</type>
- <type type="source">netd</type>
- <type type="source">tee</type>
- <type type="source">bluetooth</type>
- <type type="source">lmkd</type>
- <type type="source">surfaceflinger</type>
- <type type="source">mdnsd</type>
- <type type="source">radio</type>
- <type type="source">hci_attach</type>
- <type type="source">clatd</type>
- <type type="source">watchdogd</type>
- <type type="source">drmserver</type>
- <type type="source">keystore</type>
- <type type="source">recovery</type>
- <type type="source">runas</type>
- <type type="source">servicemanager</type>
- <type type="source">dhcp</type>
- <type type="source">shell</type>
- <type type="source">uncrypt</type>
- <type type="source">untrusted_app</type>
- <type type="source">ueventd</type>
- <type type="source">gpsd</type>
- <type type="source">isolated_app</type>
- <type type="source">system_app</type>
- <type type="source">media_app</type>
- <type type="source">system_server</type>
- <type type="source">wpa</type>
- <type type="source">racoon</type>
- <type type="source">dumpstate</type>
- <type type="source">nfc</type>
- <type type="source">shared_app</type>
- <type type="source">hostapd</type>
- <type type="source">platform_app</type>
- <type type="source">mtp</type>
- <type type="source">inputflinger</type>
- <type type="source">logd</type>
- <type type="source">zygote</type>
- <type type="source">rild</type>
- <type type="source">dnsmasq</type>
- <type type="source">healthd</type>
- <type type="source">mediaserver</type>
- <type type="source">bootanim</type>
- <type type="source">ppp</type>
- <type type="source">release_app</type>
- <type type="source">installd</type>
- <type type="target">proc_security</type>
- <obj_class name="file">
- <permission>write</permission>
- <permission>append</permission>
- </obj_class>
- </avc_rule>
- <avc_rule name="14" type="neverallow">
- <type type="source">kernel</type>
- <type type="source">sdcardd</type>
- <type type="source">init_shell</type>
- <type type="source">adbd</type>
- <type type="source">vold</type>
- <type type="source">debuggerd</type>
- <type type="source">netd</type>
- <type type="source">tee</type>
- <type type="source">bluetooth</type>
- <type type="source">lmkd</type>
- <type type="source">surfaceflinger</type>
- <type type="source">mdnsd</type>
- <type type="source">radio</type>
- <type type="source">hci_attach</type>
- <type type="source">clatd</type>
- <type type="source">watchdogd</type>
- <type type="source">drmserver</type>
- <type type="source">keystore</type>
- <type type="source">recovery</type>
- <type type="source">runas</type>
- <type type="source">init</type>
- <type type="source">servicemanager</type>
- <type type="source">dhcp</type>
- <type type="source">shell</type>
- <type type="source">uncrypt</type>
- <type type="source">untrusted_app</type>
- <type type="source">ueventd</type>
- <type type="source">gpsd</type>
- <type type="source">isolated_app</type>
- <type type="source">system_app</type>
- <type type="source">media_app</type>
- <type type="source">system_server</type>
- <type type="source">wpa</type>
- <type type="source">racoon</type>
- <type type="source">dumpstate</type>
- <type type="source">nfc</type>
- <type type="source">shared_app</type>
- <type type="source">hostapd</type>
- <type type="source">platform_app</type>
- <type type="source">mtp</type>
- <type type="source">inputflinger</type>
- <type type="source">logd</type>
- <type type="source">zygote</type>
- <type type="source">rild</type>
- <type type="source">dnsmasq</type>
- <type type="source">healthd</type>
- <type type="source">mediaserver</type>
- <type type="source">bootanim</type>
- <type type="source">ppp</type>
- <type type="source">release_app</type>
- <type type="source">installd</type>
- <type type="target">init</type>
- <obj_class name="process">
- <permission>ptrace</permission>
- </obj_class>
- </avc_rule>
- <avc_rule name="15" type="neverallow">
- <type type="source">kernel</type>
- <type type="source">sdcardd</type>
- <type type="source">init_shell</type>
- <type type="source">adbd</type>
- <type type="source">vold</type>
- <type type="source">debuggerd</type>
- <type type="source">netd</type>
- <type type="source">tee</type>
- <type type="source">bluetooth</type>
- <type type="source">lmkd</type>
- <type type="source">surfaceflinger</type>
- <type type="source">mdnsd</type>
- <type type="source">radio</type>
- <type type="source">hci_attach</type>
- <type type="source">clatd</type>
- <type type="source">watchdogd</type>
- <type type="source">drmserver</type>
- <type type="source">keystore</type>
- <type type="source">recovery</type>
- <type type="source">runas</type>
- <type type="source">init</type>
- <type type="source">servicemanager</type>
- <type type="source">dhcp</type>
- <type type="source">shell</type>
- <type type="source">uncrypt</type>
- <type type="source">untrusted_app</type>
- <type type="source">ueventd</type>
- <type type="source">gpsd</type>
- <type type="source">isolated_app</type>
- <type type="source">system_app</type>
- <type type="source">media_app</type>
- <type type="source">system_server</type>
- <type type="source">wpa</type>
- <type type="source">racoon</type>
- <type type="source">dumpstate</type>
- <type type="source">nfc</type>
- <type type="source">shared_app</type>
- <type type="source">hostapd</type>
- <type type="source">platform_app</type>
- <type type="source">mtp</type>
- <type type="source">inputflinger</type>
- <type type="source">logd</type>
- <type type="source">zygote</type>
- <type type="source">rild</type>
- <type type="source">dnsmasq</type>
- <type type="source">healthd</type>
- <type type="source">mediaserver</type>
- <type type="source">bootanim</type>
- <type type="source">ppp</type>
- <type type="source">release_app</type>
- <type type="source">installd</type>
- <type type="target">init</type>
- <obj_class name="binder">
- <permission>call</permission>
- </obj_class>
- </avc_rule>
- <avc_rule name="16" type="neverallow">
- <type type="source">sdcardd</type>
- <type type="source">init_shell</type>
- <type type="source">adbd</type>
- <type type="source">debuggerd</type>
- <type type="source">netd</type>
- <type type="source">tee</type>
- <type type="source">bluetooth</type>
- <type type="source">lmkd</type>
- <type type="source">surfaceflinger</type>
- <type type="source">mdnsd</type>
- <type type="source">radio</type>
- <type type="source">hci_attach</type>
- <type type="source">clatd</type>
- <type type="source">watchdogd</type>
- <type type="source">drmserver</type>
- <type type="source">keystore</type>
- <type type="source">runas</type>
- <type type="source">servicemanager</type>
- <type type="source">dhcp</type>
- <type type="source">shell</type>
- <type type="source">untrusted_app</type>
- <type type="source">ueventd</type>
- <type type="source">gpsd</type>
- <type type="source">isolated_app</type>
- <type type="source">system_app</type>
- <type type="source">media_app</type>
- <type type="source">system_server</type>
- <type type="source">wpa</type>
- <type type="source">racoon</type>
- <type type="source">dumpstate</type>
- <type type="source">nfc</type>
- <type type="source">shared_app</type>
- <type type="source">hostapd</type>
- <type type="source">platform_app</type>
- <type type="source">mtp</type>
- <type type="source">inputflinger</type>
- <type type="source">logd</type>
- <type type="source">zygote</type>
- <type type="source">rild</type>
- <type type="source">dnsmasq</type>
- <type type="source">healthd</type>
- <type type="source">mediaserver</type>
- <type type="source">bootanim</type>
- <type type="source">ppp</type>
- <type type="source">release_app</type>
- <type type="source">installd</type>
- <type type="target">block_device</type>
- <obj_class name="blk_file">
- <permission>read</permission>
- <permission>write</permission>
- <permission>open</permission>
- </obj_class>
- </avc_rule>
- <avc_rule name="17" type="neverallow">
- <type type="source">sdcardd</type>
- <type type="source">init_shell</type>
- <type type="source">adbd</type>
- <type type="source">debuggerd</type>
- <type type="source">netd</type>
- <type type="source">tee</type>
- <type type="source">bluetooth</type>
- <type type="source">lmkd</type>
- <type type="source">surfaceflinger</type>
- <type type="source">mdnsd</type>
- <type type="source">radio</type>
- <type type="source">hci_attach</type>
- <type type="source">clatd</type>
- <type type="source">watchdogd</type>
- <type type="source">drmserver</type>
- <type type="source">keystore</type>
- <type type="source">runas</type>
- <type type="source">servicemanager</type>
- <type type="source">dhcp</type>
- <type type="source">shell</type>
- <type type="source">uncrypt</type>
- <type type="source">untrusted_app</type>
- <type type="source">ueventd</type>
- <type type="source">gpsd</type>
- <type type="source">isolated_app</type>
- <type type="source">system_app</type>
- <type type="source">media_app</type>
- <type type="source">system_server</type>
- <type type="source">wpa</type>
- <type type="source">racoon</type>
- <type type="source">dumpstate</type>
- <type type="source">nfc</type>
- <type type="source">shared_app</type>
- <type type="source">hostapd</type>
- <type type="source">platform_app</type>
- <type type="source">mtp</type>
- <type type="source">inputflinger</type>
- <type type="source">logd</type>
- <type type="source">rild</type>
- <type type="source">dnsmasq</type>
- <type type="source">healthd</type>
- <type type="source">mediaserver</type>
- <type type="source">bootanim</type>
- <type type="source">ppp</type>
- <type type="source">release_app</type>
- <type type="source">installd</type>
- <type type="target">sysfs_nfc_power_writable</type>
- <type type="target">sysfs_lowmemorykiller</type>
- <type type="target">selinuxfs</type>
- <type type="target">untrusted_app_devpts</type>
- <type type="target">tmpfs</type>
- <type type="target">sysfs</type>
- <type type="target">sockfs</type>
- <type type="target">proc_net</type>
- <type type="target">sysfs_wake_lock</type>
- <type type="target">rootfs</type>
- <type type="target">proc</type>
- <type type="target">usermodehelper</type>
- <type type="target">devpts</type>
- <type type="target">debugfs</type>
- <type type="target">qtaguid_proc</type>
- <type type="target">sysfs_bluetooth_writable</type>
- <type type="target">labeledfs</type>
- <type type="target">device</type>
- <type type="target">pipefs</type>
- <type type="target">mqueue</type>
- <type type="target">sysfs_devices_system_cpu</type>
- <type type="target">sysfs_writable</type>
- <type type="target">proc_security</type>
- <type type="target">inotify</type>
- <type type="target">proc_bluetooth_writable</type>
- <type type="target">cgroup</type>
- <type type="target">shm</type>
- <obj_class name="filesystem">
- <permission>relabelfrom</permission>
- <permission>relabelto</permission>
- <permission>mount</permission>
- <permission>remount</permission>
- </obj_class>
- </avc_rule>
- <avc_rule name="18" type="neverallow">
- <type type="source">logd</type>
- <type type="target">ashmem_device</type>
- <type type="target">fscklogs</type>
- <type type="target">cpuctl_device</type>
- <type type="target">iio_device</type>
- <type type="target">audio_device</type>
- <type type="target">root_block_device</type>
- <type type="target">properties_device</type>
- <type type="target">console_device</type>
- <type type="target">dm_device</type>
- <type type="target">hw_random_device</type>
- <type type="target">sensors_device</type>
- <type type="target">input_device</type>
- <type type="target">full_device</type>
- <type type="target">gps_device</type>
- <type type="target">vcs_device</type>
- <type type="target">alarm_device</type>
- <type type="target">video_device</type>
- <type type="target">gpu_device</type>
- <type type="target">adb_device</type>
- <type type="target">ion_device</type>
- <type type="target">ptmx_device</type>
- <type type="target">binder_device</type>
- <type type="target">null_device</type>
- <type type="target">tun_device</type>
- <type type="target">mtp_device</type>
- <type type="target">rpmsg_device</type>
- <type type="target">fuse_device</type>
- <type type="target">watchdog_device</type>
- <type type="target">radio_device</type>
- <type type="target">urandom_device</type>
- <type type="target">usbaccessory_device</type>
- <type type="target">kmsg_device</type>
- <type type="target">serial_device</type>
- <type type="target">camera_device</type>
- <type type="target">log_device</type>
- <type type="target">owntty_device</type>
- <type type="target">device</type>
- <type type="target">zero_device</type>
- <type type="target">qtaguid_device</type>
- <type type="target">tty_device</type>
- <type type="target">socket_device</type>
- <type type="target">block_device</type>
- <type type="target">mtd_device</type>
- <type type="target">random_device</type>
- <type type="target">uhid_device</type>
- <type type="target">tee_device</type>
- <type type="target">loop_device</type>
- <type type="target">klog_device</type>
- <type type="target">ppp_device</type>
- <type type="target">graphics_device</type>
- <type type="target">nfc_device</type>
- <type type="target">ram_device</type>
- <type type="target">kmem_device</type>
- <type type="target">hci_attach_dev</type>
- <type type="target">usb_device</type>
- <obj_class name="blk_file">
- <permission>read</permission>
- <permission>write</permission>
- </obj_class>
- </avc_rule>
- <avc_rule name="19" type="neverallow">
- <type type="source">logd</type>
- <type type="target">kernel</type>
- <type type="target">sdcardd</type>
- <type type="target">init_shell</type>
- <type type="target">adbd</type>
- <type type="target">vold</type>
- <type type="target">debuggerd</type>
- <type type="target">netd</type>
- <type type="target">tee</type>
- <type type="target">bluetooth</type>
- <type type="target">lmkd</type>
- <type type="target">surfaceflinger</type>
- <type type="target">mdnsd</type>
- <type type="target">radio</type>
- <type type="target">hci_attach</type>
- <type type="target">clatd</type>
- <type type="target">watchdogd</type>
- <type type="target">drmserver</type>
- <type type="target">keystore</type>
- <type type="target">recovery</type>
- <type type="target">runas</type>
- <type type="target">init</type>
- <type type="target">servicemanager</type>
- <type type="target">dhcp</type>
- <type type="target">shell</type>
- <type type="target">uncrypt</type>
- <type type="target">untrusted_app</type>
- <type type="target">ueventd</type>
- <type type="target">gpsd</type>
- <type type="target">isolated_app</type>
- <type type="target">system_app</type>
- <type type="target">media_app</type>
- <type type="target">system_server</type>
- <type type="target">wpa</type>
- <type type="target">racoon</type>
- <type type="target">dumpstate</type>
- <type type="target">nfc</type>
- <type type="target">shared_app</type>
- <type type="target">hostapd</type>
- <type type="target">platform_app</type>
- <type type="target">mtp</type>
- <type type="target">inputflinger</type>
- <type type="target">logd</type>
- <type type="target">zygote</type>
- <type type="target">rild</type>
- <type type="target">dnsmasq</type>
- <type type="target">healthd</type>
- <type type="target">mediaserver</type>
- <type type="target">bootanim</type>
- <type type="target">ppp</type>
- <type type="target">release_app</type>
- <type type="target">installd</type>
- <obj_class name="process">
- <permission>ptrace</permission>
- </obj_class>
- </avc_rule>
- <avc_rule name="20" type="neverallow">
- <type type="source">logd</type>
- <type type="target">system_file</type>
- <obj_class name="fifo_file">
- <permission>write</permission>
- </obj_class>
- <obj_class name="chr_file">
- <permission>write</permission>
- </obj_class>
- <obj_class name="file">
- <permission>write</permission>
- </obj_class>
- <obj_class name="sock_file">
- <permission>write</permission>
- </obj_class>
- <obj_class name="blk_file">
- <permission>write</permission>
- </obj_class>
- <obj_class name="lnk_file">
- <permission>write</permission>
- </obj_class>
- <obj_class name="dir">
- <permission>write</permission>
- </obj_class>
- </avc_rule>
- <avc_rule name="21" type="neverallow">
- <type type="source">logd</type>
- <type type="target">app_data_file</type>
- <type type="target">system_data_file</type>
- <obj_class name="fifo_file">
- <permission>write</permission>
- </obj_class>
- <obj_class name="chr_file">
- <permission>write</permission>
- </obj_class>
- <obj_class name="file">
- <permission>write</permission>
- </obj_class>
- <obj_class name="sock_file">
- <permission>write</permission>
- </obj_class>
- <obj_class name="blk_file">
- <permission>write</permission>
- </obj_class>
- <obj_class name="lnk_file">
- <permission>write</permission>
- </obj_class>
- <obj_class name="dir">
- <permission>write</permission>
- </obj_class>
- </avc_rule>
- <avc_rule name="22" type="neverallow">
- <type type="source">netd</type>
- <type type="target">ashmem_device</type>
- <type type="target">fscklogs</type>
- <type type="target">cpuctl_device</type>
- <type type="target">iio_device</type>
- <type type="target">audio_device</type>
- <type type="target">root_block_device</type>
- <type type="target">properties_device</type>
- <type type="target">console_device</type>
- <type type="target">dm_device</type>
- <type type="target">hw_random_device</type>
- <type type="target">sensors_device</type>
- <type type="target">input_device</type>
- <type type="target">full_device</type>
- <type type="target">gps_device</type>
- <type type="target">vcs_device</type>
- <type type="target">alarm_device</type>
- <type type="target">video_device</type>
- <type type="target">gpu_device</type>
- <type type="target">adb_device</type>
- <type type="target">ion_device</type>
- <type type="target">ptmx_device</type>
- <type type="target">binder_device</type>
- <type type="target">null_device</type>
- <type type="target">tun_device</type>
- <type type="target">mtp_device</type>
- <type type="target">rpmsg_device</type>
- <type type="target">fuse_device</type>
- <type type="target">watchdog_device</type>
- <type type="target">radio_device</type>
- <type type="target">urandom_device</type>
- <type type="target">usbaccessory_device</type>
- <type type="target">kmsg_device</type>
- <type type="target">serial_device</type>
- <type type="target">camera_device</type>
- <type type="target">log_device</type>
- <type type="target">owntty_device</type>
- <type type="target">device</type>
- <type type="target">zero_device</type>
- <type type="target">qtaguid_device</type>
- <type type="target">tty_device</type>
- <type type="target">socket_device</type>
- <type type="target">block_device</type>
- <type type="target">mtd_device</type>
- <type type="target">random_device</type>
- <type type="target">uhid_device</type>
- <type type="target">tee_device</type>
- <type type="target">loop_device</type>
- <type type="target">klog_device</type>
- <type type="target">ppp_device</type>
- <type type="target">graphics_device</type>
- <type type="target">nfc_device</type>
- <type type="target">ram_device</type>
- <type type="target">kmem_device</type>
- <type type="target">hci_attach_dev</type>
- <type type="target">usb_device</type>
- <obj_class name="blk_file">
- <permission>read</permission>
- <permission>write</permission>
- </obj_class>
- </avc_rule>
- <avc_rule name="23" type="neverallow">
- <type type="source">netd</type>
- <type type="target">kernel</type>
- <obj_class name="security">
- <permission>setenforce</permission>
- <permission>setbool</permission>
- </obj_class>
- </avc_rule>
- <avc_rule name="24" type="neverallow">
- <type type="source">netd</type>
- <type type="target">kernel</type>
- <obj_class name="security">
- <permission>load_policy</permission>
- </obj_class>
- </avc_rule>
- <avc_rule name="25" type="neverallow">
- <type type="source">netd</type>
- <type type="target">kernel</type>
- <type type="target">sdcardd</type>
- <type type="target">init_shell</type>
- <type type="target">adbd</type>
- <type type="target">vold</type>
- <type type="target">debuggerd</type>
- <type type="target">netd</type>
- <type type="target">tee</type>
- <type type="target">bluetooth</type>
- <type type="target">lmkd</type>
- <type type="target">surfaceflinger</type>
- <type type="target">mdnsd</type>
- <type type="target">radio</type>
- <type type="target">hci_attach</type>
- <type type="target">clatd</type>
- <type type="target">watchdogd</type>
- <type type="target">drmserver</type>
- <type type="target">keystore</type>
- <type type="target">recovery</type>
- <type type="target">runas</type>
- <type type="target">init</type>
- <type type="target">servicemanager</type>
- <type type="target">dhcp</type>
- <type type="target">shell</type>
- <type type="target">uncrypt</type>
- <type type="target">untrusted_app</type>
- <type type="target">ueventd</type>
- <type type="target">gpsd</type>
- <type type="target">isolated_app</type>
- <type type="target">system_app</type>
- <type type="target">media_app</type>
- <type type="target">system_server</type>
- <type type="target">wpa</type>
- <type type="target">racoon</type>
- <type type="target">dumpstate</type>
- <type type="target">nfc</type>
- <type type="target">shared_app</type>
- <type type="target">hostapd</type>
- <type type="target">platform_app</type>
- <type type="target">mtp</type>
- <type type="target">inputflinger</type>
- <type type="target">logd</type>
- <type type="target">zygote</type>
- <type type="target">rild</type>
- <type type="target">dnsmasq</type>
- <type type="target">healthd</type>
- <type type="target">mediaserver</type>
- <type type="target">bootanim</type>
- <type type="target">ppp</type>
- <type type="target">release_app</type>
- <type type="target">installd</type>
- <obj_class name="process">
- <permission>ptrace</permission>
- </obj_class>
- </avc_rule>
- <avc_rule name="26" type="neverallow">
- <type type="source">netd</type>
- <type type="target">system_file</type>
- <obj_class name="fifo_file">
- <permission>write</permission>
- </obj_class>
- <obj_class name="chr_file">
- <permission>write</permission>
- </obj_class>
- <obj_class name="file">
- <permission>write</permission>
- </obj_class>
- <obj_class name="sock_file">
- <permission>write</permission>
- </obj_class>
- <obj_class name="blk_file">
- <permission>write</permission>
- </obj_class>
- <obj_class name="lnk_file">
- <permission>write</permission>
- </obj_class>
- <obj_class name="dir">
- <permission>write</permission>
- </obj_class>
- </avc_rule>
- <avc_rule name="27" type="neverallow">
- <type type="source">netd</type>
- <type type="target">app_data_file</type>
- <type type="target">system_data_file</type>
- <obj_class name="fifo_file">
- <permission>write</permission>
- </obj_class>
- <obj_class name="chr_file">
- <permission>write</permission>
- </obj_class>
- <obj_class name="file">
- <permission>write</permission>
- </obj_class>
- <obj_class name="sock_file">
- <permission>write</permission>
- </obj_class>
- <obj_class name="blk_file">
- <permission>write</permission>
- </obj_class>
- <obj_class name="lnk_file">
- <permission>write</permission>
- </obj_class>
- <obj_class name="dir">
- <permission>write</permission>
- </obj_class>
- </avc_rule>
-</SELinux_AVC_Rules>
diff --git a/tests/tests/security/jni/android_security_cts_NativeCodeTest.cpp b/tests/tests/security/jni/android_security_cts_NativeCodeTest.cpp
index dde06a2..faa6eea 100644
--- a/tests/tests/security/jni/android_security_cts_NativeCodeTest.cpp
+++ b/tests/tests/security/jni/android_security_cts_NativeCodeTest.cpp
@@ -30,6 +30,7 @@
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/stat.h>
+#include <sys/utsname.h>
#include <fcntl.h>
#include <cutils/log.h>
#include <linux/perf_event.h>
@@ -102,6 +103,17 @@
struct iovec iov;
struct sock_diag_req* sock_diag_data;
+ int major, minor;
+ struct utsname uts;
+ if (uname(&uts) != -1 &&
+ sscanf(uts.release, "%d.%d", &major, &minor) == 2 &&
+ ((major > 3) || ((major == 3) && (minor > 8)))) {
+ // Kernels above 3.8 are patched against CVE-2013-1763
+ // This test generates false positives if run on > 3.8.
+ // b/17253473
+ return PASSED;
+ }
+
fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_SOCK_DIAG);
if (fd == -1) {
switch (errno) {
diff --git a/tests/tests/security/src/android/security/cts/SqliteJournalLeakTest.java b/tests/tests/security/src/android/security/cts/SqliteJournalLeakTest.java
deleted file mode 100644
index 109aa21..0000000
--- a/tests/tests/security/src/android/security/cts/SqliteJournalLeakTest.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright (C) 2012 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.security.cts;
-
-import android.content.Intent;
-import android.net.Uri;
-import android.os.Environment;
-import android.test.AndroidTestCase;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.FileReader;
-import java.io.InputStreamReader;
-import java.io.IOException;
-
-
-public class SqliteJournalLeakTest extends AndroidTestCase {
-
- private static final int REPEAT = 5;
-
- private static final String[] DATABASES = {
- "/com.android.bluetooth/databases/btopp.db",
- "/com.android.browser/app_appcache/ApplicationCache.db",
- "/com.android.browser/app_databases/Databases.db",
- "/com.android.browser/app_geolocation/CachedGeoposition.db",
- "/com.android.browser/app_geolocation/GeolocationPermissions.db",
- "/com.android.browser/app_icons/WebpageIcons.db",
- "/com.android.browser/databases/browser.db",
- "/com.android.browser/databases/launcher.db",
- "/com.android.browser/databases/webview.db",
- "/com.android.browser/databases/webviewCache.db",
- "/com.android.email/databases/EmailProvider.db",
- "/com.android.email/databases/EmailProviderBody.db",
- "/com.android.email/databases/webview.db",
- "/com.android.email/databases/webviewCache.db",
- "/com.android.providers.calendar/databases/calendar.db",
- "/com.android.providers.contacts/databases/contacts2.db",
- "/com.android.providers.downloads/databases/downloads.db",
- "/com.android.providers.drm/databases/drm.db",
- "/com.android.providers.media/databases/internal.db",
- "/com.android.providers.settings/databases/settings.db",
- "/com.android.providers.tasks/databases/tasks.db",
- "/com.android.providers.telephony/optable.db",
- "/com.android.providers.telephony/databases/mmssms.db",
- "/com.android.providers.telephony/databases/nwk_info.db",
- "/com.android.providers.telephony/databases/telephony.db",
- "/com.android.providers.telephony/databases/tether_dun.db",
- "/com.android.providers.userdictionary/databases/user_dict.db",
- "/com.android.settings/databases/webview.db",
- "/com.android.settings/databases/webviewCache.db",
- "/com.android.vending/databases/billing4.db",
- "/com.android.vending/databases/market_assets.db",
- "/com.android.vending/databases/suggestions.db",
- "/com.android.vending/databases/webview.db",
- "/com.android.vending/databases/webviewCache.db"
- };
-
- /**
- * This method triggers activities that should cause database writes.
- * The goal of this is to try to make potentially short-lived journal
- * files show up.
- */
- private void doActivity() {
- Intent webIntent = new Intent(Intent.ACTION_VIEW);
- webIntent.setData(Uri.parse("http:///localhost"));
- webIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- getContext().startActivity(webIntent);
- Intent dictIntent = new Intent("android.settings.USER_DICTIONARY_SETTINGS");
- dictIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- getContext().startActivity(dictIntent);
- }
-
- private void checkDatabases(String suffix) {
- String msg = " is world readable. Please set its permissions to 600"
- + " by setting -DSQLITE_DEFAULT_FILE_PERMISSIONS=0600 in external/sqlite/dist/"
- + "Android.mk; see CVE-2011-3901.";
- String base = Environment.getDataDirectory().getAbsolutePath();
- for(int i=REPEAT; i > 0; i--) {
- doActivity();
- for (String name : DATABASES) {
- name = base + "/data" + name + suffix;
- File f = new File(name);
- assertFalse(name + msg, f.canRead());
- }
- }
- }
-
- public void testJournal() {
- checkDatabases("-journal");
- }
-
- public void testWal() {
- checkDatabases("-wal");
- }
-
- public void testShm() {
- checkDatabases("-shm");
- }
-}
diff --git a/tests/tests/speech/Android.mk b/tests/tests/speech/Android.mk
index 75f7e4c..6bec012 100755
--- a/tests/tests/speech/Android.mk
+++ b/tests/tests/speech/Android.mk
@@ -29,6 +29,4 @@
LOCAL_SDK_VERSION := current
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
-
include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/speech/AndroidManifest.xml b/tests/tests/speech/AndroidManifest.xml
index 788f7cc..2e7f0b6 100755
--- a/tests/tests/speech/AndroidManifest.xml
+++ b/tests/tests/speech/AndroidManifest.xml
@@ -21,12 +21,20 @@
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<application>
<uses-library android:name="android.test.runner" />
+
+ <service android:name="android.speech.tts.cts.StubTextToSpeechService">
+ <intent-filter>
+ <action android:name="android.intent.action.TTS_SERVICE" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </service>
+
</application>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
- android:targetPackage="com.android.cts.stub"
+ android:targetPackage="com.android.cts.speech"
android:label="CTS tests of android.speech">
<meta-data android:name="listener"
android:value="com.android.cts.runner.CtsTestRunListener" />
diff --git a/tests/src/android/speech/tts/cts/StubTextToSpeechService.java b/tests/tests/speech/src/android/speech/tts/cts/StubTextToSpeechService.java
similarity index 100%
rename from tests/src/android/speech/tts/cts/StubTextToSpeechService.java
rename to tests/tests/speech/src/android/speech/tts/cts/StubTextToSpeechService.java
diff --git a/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechWrapper.java b/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechWrapper.java
index cba242f..f0d55bf 100644
--- a/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechWrapper.java
+++ b/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechWrapper.java
@@ -34,7 +34,7 @@
public class TextToSpeechWrapper {
private static final String LOG_TAG = "TextToSpeechServiceTest";
- public static final String MOCK_TTS_ENGINE = "com.android.cts.stub";
+ public static final String MOCK_TTS_ENGINE = "com.android.cts.speech";
private final Context mContext;
private TextToSpeech mTts;
diff --git a/tests/tests/telecomm/AndroidManifest.xml b/tests/tests/telecomm/AndroidManifest.xml
deleted file mode 100644
index 97906c6..0000000
--- a/tests/tests/telecomm/AndroidManifest.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.cts.telecom">
-
- <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
- <!-- We won't be granted this, but we should at least ask for it (to make sure we don't get it). -->
- <uses-permission android:name="com.android.server.telecom.permission.REGISTER_PROVIDER_OR_SUBSCRIPTION" />
- <application>
- <uses-library android:name="android.test.runner" />
- </application>
-
- <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
- android:targetPackage="com.android.cts.stub"
- android:label="CTS tests of android.telecom">
- <meta-data android:name="listener"
- android:value="com.android.cts.runner.CtsTestRunListener" />
- </instrumentation>
-
-</manifest>
-
diff --git a/tests/tests/telecomm/src/android/telecom/cts/ConnectionTest.java b/tests/tests/telecomm/src/android/telecom/cts/ConnectionTest.java
deleted file mode 100644
index 08bc1de..0000000
--- a/tests/tests/telecomm/src/android/telecom/cts/ConnectionTest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (C) 2014 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.telecom.cts;
-
-import android.telecom.Connection;
-import android.telephony.DisconnectCause;
-import android.test.AndroidTestCase;
-
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-
-public class ConnectionTest extends AndroidTestCase {
- public void testStateCallbacks() {
- final Semaphore lock = new Semaphore(0);
- Connection connection = createConnection(lock);
-
- waitForStateChange(lock);
- assertEquals(Connection.STATE_NEW, connection.getState());
-
- connection.setInitializing();
- waitForStateChange(lock);
- assertEquals(Connection.STATE_INITIALIZING, connection.getState());
-
- connection.setInitialized();
- waitForStateChange(lock);
- assertEquals(Connection.STATE_NEW, connection.getState());
-
- connection.setRinging();
- waitForStateChange(lock);
- assertEquals(Connection.STATE_RINGING, connection.getState());
-
- connection.setDialing();
- waitForStateChange(lock);
- assertEquals(Connection.STATE_DIALING, connection.getState());
-
- connection.setActive();
- waitForStateChange(lock);
- assertEquals(Connection.STATE_ACTIVE, connection.getState());
-
- connection.setOnHold();
- waitForStateChange(lock);
- assertEquals(Connection.STATE_HOLDING, connection.getState());
-
- connection.setDisconnected(DisconnectCause.LOCAL, "Test call");
- waitForStateChange(lock);
- assertEquals(Connection.STATE_DISCONNECTED, connection.getState());
-
- connection.setRinging();
- waitForStateChange(lock);
- assertEquals("Connection should not move out of STATE_DISCONNECTED.",
- Connection.STATE_DISCONNECTED, connection.getState());
- }
-
- public void testFailedState() {
- Connection connection =
- Connection.createFailedConnection(DisconnectCause.LOCAL, "Test call");
- assertEquals(Connection.STATE_DISCONNECTED, connection.getState());
-
- connection.setRinging();
- assertEquals("Connection should not move out of STATE_DISCONNECTED.",
- Connection.STATE_DISCONNECTED, connection.getState());
- }
-
- public void testCanceledState() {
- Connection connection = Connection.createCanceledConnection();
- assertEquals(Connection.STATE_DISCONNECTED, connection.getState());
-
- connection.setDialing();
- assertEquals("Connection should not move out of STATE_DISCONNECTED",
- Connection.STATE_DISCONNECTED, connection.getState());
- }
-
- private static Connection createConnection(final Semaphore lock) {
- Connection.Listener listener = new Connection.Listener() {
- @Override
- public void onStateChanged(Connection c, int state) {
- lock.release();
- }
- };
-
- Connection connection = new BasicConnection();
- connection.addConnectionListener(listener);
- return connection;
- }
-
- private static void waitForStateChange(Semaphore lock) {
- try {
- lock.tryAcquire(1000, TimeUnit.MILLISECONDS);
- } catch (InterruptedException e) {
- fail("State transition timed out");
- }
- }
-
- private static final class BasicConnection extends Connection {
- }
-}
diff --git a/tests/tests/telecomm/src/android/telecom/cts/TelecomManagerTest.java b/tests/tests/telecomm/src/android/telecom/cts/TelecomManagerTest.java
deleted file mode 100644
index cdd2177..0000000
--- a/tests/tests/telecomm/src/android/telecom/cts/TelecomManagerTest.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2014 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.telecom.cts;
-
-import android.content.ComponentName;
-import android.net.Uri;
-import android.telecom.PhoneAccount;
-import android.telecom.PhoneAccountHandle;
-import android.telecom.PhoneCapabilities;
-import android.telecom.TelecomManager;
-import android.test.AndroidTestCase;
-
-import java.util.List;
-
-public class TelecomManagerTest extends AndroidTestCase {
- public void testRegisterAccountsBlocked() {
- PhoneAccount phoneAccount = new PhoneAccount.Builder(
- new PhoneAccountHandle(
- new ComponentName(getContext(), TelecomManagerTest.class),
- "testRegisterAccountsBlocked"),
- "Mock PhoneAccount")
- .setAddress(Uri.parse("tel:6502637643"))
- .setSubscriptionAddress(Uri.parse("tel:650-263-7643"))
- .setCapabilities(PhoneCapabilities.ALL)
- .setIconResId(0)
- .setShortDescription("PhoneAccount used in TelecomManagerTest")
- .build();
-
- TelecomManager tm = TelecomManager.from(getContext());
- List<PhoneAccountHandle> handles = tm.getEnabledPhoneAccounts();
-
- try {
- tm.registerPhoneAccount(phoneAccount);
- fail("This should have failed (CTS can't get the permission)");
- } catch (SecurityException e) {
- assertEquals(handles, tm.getEnabledPhoneAccounts());
- }
- }
-}
diff --git a/tests/tests/telephony/Android.mk b/tests/tests/telephony/Android.mk
index 676138d..e15d0d5 100644
--- a/tests/tests/telephony/Android.mk
+++ b/tests/tests/telephony/Android.mk
@@ -30,8 +30,6 @@
LOCAL_PACKAGE_NAME := CtsTelephonyTestCases
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
-
# uncomment when b/13250611 is fixed
#LOCAL_SDK_VERSION := current
LOCAL_JAVA_LIBRARIES += android.test.runner
diff --git a/tests/tests/telephony/AndroidManifest.xml b/tests/tests/telephony/AndroidManifest.xml
index 36d1e5e..cd3864e 100644
--- a/tests/tests/telephony/AndroidManifest.xml
+++ b/tests/tests/telephony/AndroidManifest.xml
@@ -18,12 +18,20 @@
package="com.android.cts.telephony">
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+ <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
+ <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
+ <uses-permission android:name="android.permission.READ_CONTACTS" />
+ <uses-permission android:name="android.permission.WRITE_CONTACTS" />
+ <uses-permission android:name="android.permission.READ_PHONE_STATE" />
+ <uses-permission android:name="android.permission.SEND_SMS" />
+ <uses-permission android:name="android.permission.RECEIVE_SMS" />
+
<application>
<uses-library android:name="android.test.runner" />
</application>
<instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
- android:targetPackage="com.android.cts.stub"
+ android:targetPackage="com.android.cts.telephony"
android:label="CTS tests of android.telephony">
<meta-data android:name="listener"
android:value="com.android.cts.runner.CtsTestRunListener" />
diff --git a/tests/tests/telephony/src/android/telephony/cts/CellLocationTest.java b/tests/tests/telephony/src/android/telephony/cts/CellLocationTest.java
index 61b97b2..e58d26f 100644
--- a/tests/tests/telephony/src/android/telephony/cts/CellLocationTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/CellLocationTest.java
@@ -18,7 +18,6 @@
import android.content.Context;
import android.os.Looper;
-import android.os.cts.TestThread;
import android.telephony.CellLocation;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
diff --git a/tests/tests/telephony/src/android/telephony/cts/PhoneStateListenerTest.java b/tests/tests/telephony/src/android/telephony/cts/PhoneStateListenerTest.java
index bfc4c85..b084245 100644
--- a/tests/tests/telephony/src/android/telephony/cts/PhoneStateListenerTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/PhoneStateListenerTest.java
@@ -17,7 +17,6 @@
import android.content.Context;
import android.os.Looper;
-import android.os.cts.TestThread;
import android.telephony.CellLocation;
import android.telephony.PhoneStateListener;
import android.telephony.ServiceState;
diff --git a/tests/tests/telephony/src/android/telephony/cts/TelephonyManagerTest.java b/tests/tests/telephony/src/android/telephony/cts/TelephonyManagerTest.java
index 9986e67..803baec 100644
--- a/tests/tests/telephony/src/android/telephony/cts/TelephonyManagerTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/TelephonyManagerTest.java
@@ -24,7 +24,6 @@
import android.net.wifi.WifiManager;
import android.os.Build;
import android.os.Looper;
-import android.os.cts.TestThread;
import android.telephony.CellLocation;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
diff --git a/tests/tests/telephony/src/android/telephony/cts/TestThread.java b/tests/tests/telephony/src/android/telephony/cts/TestThread.java
new file mode 100644
index 0000000..9bf40de
--- /dev/null
+++ b/tests/tests/telephony/src/android/telephony/cts/TestThread.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2009 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.telephony.cts;
+
+/**
+ * Thread class for executing a Runnable containing assertions in a separate thread.
+ * Uncaught exceptions in the Runnable are rethrown in the context of the the thread
+ * calling the <code>runTest()</code> method.
+ */
+public final class TestThread extends Thread {
+ private Throwable mThrowable;
+ private Runnable mTarget;
+
+ public TestThread(Runnable target) {
+ mTarget = target;
+ }
+
+ @Override
+ public final void run() {
+ try {
+ mTarget.run();
+ } catch (Throwable t) {
+ mThrowable = t;
+ }
+ }
+
+ /**
+ * Run the target Runnable object and wait until the test finish or throw
+ * out Exception if test fail.
+ *
+ * @param runTime
+ * @throws Throwable
+ */
+ public void runTest(long runTime) throws Throwable {
+ start();
+ joinAndCheck(runTime);
+ }
+
+ /**
+ * Get the Throwable object which is thrown when test running
+ * @return The Throwable object
+ */
+ public Throwable getThrowable() {
+ return mThrowable;
+ }
+
+ /**
+ * Set the Throwable object which is thrown when test running
+ * @param t The Throwable object
+ */
+ public void setThrowable(Throwable t) {
+ mThrowable = t;
+ }
+
+ /**
+ * Wait for the test thread to complete and throw the stored exception if there is one.
+ *
+ * @param runTime The time to wait for the test thread to complete.
+ * @throws Throwable
+ */
+ public void joinAndCheck(long runTime) throws Throwable {
+ this.join(runTime);
+ if (this.isAlive()) {
+ this.interrupt();
+ this.join(runTime);
+ throw new Exception("Thread did not finish within allotted time.");
+ }
+ checkException();
+ }
+
+ /**
+ * Check whether there is an exception when running Runnable object.
+ * @throws Throwable
+ */
+ public void checkException() throws Throwable {
+ if (mThrowable != null) {
+ throw mThrowable;
+ }
+ }
+}
diff --git a/tests/tests/text/Android.mk b/tests/tests/text/Android.mk
index ae14124..df2d324 100644
--- a/tests/tests/text/Android.mk
+++ b/tests/tests/text/Android.mk
@@ -23,14 +23,12 @@
LOCAL_JAVA_LIBRARIES := android.test.runner
-LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
+LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := CtsTextTestCases
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
-
# uncomment when dalvik.annotation.Test* are removed or part of SDK
#LOCAL_SDK_VERSION := current
diff --git a/tests/tests/text/AndroidManifest.xml b/tests/tests/text/AndroidManifest.xml
index 63f6d59..f247f82 100644
--- a/tests/tests/text/AndroidManifest.xml
+++ b/tests/tests/text/AndroidManifest.xml
@@ -19,12 +19,63 @@
package="com.android.cts.text">
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
- <application>
+ <uses-permission android:name="android.permission.WRITE_SETTINGS" />
+ <application android:maxRecents="1">
<uses-library android:name="android.test.runner" />
+
+ <activity android:name="android.text.cts.EmojiCtsActivity"
+ android:label="AvailableIntentsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.text.method.cts.KeyListenerCtsActivity"
+ android:label="KeyListenerCtsActivity"/>
+
+ <activity android:name="android.text.method.cts.CtsActivity"
+ android:label="CtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.text.style.cts.URLSpanCtsActivity"
+ android:label="URLSpanCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.text.style.cts.MockURLSpanTestActivity"
+ android:label="MockURLSpanTestActivity"
+ android:launchMode="singleTask"
+ android:alwaysRetainTaskState="true"
+ android:configChanges="orientation|keyboardHidden">
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ <data android:scheme="ctstest" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.text.method.cts.CtsActivity"
+ android:label="CtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
</application>
<instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
- android:targetPackage="com.android.cts.stub"
+ android:targetPackage="com.android.cts.text"
android:label="CTS tests of android.text">
<meta-data android:name="listener"
android:value="com.android.cts.runner.CtsTestRunListener" />
diff --git a/tests/tests/text/res/drawable/pass.jpg b/tests/tests/text/res/drawable/pass.jpg
new file mode 100644
index 0000000..2f4b083
--- /dev/null
+++ b/tests/tests/text/res/drawable/pass.jpg
Binary files differ
diff --git a/tests/tests/text/res/drawable/scenery.jpg b/tests/tests/text/res/drawable/scenery.jpg
new file mode 100644
index 0000000..7a6145b
--- /dev/null
+++ b/tests/tests/text/res/drawable/scenery.jpg
Binary files differ
diff --git a/tests/src/android/widget/cts/StubActivity.java b/tests/tests/text/res/layout/keylistener_layout.xml
similarity index 70%
copy from tests/src/android/widget/cts/StubActivity.java
copy to tests/tests/text/res/layout/keylistener_layout.xml
index fe4002c..96a419d 100644
--- a/tests/src/android/widget/cts/StubActivity.java
+++ b/tests/tests/text/res/layout/keylistener_layout.xml
@@ -1,4 +1,5 @@
-/*
+<?xml version="1.0" encoding="utf-8"?>
+<!--
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -12,15 +13,10 @@
* 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.
- */
+ -->
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/keylistener_textview"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+/>
-package android.widget.cts;
-
-import android.app.Activity;
-
-/**
- * Stub activity for helping test. It's an empty activity.
- */
-public class StubActivity extends Activity {
-
-}
diff --git a/tests/tests/text/res/layout/urlspan_layout.xml b/tests/tests/text/res/layout/urlspan_layout.xml
new file mode 100644
index 0000000..2ca95ac
--- /dev/null
+++ b/tests/tests/text/res/layout/urlspan_layout.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 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.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <TextView android:id="@+id/url"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingLeft="4dip"
+ android:focusable="true"
+ android:focusableInTouchMode="true"
+ android:text="@string/text_view_hello"/>
+
+</LinearLayout>
diff --git a/tests/src/android/widget/cts/ListViewStubActivity.java b/tests/tests/text/res/layout/webview_layout.xml
similarity index 60%
copy from tests/src/android/widget/cts/ListViewStubActivity.java
copy to tests/tests/text/res/layout/webview_layout.xml
index 77c3e5e..7a0ed0d 100644
--- a/tests/src/android/widget/cts/ListViewStubActivity.java
+++ b/tests/tests/text/res/layout/webview_layout.xml
@@ -1,4 +1,5 @@
-/*
+<?xml version="1.0" encoding="utf-8"?>
+<!--
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -12,19 +13,13 @@
* 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.
- */
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
-package android.widget.cts;
-
-import com.android.cts.stub.R;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class ListViewStubActivity extends Activity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.listview_layout);
- }
-}
+ <WebView android:id="@+id/web_page"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+</LinearLayout>
diff --git a/tests/tests/text/res/values/attrs.xml b/tests/tests/text/res/values/attrs.xml
new file mode 100644
index 0000000..4c3d9db
--- /dev/null
+++ b/tests/tests/text/res/values/attrs.xml
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 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.
+ -->
+
+<resources>
+ <declare-styleable name="Style1">
+ <attr name="Type1" format="integer">
+ <enum name="type" value="28" />
+ <enum name="data" value="0xff00ff00" />
+ <enum name="asset_cookie" value="0" />
+ <enum name="resource_id" value="0" />
+ <enum name="changing_config" value="0" />
+ </attr>
+ <attr name="Type2" format="integer">
+ <enum name="type" value="28" />
+ <enum name="data" value="0xff0000ff" />
+ <enum name="asset_cookie" value="0" />
+ <enum name="resource_id" value="0" />
+ <enum name="changing_config" value="0" />
+ </attr>
+ </declare-styleable>
+ <attr name="type1" format="boolean"/>
+ <attr name="type2" format="boolean"/>
+ <attr name="type3" format="color"/>
+ <attr name="type4" format="reference|color"/>
+ <attr name="type5" format="dimension"/>
+ <attr name="type6" format="dimension"/>
+ <attr name="type7" format="dimension"/>
+ <attr name="type8" format="reference"/>
+ <attr name="type9" format="float"/>
+ <attr name="type10" format="fraction"/>
+ <attr name="type11" format="integer"/>
+ <attr name="type12" format="integer"/>
+ <attr name="type13" format="reference|string"/>
+ <attr name="type14" format="string"/>
+ <attr name="type15" format="reference"/>
+ <attr name="type16" format="string"/>
+ <declare-styleable name="style1">
+ <attr name="type1"/>
+ <attr name="type2"/>
+ <attr name="type3"/>
+ <attr name="type4"/>
+ <attr name="type5"/>
+ <attr name="type6"/>
+ <attr name="type7"/>
+ <attr name="type8"/>
+ <attr name="type9"/>
+ <attr name="type10"/>
+ <attr name="type11"/>
+ <attr name="type12"/>
+ <attr name="type13"/>
+ <attr name="type14"/>
+ <attr name="type15"/>
+ <attr name="type16"/>
+ </declare-styleable>
+ <attr name="testEnum">
+ <enum name="val1" value="1" />
+ <enum name="val2" value="2" />
+ <enum name="val10" value="10" />
+ </attr>
+ <attr name="testFlags">
+ <flag name="bit1" value="0x1" />
+ <flag name="bit2" value="0x2" />
+ <flag name="bit31" value="0x40000000" />
+ </attr>
+ <attr name="testString" format="string" />
+ <declare-styleable name="EnumStyle">
+ <attr name="testEnum" />
+ </declare-styleable>
+ <declare-styleable name="FlagStyle">
+ <attr name="testFlags" />
+ </declare-styleable>
+ <declare-styleable name="TestConfig">
+ <attr name="testString" />
+ </declare-styleable>
+ <!-- Size of text. Recommended dimension type for text is "sp" for scaled-pixels (example: 15sp).
+ Supported values include the following:<p/>
+ <ul>
+ <li><b>px</b> Pixels</li>
+ <li><b>sp</b> Scaled pixels (scaled to relative pixel size on screen). See {@link android.util.DisplayMetrics} for more information.</li>
+ <li><b>pt</b> Points</li>
+ <li><b>dip</b> Device independent pixels. See {@link android.util.DisplayMetrics} for more information.</li>
+ </ul>
+ -->
+ <attr name="textSize" format="dimension" />
+ <attr name="typeface">
+ <enum name="normal" value="0" />
+ <enum name="sans" value="1" />
+ <enum name="serif" value="2" />
+ <enum name="monospace" value="3" />
+ </attr>
+ <!-- Default text typeface style. -->
+ <attr name="textStyle">
+ <flag name="normal" value="0" />
+ <flag name="bold" value="1" />
+ <flag name="italic" value="2" />
+ </attr>
+ <!-- Color of text (usually same as colorForeground). -->
+ <attr name="textColor" format="reference|color" />
+ <!-- Color of highlighted text. -->
+ <attr name="textColorHighlight" format="reference|color" />
+ <!-- Color of hint text (displayed when the field is empty). -->
+ <attr name="textColorHint" format="reference|color" />
+ <!-- Color of link text (URLs). -->
+ <attr name="textColorLink" format="reference|color" />
+ <declare-styleable name="TextAppearance">
+ <attr name="textColor"/>
+ <attr name="textSize"/>
+ <attr name="textStyle"/>
+ <attr name="typeface"/>
+ <attr name="textColorHighlight"/>
+ <attr name="textColorHint"/>
+ <attr name="textColorLink"/>
+ </declare-styleable>
+ <!-- Integer used to uniquely identify theme overrides. -->
+ <attr name="themeType" format="integer"/>
+ <!-- Theme reference used to override parent theme. -->
+ <attr name="themeOverrideAttr" format="reference"/>
+
+ <!-- Drawable theming attributes -->
+ <attr name="themeBoolean" />
+ <attr name="themeColor" />
+ <attr name="themeFloat" />
+ <attr name="themeInteger" />
+ <attr name="themeDimension" />
+ <attr name="themeDrawable" />
+ <attr name="themeBitmap" />
+ <attr name="themeNinePatch" />
+ <attr name="themeGravity" />
+ <attr name="themeTileMode" />
+ <attr name="themeAngle" />
+</resources>
diff --git a/tests/tests/text/res/values/strings.xml b/tests/tests/text/res/values/strings.xml
new file mode 100644
index 0000000..c167278
--- /dev/null
+++ b/tests/tests/text/res/values/strings.xml
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="permlab_testGranted">Test Granted</string>
+ <string name="permdesc_testGranted">Used for running CTS tests, for testing operations
+ where we have the permission.</string>
+ <string name="permlab_testDynamic">Test Dynamic</string>
+ <string name="permdesc_testDynamic">Used for running CTS tests, for testing adding
+ dynamic permissions.</string>
+ <string name="permlab_testDenied">Test Denied</string>
+ <string name="permdesc_testDenied">Used for running CTS tests, for testing operations
+ where we do not have the permission.</string>
+ <string name="explain">1. click start. \n2. if above image shaked, then press pass button,
+ else press failed button.</string>
+ <string name="text_view_hello">Hello! Text view!</string>
+ <string name="text_view_hello_two_lines">Hello! \nText view!</string>
+ <string name="text_view_simple_hint">This is a hint.</string>
+ <string name="text_view_hint">This is a string for testing hint of textview.</string>
+ <string name="activity_forwarding">App/Forwarding</string>
+ <string name="forwarding">$$$</string>
+ <string name="go">Go</string>
+ <string name="back">Back</string>
+ <string name="forward_target">
+ Press back button and notice we don\'t see the previous activity.
+ </string>
+ <string name="edit_text">testing</string>
+ <string name="text">DialogTest</string>
+ <string name="text_country">Country</string>
+ <string name="text_name">Name</string>
+ <string name="hello_world">Hello, World!</string>
+ <string name="hello_android">Hello, Android!</string>
+ <string name="alert_dialog_username">Name:</string>
+ <string name="alert_dialog_password">Password:</string>
+ <string name="alert_dialog_positive">Positive</string>
+ <string name="alert_dialog_negative">Negative</string>
+ <string name="alert_dialog_neutral">Neutral</string>
+ <string name="notify">Notify </string>
+ <string name="tabs_1">testing</string>
+ <string name="table_layout_first">first</string>
+ <string name="table_layout_second">second</string>
+ <string name="table_layout_third">third</string>
+ <string name="table_layout_long">Very long to make the string out of the screen</string>
+ <string name="chronometer_text">Test Chronometer</string>
+ <string name="am">AM</string>
+ <string name="pm">PM</string>
+ <string name="viewgroup_test">ViewGroup test</string>
+ <string name="viewanimator_test">ViewAnimator test</string>
+ <string name="id_ok">OK</string>
+ <string name="id_cancel">Cancel</string>
+ <string name="context_test_string1">This is %s string.</string>
+ <string name="context_test_string2">This is test string.</string>
+ <string name="animationutils_test_instructions">Choose different animations</string>
+ <string name="animationutils_test_alpha">Alpha animation</string>
+ <string name="animationutils_test_scale">Scale animation</string>
+ <string name="animationutils_test_rotate">Rotate animation</string>
+ <string name="animationutils_test_translate">Translate animation</string>
+ <string name="animationutils_test_set">Animation set</string>
+ <string name="animationutils_test_layout">Layout animation</string>
+ <string name="animationutils_test_gridlayout">Grid layout animation</string>
+ <string name="twolinelistitem_test_text1">text1</string>
+ <string name="twolinelistitem_test_text2">text2</string>
+ <string name="metadata_text">metadata text</string>
+ <string name="horizontal_text_1">horizontal 1</string>
+ <string name="horizontal_text_2">horizontal 2</string>
+ <string name="horizontal_text_3">horizontal 3</string>
+ <string name="vertical_text_1">vertical 1</string>
+ <string name="vertical_text_2">vertical 2</string>
+ <string name="vertical_text_3">vertical 3</string>
+ <string name="reference">here</string>
+ <string name="coerceIntegerToString">100</string>
+ <string name="coerceBooleanToString">true</string>
+ <string name="coerceColorToString">#fff</string>
+ <string name="coerceFloatToString">100.0</string>
+ <string name="coerceDimensionToString">100px</string>
+ <string name="coerceFractionToString">100<xliff:g id="percent">%</xliff:g></string>
+ <string name="formattedStringNone">Format[]</string>
+ <string name="formattedStringOne">Format[<xliff:g id="format">%d</xliff:g>]</string>
+ <string name="formattedStringTwo">Format[<xliff:g id="format">%3$d,%2$s</xliff:g>]</string>
+ <string name="checkboxpref_key">checkboxpref_key</string>
+ <string name="checkboxpref_title">title of preference</string>
+ <string name="checkboxpref_summary">summary of preference</string>
+ <string name="checkboxpref_summary_on">summary on of preference</string>
+ <string name="checkboxpref_summary_off">summary off of preference</string>
+ <string name="checkboxpref_depend">checkboxpref_depend</string>
+ <string name="checkboxpref_depend_title"> depend title of preference</string>
+ <string name="checkboxpref_depend_summary"> depend summary of preference</string>
+ <string name="edittextpref_key">edittextpref_key</string>
+ <string name="edittextpref_default_value">default value of preference</string>
+ <string name="edittextpref_title">title of edit text preference</string>
+ <string name="edittextpref_summary">summary of edit text preference</string>
+ <string name="edittextpref_dialog_title">dialog title of edit text preference</string>
+ <string name="edittextpref_text">text of edit text preference</string>
+ <string name="listpref_key">listpref_key</string>
+ <string name="listpref_title">title of list preference</string>
+ <string name="listpref_summary">summary of list preference</string>
+ <string name="listpref_dialogtitle">dialog title of list preference</string>
+ <string name="easy">Easy</string>
+ <string name="medium">Medium</string>
+ <string name="hard">Hard</string>
+ <string name="footer_view">Footer view</string>
+ <string name="header_view">Header view</string>
+ <string name="dialogpref_title">title of dialog preference </string>
+ <string name="dialogpref_dialog_title">dialog title of dialog preference </string>
+ <string name="dialogpref_key">dialogpref_key</string>
+ <string name="dialogpref_default_value">default value of dialog preference</string>
+ <string name="dialogpref_summary">summary of dialog preference</string>
+ <string name="dialogpref_message">message of dialog preference</string>
+ <string name="dialogpref_sure">Sure</string>
+ <string name="dialogpref_cancel">Cancel</string>
+ <string name="pref_key">pref_key</string>
+ <string name="pref_title">title of preference</string>
+ <string name="pref_summary">summary of preference</string>
+ <string name="pref_depend_key">pref_depend_key</string>
+ <string name="pref_depend_title"> depend title of preference</string>
+ <string name="pref_depend_summary"> depend summary of preference</string>
+ <string name="android_intent_action_preference">android.intent.action.PREFERENCE</string>
+ <string name="def_pref_key">def_pref_key</string>
+ <string name="def_pref_title">default preference</string>
+ <string name="def_pref_summary">This is default preference of cts</string>
+ <string name="relative_view1">view 1</string>
+ <string name="relative_view2">view 2</string>
+ <string name="relative_view3">view 3</string>
+ <string name="relative_view4">view 4</string>
+ <string name="relative_view5">view 5</string>
+ <string name="relative_view6">view 6</string>
+ <string name="relative_view7">view 7</string>
+ <string name="relative_view8">view 8</string>
+ <string name="relative_view9">view 9</string>
+ <string name="relative_view10">view 10</string>
+ <string name="relative_view11">view 11</string>
+ <string name="relative_view12">view 12</string>
+ <string name="relative_view13">view 13</string>
+ <string name="country">Country:</string>
+ <string name="symbol">Symbol:</string>
+ <string name="country_warning">No such country registered</string>
+ <string name="version_cur">base</string>
+ <string name="version_old">base</string>
+ <string name="version_v3">base</string>
+ <string name="authenticator_label">Android CTS</string>
+ <string name="search_label">Android CTS</string>
+ <string name="tag1">tag 1</string>
+ <string name="tag2">tag 2</string>
+
+ <string name="button">Button</string>
+ <string name="holo_test">Holo Test</string>
+ <string name="holo_generator">Holo Generator</string>
+ <string name="holo_light_test">Holo Light Test</string>
+ <string name="holo_light_generator">Holo Light Generator</string>
+ <string name="reference_image">Reference Image: </string>
+ <string name="generated_image">Generated Image: </string>
+ <string name="themes_prompt">Select a Theme:</string>
+ <string name="sample_text">Sample text goes here. I wanted something creative and whimsical
+but then I just got bored...</string>
+ <string name="long_text">This is a really long string which exceeds the width of the view.
+New devices have a much larger screen which actually enables long strings to be displayed
+with no fading. I have made this string longer to fix this case. If you are correcting this
+text, I would love to see the kind of devices you guys now use! Guys, maybe some devices need longer string!
+I think so, so how about double this string, like copy and paste!
+This is a really long string which exceeds the width of the view.
+New devices have a much larger screen which actually enables long strings to be displayed
+with no fading. I have made this string longer to fix this case. If you are correcting this
+text, I would love to see the kind of devices you guys now use! Guys, maybe some devices need longer string!
+I think so, so how about double this string, like copy and paste! </string>
+ <string name="rectangle200">"M 0,0 l 200,0 l 0, 200 l -200, 0 z"</string>
+</resources>
diff --git a/tests/tests/text/src/android/text/cts/ClipboardManagerTest.java b/tests/tests/text/src/android/text/cts/ClipboardManagerTest.java
index e62e0f8..f0fc0fa 100644
--- a/tests/tests/text/src/android/text/cts/ClipboardManagerTest.java
+++ b/tests/tests/text/src/android/text/cts/ClipboardManagerTest.java
@@ -18,36 +18,45 @@
import android.content.Context;
-import android.test.AndroidTestCase;
+import android.test.InstrumentationTestCase;
+import android.test.UiThreadTest;
import android.text.ClipboardManager;
/**
* Test {@link ClipboardManager}.
*/
-public class ClipboardManagerTest extends AndroidTestCase {
- private ClipboardManager mClipboardManager;
+public class ClipboardManagerTest extends InstrumentationTestCase {
+
+ private Context mContext;
@Override
- protected void setUp() throws Exception {
- super.setUp();
- mClipboardManager = (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE);
+ public void setUp() {
+ mContext = getInstrumentation().getContext();
}
+ @UiThreadTest
public void testAccessText() {
+ ClipboardManager clipboardManager =
+ (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE);
+
// set the expected value
CharSequence expected = "test";
- mClipboardManager.setText(expected);
- assertEquals(expected, mClipboardManager.getText());
+ clipboardManager.setText(expected);
+ assertEquals(expected, clipboardManager.getText());
}
+ @UiThreadTest
public void testHasText() {
- mClipboardManager.setText("");
- assertFalse(mClipboardManager.hasText());
+ ClipboardManager clipboardManager =
+ (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE);
- mClipboardManager.setText("test");
- assertTrue(mClipboardManager.hasText());
+ clipboardManager.setText("");
+ assertFalse(clipboardManager.hasText());
- mClipboardManager.setText(null);
- assertFalse(mClipboardManager.hasText());
+ clipboardManager.setText("test");
+ assertTrue(clipboardManager.hasText());
+
+ clipboardManager.setText(null);
+ assertFalse(clipboardManager.hasText());
}
}
diff --git a/tests/src/android/text/EmojiStubActivity.java b/tests/tests/text/src/android/text/cts/EmojiCtsActivity.java
similarity index 90%
rename from tests/src/android/text/EmojiStubActivity.java
rename to tests/tests/text/src/android/text/cts/EmojiCtsActivity.java
index 8d09250..eb88426 100644
--- a/tests/src/android/text/EmojiStubActivity.java
+++ b/tests/tests/text/src/android/text/cts/EmojiCtsActivity.java
@@ -16,14 +16,13 @@
package android.text.cts;
-import com.android.cts.stub.R;
+import com.android.cts.text.R;
import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;
-import android.webkit.cts.NullWebViewUtils;
-public class EmojiStubActivity extends Activity {
+public class EmojiCtsActivity extends Activity {
private WebView mWebView;
@Override
diff --git a/tests/tests/text/src/android/text/cts/EmojiTest.java b/tests/tests/text/src/android/text/cts/EmojiTest.java
index 4bcc0e1..b753739 100644
--- a/tests/tests/text/src/android/text/cts/EmojiTest.java
+++ b/tests/tests/text/src/android/text/cts/EmojiTest.java
@@ -25,15 +25,13 @@
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
-import android.webkit.cts.NullWebViewUtils;
-import android.webkit.cts.WebViewOnUiThread;
import android.widget.TextView;
import android.widget.EditText;
-public class EmojiTest extends ActivityInstrumentationTestCase2<EmojiStubActivity> {
+public class EmojiTest extends ActivityInstrumentationTestCase2<EmojiCtsActivity> {
public EmojiTest() {
- super("com.android.cts.stub", EmojiStubActivity.class);
+ super("com.android.cts.text", EmojiCtsActivity.class);
}
protected void setUp() throws Exception {
@@ -94,7 +92,7 @@
// Trigger activity bringup so we can determine if a WebView is available on this
// device.
- EmojiStubActivity activity = getActivity();
+ EmojiCtsActivity activity = getActivity();
if (NullWebViewUtils.isWebViewAvailable()) {
CaptureWebView cwebview = new CaptureWebView(getInstrumentation().getContext());
mBitmapA = cwebview.capture(Character.toChars(comparedCodePoints[i][0]));
@@ -107,7 +105,7 @@
/**
* Tests EditText handles Emoji
*/
- public void testEmojiEditable() {
+ public void testEmojiEditable() throws Throwable {
int testedCodePoints[] = {
0xAE, // registered mark
0x2764, // heavy black heart
@@ -120,15 +118,21 @@
for (int i = 0; i < testedCodePoints.length; i++) {
origStr = "Test character ";
// cannot reuse CaptureTextView as 2nd setText call throws NullPointerException
- EditText editText = new EditText(getInstrumentation().getContext());
+ final EditText editText = new EditText(getInstrumentation().getContext());
editText.setText(origStr + String.valueOf(Character.toChars(testedCodePoints[i])));
// confirm the emoji is added.
newStr = editText.getText().toString();
assertEquals(newStr.codePointCount(0, newStr.length()), origStr.length() + 1);
- // Delete added character by sending KEYCODE_DEL event
- editText.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL));
+ runTestOnUiThread(new Runnable() {
+ public void run() {
+ // Delete added character by sending KEYCODE_DEL event
+ editText.dispatchKeyEvent(
+ new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL));
+ }
+ });
+ getInstrumentation().waitForIdleSync();
newStr = editText.getText().toString();
assertEquals(newStr.codePointCount(0, newStr.length()), origStr.length() + 1);
diff --git a/tests/tests/text/src/android/text/cts/MyanmarTest.java b/tests/tests/text/src/android/text/cts/MyanmarTest.java
index 60fe608..d59f2b9 100644
--- a/tests/tests/text/src/android/text/cts/MyanmarTest.java
+++ b/tests/tests/text/src/android/text/cts/MyanmarTest.java
@@ -25,7 +25,7 @@
public class MyanmarTest extends ActivityInstrumentationTestCase2<Activity> {
public MyanmarTest() {
- super("com.android.cts.stub", Activity.class);
+ super("com.android.cts.text", Activity.class);
}
protected void setUp() throws Exception {
diff --git a/tests/tests/text/src/android/text/cts/NullWebViewUtils.java b/tests/tests/text/src/android/text/cts/NullWebViewUtils.java
new file mode 100644
index 0000000..86d0843
--- /dev/null
+++ b/tests/tests/text/src/android/text/cts/NullWebViewUtils.java
@@ -0,0 +1,88 @@
+/*
+ * 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 android.text.cts;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+
+/**
+ * Utilities to enable the android.webkit.* CTS tests (and others that rely on a functioning
+ * android.webkit.WebView implementation) to determine whether a functioning WebView is present
+ * on the device or not.
+ *
+ * Test cases that require android.webkit.* classes should wrap their first usage of WebView in a
+ * try catch block, and pass any exception that is thrown to
+ * NullWebViewUtils.determineIfWebViewAvailable. The return value of
+ * NullWebViewUtils.isWebViewAvailable will then determine if the test should expect to be able to
+ * use a WebView.
+ */
+public class NullWebViewUtils {
+
+ private static boolean sWebViewUnavailable;
+
+ /**
+ * @param context Current Activity context, used to query the PackageManager.
+ * @param t An exception thrown by trying to invoke android.webkit.* APIs.
+ */
+ public static void determineIfWebViewAvailable(Context context, Throwable t) {
+ sWebViewUnavailable = !hasWebViewFeature(context) && checkCauseWasUnsupportedOperation(t);
+ }
+
+ /**
+ * After calling determineIfWebViewAvailable, this returns whether a WebView is available on the
+ * device and wheter the test can rely on it.
+ * @return True iff. PackageManager determined that there is no WebView on the device and the
+ * exception thrown from android.webkit.* was UnsupportedOperationException.
+ */
+ public static boolean isWebViewAvailable() {
+ return !sWebViewUnavailable;
+ }
+
+ private static boolean hasWebViewFeature(Context context) {
+ // Query the system property that determins if there is a functional WebView on the device.
+ PackageManager pm = context.getPackageManager();
+ return pm.hasSystemFeature(PackageManager.FEATURE_WEBVIEW);
+ }
+
+ private static boolean checkCauseWasUnsupportedOperation(Throwable t) {
+ if (t == null) return false;
+ while (t.getCause() != null) {
+ t = t.getCause();
+ }
+ return t instanceof UnsupportedOperationException;
+ }
+
+ /**
+ * Some CTS tests (by design) first use android.webkit.* from a background thread. This helper
+ * allows the test to catch the UnsupportedOperationException from that background thread, and
+ * then query the result from the test main thread.
+ */
+ public static class NullWebViewFromThreadExceptionHandler
+ implements Thread.UncaughtExceptionHandler {
+ private Throwable mPendingException;
+
+ @Override
+ public void uncaughtException(Thread t, Throwable e) {
+ mPendingException = e;
+ }
+
+ public boolean isWebViewAvailable(Context context) {
+ return hasWebViewFeature(context) ||
+ !checkCauseWasUnsupportedOperation(mPendingException);
+ }
+ }
+}
\ No newline at end of file
diff --git a/tests/tests/text/src/android/text/cts/WebViewOnUiThread.java b/tests/tests/text/src/android/text/cts/WebViewOnUiThread.java
new file mode 100644
index 0000000..3d62ce4
--- /dev/null
+++ b/tests/tests/text/src/android/text/cts/WebViewOnUiThread.java
@@ -0,0 +1,980 @@
+/*
+ * Copyright (C) 2011 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.text.cts;
+
+import android.cts.util.PollingCheck;
+import android.graphics.Bitmap;
+import android.graphics.Picture;
+import android.graphics.Rect;
+import android.os.Bundle;
+import android.os.Looper;
+import android.os.Message;
+import android.os.SystemClock;
+import android.print.PrintDocumentAdapter;
+import android.test.InstrumentationTestCase;
+import android.util.DisplayMetrics;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewParent;
+import android.webkit.DownloadListener;
+import android.webkit.CookieManager;
+import android.webkit.ValueCallback;
+import android.webkit.WebBackForwardList;
+import android.webkit.WebChromeClient;
+import android.webkit.WebSettings;
+import android.webkit.WebView.HitTestResult;
+import android.webkit.WebView.PictureListener;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+
+import junit.framework.Assert;
+
+import java.io.File;
+import java.util.concurrent.Callable;
+import java.util.Map;
+
+/**
+ * Many tests need to run WebView code in the UI thread. This class
+ * wraps a WebView so that calls are ensured to arrive on the UI thread.
+ *
+ * All methods may be run on either the UI thread or test thread.
+ */
+public class WebViewOnUiThread {
+ /**
+ * The maximum time, in milliseconds (10 seconds) to wait for a load
+ * to be triggered.
+ */
+ private static final long LOAD_TIMEOUT = 10000;
+
+ /**
+ * Set to true after onPageFinished is called.
+ */
+ private boolean mLoaded;
+
+ /**
+ * Set to true after onNewPicture is called. Reset when onPageStarted
+ * is called.
+ */
+ private boolean mNewPicture;
+
+ /**
+ * The progress, in percentage, of the page load. Valid values are between
+ * 0 and 100.
+ */
+ private int mProgress;
+
+ /**
+ * The test that this class is being used in. Used for runTestOnUiThread.
+ */
+ private InstrumentationTestCase mTest;
+
+ /**
+ * The WebView that calls will be made on.
+ */
+ private WebView mWebView;
+
+ /**
+ * Initializes the webView with a WebViewClient, WebChromeClient,
+ * and PictureListener to prepare for loadUrlAndWaitForCompletion.
+ *
+ * A new WebViewOnUiThread should be called during setUp so as to
+ * reinitialize between calls.
+ *
+ * @param test The test in which this is being run.
+ * @param webView The webView that the methods should call.
+ * @see loadUrlAndWaitForCompletion
+ */
+ public WebViewOnUiThread(InstrumentationTestCase test, WebView webView) {
+ mTest = test;
+ mWebView = webView;
+ final WebViewClient webViewClient = new WaitForLoadedClient(this);
+ final WebChromeClient webChromeClient = new WaitForProgressClient(this);
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.setWebViewClient(webViewClient);
+ mWebView.setWebChromeClient(webChromeClient);
+ mWebView.setPictureListener(new WaitForNewPicture());
+ }
+ });
+ }
+
+ /**
+ * Called after a test is complete and the WebView should be disengaged from
+ * the tests.
+ */
+ public void cleanUp() {
+ clearHistory();
+ clearCache(true);
+ setPictureListener(null);
+ setWebChromeClient(null);
+ setWebViewClient(null);
+ }
+
+ /**
+ * Called from WaitForNewPicture, this is used to indicate that
+ * the page has been drawn.
+ */
+ synchronized public void onNewPicture() {
+ mNewPicture = true;
+ this.notifyAll();
+ }
+
+ /**
+ * Called from WaitForLoadedClient, this is used to clear the picture
+ * draw state so that draws before the URL begins loading don't count.
+ */
+ synchronized public void onPageStarted() {
+ mNewPicture = false; // Earlier paints won't count.
+ }
+
+ /**
+ * Called from WaitForLoadedClient, this is used to indicate that
+ * the page is loaded, but not drawn yet.
+ */
+ synchronized public void onPageFinished() {
+ mLoaded = true;
+ this.notifyAll();
+ }
+
+ /**
+ * Called from the WebChrome client, this sets the current progress
+ * for a page.
+ * @param progress The progress made so far between 0 and 100.
+ */
+ synchronized public void onProgressChanged(int progress) {
+ mProgress = progress;
+ this.notifyAll();
+ }
+
+ public void setWebViewClient(final WebViewClient webViewClient) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.setWebViewClient(webViewClient);
+ }
+ });
+ }
+
+ public void setWebChromeClient(final WebChromeClient webChromeClient) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.setWebChromeClient(webChromeClient);
+ }
+ });
+ }
+
+ public void setPictureListener(final PictureListener pictureListener) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.setPictureListener(pictureListener);
+ }
+ });
+ }
+
+ public void setNetworkAvailable(final boolean available) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.setNetworkAvailable(available);
+ }
+ });
+ }
+
+ public void setDownloadListener(final DownloadListener listener) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.setDownloadListener(listener);
+ }
+ });
+ }
+
+ public void setBackgroundColor(final int color) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.setBackgroundColor(color);
+ }
+ });
+ }
+
+ public void clearCache(final boolean includeDiskFiles) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.clearCache(includeDiskFiles);
+ }
+ });
+ }
+
+ public void clearHistory() {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.clearHistory();
+ }
+ });
+ }
+
+ public void requestFocus() {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.requestFocus();
+ }
+ });
+ }
+
+ public boolean canZoomIn() {
+ return getValue(new ValueGetter<Boolean>() {
+ @Override
+ public Boolean capture() {
+ return mWebView.canZoomIn();
+ }
+ });
+ }
+
+ public boolean zoomIn() {
+ return getValue(new ValueGetter<Boolean>() {
+ @Override
+ public Boolean capture() {
+ return mWebView.zoomIn();
+ }
+ });
+ }
+
+ public boolean zoomOut() {
+ return getValue(new ValueGetter<Boolean>() {
+ @Override
+ public Boolean capture() {
+ return mWebView.zoomOut();
+ }
+ });
+ }
+
+ public void setFindListener(final WebView.FindListener listener) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.setFindListener(listener);
+ }
+ });
+ }
+
+ public void removeJavascriptInterface(final String interfaceName) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.removeJavascriptInterface(interfaceName);
+ }
+ });
+ }
+
+ public void addJavascriptInterface(final Object object, final String name) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.addJavascriptInterface(object, name);
+ }
+ });
+ }
+
+ public void flingScroll(final int vx, final int vy) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.flingScroll(vx, vy);
+ }
+ });
+ }
+
+ public void requestFocusNodeHref(final Message hrefMsg) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.requestFocusNodeHref(hrefMsg);
+ }
+ });
+ }
+
+ public void requestImageRef(final Message msg) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.requestImageRef(msg);
+ }
+ });
+ }
+
+ public void setInitialScale(final int scaleInPercent) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.setInitialScale(scaleInPercent);
+ }
+ });
+ }
+
+ public void clearSslPreferences() {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.clearSslPreferences();
+ }
+ });
+ }
+
+ public void clearClientCertPreferences(final Runnable onCleared) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ WebView.clearClientCertPreferences(onCleared);
+ }
+ });
+ }
+
+ public void resumeTimers() {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.resumeTimers();
+ }
+ });
+ }
+
+ public void findNext(final boolean forward) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.findNext(forward);
+ }
+ });
+ }
+
+ public void clearMatches() {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.clearMatches();
+ }
+ });
+ }
+
+ /**
+ * Calls loadUrl on the WebView and then waits onPageFinished,
+ * onNewPicture and onProgressChange to reach 100.
+ * Test fails if the load timeout elapses.
+ * @param url The URL to load.
+ */
+ public void loadUrlAndWaitForCompletion(final String url) {
+ callAndWait(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.loadUrl(url);
+ }
+ });
+ }
+
+ /**
+ * Calls loadUrl on the WebView and then waits onPageFinished,
+ * onNewPicture and onProgressChange to reach 100.
+ * Test fails if the load timeout elapses.
+ * @param url The URL to load.
+ * @param extraHeaders The additional headers to be used in the HTTP request.
+ */
+ public void loadUrlAndWaitForCompletion(final String url,
+ final Map<String, String> extraHeaders) {
+ callAndWait(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.loadUrl(url, extraHeaders);
+ }
+ });
+ }
+
+ public void loadUrl(final String url) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.loadUrl(url);
+ }
+ });
+ }
+
+ public void stopLoading() {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.stopLoading();
+ }
+ });
+ }
+
+ public void postUrlAndWaitForCompletion(final String url, final byte[] postData) {
+ callAndWait(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.postUrl(url, postData);
+ }
+ });
+ }
+
+ public void loadDataAndWaitForCompletion(final String data,
+ final String mimeType, final String encoding) {
+ callAndWait(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.loadData(data, mimeType, encoding);
+ }
+ });
+ }
+
+ public void loadDataWithBaseURLAndWaitForCompletion(final String baseUrl,
+ final String data, final String mimeType, final String encoding,
+ final String historyUrl) {
+ callAndWait(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.loadDataWithBaseURL(baseUrl, data, mimeType, encoding,
+ historyUrl);
+ }
+ });
+ }
+
+ /**
+ * Reloads a page and waits for it to complete reloading. Use reload
+ * if it is a form resubmission and the onFormResubmission responds
+ * by telling WebView not to resubmit it.
+ */
+ public void reloadAndWaitForCompletion() {
+ callAndWait(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.reload();
+ }
+ });
+ }
+
+ /**
+ * Reload the previous URL. Use reloadAndWaitForCompletion unless
+ * it is a form resubmission and the onFormResubmission responds
+ * by telling WebView not to resubmit it.
+ */
+ public void reload() {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.reload();
+ }
+ });
+ }
+
+ /**
+ * Use this only when JavaScript causes a page load to wait for the
+ * page load to complete. Otherwise use loadUrlAndWaitForCompletion or
+ * similar functions.
+ */
+ public void waitForLoadCompletion() {
+ waitForCriteria(LOAD_TIMEOUT,
+ new Callable<Boolean>() {
+ @Override
+ public Boolean call() {
+ return isLoaded();
+ }
+ });
+ clearLoad();
+ }
+
+ private void waitForCriteria(long timeout, Callable<Boolean> doneCriteria) {
+ if (isUiThread()) {
+ waitOnUiThread(timeout, doneCriteria);
+ } else {
+ waitOnTestThread(timeout, doneCriteria);
+ }
+ }
+
+ public String getTitle() {
+ return getValue(new ValueGetter<String>() {
+ @Override
+ public String capture() {
+ return mWebView.getTitle();
+ }
+ });
+ }
+
+ public WebSettings getSettings() {
+ return getValue(new ValueGetter<WebSettings>() {
+ @Override
+ public WebSettings capture() {
+ return mWebView.getSettings();
+ }
+ });
+ }
+
+ public WebBackForwardList copyBackForwardList() {
+ return getValue(new ValueGetter<WebBackForwardList>() {
+ @Override
+ public WebBackForwardList capture() {
+ return mWebView.copyBackForwardList();
+ }
+ });
+ }
+
+ public Bitmap getFavicon() {
+ return getValue(new ValueGetter<Bitmap>() {
+ @Override
+ public Bitmap capture() {
+ return mWebView.getFavicon();
+ }
+ });
+ }
+
+ public String getUrl() {
+ return getValue(new ValueGetter<String>() {
+ @Override
+ public String capture() {
+ return mWebView.getUrl();
+ }
+ });
+ }
+
+ public int getProgress() {
+ return getValue(new ValueGetter<Integer>() {
+ @Override
+ public Integer capture() {
+ return mWebView.getProgress();
+ }
+ });
+ }
+
+ public int getHeight() {
+ return getValue(new ValueGetter<Integer>() {
+ @Override
+ public Integer capture() {
+ return mWebView.getHeight();
+ }
+ });
+ }
+
+ public int getContentHeight() {
+ return getValue(new ValueGetter<Integer>() {
+ @Override
+ public Integer capture() {
+ return mWebView.getContentHeight();
+ }
+ });
+ }
+
+ public boolean savePicture(final Bundle b, final File dest) {
+ return getValue(new ValueGetter<Boolean>() {
+ @Override
+ public Boolean capture() {
+ return mWebView.savePicture(b, dest);
+ }
+ });
+ }
+
+ public boolean pageUp(final boolean top) {
+ return getValue(new ValueGetter<Boolean>() {
+ @Override
+ public Boolean capture() {
+ return mWebView.pageUp(top);
+ }
+ });
+ }
+
+ public boolean pageDown(final boolean bottom) {
+ return getValue(new ValueGetter<Boolean>() {
+ @Override
+ public Boolean capture() {
+ return mWebView.pageDown(bottom);
+ }
+ });
+ }
+
+ public int[] getLocationOnScreen() {
+ final int[] location = new int[2];
+ return getValue(new ValueGetter<int[]>() {
+ @Override
+ public int[] capture() {
+ mWebView.getLocationOnScreen(location);
+ return location;
+ }
+ });
+ }
+
+ public float getScale() {
+ return getValue(new ValueGetter<Float>() {
+ @Override
+ public Float capture() {
+ return mWebView.getScale();
+ }
+ });
+ }
+
+ public boolean requestFocus(final int direction,
+ final Rect previouslyFocusedRect) {
+ return getValue(new ValueGetter<Boolean>() {
+ @Override
+ public Boolean capture() {
+ return mWebView.requestFocus(direction, previouslyFocusedRect);
+ }
+ });
+ }
+
+ public HitTestResult getHitTestResult() {
+ return getValue(new ValueGetter<HitTestResult>() {
+ @Override
+ public HitTestResult capture() {
+ return mWebView.getHitTestResult();
+ }
+ });
+ }
+
+ public int getScrollX() {
+ return getValue(new ValueGetter<Integer>() {
+ @Override
+ public Integer capture() {
+ return mWebView.getScrollX();
+ }
+ });
+ }
+
+ public int getScrollY() {
+ return getValue(new ValueGetter<Integer>() {
+ @Override
+ public Integer capture() {
+ return mWebView.getScrollY();
+ }
+ });
+ }
+
+ public final DisplayMetrics getDisplayMetrics() {
+ return getValue(new ValueGetter<DisplayMetrics>() {
+ @Override
+ public DisplayMetrics capture() {
+ return mWebView.getContext().getResources().getDisplayMetrics();
+ }
+ });
+ }
+
+ public boolean requestChildRectangleOnScreen(final View child,
+ final Rect rect,
+ final boolean immediate) {
+ return getValue(new ValueGetter<Boolean>() {
+ @Override
+ public Boolean capture() {
+ return mWebView.requestChildRectangleOnScreen(child, rect,
+ immediate);
+ }
+ });
+ }
+
+ public int findAll(final String find) {
+ return getValue(new ValueGetter<Integer>() {
+ @Override
+ public Integer capture() {
+ return mWebView.findAll(find);
+ }
+ });
+ }
+
+ public Picture capturePicture() {
+ return getValue(new ValueGetter<Picture>() {
+ @Override
+ public Picture capture() {
+ return mWebView.capturePicture();
+ }
+ });
+ }
+
+ public void evaluateJavascript(final String script, final ValueCallback<String> result) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.evaluateJavascript(script, result);
+ }
+ });
+ }
+
+ public WebView createWebView() {
+ return getValue(new ValueGetter<WebView>() {
+ @Override
+ public WebView capture() {
+ return new WebView(mWebView.getContext());
+ }
+ });
+ }
+
+ public PrintDocumentAdapter createPrintDocumentAdapter() {
+ return getValue(new ValueGetter<PrintDocumentAdapter>() {
+ @Override
+ public PrintDocumentAdapter capture() {
+ return mWebView.createPrintDocumentAdapter();
+ }
+ });
+ }
+
+ public void setLayoutHeightToMatchParent() {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ ViewParent parent = mWebView.getParent();
+ if (parent instanceof ViewGroup) {
+ ((ViewGroup) parent).getLayoutParams().height =
+ ViewGroup.LayoutParams.MATCH_PARENT;
+ }
+ mWebView.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT;
+ mWebView.requestLayout();
+ }
+ });
+ }
+
+ public void setAcceptThirdPartyCookies(final boolean accept) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ CookieManager.getInstance().setAcceptThirdPartyCookies(mWebView, accept);
+ }
+ });
+ }
+
+ public boolean acceptThirdPartyCookies() {
+ return getValue(new ValueGetter<Boolean>() {
+ @Override
+ public Boolean capture() {
+ return CookieManager.getInstance().acceptThirdPartyCookies(mWebView);
+ }
+ });
+ }
+
+ /**
+ * Helper for running code on the UI thread where an exception is
+ * a test failure. If this is already the UI thread then it runs
+ * the code immediately.
+ *
+ * @see runTestOnUiThread
+ * @param r The code to run in the UI thread
+ */
+ public void runOnUiThread(Runnable r) {
+ try {
+ if (isUiThread()) {
+ r.run();
+ } else {
+ mTest.runTestOnUiThread(r);
+ }
+ } catch (Throwable t) {
+ Assert.fail("Unexpected error while running on UI thread: "
+ + t.getMessage());
+ }
+ }
+
+ /**
+ * Accessor for underlying WebView.
+ * @return The WebView being wrapped by this class.
+ */
+ public WebView getWebView() {
+ return mWebView;
+ }
+
+ private<T> T getValue(ValueGetter<T> getter) {
+ runOnUiThread(getter);
+ return getter.getValue();
+ }
+
+ private abstract class ValueGetter<T> implements Runnable {
+ private T mValue;
+
+ @Override
+ public void run() {
+ mValue = capture();
+ }
+
+ protected abstract T capture();
+
+ public T getValue() {
+ return mValue;
+ }
+ }
+
+ /**
+ * Returns true if the current thread is the UI thread based on the
+ * Looper.
+ */
+ private static boolean isUiThread() {
+ return (Looper.myLooper() == Looper.getMainLooper());
+ }
+
+ /**
+ * @return Whether or not the load has finished.
+ */
+ private synchronized boolean isLoaded() {
+ return mLoaded && mNewPicture && mProgress == 100;
+ }
+
+ /**
+ * Makes a WebView call, waits for completion and then resets the
+ * load state in preparation for the next load call.
+ * @param call The call to make on the UI thread prior to waiting.
+ */
+ private void callAndWait(Runnable call) {
+ Assert.assertTrue("WebViewOnUiThread.load*AndWaitForCompletion calls "
+ + "may not be mixed with load* calls directly on WebView "
+ + "without calling waitForLoadCompletion after the load",
+ !isLoaded());
+ clearLoad(); // clear any extraneous signals from a previous load.
+ runOnUiThread(call);
+ waitForLoadCompletion();
+ }
+
+ /**
+ * Called whenever a load has been completed so that a subsequent call to
+ * waitForLoadCompletion doesn't return immediately.
+ */
+ synchronized private void clearLoad() {
+ mLoaded = false;
+ mNewPicture = false;
+ mProgress = 0;
+ }
+
+ /**
+ * Uses a polling mechanism, while pumping messages to check when the
+ * criteria is met.
+ */
+ private void waitOnUiThread(long timeout, final Callable<Boolean> doneCriteria) {
+ new PollingCheck(timeout) {
+ @Override
+ protected boolean check() {
+ pumpMessages();
+ try {
+ return doneCriteria.call();
+ } catch (Exception e) {
+ Assert.fail("Unexpected error while checking the criteria: "
+ + e.getMessage());
+ return true;
+ }
+ }
+ }.run();
+ }
+
+ /**
+ * Uses a wait/notify to check when the criteria is met.
+ */
+ private synchronized void waitOnTestThread(long timeout, Callable<Boolean> doneCriteria) {
+ try {
+ long waitEnd = SystemClock.uptimeMillis() + timeout;
+ long timeRemaining = timeout;
+ while (!doneCriteria.call() && timeRemaining > 0) {
+ this.wait(timeRemaining);
+ timeRemaining = waitEnd - SystemClock.uptimeMillis();
+ }
+ Assert.assertTrue("Action failed to complete before timeout", doneCriteria.call());
+ } catch (InterruptedException e) {
+ // We'll just drop out of the loop and fail
+ } catch (Exception e) {
+ Assert.fail("Unexpected error while checking the criteria: "
+ + e.getMessage());
+ }
+ }
+
+ /**
+ * Pumps all currently-queued messages in the UI thread and then exits.
+ * This is useful to force processing while running tests in the UI thread.
+ */
+ private void pumpMessages() {
+ class ExitLoopException extends RuntimeException {
+ }
+
+ // Force loop to exit when processing this. Loop.quit() doesn't
+ // work because this is the main Loop.
+ mWebView.getHandler().post(new Runnable() {
+ @Override
+ public void run() {
+ throw new ExitLoopException(); // exit loop!
+ }
+ });
+ try {
+ // Pump messages until our message gets through.
+ Looper.loop();
+ } catch (ExitLoopException e) {
+ }
+ }
+
+ /**
+ * A WebChromeClient used to capture the onProgressChanged for use
+ * in waitFor functions. If a test must override the WebChromeClient,
+ * it can derive from this class or call onProgressChanged
+ * directly.
+ */
+ public static class WaitForProgressClient extends WebChromeClient {
+ private WebViewOnUiThread mOnUiThread;
+
+ public WaitForProgressClient(WebViewOnUiThread onUiThread) {
+ mOnUiThread = onUiThread;
+ }
+
+ @Override
+ public void onProgressChanged(WebView view, int newProgress) {
+ super.onProgressChanged(view, newProgress);
+ mOnUiThread.onProgressChanged(newProgress);
+ }
+ }
+
+ /**
+ * A WebViewClient that captures the onPageFinished for use in
+ * waitFor functions. Using initializeWebView sets the WaitForLoadedClient
+ * into the WebView. If a test needs to set a specific WebViewClient and
+ * needs the waitForCompletion capability then it should derive from
+ * WaitForLoadedClient or call WebViewOnUiThread.onPageFinished.
+ */
+ public static class WaitForLoadedClient extends WebViewClient {
+ private WebViewOnUiThread mOnUiThread;
+
+ public WaitForLoadedClient(WebViewOnUiThread onUiThread) {
+ mOnUiThread = onUiThread;
+ }
+
+ @Override
+ public void onPageFinished(WebView view, String url) {
+ super.onPageFinished(view, url);
+ mOnUiThread.onPageFinished();
+ }
+
+ @Override
+ public void onPageStarted(WebView view, String url, Bitmap favicon) {
+ super.onPageStarted(view, url, favicon);
+ mOnUiThread.onPageStarted();
+ }
+ }
+
+ /**
+ * A PictureListener that captures the onNewPicture for use in
+ * waitForLoadCompletion. Using initializeWebView sets the PictureListener
+ * into the WebView. If a test needs to set a specific PictureListener and
+ * needs the waitForCompletion capability then it should call
+ * WebViewOnUiThread.onNewPicture.
+ */
+ private class WaitForNewPicture implements PictureListener {
+ @Override
+ public void onNewPicture(WebView view, Picture picture) {
+ WebViewOnUiThread.this.onNewPicture();
+ }
+ }
+}
diff --git a/tests/tests/text/src/android/text/cts/WidgetTestUtils.java b/tests/tests/text/src/android/text/cts/WidgetTestUtils.java
new file mode 100644
index 0000000..d41b242
--- /dev/null
+++ b/tests/tests/text/src/android/text/cts/WidgetTestUtils.java
@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) 2008 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.text.cts;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+
+import java.io.IOException;
+
+import junit.framework.Assert;
+
+/**
+ * The useful methods for widget test.
+ */
+public class WidgetTestUtils {
+ /**
+ * Assert that two bitmaps are equal.
+ *
+ * @param Bitmap b1 the first bitmap which needs to compare.
+ * @param Bitmap b2 the second bitmap which needs to compare.
+ */
+ public static void assertEquals(Bitmap b1, Bitmap b2) {
+ if (b1 == b2) {
+ return;
+ }
+
+ if (b1 == null || b2 == null) {
+ Assert.fail("the bitmaps are not equal");
+ }
+
+ // b1 and b2 are all not null.
+ if (b1.getWidth() != b2.getWidth() || b1.getHeight() != b2.getHeight()
+ || b1.getConfig() != b2.getConfig()) {
+ Assert.fail("the bitmaps are not equal");
+ }
+
+ int w = b1.getWidth();
+ int h = b1.getHeight();
+ int s = w * h;
+ int[] pixels1 = new int[s];
+ int[] pixels2 = new int[s];
+
+ b1.getPixels(pixels1, 0, w, 0, 0, w, h);
+ b2.getPixels(pixels2, 0, w, 0, 0, w, h);
+
+ for (int i = 0; i < s; i++) {
+ if (pixels1[i] != pixels2[i]) {
+ Assert.fail("the bitmaps are not equal");
+ }
+ }
+ }
+
+ /**
+ * Find beginning of the special element.
+ * @param parser XmlPullParser will be parsed.
+ * @param firstElementName the target element name.
+ *
+ * @throws XmlPullParserException if XML Pull Parser related faults occur.
+ * @throws IOException if I/O-related error occur when parsing.
+ */
+ public static final void beginDocument(XmlPullParser parser, String firstElementName)
+ throws XmlPullParserException, IOException {
+ Assert.assertNotNull(parser);
+ Assert.assertNotNull(firstElementName);
+
+ int type;
+ while ((type = parser.next()) != XmlPullParser.START_TAG
+ && type != XmlPullParser.END_DOCUMENT) {
+ ;
+ }
+
+ if (!parser.getName().equals(firstElementName)) {
+ throw new XmlPullParserException("Unexpected start tag: found " + parser.getName()
+ + ", expected " + firstElementName);
+ }
+ }
+
+ /**
+ * Compare the expected pixels with actual, scaling for the target context density
+ *
+ * @throws AssertionFailedError
+ */
+ public static void assertScaledPixels(int expected, int actual, Context context) {
+ Assert.assertEquals(expected * context.getResources().getDisplayMetrics().density,
+ actual, 3);
+ }
+
+ /** Converts dips into pixels using the {@link Context}'s density. */
+ public static int convertDipToPixels(Context context, int dip) {
+ float density = context.getResources().getDisplayMetrics().density;
+ return Math.round(density * dip);
+ }
+
+ /**
+ * Retrieve a bitmap that can be used for comparison on any density
+ * @param resources
+ * @return the {@link Bitmap} or <code>null</code>
+ */
+ public static Bitmap getUnscaledBitmap(Resources resources, int resId) {
+ BitmapFactory.Options options = new BitmapFactory.Options();
+ options.inScaled = false;
+ return BitmapFactory.decodeResource(resources, resId, options);
+ }
+
+ /**
+ * Retrieve a dithered bitmap that can be used for comparison on any density
+ * @param resources
+ * @param config the preferred config for the returning bitmap
+ * @return the {@link Bitmap} or <code>null</code>
+ */
+ public static Bitmap getUnscaledAndDitheredBitmap(Resources resources,
+ int resId, Bitmap.Config config) {
+ BitmapFactory.Options options = new BitmapFactory.Options();
+ options.inDither = true;
+ options.inScaled = false;
+ options.inPreferredConfig = config;
+ return BitmapFactory.decodeResource(resources, resId, options);
+ }
+}
diff --git a/tests/src/android/text/format/cts/LocaleUtils.java b/tests/tests/text/src/android/text/format/cts/LocaleUtils.java
similarity index 100%
rename from tests/src/android/text/format/cts/LocaleUtils.java
rename to tests/tests/text/src/android/text/format/cts/LocaleUtils.java
diff --git a/tests/tests/text/src/android/text/method/cts/ArrowKeyMovementMethodTest.java b/tests/tests/text/src/android/text/method/cts/ArrowKeyMovementMethodTest.java
index e20920a..10d08d0 100644
--- a/tests/tests/text/src/android/text/method/cts/ArrowKeyMovementMethodTest.java
+++ b/tests/tests/text/src/android/text/method/cts/ArrowKeyMovementMethodTest.java
@@ -42,7 +42,7 @@
*
* @see android.widget.cts.TextViewTest
*/
-public class ArrowKeyMovementMethodTest extends ActivityInstrumentationTestCase2<StubActivity> {
+public class ArrowKeyMovementMethodTest extends ActivityInstrumentationTestCase2<CtsActivity> {
private static final String THREE_LINES_TEXT = "first line\nsecond line\nlast line";
private static final int END_OF_ALL_TEXT = THREE_LINES_TEXT.length();
private static final int END_OF_1ST_LINE = THREE_LINES_TEXT.indexOf('\n');
@@ -56,7 +56,7 @@
private MyMetaKeyKeyListener mMetaListener;
public ArrowKeyMovementMethodTest() {
- super("com.android.cts.stub", StubActivity.class);
+ super("com.android.cts.text", CtsActivity.class);
}
@Override
diff --git a/tests/tests/text/src/android/text/method/cts/CharacterPickerDialogTest.java b/tests/tests/text/src/android/text/method/cts/CharacterPickerDialogTest.java
index 1e7150b..382fc77 100644
--- a/tests/tests/text/src/android/text/method/cts/CharacterPickerDialogTest.java
+++ b/tests/tests/text/src/android/text/method/cts/CharacterPickerDialogTest.java
@@ -21,6 +21,7 @@
import android.content.Context;
import android.os.Bundle;
import android.test.ActivityInstrumentationTestCase2;
+import android.test.UiThreadTest;
import android.text.Editable;
import android.text.Selection;
import android.text.method.CharacterPickerDialog;
@@ -30,11 +31,11 @@
import android.widget.TextView;
public class CharacterPickerDialogTest extends
- ActivityInstrumentationTestCase2<StubActivity> {
+ ActivityInstrumentationTestCase2<CtsActivity> {
private Activity mActivity;
public CharacterPickerDialogTest() {
- super("com.android.cts.stub", StubActivity.class);
+ super("com.android.cts.text", CtsActivity.class);
}
@Override
@@ -43,6 +44,7 @@
mActivity = getActivity();
}
+ @UiThreadTest
public void testConstructor() {
final CharSequence str = "123456";
final Editable content = Editable.Factory.getInstance().newEditable(str);
@@ -61,6 +63,7 @@
// Do not test. Implementation details.
}
+ @UiThreadTest
public void testOnItemClick() {
final Gallery parent = new Gallery(mActivity);
final CharSequence str = "123456";
@@ -102,6 +105,7 @@
assertFalse(insertPickerDialog.isShowing());
}
+ @UiThreadTest
public void testOnClick() {
final CharSequence str = "123456";
final Editable content = Editable.Factory.getInstance().newEditable(str);
diff --git a/tests/src/android/text/method/cts/StubActivity.java b/tests/tests/text/src/android/text/method/cts/CtsActivity.java
similarity index 95%
rename from tests/src/android/text/method/cts/StubActivity.java
rename to tests/tests/text/src/android/text/method/cts/CtsActivity.java
index f3dad52..edf3a0e 100644
--- a/tests/src/android/text/method/cts/StubActivity.java
+++ b/tests/tests/text/src/android/text/method/cts/CtsActivity.java
@@ -33,5 +33,5 @@
* @see ArrowKeyMovementMethodTest
* @see ScrollingMovementMethodTest
*/
-public class StubActivity extends Activity {
+public class CtsActivity extends Activity {
}
diff --git a/tests/src/android/text/method/cts/KeyListenerStubActivity.java b/tests/tests/text/src/android/text/method/cts/KeyListenerCtsActivity.java
similarity index 91%
rename from tests/src/android/text/method/cts/KeyListenerStubActivity.java
rename to tests/tests/text/src/android/text/method/cts/KeyListenerCtsActivity.java
index 149ad87..c6483a2 100644
--- a/tests/src/android/text/method/cts/KeyListenerStubActivity.java
+++ b/tests/tests/text/src/android/text/method/cts/KeyListenerCtsActivity.java
@@ -16,7 +16,7 @@
package android.text.method.cts;
-import com.android.cts.stub.R;
+import com.android.cts.text.R;
import android.app.Activity;
import android.os.Bundle;
@@ -55,7 +55,7 @@
* @see TimeKeyListener
*/
-public class KeyListenerStubActivity extends Activity {
+public class KeyListenerCtsActivity extends Activity {
private boolean mHasWindowFocus = false;
private Object mHasWindowFocusLock = new Object();
@@ -69,7 +69,7 @@
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (!hasFocus) {
- Log.w("KeyListenerStubActivity", "KeyListenerStubActivity lost window focus");
+ Log.w("KeyListenerCtsActivity", "KeyListenerCtsActivity lost window focus");
}
synchronized(mHasWindowFocusLock) {
mHasWindowFocus = hasFocus;
@@ -78,7 +78,7 @@
}
/**
- * Blocks the calling thread until the {@link KeyListenerStubActivity} has window focus or the
+ * Blocks the calling thread until the {@link KeyListenerCtsActivity} has window focus or the
* specified duration (in milliseconds) has passed.
*/
public boolean waitForWindowFocus(long durationMillis) {
diff --git a/tests/tests/text/src/android/text/method/cts/KeyListenerTestCase.java b/tests/tests/text/src/android/text/method/cts/KeyListenerTestCase.java
index 375ea54..8bb2adf 100644
--- a/tests/tests/text/src/android/text/method/cts/KeyListenerTestCase.java
+++ b/tests/tests/text/src/android/text/method/cts/KeyListenerTestCase.java
@@ -16,12 +16,12 @@
package android.text.method.cts;
-import com.android.cts.stub.R;
+import com.android.cts.text.R;
import android.app.Instrumentation;
import android.test.ActivityInstrumentationTestCase2;
import android.text.format.DateUtils;
-import android.text.method.cts.KeyListenerStubActivity;
+import android.text.method.cts.KeyListenerCtsActivity;
import android.text.method.KeyListener;
import android.view.WindowManager;
import android.widget.TextView;
@@ -47,13 +47,13 @@
* @see TextKeyKeyListenerTest
*/
public abstract class KeyListenerTestCase extends
- ActivityInstrumentationTestCase2<KeyListenerStubActivity> {
- protected KeyListenerStubActivity mActivity;
+ ActivityInstrumentationTestCase2<KeyListenerCtsActivity> {
+ protected KeyListenerCtsActivity mActivity;
protected Instrumentation mInstrumentation;
protected TextView mTextView;
public KeyListenerTestCase() {
- super("com.android.cts.stub", KeyListenerStubActivity.class);
+ super("com.android.cts.text", KeyListenerCtsActivity.class);
}
@Override
diff --git a/tests/tests/text/src/android/text/method/cts/LinkMovementMethodTest.java b/tests/tests/text/src/android/text/method/cts/LinkMovementMethodTest.java
index b67f313..336921a 100644
--- a/tests/tests/text/src/android/text/method/cts/LinkMovementMethodTest.java
+++ b/tests/tests/text/src/android/text/method/cts/LinkMovementMethodTest.java
@@ -42,7 +42,7 @@
* @see android.widget.cts.TextViewTest
*/
public class LinkMovementMethodTest extends
- ActivityInstrumentationTestCase2<StubActivity> {
+ ActivityInstrumentationTestCase2<CtsActivity> {
private static final String CONTENT = "clickable\nunclickable\nclickable";
private LinkMovementMethod mMethod;
@@ -56,7 +56,7 @@
private MockClickableSpan mClickable1;
public LinkMovementMethodTest() {
- super("com.android.cts.stub", StubActivity.class);
+ super("com.android.cts.text", CtsActivity.class);
}
@Override
diff --git a/tests/tests/text/src/android/text/method/cts/PasswordTransformationMethodTest.java b/tests/tests/text/src/android/text/method/cts/PasswordTransformationMethodTest.java
index 471f67a..4262a31 100644
--- a/tests/tests/text/src/android/text/method/cts/PasswordTransformationMethodTest.java
+++ b/tests/tests/text/src/android/text/method/cts/PasswordTransformationMethodTest.java
@@ -35,7 +35,7 @@
* Test {@link PasswordTransformationMethod}.
*/
public class PasswordTransformationMethodTest extends
- ActivityInstrumentationTestCase2<StubActivity> {
+ ActivityInstrumentationTestCase2<CtsActivity> {
private static final int EDIT_TXT_ID = 1;
/** original text */
@@ -49,7 +49,7 @@
private boolean isPasswordPrefSaved;
- private StubActivity mActivity;
+ private CtsActivity mActivity;
private MockPasswordTransformationMethod mMethod;
@@ -58,7 +58,7 @@
private CharSequence mTransformedText;
public PasswordTransformationMethodTest() {
- super("com.android.cts.stub", StubActivity.class);
+ super("com.android.cts.text", CtsActivity.class);
}
@Override
diff --git a/tests/tests/text/src/android/text/method/cts/ReplacementTransformationMethodTest.java b/tests/tests/text/src/android/text/method/cts/ReplacementTransformationMethodTest.java
index 3c05f30..dadce15 100644
--- a/tests/tests/text/src/android/text/method/cts/ReplacementTransformationMethodTest.java
+++ b/tests/tests/text/src/android/text/method/cts/ReplacementTransformationMethodTest.java
@@ -27,7 +27,7 @@
* Test {@link ReplacementTransformationMethod}.
*/
public class ReplacementTransformationMethodTest extends
- ActivityInstrumentationTestCase2<StubActivity> {
+ ActivityInstrumentationTestCase2<CtsActivity> {
private final char[] ORIGINAL = new char[] { '0', '1' };
private final char[] ORIGINAL_WITH_MORE_CHARS = new char[] { '0', '1', '2' };
private final char[] ORIGINAL_WITH_SAME_CHARS = new char[] { '0', '0' };
@@ -37,7 +37,7 @@
private EditText mEditText;
public ReplacementTransformationMethodTest() {
- super("com.android.cts.stub", StubActivity.class);
+ super("com.android.cts.text", CtsActivity.class);
}
@Override
diff --git a/tests/tests/text/src/android/text/method/cts/ScrollingMovementMethodTest.java b/tests/tests/text/src/android/text/method/cts/ScrollingMovementMethodTest.java
index b119c9d..c186cde 100644
--- a/tests/tests/text/src/android/text/method/cts/ScrollingMovementMethodTest.java
+++ b/tests/tests/text/src/android/text/method/cts/ScrollingMovementMethodTest.java
@@ -33,7 +33,7 @@
import android.view.ViewGroup.LayoutParams;
import android.widget.TextView;
import android.widget.TextView.BufferType;
-import android.widget.cts.WidgetTestUtils;
+import android.text.cts.WidgetTestUtils;
/**
* Test {@link ScrollingMovementMethod}. The class is an implementation of interface
@@ -43,7 +43,7 @@
*
* @see android.widget.cts.TextViewTest
*/
-public class ScrollingMovementMethodTest extends ActivityInstrumentationTestCase2<StubActivity> {
+public class ScrollingMovementMethodTest extends ActivityInstrumentationTestCase2<CtsActivity> {
private static final int LITTLE_SPACE = 20;
private static final String THREE_LINES_TEXT = "first line\nsecond line\nlast line";
@@ -55,7 +55,7 @@
private int mScaledTouchSlop;
public ScrollingMovementMethodTest() {
- super("com.android.cts.stub", StubActivity.class);
+ super("com.android.cts.text", CtsActivity.class);
}
@Override
diff --git a/tests/tests/text/src/android/text/method/cts/SingleLineTransformationMethodTest.java b/tests/tests/text/src/android/text/method/cts/SingleLineTransformationMethodTest.java
index 8d88a8a..460ce3d 100644
--- a/tests/tests/text/src/android/text/method/cts/SingleLineTransformationMethodTest.java
+++ b/tests/tests/text/src/android/text/method/cts/SingleLineTransformationMethodTest.java
@@ -26,9 +26,9 @@
* Test {@link SingleLineTransformationMethod}.
*/
public class SingleLineTransformationMethodTest
- extends ActivityInstrumentationTestCase2<StubActivity> {
+ extends ActivityInstrumentationTestCase2<CtsActivity> {
public SingleLineTransformationMethodTest() {
- super("com.android.cts.stub", StubActivity.class);
+ super("com.android.cts.text", CtsActivity.class);
}
public void testConstructor() {
diff --git a/tests/src/android/text/method/cts/TextMethodUtils.java b/tests/tests/text/src/android/text/method/cts/TextMethodUtils.java
similarity index 100%
rename from tests/src/android/text/method/cts/TextMethodUtils.java
rename to tests/tests/text/src/android/text/method/cts/TextMethodUtils.java
diff --git a/tests/tests/text/src/android/text/method/cts/TouchTest.java b/tests/tests/text/src/android/text/method/cts/TouchTest.java
index 58e889a..343847e 100644
--- a/tests/tests/text/src/android/text/method/cts/TouchTest.java
+++ b/tests/tests/text/src/android/text/method/cts/TouchTest.java
@@ -29,7 +29,7 @@
import android.view.MotionEvent;
import android.widget.TextView;
-public class TouchTest extends ActivityInstrumentationTestCase2<StubActivity> {
+public class TouchTest extends ActivityInstrumentationTestCase2<CtsActivity> {
private Activity mActivity;
private static final String LONG_TEXT = "Scrolls the specified widget to the specified " +
"coordinates, except constrains the X scrolling position to the horizontal regions " +
@@ -43,7 +43,7 @@
private boolean mReturnFromTouchEvent;
public TouchTest() {
- super("com.android.cts.stub", StubActivity.class);
+ super("com.android.cts.text", CtsActivity.class);
}
@Override
diff --git a/tests/tests/text/src/android/text/style/cts/DrawableMarginSpanTest.java b/tests/tests/text/src/android/text/style/cts/DrawableMarginSpanTest.java
index bea0944..3813a94 100644
--- a/tests/tests/text/src/android/text/style/cts/DrawableMarginSpanTest.java
+++ b/tests/tests/text/src/android/text/style/cts/DrawableMarginSpanTest.java
@@ -16,7 +16,7 @@
package android.text.style.cts;
-import com.android.cts.stub.R;
+import com.android.cts.text.R;
import android.graphics.Canvas;
diff --git a/tests/tests/text/src/android/text/style/cts/DynamicDrawableSpanTest.java b/tests/tests/text/src/android/text/style/cts/DynamicDrawableSpanTest.java
index 0cd072a..9723556 100644
--- a/tests/tests/text/src/android/text/style/cts/DynamicDrawableSpanTest.java
+++ b/tests/tests/text/src/android/text/style/cts/DynamicDrawableSpanTest.java
@@ -16,7 +16,7 @@
package android.text.style.cts;
-import com.android.cts.stub.R;
+import com.android.cts.text.R;
import android.graphics.Canvas;
diff --git a/tests/tests/text/src/android/text/style/cts/ImageSpanTest.java b/tests/tests/text/src/android/text/style/cts/ImageSpanTest.java
index 1499d62..a98c748 100644
--- a/tests/tests/text/src/android/text/style/cts/ImageSpanTest.java
+++ b/tests/tests/text/src/android/text/style/cts/ImageSpanTest.java
@@ -16,7 +16,7 @@
package android.text.style.cts;
-import com.android.cts.stub.R;
+import com.android.cts.text.R;
import android.content.Context;
@@ -27,7 +27,7 @@
import android.test.AndroidTestCase;
import android.text.style.DynamicDrawableSpan;
import android.text.style.ImageSpan;
-import android.widget.cts.WidgetTestUtils;
+import android.text.cts.WidgetTestUtils;
public class ImageSpanTest extends AndroidTestCase {
public void testConstructor() {
diff --git a/tests/src/android/text/style/cts/MockURLSpanTestActivity.java b/tests/tests/text/src/android/text/style/cts/MockURLSpanTestActivity.java
similarity index 96%
rename from tests/src/android/text/style/cts/MockURLSpanTestActivity.java
rename to tests/tests/text/src/android/text/style/cts/MockURLSpanTestActivity.java
index 1edb3e0..dbd154b 100644
--- a/tests/src/android/text/style/cts/MockURLSpanTestActivity.java
+++ b/tests/tests/text/src/android/text/style/cts/MockURLSpanTestActivity.java
@@ -16,7 +16,7 @@
package android.text.style.cts;
-import com.android.cts.stub.R;
+import com.android.cts.text.R;
import android.app.Activity;
import android.os.Bundle;
diff --git a/tests/src/android/text/style/cts/URLSpanStubActivity.java b/tests/tests/text/src/android/text/style/cts/URLSpanCtsActivity.java
similarity index 91%
rename from tests/src/android/text/style/cts/URLSpanStubActivity.java
rename to tests/tests/text/src/android/text/style/cts/URLSpanCtsActivity.java
index a09a83e..8d885bc 100644
--- a/tests/src/android/text/style/cts/URLSpanStubActivity.java
+++ b/tests/tests/text/src/android/text/style/cts/URLSpanCtsActivity.java
@@ -16,7 +16,7 @@
package android.text.style.cts;
-import com.android.cts.stub.R;
+import com.android.cts.text.R;
import android.app.Activity;
import android.os.Bundle;
@@ -24,7 +24,7 @@
/**
* A minimal application for {@link URLSpan} test.
*/
-public class URLSpanStubActivity extends Activity {
+public class URLSpanCtsActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
diff --git a/tests/tests/text/src/android/text/style/cts/URLSpanTest.java b/tests/tests/text/src/android/text/style/cts/URLSpanTest.java
index 3209b66..7cfe56e 100644
--- a/tests/tests/text/src/android/text/style/cts/URLSpanTest.java
+++ b/tests/tests/text/src/android/text/style/cts/URLSpanTest.java
@@ -16,7 +16,7 @@
package android.text.style.cts;
-import com.android.cts.stub.R;
+import com.android.cts.text.R;
import android.app.Activity;
@@ -27,13 +27,13 @@
import android.text.style.URLSpan;
import android.widget.TextView;
-public class URLSpanTest extends ActivityInstrumentationTestCase2<URLSpanStubActivity> {
+public class URLSpanTest extends ActivityInstrumentationTestCase2<URLSpanCtsActivity> {
// The scheme of TEST_URL must be "ctstest" to launch MockURLSpanTestActivity
private static final String TEST_URL = "ctstest://urlSpan/test";
private Activity mActivity;
public URLSpanTest() {
- super("com.android.cts.stub", URLSpanStubActivity.class);
+ super("com.android.cts.text", URLSpanCtsActivity.class);
}
@Override
diff --git a/tests/tests/tv/Android.mk b/tests/tests/tv/Android.mk
index 2ffe166..795b473 100644
--- a/tests/tests/tv/Android.mk
+++ b/tests/tests/tv/Android.mk
@@ -28,8 +28,6 @@
LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
-
LOCAL_SDK_VERSION := current
include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/ActivityTestBase.java b/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/ActivityTestBase.java
index c096c5d..9f9aa41 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/ActivityTestBase.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/ActivityTestBase.java
@@ -28,6 +28,7 @@
import android.util.Log;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
/**
@@ -42,6 +43,7 @@
public static final boolean USE_RS = false;
public static final int TEST_WIDTH = 180;
public static final int TEST_HEIGHT = 180; //The minimum height and width of a device
+ public static final int MAX_SCREEN_SHOTS = 100;
private int[] mHardwareArray = new int[TEST_HEIGHT * TEST_WIDTH];
private int[] mSoftwareArray = new int[TEST_HEIGHT * TEST_WIDTH];
@@ -114,7 +116,16 @@
}
public Bitmap takeScreenshot() {
- return getInstrumentation().getUiAutomation().takeScreenshot();
+ getInstrumentation().waitForIdleSync();
+ Bitmap bitmap1 = getInstrumentation().getUiAutomation().takeScreenshot();
+ Bitmap bitmap2;
+ int count = 0;
+ do {
+ bitmap2 = bitmap1;
+ bitmap1 = getInstrumentation().getUiAutomation().takeScreenshot();
+ count++;
+ } while (count < MAX_SCREEN_SHOTS && !Arrays.equals(bitmap2.mBuffer, bitmap1.mBuffer));
+ return bitmap1;
}
/**
diff --git a/tests/tests/util/Android.mk b/tests/tests/util/Android.mk
index 6ede3fb..75d23d7 100644
--- a/tests/tests/util/Android.mk
+++ b/tests/tests/util/Android.mk
@@ -27,8 +27,6 @@
LOCAL_PACKAGE_NAME := CtsUtilTestCases
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
-
LOCAL_SDK_VERSION := current
include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/util/AndroidManifest.xml b/tests/tests/util/AndroidManifest.xml
index ab417bd..e40087a 100644
--- a/tests/tests/util/AndroidManifest.xml
+++ b/tests/tests/util/AndroidManifest.xml
@@ -19,12 +19,13 @@
package="com.android.cts.util">
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+ <uses-permission android:name="android.permission.READ_LOGS" />
<application>
<uses-library android:name="android.test.runner" />
</application>
<instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
- android:targetPackage="com.android.cts.stub"
+ android:targetPackage="com.android.cts.util"
android:label="CTS tests of android.util">
<meta-data android:name="listener"
android:value="com.android.cts.runner.CtsTestRunListener" />
diff --git a/tests/tests/util/res/layout/xml_test.xml b/tests/tests/util/res/layout/xml_test.xml
new file mode 100644
index 0000000..4702281
--- /dev/null
+++ b/tests/tests/util/res/layout/xml_test.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+</LinearLayout>
diff --git a/tests/tests/util/src/android/util/cts/XmlTest.java b/tests/tests/util/src/android/util/cts/XmlTest.java
index 24f8c74..833bd3c 100644
--- a/tests/tests/util/src/android/util/cts/XmlTest.java
+++ b/tests/tests/util/src/android/util/cts/XmlTest.java
@@ -391,7 +391,7 @@
public void testAsAttributeSet() {
XmlResourceParser xp = getContext().getResources().getLayout(
- com.android.cts.stub.R.layout.xml_test);
+ com.android.cts.util.R.layout.xml_test);
int eventType = -1;
try {
eventType = xp.getEventType();
diff --git a/tests/tests/view/res/layout/textview_layout.xml b/tests/tests/view/res/layout/textview_layout.xml
index cb3a85e..c09b93a 100644
--- a/tests/tests/view/res/layout/textview_layout.xml
+++ b/tests/tests/view/res/layout/textview_layout.xml
@@ -36,6 +36,7 @@
android:typeface="normal"
android:textSize="20px"
android:textStyle="normal"
+ android:textAppearance="@null"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
diff --git a/tests/tests/view/src/android/view/cts/GestureDetectorTest.java b/tests/tests/view/src/android/view/cts/GestureDetectorTest.java
index 3d8ba05..c568cf1 100644
--- a/tests/tests/view/src/android/view/cts/GestureDetectorTest.java
+++ b/tests/tests/view/src/android/view/cts/GestureDetectorTest.java
@@ -18,7 +18,9 @@
import android.content.Context;
import android.os.Handler;
+import android.os.Looper;
import android.test.ActivityInstrumentationTestCase2;
+import android.test.UiThreadTest;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
@@ -50,11 +52,13 @@
mActivity.onSingleTapConfirmed = false;
}
+ @UiThreadTest
public void testConstructor() {
- new GestureDetector(mContext, new SimpleOnGestureListener(), new Handler());
+ new GestureDetector(
+ mContext, new SimpleOnGestureListener(), new Handler(Looper.getMainLooper()));
new GestureDetector(mContext, new SimpleOnGestureListener());
- new GestureDetector(new SimpleOnGestureListener(), new Handler());
+ new GestureDetector(new SimpleOnGestureListener(), new Handler(Looper.getMainLooper()));
new GestureDetector(new SimpleOnGestureListener());
try {
diff --git a/tests/tests/view/src/android/view/cts/SurfaceViewTest.java b/tests/tests/view/src/android/view/cts/SurfaceViewTest.java
index d3902bb..a84653d 100644
--- a/tests/tests/view/src/android/view/cts/SurfaceViewTest.java
+++ b/tests/tests/view/src/android/view/cts/SurfaceViewTest.java
@@ -55,6 +55,7 @@
mMockSurfaceView = activity.getSurfaceView();
}
+ @UiThreadTest
public void testConstructor() {
new SurfaceView(mContext);
new SurfaceView(mContext, null);
diff --git a/tests/tests/view/src/android/view/cts/WindowTest.java b/tests/tests/view/src/android/view/cts/WindowTest.java
index 9df13dc..ead4d5b 100644
--- a/tests/tests/view/src/android/view/cts/WindowTest.java
+++ b/tests/tests/view/src/android/view/cts/WindowTest.java
@@ -36,6 +36,7 @@
import android.os.Handler;
import android.os.SystemClock;
import android.test.ActivityInstrumentationTestCase2;
+import android.test.UiThreadTest;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.ActionMode;
@@ -68,6 +69,7 @@
private Context mContext;
private Instrumentation mInstrumentation;
private WindowCtsActivity mActivity;
+ private SurfaceView surfaceView;
private static final int VIEWGROUP_LAYOUT_HEIGHT = 100;
private static final int VIEWGROUP_LAYOUT_WIDTH = 200;
@@ -97,6 +99,7 @@
super.tearDown();
}
+ @UiThreadTest
public void testConstructor() throws Exception {
mWindow = new MockWindow(mContext);
assertSame(mContext, mWindow.getContext());
@@ -652,7 +655,13 @@
* Test setLocalFocus together with injectInputEvent.
*/
public void testSetLocalFocus() throws Throwable {
- final SurfaceView surfaceView = new SurfaceView(mContext);
+ runTestOnUiThread(new Runnable() {
+ public void run() {
+ surfaceView = new SurfaceView(mContext);
+ }
+ });
+ mInstrumentation.waitForIdleSync();
+
final Semaphore waitingSemaphore = new Semaphore(0);
surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
@@ -676,6 +685,7 @@
mWindow.setContentView(surfaceView);
}
});
+ mInstrumentation.waitForIdleSync();
assertTrue(waitingSemaphore.tryAcquire(5, TimeUnit.SECONDS));
assertNotNull(mVirtualDisplay);
assertNotNull(mPresentation);
diff --git a/tests/tests/webkit/Android.mk b/tests/tests/webkit/Android.mk
index a307f99..1d593df 100644
--- a/tests/tests/webkit/Android.mk
+++ b/tests/tests/webkit/Android.mk
@@ -23,14 +23,12 @@
LOCAL_JAVA_LIBRARIES := android.test.runner
-LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
+LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestserver ctstestrunner
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := CtsWebkitTestCases
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
-
# uncomment when dalvik.annotation.Test* are removed or part of SDK
#LOCAL_SDK_VERSION := current
diff --git a/tests/tests/webkit/AndroidManifest.xml b/tests/tests/webkit/AndroidManifest.xml
index 776f695..a5bc2bb 100644
--- a/tests/tests/webkit/AndroidManifest.xml
+++ b/tests/tests/webkit/AndroidManifest.xml
@@ -21,15 +21,45 @@
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
- <application>
+ <uses-permission android:name="android.permission.INTERNET" />
+ <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
+ <application android:maxRecents="1">
<provider android:name="android.webkit.cts.MockContentProvider"
android:exported="true"
android:authorities="android.webkit.cts.MockContentProvider" />
<uses-library android:name="android.test.runner" />
+
+ <activity android:name="android.webkit.cts.CookieSyncManagerCtsActivity"
+ android:label="CookieSyncManagerCtsActivity"
+ android:screenOrientation="nosensor">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.webkit.cts.WebViewCtsActivity"
+ android:label="WebViewCtsActivity"
+ android:screenOrientation="nosensor">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.webkit.cts.WebViewStartupCtsActivity"
+ android:label="WebViewStartupCtsActivity"
+ android:screenOrientation="nosensor">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
</application>
<instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
- android:targetPackage="com.android.cts.stub"
+ android:targetPackage="com.android.cts.webkit"
android:label="CTS tests of android.webkit">
<meta-data android:name="listener"
android:value="com.android.cts.runner.CtsTestRunListener" />
diff --git a/tests/assets/images/robot.png b/tests/tests/webkit/assets/images/robot.png
similarity index 100%
rename from tests/assets/images/robot.png
rename to tests/tests/webkit/assets/images/robot.png
Binary files differ
diff --git a/tests/tests/webkit/assets/images/tomato.png b/tests/tests/webkit/assets/images/tomato.png
new file mode 100644
index 0000000..44c590d
--- /dev/null
+++ b/tests/tests/webkit/assets/images/tomato.png
Binary files differ
diff --git a/tests/assets/webkit/blank_tag.html b/tests/tests/webkit/assets/webkit/blank_tag.html
similarity index 100%
rename from tests/assets/webkit/blank_tag.html
rename to tests/tests/webkit/assets/webkit/blank_tag.html
diff --git a/tests/assets/webkit/embedded_image.html b/tests/tests/webkit/assets/webkit/embedded_image.html
similarity index 100%
rename from tests/assets/webkit/embedded_image.html
rename to tests/tests/webkit/assets/webkit/embedded_image.html
diff --git a/tests/assets/webkit/favicon.png b/tests/tests/webkit/assets/webkit/favicon.png
similarity index 100%
rename from tests/assets/webkit/favicon.png
rename to tests/tests/webkit/assets/webkit/favicon.png
Binary files differ
diff --git a/tests/assets/webkit/fonts.html b/tests/tests/webkit/assets/webkit/fonts.html
similarity index 100%
rename from tests/assets/webkit/fonts.html
rename to tests/tests/webkit/assets/webkit/fonts.html
diff --git a/tests/assets/webkit/iframe_blank_tag.html b/tests/tests/webkit/assets/webkit/iframe_blank_tag.html
similarity index 100%
rename from tests/assets/webkit/iframe_blank_tag.html
rename to tests/tests/webkit/assets/webkit/iframe_blank_tag.html
diff --git a/tests/assets/webkit/javascript.html b/tests/tests/webkit/assets/webkit/javascript.html
similarity index 100%
rename from tests/assets/webkit/javascript.html
rename to tests/tests/webkit/assets/webkit/javascript.html
diff --git a/tests/assets/webkit/jsalert.html b/tests/tests/webkit/assets/webkit/jsalert.html
similarity index 100%
rename from tests/assets/webkit/jsalert.html
rename to tests/tests/webkit/assets/webkit/jsalert.html
diff --git a/tests/assets/webkit/jsconfirm.html b/tests/tests/webkit/assets/webkit/jsconfirm.html
similarity index 100%
rename from tests/assets/webkit/jsconfirm.html
rename to tests/tests/webkit/assets/webkit/jsconfirm.html
diff --git a/tests/assets/webkit/jsform.html b/tests/tests/webkit/assets/webkit/jsform.html
similarity index 100%
rename from tests/assets/webkit/jsform.html
rename to tests/tests/webkit/assets/webkit/jsform.html
diff --git a/tests/assets/webkit/jsprompt.html b/tests/tests/webkit/assets/webkit/jsprompt.html
similarity index 100%
rename from tests/assets/webkit/jsprompt.html
rename to tests/tests/webkit/assets/webkit/jsprompt.html
diff --git a/tests/assets/webkit/jsunload.html b/tests/tests/webkit/assets/webkit/jsunload.html
similarity index 100%
rename from tests/assets/webkit/jsunload.html
rename to tests/tests/webkit/assets/webkit/jsunload.html
diff --git a/tests/assets/webkit/jswindow.html b/tests/tests/webkit/assets/webkit/jswindow.html
similarity index 100%
rename from tests/assets/webkit/jswindow.html
rename to tests/tests/webkit/assets/webkit/jswindow.html
diff --git a/tests/assets/webkit/network_state.html b/tests/tests/webkit/assets/webkit/network_state.html
similarity index 100%
rename from tests/assets/webkit/network_state.html
rename to tests/tests/webkit/assets/webkit/network_state.html
diff --git a/tests/assets/webkit/page_with_link.html b/tests/tests/webkit/assets/webkit/page_with_link.html
similarity index 100%
rename from tests/assets/webkit/page_with_link.html
rename to tests/tests/webkit/assets/webkit/page_with_link.html
diff --git a/tests/assets/webkit/popup.html b/tests/tests/webkit/assets/webkit/popup.html
similarity index 100%
rename from tests/assets/webkit/popup.html
rename to tests/tests/webkit/assets/webkit/popup.html
diff --git a/tests/assets/webkit/popup_base.html b/tests/tests/webkit/assets/webkit/popup_base.html
similarity index 100%
rename from tests/assets/webkit/popup_base.html
rename to tests/tests/webkit/assets/webkit/popup_base.html
diff --git a/tests/assets/webkit/test_anchor.html b/tests/tests/webkit/assets/webkit/test_anchor.html
similarity index 100%
rename from tests/assets/webkit/test_anchor.html
rename to tests/tests/webkit/assets/webkit/test_anchor.html
diff --git a/tests/assets/webkit/test_blankPage.html b/tests/tests/webkit/assets/webkit/test_blankPage.html
similarity index 100%
rename from tests/assets/webkit/test_blankPage.html
rename to tests/tests/webkit/assets/webkit/test_blankPage.html
diff --git a/tests/assets/webkit/test_br_tag.html b/tests/tests/webkit/assets/webkit/test_br_tag.html
similarity index 100%
rename from tests/assets/webkit/test_br_tag.html
rename to tests/tests/webkit/assets/webkit/test_br_tag.html
diff --git a/tests/assets/webkit/test_databaseaccess.html b/tests/tests/webkit/assets/webkit/test_databaseaccess.html
similarity index 100%
rename from tests/assets/webkit/test_databaseaccess.html
rename to tests/tests/webkit/assets/webkit/test_databaseaccess.html
diff --git a/tests/assets/webkit/test_favicon.html b/tests/tests/webkit/assets/webkit/test_favicon.html
similarity index 100%
rename from tests/assets/webkit/test_favicon.html
rename to tests/tests/webkit/assets/webkit/test_favicon.html
diff --git a/tests/assets/webkit/test_firstPage.html b/tests/tests/webkit/assets/webkit/test_firstPage.html
similarity index 100%
rename from tests/assets/webkit/test_firstPage.html
rename to tests/tests/webkit/assets/webkit/test_firstPage.html
diff --git a/tests/assets/webkit/test_hello_world.html b/tests/tests/webkit/assets/webkit/test_hello_world.html
similarity index 100%
rename from tests/assets/webkit/test_hello_world.html
rename to tests/tests/webkit/assets/webkit/test_hello_world.html
diff --git a/tests/assets/webkit/test_iframeaccess.html b/tests/tests/webkit/assets/webkit/test_iframeaccess.html
similarity index 100%
rename from tests/assets/webkit/test_iframeaccess.html
rename to tests/tests/webkit/assets/webkit/test_iframeaccess.html
diff --git a/tests/assets/webkit/test_imageaccess.html b/tests/tests/webkit/assets/webkit/test_imageaccess.html
similarity index 100%
rename from tests/assets/webkit/test_imageaccess.html
rename to tests/tests/webkit/assets/webkit/test_imageaccess.html
diff --git a/tests/assets/webkit/test_jsInterface.html b/tests/tests/webkit/assets/webkit/test_jsInterface.html
similarity index 100%
rename from tests/assets/webkit/test_jsInterface.html
rename to tests/tests/webkit/assets/webkit/test_jsInterface.html
diff --git a/tests/assets/webkit/test_queryparam.html b/tests/tests/webkit/assets/webkit/test_queryparam.html
similarity index 100%
rename from tests/assets/webkit/test_queryparam.html
rename to tests/tests/webkit/assets/webkit/test_queryparam.html
diff --git a/tests/assets/webkit/test_secondPage.html b/tests/tests/webkit/assets/webkit/test_secondPage.html
similarity index 100%
rename from tests/assets/webkit/test_secondPage.html
rename to tests/tests/webkit/assets/webkit/test_secondPage.html
diff --git a/tests/assets/webkit/test_stop_loading.html b/tests/tests/webkit/assets/webkit/test_stop_loading.html
similarity index 100%
rename from tests/assets/webkit/test_stop_loading.html
rename to tests/tests/webkit/assets/webkit/test_stop_loading.html
diff --git a/tests/assets/webkit/test_thirdPage.html b/tests/tests/webkit/assets/webkit/test_thirdPage.html
similarity index 100%
rename from tests/assets/webkit/test_thirdPage.html
rename to tests/tests/webkit/assets/webkit/test_thirdPage.html
diff --git a/tests/assets/webkit/test_timer.html b/tests/tests/webkit/assets/webkit/test_timer.html
similarity index 100%
rename from tests/assets/webkit/test_timer.html
rename to tests/tests/webkit/assets/webkit/test_timer.html
diff --git a/tests/src/android/widget/cts/ListViewStubActivity.java b/tests/tests/webkit/res/layout/webview_layout.xml
similarity index 60%
copy from tests/src/android/widget/cts/ListViewStubActivity.java
copy to tests/tests/webkit/res/layout/webview_layout.xml
index 77c3e5e..7a0ed0d 100644
--- a/tests/src/android/widget/cts/ListViewStubActivity.java
+++ b/tests/tests/webkit/res/layout/webview_layout.xml
@@ -1,4 +1,5 @@
-/*
+<?xml version="1.0" encoding="utf-8"?>
+<!--
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -12,19 +13,13 @@
* 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.
- */
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
-package android.widget.cts;
-
-import com.android.cts.stub.R;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class ListViewStubActivity extends Activity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.listview_layout);
- }
-}
+ <WebView android:id="@+id/web_page"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+</LinearLayout>
diff --git a/tests/tests/webkit/src/android/webkit/cts/CookieManagerTest.java b/tests/tests/webkit/src/android/webkit/cts/CookieManagerTest.java
index 6de18ed..9db7c21 100644
--- a/tests/tests/webkit/src/android/webkit/cts/CookieManagerTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/CookieManagerTest.java
@@ -32,7 +32,7 @@
import java.util.regex.Pattern;
public class CookieManagerTest extends
- ActivityInstrumentationTestCase2<CookieSyncManagerStubActivity> {
+ ActivityInstrumentationTestCase2<CookieSyncManagerCtsActivity> {
private static final int TEST_TIMEOUT = 5000;
@@ -41,7 +41,7 @@
private WebViewOnUiThread mOnUiThread;
public CookieManagerTest() {
- super("com.android.cts.stub", CookieSyncManagerStubActivity.class);
+ super("com.android.cts.webkit", CookieSyncManagerCtsActivity.class);
}
@Override
diff --git a/tests/src/android/webkit/cts/CookieSyncManagerStubActivity.java b/tests/tests/webkit/src/android/webkit/cts/CookieSyncManagerCtsActivity.java
similarity index 96%
rename from tests/src/android/webkit/cts/CookieSyncManagerStubActivity.java
rename to tests/tests/webkit/src/android/webkit/cts/CookieSyncManagerCtsActivity.java
index a5ac6ec..51eeed3 100644
--- a/tests/src/android/webkit/cts/CookieSyncManagerStubActivity.java
+++ b/tests/tests/webkit/src/android/webkit/cts/CookieSyncManagerCtsActivity.java
@@ -21,7 +21,7 @@
import android.webkit.CookieSyncManager;
import android.webkit.WebView;
-public class CookieSyncManagerStubActivity extends Activity {
+public class CookieSyncManagerCtsActivity extends Activity {
private WebView mWebView;
@Override
diff --git a/tests/tests/webkit/src/android/webkit/cts/CookieTest.java b/tests/tests/webkit/src/android/webkit/cts/CookieTest.java
index 7f3b183..bc5e3b0 100644
--- a/tests/tests/webkit/src/android/webkit/cts/CookieTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/CookieTest.java
@@ -23,13 +23,13 @@
/**
* Original framework tests for CookieManager
*/
-public class CookieTest extends ActivityInstrumentationTestCase2<CookieSyncManagerStubActivity> {
+public class CookieTest extends ActivityInstrumentationTestCase2<CookieSyncManagerCtsActivity> {
private CookieManager mCookieManager;
private static final long WAIT_TIME = 50;
public CookieTest() {
- super("com.android.cts.stub", CookieSyncManagerStubActivity.class);
+ super("com.android.cts.webkit", CookieSyncManagerCtsActivity.class);
}
@Override
diff --git a/tests/tests/webkit/src/android/webkit/cts/GeolocationTest.java b/tests/tests/webkit/src/android/webkit/cts/GeolocationTest.java
index 8ab9eb6..754af37 100644
--- a/tests/tests/webkit/src/android/webkit/cts/GeolocationTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/GeolocationTest.java
@@ -52,7 +52,7 @@
import junit.framework.Assert;
-public class GeolocationTest extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
+public class GeolocationTest extends ActivityInstrumentationTestCase2<WebViewCtsActivity> {
// TODO Write additional tests to cover:
// - test that the errors are correct
@@ -108,7 +108,7 @@
private List<String> mProviders;
public GeolocationTest() throws Exception {
- super("com.android.cts.stub", WebViewStubActivity.class);
+ super("com.android.cts.webkit", WebViewCtsActivity.class);
}
// Both this test and WebViewOnUiThread need to override some of the methods on WebViewClient,
diff --git a/tests/tests/webkit/src/android/webkit/cts/HttpAuthHandlerTest.java b/tests/tests/webkit/src/android/webkit/cts/HttpAuthHandlerTest.java
index b078c7a..fbda04b 100644
--- a/tests/tests/webkit/src/android/webkit/cts/HttpAuthHandlerTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/HttpAuthHandlerTest.java
@@ -24,7 +24,7 @@
import org.apache.http.HttpStatus;
-public class HttpAuthHandlerTest extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
+public class HttpAuthHandlerTest extends ActivityInstrumentationTestCase2<WebViewCtsActivity> {
private static final long TIMEOUT = 10000;
@@ -37,7 +37,7 @@
private WebViewOnUiThread mOnUiThread;
public HttpAuthHandlerTest() {
- super("com.android.cts.stub", WebViewStubActivity.class);
+ super("com.android.cts.webkit", WebViewCtsActivity.class);
}
@Override
diff --git a/tests/tests/webkit/src/android/webkit/cts/NullWebViewUtils.java b/tests/tests/webkit/src/android/webkit/cts/NullWebViewUtils.java
new file mode 100644
index 0000000..c52219f
--- /dev/null
+++ b/tests/tests/webkit/src/android/webkit/cts/NullWebViewUtils.java
@@ -0,0 +1,88 @@
+/*
+ * 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 android.webkit.cts;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+
+/**
+ * Utilities to enable the android.webkit.* CTS tests (and others that rely on a functioning
+ * android.webkit.WebView implementation) to determine whether a functioning WebView is present
+ * on the device or not.
+ *
+ * Test cases that require android.webkit.* classes should wrap their first usage of WebView in a
+ * try catch block, and pass any exception that is thrown to
+ * NullWebViewUtils.determineIfWebViewAvailable. The return value of
+ * NullWebViewUtils.isWebViewAvailable will then determine if the test should expect to be able to
+ * use a WebView.
+ */
+public class NullWebViewUtils {
+
+ private static boolean sWebViewUnavailable;
+
+ /**
+ * @param context Current Activity context, used to query the PackageManager.
+ * @param t An exception thrown by trying to invoke android.webkit.* APIs.
+ */
+ public static void determineIfWebViewAvailable(Context context, Throwable t) {
+ sWebViewUnavailable = !hasWebViewFeature(context) && checkCauseWasUnsupportedOperation(t);
+ }
+
+ /**
+ * After calling determineIfWebViewAvailable, this returns whether a WebView is available on the
+ * device and wheter the test can rely on it.
+ * @return True iff. PackageManager determined that there is no WebView on the device and the
+ * exception thrown from android.webkit.* was UnsupportedOperationException.
+ */
+ public static boolean isWebViewAvailable() {
+ return !sWebViewUnavailable;
+ }
+
+ private static boolean hasWebViewFeature(Context context) {
+ // Query the system property that determins if there is a functional WebView on the device.
+ PackageManager pm = context.getPackageManager();
+ return pm.hasSystemFeature(PackageManager.FEATURE_WEBVIEW);
+ }
+
+ private static boolean checkCauseWasUnsupportedOperation(Throwable t) {
+ if (t == null) return false;
+ while (t.getCause() != null) {
+ t = t.getCause();
+ }
+ return t instanceof UnsupportedOperationException;
+ }
+
+ /**
+ * Some CTS tests (by design) first use android.webkit.* from a background thread. This helper
+ * allows the test to catch the UnsupportedOperationException from that background thread, and
+ * then query the result from the test main thread.
+ */
+ public static class NullWebViewFromThreadExceptionHandler
+ implements Thread.UncaughtExceptionHandler {
+ private Throwable mPendingException;
+
+ @Override
+ public void uncaughtException(Thread t, Throwable e) {
+ mPendingException = e;
+ }
+
+ public boolean isWebViewAvailable(Context context) {
+ return hasWebViewFeature(context) ||
+ !checkCauseWasUnsupportedOperation(mPendingException);
+ }
+ }
+}
\ No newline at end of file
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebBackForwardListTest.java b/tests/tests/webkit/src/android/webkit/cts/WebBackForwardListTest.java
index 71893f4..21a5b98 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebBackForwardListTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebBackForwardListTest.java
@@ -23,14 +23,14 @@
import android.webkit.WebView;
-public class WebBackForwardListTest extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
+public class WebBackForwardListTest extends ActivityInstrumentationTestCase2<WebViewCtsActivity> {
private static final int TEST_TIMEOUT = 10000;
private WebViewOnUiThread mOnUiThread;
public WebBackForwardListTest() {
- super("com.android.cts.stub", WebViewStubActivity.class);
+ super("com.android.cts.webkit", WebViewCtsActivity.class);
}
@Override
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebChromeClientTest.java b/tests/tests/webkit/src/android/webkit/cts/WebChromeClientTest.java
index fca14e2..6a94a99 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebChromeClientTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebChromeClientTest.java
@@ -28,7 +28,7 @@
import android.webkit.WebView;
import android.webkit.cts.WebViewOnUiThread.WaitForProgressClient;
-public class WebChromeClientTest extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
+public class WebChromeClientTest extends ActivityInstrumentationTestCase2<WebViewCtsActivity> {
private static final long TEST_TIMEOUT = 5000L;
private CtsTestServer mWebServer;
@@ -38,7 +38,7 @@
private boolean mBlockWindowCreationAsync;
public WebChromeClientTest() {
- super(WebViewStubActivity.class);
+ super(WebViewCtsActivity.class);
}
@Override
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebHistoryItemTest.java b/tests/tests/webkit/src/android/webkit/cts/WebHistoryItemTest.java
index 7d276e9..d4f326b 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebHistoryItemTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebHistoryItemTest.java
@@ -25,7 +25,7 @@
import android.webkit.WebIconDatabase;
import android.webkit.WebView;
-public class WebHistoryItemTest extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
+public class WebHistoryItemTest extends ActivityInstrumentationTestCase2<WebViewCtsActivity> {
private final static long TEST_TIMEOUT = 10000;
private CtsTestServer mWebServer;
private WebViewOnUiThread mOnUiThread;
@@ -47,7 +47,7 @@
};
public WebHistoryItemTest() {
- super("com.android.cts.stub", WebViewStubActivity.class);
+ super("com.android.cts.webkit", WebViewCtsActivity.class);
}
@Override
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java b/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java
index 1515a8a..3e7a592 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java
@@ -40,7 +40,7 @@
/**
* Tests for {@link android.webkit.WebSettings}
*/
-public class WebSettingsTest extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
+public class WebSettingsTest extends ActivityInstrumentationTestCase2<WebViewCtsActivity> {
private static final int WEBVIEW_TIMEOUT = 5000;
private static final String LOG_TAG = "WebSettingsTest";
@@ -63,7 +63,7 @@
private Context mContext;
public WebSettingsTest() {
- super("com.android.cts.stub", WebViewStubActivity.class);
+ super("com.android.cts.webkit", WebViewCtsActivity.class);
}
@Override
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java b/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java
index a8044d2..2430c8c 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java
@@ -38,7 +38,7 @@
import java.util.HashMap;
import java.util.Map;
-public class WebViewClientTest extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
+public class WebViewClientTest extends ActivityInstrumentationTestCase2<WebViewCtsActivity> {
private static final long TEST_TIMEOUT = 5000;
private static final String TEST_URL = "http://foo.com/";
@@ -46,13 +46,13 @@
private CtsTestServer mWebServer;
public WebViewClientTest() {
- super("com.android.cts.stub", WebViewStubActivity.class);
+ super("com.android.cts.webkit", WebViewCtsActivity.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
- final WebViewStubActivity activity = getActivity();
+ final WebViewCtsActivity activity = getActivity();
WebView webview = activity.getWebView();
if (webview != null) {
new PollingCheck(TEST_TIMEOUT) {
@@ -373,7 +373,7 @@
assertEquals(view, mOnUiThread.getWebView());
// Save the main page request; discard any other requests (e.g. for favicon.ico)
- if (request.getUrl().toString().contains(mainPath)) {
+ if (request.getUrl().getPath().equals(mainPath)) {
assertNull(interceptRequest);
interceptRequest = request;
}
diff --git a/tests/src/android/webkit/cts/WebViewStubActivity.java b/tests/tests/webkit/src/android/webkit/cts/WebViewCtsActivity.java
similarity index 94%
rename from tests/src/android/webkit/cts/WebViewStubActivity.java
rename to tests/tests/webkit/src/android/webkit/cts/WebViewCtsActivity.java
index 62adc39..d809a42 100644
--- a/tests/src/android/webkit/cts/WebViewStubActivity.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewCtsActivity.java
@@ -16,7 +16,7 @@
package android.webkit.cts;
-import com.android.cts.stub.R;
+import com.android.cts.webkit.R;
import android.app.Activity;
import android.os.Bundle;
@@ -24,7 +24,7 @@
import android.view.ViewParent;
import android.webkit.WebView;
-public class WebViewStubActivity extends Activity {
+public class WebViewCtsActivity extends Activity {
private WebView mWebView;
@Override
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebViewOnUiThread.java b/tests/tests/webkit/src/android/webkit/cts/WebViewOnUiThread.java
new file mode 100644
index 0000000..9b2d803
--- /dev/null
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewOnUiThread.java
@@ -0,0 +1,1008 @@
+/*
+ * Copyright (C) 2011 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.webkit.cts;
+
+import android.cts.util.PollingCheck;
+import android.graphics.Bitmap;
+import android.graphics.Picture;
+import android.graphics.Rect;
+import android.os.Bundle;
+import android.os.Looper;
+import android.os.Message;
+import android.os.SystemClock;
+import android.print.PrintDocumentAdapter;
+import android.test.InstrumentationTestCase;
+import android.util.DisplayMetrics;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewParent;
+import android.webkit.DownloadListener;
+import android.webkit.CookieManager;
+import android.webkit.ValueCallback;
+import android.webkit.WebBackForwardList;
+import android.webkit.WebChromeClient;
+import android.webkit.WebSettings;
+import android.webkit.WebView.HitTestResult;
+import android.webkit.WebView.PictureListener;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+
+import junit.framework.Assert;
+
+import java.io.File;
+import java.util.concurrent.Callable;
+import java.util.Map;
+
+/**
+ * Many tests need to run WebView code in the UI thread. This class
+ * wraps a WebView so that calls are ensured to arrive on the UI thread.
+ *
+ * All methods may be run on either the UI thread or test thread.
+ */
+public class WebViewOnUiThread {
+ /**
+ * The maximum time, in milliseconds (10 seconds) to wait for a load
+ * to be triggered.
+ */
+ private static final long LOAD_TIMEOUT = 10000;
+
+ /**
+ * Set to true after onPageFinished is called.
+ */
+ private boolean mLoaded;
+
+ /**
+ * Set to true after onNewPicture is called. Reset when onPageStarted
+ * is called.
+ */
+ private boolean mNewPicture;
+
+ /**
+ * The progress, in percentage, of the page load. Valid values are between
+ * 0 and 100.
+ */
+ private int mProgress;
+
+ /**
+ * The test that this class is being used in. Used for runTestOnUiThread.
+ */
+ private InstrumentationTestCase mTest;
+
+ /**
+ * The WebView that calls will be made on.
+ */
+ private WebView mWebView;
+
+ /**
+ * Initializes the webView with a WebViewClient, WebChromeClient,
+ * and PictureListener to prepare for loadUrlAndWaitForCompletion.
+ *
+ * A new WebViewOnUiThread should be called during setUp so as to
+ * reinitialize between calls.
+ *
+ * @param test The test in which this is being run.
+ * @param webView The webView that the methods should call.
+ * @see loadUrlAndWaitForCompletion
+ */
+ public WebViewOnUiThread(InstrumentationTestCase test, WebView webView) {
+ mTest = test;
+ mWebView = webView;
+ final WebViewClient webViewClient = new WaitForLoadedClient(this);
+ final WebChromeClient webChromeClient = new WaitForProgressClient(this);
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.setWebViewClient(webViewClient);
+ mWebView.setWebChromeClient(webChromeClient);
+ mWebView.setPictureListener(new WaitForNewPicture());
+ }
+ });
+ }
+
+ /**
+ * Called after a test is complete and the WebView should be disengaged from
+ * the tests.
+ */
+ public void cleanUp() {
+ clearHistory();
+ clearCache(true);
+ setPictureListener(null);
+ setWebChromeClient(null);
+ setWebViewClient(null);
+ }
+
+ /**
+ * Called from WaitForNewPicture, this is used to indicate that
+ * the page has been drawn.
+ */
+ synchronized public void onNewPicture() {
+ mNewPicture = true;
+ this.notifyAll();
+ }
+
+ /**
+ * Called from WaitForLoadedClient, this is used to clear the picture
+ * draw state so that draws before the URL begins loading don't count.
+ */
+ synchronized public void onPageStarted() {
+ mNewPicture = false; // Earlier paints won't count.
+ }
+
+ /**
+ * Called from WaitForLoadedClient, this is used to indicate that
+ * the page is loaded, but not drawn yet.
+ */
+ synchronized public void onPageFinished() {
+ mLoaded = true;
+ this.notifyAll();
+ }
+
+ /**
+ * Called from the WebChrome client, this sets the current progress
+ * for a page.
+ * @param progress The progress made so far between 0 and 100.
+ */
+ synchronized public void onProgressChanged(int progress) {
+ mProgress = progress;
+ this.notifyAll();
+ }
+
+ public void setWebViewClient(final WebViewClient webViewClient) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.setWebViewClient(webViewClient);
+ }
+ });
+ }
+
+ public void setWebChromeClient(final WebChromeClient webChromeClient) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.setWebChromeClient(webChromeClient);
+ }
+ });
+ }
+
+ public void setPictureListener(final PictureListener pictureListener) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.setPictureListener(pictureListener);
+ }
+ });
+ }
+
+ public void setNetworkAvailable(final boolean available) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.setNetworkAvailable(available);
+ }
+ });
+ }
+
+ public void setDownloadListener(final DownloadListener listener) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.setDownloadListener(listener);
+ }
+ });
+ }
+
+ public void setBackgroundColor(final int color) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.setBackgroundColor(color);
+ }
+ });
+ }
+
+ public void clearCache(final boolean includeDiskFiles) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.clearCache(includeDiskFiles);
+ }
+ });
+ }
+
+ public void clearHistory() {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.clearHistory();
+ }
+ });
+ }
+
+ public void requestFocus() {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.requestFocus();
+ }
+ });
+ }
+
+ public boolean canZoomIn() {
+ return getValue(new ValueGetter<Boolean>() {
+ @Override
+ public Boolean capture() {
+ return mWebView.canZoomIn();
+ }
+ });
+ }
+
+ public boolean canZoomOut() {
+ return getValue(new ValueGetter<Boolean>() {
+ @Override
+ public Boolean capture() {
+ return mWebView.canZoomOut();
+ }
+ });
+ }
+
+ public boolean zoomIn() {
+ return getValue(new ValueGetter<Boolean>() {
+ @Override
+ public Boolean capture() {
+ return mWebView.zoomIn();
+ }
+ });
+ }
+
+ public boolean zoomOut() {
+ return getValue(new ValueGetter<Boolean>() {
+ @Override
+ public Boolean capture() {
+ return mWebView.zoomOut();
+ }
+ });
+ }
+
+ public void zoomBy(final float zoomFactor) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.zoomBy(zoomFactor);
+ }
+ });
+ }
+
+ public void setFindListener(final WebView.FindListener listener) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.setFindListener(listener);
+ }
+ });
+ }
+
+ public void removeJavascriptInterface(final String interfaceName) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.removeJavascriptInterface(interfaceName);
+ }
+ });
+ }
+
+ public void addJavascriptInterface(final Object object, final String name) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.addJavascriptInterface(object, name);
+ }
+ });
+ }
+
+ public void flingScroll(final int vx, final int vy) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.flingScroll(vx, vy);
+ }
+ });
+ }
+
+ public void requestFocusNodeHref(final Message hrefMsg) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.requestFocusNodeHref(hrefMsg);
+ }
+ });
+ }
+
+ public void requestImageRef(final Message msg) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.requestImageRef(msg);
+ }
+ });
+ }
+
+ public void setInitialScale(final int scaleInPercent) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.setInitialScale(scaleInPercent);
+ }
+ });
+ }
+
+ public void clearSslPreferences() {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.clearSslPreferences();
+ }
+ });
+ }
+
+ public void clearClientCertPreferences(final Runnable onCleared) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ WebView.clearClientCertPreferences(onCleared);
+ }
+ });
+ }
+
+ public void resumeTimers() {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.resumeTimers();
+ }
+ });
+ }
+
+ public void findNext(final boolean forward) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.findNext(forward);
+ }
+ });
+ }
+
+ public void clearMatches() {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.clearMatches();
+ }
+ });
+ }
+
+ /**
+ * Calls loadUrl on the WebView and then waits onPageFinished,
+ * onNewPicture and onProgressChange to reach 100.
+ * Test fails if the load timeout elapses.
+ * @param url The URL to load.
+ */
+ public void loadUrlAndWaitForCompletion(final String url) {
+ callAndWait(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.loadUrl(url);
+ }
+ });
+ }
+
+ /**
+ * Calls loadUrl on the WebView and then waits onPageFinished,
+ * onNewPicture and onProgressChange to reach 100.
+ * Test fails if the load timeout elapses.
+ * @param url The URL to load.
+ * @param extraHeaders The additional headers to be used in the HTTP request.
+ */
+ public void loadUrlAndWaitForCompletion(final String url,
+ final Map<String, String> extraHeaders) {
+ callAndWait(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.loadUrl(url, extraHeaders);
+ }
+ });
+ }
+
+ public void loadUrl(final String url) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.loadUrl(url);
+ }
+ });
+ }
+
+ public void stopLoading() {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.stopLoading();
+ }
+ });
+ }
+
+ public void postUrlAndWaitForCompletion(final String url, final byte[] postData) {
+ callAndWait(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.postUrl(url, postData);
+ }
+ });
+ }
+
+ public void loadDataAndWaitForCompletion(final String data,
+ final String mimeType, final String encoding) {
+ callAndWait(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.loadData(data, mimeType, encoding);
+ }
+ });
+ }
+
+ public void loadDataWithBaseURLAndWaitForCompletion(final String baseUrl,
+ final String data, final String mimeType, final String encoding,
+ final String historyUrl) {
+ callAndWait(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.loadDataWithBaseURL(baseUrl, data, mimeType, encoding,
+ historyUrl);
+ }
+ });
+ }
+
+ /**
+ * Reloads a page and waits for it to complete reloading. Use reload
+ * if it is a form resubmission and the onFormResubmission responds
+ * by telling WebView not to resubmit it.
+ */
+ public void reloadAndWaitForCompletion() {
+ callAndWait(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.reload();
+ }
+ });
+ }
+
+ /**
+ * Reload the previous URL. Use reloadAndWaitForCompletion unless
+ * it is a form resubmission and the onFormResubmission responds
+ * by telling WebView not to resubmit it.
+ */
+ public void reload() {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.reload();
+ }
+ });
+ }
+
+ /**
+ * Use this only when JavaScript causes a page load to wait for the
+ * page load to complete. Otherwise use loadUrlAndWaitForCompletion or
+ * similar functions.
+ */
+ public void waitForLoadCompletion() {
+ waitForCriteria(LOAD_TIMEOUT,
+ new Callable<Boolean>() {
+ @Override
+ public Boolean call() {
+ return isLoaded();
+ }
+ });
+ clearLoad();
+ }
+
+ private void waitForCriteria(long timeout, Callable<Boolean> doneCriteria) {
+ if (isUiThread()) {
+ waitOnUiThread(timeout, doneCriteria);
+ } else {
+ waitOnTestThread(timeout, doneCriteria);
+ }
+ }
+
+ public String getTitle() {
+ return getValue(new ValueGetter<String>() {
+ @Override
+ public String capture() {
+ return mWebView.getTitle();
+ }
+ });
+ }
+
+ public WebSettings getSettings() {
+ return getValue(new ValueGetter<WebSettings>() {
+ @Override
+ public WebSettings capture() {
+ return mWebView.getSettings();
+ }
+ });
+ }
+
+ public WebBackForwardList copyBackForwardList() {
+ return getValue(new ValueGetter<WebBackForwardList>() {
+ @Override
+ public WebBackForwardList capture() {
+ return mWebView.copyBackForwardList();
+ }
+ });
+ }
+
+ public Bitmap getFavicon() {
+ return getValue(new ValueGetter<Bitmap>() {
+ @Override
+ public Bitmap capture() {
+ return mWebView.getFavicon();
+ }
+ });
+ }
+
+ public String getUrl() {
+ return getValue(new ValueGetter<String>() {
+ @Override
+ public String capture() {
+ return mWebView.getUrl();
+ }
+ });
+ }
+
+ public int getProgress() {
+ return getValue(new ValueGetter<Integer>() {
+ @Override
+ public Integer capture() {
+ return mWebView.getProgress();
+ }
+ });
+ }
+
+ public int getHeight() {
+ return getValue(new ValueGetter<Integer>() {
+ @Override
+ public Integer capture() {
+ return mWebView.getHeight();
+ }
+ });
+ }
+
+ public int getContentHeight() {
+ return getValue(new ValueGetter<Integer>() {
+ @Override
+ public Integer capture() {
+ return mWebView.getContentHeight();
+ }
+ });
+ }
+
+ public boolean savePicture(final Bundle b, final File dest) {
+ return getValue(new ValueGetter<Boolean>() {
+ @Override
+ public Boolean capture() {
+ return mWebView.savePicture(b, dest);
+ }
+ });
+ }
+
+ public boolean pageUp(final boolean top) {
+ return getValue(new ValueGetter<Boolean>() {
+ @Override
+ public Boolean capture() {
+ return mWebView.pageUp(top);
+ }
+ });
+ }
+
+ public boolean pageDown(final boolean bottom) {
+ return getValue(new ValueGetter<Boolean>() {
+ @Override
+ public Boolean capture() {
+ return mWebView.pageDown(bottom);
+ }
+ });
+ }
+
+ public int[] getLocationOnScreen() {
+ final int[] location = new int[2];
+ return getValue(new ValueGetter<int[]>() {
+ @Override
+ public int[] capture() {
+ mWebView.getLocationOnScreen(location);
+ return location;
+ }
+ });
+ }
+
+ public float getScale() {
+ return getValue(new ValueGetter<Float>() {
+ @Override
+ public Float capture() {
+ return mWebView.getScale();
+ }
+ });
+ }
+
+ public boolean requestFocus(final int direction,
+ final Rect previouslyFocusedRect) {
+ return getValue(new ValueGetter<Boolean>() {
+ @Override
+ public Boolean capture() {
+ return mWebView.requestFocus(direction, previouslyFocusedRect);
+ }
+ });
+ }
+
+ public HitTestResult getHitTestResult() {
+ return getValue(new ValueGetter<HitTestResult>() {
+ @Override
+ public HitTestResult capture() {
+ return mWebView.getHitTestResult();
+ }
+ });
+ }
+
+ public int getScrollX() {
+ return getValue(new ValueGetter<Integer>() {
+ @Override
+ public Integer capture() {
+ return mWebView.getScrollX();
+ }
+ });
+ }
+
+ public int getScrollY() {
+ return getValue(new ValueGetter<Integer>() {
+ @Override
+ public Integer capture() {
+ return mWebView.getScrollY();
+ }
+ });
+ }
+
+ public final DisplayMetrics getDisplayMetrics() {
+ return getValue(new ValueGetter<DisplayMetrics>() {
+ @Override
+ public DisplayMetrics capture() {
+ return mWebView.getContext().getResources().getDisplayMetrics();
+ }
+ });
+ }
+
+ public boolean requestChildRectangleOnScreen(final View child,
+ final Rect rect,
+ final boolean immediate) {
+ return getValue(new ValueGetter<Boolean>() {
+ @Override
+ public Boolean capture() {
+ return mWebView.requestChildRectangleOnScreen(child, rect,
+ immediate);
+ }
+ });
+ }
+
+ public int findAll(final String find) {
+ return getValue(new ValueGetter<Integer>() {
+ @Override
+ public Integer capture() {
+ return mWebView.findAll(find);
+ }
+ });
+ }
+
+ public Picture capturePicture() {
+ return getValue(new ValueGetter<Picture>() {
+ @Override
+ public Picture capture() {
+ return mWebView.capturePicture();
+ }
+ });
+ }
+
+ public void evaluateJavascript(final String script, final ValueCallback<String> result) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.evaluateJavascript(script, result);
+ }
+ });
+ }
+
+ public void saveWebArchive(final String basename, final boolean autoname,
+ final ValueCallback<String> callback) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.saveWebArchive(basename, autoname, callback);
+ }
+ });
+ }
+
+ public WebView createWebView() {
+ return getValue(new ValueGetter<WebView>() {
+ @Override
+ public WebView capture() {
+ return new WebView(mWebView.getContext());
+ }
+ });
+ }
+
+ public PrintDocumentAdapter createPrintDocumentAdapter() {
+ return getValue(new ValueGetter<PrintDocumentAdapter>() {
+ @Override
+ public PrintDocumentAdapter capture() {
+ return mWebView.createPrintDocumentAdapter();
+ }
+ });
+ }
+
+ public void setLayoutHeightToMatchParent() {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ ViewParent parent = mWebView.getParent();
+ if (parent instanceof ViewGroup) {
+ ((ViewGroup) parent).getLayoutParams().height =
+ ViewGroup.LayoutParams.MATCH_PARENT;
+ }
+ mWebView.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT;
+ mWebView.requestLayout();
+ }
+ });
+ }
+
+ public void setAcceptThirdPartyCookies(final boolean accept) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ CookieManager.getInstance().setAcceptThirdPartyCookies(mWebView, accept);
+ }
+ });
+ }
+
+ public boolean acceptThirdPartyCookies() {
+ return getValue(new ValueGetter<Boolean>() {
+ @Override
+ public Boolean capture() {
+ return CookieManager.getInstance().acceptThirdPartyCookies(mWebView);
+ }
+ });
+ }
+
+ /**
+ * Helper for running code on the UI thread where an exception is
+ * a test failure. If this is already the UI thread then it runs
+ * the code immediately.
+ *
+ * @see runTestOnUiThread
+ * @param r The code to run in the UI thread
+ */
+ public void runOnUiThread(Runnable r) {
+ try {
+ if (isUiThread()) {
+ r.run();
+ } else {
+ mTest.runTestOnUiThread(r);
+ }
+ } catch (Throwable t) {
+ Assert.fail("Unexpected error while running on UI thread: "
+ + t.getMessage());
+ }
+ }
+
+ /**
+ * Accessor for underlying WebView.
+ * @return The WebView being wrapped by this class.
+ */
+ public WebView getWebView() {
+ return mWebView;
+ }
+
+ private<T> T getValue(ValueGetter<T> getter) {
+ runOnUiThread(getter);
+ return getter.getValue();
+ }
+
+ private abstract class ValueGetter<T> implements Runnable {
+ private T mValue;
+
+ @Override
+ public void run() {
+ mValue = capture();
+ }
+
+ protected abstract T capture();
+
+ public T getValue() {
+ return mValue;
+ }
+ }
+
+ /**
+ * Returns true if the current thread is the UI thread based on the
+ * Looper.
+ */
+ private static boolean isUiThread() {
+ return (Looper.myLooper() == Looper.getMainLooper());
+ }
+
+ /**
+ * @return Whether or not the load has finished.
+ */
+ private synchronized boolean isLoaded() {
+ return mLoaded && mNewPicture && mProgress == 100;
+ }
+
+ /**
+ * Makes a WebView call, waits for completion and then resets the
+ * load state in preparation for the next load call.
+ * @param call The call to make on the UI thread prior to waiting.
+ */
+ private void callAndWait(Runnable call) {
+ Assert.assertTrue("WebViewOnUiThread.load*AndWaitForCompletion calls "
+ + "may not be mixed with load* calls directly on WebView "
+ + "without calling waitForLoadCompletion after the load",
+ !isLoaded());
+ clearLoad(); // clear any extraneous signals from a previous load.
+ runOnUiThread(call);
+ waitForLoadCompletion();
+ }
+
+ /**
+ * Called whenever a load has been completed so that a subsequent call to
+ * waitForLoadCompletion doesn't return immediately.
+ */
+ synchronized private void clearLoad() {
+ mLoaded = false;
+ mNewPicture = false;
+ mProgress = 0;
+ }
+
+ /**
+ * Uses a polling mechanism, while pumping messages to check when the
+ * criteria is met.
+ */
+ private void waitOnUiThread(long timeout, final Callable<Boolean> doneCriteria) {
+ new PollingCheck(timeout) {
+ @Override
+ protected boolean check() {
+ pumpMessages();
+ try {
+ return doneCriteria.call();
+ } catch (Exception e) {
+ Assert.fail("Unexpected error while checking the criteria: "
+ + e.getMessage());
+ return true;
+ }
+ }
+ }.run();
+ }
+
+ /**
+ * Uses a wait/notify to check when the criteria is met.
+ */
+ private synchronized void waitOnTestThread(long timeout, Callable<Boolean> doneCriteria) {
+ try {
+ long waitEnd = SystemClock.uptimeMillis() + timeout;
+ long timeRemaining = timeout;
+ while (!doneCriteria.call() && timeRemaining > 0) {
+ this.wait(timeRemaining);
+ timeRemaining = waitEnd - SystemClock.uptimeMillis();
+ }
+ Assert.assertTrue("Action failed to complete before timeout", doneCriteria.call());
+ } catch (InterruptedException e) {
+ // We'll just drop out of the loop and fail
+ } catch (Exception e) {
+ Assert.fail("Unexpected error while checking the criteria: "
+ + e.getMessage());
+ }
+ }
+
+ /**
+ * Pumps all currently-queued messages in the UI thread and then exits.
+ * This is useful to force processing while running tests in the UI thread.
+ */
+ private void pumpMessages() {
+ class ExitLoopException extends RuntimeException {
+ }
+
+ // Force loop to exit when processing this. Loop.quit() doesn't
+ // work because this is the main Loop.
+ mWebView.getHandler().post(new Runnable() {
+ @Override
+ public void run() {
+ throw new ExitLoopException(); // exit loop!
+ }
+ });
+ try {
+ // Pump messages until our message gets through.
+ Looper.loop();
+ } catch (ExitLoopException e) {
+ }
+ }
+
+ /**
+ * A WebChromeClient used to capture the onProgressChanged for use
+ * in waitFor functions. If a test must override the WebChromeClient,
+ * it can derive from this class or call onProgressChanged
+ * directly.
+ */
+ public static class WaitForProgressClient extends WebChromeClient {
+ private WebViewOnUiThread mOnUiThread;
+
+ public WaitForProgressClient(WebViewOnUiThread onUiThread) {
+ mOnUiThread = onUiThread;
+ }
+
+ @Override
+ public void onProgressChanged(WebView view, int newProgress) {
+ super.onProgressChanged(view, newProgress);
+ mOnUiThread.onProgressChanged(newProgress);
+ }
+ }
+
+ /**
+ * A WebViewClient that captures the onPageFinished for use in
+ * waitFor functions. Using initializeWebView sets the WaitForLoadedClient
+ * into the WebView. If a test needs to set a specific WebViewClient and
+ * needs the waitForCompletion capability then it should derive from
+ * WaitForLoadedClient or call WebViewOnUiThread.onPageFinished.
+ */
+ public static class WaitForLoadedClient extends WebViewClient {
+ private WebViewOnUiThread mOnUiThread;
+
+ public WaitForLoadedClient(WebViewOnUiThread onUiThread) {
+ mOnUiThread = onUiThread;
+ }
+
+ @Override
+ public void onPageFinished(WebView view, String url) {
+ super.onPageFinished(view, url);
+ mOnUiThread.onPageFinished();
+ }
+
+ @Override
+ public void onPageStarted(WebView view, String url, Bitmap favicon) {
+ super.onPageStarted(view, url, favicon);
+ mOnUiThread.onPageStarted();
+ }
+ }
+
+ /**
+ * A PictureListener that captures the onNewPicture for use in
+ * waitForLoadCompletion. Using initializeWebView sets the PictureListener
+ * into the WebView. If a test needs to set a specific PictureListener and
+ * needs the waitForCompletion capability then it should call
+ * WebViewOnUiThread.onNewPicture.
+ */
+ private class WaitForNewPicture implements PictureListener {
+ @Override
+ public void onNewPicture(WebView view, Picture picture) {
+ WebViewOnUiThread.this.onNewPicture();
+ }
+ }
+}
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebViewSslTest.java b/tests/tests/webkit/src/android/webkit/cts/WebViewSslTest.java
index 6798f89..8aa0145 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebViewSslTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewSslTest.java
@@ -46,7 +46,7 @@
import javax.net.ssl.X509TrustManager;
-public class WebViewSslTest extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
+public class WebViewSslTest extends ActivityInstrumentationTestCase2<WebViewCtsActivity> {
private static final String LOGTAG = "WebViewSslTest";
/**
@@ -428,13 +428,13 @@
private WebViewOnUiThread mOnUiThread;
public WebViewSslTest() {
- super("com.android.cts.stub", WebViewStubActivity.class);
+ super("com.android.cts.webkit", WebViewCtsActivity.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
- final WebViewStubActivity activity = getActivity();
+ final WebViewCtsActivity activity = getActivity();
mWebView = activity.getWebView();
if (mWebView != null) {
new PollingCheck() {
diff --git a/tests/src/android/webkit/cts/WebViewStartupStubActivity.java b/tests/tests/webkit/src/android/webkit/cts/WebViewStartupCtsActivity.java
similarity index 95%
rename from tests/src/android/webkit/cts/WebViewStartupStubActivity.java
rename to tests/tests/webkit/src/android/webkit/cts/WebViewStartupCtsActivity.java
index f902a48..933d0ed 100644
--- a/tests/src/android/webkit/cts/WebViewStartupStubActivity.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewStartupCtsActivity.java
@@ -21,7 +21,7 @@
import android.view.ViewGroup;
import android.webkit.WebView;
-public class WebViewStartupStubActivity extends Activity {
+public class WebViewStartupCtsActivity extends Activity {
private WebView mWebView;
@Override
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebViewStartupTest.java b/tests/tests/webkit/src/android/webkit/cts/WebViewStartupTest.java
index 56f8f61..8f4dcc2 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebViewStartupTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewStartupTest.java
@@ -30,15 +30,15 @@
import java.util.regex.Pattern;
public class WebViewStartupTest
- extends ActivityInstrumentationTestCase2<WebViewStartupStubActivity> {
+ extends ActivityInstrumentationTestCase2<WebViewStartupCtsActivity> {
private static final int TEST_TIMEOUT = 5000;
private static final String TAG = "WebViewStartupTest";
- private WebViewStartupStubActivity mActivity;
+ private WebViewStartupCtsActivity mActivity;
public WebViewStartupTest() {
- super("com.android.cts.stub", WebViewStartupStubActivity.class);
+ super("com.android.cts.webkit", WebViewStartupCtsActivity.class);
}
@Override
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java b/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
index 9216cc7..1d8a02a 100755
--- a/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
@@ -75,8 +75,12 @@
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
+import java.io.FileNotFoundException;
import java.io.IOException;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+
import java.util.Collections;
import java.util.Date;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -84,6 +88,7 @@
import java.util.concurrent.Callable;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.FutureTask;
+import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import java.util.HashMap;
import java.util.Map;
@@ -95,7 +100,7 @@
import org.apache.http.util.EncodingUtils;
import org.apache.http.util.EntityUtils;
-public class WebViewTest extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
+public class WebViewTest extends ActivityInstrumentationTestCase2<WebViewCtsActivity> {
public static final long TEST_TIMEOUT = 20000L;
private static final int INITIAL_PROGRESS = 100;
private static final String X_REQUESTED_WITH = "X-Requested-With";
@@ -122,13 +127,13 @@
private WebIconDatabase mIconDb;
public WebViewTest() {
- super("com.android.cts.stub", WebViewStubActivity.class);
+ super("com.android.cts.webkit", WebViewCtsActivity.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
- final WebViewStubActivity activity = getActivity();
+ final WebViewCtsActivity activity = getActivity();
mWebView = activity.getWebView();
if (mWebView != null) {
new PollingCheck() {
@@ -1290,6 +1295,94 @@
assertEquals("about:blank", mOnUiThread.getUrl());
}
+ private void deleteIfExists(File file) throws IOException {
+ if (file.exists()) {
+ file.delete();
+ }
+ }
+
+ private String readTextFile(File file, Charset encoding)
+ throws FileNotFoundException, IOException {
+ FileInputStream stream = new FileInputStream(file);
+ byte[] bytes = new byte[(int)file.length()];
+ stream.read(bytes);
+ stream.close();
+ return new String(bytes, encoding);
+ }
+
+ private void doSaveWebArchive(String baseName, boolean autoName, final String expectName)
+ throws Throwable {
+ final Semaphore saving = new Semaphore(0);
+ ValueCallback<String> callback = new ValueCallback<String>() {
+ @Override
+ public void onReceiveValue(String savedName) {
+ assertEquals(expectName, savedName);
+ saving.release();
+ }
+ };
+
+ mOnUiThread.saveWebArchive(baseName, autoName, callback);
+ assertTrue(saving.tryAcquire(TEST_TIMEOUT, TimeUnit.MILLISECONDS));
+ }
+
+ public void testSaveWebArchive() throws Throwable {
+ if (!NullWebViewUtils.isWebViewAvailable()) {
+ return;
+ }
+
+ final String testPage = "testSaveWebArchive test page";
+
+ File dir = getActivity().getFilesDir();
+ String dirStr = dir.toString();
+
+ File test = new File(dir, "test.mht");
+ deleteIfExists(test);
+ String testStr = test.getAbsolutePath();
+
+ File index = new File(dir, "index.mht");
+ deleteIfExists(index);
+ String indexStr = index.getAbsolutePath();
+
+ File index1 = new File(dir, "index-1.mht");
+ deleteIfExists(index1);
+ String index1Str = index1.getAbsolutePath();
+
+ mOnUiThread.loadDataAndWaitForCompletion(testPage, "text/html", "UTF-8");
+
+ try {
+ // Save test.mht
+ doSaveWebArchive(testStr, false, testStr);
+
+ // Check the contents of test.mht
+ String testMhtml = readTextFile(test, StandardCharsets.UTF_8);
+ assertTrue(testMhtml.contains(testPage));
+
+ // Save index.mht
+ doSaveWebArchive(dirStr + "/", true, indexStr);
+
+ // Check the contents of index.mht
+ String indexMhtml = readTextFile(index, StandardCharsets.UTF_8);
+ assertTrue(indexMhtml.contains(testPage));
+
+ // Save index-1.mht since index.mht already exists
+ doSaveWebArchive(dirStr + "/", true, index1Str);
+
+ // Check the contents of index-1.mht
+ String index1Mhtml = readTextFile(index1, StandardCharsets.UTF_8);
+ assertTrue(index1Mhtml.contains(testPage));
+
+ // Try a file in a bogus directory
+ doSaveWebArchive("/bogus/path/test.mht", false, null);
+
+ // Try a bogus directory
+ doSaveWebArchive("/bogus/path/", true, null);
+ } finally {
+ deleteIfExists(test);
+ deleteIfExists(index);
+ deleteIfExists(index1);
+ }
+ }
+
private static class WaitForFindResultsListener extends FutureTask<Integer>
implements WebView.FindListener {
public WaitForFindResultsListener() {
@@ -2275,7 +2368,7 @@
.setResolution(new PrintAttributes.Resolution("foo", "bar", 300, 300))
.setMinMargins(PrintAttributes.Margins.NO_MARGINS)
.build();
- final WebViewStubActivity activity = getActivity();
+ final WebViewCtsActivity activity = getActivity();
final File file = activity.getFileStreamPath(PRINTER_TEST_FILE);
final ParcelFileDescriptor descriptor = ParcelFileDescriptor.open(file,
ParcelFileDescriptor.parseMode("w"));
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebView_WebViewTransportTest.java b/tests/tests/webkit/src/android/webkit/cts/WebView_WebViewTransportTest.java
index cb72ef0..0c04706 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebView_WebViewTransportTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebView_WebViewTransportTest.java
@@ -23,10 +23,10 @@
public class WebView_WebViewTransportTest
- extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
+ extends ActivityInstrumentationTestCase2<WebViewCtsActivity> {
public WebView_WebViewTransportTest() {
- super("com.android.cts.stub", WebViewStubActivity.class);
+ super("com.android.cts.webkit", WebViewCtsActivity.class);
}
@UiThreadTest
diff --git a/tests/tests/widget/Android.mk b/tests/tests/widget/Android.mk
index f6be07d..505f82c 100644
--- a/tests/tests/widget/Android.mk
+++ b/tests/tests/widget/Android.mk
@@ -21,7 +21,7 @@
# and when built explicitly put it in the data partition
LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-LOCAL_STATIC_JAVA_LIBRARIES += android-common ctstestrunner
+LOCAL_STATIC_JAVA_LIBRARIES += android-common ctsdeviceutil ctstestrunner
LOCAL_JAVA_LIBRARIES := android.test.runner
@@ -29,6 +29,4 @@
LOCAL_PACKAGE_NAME := CtsWidgetTestCases
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
-
include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/widget/AndroidManifest.xml b/tests/tests/widget/AndroidManifest.xml
index 3c7fe5f..4b88c01 100644
--- a/tests/tests/widget/AndroidManifest.xml
+++ b/tests/tests/widget/AndroidManifest.xml
@@ -19,12 +19,335 @@
package="com.android.cts.widget">
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
- <application>
+ <application android:label="Android TestCase"
+ android:icon="@drawable/size_48x48"
+ android:maxRecents="1"
+ android:multiArch="true"
+ android:name="android.widget.cts.MockApplication"
+ android:supportsRtl="true">
+
<uses-library android:name="android.test.runner" />
+
+ <activity android:name="android.widget.cts.TwoLineListItemCtsActivity"
+ android:label="TwoLineListItemCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.widget.cts.ViewFlipperCtsActivity"
+ android:label="ViewFlipperCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.widget.cts.HorizontalScrollViewCtsActivity"
+ android:label="HorizontalScrollViewCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.widget.cts.SlidingDrawerCtsActivity"
+ android:label="SlidingDrawerCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.widget.cts.DigitalClockCtsActivity"
+ android:label="DigitalClockCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.widget.cts.ImageViewCtsActivity"
+ android:label="ImageViewCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.widget.cts.SeekBarCtsActivity"
+ android:label="SeekBarCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.widget.cts.ScrollViewCtsActivity"
+ android:label="ScrollViewCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.widget.cts.FrameLayoutCtsActivity"
+ android:label="FrameLayoutCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.widget.cts.LinearLayoutCtsActivity"
+ android:label="LinearLayoutCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.widget.cts.GridLayoutCtsActivity"
+ android:label="GridLayoutCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.widget.cts.LayoutDirectionCtsActivity"
+ android:label="LayoutDirectionCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.widget.cts.ProgressBarCtsActivity"
+ android:label="ProgressBarCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.widget.cts.ChronometerCtsActivity"
+ android:label="ChronometerCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN"/>
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.widget.cts.MediaControllerCtsActivity"
+ android:label="MediaControllerCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.widget.cts.RatingBarCtsActivity"
+ android:label="RatingBarCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.widget.cts.RemoteViewsCtsActivity"
+ android:label="RemoteViewsCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.widget.cts.ExpandableListSimple"
+ android:label="ExpandableListSimple">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.widget.cts.CtsActivity"
+ android:label="CtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.widget.cts.ExpandableListWithHeaders"
+ android:label="ExpandableListWithHeaders">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.widget.cts.GalleryCtsActivity"
+ android:label="GalleryCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.widget.cts.MockPopupWindowCtsActivity"
+ android:label="MockPopupWindowCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.widget.cts.ListViewCtsActivity"
+ android:label="ListViewCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.widget.cts.TextViewCtsActivity"
+ android:label="TextViewCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.widget.cts.DialerFilterCtsActivity"
+ android:label="DialerFilterCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.widget.cts.MultiAutoCompleteTextViewCtsActivity"
+ android:label="MultiAutoCompleteTextView Test Activity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.widget.cts.ViewGroupCtsActivity"
+ android:label="WidgetViewGroupCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.widget.cts.VideoViewCtsActivity"
+ android:configChanges="keyboardHidden|orientation|screenSize">
+ android:label="VideoViewCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.widget.cts.AutoCompleteCtsActivity"
+ android:label="AutoCompleteCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.widget.cts.ViewAnimatorCtsActivity" android:label="ViewAnimatorCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN"/>
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.widget.cts.GridViewCtsActivity"
+ android:label="GridViewCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.widget.cts.RelativeLayoutCtsActivity"
+ android:label="RelativeLayoutCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.widget.cts.FrameLayoutCtsActivity"
+ android:label="FrameLayoutCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.widget.cts.AdapterViewCtsActivity"
+ android:label="AdapterViewCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.widget.cts.CheckedTextViewCtsActivity"
+ android:label="CheckedTextViewCtsActivity"/>
+
+ <activity android:name="android.widget.cts.TableCtsActivity"
+ android:label="TableCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.widget.cts.TabHostCtsActivity"
+ android:label="TabHostCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.widget.cts.ZoomButtonCtsActivity"
+ android:label="ZoomButtonCtsActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN"/>
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.app.ActivityGroup"
+ android:label="ActivityGroup" />
+
+ <activity android:name="android.widget.cts.MockURLSpanTestActivity"
+ android:label="MockURLSpanTestActivity"
+ android:launchMode="singleTask"
+ android:alwaysRetainTaskState="true"
+ android:configChanges="orientation|keyboardHidden">
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ <data android:scheme="ctstest" />
+ </intent-filter>
+ </activity>
+
</application>
<instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
- android:targetPackage="com.android.cts.stub"
+ android:targetPackage="com.android.cts.widget"
android:label="CTS tests of android.widget">
<meta-data android:name="listener"
android:value="com.android.cts.runner.CtsTestRunListener" />
diff --git a/tests/src/android/os/cts/TaggedPointer.java b/tests/tests/widget/res/anim/anim_alpha.xml
similarity index 62%
copy from tests/src/android/os/cts/TaggedPointer.java
copy to tests/tests/widget/res/anim/anim_alpha.xml
index 16e76c9..b5794c3 100644
--- a/tests/src/android/os/cts/TaggedPointer.java
+++ b/tests/tests/widget/res/anim/anim_alpha.xml
@@ -1,5 +1,6 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Copyright (C) 2008 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.
@@ -12,15 +13,11 @@
* 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.os.cts;
+<alpha xmlns:android="http://schemas.android.com/apk/res/android"
+ android:interpolator="@android:anim/accelerate_interpolator"
+ android:fromAlpha="0.0"
+ android:toAlpha="1.0"
+ android:duration="500" />
-public class TaggedPointer {
-
- static {
- System.loadLibrary("cts_jni");
- }
-
- public static native boolean hasTaggedPointer();
-}
diff --git a/tests/tests/widget/res/drawable/animated.gif b/tests/tests/widget/res/drawable/animated.gif
new file mode 100644
index 0000000..51baf15
--- /dev/null
+++ b/tests/tests/widget/res/drawable/animated.gif
Binary files differ
diff --git a/tests/tests/widget/res/drawable/faces.jpg b/tests/tests/widget/res/drawable/faces.jpg
new file mode 100644
index 0000000..0672022
--- /dev/null
+++ b/tests/tests/widget/res/drawable/faces.jpg
Binary files differ
diff --git a/tests/tests/widget/res/drawable/failed.jpg b/tests/tests/widget/res/drawable/failed.jpg
new file mode 100644
index 0000000..1bb9b52
--- /dev/null
+++ b/tests/tests/widget/res/drawable/failed.jpg
Binary files differ
diff --git a/tests/tests/widget/res/drawable/icon_black.jpg b/tests/tests/widget/res/drawable/icon_black.jpg
new file mode 100644
index 0000000..4c9062a
--- /dev/null
+++ b/tests/tests/widget/res/drawable/icon_black.jpg
Binary files differ
diff --git a/tests/tests/widget/res/drawable/icon_blue.jpg b/tests/tests/widget/res/drawable/icon_blue.jpg
new file mode 100644
index 0000000..9e6c1c8
--- /dev/null
+++ b/tests/tests/widget/res/drawable/icon_blue.jpg
Binary files differ
diff --git a/tests/tests/widget/res/drawable/icon_green.jpg b/tests/tests/widget/res/drawable/icon_green.jpg
new file mode 100644
index 0000000..55a78f2
--- /dev/null
+++ b/tests/tests/widget/res/drawable/icon_green.jpg
Binary files differ
diff --git a/tests/tests/widget/res/drawable/icon_red.jpg b/tests/tests/widget/res/drawable/icon_red.jpg
new file mode 100644
index 0000000..6bc9e1f
--- /dev/null
+++ b/tests/tests/widget/res/drawable/icon_red.jpg
Binary files differ
diff --git a/tests/tests/widget/res/drawable/icon_yellow.jpg b/tests/tests/widget/res/drawable/icon_yellow.jpg
new file mode 100644
index 0000000..e748059
--- /dev/null
+++ b/tests/tests/widget/res/drawable/icon_yellow.jpg
Binary files differ
diff --git a/tests/tests/widget/res/drawable/ninepatch_0.9.png b/tests/tests/widget/res/drawable/ninepatch_0.9.png
new file mode 100644
index 0000000..24019d8
--- /dev/null
+++ b/tests/tests/widget/res/drawable/ninepatch_0.9.png
Binary files differ
diff --git a/tests/tests/widget/res/drawable/ninepatch_1.9.png b/tests/tests/widget/res/drawable/ninepatch_1.9.png
new file mode 100644
index 0000000..c56b1db
--- /dev/null
+++ b/tests/tests/widget/res/drawable/ninepatch_1.9.png
Binary files differ
diff --git a/tests/tests/widget/res/drawable/pass.jpg b/tests/tests/widget/res/drawable/pass.jpg
new file mode 100644
index 0000000..2f4b083
--- /dev/null
+++ b/tests/tests/widget/res/drawable/pass.jpg
Binary files differ
diff --git a/tests/tests/widget/res/drawable/scenery.jpg b/tests/tests/widget/res/drawable/scenery.jpg
new file mode 100644
index 0000000..7a6145b
--- /dev/null
+++ b/tests/tests/widget/res/drawable/scenery.jpg
Binary files differ
diff --git a/tests/tests/widget/res/drawable/size_48x48.jpg b/tests/tests/widget/res/drawable/size_48x48.jpg
new file mode 100644
index 0000000..5c2291e
--- /dev/null
+++ b/tests/tests/widget/res/drawable/size_48x48.jpg
Binary files differ
diff --git a/tests/tests/widget/res/drawable/start.jpg b/tests/tests/widget/res/drawable/start.jpg
new file mode 100644
index 0000000..54e05e0
--- /dev/null
+++ b/tests/tests/widget/res/drawable/start.jpg
Binary files differ
diff --git a/tests/tests/widget/res/drawable/testimage.jpg b/tests/tests/widget/res/drawable/testimage.jpg
new file mode 100644
index 0000000..754df0c
--- /dev/null
+++ b/tests/tests/widget/res/drawable/testimage.jpg
Binary files differ
diff --git a/tests/tests/widget/res/layout/abslistview_layout.xml b/tests/tests/widget/res/layout/abslistview_layout.xml
new file mode 100644
index 0000000..a090ce3
--- /dev/null
+++ b/tests/tests/widget/res/layout/abslistview_layout.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<ViewGroup_Layout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/abslistview_root"
+ android:layout_width="25px"
+ android:layout_height="25px" >
+
+ <GridView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+
+ <ListView>
+ <TextView
+ android:text="@string/table_layout_first"
+ android:padding="3dip" />
+ <TextView
+ android:text="@string/table_layout_second"
+ android:padding="3dip" />
+ <TextView
+ android:text="@string/table_layout_third"
+ android:padding="3dip" />
+ </ListView>
+</ViewGroup_Layout>
+
diff --git a/tests/tests/widget/res/layout/absolute_layout.xml b/tests/tests/widget/res/layout/absolute_layout.xml
new file mode 100644
index 0000000..6cec61b
--- /dev/null
+++ b/tests/tests/widget/res/layout/absolute_layout.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <AbsoluteLayout
+ android:id="@+id/absolute_view"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_x="1dip"
+ android:layout_y="2dip">
+
+ <TextView
+ android:id="@+id/absolute_textview"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_x="10dip"
+ android:layout_y="20dip"
+ android:background="@drawable/red"
+ android:text="@string/hello_world"/>
+
+ </AbsoluteLayout>
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/adapterview_layout.xml b/tests/tests/widget/res/layout/adapterview_layout.xml
new file mode 100644
index 0000000..e118500
--- /dev/null
+++ b/tests/tests/widget/res/layout/adapterview_layout.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/adapterview_tv"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+
diff --git a/tests/tests/widget/res/layout/analogclock.xml b/tests/tests/widget/res/layout/analogclock.xml
new file mode 100644
index 0000000..7d862c3
--- /dev/null
+++ b/tests/tests/widget/res/layout/analogclock.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<AnalogClock android:id="@+id/clock"
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="96dip"
+ android:layout_gravity="center_horizontal"
+ android:layout_height="wrap_content"/>
diff --git a/tests/tests/widget/res/layout/autocompletetextview_layout.xml b/tests/tests/widget/res/layout/autocompletetextview_layout.xml
new file mode 100644
index 0000000..7fd183c
--- /dev/null
+++ b/tests/tests/widget/res/layout/autocompletetextview_layout.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <TextView android:id="@+id/autocompletetv_title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/notify" />
+
+ <AutoCompleteTextView android:id="@+id/autocompletetv_edit"
+ android:completionThreshold="1"
+ android:completionHint="@string/tabs_1"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/checkbox_layout.xml b/tests/tests/widget/res/layout/checkbox_layout.xml
new file mode 100644
index 0000000..a1f1718
--- /dev/null
+++ b/tests/tests/widget/res/layout/checkbox_layout.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 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.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <CheckBox android:id="@+id/check_box"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/hello_world" />
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/checkedtextview_layout.xml b/tests/tests/widget/res/layout/checkedtextview_layout.xml
new file mode 100644
index 0000000..d5b9c1f
--- /dev/null
+++ b/tests/tests/widget/res/layout/checkedtextview_layout.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <ListView android:id="@+id/checkedtextview_listview"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ </ListView>
+
+ <CheckedTextView android:id="@+id/checkedtextview_test"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ </CheckedTextView>
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/chronometer_stub_layout.xml b/tests/tests/widget/res/layout/chronometer_stub_layout.xml
new file mode 100644
index 0000000..487f2f8
--- /dev/null
+++ b/tests/tests/widget/res/layout/chronometer_stub_layout.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 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.
+ -->
+
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/screen"
+ android:layout_width="match_parent" android:layout_height="match_parent"
+ android:orientation="vertical">
+ <LinearLayout
+ android:id="@+id/chronometer_view_group"
+ android:layout_width="match_parent" android:layout_height="match_parent"
+ android:orientation="vertical">
+ <Chronometer
+ android:id="@+id/test_chronometer"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/chronometer_text"
+ />
+ </LinearLayout>
+</ScrollView>
+
diff --git a/tests/tests/widget/res/layout/cursoradapter_group0.xml b/tests/tests/widget/res/layout/cursoradapter_group0.xml
new file mode 100644
index 0000000..f640686
--- /dev/null
+++ b/tests/tests/widget/res/layout/cursoradapter_group0.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:id="@+id/cursorAdapter_group0">
+</ImageView>
diff --git a/tests/tests/widget/res/layout/cursoradapter_group1.xml b/tests/tests/widget/res/layout/cursoradapter_group1.xml
new file mode 100644
index 0000000..d1dfa3c
--- /dev/null
+++ b/tests/tests/widget/res/layout/cursoradapter_group1.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:id="@+id/cursorAdapter_group1">
+</ImageView>
diff --git a/tests/tests/widget/res/layout/cursoradapter_host.xml b/tests/tests/widget/res/layout/cursoradapter_host.xml
new file mode 100644
index 0000000..82ac72b
--- /dev/null
+++ b/tests/tests/widget/res/layout/cursoradapter_host.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:id="@+id/cursorAdapter_host">
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/cursoradapter_item0.xml b/tests/tests/widget/res/layout/cursoradapter_item0.xml
new file mode 100644
index 0000000..5ecd496
--- /dev/null
+++ b/tests/tests/widget/res/layout/cursoradapter_item0.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:id="@+id/cursorAdapter_item0">
+</TextView>
diff --git a/tests/tests/widget/res/layout/cursoradapter_item1.xml b/tests/tests/widget/res/layout/cursoradapter_item1.xml
new file mode 100644
index 0000000..44037b0
--- /dev/null
+++ b/tests/tests/widget/res/layout/cursoradapter_item1.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:id="@+id/cursorAdapter_item1">
+</TextView>
diff --git a/tests/tests/widget/res/layout/datepicker_layout.xml b/tests/tests/widget/res/layout/datepicker_layout.xml
new file mode 100644
index 0000000..925674c
--- /dev/null
+++ b/tests/tests/widget/res/layout/datepicker_layout.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<RelativeLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ <DatePicker
+ android:id="@+id/datePicker_dp"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_centerInParent="true" />
+
+</RelativeLayout>
diff --git a/tests/tests/widget/res/layout/dialerfilter_layout.xml b/tests/tests/widget/res/layout/dialerfilter_layout.xml
new file mode 100644
index 0000000..46edbd7
--- /dev/null
+++ b/tests/tests/widget/res/layout/dialerfilter_layout.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<DialerFilter android:id="@+id/dialer_filter"
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <EditText android:id="@android:id/hint"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="@android:drawable/editbox_background"/>
+
+ <EditText android:id="@android:id/primary"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_below="@android:id/hint"/>
+
+</DialerFilter>
diff --git a/tests/tests/widget/res/layout/digitalclock_layout.xml b/tests/tests/widget/res/layout/digitalclock_layout.xml
new file mode 100644
index 0000000..d405af2
--- /dev/null
+++ b/tests/tests/widget/res/layout/digitalclock_layout.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<com.android.cts.widget.alarmclock.DigitalClock android:id="@+id/digitalClock"
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="208dip"
+ android:gravity="center">
+ <!-- Includes vertical padding so animated background doesn't
+ stretch much -->
+ <TextView android:id="@+id/timeDisplay"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="64sp"
+ android:paddingRight="4dip"
+ android:paddingTop="48dip"
+ android:paddingBottom="48dip"/>
+ <LinearLayout android:id="@+id/am_pm"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+ <TextView android:id="@+id/am"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="-7dp"
+ android:text="@string/am"
+ android:textSize="28sp"/>
+ <TextView android:id="@+id/pm"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="-4dp"
+ android:text="@string/pm"
+ android:textSize="28sp"/>
+ </LinearLayout>
+</com.android.cts.widget.alarmclock.DigitalClock>
diff --git a/tests/tests/widget/res/layout/digitalclock_simplelayout.xml b/tests/tests/widget/res/layout/digitalclock_simplelayout.xml
new file mode 100644
index 0000000..16f7b45
--- /dev/null
+++ b/tests/tests/widget/res/layout/digitalclock_simplelayout.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/digitalclock_root"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/edittext_layout.xml b/tests/tests/widget/res/layout/edittext_layout.xml
new file mode 100644
index 0000000..398d3be
--- /dev/null
+++ b/tests/tests/widget/res/layout/edittext_layout.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" >
+
+ <LinearLayout android:id="@+id/edit_text"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <EditText android:id="@+id/edittext1"
+ style="@android:style/Widget.EditText"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_marginTop="10dip"
+ android:scrollHorizontally="true"
+ android:capitalize="sentences"
+ android:autoText="false"
+ android:maxLines="3"
+ android:textColor="#FF0000"
+ android:text="@string/edit_text"
+ />
+ </LinearLayout>
+</ScrollView>
diff --git a/tests/src/android/os/cts/TaggedPointer.java b/tests/tests/widget/res/layout/expandablelistview_layout.xml
similarity index 60%
copy from tests/src/android/os/cts/TaggedPointer.java
copy to tests/tests/widget/res/layout/expandablelistview_layout.xml
index 16e76c9..3a3ebb7 100644
--- a/tests/src/android/os/cts/TaggedPointer.java
+++ b/tests/tests/widget/res/layout/expandablelistview_layout.xml
@@ -1,5 +1,6 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 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.
@@ -12,15 +13,10 @@
* 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.
- */
+ -->
+<ExpandableListView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/expandablelistview_test"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:drawSelectorOnTop="false" />
-package android.os.cts;
-
-public class TaggedPointer {
-
- static {
- System.loadLibrary("cts_jni");
- }
-
- public static native boolean hasTaggedPointer();
-}
diff --git a/tests/tests/widget/res/layout/framelayout_layout.xml b/tests/tests/widget/res/layout/framelayout_layout.xml
new file mode 100644
index 0000000..78b7b47
--- /dev/null
+++ b/tests/tests/widget/res/layout/framelayout_layout.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 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.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/framelayout_container"
+ android:background="@drawable/red"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_gravity="bottom"
+ android:orientation="vertical">
+
+ <FrameLayout
+ android:layout_width="100dip"
+ android:layout_height="100dip"
+ android:background="@drawable/yellow"
+ android:id="@+id/framelayout">
+ </FrameLayout>
+
+ <FrameLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@drawable/yellow"
+ android:id="@+id/framelayout_measureall">
+
+ <TextView android:id="@+id/framelayout_textview"
+ android:background="@drawable/blue"
+ android:layout_width="60dip"
+ android:layout_height="30dip"
+ android:text="@string/hello_world"/>
+
+ <Button android:id="@+id/framelayout_button"
+ android:layout_width="50dip"
+ android:layout_height="15dip"
+ android:text="@string/go"/>
+
+ </FrameLayout>
+
+ <FrameLayout
+ android:id="@+id/foreground_tint"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:foregroundTint="@android:color/white"
+ android:foregroundTintMode="src_over" />
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/gallery_test.xml b/tests/tests/widget/res/layout/gallery_test.xml
new file mode 100644
index 0000000..03f0e60
--- /dev/null
+++ b/tests/tests/widget/res/layout/gallery_test.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 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.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <android.widget.cts.MyGallery xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/gallery_test"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ </android.widget.cts.MyGallery>
+
+</LinearLayout>
diff --git a/tests/src/android/os/cts/TaggedPointer.java b/tests/tests/widget/res/layout/gridlayout_layout.xml
similarity index 63%
copy from tests/src/android/os/cts/TaggedPointer.java
copy to tests/tests/widget/res/layout/gridlayout_layout.xml
index 16e76c9..54b3b2c 100644
--- a/tests/src/android/os/cts/TaggedPointer.java
+++ b/tests/tests/widget/res/layout/gridlayout_layout.xml
@@ -1,5 +1,6 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2012 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.
@@ -12,15 +13,11 @@
* 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.os.cts;
-
-public class TaggedPointer {
-
- static {
- System.loadLibrary("cts_jni");
- }
-
- public static native boolean hasTaggedPointer();
-}
+ -->
+<GridLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ >
+</GridLayout>
diff --git a/tests/tests/widget/res/layout/gridview_layout.xml b/tests/tests/widget/res/layout/gridview_layout.xml
new file mode 100644
index 0000000..c7774a3
--- /dev/null
+++ b/tests/tests/widget/res/layout/gridview_layout.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<GridView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/gridview"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+/>
+
diff --git a/tests/tests/widget/res/layout/horizontal_scrollview.xml b/tests/tests/widget/res/layout/horizontal_scrollview.xml
new file mode 100644
index 0000000..0f88ab3
--- /dev/null
+++ b/tests/tests/widget/res/layout/horizontal_scrollview.xml
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<android.widget.cts.MyHorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/horizontal_scroll_view"
+ android:layout_width="100px"
+ android:layout_height="100px">
+
+ <LinearLayout
+ android:orientation="horizontal"
+ android:layout_width="250px"
+ android:layout_height="wrap_content">
+
+ <Button
+ android:id="@+id/first_horizontal_child"
+ android:layout_width="250px"
+ android:layout_height="100px"
+ android:text="@string/vertical_text_1"/>
+
+ <Button
+ android:layout_width="250px"
+ android:layout_height="100px"
+ android:text="@string/vertical_text_2"/>
+
+ <Button
+ android:layout_width="250px"
+ android:layout_height="100px"
+ android:text="@string/vertical_text_3"/>
+
+ <Button
+ android:layout_width="250px"
+ android:layout_height="100px"
+ android:text="@string/vertical_text_1"/>
+
+ <Button
+ android:layout_width="250px"
+ android:layout_height="100px"
+ android:text="@string/vertical_text_2"/>
+
+ <Button
+ android:layout_width="250px"
+ android:layout_height="100px"
+ android:text="@string/vertical_text_3"/>
+
+ <Button
+ android:layout_width="250px"
+ android:layout_height="100px"
+ android:text="@string/vertical_text_1"/>
+
+ <Button
+ android:layout_width="250px"
+ android:layout_height="100px"
+ android:text="@string/vertical_text_2"/>
+
+ <Button
+ android:layout_width="250px"
+ android:layout_height="100px"
+ android:text="@string/vertical_text_3"/>
+
+ <Button
+ android:layout_width="250px"
+ android:layout_height="100px"
+ android:text="@string/vertical_text_1"/>
+
+ <Button
+ android:layout_width="250px"
+ android:layout_height="100px"
+ android:text="@string/vertical_text_2"/>
+
+ <Button
+ android:layout_width="250px"
+ android:layout_height="100px"
+ android:text="@string/vertical_text_3"/>
+
+ <Button
+ android:layout_width="250px"
+ android:layout_height="100px"
+ android:text="@string/vertical_text_1"/>
+
+ <Button
+ android:layout_width="250px"
+ android:layout_height="100px"
+ android:text="@string/vertical_text_2"/>
+
+ <Button
+ android:id="@+id/last_horizontal_child"
+ android:layout_width="250px"
+ android:layout_height="100px"
+ android:text="@string/vertical_text_3"/>
+ </LinearLayout>
+
+</android.widget.cts.MyHorizontalScrollView>
diff --git a/tests/src/android/os/cts/TaggedPointer.java b/tests/tests/widget/res/layout/imagebutton_test.xml
similarity index 63%
copy from tests/src/android/os/cts/TaggedPointer.java
copy to tests/tests/widget/res/layout/imagebutton_test.xml
index 16e76c9..7d4b691 100644
--- a/tests/src/android/os/cts/TaggedPointer.java
+++ b/tests/tests/widget/res/layout/imagebutton_test.xml
@@ -1,5 +1,6 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 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.
@@ -12,15 +13,11 @@
* 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.
- */
+ -->
+<ImageButton xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/imagebutton"
+ android:layout_width="96px"
+ android:layout_height="76px"
+ android:soundEffectsEnabled="false"
+/>
-package android.os.cts;
-
-public class TaggedPointer {
-
- static {
- System.loadLibrary("cts_jni");
- }
-
- public static native boolean hasTaggedPointer();
-}
diff --git a/tests/tests/widget/res/layout/imageswitcher_test.xml b/tests/tests/widget/res/layout/imageswitcher_test.xml
new file mode 100644
index 0000000..496b2ba
--- /dev/null
+++ b/tests/tests/widget/res/layout/imageswitcher_test.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Copyright (C) 2008 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.
+ -->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <ImageSwitcher android:id="@+id/switcher"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_alignParentTop="true"
+ android:layout_alignParentLeft="true"
+ />
+</RelativeLayout>
+
diff --git a/tests/tests/widget/res/layout/imageview_layout.xml b/tests/tests/widget/res/layout/imageview_layout.xml
new file mode 100644
index 0000000..e56a9c9
--- /dev/null
+++ b/tests/tests/widget/res/layout/imageview_layout.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2008 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.
+ */
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <ImageView
+ android:id="@+id/imageview"
+ android:layout_width="320px"
+ android:layout_height="240px"/>
+
+ <ImageView
+ android:id="@+id/image_tint"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:tint="@android:color/white"
+ android:tintMode="src_over" />
+
+</LinearLayout>
+
diff --git a/tests/tests/widget/res/layout/layoutdirection_layout.xml b/tests/tests/widget/res/layout/layoutdirection_layout.xml
new file mode 100644
index 0000000..e506dc1
--- /dev/null
+++ b/tests/tests/widget/res/layout/layoutdirection_layout.xml
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2012 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.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <LinearLayout android:id="@+id/layout_linearlayout_ltr"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layoutDirection="ltr">
+
+ <LinearLayout android:id="@+id/layout_linearlayout_ltr_child_1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layoutDirection="ltr" />
+
+ <LinearLayout android:id="@+id/layout_linearlayout_ltr_child_2"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layoutDirection="rtl" />
+
+ <LinearLayout android:id="@+id/layout_linearlayout_ltr_child_3"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layoutDirection="inherit" />
+
+ <LinearLayout android:id="@+id/layout_linearlayout_ltr_child_4"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layoutDirection="locale" />
+
+ </LinearLayout>
+
+ <LinearLayout android:id="@+id/layout_linearlayout_rtl"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layoutDirection="rtl">
+
+ <LinearLayout android:id="@+id/layout_linearlayout_rtl_child_1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layoutDirection="ltr" />
+
+ <LinearLayout android:id="@+id/layout_linearlayout_rtl_child_2"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layoutDirection="rtl" />
+
+ <LinearLayout android:id="@+id/layout_linearlayout_rtl_child_3"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layoutDirection="inherit" />
+
+ <LinearLayout android:id="@+id/layout_linearlayout_rtl_child_4"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layoutDirection="locale" />
+
+ </LinearLayout>
+
+ <LinearLayout android:id="@+id/layout_linearlayout_locale"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layoutDirection="locale">
+
+ <LinearLayout android:id="@+id/layout_linearlayout_locale_child_1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layoutDirection="ltr" />
+
+ <LinearLayout android:id="@+id/layout_linearlayout_locale_child_2"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layoutDirection="rtl" />
+
+ <LinearLayout android:id="@+id/layout_linearlayout_locale_child_3"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layoutDirection="inherit" />
+
+ <LinearLayout android:id="@+id/layout_linearlayout_locale_child_4"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layoutDirection="locale" />
+
+ </LinearLayout>
+
+ <LinearLayout android:id="@+id/layout_linearlayout_inherit"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layoutDirection="inherit">
+
+ <LinearLayout android:id="@+id/layout_linearlayout_inherit_child_1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layoutDirection="ltr" />
+
+ <LinearLayout android:id="@+id/layout_linearlayout_inherit_child_2"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layoutDirection="rtl" />
+
+ <LinearLayout android:id="@+id/layout_linearlayout_inherit_child_3"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layoutDirection="inherit" />
+
+ <LinearLayout android:id="@+id/layout_linearlayout_inherit_child_4"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layoutDirection="locale" />
+
+ </LinearLayout>
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/linearlayout_layout.xml b/tests/tests/widget/res/layout/linearlayout_layout.xml
new file mode 100644
index 0000000..c70937d
--- /dev/null
+++ b/tests/tests/widget/res/layout/linearlayout_layout.xml
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 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.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <LinearLayout android:id="@+id/horizontal"
+ android:orientation="horizontal"
+ android:layout_width="wrap_content"
+ android:layout_height="100dip"
+ android:background="#FF909090">
+
+ <TextView android:id="@+id/gravity_top"
+ android:background="#FF00FF00"
+ android:layout_width="wrap_content"
+ android:layout_height="50dip"
+ android:layout_gravity="top"
+ android:text="@string/horizontal_text_1"/>
+
+ <TextView android:id="@+id/gravity_center_vertical"
+ android:background="#FF00FF00"
+ android:layout_width="wrap_content"
+ android:layout_height="50dip"
+ android:layout_gravity="center_vertical"
+ android:text="@string/horizontal_text_2"/>
+
+ <TextView android:id="@+id/gravity_bottom"
+ android:background="#FF00FF00"
+ android:layout_width="wrap_content"
+ android:layout_height="50dip"
+ android:layout_gravity="bottom"
+ android:text="@string/horizontal_text_3"/>
+ </LinearLayout>
+
+ <LinearLayout android:id="@+id/vertical"
+ android:orientation="vertical"
+ android:layout_width="100dip"
+ android:layout_height="wrap_content"
+ android:background="#FFFF0909">
+
+ <TextView android:id="@+id/gravity_left"
+ android:background="#FF00FF00"
+ android:layout_width="wrap_content"
+ android:layout_height="20dip"
+ android:layout_gravity="left"
+ android:text="@string/vertical_text_1"/>
+
+ <TextView android:id="@+id/gravity_center_horizontal"
+ android:background="#FF0000FF"
+ android:layout_width="wrap_content"
+ android:layout_height="20dip"
+ android:layout_gravity="center_horizontal"
+ android:text="@string/vertical_text_2"/>
+
+ <TextView android:id="@+id/gravity_right"
+ android:background="#FF00FF00"
+ android:layout_width="wrap_content"
+ android:layout_height="20dip"
+ android:layout_gravity="right"
+ android:text="@string/vertical_text_3"/>
+ </LinearLayout>
+
+ <LinearLayout android:id="@+id/weightsum"
+ android:orientation="horizontal"
+ android:weightSum="1.0"
+ android:baselineAligned="false"
+ android:layout_width="100dip"
+ android:layout_height="100dip"
+ android:background="#FF909090">
+
+ <TextView android:id="@+id/weight_0_2"
+ android:background="#FF0000FF"
+ android:layout_width="0dip"
+ android:layout_height="wrap_content"
+ android:layout_weight="0.2"
+ android:text="@string/horizontal_text_1"/>
+
+ <TextView android:id="@+id/weight_0_5"
+ android:background="#FFF00F0F"
+ android:layout_width="0dip"
+ android:layout_height="wrap_content"
+ android:layout_weight="0.5"
+ android:text="@string/horizontal_text_2"/>
+
+ <TextView android:id="@+id/weight_0_3"
+ android:background="#FF0000FF"
+ android:layout_width="0dip"
+ android:layout_height="wrap_content"
+ android:layout_weight="0.3"
+ android:text="@string/horizontal_text_3"/>
+ </LinearLayout>
+
+ <LinearLayout android:id="@+id/baseline_aligned_child_index"
+ android:orientation="vertical"
+ android:baselineAlignedChildIndex="1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="#FFFF0909">
+
+ <TextView android:id="@+id/textview1"
+ android:background="#FF00FF00"
+ android:layout_width="wrap_content"
+ android:layout_height="20dip"
+ android:layout_gravity="left"
+ android:text="@string/vertical_text_1"/>
+
+ <TextView android:id="@+id/textview2"
+ android:background="#FF0000FF"
+ android:layout_width="wrap_content"
+ android:layout_height="20dip"
+ android:layout_gravity="center_horizontal"
+ android:text="@string/vertical_text_2"/>
+
+ <TextView android:id="@+id/textview3"
+ android:background="#FF00FF00"
+ android:layout_width="wrap_content"
+ android:layout_height="20dip"
+ android:layout_gravity="right"
+ android:text="@string/vertical_text_3"/>
+ </LinearLayout>
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/listview_layout.xml b/tests/tests/widget/res/layout/listview_layout.xml
new file mode 100644
index 0000000..ee8b6de
--- /dev/null
+++ b/tests/tests/widget/res/layout/listview_layout.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <TextView android:id="@+id/headerview1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/header_view" />
+
+ <TextView android:id="@+id/headerview2"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/header_view" />
+
+ <ListView android:id="@+id/listview_default"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"/>
+
+ <TextView android:id="@+id/footerview1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/footer_view" />
+
+ <TextView android:id="@+id/footerview2"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/footer_view" />
+</LinearLayout>
+
diff --git a/tests/src/android/widget/cts/ProgressBarStubActivity.java b/tests/tests/widget/res/layout/mediacontroller_layout.xml
similarity index 60%
copy from tests/src/android/widget/cts/ProgressBarStubActivity.java
copy to tests/tests/widget/res/layout/mediacontroller_layout.xml
index 57cfa1a..871adf4 100644
--- a/tests/src/android/widget/cts/ProgressBarStubActivity.java
+++ b/tests/tests/widget/res/layout/mediacontroller_layout.xml
@@ -1,4 +1,5 @@
-/*
+<?xml version="1.0" encoding="utf-8"?>
+<!--
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -12,23 +13,16 @@
* 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.
- */
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
-package android.widget.cts;
+ <VideoView
+ android:id="@+id/mediacontroller_videoview"
+ android:layout_width="320px"
+ android:layout_height="240px"/>
-import android.app.Activity;
-import android.os.Bundle;
+</LinearLayout>
-/**
- * An application for ProgressBar test
- *
- */
-public class ProgressBarStubActivity extends Activity {
- /**
- * Called with the activity is first created.
- */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- }
-}
diff --git a/tests/tests/widget/res/layout/multi_auto_complete_text_view_layout.xml b/tests/tests/widget/res/layout/multi_auto_complete_text_view_layout.xml
new file mode 100644
index 0000000..50109c8
--- /dev/null
+++ b/tests/tests/widget/res/layout/multi_auto_complete_text_view_layout.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/text_country" />
+
+ <MultiAutoCompleteTextView android:id="@+id/country_edit"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"/>
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/text_name" />
+
+ <MultiAutoCompleteTextView android:id="@+id/name_edit"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"/>
+
+</LinearLayout>
+
diff --git a/tests/tests/widget/res/layout/popupwindow.xml b/tests/tests/widget/res/layout/popupwindow.xml
new file mode 100644
index 0000000..e6b0aed
--- /dev/null
+++ b/tests/tests/widget/res/layout/popupwindow.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <TextView android:id="@+id/anchor_upper"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/text_view_hint"
+ android:layout_weight="1"/>
+
+ <LinearLayout android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1">
+
+ <TextView android:id="@+id/anchor_middle_left"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:text="@string/text_view_hint"
+ android:layout_weight="1"/>
+
+ <TextView android:id="@+id/anchor_middle_right"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:text="@string/text_view_hint"
+ android:layout_weight="1"/>
+
+ </LinearLayout>
+
+ <TextView android:id="@+id/anchor_lower"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/text_view_hint"
+ android:layout_weight="1"/>
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/progressbar_layout.xml b/tests/tests/widget/res/layout/progressbar_layout.xml
new file mode 100644
index 0000000..a1786b8
--- /dev/null
+++ b/tests/tests/widget/res/layout/progressbar_layout.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <ProgressBar
+ android:id="@+id/progress_tint"
+ android:progressTint="@android:color/white"
+ android:progressTintMode="src_over"
+ android:progressBackgroundTint="@android:color/white"
+ android:progressBackgroundTintMode="src_over"
+ android:secondaryProgressTint="@android:color/white"
+ android:secondaryProgressTintMode="src_over"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ style="@android:style/Widget.ProgressBar.Horizontal" />
+
+ <ProgressBar
+ android:id="@+id/indeterminate_tint"
+ android:indeterminateTint="@android:color/white"
+ android:indeterminateTintMode="src_over"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ style="@android:style/Widget.ProgressBar.Large" />
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/radiogroup_1.xml b/tests/tests/widget/res/layout/radiogroup_1.xml
new file mode 100644
index 0000000..1e9db83
--- /dev/null
+++ b/tests/tests/widget/res/layout/radiogroup_1.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<RadioGroup xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:layout_weight="0.5"
+ android:layout_gravity="bottom"
+ android:layout_margin="5px">
+</RadioGroup>
+
diff --git a/tests/tests/widget/res/layout/ratingbar_layout.xml b/tests/tests/widget/res/layout/ratingbar_layout.xml
new file mode 100644
index 0000000..acc7fa8
--- /dev/null
+++ b/tests/tests/widget/res/layout/ratingbar_layout.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <RatingBar android:id="@+id/ratingbar_constructor"
+ android:isIndicator="false"
+ android:numStars="50"
+ android:rating="1.2"
+ android:stepSize="0.2"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"/>
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/relative_layout.xml b/tests/tests/widget/res/layout/relative_layout.xml
new file mode 100644
index 0000000..db4b2e8
--- /dev/null
+++ b/tests/tests/widget/res/layout/relative_layout.xml
@@ -0,0 +1,258 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <RelativeLayout
+ android:id="@+id/relative_sublayout_attrs"
+ android:background="@drawable/blue"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <!-- view1, centered within its parent. -->
+ <TextView
+ android:id="@+id/relative_view1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_centerInParent="true"
+ android:text="@string/relative_view1"/>
+
+ <!-- view2, below view1 and has same left position with view1. -->
+ <TextView
+ android:id="@+id/relative_view2"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/relative_view1"
+ android:layout_alignLeft="@id/relative_view1"
+ android:text="@string/relative_view2"/>
+
+ <!-- view3, has same top position with view1 and same bottom position with view2,
+ and on the right of view1. -->
+ <TextView
+ android:id="@+id/relative_view3"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignTop="@id/relative_view1"
+ android:layout_alignBottom="@id/relative_view2"
+ android:layout_toRightOf="@id/relative_view1"
+ android:text="@string/relative_view3"/>
+
+ <!-- view4, has same right position with view3 and above view3. -->
+ <TextView
+ android:id="@+id/relative_view4"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignRight="@id/relative_view3"
+ android:layout_above="@id/relative_view3"
+ android:text="@string/relative_view4"/>
+
+ <!-- view5 goes on the left-bottom -->
+ <TextView
+ android:id="@+id/relative_view5"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ android:layout_alignParentLeft="true"
+ android:text="@string/relative_view5"/>
+
+ <!-- view6 goes on the top-right -->
+ <TextView
+ android:id="@+id/relative_view6"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentTop="true"
+ android:layout_alignParentRight="true"
+ android:text="@string/relative_view6"/>
+
+ <!-- view7, has same baseline with view6 and centered horizontally within its parent. -->
+ <TextView
+ android:id="@+id/relative_view7"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignBaseline="@id/relative_view6"
+ android:layout_centerHorizontal="true"
+ android:text="@string/relative_view7"/>
+
+ <!-- view8, centered vertically within its parent and on the left of view1. -->
+ <TextView
+ android:id="@+id/relative_view8"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_toLeftOf="@id/relative_view1"
+ android:layout_centerVertical="true"
+ android:text="@string/relative_view8"/>
+
+ <!-- view9, has same top and bottom position with view3 and same left position
+ with its parent. -->
+ <TextView
+ android:id="@+id/relative_view9"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignLeft="@id/gravity_bottom"
+ android:layout_alignTop="@id/relative_view3"
+ android:layout_alignBottom="@id/relative_view3"
+ android:layout_alignWithParentIfMissing="true"
+ android:text="@string/relative_view9"/>
+
+ </RelativeLayout>
+
+ <RelativeLayout
+ android:id="@+id/relative_sublayout_gravity"
+ android:background="@drawable/yellow"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <!-- view10 -->
+ <TextView
+ android:id="@+id/relative_view10"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/relative_view10"/>
+
+ <!-- view11 -->
+ <TextView
+ android:id="@+id/relative_view11"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/relative_view10"
+ android:text="@string/relative_view11"/>
+ </RelativeLayout>
+
+ <RelativeLayout
+ android:id="@+id/relative_sublayout_ignore_gravity"
+ android:background="@drawable/red"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:ignoreGravity="@+id/relative_view12"
+ android:gravity="right">
+
+ <!-- view12 -->
+ <TextView
+ android:id="@id/relative_view12"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/relative_view12"/>
+
+ <!-- view13 -->
+ <TextView
+ android:id="@+id/relative_view13"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/relative_view13"/>
+ </RelativeLayout>
+
+ <Spinner
+ android:id="@+id/spinner1"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:prompt="@string/text_view_hello"/>
+
+ <RelativeLayout
+ android:id="@+id/relative_sublayout_attrs_2"
+ android:background="@drawable/blue"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <!-- view21, centered within its parent. -->
+ <TextView
+ android:id="@+id/relative_view21"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_centerInParent="true"
+ android:text="@string/relative_view1"/>
+
+ <!-- view22, below view1 and has same start position with view21. -->
+ <TextView
+ android:id="@+id/relative_view22"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/relative_view21"
+ android:layout_alignStart="@id/relative_view21"
+ android:text="@string/relative_view2"/>
+
+ <!-- view23, has same top position with view21 and same bottom position with view22,
+ and on the end of view1. -->
+ <TextView
+ android:id="@+id/relative_view23"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignTop="@id/relative_view21"
+ android:layout_alignBottom="@id/relative_view22"
+ android:layout_toEndOf="@id/relative_view21"
+ android:text="@string/relative_view3"/>
+
+ <!-- view24, has same end position with view23 and above view23. -->
+ <TextView
+ android:id="@+id/relative_view24"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignEnd="@id/relative_view23"
+ android:layout_above="@id/relative_view23"
+ android:text="@string/relative_view4"/>
+
+ <!-- view25 goes on the start-bottom -->
+ <TextView
+ android:id="@+id/relative_view25"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ android:layout_alignParentStart="true"
+ android:text="@string/relative_view5"/>
+
+ <!-- view26 goes on the top-end -->
+ <TextView
+ android:id="@+id/relative_view26"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentTop="true"
+ android:layout_alignParentEnd="true"
+ android:text="@string/relative_view6"/>
+
+ <!-- view27, has same baseline with view26 and centered horizontally within its parent. -->
+ <TextView
+ android:id="@+id/relative_view27"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignBaseline="@id/relative_view26"
+ android:layout_centerHorizontal="true"
+ android:text="@string/relative_view7"/>
+
+ <!-- view28, centered vertically within its parent and on the start of view21. -->
+ <TextView
+ android:id="@+id/relative_view28"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_toStartOf="@id/relative_view21"
+ android:layout_centerVertical="true"
+ android:text="@string/relative_view8"/>
+
+ <!-- view29, has same top and bottom position with view23 and same start position
+ with its parent. -->
+ <TextView
+ android:id="@+id/relative_view29"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignStart="@id/gravity_bottom"
+ android:layout_alignTop="@id/relative_view23"
+ android:layout_alignBottom="@id/relative_view23"
+ android:layout_alignWithParentIfMissing="true"
+ android:text="@string/relative_view9"/>
+
+ </RelativeLayout>
+
+</RelativeLayout>
diff --git a/tests/tests/widget/res/layout/remote_view_test_bad_1.xml b/tests/tests/widget/res/layout/remote_view_test_bad_1.xml
new file mode 100644
index 0000000..a65a5ec
--- /dev/null
+++ b/tests/tests/widget/res/layout/remote_view_test_bad_1.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2008, 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.
+*/
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/linear"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <EditText android:id="@+id/edit"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/remote_view_test_bad_2.xml b/tests/tests/widget/res/layout/remote_view_test_bad_2.xml
new file mode 100644
index 0000000..92623d8
--- /dev/null
+++ b/tests/tests/widget/res/layout/remote_view_test_bad_2.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2008, 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.
+*/
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/linear"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <WebView android:id="@+id/web"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/remote_view_test_good.xml b/tests/tests/widget/res/layout/remote_view_test_good.xml
new file mode 100644
index 0000000..3df9d62
--- /dev/null
+++ b/tests/tests/widget/res/layout/remote_view_test_good.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2008, 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.
+*/
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/linear"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <TextView android:id="@+id/text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+
+ <ImageView android:id="@+id/image"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+
+ <FrameLayout android:id="@+id/frame"
+ android:layout_width="10dip"
+ android:layout_height="10dip" />
+
+ <RelativeLayout android:id="@+id/relative"
+ android:layout_width="10dip"
+ android:layout_height="10dip" />
+
+ <AbsoluteLayout android:id="@+id/absolute"
+ android:layout_width="10dip"
+ android:layout_height="10dip" />
+
+ <ProgressBar android:id="@+id/progress"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+
+ <ImageButton android:id="@+id/image_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+
+ <Button android:id="@+id/button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/remoteviews_good.xml b/tests/tests/widget/res/layout/remoteviews_good.xml
new file mode 100644
index 0000000..8fdbc64
--- /dev/null
+++ b/tests/tests/widget/res/layout/remoteviews_good.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/remoteViews_good"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <LinearLayout android:id="@+id/remoteView_linear"
+ android:layout_width="10dip"
+ android:layout_height="10dip" />
+
+ <TextView android:id="@+id/remoteView_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+
+ <ImageView android:id="@+id/remoteView_image"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+
+ <FrameLayout android:id="@+id/remoteView_frame"
+ android:layout_width="10dip"
+ android:layout_height="10dip" />
+
+ <RelativeLayout android:id="@+id/remoteView_relative"
+ android:layout_width="10dip"
+ android:layout_height="10dip" />
+
+ <AbsoluteLayout android:id="@+id/remoteView_absolute"
+ android:layout_width="10dip"
+ android:layout_height="10dip" />
+
+ <ProgressBar android:id="@+id/remoteView_progress"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ style="?android:attr/progressBarStyleHorizontal" />
+
+ <Chronometer android:id="@+id/remoteView_chronometer"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/remoteviews_host.xml b/tests/tests/widget/res/layout/remoteviews_host.xml
new file mode 100644
index 0000000..ace5903
--- /dev/null
+++ b/tests/tests/widget/res/layout/remoteviews_host.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:id="@+id/remoteView_host">
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/scrollview_layout.xml b/tests/tests/widget/res/layout/scrollview_layout.xml
new file mode 100644
index 0000000..3c9a474
--- /dev/null
+++ b/tests/tests/widget/res/layout/scrollview_layout.xml
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<android.widget.cts.MyScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/scroll_view"
+ android:layout_width="100dip"
+ android:layout_height="100dip">
+
+ <LinearLayout
+ android:orientation="vertical"
+ android:layout_width="250dip"
+ android:layout_height="wrap_content">
+
+ <Button
+ android:id="@+id/first_child"
+ android:layout_width="250dip"
+ android:layout_height="100dip"
+ android:text="@string/vertical_text_1"/>
+
+ <Button
+ android:layout_width="250dip"
+ android:layout_height="100dip"
+ android:text="@string/vertical_text_2"/>
+
+ <Button
+ android:layout_width="250dip"
+ android:layout_height="100dip"
+ android:text="@string/vertical_text_3"/>
+
+ <Button
+ android:layout_width="250dip"
+ android:layout_height="100dip"
+ android:text="@string/vertical_text_1"/>
+
+ <Button
+ android:layout_width="250dip"
+ android:layout_height="100dip"
+ android:text="@string/vertical_text_2"/>
+
+ <Button
+ android:layout_width="250dip"
+ android:layout_height="100dip"
+ android:text="@string/vertical_text_3"/>
+
+ <Button
+ android:layout_width="250dip"
+ android:layout_height="100dip"
+ android:text="@string/vertical_text_1"/>
+
+ <Button
+ android:layout_width="250dip"
+ android:layout_height="100dip"
+ android:text="@string/vertical_text_2"/>
+
+ <Button
+ android:layout_width="250dip"
+ android:layout_height="100dip"
+ android:text="@string/vertical_text_3"/>
+
+ <Button
+ android:layout_width="250dip"
+ android:layout_height="100dip"
+ android:text="@string/vertical_text_1"/>
+
+ <Button
+ android:layout_width="250dip"
+ android:layout_height="100dip"
+ android:text="@string/vertical_text_2"/>
+
+ <Button
+ android:layout_width="250dip"
+ android:layout_height="100dip"
+ android:text="@string/vertical_text_3"/>
+
+ <Button
+ android:layout_width="250dip"
+ android:layout_height="100dip"
+ android:text="@string/vertical_text_1"/>
+
+ <Button
+ android:layout_width="250dip"
+ android:layout_height="100dip"
+ android:text="@string/vertical_text_2"/>
+
+ <Button
+ android:id="@+id/last_child"
+ android:layout_width="250dip"
+ android:layout_height="100dip"
+ android:text="@string/vertical_text_3"/>
+ </LinearLayout>
+
+</android.widget.cts.MyScrollView>
diff --git a/tests/tests/widget/res/layout/seekbar_layout.xml b/tests/tests/widget/res/layout/seekbar_layout.xml
new file mode 100644
index 0000000..5c311fd
--- /dev/null
+++ b/tests/tests/widget/res/layout/seekbar_layout.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <SeekBar android:id="@+id/seekBar"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:max="100"
+ android:progress="50"
+ android:secondaryProgress="75" />
+
+ <SeekBar
+ android:id="@+id/thumb_tint"
+ android:thumbTint="@android:color/white"
+ android:thumbTintMode="src_over"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/simple_dropdown_item_1line.xml b/tests/tests/widget/res/layout/simple_dropdown_item_1line.xml
new file mode 100644
index 0000000..9a044b1
--- /dev/null
+++ b/tests/tests/widget/res/layout/simple_dropdown_item_1line.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/text1"
+ style="?android:attr/dropDownItemStyle"
+ android:textAppearance="?android:attr/textAppearanceLargeInverse"
+ android:singleLine="true"
+ android:layout_width="match_parent"
+ android:layout_height="?android:attr/listPreferredItemHeight" />
diff --git a/tests/tests/widget/res/layout/simple_spinner_item.xml b/tests/tests/widget/res/layout/simple_spinner_item.xml
new file mode 100644
index 0000000..d52922a
--- /dev/null
+++ b/tests/tests/widget/res/layout/simple_spinner_item.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@android:id/text1"
+ style="?android:attr/spinnerItemStyle"
+ android:singleLine="true"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
diff --git a/tests/tests/widget/res/layout/sliding_drawer_layout.xml b/tests/tests/widget/res/layout/sliding_drawer_layout.xml
new file mode 100644
index 0000000..3f84d46
--- /dev/null
+++ b/tests/tests/widget/res/layout/sliding_drawer_layout.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 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.
+-->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <SlidingDrawer
+ android:id="@+id/drawer"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:animateOnClick="false"
+
+ android:handle="@+id/handle"
+ android:content="@+id/content">
+
+ <ImageView
+ android:id="@id/handle"
+ android:background="#FF00FF00"
+ android:layout_width="88dip"
+ android:layout_height="44dip" />
+
+ <TextView
+ android:id="@id/content"
+ android:background="#FF0000FF"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:text="@string/hello_world" />
+
+ </SlidingDrawer>
+
+</RelativeLayout>
diff --git a/tests/tests/widget/res/layout/tabhost_layout.xml b/tests/tests/widget/res/layout/tabhost_layout.xml
new file mode 100644
index 0000000..1bae57a
--- /dev/null
+++ b/tests/tests/widget/res/layout/tabhost_layout.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@android:id/tabhost"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+
+ <TabWidget android:id="@android:id/tabs"
+ android:layout_width="match_parent"
+ android:layout_height="68dip"
+ android:paddingLeft="1dip"
+ android:paddingRight="1dip"
+ android:paddingTop="4dip"
+ />
+
+ <FrameLayout android:id="@android:id/tabcontent"
+ android:layout_width="match_parent"
+ android:layout_height="0dip"
+ android:layout_weight="1">
+
+ <TextView android:id="@+id/tabhost_textview"
+ android:password="true"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/hello_world"/>
+
+ <ListView android:id="@+id/tabhost_listview"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"/>
+ </FrameLayout>
+</TabHost>
diff --git a/tests/tests/widget/res/layout/table_layout_1.xml b/tests/tests/widget/res/layout/table_layout_1.xml
new file mode 100644
index 0000000..0896cd2
--- /dev/null
+++ b/tests/tests/widget/res/layout/table_layout_1.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/table1"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:collapseColumns="0"
+ android:stretchColumns="2">
+
+ <TableRow>
+ <TextView
+ android:text="@string/table_layout_first"
+ android:padding="3dip" />
+ <TextView
+ android:text="@string/table_layout_second"
+ android:padding="3dip" />
+ <TextView
+ android:text="@string/table_layout_third"
+ android:padding="3dip" />
+ </TableRow>
+</TableLayout>
+
diff --git a/tests/tests/widget/res/layout/table_layout_2.xml b/tests/tests/widget/res/layout/table_layout_2.xml
new file mode 100644
index 0000000..84750fc
--- /dev/null
+++ b/tests/tests/widget/res/layout/table_layout_2.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/table2"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:shrinkColumns="1">
+
+ <TableRow>
+ <TextView
+ android:layout_column="1"
+ android:text="@string/table_layout_long"
+ android:padding="3dip" />
+ <TextView
+ android:layout_span="2"
+ android:text="@string/table_layout_second"
+ android:padding="3dip" />
+ <TextView
+ android:text="@string/table_layout_third"
+ android:padding="3dip" />
+ </TableRow>
+</TableLayout>
+
diff --git a/tests/tests/widget/res/layout/textview_autolink.xml b/tests/tests/widget/res/layout/textview_autolink.xml
new file mode 100644
index 0000000..53d89f3
--- /dev/null
+++ b/tests/tests/widget/res/layout/textview_autolink.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <TextView android:id="@+id/autolink_default"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"/>
+
+ <TextView android:id="@+id/autolink_web"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:autoLink="web"/>
+
+ <TextView android:id="@+id/autolink_email"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:autoLink="email"/>
+
+ <TextView android:id="@+id/autolink_phone"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:autoLink="phone"/>
+
+ <TextView android:id="@+id/autolink_all"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:autoLink="all"/>
+
+ <TextView android:id="@+id/autolink_compound1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:autoLink="web|email"/>
+
+ <TextView android:id="@+id/autolink_compound2"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:autoLink="web|phone"/>
+
+ <TextView android:id="@+id/autolink_compound3"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:autoLink="email|phone"/>
+
+ <TextView android:id="@+id/autolink_compound4"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:autoLink="phone|all"/>
+
+</FrameLayout>
diff --git a/tests/tests/widget/res/layout/textview_ellipsize.xml b/tests/tests/widget/res/layout/textview_ellipsize.xml
new file mode 100644
index 0000000..0fc5779
--- /dev/null
+++ b/tests/tests/widget/res/layout/textview_ellipsize.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <TextView android:id="@+id/ellipsize_default"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"/>
+
+ <TextView android:id="@+id/ellipsize_none"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:ellipsize="none"/>
+
+ <TextView android:id="@+id/ellipsize_start"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:ellipsize="start"/>
+
+ <TextView android:id="@+id/ellipsize_middle"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:ellipsize="middle"/>
+
+ <TextView android:id="@+id/ellipsize_end"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:ellipsize="end"/>
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/textview_gravity.xml b/tests/tests/widget/res/layout/textview_gravity.xml
new file mode 100644
index 0000000..a4a7592
--- /dev/null
+++ b/tests/tests/widget/res/layout/textview_gravity.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <TextView android:id="@+id/gravity_default"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"/>
+
+ <TextView android:id="@+id/gravity_bottom"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="bottom"/>
+
+ <TextView android:id="@+id/gravity_right"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="right"/>
+
+ <TextView android:id="@+id/gravity_fill"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="fill"/>
+
+ <TextView android:id="@+id/gravity_center"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center"/>
+
+ <TextView android:id="@+id/gravity_center_vertical_right"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center_vertical|right"/>
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/textview_hint_linksclickable_freezestext.xml b/tests/tests/widget/res/layout/textview_hint_linksclickable_freezestext.xml
new file mode 100644
index 0000000..a22e429
--- /dev/null
+++ b/tests/tests/widget/res/layout/textview_hint_linksclickable_freezestext.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <TextView android:id="@+id/hint_linksClickable_freezesText_default"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"/>
+
+ <TextView android:id="@+id/hint_blank"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:hint=""/>
+
+ <TextView android:id="@+id/hint_string"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:hint="@string/text_view_simple_hint"/>
+
+ <TextView android:id="@+id/hint_resid"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:hint="@string/text_view_hint"/>
+
+ <TextView android:id="@+id/linksClickable_true"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:linksClickable="true"/>
+
+ <TextView android:id="@+id/linksClickable_false"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:linksClickable="false"/>
+
+ <TextView android:id="@+id/freezesText_true"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:freezesText="true"/>
+
+ <TextView android:id="@+id/freezesText_false"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:freezesText="false"/>
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/textview_layout.xml b/tests/tests/widget/res/layout/textview_layout.xml
new file mode 100644
index 0000000..c2cd159
--- /dev/null
+++ b/tests/tests/widget/res/layout/textview_layout.xml
@@ -0,0 +1,219 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:id="@+id/layout_textviewtest">
+
+ <ScrollView android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <LinearLayout android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <TextView android:id="@+id/textview_textAttr"
+ android:text="@string/text_view_hello"
+ android:textColor="@drawable/black"
+ android:textColorHighlight="@drawable/yellow"
+ android:textColorHint="@drawable/red"
+ android:textColorLink="@drawable/blue"
+ android:textScaleX="1.2"
+ android:typeface="normal"
+ android:textSize="20px"
+ android:textStyle="normal"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"/>
+
+ <TextView android:id="@+id/textview_password"
+ android:password="true"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"/>
+
+ <TextView android:id="@+id/textview_singleLine"
+ android:singleLine="true"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"/>
+
+ <TextView android:id="@+id/textview_text"
+ android:text="@string/text_view_hello"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"/>
+
+ <TextView android:id="@+id/textview_text_two_lines"
+ android:text="@string/text_view_hello_two_lines"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"/>
+
+ <android.widget.cts.MockTextView
+ android:id="@+id/mock_textview_left"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:requiresFadingEdge="horizontal"
+ android:singleLine="true"
+ android:text="@string/long_text"
+ android:gravity="left"
+ />
+
+ <android.widget.cts.MockTextView
+ android:id="@+id/mock_textview_right"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:requiresFadingEdge="horizontal"
+ android:singleLine="true"
+ android:text="@string/long_text"
+ android:gravity="right"
+ />
+
+ <android.widget.cts.MockTextView
+ android:id="@+id/mock_textview_center"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:requiresFadingEdge="horizontal"
+ android:singleLine="true"
+ android:text="@string/long_text"
+ android:gravity="center"
+ />
+ </LinearLayout>
+
+ </ScrollView>
+
+ <TextView android:id="@+id/textview_ltr"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"/>
+
+ <TextView android:id="@+id/textview_rtl"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"/>
+
+ <TextView android:id="@+id/textview_drawable_1_1"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:drawableLeft="@drawable/icon_blue"
+ android:drawableRight="@drawable/icon_red"
+ android:drawableTop="@drawable/icon_green"
+ android:drawableBottom="@drawable/icon_yellow"
+ />
+
+ <TextView android:id="@+id/textview_drawable_1_2"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:drawableLeft="@drawable/icon_blue"
+ android:drawableRight="@drawable/icon_red"
+ android:drawableTop="@drawable/icon_green"
+ android:drawableBottom="@drawable/icon_yellow"
+ android:layoutDirection="rtl"
+ />
+
+ <TextView android:id="@+id/textview_drawable_2_1"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:drawableStart="@drawable/icon_blue"
+ android:drawableEnd="@drawable/icon_red"
+ android:drawableTop="@drawable/icon_green"
+ android:drawableBottom="@drawable/icon_yellow"
+ />
+
+ <TextView android:id="@+id/textview_drawable_2_2"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:drawableStart="@drawable/icon_blue"
+ android:drawableEnd="@drawable/icon_red"
+ android:drawableTop="@drawable/icon_green"
+ android:drawableBottom="@drawable/icon_yellow"
+ android:layoutDirection="rtl"
+ />
+
+ <TextView android:id="@+id/textview_drawable_3_1"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:drawableLeft="@drawable/icon_black"
+ android:drawableRight="@drawable/icon_black"
+ android:drawableStart="@drawable/icon_blue"
+ android:drawableEnd="@drawable/icon_red"
+ android:drawableTop="@drawable/icon_green"
+ android:drawableBottom="@drawable/icon_yellow"
+ />
+
+ <TextView android:id="@+id/textview_drawable_3_2"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:drawableLeft="@drawable/icon_black"
+ android:drawableRight="@drawable/icon_black"
+ android:drawableStart="@drawable/icon_blue"
+ android:drawableEnd="@drawable/icon_red"
+ android:drawableTop="@drawable/icon_green"
+ android:drawableBottom="@drawable/icon_yellow"
+ android:layoutDirection="rtl"
+ />
+
+
+ <LinearLayout android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layoutDirection="ltr">
+
+ <TextView android:id="@+id/textview_drawable_4_1"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:drawableStart="@drawable/icon_blue"
+ android:drawableEnd="@drawable/icon_red"
+ android:drawableTop="@drawable/icon_green"
+ android:drawableBottom="@drawable/icon_yellow"
+ />
+
+ <TextView android:id="@+id/textview_drawable_5_1"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:drawableLeft="@drawable/icon_black"
+ android:drawableRight="@drawable/icon_black"
+ android:drawableStart="@drawable/icon_blue"
+ android:drawableEnd="@drawable/icon_red"
+ android:drawableTop="@drawable/icon_green"
+ android:drawableBottom="@drawable/icon_yellow"
+ />
+
+ </LinearLayout>
+
+ <LinearLayout android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layoutDirection="rtl">
+
+ <TextView android:id="@+id/textview_drawable_4_2"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:drawableStart="@drawable/icon_blue"
+ android:drawableEnd="@drawable/icon_red"
+ android:drawableTop="@drawable/icon_green"
+ android:drawableBottom="@drawable/icon_yellow"
+ />
+
+ <TextView android:id="@+id/textview_drawable_5_2"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:drawableLeft="@drawable/icon_black"
+ android:drawableRight="@drawable/icon_black"
+ android:drawableStart="@drawable/icon_blue"
+ android:drawableEnd="@drawable/icon_red"
+ android:drawableTop="@drawable/icon_green"
+ android:drawableBottom="@drawable/icon_yellow"
+ />
+
+ </LinearLayout>
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/textview_selectallonfocus.xml b/tests/tests/widget/res/layout/textview_selectallonfocus.xml
new file mode 100644
index 0000000..b1c3682
--- /dev/null
+++ b/tests/tests/widget/res/layout/textview_selectallonfocus.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <TextView android:id="@+id/selectAllOnFocus_default"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:focusable="true"/>
+
+ <TextView android:id="@+id/selectAllOnFocus_true"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:selectAllOnFocus="true"
+ android:focusable="true"/>
+
+ <TextView android:id="@+id/selectAllOnFocus_false"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:selectAllOnFocus="false"
+ android:focusable="true"/>
+
+ <TextView android:id="@+id/selectAllOnFocus_dummy"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:focusable="true"/>
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/timepicker.xml b/tests/tests/widget/res/layout/timepicker.xml
new file mode 100644
index 0000000..352f69b
--- /dev/null
+++ b/tests/tests/widget/res/layout/timepicker.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<TimePicker xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"/>
diff --git a/tests/tests/widget/res/layout/togglebutton_layout.xml b/tests/tests/widget/res/layout/togglebutton_layout.xml
new file mode 100644
index 0000000..a6c08e1
--- /dev/null
+++ b/tests/tests/widget/res/layout/togglebutton_layout.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 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.
+ -->
+
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <LinearLayout
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <ToggleButton android:id="@+id/toggle1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+
+ <ToggleButton android:id="@+id/toggle2"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+
+ <ToggleButton android:id="@+id/button_tint"
+ android:buttonTint="@android:color/white"
+ android:buttonTintMode="src_over"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+
+ </LinearLayout>
+
+</ScrollView>
diff --git a/tests/tests/widget/res/layout/twolinelistitem.xml b/tests/tests/widget/res/layout/twolinelistitem.xml
new file mode 100644
index 0000000..ec256c1
--- /dev/null
+++ b/tests/tests/widget/res/layout/twolinelistitem.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<TwoLineListItem xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:id="@+id/twoLineListItem">
+
+ <TextView android:id="@android:id/text1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/twolinelistitem_test_text1"/>
+
+ <TextView android:id="@android:id/text2"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/twolinelistitem_test_text2"/>
+
+</TwoLineListItem>
diff --git a/tests/tests/widget/res/layout/urlspan_layout.xml b/tests/tests/widget/res/layout/urlspan_layout.xml
new file mode 100644
index 0000000..2ca95ac
--- /dev/null
+++ b/tests/tests/widget/res/layout/urlspan_layout.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 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.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <TextView android:id="@+id/url"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingLeft="4dip"
+ android:focusable="true"
+ android:focusableInTouchMode="true"
+ android:text="@string/text_view_hello"/>
+
+</LinearLayout>
diff --git a/tests/src/android/widget/cts/ListViewStubActivity.java b/tests/tests/widget/res/layout/videoview_layout.xml
similarity index 61%
copy from tests/src/android/widget/cts/ListViewStubActivity.java
copy to tests/tests/widget/res/layout/videoview_layout.xml
index 77c3e5e..9b042cb 100644
--- a/tests/src/android/widget/cts/ListViewStubActivity.java
+++ b/tests/tests/widget/res/layout/videoview_layout.xml
@@ -1,4 +1,5 @@
-/*
+<?xml version="1.0" encoding="utf-8"?>
+<!--
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -12,19 +13,14 @@
* 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.
- */
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
-package android.widget.cts;
-
-import com.android.cts.stub.R;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class ListViewStubActivity extends Activity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.listview_layout);
- }
-}
+ <VideoView
+ android:id="@+id/videoview"
+ android:layout_width="160px"
+ android:layout_height="120px"/>
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/viewanimator_layout.xml b/tests/tests/widget/res/layout/viewanimator_layout.xml
new file mode 100644
index 0000000..96b2483
--- /dev/null
+++ b/tests/tests/widget/res/layout/viewanimator_layout.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 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.
+ -->
+
+<!-- Demonstrates using a relative layout to create a form -->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:focusable="true"
+ android:background="@drawable/blue">
+
+ <TextView android:id="@+id/label"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentTop="true"
+ android:layout_alignParentLeft="true"
+ android:text="@string/viewanimator_test"/>
+
+ <EditText android:id="@+id/entry"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="@android:drawable/editbox_background"
+ android:layout_below="@id/label"/>
+
+ <Button android:id="@+id/cancel"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/entry"
+ android:layout_alignParentRight="true"
+ android:layout_marginLeft="10px"
+ android:text="@string/id_cancel" />
+
+ <Button android:id="@+id/ok"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_toLeftOf="@id/cancel"
+ android:layout_alignTop="@id/cancel"
+ android:text="@string/id_ok" />
+
+</RelativeLayout>
+
diff --git a/tests/tests/widget/res/layout/viewflipper_layout.xml b/tests/tests/widget/res/layout/viewflipper_layout.xml
new file mode 100644
index 0000000..6480379
--- /dev/null
+++ b/tests/tests/widget/res/layout/viewflipper_layout.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 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.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:padding="10dip"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <ViewFlipper android:id="@+id/viewflipper_test"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:flipInterval="1000"
+ android:layout_marginBottom="20dip" >
+ <TextView android:id="@+id/viewflipper_textview1"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center_horizontal"
+ android:textSize="26sp"
+ android:visibility="gone"
+ android:text="@string/hello_world"/>
+ <TextView android:id="@+id/viewflipper_textview2"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center_horizontal"
+ android:textSize="26sp"
+ android:visibility="gone"
+ android:text="@string/hello_android"/>
+ </ViewFlipper>
+</LinearLayout>
+
diff --git a/tests/tests/widget/res/layout/viewgrouptest_stub.xml b/tests/tests/widget/res/layout/viewgrouptest_stub.xml
new file mode 100644
index 0000000..ee59126
--- /dev/null
+++ b/tests/tests/widget/res/layout/viewgrouptest_stub.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Copyright (C) 2008 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.
+ -->
+
+<android.widget.cts.MockLinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:id="@+id/mocklinearlayout">
+
+ <!-- view1 goes on top -->
+ <TextView
+ android:id="@+id/viewgrouptest_stub"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ />
+
+</android.widget.cts.MockLinearLayout>
+
diff --git a/tests/tests/widget/res/layout/viewswitcher_layout.xml b/tests/tests/widget/res/layout/viewswitcher_layout.xml
new file mode 100644
index 0000000..933dc32
--- /dev/null
+++ b/tests/tests/widget/res/layout/viewswitcher_layout.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 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.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <ViewSwitcher android:id="@+id/viewswitcher_test"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+</LinearLayout>
+
diff --git a/tests/src/android/os/cts/TaggedPointer.java b/tests/tests/widget/res/layout/zoombutton_layout.xml
similarity index 64%
copy from tests/src/android/os/cts/TaggedPointer.java
copy to tests/tests/widget/res/layout/zoombutton_layout.xml
index 16e76c9..1b1e0b2 100644
--- a/tests/src/android/os/cts/TaggedPointer.java
+++ b/tests/tests/widget/res/layout/zoombutton_layout.xml
@@ -1,5 +1,6 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 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.
@@ -12,15 +13,10 @@
* 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.
- */
+ -->
+<ZoomButton xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/zoombutton_test"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+/>
-package android.os.cts;
-
-public class TaggedPointer {
-
- static {
- System.loadLibrary("cts_jni");
- }
-
- public static native boolean hasTaggedPointer();
-}
diff --git a/tests/tests/widget/res/raw/scenery.jpg b/tests/tests/widget/res/raw/scenery.jpg
new file mode 100644
index 0000000..7d1f5e1
--- /dev/null
+++ b/tests/tests/widget/res/raw/scenery.jpg
Binary files differ
diff --git a/tests/tests/widget/res/raw/testimage.jpg b/tests/tests/widget/res/raw/testimage.jpg
new file mode 100644
index 0000000..d3dae03
--- /dev/null
+++ b/tests/tests/widget/res/raw/testimage.jpg
Binary files differ
diff --git a/tests/tests/widget/res/raw/testvideo.3gp b/tests/tests/widget/res/raw/testvideo.3gp
new file mode 100644
index 0000000..1503272
--- /dev/null
+++ b/tests/tests/widget/res/raw/testvideo.3gp
Binary files differ
diff --git a/tests/tests/widget/res/values/arrays.xml b/tests/tests/widget/res/values/arrays.xml
new file mode 100644
index 0000000..71e0133
--- /dev/null
+++ b/tests/tests/widget/res/values/arrays.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 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.
+ -->
+
+<resources>
+ <item type="integer" name="reference" format="integer">101</item>
+
+ <string-array name="strings">
+ <item>zero</item>
+ <item>1</item>
+ <item>@string/reference</item>
+ </string-array>
+
+ <integer-array name="integers">
+ <item>0</item>
+ <item>1</item>
+ <item>@integer/reference</item>
+ </integer-array>
+
+ <array name="difficultyLevel">
+ <item>Easy</item>
+ <item>Medium</item>
+ <item>Hard</item>
+ </array>
+
+ <string-array name="string">
+ <item>Test String 1</item>
+ <item>Test String 2</item>
+ <item>Test String 3</item>
+ </string-array>
+
+ <integer-array name="table_row_layout">
+ <item>1</item>
+ <item>2</item>
+ <item>3</item>
+ <item>4</item>
+ <item>5</item>
+ <item>6</item>
+ <item>7</item>
+ <item>8</item>
+ <item>9</item>
+ <item>10</item>
+ </integer-array>
+</resources>
diff --git a/tests/tests/widget/res/values/attrs.xml b/tests/tests/widget/res/values/attrs.xml
new file mode 100644
index 0000000..4c3d9db
--- /dev/null
+++ b/tests/tests/widget/res/values/attrs.xml
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 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.
+ -->
+
+<resources>
+ <declare-styleable name="Style1">
+ <attr name="Type1" format="integer">
+ <enum name="type" value="28" />
+ <enum name="data" value="0xff00ff00" />
+ <enum name="asset_cookie" value="0" />
+ <enum name="resource_id" value="0" />
+ <enum name="changing_config" value="0" />
+ </attr>
+ <attr name="Type2" format="integer">
+ <enum name="type" value="28" />
+ <enum name="data" value="0xff0000ff" />
+ <enum name="asset_cookie" value="0" />
+ <enum name="resource_id" value="0" />
+ <enum name="changing_config" value="0" />
+ </attr>
+ </declare-styleable>
+ <attr name="type1" format="boolean"/>
+ <attr name="type2" format="boolean"/>
+ <attr name="type3" format="color"/>
+ <attr name="type4" format="reference|color"/>
+ <attr name="type5" format="dimension"/>
+ <attr name="type6" format="dimension"/>
+ <attr name="type7" format="dimension"/>
+ <attr name="type8" format="reference"/>
+ <attr name="type9" format="float"/>
+ <attr name="type10" format="fraction"/>
+ <attr name="type11" format="integer"/>
+ <attr name="type12" format="integer"/>
+ <attr name="type13" format="reference|string"/>
+ <attr name="type14" format="string"/>
+ <attr name="type15" format="reference"/>
+ <attr name="type16" format="string"/>
+ <declare-styleable name="style1">
+ <attr name="type1"/>
+ <attr name="type2"/>
+ <attr name="type3"/>
+ <attr name="type4"/>
+ <attr name="type5"/>
+ <attr name="type6"/>
+ <attr name="type7"/>
+ <attr name="type8"/>
+ <attr name="type9"/>
+ <attr name="type10"/>
+ <attr name="type11"/>
+ <attr name="type12"/>
+ <attr name="type13"/>
+ <attr name="type14"/>
+ <attr name="type15"/>
+ <attr name="type16"/>
+ </declare-styleable>
+ <attr name="testEnum">
+ <enum name="val1" value="1" />
+ <enum name="val2" value="2" />
+ <enum name="val10" value="10" />
+ </attr>
+ <attr name="testFlags">
+ <flag name="bit1" value="0x1" />
+ <flag name="bit2" value="0x2" />
+ <flag name="bit31" value="0x40000000" />
+ </attr>
+ <attr name="testString" format="string" />
+ <declare-styleable name="EnumStyle">
+ <attr name="testEnum" />
+ </declare-styleable>
+ <declare-styleable name="FlagStyle">
+ <attr name="testFlags" />
+ </declare-styleable>
+ <declare-styleable name="TestConfig">
+ <attr name="testString" />
+ </declare-styleable>
+ <!-- Size of text. Recommended dimension type for text is "sp" for scaled-pixels (example: 15sp).
+ Supported values include the following:<p/>
+ <ul>
+ <li><b>px</b> Pixels</li>
+ <li><b>sp</b> Scaled pixels (scaled to relative pixel size on screen). See {@link android.util.DisplayMetrics} for more information.</li>
+ <li><b>pt</b> Points</li>
+ <li><b>dip</b> Device independent pixels. See {@link android.util.DisplayMetrics} for more information.</li>
+ </ul>
+ -->
+ <attr name="textSize" format="dimension" />
+ <attr name="typeface">
+ <enum name="normal" value="0" />
+ <enum name="sans" value="1" />
+ <enum name="serif" value="2" />
+ <enum name="monospace" value="3" />
+ </attr>
+ <!-- Default text typeface style. -->
+ <attr name="textStyle">
+ <flag name="normal" value="0" />
+ <flag name="bold" value="1" />
+ <flag name="italic" value="2" />
+ </attr>
+ <!-- Color of text (usually same as colorForeground). -->
+ <attr name="textColor" format="reference|color" />
+ <!-- Color of highlighted text. -->
+ <attr name="textColorHighlight" format="reference|color" />
+ <!-- Color of hint text (displayed when the field is empty). -->
+ <attr name="textColorHint" format="reference|color" />
+ <!-- Color of link text (URLs). -->
+ <attr name="textColorLink" format="reference|color" />
+ <declare-styleable name="TextAppearance">
+ <attr name="textColor"/>
+ <attr name="textSize"/>
+ <attr name="textStyle"/>
+ <attr name="typeface"/>
+ <attr name="textColorHighlight"/>
+ <attr name="textColorHint"/>
+ <attr name="textColorLink"/>
+ </declare-styleable>
+ <!-- Integer used to uniquely identify theme overrides. -->
+ <attr name="themeType" format="integer"/>
+ <!-- Theme reference used to override parent theme. -->
+ <attr name="themeOverrideAttr" format="reference"/>
+
+ <!-- Drawable theming attributes -->
+ <attr name="themeBoolean" />
+ <attr name="themeColor" />
+ <attr name="themeFloat" />
+ <attr name="themeInteger" />
+ <attr name="themeDimension" />
+ <attr name="themeDrawable" />
+ <attr name="themeBitmap" />
+ <attr name="themeNinePatch" />
+ <attr name="themeGravity" />
+ <attr name="themeTileMode" />
+ <attr name="themeAngle" />
+</resources>
diff --git a/tests/src/android/widget/cts/ProgressBarStubActivity.java b/tests/tests/widget/res/values/colors.xml
similarity index 60%
copy from tests/src/android/widget/cts/ProgressBarStubActivity.java
copy to tests/tests/widget/res/values/colors.xml
index 57cfa1a..f3cc325 100644
--- a/tests/src/android/widget/cts/ProgressBarStubActivity.java
+++ b/tests/tests/widget/res/values/colors.xml
@@ -1,4 +1,5 @@
-/*
+<?xml version="1.0" encoding="utf-8"?>
+<!--
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -12,23 +13,14 @@
* 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.widget.cts;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-/**
- * An application for ProgressBar test
- *
- */
-public class ProgressBarStubActivity extends Activity {
- /**
- * Called with the activity is first created.
- */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- }
-}
+<resources>
+ <drawable name="red">#7f00</drawable>
+ <drawable name="blue">#770000ff</drawable>
+ <drawable name="black">#77ffffff</drawable>
+ <drawable name="yellow">#77ffff00</drawable>
+ <color name="testcolor1">#ff00ff00</color>
+ <color name="testcolor2">#ffff0000</color>
+ <color name="failColor">#ff0000ff</color>
+</resources>
diff --git a/tests/tests/widget/res/values/strings.xml b/tests/tests/widget/res/values/strings.xml
new file mode 100644
index 0000000..c167278
--- /dev/null
+++ b/tests/tests/widget/res/values/strings.xml
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="permlab_testGranted">Test Granted</string>
+ <string name="permdesc_testGranted">Used for running CTS tests, for testing operations
+ where we have the permission.</string>
+ <string name="permlab_testDynamic">Test Dynamic</string>
+ <string name="permdesc_testDynamic">Used for running CTS tests, for testing adding
+ dynamic permissions.</string>
+ <string name="permlab_testDenied">Test Denied</string>
+ <string name="permdesc_testDenied">Used for running CTS tests, for testing operations
+ where we do not have the permission.</string>
+ <string name="explain">1. click start. \n2. if above image shaked, then press pass button,
+ else press failed button.</string>
+ <string name="text_view_hello">Hello! Text view!</string>
+ <string name="text_view_hello_two_lines">Hello! \nText view!</string>
+ <string name="text_view_simple_hint">This is a hint.</string>
+ <string name="text_view_hint">This is a string for testing hint of textview.</string>
+ <string name="activity_forwarding">App/Forwarding</string>
+ <string name="forwarding">$$$</string>
+ <string name="go">Go</string>
+ <string name="back">Back</string>
+ <string name="forward_target">
+ Press back button and notice we don\'t see the previous activity.
+ </string>
+ <string name="edit_text">testing</string>
+ <string name="text">DialogTest</string>
+ <string name="text_country">Country</string>
+ <string name="text_name">Name</string>
+ <string name="hello_world">Hello, World!</string>
+ <string name="hello_android">Hello, Android!</string>
+ <string name="alert_dialog_username">Name:</string>
+ <string name="alert_dialog_password">Password:</string>
+ <string name="alert_dialog_positive">Positive</string>
+ <string name="alert_dialog_negative">Negative</string>
+ <string name="alert_dialog_neutral">Neutral</string>
+ <string name="notify">Notify </string>
+ <string name="tabs_1">testing</string>
+ <string name="table_layout_first">first</string>
+ <string name="table_layout_second">second</string>
+ <string name="table_layout_third">third</string>
+ <string name="table_layout_long">Very long to make the string out of the screen</string>
+ <string name="chronometer_text">Test Chronometer</string>
+ <string name="am">AM</string>
+ <string name="pm">PM</string>
+ <string name="viewgroup_test">ViewGroup test</string>
+ <string name="viewanimator_test">ViewAnimator test</string>
+ <string name="id_ok">OK</string>
+ <string name="id_cancel">Cancel</string>
+ <string name="context_test_string1">This is %s string.</string>
+ <string name="context_test_string2">This is test string.</string>
+ <string name="animationutils_test_instructions">Choose different animations</string>
+ <string name="animationutils_test_alpha">Alpha animation</string>
+ <string name="animationutils_test_scale">Scale animation</string>
+ <string name="animationutils_test_rotate">Rotate animation</string>
+ <string name="animationutils_test_translate">Translate animation</string>
+ <string name="animationutils_test_set">Animation set</string>
+ <string name="animationutils_test_layout">Layout animation</string>
+ <string name="animationutils_test_gridlayout">Grid layout animation</string>
+ <string name="twolinelistitem_test_text1">text1</string>
+ <string name="twolinelistitem_test_text2">text2</string>
+ <string name="metadata_text">metadata text</string>
+ <string name="horizontal_text_1">horizontal 1</string>
+ <string name="horizontal_text_2">horizontal 2</string>
+ <string name="horizontal_text_3">horizontal 3</string>
+ <string name="vertical_text_1">vertical 1</string>
+ <string name="vertical_text_2">vertical 2</string>
+ <string name="vertical_text_3">vertical 3</string>
+ <string name="reference">here</string>
+ <string name="coerceIntegerToString">100</string>
+ <string name="coerceBooleanToString">true</string>
+ <string name="coerceColorToString">#fff</string>
+ <string name="coerceFloatToString">100.0</string>
+ <string name="coerceDimensionToString">100px</string>
+ <string name="coerceFractionToString">100<xliff:g id="percent">%</xliff:g></string>
+ <string name="formattedStringNone">Format[]</string>
+ <string name="formattedStringOne">Format[<xliff:g id="format">%d</xliff:g>]</string>
+ <string name="formattedStringTwo">Format[<xliff:g id="format">%3$d,%2$s</xliff:g>]</string>
+ <string name="checkboxpref_key">checkboxpref_key</string>
+ <string name="checkboxpref_title">title of preference</string>
+ <string name="checkboxpref_summary">summary of preference</string>
+ <string name="checkboxpref_summary_on">summary on of preference</string>
+ <string name="checkboxpref_summary_off">summary off of preference</string>
+ <string name="checkboxpref_depend">checkboxpref_depend</string>
+ <string name="checkboxpref_depend_title"> depend title of preference</string>
+ <string name="checkboxpref_depend_summary"> depend summary of preference</string>
+ <string name="edittextpref_key">edittextpref_key</string>
+ <string name="edittextpref_default_value">default value of preference</string>
+ <string name="edittextpref_title">title of edit text preference</string>
+ <string name="edittextpref_summary">summary of edit text preference</string>
+ <string name="edittextpref_dialog_title">dialog title of edit text preference</string>
+ <string name="edittextpref_text">text of edit text preference</string>
+ <string name="listpref_key">listpref_key</string>
+ <string name="listpref_title">title of list preference</string>
+ <string name="listpref_summary">summary of list preference</string>
+ <string name="listpref_dialogtitle">dialog title of list preference</string>
+ <string name="easy">Easy</string>
+ <string name="medium">Medium</string>
+ <string name="hard">Hard</string>
+ <string name="footer_view">Footer view</string>
+ <string name="header_view">Header view</string>
+ <string name="dialogpref_title">title of dialog preference </string>
+ <string name="dialogpref_dialog_title">dialog title of dialog preference </string>
+ <string name="dialogpref_key">dialogpref_key</string>
+ <string name="dialogpref_default_value">default value of dialog preference</string>
+ <string name="dialogpref_summary">summary of dialog preference</string>
+ <string name="dialogpref_message">message of dialog preference</string>
+ <string name="dialogpref_sure">Sure</string>
+ <string name="dialogpref_cancel">Cancel</string>
+ <string name="pref_key">pref_key</string>
+ <string name="pref_title">title of preference</string>
+ <string name="pref_summary">summary of preference</string>
+ <string name="pref_depend_key">pref_depend_key</string>
+ <string name="pref_depend_title"> depend title of preference</string>
+ <string name="pref_depend_summary"> depend summary of preference</string>
+ <string name="android_intent_action_preference">android.intent.action.PREFERENCE</string>
+ <string name="def_pref_key">def_pref_key</string>
+ <string name="def_pref_title">default preference</string>
+ <string name="def_pref_summary">This is default preference of cts</string>
+ <string name="relative_view1">view 1</string>
+ <string name="relative_view2">view 2</string>
+ <string name="relative_view3">view 3</string>
+ <string name="relative_view4">view 4</string>
+ <string name="relative_view5">view 5</string>
+ <string name="relative_view6">view 6</string>
+ <string name="relative_view7">view 7</string>
+ <string name="relative_view8">view 8</string>
+ <string name="relative_view9">view 9</string>
+ <string name="relative_view10">view 10</string>
+ <string name="relative_view11">view 11</string>
+ <string name="relative_view12">view 12</string>
+ <string name="relative_view13">view 13</string>
+ <string name="country">Country:</string>
+ <string name="symbol">Symbol:</string>
+ <string name="country_warning">No such country registered</string>
+ <string name="version_cur">base</string>
+ <string name="version_old">base</string>
+ <string name="version_v3">base</string>
+ <string name="authenticator_label">Android CTS</string>
+ <string name="search_label">Android CTS</string>
+ <string name="tag1">tag 1</string>
+ <string name="tag2">tag 2</string>
+
+ <string name="button">Button</string>
+ <string name="holo_test">Holo Test</string>
+ <string name="holo_generator">Holo Generator</string>
+ <string name="holo_light_test">Holo Light Test</string>
+ <string name="holo_light_generator">Holo Light Generator</string>
+ <string name="reference_image">Reference Image: </string>
+ <string name="generated_image">Generated Image: </string>
+ <string name="themes_prompt">Select a Theme:</string>
+ <string name="sample_text">Sample text goes here. I wanted something creative and whimsical
+but then I just got bored...</string>
+ <string name="long_text">This is a really long string which exceeds the width of the view.
+New devices have a much larger screen which actually enables long strings to be displayed
+with no fading. I have made this string longer to fix this case. If you are correcting this
+text, I would love to see the kind of devices you guys now use! Guys, maybe some devices need longer string!
+I think so, so how about double this string, like copy and paste!
+This is a really long string which exceeds the width of the view.
+New devices have a much larger screen which actually enables long strings to be displayed
+with no fading. I have made this string longer to fix this case. If you are correcting this
+text, I would love to see the kind of devices you guys now use! Guys, maybe some devices need longer string!
+I think so, so how about double this string, like copy and paste! </string>
+ <string name="rectangle200">"M 0,0 l 200,0 l 0, 200 l -200, 0 z"</string>
+</resources>
diff --git a/tests/tests/widget/res/values/styles.xml b/tests/tests/widget/res/values/styles.xml
new file mode 100644
index 0000000..81925cc
--- /dev/null
+++ b/tests/tests/widget/res/values/styles.xml
@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <style name="Whatever">
+ <item name="type1">true</item>
+ <item name="type2">false</item>
+ <item name="type3">#ff0000ff</item>
+ <item name="type4">#ff00ff00</item>
+ <item name="type5">0.75px</item>
+ <item name="type6">10px</item>
+ <item name="type7">18px</item>
+ <item name="type8">@drawable/pass</item>
+ <item name="type9">3.14</item>
+ <item name="type10">100%</item>
+ <item name="type11">365</item>
+ <item name="type12">86400</item>
+ <item name="type13">@string/hello_android</item>
+ <item name="type14">TypedArray Test!</item>
+ <item name="type15">@array/difficultyLevel</item>
+ <item name="type16">Typed Value!</item>
+ </style>
+
+ <style name="TextViewWithoutColorAndAppearance">
+ <item name="android:textSize">18sp</item>
+ </style>
+
+ <style name="TextViewWithColorButWithOutAppearance">
+ <item name="android:textColor">#ff0000ff</item>
+ </style>
+
+ <style name="TextViewWithColorAndAppearance">
+ <item name="android:textColor">#ff0000ff</item>
+ <item name="android:textAppearance">@style/TextAppearance.WithColor</item>
+ </style>
+
+ <style name="TextViewWithoutColorButWithAppearance">
+ <item name="android:textAppearance">@style/TextAppearance.WithColor</item>
+ </style>
+
+ <style name="TextAppearance" parent="android:TextAppearance">
+ </style>
+
+ <style name="TextAppearance.WithColor">
+ <item name="android:textColor">#ffff0000</item>
+ </style>
+
+ <style name="TextAppearance.All">
+ <item name="android:textColor">@drawable/black</item>
+ <item name="android:textSize">20px</item>
+ <item name="android:textStyle">bold</item>
+ <item name="android:textColorHint">@drawable/red</item>
+ <item name="android:textColorLink">@drawable/blue</item>
+ <item name="android:textColorHighlight">@drawable/yellow</item>
+ </style>
+
+ <style name="TextAppearance.Colors">
+ <item name="android:textColor">@drawable/black</item>
+ <item name="android:textColorHint">@drawable/blue</item>
+ <item name="android:textColorLink">@drawable/yellow</item>
+ <item name="android:textColorHighlight">@drawable/red</item>
+ </style>
+
+ <style name="TextAppearance.NotColors">
+ <item name="android:textSize">17px</item>
+ <item name="android:typeface">sans</item>
+ <item name="android:textStyle">normal</item>
+ </style>
+
+ <style name="TextAppearance.Style">
+ <item name="android:textStyle">normal</item>
+ </style>
+
+ <style name="TestEnum1">
+ <item name="testEnum">val1</item>
+ </style>
+
+ <style name="TestEnum2">
+ <item name="testEnum">val2</item>
+ </style>
+
+ <style name="TestEnum10">
+ <item name="testEnum">val10</item>
+ </style>
+
+ <style name="TestFlag1">
+ <item name="testFlags">bit1</item>
+ </style>
+
+ <style name="TestFlag2">
+ <item name="testFlags">bit2</item>
+ </style>
+
+ <style name="TestFlag31">
+ <item name="testFlags">bit31</item>
+ </style>
+
+ <style name="TestFlag1And2">
+ <item name="testFlags">bit1|bit2</item>
+ </style>
+
+ <style name="TestFlag1And2And31">
+ <item name="testFlags">bit1|bit2|bit31</item>
+ </style>
+
+ <style name="TestEnum1.EmptyInherit" />
+
+ <style name="Theme_AlertDialog">
+ <item name="android:textSize">18sp</item>
+ </style>
+
+ <style name="TestProgressBar">
+ <item name="android:indeterminateOnly">false</item>
+ <item name="android:progressDrawable">?android:drawable/progress_horizontal</item>
+ <item name="android:indeterminateDrawable">?android:drawable/progress_horizontal</item>
+ <item name="android:minHeight">20dip</item>
+ <item name="android:maxHeight">20dip</item>
+ <item name="android:focusable">true</item>
+ </style>
+
+ <style name="Test_Theme">
+ <item name="android:windowNoTitle">true</item>
+ <item name="android:panelColorForeground">#ff000000</item>
+ <item name="android:panelColorBackground">#ffffffff</item>
+ </style>
+
+ <style name="Theme_OverrideOuter">
+ <item name="themeType">1</item>
+ </style>
+
+ <style name="Theme_OverrideInner">
+ <item name="themeType">2</item>
+ <item name="themeOverrideAttr">@style/Theme_OverrideAttr</item>
+ </style>
+
+ <style name="Theme_OverrideAttr">
+ <item name="themeType">3</item>
+ </style>
+
+ <style name="Theme_ThemedDrawableTest">
+ <item name="themeBoolean">true</item>
+ <item name="themeColor">@android:color/black</item>
+ <item name="themeFloat">1.0</item>
+ <item name="themeAngle">45.0</item>
+ <item name="themeInteger">1</item>
+ <item name="themeDimension">1px</item>
+ <item name="themeDrawable">@drawable/icon_black</item>
+ <item name="themeBitmap">@drawable/icon_black</item>
+ <item name="themeNinePatch">@drawable/ninepatch_0</item>
+ <item name="themeGravity">48</item>
+ <item name="themeTileMode">2</item>
+ </style>
+
+ <style name="Theme_NoSwipeDismiss">
+ <item name="android:windowSwipeToDismiss">false</item>
+ </style>
+
+</resources>
diff --git a/tests/tests/widget/res/xml/base_attributes.xml b/tests/tests/widget/res/xml/base_attributes.xml
new file mode 100644
index 0000000..adb44de
--- /dev/null
+++ b/tests/tests/widget/res/xml/base_attributes.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 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.
+ -->
+<alias xmlns:android="http://schemas.android.com/apk/res/android">
+ <base_attr_pixel>
+ <Attributes xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="400px"
+ android:layout_height="600px"/>
+ </base_attr_pixel>
+ <base_attr_fillwrap>
+ <Attributes xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"/>
+ </base_attr_fillwrap>
+ <base_attr_noheight>
+ <Attributes xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="600px"/>
+ </base_attr_noheight>
+</alias>
diff --git a/tests/src/android/os/cts/TaggedPointer.java b/tests/tests/widget/res/xml/input_extras.xml
similarity index 64%
copy from tests/src/android/os/cts/TaggedPointer.java
copy to tests/tests/widget/res/xml/input_extras.xml
index 16e76c9..ce5eb5e 100644
--- a/tests/src/android/os/cts/TaggedPointer.java
+++ b/tests/tests/widget/res/xml/input_extras.xml
@@ -1,5 +1,6 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 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.
@@ -12,15 +13,9 @@
* 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.
- */
+-->
+<input-extras xmlns:android="http://schemas.android.com/apk/res/android">
+ <extra android:name="google" android:value="android"/>
+ <extra android:name="test" android:value="cts"/>
+</input-extras>
-package android.os.cts;
-
-public class TaggedPointer {
-
- static {
- System.loadLibrary("cts_jni");
- }
-
- public static native boolean hasTaggedPointer();
-}
diff --git a/tests/tests/widget/src/android/widget/cts/AbsListViewTest.java b/tests/tests/widget/src/android/widget/cts/AbsListViewTest.java
index 7dcae28..b6a96fb 100644
--- a/tests/tests/widget/src/android/widget/cts/AbsListViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AbsListViewTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -52,7 +52,7 @@
import java.util.ArrayList;
import java.util.List;
-public class AbsListViewTest extends ActivityInstrumentationTestCase2<ListViewStubActivity> {
+public class AbsListViewTest extends ActivityInstrumentationTestCase2<ListViewCtsActivity> {
private final String[] mShortList = new String[] {
"This", "is", "short", "!",
};
@@ -72,7 +72,7 @@
private static final float DELTA = 0.001f;
public AbsListViewTest() {
- super("com.android.cts.stub", ListViewStubActivity.class);
+ super("com.android.cts.widget", ListViewCtsActivity.class);
}
diff --git a/tests/tests/widget/src/android/widget/cts/AbsListView_LayoutParamsTest.java b/tests/tests/widget/src/android/widget/cts/AbsListView_LayoutParamsTest.java
index 655b5ee..413bc2a 100644
--- a/tests/tests/widget/src/android/widget/cts/AbsListView_LayoutParamsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AbsListView_LayoutParamsTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import org.xmlpull.v1.XmlPullParser;
diff --git a/tests/tests/widget/src/android/widget/cts/AbsSeekBarTest.java b/tests/tests/widget/src/android/widget/cts/AbsSeekBarTest.java
index 58230e5..419a1c8 100644
--- a/tests/tests/widget/src/android/widget/cts/AbsSeekBarTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AbsSeekBarTest.java
@@ -21,7 +21,7 @@
import android.graphics.PorterDuff;
import android.test.UiThreadTest;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.app.Activity;
@@ -40,9 +40,9 @@
/**
* Test {@link AbsSeekBar}.
*/
-public class AbsSeekBarTest extends ActivityInstrumentationTestCase2<ProgressBarStubActivity> {
+public class AbsSeekBarTest extends ActivityInstrumentationTestCase2<ProgressBarCtsActivity> {
public AbsSeekBarTest() {
- super("com.android.cts.stub", ProgressBarStubActivity.class);
+ super("com.android.cts.widget", ProgressBarCtsActivity.class);
}
private Activity mActivity;
diff --git a/tests/tests/widget/src/android/widget/cts/AbsSpinnerTest.java b/tests/tests/widget/src/android/widget/cts/AbsSpinnerTest.java
index fc37a64..10e1658 100644
--- a/tests/tests/widget/src/android/widget/cts/AbsSpinnerTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AbsSpinnerTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import org.xmlpull.v1.XmlPullParser;
@@ -39,11 +39,11 @@
import android.widget.Spinner;
import android.widget.SpinnerAdapter;
-public class AbsSpinnerTest extends ActivityInstrumentationTestCase2<RelativeLayoutStubActivity> {
+public class AbsSpinnerTest extends ActivityInstrumentationTestCase2<RelativeLayoutCtsActivity> {
private Context mContext;
public AbsSpinnerTest() {
- super("com.android.cts.stub", RelativeLayoutStubActivity.class);
+ super("com.android.cts.widget", RelativeLayoutCtsActivity.class);
}
@Override
@@ -52,7 +52,7 @@
mContext = getInstrumentation().getTargetContext();
}
-
+ @UiThreadTest
public void testConstructor() {
new Spinner(mContext);
@@ -78,7 +78,7 @@
public void testSetSelectionIntBoolean() {
AbsSpinner absSpinner = (AbsSpinner) getActivity().findViewById(R.id.spinner1);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(mContext,
- com.android.cts.stub.R.array.string, android.R.layout.simple_spinner_item);
+ com.android.cts.widget.R.array.string, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
absSpinner.setAdapter(adapter);
assertEquals(0, absSpinner.getSelectedItemPosition());
@@ -101,7 +101,7 @@
public void testSetSelectionInt() {
AbsSpinner absSpinner = (AbsSpinner) getActivity().findViewById(R.id.spinner1);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(mContext,
- com.android.cts.stub.R.array.string, android.R.layout.simple_spinner_item);
+ com.android.cts.widget.R.array.string, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
absSpinner.setAdapter(adapter);
assertEquals(0, absSpinner.getSelectedItemPosition());
@@ -123,7 +123,7 @@
public void testAccessAdapter() {
AbsSpinner absSpinner = (AbsSpinner) getActivity().findViewById(R.id.spinner1);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(mContext,
- com.android.cts.stub.R.array.string, android.R.layout.simple_spinner_item);
+ com.android.cts.widget.R.array.string, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
absSpinner.setAdapter(adapter);
@@ -139,6 +139,7 @@
// There is neither limit in code nor description about it in javadoc.
}
+ @UiThreadTest
public void testRequestLayout() {
AbsSpinner absSpinner = new Spinner(mContext);
absSpinner.layout(0, 0, 200, 300);
@@ -158,7 +159,7 @@
AbsSpinner absSpinner = (AbsSpinner) getActivity().findViewById(R.id.spinner1);
ArrayAdapter<CharSequence> adapter1 = ArrayAdapter.createFromResource(mContext,
- com.android.cts.stub.R.array.string, android.R.layout.simple_spinner_item);
+ com.android.cts.widget.R.array.string, android.R.layout.simple_spinner_item);
absSpinner.setAdapter(adapter1);
assertEquals(adapter1.getCount(), absSpinner.getCount());
@@ -176,6 +177,7 @@
* 1. Should return the position of the item which contains the specified point.
* 2. Should return INVALID_POSITION if the point does not intersect an item
*/
+ @UiThreadTest
public void testPointToPosition() {
AbsSpinner absSpinner = new Gallery(mContext);
MockSpinnerAdapter adapter = new MockSpinnerAdapter();
@@ -210,6 +212,7 @@
* 1. Should return the view corresponding to the currently selected item.
* 2. Should return null if nothing is selected.
*/
+ @UiThreadTest
public void testGetSelectedView() {
AbsSpinner absSpinner = new Gallery(mContext);
MockSpinnerAdapter adapter = new MockSpinnerAdapter();
@@ -233,7 +236,7 @@
public void testOnSaveAndRestoreInstanceState() {
AbsSpinner absSpinner = (AbsSpinner) getActivity().findViewById(R.id.spinner1);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(mContext,
- com.android.cts.stub.R.array.string, android.R.layout.simple_spinner_item);
+ com.android.cts.widget.R.array.string, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
absSpinner.setAdapter(adapter);
assertEquals(0, absSpinner.getSelectedItemPosition());
diff --git a/tests/tests/widget/src/android/widget/cts/AbsoluteLayoutTest.java b/tests/tests/widget/src/android/widget/cts/AbsoluteLayoutTest.java
index 8d2b6cd..053f42b 100644
--- a/tests/tests/widget/src/android/widget/cts/AbsoluteLayoutTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AbsoluteLayoutTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import org.xmlpull.v1.XmlPullParser;
@@ -34,7 +34,7 @@
import java.io.IOException;
@SuppressWarnings("deprecation")
-public class AbsoluteLayoutTest extends ActivityInstrumentationTestCase2<StubActivity> {
+public class AbsoluteLayoutTest extends ActivityInstrumentationTestCase2<CtsActivity> {
private static final int DEFAULT_X = 5;
private static final int DEFAULT_Y = 10;
private static final int DEFAULT_WIDTH = 20;
@@ -45,7 +45,7 @@
private LayoutParams mAbsoluteLayoutParams;
public AbsoluteLayoutTest() {
- super("com.android.cts.stub", StubActivity.class);
+ super("com.android.cts.widget", CtsActivity.class);
}
@Override
diff --git a/tests/tests/widget/src/android/widget/cts/AbsoluteLayout_LayoutParamsTest.java b/tests/tests/widget/src/android/widget/cts/AbsoluteLayout_LayoutParamsTest.java
index 63be7d4..685f2d3 100644
--- a/tests/tests/widget/src/android/widget/cts/AbsoluteLayout_LayoutParamsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AbsoluteLayout_LayoutParamsTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import org.xmlpull.v1.XmlPullParser;
diff --git a/tests/src/android/widget/cts/AdapterViewStubActivity.java b/tests/tests/widget/src/android/widget/cts/AdapterViewCtsActivity.java
similarity index 94%
rename from tests/src/android/widget/cts/AdapterViewStubActivity.java
rename to tests/tests/widget/src/android/widget/cts/AdapterViewCtsActivity.java
index edcf13d..956ff9a 100644
--- a/tests/src/android/widget/cts/AdapterViewStubActivity.java
+++ b/tests/tests/widget/src/android/widget/cts/AdapterViewCtsActivity.java
@@ -25,12 +25,12 @@
import android.widget.ArrayAdapter;
import android.widget.ListView;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
/**
* A minimal application for AdapterView test.
*/
-public class AdapterViewStubActivity extends Activity {
+public class AdapterViewCtsActivity extends Activity {
private ListView mView;
/**
diff --git a/tests/tests/widget/src/android/widget/cts/AdapterViewTest.java b/tests/tests/widget/src/android/widget/cts/AdapterViewTest.java
index b91ca73..81a1a4b 100644
--- a/tests/tests/widget/src/android/widget/cts/AdapterViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AdapterViewTest.java
@@ -38,10 +38,10 @@
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
-public class AdapterViewTest extends ActivityInstrumentationTestCase2<AdapterViewStubActivity> {
+public class AdapterViewTest extends ActivityInstrumentationTestCase2<AdapterViewCtsActivity> {
private final static int INVALID_ID = -1;
@@ -54,7 +54,7 @@
private AdapterView<ListAdapter> mAdapterView;
public AdapterViewTest() {
- super("com.android.cts.stub", AdapterViewStubActivity.class);
+ super("com.android.cts.widget", AdapterViewCtsActivity.class);
}
@Override
diff --git a/tests/tests/widget/src/android/widget/cts/AnalogClockTest.java b/tests/tests/widget/src/android/widget/cts/AnalogClockTest.java
index f3b02b0..ef1a45d 100644
--- a/tests/tests/widget/src/android/widget/cts/AnalogClockTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AnalogClockTest.java
@@ -16,23 +16,24 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import org.xmlpull.v1.XmlPullParser;
import android.app.Activity;
import android.test.ActivityInstrumentationTestCase2;
+import android.test.UiThreadTest;
import android.util.AttributeSet;
import android.util.Xml;
import android.widget.AnalogClock;
-public class AnalogClockTest extends ActivityInstrumentationTestCase2<FrameLayoutStubActivity> {
+public class AnalogClockTest extends ActivityInstrumentationTestCase2<FrameLayoutCtsActivity> {
private AttributeSet mAttrSet;
private Activity mActivity;
public AnalogClockTest() {
- super("com.android.cts.stub", FrameLayoutStubActivity.class);
+ super("com.android.cts.widget", FrameLayoutCtsActivity.class);
}
@Override
@@ -44,6 +45,7 @@
mActivity = getActivity();
}
+ @UiThreadTest
public void testConstructor() {
new AnalogClock(mActivity);
new AnalogClock(mActivity, mAttrSet);
diff --git a/tests/tests/widget/src/android/widget/cts/ArrayAdapterTest.java b/tests/tests/widget/src/android/widget/cts/ArrayAdapterTest.java
index 101b271..1e17ea7 100644
--- a/tests/tests/widget/src/android/widget/cts/ArrayAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ArrayAdapterTest.java
@@ -20,16 +20,18 @@
import java.util.Comparator;
import java.util.List;
+import android.content.Context;
import android.database.DataSetObserver;
-import android.test.AndroidTestCase;
+import android.test.InstrumentationTestCase;
+import android.test.UiThreadTest;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.widget.TextView;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
-public class ArrayAdapterTest extends AndroidTestCase {
+public class ArrayAdapterTest extends InstrumentationTestCase {
private static final int INVALD_ID = -1;
private static final String STR1 = "string1";
@@ -37,10 +39,13 @@
private static final String STR3 = "string3";
private ArrayAdapter<String> mArrayAdapter;
+ private Context mContext;
+
@Override
protected void setUp() throws Exception {
super.setUp();
- mArrayAdapter = new ArrayAdapter<String>(mContext, R.layout.simple_dropdown_item_1line);
+ mContext = getInstrumentation().getTargetContext();
+ mArrayAdapter = new ArrayAdapter<String>(mContext, R.layout.simple_dropdown_item_1line);
}
public void testConstructor() {
@@ -167,6 +172,7 @@
}
}
+ @UiThreadTest
public void testGetFilter() {
Filter filter = mArrayAdapter.getFilter();
diff --git a/tests/src/android/widget/cts/AutoCompleteStubActivity.java b/tests/tests/widget/src/android/widget/cts/AutoCompleteCtsActivity.java
similarity index 91%
rename from tests/src/android/widget/cts/AutoCompleteStubActivity.java
rename to tests/tests/widget/src/android/widget/cts/AutoCompleteCtsActivity.java
index a23b6eb..3d68f3e 100644
--- a/tests/src/android/widget/cts/AutoCompleteStubActivity.java
+++ b/tests/tests/widget/src/android/widget/cts/AutoCompleteCtsActivity.java
@@ -19,12 +19,12 @@
import android.app.Activity;
import android.os.Bundle;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
/**
* A minimal application for AutoCompleteTextView test.
*/
-public class AutoCompleteStubActivity extends Activity {
+public class AutoCompleteCtsActivity extends Activity {
/**
* Called with the activity is first created.
*/
diff --git a/tests/tests/widget/src/android/widget/cts/AutoCompleteTextViewTest.java b/tests/tests/widget/src/android/widget/cts/AutoCompleteTextViewTest.java
index 373c03b..9fa4959 100644
--- a/tests/tests/widget/src/android/widget/cts/AutoCompleteTextViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AutoCompleteTextViewTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import org.xmlpull.v1.XmlPullParser;
@@ -45,13 +45,13 @@
import java.io.IOException;
public class AutoCompleteTextViewTest extends
- ActivityInstrumentationTestCase2<AutoCompleteStubActivity> {
+ ActivityInstrumentationTestCase2<AutoCompleteCtsActivity> {
/**
* Instantiates a new text view test.
*/
public AutoCompleteTextViewTest() {
- super("com.android.cts.stub", AutoCompleteStubActivity.class);
+ super("com.android.cts.widget", AutoCompleteCtsActivity.class);
}
/** The m activity. */
@@ -104,6 +104,7 @@
}
}
+ @UiThreadTest
public void testConstructor() {
XmlPullParser parser;
@@ -159,6 +160,7 @@
assertFalse(mAutoCompleteTextView.enoughToFilter());
}
+ @UiThreadTest
public void testAccessAdapter() {
MockAutoCompleteTextView autoCompleteTextView = new MockAutoCompleteTextView(mActivity);
@@ -222,6 +224,7 @@
assertNull(mAutoCompleteTextView.getOnItemSelectedListener());
}
+ @UiThreadTest
public void testConvertSelectionToString() {
MockAutoCompleteTextView autoCompleteTextView = new MockAutoCompleteTextView(mActivity);
@@ -234,6 +237,7 @@
assertEquals(STRING_TEST, autoCompleteTextView.convertSelectionToString(STRING_TEST));
}
+ @UiThreadTest
public void testOnTextChanged() {
MockAutoCompleteTextView autoCompleteTextView = new MockAutoCompleteTextView(mActivity);
@@ -287,6 +291,7 @@
assertEquals(STRING_VALIDATED, mAutoCompleteTextView.getText().toString());
}
+ @UiThreadTest
public void testReplaceText() {
MockAutoCompleteTextView autoCompleteTextView = new MockAutoCompleteTextView(mActivity);
@@ -303,6 +308,7 @@
assertTrue(autoCompleteTextView.isOnTextChanged());
}
+ @UiThreadTest
public void testSetFrame() {
MockAutoCompleteTextView autoCompleteTextView = new MockAutoCompleteTextView(mActivity);
diff --git a/tests/tests/widget/src/android/widget/cts/ButtonTest.java b/tests/tests/widget/src/android/widget/cts/ButtonTest.java
index 98b3318..47d7108 100644
--- a/tests/tests/widget/src/android/widget/cts/ButtonTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ButtonTest.java
@@ -24,7 +24,7 @@
import android.util.Xml;
import android.widget.Button;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
public class ButtonTest extends AndroidTestCase {
diff --git a/tests/tests/widget/src/android/widget/cts/CheckBoxTest.java b/tests/tests/widget/src/android/widget/cts/CheckBoxTest.java
index 55960f9..21e463f 100644
--- a/tests/tests/widget/src/android/widget/cts/CheckBoxTest.java
+++ b/tests/tests/widget/src/android/widget/cts/CheckBoxTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import org.xmlpull.v1.XmlPullParser;
diff --git a/tests/src/android/widget/cts/CheckedTextViewStubActivity.java b/tests/tests/widget/src/android/widget/cts/CheckedTextViewCtsActivity.java
similarity index 91%
rename from tests/src/android/widget/cts/CheckedTextViewStubActivity.java
rename to tests/tests/widget/src/android/widget/cts/CheckedTextViewCtsActivity.java
index 1c8d63e..a0ed498 100644
--- a/tests/src/android/widget/cts/CheckedTextViewStubActivity.java
+++ b/tests/tests/widget/src/android/widget/cts/CheckedTextViewCtsActivity.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.app.Activity;
import android.os.Bundle;
@@ -24,7 +24,7 @@
/**
* A minimal application for CheckedTextView test.
*/
-public class CheckedTextViewStubActivity extends Activity {
+public class CheckedTextViewCtsActivity extends Activity {
/**
* Called with the activity is first created.
*/
diff --git a/tests/tests/widget/src/android/widget/cts/CheckedTextViewTest.java b/tests/tests/widget/src/android/widget/cts/CheckedTextViewTest.java
index 6aa44c1..c5d3bd1 100644
--- a/tests/tests/widget/src/android/widget/cts/CheckedTextViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/CheckedTextViewTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.app.Activity;
@@ -38,13 +38,13 @@
import java.util.Arrays;
public class CheckedTextViewTest extends
- ActivityInstrumentationTestCase2<CheckedTextViewStubActivity> {
+ ActivityInstrumentationTestCase2<CheckedTextViewCtsActivity> {
private Resources mResources;
private Activity mActivity;
private Instrumentation mInstrumentation;
public CheckedTextViewTest() {
- super("com.android.cts.stub", CheckedTextViewStubActivity.class);
+ super("com.android.cts.widget", CheckedTextViewCtsActivity.class);
}
@Override
diff --git a/tests/src/android/widget/cts/ChronometerStubActivity.java b/tests/tests/widget/src/android/widget/cts/ChronometerCtsActivity.java
similarity index 92%
rename from tests/src/android/widget/cts/ChronometerStubActivity.java
rename to tests/tests/widget/src/android/widget/cts/ChronometerCtsActivity.java
index f72a427..3a7833d 100644
--- a/tests/src/android/widget/cts/ChronometerStubActivity.java
+++ b/tests/tests/widget/src/android/widget/cts/ChronometerCtsActivity.java
@@ -16,13 +16,13 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.app.Activity;
import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.Chronometer;
-public class ChronometerStubActivity extends Activity {
+public class ChronometerCtsActivity extends Activity {
private Chronometer chronometer;
diff --git a/tests/tests/widget/src/android/widget/cts/ChronometerTest.java b/tests/tests/widget/src/android/widget/cts/ChronometerTest.java
index 7fbb58a..7910274 100644
--- a/tests/tests/widget/src/android/widget/cts/ChronometerTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ChronometerTest.java
@@ -25,10 +25,10 @@
/**
* Test {@link Chronometer}.
*/
-public class ChronometerTest extends ActivityInstrumentationTestCase2<ChronometerStubActivity> {
- private ChronometerStubActivity mActivity;
+public class ChronometerTest extends ActivityInstrumentationTestCase2<ChronometerCtsActivity> {
+ private ChronometerCtsActivity mActivity;
public ChronometerTest() {
- super("com.android.cts.stub", ChronometerStubActivity.class);
+ super("com.android.cts.widget", ChronometerCtsActivity.class);
}
@Override
@@ -37,6 +37,7 @@
mActivity = getActivity();
}
+ @UiThreadTest
public void testConstructor() {
new Chronometer(mActivity);
diff --git a/tests/tests/widget/src/android/widget/cts/CompoundButtonTest.java b/tests/tests/widget/src/android/widget/cts/CompoundButtonTest.java
index 6674ef6..bf5382a 100644
--- a/tests/tests/widget/src/android/widget/cts/CompoundButtonTest.java
+++ b/tests/tests/widget/src/android/widget/cts/CompoundButtonTest.java
@@ -22,7 +22,7 @@
import android.graphics.PorterDuff;
import android.view.LayoutInflater;
import android.widget.ToggleButton;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import org.xmlpull.v1.XmlPullParser;
diff --git a/tests/src/android/widget/cts/StubActivity.java b/tests/tests/widget/src/android/widget/cts/CtsActivity.java
similarity index 93%
rename from tests/src/android/widget/cts/StubActivity.java
rename to tests/tests/widget/src/android/widget/cts/CtsActivity.java
index fe4002c..e099694 100644
--- a/tests/src/android/widget/cts/StubActivity.java
+++ b/tests/tests/widget/src/android/widget/cts/CtsActivity.java
@@ -21,6 +21,6 @@
/**
* Stub activity for helping test. It's an empty activity.
*/
-public class StubActivity extends Activity {
+public class CtsActivity extends Activity {
}
diff --git a/tests/tests/widget/src/android/widget/cts/CursorAdapterTest.java b/tests/tests/widget/src/android/widget/cts/CursorAdapterTest.java
index 963c392..8cc0754 100644
--- a/tests/tests/widget/src/android/widget/cts/CursorAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/CursorAdapterTest.java
@@ -25,8 +25,8 @@
import android.database.DataSetObserver;
import android.database.sqlite.SQLiteDatabase;
import android.os.Looper;
-import android.os.cts.TestThread;
-import android.test.AndroidTestCase;
+import android.test.InstrumentationTestCase;
+import android.test.UiThreadTest;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -35,13 +35,13 @@
import android.widget.FilterQueryProvider;
import android.widget.TextView;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
/**
* Test {@link CursorAdapter}.
*/
-public class CursorAdapterTest extends AndroidTestCase {
+public class CursorAdapterTest extends InstrumentationTestCase {
private static final long TEST_TIME_OUT = 5000;
private static final int NUMBER_INDEX = 1;
private static final String FIRST_NUMBER = "123";
@@ -57,11 +57,13 @@
private Cursor mCursor;
private ViewGroup mParent;
private MockCursorAdapter mMockCursorAdapter;
+ private Context mContext;
@Override
protected void setUp() throws Exception {
super.setUp();
- File dbDir = getContext().getDir("tests", Context.MODE_WORLD_WRITEABLE);
+ mContext = getInstrumentation().getTargetContext();
+ File dbDir = mContext.getDir("tests", Context.MODE_WORLD_WRITEABLE);
mDatabaseFile = new File(dbDir, "database_test.db");
if (mDatabaseFile.exists()) {
mDatabaseFile.delete();
@@ -90,6 +92,7 @@
super.tearDown();
}
+ @UiThreadTest
public void testConstructor() {
new MockCursorAdapter(mContext, mCursor);
@@ -100,6 +103,7 @@
new MockCursorAdapter(null, null, false);
}
+ @UiThreadTest
public void testInit() {
MockCursorAdapter cursorAdapter = new MockCursorAdapter(null, null, false);
cursorAdapter.init(null, null, false);
@@ -144,6 +148,7 @@
}
}
+ @UiThreadTest
public void testGetCount() {
CursorAdapter cursorAdapter = new MockCursorAdapter(mContext, null);
assertEquals(0, cursorAdapter.getCount());
@@ -152,6 +157,7 @@
assertEquals(mCursor.getCount(), cursorAdapter.getCount());
}
+ @UiThreadTest
public void testAccessCursor() {
CursorAdapter cursorAdapter = new MockCursorAdapter(mContext, null);
assertNull(cursorAdapter.getCursor());
@@ -163,6 +169,7 @@
assertNull(cursorAdapter.getCursor());
}
+ @UiThreadTest
public void testConvertToString() {
CursorAdapter cursorAdapter = new MockCursorAdapter(mContext, null);
assertEquals("", cursorAdapter.convertToString(null));
@@ -170,6 +177,7 @@
assertEquals(mCursor.toString(), cursorAdapter.convertToString(mCursor));
}
+ @UiThreadTest
public void testHasStableIds() {
CursorAdapter cursorAdapter = new MockCursorAdapter(mContext, mCursor);
assertTrue(cursorAdapter.hasStableIds());
@@ -178,6 +186,7 @@
assertTrue(cursorAdapter.hasStableIds());
}
+ @UiThreadTest
public void testGetView() {
TextView textView = new TextView(mContext);
textView.setText("getView test");
@@ -209,6 +218,7 @@
assertEquals(SECOND_NUMBER, retView.getText().toString());
}
+ @UiThreadTest
public void testNewDropDownView() {
CursorAdapter cursorAdapter = new MockCursorAdapter(mContext, mCursor);
// null cursor
@@ -218,6 +228,7 @@
assertEquals(FIRST_NUMBER, textView.getText().toString());
}
+ @UiThreadTest
public void testGetDropDownView() {
MockCursorAdapter cursorAdapter = new MockCursorAdapter(mContext, null);
// null cursor
@@ -239,12 +250,14 @@
assertEquals(SECOND_NUMBER, retView.getText().toString());
}
+ @UiThreadTest
public void testGetFilter() {
CursorAdapter cursorAdapter = new MockCursorAdapter(mContext, mCursor);
Filter filter = cursorAdapter.getFilter();
assertNotNull(filter);
}
+ @UiThreadTest
public void testGetItem() {
CursorAdapter cursorAdapter = new MockCursorAdapter(mContext, null);
// cursor is null
@@ -262,6 +275,7 @@
assertEquals(SECOND_NUMBER, c.getString(NUMBER_INDEX));
}
+ @UiThreadTest
public void testGetItemId() {
CursorAdapter cursorAdapter = new MockCursorAdapter(mContext, null);
// cursor is null
@@ -276,6 +290,7 @@
assertEquals(0, cursorAdapter.getItemId(2));
}
+ @UiThreadTest
public void testAccessFilterQueryProvider() {
CursorAdapter cursorAdapter = new MockCursorAdapter(mContext, mCursor);
FilterQueryProvider filterProvider = new MockFilterQueryProvider();
@@ -287,6 +302,7 @@
assertSame(filterProvider, cursorAdapter.getFilterQueryProvider());
}
+ @UiThreadTest
public void testRunQueryOnBackgroundThread() {
CursorAdapter cursorAdapter = new MockCursorAdapter(mContext, mCursor);
final String constraint = "constraint";
diff --git a/tests/tests/widget/src/android/widget/cts/CursorTreeAdapterTest.java b/tests/tests/widget/src/android/widget/cts/CursorTreeAdapterTest.java
index 1d26777..f74b997 100644
--- a/tests/tests/widget/src/android/widget/cts/CursorTreeAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/CursorTreeAdapterTest.java
@@ -22,7 +22,8 @@
import android.database.Cursor;
import android.database.DataSetObserver;
import android.database.sqlite.SQLiteDatabase;
-import android.test.AndroidTestCase;
+import android.test.InstrumentationTestCase;
+import android.test.UiThreadTest;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -31,13 +32,13 @@
import android.widget.FilterQueryProvider;
import android.widget.TextView;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
/**
* Test {@link CursorTreeAdapter}.
*/
-public class CursorTreeAdapterTest extends AndroidTestCase {
+public class CursorTreeAdapterTest extends InstrumentationTestCase {
private static final int NAME_INDEX = 1;
private static final int VALUE_INDEX = 1;
private static final String GROUP_ONE = "group_one";
@@ -61,6 +62,7 @@
private Cursor mChildCursor1;
private Cursor mChildCursor2;
private ViewGroup mParent;
+ private Context mContext;
private Cursor createGroupCursor() {
mDatabase.execSQL("CREATE TABLE group_table (_id INTEGER PRIMARY KEY, name TEXT);");
@@ -93,7 +95,8 @@
@Override
protected void setUp() throws Exception {
super.setUp();
- File dbDir = getContext().getDir("tests", Context.MODE_WORLD_WRITEABLE);
+ mContext = getInstrumentation().getTargetContext();
+ File dbDir = mContext.getDir("tests", Context.MODE_WORLD_WRITEABLE);
mDatabaseFile = new File(dbDir, "database_test.db");
if (mDatabaseFile.exists()) {
mDatabaseFile.delete();
@@ -136,6 +139,7 @@
super.tearDown();
}
+ @UiThreadTest
public void testConstructor() {
new MockCursorTreeAdapter(mGroupCursor, mContext);
@@ -146,6 +150,7 @@
new MockCursorTreeAdapter(null, null, false);
}
+ @UiThreadTest
public void testGetCursor() {
CursorTreeAdapter adapter = new MockCursorTreeAdapter(mGroupCursor, mContext);
assertSame(mGroupCursor, adapter.getCursor());
@@ -157,6 +162,7 @@
assertSame(mGroupCursor, adapter.getCursor());
}
+ @UiThreadTest
public void testSetGroupCursor() {
CursorTreeAdapter adapter = new MockCursorTreeAdapter(mGroupCursor, mContext);
assertSame(mGroupCursor, adapter.getCursor());
@@ -168,6 +174,7 @@
assertSame(mGroupCursor, adapter.getCursor());
}
+ @UiThreadTest
public void testSetChildrenCursor() {
MockCursorTreeAdapter adapter = new MockCursorTreeAdapter(mGroupCursor, mContext);
assertTrue(mGroupCursor.moveToFirst());
@@ -177,6 +184,7 @@
assertSame(mChildCursor2, adapter.getChild(0, 0));
}
+ @UiThreadTest
public void testChangeCursor() {
CursorTreeAdapter adapter = new MockCursorTreeAdapter(null, mContext);
assertNull(adapter.getCursor());
@@ -188,6 +196,7 @@
assertNull(adapter.getCursor());
}
+ @UiThreadTest
public void testNotifyDataSetChangedBoolean() {
MockCursorTreeAdapter adapter = new MockCursorTreeAdapter(mGroupCursor, mContext);
MockDataSetObserver observer = new MockDataSetObserver();
@@ -226,6 +235,7 @@
assertFalse(adapter.hasAddedChild2IntoCache());
}
+ @UiThreadTest
public void testNotifyDataSetChanged() {
MockCursorTreeAdapter adapter = new MockCursorTreeAdapter(mGroupCursor, mContext);
MockDataSetObserver observer = new MockDataSetObserver();
@@ -251,6 +261,7 @@
assertTrue(adapter.hasAddedChild2IntoCache());
}
+ @UiThreadTest
public void testNotifyDataSetInvalidated() {
MockCursorTreeAdapter adapter = new MockCursorTreeAdapter(mGroupCursor, mContext);
MockDataSetObserver observer = new MockDataSetObserver();
@@ -276,6 +287,7 @@
assertTrue(adapter.hasAddedChild2IntoCache());
}
+ @UiThreadTest
public void testOnGroupCollapsed() {
MockCursorTreeAdapter adapter = new MockCursorTreeAdapter(mGroupCursor, mContext);
@@ -313,6 +325,7 @@
}
}
+ @UiThreadTest
public void testHasStableIds() {
CursorTreeAdapter adapter = new MockCursorTreeAdapter(mGroupCursor, mContext);
assertTrue(adapter.hasStableIds());
@@ -321,6 +334,7 @@
assertTrue(adapter.hasStableIds());
}
+ @UiThreadTest
public void testIsChildSelectable() {
CursorTreeAdapter adapter = new MockCursorTreeAdapter(mGroupCursor, mContext);
assertTrue(adapter.isChildSelectable(0, 0));
@@ -330,6 +344,7 @@
assertTrue(adapter.isChildSelectable(0, 0));
}
+ @UiThreadTest
public void testConvertToString() {
CursorTreeAdapter adapter = new MockCursorTreeAdapter(mGroupCursor, mContext);
assertEquals("", adapter.convertToString(null));
@@ -337,6 +352,7 @@
assertEquals(mGroupCursor.toString(), adapter.convertToString(mGroupCursor));
}
+ @UiThreadTest
public void testGetFilter() {
MockCursorTreeAdapter adapter = new MockCursorTreeAdapter(mGroupCursor, mContext);
Filter filter = adapter.getFilter();
@@ -348,6 +364,7 @@
assertTrue(adapter.hasCalledConvertToString());
}
+ @UiThreadTest
public void testAccessQueryProvider() {
CursorTreeAdapter adapter = new MockCursorTreeAdapter(mGroupCursor, mContext);
FilterQueryProvider filterProvider = new MockFilterQueryProvider();
@@ -359,6 +376,7 @@
assertSame(filterProvider, adapter.getFilterQueryProvider());
}
+ @UiThreadTest
public void testRunQueryOnBackgroundThread() {
CursorTreeAdapter adapter = new MockCursorTreeAdapter(mGroupCursor, mContext);
final String constraint = "constraint";
@@ -372,6 +390,7 @@
assertNull(adapter.runQueryOnBackgroundThread(constraint));
}
+ @UiThreadTest
public void testGetGroup() {
CursorTreeAdapter adapter = new MockCursorTreeAdapter(null, mContext);
@@ -391,6 +410,7 @@
assertNull(adapter.getGroup(2));
}
+ @UiThreadTest
public void testGetGroupCount() {
CursorTreeAdapter adapter = new MockCursorTreeAdapter(mGroupCursor, mContext);
assertEquals(mGroupCursor.getCount(), adapter.getGroupCount());
@@ -399,6 +419,7 @@
assertEquals(0, adapter.getGroupCount());
}
+ @UiThreadTest
public void testGetGroupId() {
CursorTreeAdapter adapter = new MockCursorTreeAdapter(null, mContext);
@@ -414,6 +435,7 @@
assertEquals(0, adapter.getGroupId(2));
}
+ @UiThreadTest
public void testGetGroupView() {
final String expectedStr = "getGroupView test";
TextView retView;
@@ -449,6 +471,7 @@
assertEquals(GROUP_ONE, retView.getText().toString());
}
+ @UiThreadTest
public void testGetChild() {
CursorTreeAdapter adapter = new MockCursorTreeAdapter(mGroupCursor, mContext);
assertEquals(2, adapter.getGroupCount());
@@ -476,6 +499,7 @@
assertEquals(CHILD_VALUE_THREE, retCursor.getString(VALUE_INDEX));
}
+ @UiThreadTest
public void testGetChildId() {
CursorTreeAdapter adapter = new MockCursorTreeAdapter(null, mContext);
@@ -504,6 +528,7 @@
assertEquals(0, adapter.getChildId(0, 2));
}
+ @UiThreadTest
public void testGetChildrenCount() {
CursorTreeAdapter adapter = new MockCursorTreeAdapter(null, mContext);
@@ -519,6 +544,7 @@
assertEquals(0, adapter.getChildrenCount(2));
}
+ @UiThreadTest
public void testGetChildView() {
final String expectedStr = "getChildView test";
TextView retView;
diff --git a/tests/tests/widget/src/android/widget/cts/DatePickerTest.java b/tests/tests/widget/src/android/widget/cts/DatePickerTest.java
index ad9da7c..fdadc2c 100644
--- a/tests/tests/widget/src/android/widget/cts/DatePickerTest.java
+++ b/tests/tests/widget/src/android/widget/cts/DatePickerTest.java
@@ -16,14 +16,14 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import com.android.internal.util.XmlUtils;
-
import android.content.Context;
import android.content.res.XmlResourceParser;
import android.os.Parcelable;
-import android.test.AndroidTestCase;
+import android.test.InstrumentationTestCase;
+import android.test.UiThreadTest;
import android.util.AttributeSet;
import android.util.SparseArray;
import android.util.Xml;
@@ -33,7 +33,16 @@
/**
* Test {@link DatePicker}.
*/
-public class DatePickerTest extends AndroidTestCase {
+public class DatePickerTest extends InstrumentationTestCase {
+
+ private Context mContext;
+
+ @Override
+ public void setUp() {
+ mContext = getInstrumentation().getTargetContext();
+ }
+
+ @UiThreadTest
public void testConstructor() {
new DatePicker(mContext);
@@ -53,6 +62,7 @@
}
}
+ @UiThreadTest
public void testSetEnabled() {
MockDatePicker datePicker = createDatePicker();
@@ -65,6 +75,7 @@
assertTrue(datePicker.isEnabled());
}
+ @UiThreadTest
public void testInit() {
MockOnDateChangedListener onDateChangedListener = new MockOnDateChangedListener();
DatePicker datePicker = createDatePicker();
@@ -78,6 +89,7 @@
assertEquals(15, datePicker.getDayOfMonth());
}
+ @UiThreadTest
public void testAccessDate() {
DatePicker datePicker = createDatePicker();
@@ -96,6 +108,7 @@
assertEquals(19, datePicker.getDayOfMonth());
}
+ @UiThreadTest
public void testUpdateDate() {
DatePicker datePicker = createDatePicker();
@@ -109,6 +122,7 @@
assertEquals(19, datePicker.getDayOfMonth());
}
+ @UiThreadTest
public void testOnSaveInstanceState() {
MockDatePicker datePicker = createDatePicker();
diff --git a/tests/src/android/widget/cts/DialerFilterStubActivity.java b/tests/tests/widget/src/android/widget/cts/DialerFilterCtsActivity.java
similarity index 91%
rename from tests/src/android/widget/cts/DialerFilterStubActivity.java
rename to tests/tests/widget/src/android/widget/cts/DialerFilterCtsActivity.java
index b67803a..572d3fb 100644
--- a/tests/src/android/widget/cts/DialerFilterStubActivity.java
+++ b/tests/tests/widget/src/android/widget/cts/DialerFilterCtsActivity.java
@@ -18,12 +18,12 @@
import android.app.Activity;
import android.os.Bundle;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
/**
* A minimal application for DialerFilter test.
*/
-public class DialerFilterStubActivity extends Activity {
+public class DialerFilterCtsActivity extends Activity {
/**
* Called with the activity is first created.
*/
diff --git a/tests/tests/widget/src/android/widget/cts/DialerFilterTest.java b/tests/tests/widget/src/android/widget/cts/DialerFilterTest.java
index 1c5c7ff..a8584ae 100644
--- a/tests/tests/widget/src/android/widget/cts/DialerFilterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/DialerFilterTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import org.xmlpull.v1.XmlPullParser;
@@ -39,13 +39,13 @@
import android.widget.EditText;
import android.widget.RelativeLayout;
-public class DialerFilterTest extends ActivityInstrumentationTestCase2<DialerFilterStubActivity> {
+public class DialerFilterTest extends ActivityInstrumentationTestCase2<DialerFilterCtsActivity> {
private Activity mActivity;
private Instrumentation mInstrumentation;
private DialerFilter mDialerFilter;
public DialerFilterTest() {
- super("com.android.cts.stub", DialerFilterStubActivity.class);
+ super("com.android.cts.widget", DialerFilterCtsActivity.class);
}
@Override
@@ -64,6 +64,7 @@
mDialerFilter = (DialerFilter) mActivity.findViewById(R.id.dialer_filter);
}
+ @UiThreadTest
public void testConstructor() {
final XmlPullParser parser = mActivity.getResources().getXml(R.layout.dialerfilter_layout);
final AttributeSet attrs = Xml.asAttributeSet(parser);
@@ -72,6 +73,7 @@
new DialerFilter(mActivity, attrs);
}
+ @UiThreadTest
public void testIsQwertyKeyboard() {
// Simply call the method. Return value may depend on the default keyboard.
mDialerFilter.isQwertyKeyboard();
@@ -81,7 +83,7 @@
// The exact behavior depends on the implementation of DialerKeyListener and
// TextKeyListener, but even that may be changed. Simply assert basic scenarios.
- mInstrumentation.runOnMainSync(new Runnable() {
+ mActivity.runOnUiThread(new Runnable() {
public void run() {
mDialerFilter.setMode(DialerFilter.DIGITS_ONLY);
mDialerFilter.requestFocus();
@@ -95,7 +97,7 @@
assertEquals("", mDialerFilter.getLetters().toString());
assertEquals("123", mDialerFilter.getDigits().toString());
- mInstrumentation.runOnMainSync(new Runnable() {
+ mActivity.runOnUiThread(new Runnable() {
public void run() {
mDialerFilter.clearText();
mDialerFilter.setMode(DialerFilter.LETTERS_ONLY);
@@ -116,7 +118,7 @@
assertEquals("ADG", mDialerFilter.getLetters().toString());
assertEquals("", mDialerFilter.getDigits().toString());
- mInstrumentation.runOnMainSync(new Runnable() {
+ mActivity.runOnUiThread(new Runnable() {
public void run() {
mDialerFilter.clearText();
mDialerFilter.setMode(DialerFilter.DIGITS_AND_LETTERS);
@@ -135,7 +137,7 @@
assertEquals("ADG", mDialerFilter.getLetters().toString());
// A, D, K may map to numbers on some keyboards. Don't test.
- mInstrumentation.runOnMainSync(new Runnable() {
+ mActivity.runOnUiThread(new Runnable() {
public void run() {
mDialerFilter.clearText();
mDialerFilter.setMode(DialerFilter.DIGITS_AND_LETTERS);
diff --git a/tests/src/android/widget/cts/DigitalClockStubActivity.java b/tests/tests/widget/src/android/widget/cts/DigitalClockCtsActivity.java
similarity index 91%
rename from tests/src/android/widget/cts/DigitalClockStubActivity.java
rename to tests/tests/widget/src/android/widget/cts/DigitalClockCtsActivity.java
index 2351bc2..68cb3f0 100644
--- a/tests/src/android/widget/cts/DigitalClockStubActivity.java
+++ b/tests/tests/widget/src/android/widget/cts/DigitalClockCtsActivity.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.app.Activity;
import android.os.Bundle;
@@ -24,7 +24,7 @@
/**
* A minimal application for TextView test.
*/
-public class DigitalClockStubActivity extends Activity {
+public class DigitalClockCtsActivity extends Activity {
/**
* Called with the activity is first created.
*/
diff --git a/tests/tests/widget/src/android/widget/cts/DigitalClockTest.java b/tests/tests/widget/src/android/widget/cts/DigitalClockTest.java
index 4184cdd..2f2cc1a 100644
--- a/tests/tests/widget/src/android/widget/cts/DigitalClockTest.java
+++ b/tests/tests/widget/src/android/widget/cts/DigitalClockTest.java
@@ -30,19 +30,19 @@
import android.widget.DigitalClock;
import android.widget.LinearLayout;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import com.android.internal.util.XmlUtils;
/**
* Test {@link DigitalClock}.
*/
-public class DigitalClockTest extends ActivityInstrumentationTestCase<DigitalClockStubActivity> {
+public class DigitalClockTest extends ActivityInstrumentationTestCase<DigitalClockCtsActivity> {
private Activity mActivity;
private Context mContext;
public DigitalClockTest() {
- super("com.android.cts.stub", DigitalClockStubActivity.class);
+ super("com.android.cts.widget", DigitalClockCtsActivity.class);
}
@Override
@@ -52,6 +52,7 @@
mContext = getInstrumentation().getContext();
}
+ @UiThreadTest
public void testConstructor() {
// new the DigitalClock instance
new DigitalClock(mContext);
@@ -113,7 +114,7 @@
private AttributeSet getAttributeSet(int resourceId) {
XmlResourceParser parser = mActivity.getResources().getXml(resourceId);
try {
- XmlUtils.beginDocument(parser, "com.android.cts.stub.alarmclock.DigitalClock");
+ XmlUtils.beginDocument(parser, "com.android.cts.widget.alarmclock.DigitalClock");
} catch (XmlPullParserException e) {
fail("unexpected XmlPullParserException.");
} catch (IOException e) {
diff --git a/tests/tests/widget/src/android/widget/cts/EditTextTest.java b/tests/tests/widget/src/android/widget/cts/EditTextTest.java
index ee10900..7a71a58 100644
--- a/tests/tests/widget/src/android/widget/cts/EditTextTest.java
+++ b/tests/tests/widget/src/android/widget/cts/EditTextTest.java
@@ -28,7 +28,7 @@
import android.widget.EditText;
import android.widget.TextView.BufferType;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
public class EditTextTest extends AndroidTestCase {
diff --git a/tests/src/android/widget/cts/ExpandableListSimple.java b/tests/tests/widget/src/android/widget/cts/ExpandableListSimple.java
similarity index 100%
rename from tests/src/android/widget/cts/ExpandableListSimple.java
rename to tests/tests/widget/src/android/widget/cts/ExpandableListSimple.java
diff --git a/tests/tests/widget/src/android/widget/cts/ExpandableListViewTest.java b/tests/tests/widget/src/android/widget/cts/ExpandableListViewTest.java
index 67dcb30..ac48ed8 100644
--- a/tests/tests/widget/src/android/widget/cts/ExpandableListViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ExpandableListViewTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import org.xmlpull.v1.XmlPullParser;
diff --git a/tests/src/android/widget/cts/ExpandableListWithHeaders.java b/tests/tests/widget/src/android/widget/cts/ExpandableListWithHeaders.java
similarity index 100%
rename from tests/src/android/widget/cts/ExpandableListWithHeaders.java
rename to tests/tests/widget/src/android/widget/cts/ExpandableListWithHeaders.java
diff --git a/tests/tests/widget/src/android/widget/cts/FilterTest.java b/tests/tests/widget/src/android/widget/cts/FilterTest.java
index 394f861..76de481 100644
--- a/tests/tests/widget/src/android/widget/cts/FilterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/FilterTest.java
@@ -18,29 +18,41 @@
import android.cts.util.PollingCheck;
+import android.os.Looper;
import android.test.ActivityInstrumentationTestCase2;
import android.widget.Filter;
import android.widget.Filter.FilterListener;
-public class FilterTest extends ActivityInstrumentationTestCase2<StubActivity> {
+public class FilterTest extends ActivityInstrumentationTestCase2<CtsActivity> {
private static final long TIME_OUT = 10000;
+ private static final long RUN_TIME = 1000;
private static final String TEST_CONSTRAINT = "filter test";
private MockFilter mMockFilter;
public FilterTest() {
- super("com.android.cts.stub", StubActivity.class);
+ super("com.android.cts.widget", CtsActivity.class);
}
- public void testConstructor() {
- new MockFilter();
+ public void testConstructor() throws Throwable {
+ TestThread t = new TestThread(new Runnable() {
+ public void run() {
+ Looper.prepare();
+ new MockFilter();
+ }
+ });
+ t.runTest(RUN_TIME);
}
- public void testConvertResultToString() {
- final MockFilter filter = new MockFilter();
- assertEquals("", filter.convertResultToString(null));
-
+ public void testConvertResultToString() throws Throwable {
final String testStr = "Test";
- assertEquals(testStr, filter.convertResultToString(testStr));
+ new TestThread(new Runnable() {
+ public void run() {
+ Looper.prepare();
+ MockFilter filter = new MockFilter();
+ assertEquals("", filter.convertResultToString(null));
+ assertEquals(testStr, filter.convertResultToString(testStr));
+ }
+ }).runTest(RUN_TIME);
}
public void testFilter1() {
diff --git a/tests/src/android/widget/cts/FrameLayoutStubActivity.java b/tests/tests/widget/src/android/widget/cts/FrameLayoutCtsActivity.java
similarity index 91%
rename from tests/src/android/widget/cts/FrameLayoutStubActivity.java
rename to tests/tests/widget/src/android/widget/cts/FrameLayoutCtsActivity.java
index 76482da..c638313 100644
--- a/tests/src/android/widget/cts/FrameLayoutStubActivity.java
+++ b/tests/tests/widget/src/android/widget/cts/FrameLayoutCtsActivity.java
@@ -18,12 +18,12 @@
import android.app.Activity;
import android.os.Bundle;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
/**
* A minimal application for frame layout test.
*/
-public class FrameLayoutStubActivity extends Activity {
+public class FrameLayoutCtsActivity extends Activity {
/**
* Called with the activity is first created.
*/
diff --git a/tests/tests/widget/src/android/widget/cts/FrameLayoutTest.java b/tests/tests/widget/src/android/widget/cts/FrameLayoutTest.java
index b1a0d44..dcab088 100644
--- a/tests/tests/widget/src/android/widget/cts/FrameLayoutTest.java
+++ b/tests/tests/widget/src/android/widget/cts/FrameLayoutTest.java
@@ -22,7 +22,7 @@
import android.graphics.ColorFilter;
import android.graphics.PorterDuff;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -49,13 +49,13 @@
import java.io.IOException;
-public class FrameLayoutTest extends ActivityInstrumentationTestCase2<FrameLayoutStubActivity> {
+public class FrameLayoutTest extends ActivityInstrumentationTestCase2<FrameLayoutCtsActivity> {
private Activity mActivity;
private Instrumentation mInstrumentation;
private FrameLayout mFrameLayout;
public FrameLayoutTest() {
- super("com.android.cts.stub", FrameLayoutStubActivity.class);
+ super("com.android.cts.widget", FrameLayoutCtsActivity.class);
}
@Override
diff --git a/tests/tests/widget/src/android/widget/cts/FrameLayout_LayoutParamsTest.java b/tests/tests/widget/src/android/widget/cts/FrameLayout_LayoutParamsTest.java
index 89529a2..d8f1296 100644
--- a/tests/tests/widget/src/android/widget/cts/FrameLayout_LayoutParamsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/FrameLayout_LayoutParamsTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import org.xmlpull.v1.XmlPullParser;
diff --git a/tests/src/android/widget/cts/GalleryStubActivity.java b/tests/tests/widget/src/android/widget/cts/GalleryCtsActivity.java
similarity index 96%
rename from tests/src/android/widget/cts/GalleryStubActivity.java
rename to tests/tests/widget/src/android/widget/cts/GalleryCtsActivity.java
index 8e0dd93..8d32717 100644
--- a/tests/src/android/widget/cts/GalleryStubActivity.java
+++ b/tests/tests/widget/src/android/widget/cts/GalleryCtsActivity.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.app.Activity;
import android.content.Context;
@@ -30,7 +30,7 @@
/**
* A minimal application for {@link Gallery} test.
*/
-public class GalleryStubActivity extends Activity {
+public class GalleryCtsActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
diff --git a/tests/tests/widget/src/android/widget/cts/GalleryTest.java b/tests/tests/widget/src/android/widget/cts/GalleryTest.java
index 0aacda4..a2deab9 100644
--- a/tests/tests/widget/src/android/widget/cts/GalleryTest.java
+++ b/tests/tests/widget/src/android/widget/cts/GalleryTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import com.android.internal.view.menu.ContextMenuBuilder;
@@ -53,7 +53,7 @@
/**
* Test {@link Gallery}.
*/
-public class GalleryTest extends ActivityInstrumentationTestCase2<GalleryStubActivity> {
+public class GalleryTest extends ActivityInstrumentationTestCase2<GalleryCtsActivity> {
private Gallery mGallery;
private Activity mActivity;
private Instrumentation mInstrumentation;
@@ -61,7 +61,7 @@
private final static float DELTA = 0.01f;
public GalleryTest() {
- super("com.android.cts.stub", GalleryStubActivity.class);
+ super("com.android.cts.widget", GalleryCtsActivity.class);
}
@Override
@@ -73,6 +73,7 @@
mGallery = (Gallery) mActivity.findViewById(R.id.gallery_test);
}
+ @UiThreadTest
public void testConstructor() {
new Gallery(mContext);
@@ -154,6 +155,7 @@
assertEquals(alpha, t.getAlpha(), DELTA);
}
+ @UiThreadTest
public void testGenerateLayoutParams() throws XmlPullParserException, IOException {
final int width = 320;
final int height = 240;
@@ -187,6 +189,7 @@
// how to check whether the context menu is showing.
}
+ @UiThreadTest
public void testDispatchKeyEvent() {
mGallery = new Gallery(mContext);
final KeyEvent validKeyEvent = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_ENTER);
@@ -222,6 +225,7 @@
mInstrumentation.waitForIdleSync();
}
+ @UiThreadTest
public void testCheckLayoutParams() {
MyGallery gallery = new MyGallery(mContext);
ViewGroup.LayoutParams p1 = new ViewGroup.LayoutParams(320, 480);
@@ -231,6 +235,7 @@
assertTrue(gallery.checkLayoutParams(p2));
}
+ @UiThreadTest
public void testComputeHorizontalScrollExtent() {
MyGallery gallery = new MyGallery(mContext);
@@ -238,6 +243,7 @@
assertEquals(1, gallery.computeHorizontalScrollExtent());
}
+ @UiThreadTest
public void testComputeHorizontalScrollOffset() {
MyGallery gallery = new MyGallery(mContext);
assertEquals(AdapterView.INVALID_POSITION, gallery.computeHorizontalScrollOffset());
@@ -247,6 +253,7 @@
assertEquals(gallery.getSelectedItemPosition(), gallery.computeHorizontalScrollOffset());
}
+ @UiThreadTest
public void testComputeHorizontalScrollRange() {
MyGallery gallery = new MyGallery(mContext);
ImageAdapter adapter = new ImageAdapter(mActivity);
@@ -270,6 +277,7 @@
assertFalse(gallery.getChildAt(1).isPressed());
}
+ @UiThreadTest
public void testGenerateDefaultLayoutParams() {
MyGallery gallery = new MyGallery(mContext);
ViewGroup.LayoutParams p = gallery.generateDefaultLayoutParams();
@@ -296,6 +304,7 @@
assertEquals(index + 1, gallery.getChildDrawingOrder(childCount, index));
}
+ @UiThreadTest
public void testGetContextMenuInfo() {
MockOnCreateContextMenuListener listener = new MockOnCreateContextMenuListener();
MyGallery gallery = new MyGallery(mContext);
diff --git a/tests/tests/widget/src/android/widget/cts/Gallery_LayoutParamsTest.java b/tests/tests/widget/src/android/widget/cts/Gallery_LayoutParamsTest.java
index af031e4..de90ed3 100644
--- a/tests/tests/widget/src/android/widget/cts/Gallery_LayoutParamsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/Gallery_LayoutParamsTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import org.xmlpull.v1.XmlPullParserException;
diff --git a/tests/src/android/widget/cts/GridLayoutStubActivity.java b/tests/tests/widget/src/android/widget/cts/GridLayoutCtsActivity.java
similarity index 91%
rename from tests/src/android/widget/cts/GridLayoutStubActivity.java
rename to tests/tests/widget/src/android/widget/cts/GridLayoutCtsActivity.java
index 3fa0f28..3277ee8 100644
--- a/tests/src/android/widget/cts/GridLayoutStubActivity.java
+++ b/tests/tests/widget/src/android/widget/cts/GridLayoutCtsActivity.java
@@ -18,12 +18,12 @@
import android.app.Activity;
import android.os.Bundle;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
/**
* A minimal application for {@link android.widget.GridLayout} test.
*/
-public class GridLayoutStubActivity extends Activity {
+public class GridLayoutCtsActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
diff --git a/tests/tests/widget/src/android/widget/cts/GridLayoutTest.java b/tests/tests/widget/src/android/widget/cts/GridLayoutTest.java
index 638fe96..d701623 100644
--- a/tests/tests/widget/src/android/widget/cts/GridLayoutTest.java
+++ b/tests/tests/widget/src/android/widget/cts/GridLayoutTest.java
@@ -27,7 +27,7 @@
import android.widget.Button;
import android.widget.GridLayout;
import android.widget.TextView;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import org.xmlpull.v1.XmlPullParser;
import static android.view.ViewGroup.LAYOUT_MODE_OPTICAL_BOUNDS;
@@ -36,7 +36,7 @@
/**
* Test {@link android.widget.GridLayout}.
*/
-public class GridLayoutTest extends ActivityInstrumentationTestCase<GridLayoutStubActivity> {
+public class GridLayoutTest extends ActivityInstrumentationTestCase<GridLayoutCtsActivity> {
// The size of the off-screen test container in which we we will testing layout.
public static final int MAX_X = 2000;
@@ -117,7 +117,7 @@
private Context mContext;
public GridLayoutTest() {
- super("com.android.cts.stub", GridLayoutStubActivity.class);
+ super("com.android.cts.widget", GridLayoutCtsActivity.class);
}
@Override
diff --git a/tests/src/android/widget/cts/GridViewStubActivity.java b/tests/tests/widget/src/android/widget/cts/GridViewCtsActivity.java
similarity index 91%
rename from tests/src/android/widget/cts/GridViewStubActivity.java
rename to tests/tests/widget/src/android/widget/cts/GridViewCtsActivity.java
index f58b7df..7a1182d 100644
--- a/tests/src/android/widget/cts/GridViewStubActivity.java
+++ b/tests/tests/widget/src/android/widget/cts/GridViewCtsActivity.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.app.Activity;
import android.os.Bundle;
@@ -24,7 +24,7 @@
/**
* A minimal application for {@link GridView} test.
*/
-public class GridViewStubActivity extends Activity {
+public class GridViewCtsActivity extends Activity {
/**
* Called with the activity is first created.
*/
diff --git a/tests/tests/widget/src/android/widget/cts/GridViewTest.java b/tests/tests/widget/src/android/widget/cts/GridViewTest.java
index bd42e35..042986c 100644
--- a/tests/tests/widget/src/android/widget/cts/GridViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/GridViewTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import org.xmlpull.v1.XmlPullParser;
@@ -51,13 +51,13 @@
/**
* Test {@link GridView}.
*/
-public class GridViewTest extends ActivityInstrumentationTestCase<GridViewStubActivity> {
+public class GridViewTest extends ActivityInstrumentationTestCase<GridViewCtsActivity> {
private GridView mGridView;
private Activity mActivity;
private Instrumentation mInstrumentation;
public GridViewTest() {
- super("com.android.cts.stub", GridViewStubActivity.class);
+ super("com.android.cts.widget", GridViewCtsActivity.class);
}
private GridView findGridViewById(int id) {
diff --git a/tests/tests/widget/src/android/widget/cts/HeaderViewListAdapterTest.java b/tests/tests/widget/src/android/widget/cts/HeaderViewListAdapterTest.java
index e583dce..2b92a4d 100644
--- a/tests/tests/widget/src/android/widget/cts/HeaderViewListAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/HeaderViewListAdapterTest.java
@@ -16,9 +16,10 @@
package android.widget.cts;
-
+import android.content.Context;
import android.database.DataSetObserver;
-import android.test.AndroidTestCase;
+import android.test.InstrumentationTestCase;
+import android.test.UiThreadTest;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
@@ -33,13 +34,16 @@
/**
* Test {@link HeaderViewListAdapter}.
*/
-public class HeaderViewListAdapterTest extends AndroidTestCase {
+public class HeaderViewListAdapterTest extends InstrumentationTestCase {
+ private Context mContext;
@Override
protected void setUp() throws Exception {
super.setUp();
+ mContext = getInstrumentation().getTargetContext();
}
+ @UiThreadTest
public void testConstructor() {
ArrayList<ListView.FixedViewInfo> header = new ArrayList<ListView.FixedViewInfo>();
ArrayList<ListView.FixedViewInfo> footer = new ArrayList<ListView.FixedViewInfo>(5);
@@ -52,7 +56,7 @@
HeaderViewListAdapter headerViewListAdapter = new HeaderViewListAdapter(null, null, null);
assertEquals(0, headerViewListAdapter.getHeadersCount());
- ListView lv = new ListView(getContext());
+ ListView lv = new ListView(mContext);
ArrayList<ListView.FixedViewInfo> header = new ArrayList<ListView.FixedViewInfo>(4);
header.add(lv.new FixedViewInfo());
headerViewListAdapter = new HeaderViewListAdapter(header, null, null);
@@ -63,13 +67,14 @@
HeaderViewListAdapter headerViewListAdapter = new HeaderViewListAdapter(null, null, null);
assertEquals(0, headerViewListAdapter.getFootersCount());
- ListView lv = new ListView(getContext());
+ ListView lv = new ListView(mContext);
ArrayList<ListView.FixedViewInfo> footer = new ArrayList<ListView.FixedViewInfo>(4);
footer.add(lv.new FixedViewInfo());
headerViewListAdapter = new HeaderViewListAdapter(null, footer, null);
assertEquals(1, headerViewListAdapter.getFootersCount());
}
+ @UiThreadTest
public void testIsEmpty() {
HeaderViewListAdapter headerViewListAdapter = new HeaderViewListAdapter(null, null, null);
assertTrue(headerViewListAdapter.isEmpty());
@@ -84,10 +89,10 @@
}
public void testRemoveHeader() {
- ListView lv = new ListView(getContext());
+ ListView lv = new ListView(mContext);
ArrayList<ListView.FixedViewInfo> header = new ArrayList<ListView.FixedViewInfo>(4);
- ListView lv1 = new ListView(getContext());
- ListView lv2 = new ListView(getContext());
+ ListView lv1 = new ListView(mContext);
+ ListView lv2 = new ListView(mContext);
ListView.FixedViewInfo info1 = lv.new FixedViewInfo();
info1.view = lv1;
ListView.FixedViewInfo info2 = lv.new FixedViewInfo();
@@ -96,7 +101,7 @@
header.add(info2);
HeaderViewListAdapter headerViewListAdapter = new HeaderViewListAdapter(header, null, null);
assertEquals(2, headerViewListAdapter.getHeadersCount());
- assertFalse(headerViewListAdapter.removeHeader(new ListView(getContext())));
+ assertFalse(headerViewListAdapter.removeHeader(new ListView(mContext)));
assertTrue(headerViewListAdapter.removeHeader(lv1));
assertEquals(1, headerViewListAdapter.getHeadersCount());
@@ -110,10 +115,10 @@
}
public void testRemoveFooter() {
- ListView lv = new ListView(getContext());
+ ListView lv = new ListView(mContext);
ArrayList<ListView.FixedViewInfo> footer = new ArrayList<ListView.FixedViewInfo>(4);
- ListView lv1 = new ListView(getContext());
- ListView lv2 = new ListView(getContext());
+ ListView lv1 = new ListView(mContext);
+ ListView lv2 = new ListView(mContext);
ListView.FixedViewInfo info1 = lv.new FixedViewInfo();
info1.view = lv1;
ListView.FixedViewInfo info2 = lv.new FixedViewInfo();
@@ -122,7 +127,7 @@
footer.add(info2);
HeaderViewListAdapter headerViewListAdapter = new HeaderViewListAdapter(null, footer, null);
assertEquals(2, headerViewListAdapter.getFootersCount());
- assertFalse(headerViewListAdapter.removeFooter(new ListView(getContext())));
+ assertFalse(headerViewListAdapter.removeFooter(new ListView(mContext)));
assertTrue(headerViewListAdapter.removeFooter(lv1));
assertEquals(1, headerViewListAdapter.getFootersCount());
@@ -135,11 +140,12 @@
}
}
+ @UiThreadTest
public void testGetCount() {
HeaderViewListAdapter headerViewListAdapter = new HeaderViewListAdapter(null, null, null);
assertEquals(0, headerViewListAdapter.getCount());
- ListView lv = new ListView(getContext());
+ ListView lv = new ListView(mContext);
ArrayList<ListView.FixedViewInfo> header = new ArrayList<ListView.FixedViewInfo>(4);
Object data1 = new Object();
Object data2 = new Object();
@@ -170,6 +176,7 @@
assertEquals(5, headerViewListAdapter.getCount());
}
+ @UiThreadTest
public void testAreAllItemsEnabled() {
HeaderViewListAdapter headerViewListAdapter = new HeaderViewListAdapter(null, null, null);
assertTrue(headerViewListAdapter.areAllItemsEnabled());
@@ -189,7 +196,7 @@
new HeaderViewListAdapter(null, null, fullAdapter);
assertTrue(headerViewListAdapter.isEnabled(0));
- ListView lv = new ListView(getContext());
+ ListView lv = new ListView(mContext);
ArrayList<ListView.FixedViewInfo> header = new ArrayList<ListView.FixedViewInfo>(4);
header.add(lv.new FixedViewInfo());
headerViewListAdapter = new HeaderViewListAdapter(header, null, fullAdapter);
@@ -212,7 +219,7 @@
}
public void testGetItem() {
- ListView lv = new ListView(getContext());
+ ListView lv = new ListView(mContext);
ArrayList<ListView.FixedViewInfo> header = new ArrayList<ListView.FixedViewInfo>(4);
Object data1 = new Object();
Object data2 = new Object();
@@ -243,10 +250,10 @@
}
public void testGetItemId() {
- ListView lv = new ListView(getContext());
+ ListView lv = new ListView(mContext);
ArrayList<ListView.FixedViewInfo> header = new ArrayList<ListView.FixedViewInfo>(4);
- ListView lv1 = new ListView(getContext());
- ListView lv2 = new ListView(getContext());
+ ListView lv1 = new ListView(mContext);
+ ListView lv2 = new ListView(mContext);
ListView.FixedViewInfo info1 = lv.new FixedViewInfo();
info1.view = lv1;
ListView.FixedViewInfo info2 = lv.new FixedViewInfo();
@@ -271,10 +278,10 @@
}
public void testGetView() {
- ListView lv = new ListView(getContext());
+ ListView lv = new ListView(mContext);
ArrayList<ListView.FixedViewInfo> header = new ArrayList<ListView.FixedViewInfo>(4);
- ListView lv1 = new ListView(getContext());
- ListView lv2 = new ListView(getContext());
+ ListView lv1 = new ListView(mContext);
+ ListView lv2 = new ListView(mContext);
ListView.FixedViewInfo info1 = lv.new FixedViewInfo();
info1.view = lv1;
ListView.FixedViewInfo info2 = lv.new FixedViewInfo();
@@ -345,6 +352,7 @@
assertNull(fullAdapter.getDataSetObserver());
}
+ @UiThreadTest
public void testGetFilter() {
HeaderViewListAdapter headerViewListAdapter = new HeaderViewListAdapter(null, null, null);
assertNull(headerViewListAdapter.getFilter());
@@ -426,7 +434,7 @@
private class HeaderViewFullAdapter implements ListAdapter {
private DataSetObserver mObserver;
private Object mItem;
- private final View mView = new View(getContext());
+ private final View mView = new View(mContext);
public DataSetObserver getDataSetObserver() {
return mObserver;
diff --git a/tests/src/android/widget/cts/HorizontalScrollViewStubActivity.java b/tests/tests/widget/src/android/widget/cts/HorizontalScrollViewCtsActivity.java
similarity index 89%
rename from tests/src/android/widget/cts/HorizontalScrollViewStubActivity.java
rename to tests/tests/widget/src/android/widget/cts/HorizontalScrollViewCtsActivity.java
index 8dd6911..312111a 100644
--- a/tests/src/android/widget/cts/HorizontalScrollViewStubActivity.java
+++ b/tests/tests/widget/src/android/widget/cts/HorizontalScrollViewCtsActivity.java
@@ -16,12 +16,12 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.app.Activity;
import android.os.Bundle;
-public class HorizontalScrollViewStubActivity extends Activity {
+public class HorizontalScrollViewCtsActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
diff --git a/tests/tests/widget/src/android/widget/cts/HorizontalScrollViewTest.java b/tests/tests/widget/src/android/widget/cts/HorizontalScrollViewTest.java
index 5d75006..2862865 100644
--- a/tests/tests/widget/src/android/widget/cts/HorizontalScrollViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/HorizontalScrollViewTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import org.xmlpull.v1.XmlPullParser;
@@ -42,7 +42,7 @@
* Test {@link HorizontalScrollView}.
*/
public class HorizontalScrollViewTest
- extends ActivityInstrumentationTestCase2<HorizontalScrollViewStubActivity> {
+ extends ActivityInstrumentationTestCase2<HorizontalScrollViewCtsActivity> {
private static final int ITEM_WIDTH = 250;
private static final int ITEM_HEIGHT = 100;
private static final int ITEM_COUNT = 15;
@@ -53,7 +53,7 @@
private Activity mActivity;
public HorizontalScrollViewTest() {
- super("com.android.cts.stub", HorizontalScrollViewStubActivity.class);
+ super("com.android.cts.widget", HorizontalScrollViewCtsActivity.class);
}
@Override
diff --git a/tests/tests/widget/src/android/widget/cts/ImageButtonTest.java b/tests/tests/widget/src/android/widget/cts/ImageButtonTest.java
index a71ec9d..374c9c2 100644
--- a/tests/tests/widget/src/android/widget/cts/ImageButtonTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ImageButtonTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import org.xmlpull.v1.XmlPullParser;
diff --git a/tests/tests/widget/src/android/widget/cts/ImageSwitcherTest.java b/tests/tests/widget/src/android/widget/cts/ImageSwitcherTest.java
index 49bf3c6..c0e606c 100644
--- a/tests/tests/widget/src/android/widget/cts/ImageSwitcherTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ImageSwitcherTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import org.xmlpull.v1.XmlPullParser;
diff --git a/tests/src/android/widget/cts/ImageViewStubActivity.java b/tests/tests/widget/src/android/widget/cts/ImageViewCtsActivity.java
similarity index 91%
rename from tests/src/android/widget/cts/ImageViewStubActivity.java
rename to tests/tests/widget/src/android/widget/cts/ImageViewCtsActivity.java
index 7b93168..295f3da 100644
--- a/tests/src/android/widget/cts/ImageViewStubActivity.java
+++ b/tests/tests/widget/src/android/widget/cts/ImageViewCtsActivity.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.app.Activity;
import android.os.Bundle;
@@ -24,7 +24,7 @@
/**
* A minimal application for {@link ImageView} test.
*/
-public class ImageViewStubActivity extends Activity {
+public class ImageViewCtsActivity extends Activity {
/**
* Called with the activity is first created.
*/
diff --git a/tests/tests/widget/src/android/widget/cts/ImageViewTest.java b/tests/tests/widget/src/android/widget/cts/ImageViewTest.java
index 84276f9..7b0b65a 100644
--- a/tests/tests/widget/src/android/widget/cts/ImageViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ImageViewTest.java
@@ -47,18 +47,18 @@
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
/**
* Test {@link ImageView}.
*/
-public class ImageViewTest extends ActivityInstrumentationTestCase<ImageViewStubActivity> {
+public class ImageViewTest extends ActivityInstrumentationTestCase<ImageViewCtsActivity> {
private ImageView mImageView;
private Activity mActivity;
public ImageViewTest() {
- super("com.android.cts.stub", ImageViewStubActivity.class);
+ super("com.android.cts.widget", ImageViewCtsActivity.class);
}
/**
diff --git a/tests/src/android/widget/cts/LayoutDirectionStubActivity.java b/tests/tests/widget/src/android/widget/cts/LayoutDirectionCtsActivity.java
similarity index 90%
rename from tests/src/android/widget/cts/LayoutDirectionStubActivity.java
rename to tests/tests/widget/src/android/widget/cts/LayoutDirectionCtsActivity.java
index 66f24f7..093f554 100644
--- a/tests/src/android/widget/cts/LayoutDirectionStubActivity.java
+++ b/tests/tests/widget/src/android/widget/cts/LayoutDirectionCtsActivity.java
@@ -18,12 +18,12 @@
import android.app.Activity;
import android.os.Bundle;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
/**
* A minimal application for layout direction test.
*/
-public class LayoutDirectionStubActivity extends Activity {
+public class LayoutDirectionCtsActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
diff --git a/tests/tests/widget/src/android/widget/cts/LayoutDirectionTest.java b/tests/tests/widget/src/android/widget/cts/LayoutDirectionTest.java
index 5c8be24..c393e95 100644
--- a/tests/tests/widget/src/android/widget/cts/LayoutDirectionTest.java
+++ b/tests/tests/widget/src/android/widget/cts/LayoutDirectionTest.java
@@ -20,17 +20,17 @@
import android.test.UiThreadTest;
import android.view.ViewGroup;
import android.widget.*;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import static android.view.View.LAYOUT_DIRECTION_LTR;
import static android.view.View.LAYOUT_DIRECTION_RTL;
import static android.view.View.LAYOUT_DIRECTION_INHERIT;
import static android.view.View.LAYOUT_DIRECTION_LOCALE;
-public class LayoutDirectionTest extends ActivityInstrumentationTestCase2<LayoutDirectionStubActivity> {
+public class LayoutDirectionTest extends ActivityInstrumentationTestCase2<LayoutDirectionCtsActivity> {
public LayoutDirectionTest() {
- super(LayoutDirectionStubActivity.class);
+ super(LayoutDirectionCtsActivity.class);
}
private void checkDefaultDirectionForOneLayoutWithCode(ViewGroup vg) {
diff --git a/tests/src/android/widget/cts/LinearLayoutStubActivity.java b/tests/tests/widget/src/android/widget/cts/LinearLayoutCtsActivity.java
similarity index 90%
rename from tests/src/android/widget/cts/LinearLayoutStubActivity.java
rename to tests/tests/widget/src/android/widget/cts/LinearLayoutCtsActivity.java
index 8f4c5da..0cb5bc0 100644
--- a/tests/src/android/widget/cts/LinearLayoutStubActivity.java
+++ b/tests/tests/widget/src/android/widget/cts/LinearLayoutCtsActivity.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.app.Activity;
import android.os.Bundle;
@@ -24,7 +24,7 @@
/**
* A minimal application for {@link LinearLayout} test.
*/
-public class LinearLayoutStubActivity extends Activity {
+public class LinearLayoutCtsActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
diff --git a/tests/tests/widget/src/android/widget/cts/LinearLayoutTest.java b/tests/tests/widget/src/android/widget/cts/LinearLayoutTest.java
index 4465533..5815f9a 100644
--- a/tests/tests/widget/src/android/widget/cts/LinearLayoutTest.java
+++ b/tests/tests/widget/src/android/widget/cts/LinearLayoutTest.java
@@ -31,17 +31,17 @@
import android.widget.ListView;
import android.widget.TextView;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
/**
* Test {@link LinearLayout}.
*/
-public class LinearLayoutTest extends ActivityInstrumentationTestCase<LinearLayoutStubActivity> {
+public class LinearLayoutTest extends ActivityInstrumentationTestCase<LinearLayoutCtsActivity> {
private Context mContext;
private Activity mActivity;
public LinearLayoutTest() {
- super("com.android.cts.stub", LinearLayoutStubActivity.class);
+ super("com.android.cts.widget", LinearLayoutCtsActivity.class);
}
@Override
diff --git a/tests/tests/widget/src/android/widget/cts/LinearLayout_LayoutParamsTest.java b/tests/tests/widget/src/android/widget/cts/LinearLayout_LayoutParamsTest.java
index 72f3ff6..8ecca6f 100644
--- a/tests/tests/widget/src/android/widget/cts/LinearLayout_LayoutParamsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/LinearLayout_LayoutParamsTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import com.android.internal.util.XmlUtils;
diff --git a/tests/src/android/widget/cts/ListViewStubActivity.java b/tests/tests/widget/src/android/widget/cts/ListViewCtsActivity.java
similarity index 90%
rename from tests/src/android/widget/cts/ListViewStubActivity.java
rename to tests/tests/widget/src/android/widget/cts/ListViewCtsActivity.java
index 77c3e5e..186e47b 100644
--- a/tests/src/android/widget/cts/ListViewStubActivity.java
+++ b/tests/tests/widget/src/android/widget/cts/ListViewCtsActivity.java
@@ -16,12 +16,12 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.app.Activity;
import android.os.Bundle;
-public class ListViewStubActivity extends Activity {
+public class ListViewCtsActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
diff --git a/tests/tests/widget/src/android/widget/cts/ListViewTest.java b/tests/tests/widget/src/android/widget/cts/ListViewTest.java
index 7af8c2e..5f0967a 100644
--- a/tests/tests/widget/src/android/widget/cts/ListViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ListViewTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import com.google.android.collect.Lists;
import org.xmlpull.v1.XmlPullParser;
@@ -51,7 +51,7 @@
import junit.framework.Assert;
-public class ListViewTest extends ActivityInstrumentationTestCase2<ListViewStubActivity> {
+public class ListViewTest extends ActivityInstrumentationTestCase2<ListViewCtsActivity> {
private final String[] mCountryList = new String[] {
"Argentina", "Australia", "China", "France", "Germany", "Italy", "Japan", "United States"
};
@@ -69,7 +69,7 @@
private ArrayAdapter<String> mAdapter_empty;
public ListViewTest() {
- super("com.android.cts.stub", ListViewStubActivity.class);
+ super("com.android.cts.widget", ListViewCtsActivity.class);
}
protected void setUp() throws Exception {
diff --git a/tests/src/android/widget/cts/MediaControllerStubActivity.java b/tests/tests/widget/src/android/widget/cts/MediaControllerCtsActivity.java
similarity index 91%
rename from tests/src/android/widget/cts/MediaControllerStubActivity.java
rename to tests/tests/widget/src/android/widget/cts/MediaControllerCtsActivity.java
index 0e353be..5dfcc59 100644
--- a/tests/src/android/widget/cts/MediaControllerStubActivity.java
+++ b/tests/tests/widget/src/android/widget/cts/MediaControllerCtsActivity.java
@@ -20,12 +20,12 @@
import android.os.Bundle;
import android.widget.MediaController;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
/**
* A minimal application for {@link MediaController} test.
*/
-public class MediaControllerStubActivity extends Activity {
+public class MediaControllerCtsActivity extends Activity {
/**
* Called with the activity is first created.
*/
diff --git a/tests/tests/widget/src/android/widget/cts/MediaControllerTest.java b/tests/tests/widget/src/android/widget/cts/MediaControllerTest.java
index 5ae692b..49bc767 100644
--- a/tests/tests/widget/src/android/widget/cts/MediaControllerTest.java
+++ b/tests/tests/widget/src/android/widget/cts/MediaControllerTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import org.xmlpull.v1.XmlPullParser;
@@ -43,14 +43,14 @@
* Test {@link MediaController}.
*/
public class MediaControllerTest extends
- ActivityInstrumentationTestCase2<MediaControllerStubActivity> {
+ ActivityInstrumentationTestCase2<MediaControllerCtsActivity> {
private MediaController mMediaController;
private Activity mActivity;
private Instrumentation mInstrumentation;
private static final long DEFAULT_TIMEOUT = 3000;
public MediaControllerTest() {
- super("com.android.cts.stub", MediaControllerStubActivity.class);
+ super("com.android.cts.widget", MediaControllerCtsActivity.class);
}
@Override
@@ -60,6 +60,7 @@
mInstrumentation = getInstrumentation();
}
+ @UiThreadTest
public void testConstructor() {
new MediaController(mActivity, null);
@@ -109,7 +110,12 @@
}
public void testShow() {
- mMediaController = new MediaController(mActivity, true);
+ mActivity.runOnUiThread(new Runnable() {
+ public void run() {
+ mMediaController = new MediaController(mActivity, true);
+ }
+ });
+ mInstrumentation.waitForIdleSync();
assertFalse(mMediaController.isShowing());
final MockMediaPlayerControl mediaPlayerControl = new MockMediaPlayerControl();
@@ -185,7 +191,12 @@
}
public void testOnTrackballEvent() {
- mMediaController = new MediaController(mActivity);
+ mActivity.runOnUiThread(new Runnable() {
+ public void run() {
+ mMediaController = new MediaController(mActivity);
+ }
+ });
+ mInstrumentation.waitForIdleSync();
final MockMediaPlayerControl mediaPlayerControl = new MockMediaPlayerControl();
mMediaController.setMediaPlayer(mediaPlayerControl);
@@ -238,6 +249,7 @@
assertFalse(mMediaController.isEnabled());
}
+ @UiThreadTest
public void testSetPrevNextListeners() {
final View videoView = mActivity.findViewById(R.id.mediacontroller_videoview);
final MockMediaPlayerControl mediaPlayerControl = new MockMediaPlayerControl();
diff --git a/tests/tests/widget/src/android/widget/cts/MockApplication.java b/tests/tests/widget/src/android/widget/cts/MockApplication.java
new file mode 100644
index 0000000..827599d
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/MockApplication.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2008 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.widget.cts;
+
+import android.app.Application;
+import android.content.res.Configuration;
+
+
+public class MockApplication extends Application {
+
+ public boolean isOnCreateCalled;
+ public boolean isConstructorCalled;
+ public boolean isOnConfigurationChangedCalled;
+ public boolean isOnLowMemoryCalled;
+
+ public MockApplication() {
+ super();
+ isConstructorCalled = true;
+ }
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ isOnCreateCalled = true;
+ }
+
+ @Override
+ public void onTerminate() {
+ super.onTerminate();
+ // The documentation states that one cannot rely on this method being called. No need to
+ // test it here.
+ }
+
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ isOnConfigurationChangedCalled = true;
+ }
+
+ @Override
+ public void onLowMemory() {
+ super.onLowMemory();
+ isOnLowMemoryCalled = true;
+ }
+}
diff --git a/tests/src/android/widget/cts/MockLinearLayout.java b/tests/tests/widget/src/android/widget/cts/MockLinearLayout.java
similarity index 100%
rename from tests/src/android/widget/cts/MockLinearLayout.java
rename to tests/tests/widget/src/android/widget/cts/MockLinearLayout.java
diff --git a/tests/src/android/widget/cts/MockPopupWindowStubActivity.java b/tests/tests/widget/src/android/widget/cts/MockPopupWindowCtsActivity.java
similarity index 90%
rename from tests/src/android/widget/cts/MockPopupWindowStubActivity.java
rename to tests/tests/widget/src/android/widget/cts/MockPopupWindowCtsActivity.java
index 2ca81de..a68286a 100644
--- a/tests/src/android/widget/cts/MockPopupWindowStubActivity.java
+++ b/tests/tests/widget/src/android/widget/cts/MockPopupWindowCtsActivity.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.app.Activity;
import android.os.Bundle;
@@ -25,7 +25,7 @@
/**
* Stub activity for testing {@link PopupWindow}
*/
-public class MockPopupWindowStubActivity extends Activity {
+public class MockPopupWindowCtsActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
diff --git a/tests/src/android/widget/cts/MockTextView.java b/tests/tests/widget/src/android/widget/cts/MockTextView.java
similarity index 100%
rename from tests/src/android/widget/cts/MockTextView.java
rename to tests/tests/widget/src/android/widget/cts/MockTextView.java
diff --git a/tests/src/android/text/style/cts/MockURLSpanTestActivity.java b/tests/tests/widget/src/android/widget/cts/MockURLSpanTestActivity.java
similarity index 93%
copy from tests/src/android/text/style/cts/MockURLSpanTestActivity.java
copy to tests/tests/widget/src/android/widget/cts/MockURLSpanTestActivity.java
index 1edb3e0..ab4940c 100644
--- a/tests/src/android/text/style/cts/MockURLSpanTestActivity.java
+++ b/tests/tests/widget/src/android/widget/cts/MockURLSpanTestActivity.java
@@ -14,9 +14,9 @@
* limitations under the License.
*/
-package android.text.style.cts;
+package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.app.Activity;
import android.os.Bundle;
diff --git a/tests/src/android/widget/cts/MultiAutoCompleteTextViewStubActivity.java b/tests/tests/widget/src/android/widget/cts/MultiAutoCompleteTextViewCtsActivity.java
similarity index 89%
rename from tests/src/android/widget/cts/MultiAutoCompleteTextViewStubActivity.java
rename to tests/tests/widget/src/android/widget/cts/MultiAutoCompleteTextViewCtsActivity.java
index fa973a6..1379150 100644
--- a/tests/src/android/widget/cts/MultiAutoCompleteTextViewStubActivity.java
+++ b/tests/tests/widget/src/android/widget/cts/MultiAutoCompleteTextViewCtsActivity.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.app.Activity;
import android.os.Bundle;
@@ -24,7 +24,7 @@
/**
* A minimal application for MultiAutoCompleteTextView test.
*/
-public class MultiAutoCompleteTextViewStubActivity extends Activity {
+public class MultiAutoCompleteTextViewCtsActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
diff --git a/tests/tests/widget/src/android/widget/cts/MultiAutoCompleteTextViewTest.java b/tests/tests/widget/src/android/widget/cts/MultiAutoCompleteTextViewTest.java
index b37b4ef..4afdb80 100644
--- a/tests/tests/widget/src/android/widget/cts/MultiAutoCompleteTextViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/MultiAutoCompleteTextViewTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import org.xmlpull.v1.XmlPullParser;
@@ -38,13 +38,13 @@
import android.widget.MultiAutoCompleteTextView.Tokenizer;
public class MultiAutoCompleteTextViewTest extends ActivityInstrumentationTestCase2
- <MultiAutoCompleteTextViewStubActivity> {
+ <MultiAutoCompleteTextViewCtsActivity> {
private MultiAutoCompleteTextView mMultiAutoCompleteTextView_country;
private MultiAutoCompleteTextView mMultiAutoCompleteTextView_name;
private Activity mActivity;
public MultiAutoCompleteTextViewTest() {
- super("com.android.cts.stub", MultiAutoCompleteTextViewStubActivity.class);
+ super("com.android.cts.widget", MultiAutoCompleteTextViewCtsActivity.class);
}
@Override
@@ -59,6 +59,7 @@
.findViewById(R.id.name_edit);
}
+ @UiThreadTest
public void testConstructor() {
XmlPullParser parser = mActivity.getResources()
.getXml(R.layout.multi_auto_complete_text_view_layout);
@@ -151,6 +152,7 @@
assertEquals(str + ", ", mMultiAutoCompleteTextView_country.getText().toString());
}
+ @UiThreadTest
public void testPerformFiltering() {
MyMultiAutoCompleteTextView multiAutoCompleteTextView =
new MyMultiAutoCompleteTextView(mActivity);
@@ -175,6 +177,7 @@
assertNotNull(multiAutoCompleteTextView.getFilter());
}
+ @UiThreadTest
public void testReplaceText() {
MyMultiAutoCompleteTextView multiAutoCompleteTextView =
new MyMultiAutoCompleteTextView(mActivity);
diff --git a/tests/src/android/widget/cts/MyGallery.java b/tests/tests/widget/src/android/widget/cts/MyGallery.java
similarity index 100%
rename from tests/src/android/widget/cts/MyGallery.java
rename to tests/tests/widget/src/android/widget/cts/MyGallery.java
diff --git a/tests/src/android/widget/cts/MyHorizontalScrollView.java b/tests/tests/widget/src/android/widget/cts/MyHorizontalScrollView.java
similarity index 100%
rename from tests/src/android/widget/cts/MyHorizontalScrollView.java
rename to tests/tests/widget/src/android/widget/cts/MyHorizontalScrollView.java
diff --git a/tests/src/android/widget/cts/MyScrollView.java b/tests/tests/widget/src/android/widget/cts/MyScrollView.java
similarity index 100%
rename from tests/src/android/widget/cts/MyScrollView.java
rename to tests/tests/widget/src/android/widget/cts/MyScrollView.java
diff --git a/tests/tests/widget/src/android/widget/cts/NullWebViewUtils.java b/tests/tests/widget/src/android/widget/cts/NullWebViewUtils.java
new file mode 100644
index 0000000..d7a73fa
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/NullWebViewUtils.java
@@ -0,0 +1,88 @@
+/*
+ * 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 android.widget.cts;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+
+/**
+ * Utilities to enable the android.webkit.* CTS tests (and others that rely on a functioning
+ * android.webkit.WebView implementation) to determine whether a functioning WebView is present
+ * on the device or not.
+ *
+ * Test cases that require android.webkit.* classes should wrap their first usage of WebView in a
+ * try catch block, and pass any exception that is thrown to
+ * NullWebViewUtils.determineIfWebViewAvailable. The return value of
+ * NullWebViewUtils.isWebViewAvailable will then determine if the test should expect to be able to
+ * use a WebView.
+ */
+public class NullWebViewUtils {
+
+ private static boolean sWebViewUnavailable;
+
+ /**
+ * @param context Current Activity context, used to query the PackageManager.
+ * @param t An exception thrown by trying to invoke android.webkit.* APIs.
+ */
+ public static void determineIfWebViewAvailable(Context context, Throwable t) {
+ sWebViewUnavailable = !hasWebViewFeature(context) && checkCauseWasUnsupportedOperation(t);
+ }
+
+ /**
+ * After calling determineIfWebViewAvailable, this returns whether a WebView is available on the
+ * device and wheter the test can rely on it.
+ * @return True iff. PackageManager determined that there is no WebView on the device and the
+ * exception thrown from android.webkit.* was UnsupportedOperationException.
+ */
+ public static boolean isWebViewAvailable() {
+ return !sWebViewUnavailable;
+ }
+
+ private static boolean hasWebViewFeature(Context context) {
+ // Query the system property that determins if there is a functional WebView on the device.
+ PackageManager pm = context.getPackageManager();
+ return pm.hasSystemFeature(PackageManager.FEATURE_WEBVIEW);
+ }
+
+ private static boolean checkCauseWasUnsupportedOperation(Throwable t) {
+ if (t == null) return false;
+ while (t.getCause() != null) {
+ t = t.getCause();
+ }
+ return t instanceof UnsupportedOperationException;
+ }
+
+ /**
+ * Some CTS tests (by design) first use android.webkit.* from a background thread. This helper
+ * allows the test to catch the UnsupportedOperationException from that background thread, and
+ * then query the result from the test main thread.
+ */
+ public static class NullWebViewFromThreadExceptionHandler
+ implements Thread.UncaughtExceptionHandler {
+ private Throwable mPendingException;
+
+ @Override
+ public void uncaughtException(Thread t, Throwable e) {
+ mPendingException = e;
+ }
+
+ public boolean isWebViewAvailable(Context context) {
+ return hasWebViewFeature(context) ||
+ !checkCauseWasUnsupportedOperation(mPendingException);
+ }
+ }
+}
\ No newline at end of file
diff --git a/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java b/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java
index 997c2e9..4a14d2b 100644
--- a/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java
+++ b/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.app.Activity;
@@ -27,6 +27,7 @@
import android.graphics.drawable.Drawable;
import android.os.SystemClock;
import android.test.ActivityInstrumentationTestCase2;
+import android.test.UiThreadTest;
import android.view.Display;
import android.view.Gravity;
import android.view.MotionEvent;
@@ -41,7 +42,7 @@
import android.widget.PopupWindow.OnDismissListener;
public class PopupWindowTest extends
- ActivityInstrumentationTestCase2<MockPopupWindowStubActivity> {
+ ActivityInstrumentationTestCase2<MockPopupWindowCtsActivity> {
private Instrumentation mInstrumentation;
private Activity mActivity;
/** The popup window. */
@@ -51,7 +52,7 @@
* Instantiates a new popup window test.
*/
public PopupWindowTest() {
- super("com.android.cts.stub", MockPopupWindowStubActivity.class);
+ super("com.android.cts.widget", MockPopupWindowCtsActivity.class);
}
/*
@@ -366,6 +367,7 @@
assertTrue(maxAvailableHeight <= avaliable);
}
+ @UiThreadTest
public void testDismiss() {
mPopupWindow = createPopupWindow(createPopupContent());
assertFalse(mPopupWindow.isShowing());
@@ -447,7 +449,13 @@
int[] sndXY = new int[2];
int[] viewInWindowXY = new int[2];
- mPopupWindow = createPopupWindow(createPopupContent());
+ mInstrumentation.runOnMainSync(new Runnable() {
+ public void run() {
+ mPopupWindow = createPopupWindow(createPopupContent());
+ }
+ });
+
+ mInstrumentation.waitForIdleSync();
// Do not update if it is not shown
assertFalse(mPopupWindow.isShowing());
assertEquals(100, mPopupWindow.getWidth());
@@ -492,30 +500,54 @@
}
public void testUpdateDimensionAndAlignAnchorView() {
- mPopupWindow = createPopupWindow(createPopupContent());
+ mInstrumentation.runOnMainSync(new Runnable() {
+ public void run() {
+ mPopupWindow = createPopupWindow(createPopupContent());
+ }
+ });
+ mInstrumentation.waitForIdleSync();
- View anchorView = mActivity.findViewById(R.id.anchor_upper);
+ final View anchorView = mActivity.findViewById(R.id.anchor_upper);
mPopupWindow.update(anchorView, 50, 50);
// Do not update if it is not shown
assertFalse(mPopupWindow.isShowing());
assertEquals(100, mPopupWindow.getWidth());
assertEquals(100, mPopupWindow.getHeight());
- mPopupWindow.showAsDropDown(anchorView);
+ mInstrumentation.runOnMainSync(new Runnable() {
+ public void run() {
+ mPopupWindow.showAsDropDown(anchorView);
+ }
+ });
mInstrumentation.waitForIdleSync();
// update if it is shown
- mPopupWindow.update(anchorView, 50, 50);
+ mInstrumentation.runOnMainSync(new Runnable() {
+ public void run() {
+ mPopupWindow.update(anchorView, 50, 50);
+ }
+ });
+ mInstrumentation.waitForIdleSync();
assertTrue(mPopupWindow.isShowing());
assertEquals(50, mPopupWindow.getWidth());
assertEquals(50, mPopupWindow.getHeight());
// ignore if width or height is -1
- mPopupWindow.update(anchorView, -1, -1);
+ mInstrumentation.runOnMainSync(new Runnable() {
+ public void run() {
+ mPopupWindow.update(anchorView, -1, -1);
+ }
+ });
+ mInstrumentation.waitForIdleSync();
assertTrue(mPopupWindow.isShowing());
assertEquals(50, mPopupWindow.getWidth());
assertEquals(50, mPopupWindow.getHeight());
- mPopupWindow.dismiss();
+ mInstrumentation.runOnMainSync(new Runnable() {
+ public void run() {
+ mPopupWindow.dismiss();
+ }
+ });
+ mInstrumentation.waitForIdleSync();
}
public void testUpdateDimensionAndAlignAnchorViewWithOffsets() {
@@ -633,7 +665,12 @@
}
public void testIsAboveAnchor() {
- mPopupWindow = createPopupWindow(createPopupContent());
+ mInstrumentation.runOnMainSync(new Runnable() {
+ public void run() {
+ mPopupWindow = createPopupWindow(createPopupContent());
+ }
+ });
+ mInstrumentation.waitForIdleSync();
final View upperAnchor = mActivity.findViewById(R.id.anchor_upper);
mInstrumentation.runOnMainSync(new Runnable() {
diff --git a/tests/src/android/widget/cts/ProgressBarStubActivity.java b/tests/tests/widget/src/android/widget/cts/ProgressBarCtsActivity.java
similarity index 93%
rename from tests/src/android/widget/cts/ProgressBarStubActivity.java
rename to tests/tests/widget/src/android/widget/cts/ProgressBarCtsActivity.java
index 57cfa1a..8298d5f 100644
--- a/tests/src/android/widget/cts/ProgressBarStubActivity.java
+++ b/tests/tests/widget/src/android/widget/cts/ProgressBarCtsActivity.java
@@ -23,7 +23,7 @@
* An application for ProgressBar test
*
*/
-public class ProgressBarStubActivity extends Activity {
+public class ProgressBarCtsActivity extends Activity {
/**
* Called with the activity is first created.
*/
diff --git a/tests/tests/widget/src/android/widget/cts/ProgressBarTest.java b/tests/tests/widget/src/android/widget/cts/ProgressBarTest.java
index 80681d0..e57d298 100644
--- a/tests/tests/widget/src/android/widget/cts/ProgressBarTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ProgressBarTest.java
@@ -21,7 +21,7 @@
import android.graphics.PorterDuff;
import android.view.LayoutInflater;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.content.Context;
diff --git a/tests/tests/widget/src/android/widget/cts/RadioButtonTest.java b/tests/tests/widget/src/android/widget/cts/RadioButtonTest.java
index 79a51c8..4ec4eb5 100644
--- a/tests/tests/widget/src/android/widget/cts/RadioButtonTest.java
+++ b/tests/tests/widget/src/android/widget/cts/RadioButtonTest.java
@@ -16,11 +16,12 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.content.Context;
import android.test.InstrumentationTestCase;
+import android.test.UiThreadTest;
import android.util.AttributeSet;
import android.widget.RadioButton;
@@ -66,6 +67,7 @@
new RadioButton(mContext, attrs, Integer.MIN_VALUE);
}
+ @UiThreadTest
public void testToggle() {
RadioButton button = new RadioButton(mContext);
assertFalse(button.isChecked());
diff --git a/tests/tests/widget/src/android/widget/cts/RadioGroupTest.java b/tests/tests/widget/src/android/widget/cts/RadioGroupTest.java
index f7baab7..a172ecb 100644
--- a/tests/tests/widget/src/android/widget/cts/RadioGroupTest.java
+++ b/tests/tests/widget/src/android/widget/cts/RadioGroupTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import org.xmlpull.v1.XmlPullParser;
@@ -24,6 +24,7 @@
import android.content.Context;
import android.test.InstrumentationTestCase;
+import android.test.UiThreadTest;
import android.util.AttributeSet;
import android.util.Xml;
import android.view.Gravity;
@@ -107,6 +108,7 @@
assertEquals(0, newButton.getId() & 0xFF000000);
}
+ @UiThreadTest
public void testInternalCheckedStateTracker() {
mDefaultRadioGroup = new RadioGroup(mContext);
RadioButton newButton = new RadioButton(mContext);
@@ -138,6 +140,7 @@
assertHaveNotCalledOnCheckedChanged(listener);
}
+ @UiThreadTest
public void testGetCheckedRadioButtonId() {
assertEquals(-1, mDefaultRadioGroup.getCheckedRadioButtonId());
@@ -158,6 +161,7 @@
assertEquals(-3, mDefaultRadioGroup.getCheckedRadioButtonId());
}
+ @UiThreadTest
public void testClearCheck() {
MockOnCheckedChangeListener listener = new MockOnCheckedChangeListener();
mDefaultRadioGroup.setOnCheckedChangeListener(listener);
@@ -194,6 +198,7 @@
assertOnCheckedChangedParams(listener, 0, mDefaultRadioGroup, -1);
}
+ @UiThreadTest
public void testCheck() {
MockOnCheckedChangeListener listener = new MockOnCheckedChangeListener();
mDefaultRadioGroup.setOnCheckedChangeListener(listener);
@@ -238,6 +243,7 @@
mDefaultRadioGroup.check(0);
}
+ @UiThreadTest
public void testSetOnCheckedChangeListener() {
MockOnCheckedChangeListener listener = new MockOnCheckedChangeListener();
mDefaultRadioGroup.setOnCheckedChangeListener(listener);
@@ -333,6 +339,7 @@
assertEquals(RadioGroup.LayoutParams.WRAP_CONTENT, p.height);
}
+ @UiThreadTest
public void testOnFinishInflate() {
MockRadioGroup radioGroup = new MockRadioGroup(mContext);
int checkId = 100;
@@ -371,6 +378,7 @@
assertFalse(button.isChecked());
}
+ @UiThreadTest
public void testAddView() {
mDefaultRadioGroup.check(BUTTON_ID_0);
assertEquals(BUTTON_ID_0, mDefaultRadioGroup.getCheckedRadioButtonId());
diff --git a/tests/tests/widget/src/android/widget/cts/RadioGroup_LayoutParamsTest.java b/tests/tests/widget/src/android/widget/cts/RadioGroup_LayoutParamsTest.java
index 23155c7..4b1aa5b 100644
--- a/tests/tests/widget/src/android/widget/cts/RadioGroup_LayoutParamsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/RadioGroup_LayoutParamsTest.java
@@ -113,8 +113,8 @@
} catch (NullPointerException e) {
}
- mLayoutParams = new LayoutParams(getContext(),
- getAttributeSet(com.android.cts.stub.R.layout.radiogroup_1));
+ mLayoutParams = new LayoutParams(getContext(),
+ getAttributeSet(com.android.cts.widget.R.layout.radiogroup_1));
assertNotNull(mLayoutParams);
assertEquals(0.5, mLayoutParams.weight, 0);
assertEquals(Gravity.BOTTOM, mLayoutParams.gravity);
@@ -130,8 +130,8 @@
assertEquals(RadioGroup.LayoutParams.WRAP_CONTENT, mLayoutParams.height);
try {
- new RadioGroup.LayoutParams(null,
- getAttributeSet(com.android.cts.stub.R.layout.radiogroup_1));
+ new RadioGroup.LayoutParams(null,
+ getAttributeSet(com.android.cts.widget.R.layout.radiogroup_1));
fail("The constructor should throw NullPointerException when param Context is null.");
} catch (NullPointerException e) {
}
@@ -143,7 +143,7 @@
assertEquals(LayoutParams.WRAP_CONTENT, layoutParams.width);
assertEquals(LayoutParams.WRAP_CONTENT, layoutParams.height);
- AttributeSet attrs = getAttributeSet(com.android.cts.stub.R.layout.radiogroup_1);
+ AttributeSet attrs = getAttributeSet(com.android.cts.widget.R.layout.radiogroup_1);
TypedArray a = mContext.obtainStyledAttributes(attrs, R.styleable.ViewGroup_MarginLayout);
layoutParams.setBaseAttributes(a,
R.styleable.ViewGroup_MarginLayout_layout_width,
diff --git a/tests/src/android/widget/cts/RatingBarStubActivity.java b/tests/tests/widget/src/android/widget/cts/RatingBarCtsActivity.java
similarity index 91%
rename from tests/src/android/widget/cts/RatingBarStubActivity.java
rename to tests/tests/widget/src/android/widget/cts/RatingBarCtsActivity.java
index 9635252..7d4e232 100644
--- a/tests/src/android/widget/cts/RatingBarStubActivity.java
+++ b/tests/tests/widget/src/android/widget/cts/RatingBarCtsActivity.java
@@ -19,13 +19,13 @@
import android.app.Activity;
import android.os.Bundle;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
/**
* An application for ProgressBar test
*
*/
-public class RatingBarStubActivity extends Activity {
+public class RatingBarCtsActivity extends Activity {
/**
* Called with the activity is first created.
*/
diff --git a/tests/tests/widget/src/android/widget/cts/RatingBarTest.java b/tests/tests/widget/src/android/widget/cts/RatingBarTest.java
index fe0e647..1bb42e8 100644
--- a/tests/tests/widget/src/android/widget/cts/RatingBarTest.java
+++ b/tests/tests/widget/src/android/widget/cts/RatingBarTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.content.Context;
@@ -28,12 +28,12 @@
/**
* Test {@link RatingBar}.
*/
-public class RatingBarTest extends ActivityInstrumentationTestCase2<RatingBarStubActivity> {
+public class RatingBarTest extends ActivityInstrumentationTestCase2<RatingBarCtsActivity> {
private Context mContext;
- private RatingBarStubActivity mActivity;
+ private RatingBarCtsActivity mActivity;
public RatingBarTest() {
- super("com.android.cts.stub", RatingBarStubActivity.class);
+ super("com.android.cts.widget", RatingBarCtsActivity.class);
}
@Override
diff --git a/tests/src/android/widget/cts/RelativeLayoutStubActivity.java b/tests/tests/widget/src/android/widget/cts/RelativeLayoutCtsActivity.java
similarity index 91%
rename from tests/src/android/widget/cts/RelativeLayoutStubActivity.java
rename to tests/tests/widget/src/android/widget/cts/RelativeLayoutCtsActivity.java
index d4bd474..df83f54 100644
--- a/tests/src/android/widget/cts/RelativeLayoutStubActivity.java
+++ b/tests/tests/widget/src/android/widget/cts/RelativeLayoutCtsActivity.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.app.Activity;
import android.os.Bundle;
@@ -24,7 +24,7 @@
/**
* A minimal application for RelativeLayout test.
*/
-public class RelativeLayoutStubActivity extends Activity {
+public class RelativeLayoutCtsActivity extends Activity {
/**
* Called with the activity is first created.
*/
diff --git a/tests/tests/widget/src/android/widget/cts/RelativeLayoutTest.java b/tests/tests/widget/src/android/widget/cts/RelativeLayoutTest.java
index 9d15160..b5ce5c9 100644
--- a/tests/tests/widget/src/android/widget/cts/RelativeLayoutTest.java
+++ b/tests/tests/widget/src/android/widget/cts/RelativeLayoutTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import com.android.internal.util.XmlUtils;
@@ -43,11 +43,11 @@
* Test {@link RelativeLayout}.
*/
public class RelativeLayoutTest extends
- ActivityInstrumentationTestCase2<RelativeLayoutStubActivity> {
+ ActivityInstrumentationTestCase2<RelativeLayoutCtsActivity> {
private Activity mActivity;
public RelativeLayoutTest() {
- super("com.android.cts.stub", RelativeLayoutStubActivity.class);
+ super("com.android.cts.widget", RelativeLayoutCtsActivity.class);
}
@Override
diff --git a/tests/tests/widget/src/android/widget/cts/RelativeLayout_LayoutParamsTest.java b/tests/tests/widget/src/android/widget/cts/RelativeLayout_LayoutParamsTest.java
index 04682cb..a3bd95c 100644
--- a/tests/tests/widget/src/android/widget/cts/RelativeLayout_LayoutParamsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/RelativeLayout_LayoutParamsTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.test.ActivityInstrumentationTestCase2;
@@ -29,10 +29,10 @@
* Test {@link RelativeLayout.LayoutParams}.
*/
public class RelativeLayout_LayoutParamsTest extends
- ActivityInstrumentationTestCase2<RelativeLayoutStubActivity> {
+ ActivityInstrumentationTestCase2<RelativeLayoutCtsActivity> {
public RelativeLayout_LayoutParamsTest() {
- super("com.android.cts.stub", RelativeLayoutStubActivity.class);
+ super("com.android.cts.widget", RelativeLayoutCtsActivity.class);
}
public void testConstructor() {
@@ -53,7 +53,7 @@
// Test RelativeLayout.Params which generated from the xml file.
int rules[];
- RelativeLayoutStubActivity activity = getActivity();
+ RelativeLayoutCtsActivity activity = getActivity();
// test attributes used in RelativeLayout.
RelativeLayout relativeLayout = (RelativeLayout) activity.findViewById(
@@ -160,7 +160,7 @@
// Test RelativeLayout.Params which generated from the xml file.
int rules[];
- RelativeLayoutStubActivity activity = getActivity();
+ RelativeLayoutCtsActivity activity = getActivity();
// test attributes used in RelativeLayout.
RelativeLayout relativeLayout = (RelativeLayout) activity.findViewById(
diff --git a/tests/tests/widget/src/android/widget/cts/RemoteViewsActivityTest.java b/tests/tests/widget/src/android/widget/cts/RemoteViewsActivityTest.java
index b3c0915..a03edce 100644
--- a/tests/tests/widget/src/android/widget/cts/RemoteViewsActivityTest.java
+++ b/tests/tests/widget/src/android/widget/cts/RemoteViewsActivityTest.java
@@ -23,18 +23,17 @@
import android.view.InflateException;
import android.view.View;
import android.view.ViewGroup;
-import android.webkit.cts.NullWebViewUtils;
import android.widget.RemoteViews;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
public class RemoteViewsActivityTest
- extends ActivityInstrumentationTestCase2<RemoteViewsStubActivity> {
- private static final String PACKAGE_NAME = "com.android.cts.stub";
+ extends ActivityInstrumentationTestCase2<RemoteViewsCtsActivity> {
+ private static final String PACKAGE_NAME = "com.android.cts.widget";
private Activity mActivity;
public RemoteViewsActivityTest() {
- super(PACKAGE_NAME, RemoteViewsStubActivity.class);
+ super(PACKAGE_NAME, RemoteViewsCtsActivity.class);
}
@Override
diff --git a/tests/src/android/widget/cts/RemoteViewsStubActivity.java b/tests/tests/widget/src/android/widget/cts/RemoteViewsCtsActivity.java
similarity index 88%
rename from tests/src/android/widget/cts/RemoteViewsStubActivity.java
rename to tests/tests/widget/src/android/widget/cts/RemoteViewsCtsActivity.java
index f16ae13..6826eb3 100644
--- a/tests/src/android/widget/cts/RemoteViewsStubActivity.java
+++ b/tests/tests/widget/src/android/widget/cts/RemoteViewsCtsActivity.java
@@ -16,17 +16,16 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.app.Activity;
import android.os.Bundle;
-import android.webkit.cts.NullWebViewUtils;
import android.widget.RemoteViews;
/**
* Stub activity for testing {@link RemoteViews}
*/
-public class RemoteViewsStubActivity extends Activity {
+public class RemoteViewsCtsActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
try {
diff --git a/tests/tests/widget/src/android/widget/cts/RemoteViewsTest.java b/tests/tests/widget/src/android/widget/cts/RemoteViewsTest.java
index 891bdf7..8d1cddf 100644
--- a/tests/tests/widget/src/android/widget/cts/RemoteViewsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/RemoteViewsTest.java
@@ -16,7 +16,8 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import android.test.UiThreadTest;
+import com.android.cts.widget.R;
import android.app.Activity;
@@ -31,7 +32,6 @@
import android.net.Uri;
import android.os.Parcel;
import android.test.ActivityInstrumentationTestCase2;
-import android.text.style.cts.MockURLSpanTestActivity;
import android.view.View;
import android.widget.AbsoluteLayout;
import android.widget.Chronometer;
@@ -56,8 +56,8 @@
/**
* Test {@link RemoteViews}.
*/
-public class RemoteViewsTest extends ActivityInstrumentationTestCase2<RemoteViewsStubActivity> {
- private static final String PACKAGE_NAME = "com.android.cts.stub";
+public class RemoteViewsTest extends ActivityInstrumentationTestCase2<RemoteViewsCtsActivity> {
+ private static final String PACKAGE_NAME = "com.android.cts.widget";
private static final int INVALD_ID = -1;
@@ -70,15 +70,20 @@
private Activity mActivity;
public RemoteViewsTest() {
- super(PACKAGE_NAME, RemoteViewsStubActivity.class);
+ super(PACKAGE_NAME, RemoteViewsCtsActivity.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
mActivity = getActivity();
- mRemoteViews = new RemoteViews(PACKAGE_NAME, R.layout.remoteviews_good);
- mResult = mRemoteViews.apply(mActivity, null);
+ getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ mRemoteViews = new RemoteViews(PACKAGE_NAME, R.layout.remoteviews_good);
+ mResult = mRemoteViews.apply(mActivity, null);
+ }
+ });
}
public void testConstructor() {
@@ -308,6 +313,7 @@
mRemoteViews.describeContents();
}
+ @UiThreadTest
public void testWriteToParcel() {
mRemoteViews.setTextViewText(R.id.remoteView_text, "This is content");
mRemoteViews.setViewVisibility(R.id.remoteView_frame, View.GONE);
diff --git a/tests/tests/widget/src/android/widget/cts/ResourceCursorAdapterTest.java b/tests/tests/widget/src/android/widget/cts/ResourceCursorAdapterTest.java
index d91094c..28bfd06 100644
--- a/tests/tests/widget/src/android/widget/cts/ResourceCursorAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ResourceCursorAdapterTest.java
@@ -16,13 +16,14 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.content.Context;
import android.database.Cursor;
import android.database.MatrixCursor;
import android.test.InstrumentationTestCase;
+import android.test.UiThreadTest;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -51,6 +52,7 @@
mCursor = createTestCursor(3, 3);
}
+ @UiThreadTest
public void testConstructor() {
MockResourceCursorAdapter adapter = new MockResourceCursorAdapter(mContext, -1, null);
// the default is true
@@ -68,6 +70,7 @@
assertSame(mCursor, adapter.getCursor());
}
+ @UiThreadTest
public void testSetViewResource() {
mResourceCursorAdapter = new MockResourceCursorAdapter(mContext,
R.layout.cursoradapter_item0, mCursor);
@@ -83,6 +86,7 @@
assertEquals(R.id.cursorAdapter_item1, result.getId());
}
+ @UiThreadTest
public void testSetDropDownViewResource() {
mResourceCursorAdapter = new MockResourceCursorAdapter(mContext,
R.layout.cursoradapter_item0, mCursor);
@@ -107,6 +111,7 @@
}
// parameters Context and Cursor are never readin the method
+ @UiThreadTest
public void testNewDropDownView() {
mResourceCursorAdapter = new MockResourceCursorAdapter(mContext,
R.layout.cursoradapter_item0, mCursor);
@@ -122,6 +127,7 @@
}
// The parameters Context and Cursor are never read in the method
+ @UiThreadTest
public void testNewView() {
mResourceCursorAdapter = new MockResourceCursorAdapter(mContext,
R.layout.cursoradapter_item0, mCursor);
diff --git a/tests/tests/widget/src/android/widget/cts/ResourceCursorTreeAdapterTest.java b/tests/tests/widget/src/android/widget/cts/ResourceCursorTreeAdapterTest.java
index 4a5a9c9..760f7e4 100644
--- a/tests/tests/widget/src/android/widget/cts/ResourceCursorTreeAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ResourceCursorTreeAdapterTest.java
@@ -16,13 +16,14 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.content.Context;
import android.database.Cursor;
import android.database.MatrixCursor;
import android.test.InstrumentationTestCase;
+import android.test.UiThreadTest;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -71,6 +72,7 @@
mParent = (ViewGroup) layoutInflater.inflate(R.layout.cursoradapter_host, null);
}
+ @UiThreadTest
public void testConstructor() {
mResourceCursorTreeAdapter = new MockResourceCursorTreeAdapter(mContext, null,
mGroupLayout, mChildLayout);
@@ -95,6 +97,7 @@
}
// The parameters Context and Cursor are never readin the method
+ @UiThreadTest
public void testNewChildView() {
mResourceCursorTreeAdapter = new MockResourceCursorTreeAdapter(mContext, null,
mGroupLayout, mChildLayout);
@@ -116,6 +119,7 @@
}
// The parameters Context and Cursor are never readin the method
+ @UiThreadTest
public void testNewGroupView() {
mResourceCursorTreeAdapter = new MockResourceCursorTreeAdapter(mContext, null,
mGroupLayout, mChildLayout);
diff --git a/tests/src/android/widget/cts/ScrollViewStubActivity.java b/tests/tests/widget/src/android/widget/cts/ScrollViewCtsActivity.java
similarity index 90%
rename from tests/src/android/widget/cts/ScrollViewStubActivity.java
rename to tests/tests/widget/src/android/widget/cts/ScrollViewCtsActivity.java
index 4daeb9f..8965610 100644
--- a/tests/src/android/widget/cts/ScrollViewStubActivity.java
+++ b/tests/tests/widget/src/android/widget/cts/ScrollViewCtsActivity.java
@@ -16,12 +16,12 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.app.Activity;
import android.os.Bundle;
-public class ScrollViewStubActivity extends Activity {
+public class ScrollViewCtsActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
diff --git a/tests/tests/widget/src/android/widget/cts/ScrollViewTest.java b/tests/tests/widget/src/android/widget/cts/ScrollViewTest.java
index e297744..a8fb224 100644
--- a/tests/tests/widget/src/android/widget/cts/ScrollViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ScrollViewTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import org.xmlpull.v1.XmlPullParser;
@@ -41,7 +41,7 @@
/**
* Test {@link ScrollView}.
*/
-public class ScrollViewTest extends ActivityInstrumentationTestCase2<ScrollViewStubActivity> {
+public class ScrollViewTest extends ActivityInstrumentationTestCase2<ScrollViewCtsActivity> {
// view dpi constants. Must match those defined in scroll_view layout
private static final int ITEM_WIDTH_DPI = 250;
private static final int ITEM_HEIGHT_DPI = 100;
@@ -61,7 +61,7 @@
private Activity mActivity;
public ScrollViewTest() {
- super("com.android.cts.stub", ScrollViewStubActivity.class);
+ super("com.android.cts.widget", ScrollViewCtsActivity.class);
}
@Override
diff --git a/tests/src/android/widget/cts/SeekBarStubActivity.java b/tests/tests/widget/src/android/widget/cts/SeekBarCtsActivity.java
similarity index 93%
rename from tests/src/android/widget/cts/SeekBarStubActivity.java
rename to tests/tests/widget/src/android/widget/cts/SeekBarCtsActivity.java
index 81d3d41..e7842c2 100644
--- a/tests/src/android/widget/cts/SeekBarStubActivity.java
+++ b/tests/tests/widget/src/android/widget/cts/SeekBarCtsActivity.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.app.Activity;
import android.os.Bundle;
@@ -26,7 +26,7 @@
/**
* Stub activity for testing {@link SeekBar}
*/
-public class SeekBarStubActivity extends Activity {
+public class SeekBarCtsActivity extends Activity {
/**
* Called with the activity is first created.
*/
diff --git a/tests/tests/widget/src/android/widget/cts/SeekBarTest.java b/tests/tests/widget/src/android/widget/cts/SeekBarTest.java
index 266583f..54bbedf 100644
--- a/tests/tests/widget/src/android/widget/cts/SeekBarTest.java
+++ b/tests/tests/widget/src/android/widget/cts/SeekBarTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.app.Activity;
@@ -30,7 +30,7 @@
/**
* Test {@link SeekBar}.
*/
-public class SeekBarTest extends ActivityInstrumentationTestCase2<SeekBarStubActivity> {
+public class SeekBarTest extends ActivityInstrumentationTestCase2<SeekBarCtsActivity> {
private SeekBar mSeekBar;
private Activity mActivity;
@@ -38,7 +38,7 @@
private Instrumentation mInstrumentation;
public SeekBarTest() {
- super("com.android.cts.stub", SeekBarStubActivity.class);
+ super("com.android.cts.widget", SeekBarCtsActivity.class);
}
@Override
diff --git a/tests/tests/widget/src/android/widget/cts/SimpleAdapterTest.java b/tests/tests/widget/src/android/widget/cts/SimpleAdapterTest.java
index 8b35a2f..90ff617 100644
--- a/tests/tests/widget/src/android/widget/cts/SimpleAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/SimpleAdapterTest.java
@@ -23,6 +23,7 @@
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.test.InstrumentationTestCase;
+import android.test.UiThreadTest;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
@@ -89,7 +90,7 @@
mContext = getInstrumentation().getTargetContext();
mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mAdapterHost = (LinearLayout) mInflater.inflate(
- com.android.cts.stub.R.layout.cursoradapter_host, null);
+ com.android.cts.widget.R.layout.cursoradapter_host, null);
// new the SimpleAdapter instance
mSimpleAdapter = new SimpleAdapter(mContext,
@@ -280,9 +281,9 @@
// String represents resId
ImageView view = new ImageView(mContext);
assertNull(view.getDrawable());
- mSimpleAdapter.setViewImage(view, String.valueOf(com.android.cts.stub.R.drawable.scenery));
+ mSimpleAdapter.setViewImage(view, String.valueOf(com.android.cts.widget.R.drawable.scenery));
BitmapDrawable d = (BitmapDrawable) mContext.getResources().getDrawable(
- com.android.cts.stub.R.drawable.scenery);
+ com.android.cts.widget.R.drawable.scenery);
WidgetTestUtils.assertEquals(d.getBitmap(),
((BitmapDrawable) view.getDrawable()).getBitmap());
@@ -305,9 +306,9 @@
// resId
view = new ImageView(mContext);
assertNull(view.getDrawable());
- mSimpleAdapter.setViewImage(view, com.android.cts.stub.R.drawable.scenery);
+ mSimpleAdapter.setViewImage(view, com.android.cts.widget.R.drawable.scenery);
d = (BitmapDrawable) mContext.getResources()
- .getDrawable(com.android.cts.stub.R.drawable.scenery);
+ .getDrawable(com.android.cts.widget.R.drawable.scenery);
WidgetTestUtils.assertEquals(d.getBitmap(),
((BitmapDrawable) view.getDrawable()).getBitmap());
@@ -322,11 +323,11 @@
assertNull(view.getDrawable());
try {
mSimpleAdapter.setViewImage(view, SimpleCursorAdapterTest.createTestImage(mContext,
- "testimage", com.android.cts.stub.R.raw.testimage));
+ "testimage", com.android.cts.widget.R.raw.testimage));
assertNotNull(view.getDrawable());
Bitmap actualBitmap = ((BitmapDrawable) view.getDrawable()).getBitmap();
Bitmap testBitmap = WidgetTestUtils.getUnscaledAndDitheredBitmap(mContext.getResources(),
- com.android.cts.stub.R.raw.testimage, actualBitmap.getConfig());
+ com.android.cts.widget.R.raw.testimage, actualBitmap.getConfig());
WidgetTestUtils.assertEquals(testBitmap, actualBitmap);
} finally {
SimpleCursorAdapterTest.destroyTestImage(mContext,"testimage");
@@ -342,6 +343,7 @@
assertEquals("", view.getText().toString());
}
+ @UiThreadTest
public void testGetFilter() {
assertNotNull(mSimpleAdapter.getFilter());
}
diff --git a/tests/tests/widget/src/android/widget/cts/SimpleCursorAdapterTest.java b/tests/tests/widget/src/android/widget/cts/SimpleCursorAdapterTest.java
index 59660e0..f19dce7 100644
--- a/tests/tests/widget/src/android/widget/cts/SimpleCursorAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/SimpleCursorAdapterTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.content.Context;
@@ -25,6 +25,7 @@
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.test.InstrumentationTestCase;
+import android.test.UiThreadTest;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -41,6 +42,9 @@
/**
* Test {@link SimpleCursorAdapter}.
+ * The simple cursor adapter's cursor will be set to
+ * {@link SimpleCursorAdapterTest#mCursor} It will use internal
+ * R.layout.simple_list_item_1.
*/
public class SimpleCursorAdapterTest extends InstrumentationTestCase {
private static final int ADAPTER_ROW_COUNT = 20;
@@ -53,13 +57,6 @@
private static final String SAMPLE_IMAGE_NAME = "testimage.jpg";
- /**
- * The simple cursor adapter. Its cursor will be set to
- * {@link SimpleCursorAdapterTest#mCursor} It will use internal
- * R.layout.simple_list_item_1.
- */
- private SimpleCursorAdapter mSimpleCursorAdapter;
-
private Context mContext;
/**
@@ -96,89 +93,101 @@
mContext = getInstrumentation().getTargetContext();
mCursor = createTestCursor(DEFAULT_COLUMN_COUNT, ADAPTER_ROW_COUNT);
- mSimpleCursorAdapter = new SimpleCursorAdapter(mContext, R.layout.cursoradapter_item0,
- mCursor, COLUMNS_FROM, VIEWS_TO);
}
+ private SimpleCursorAdapter makeSimpleCursorAdapter() {
+ return new SimpleCursorAdapter(
+ mContext, R.layout.cursoradapter_item0, mCursor, COLUMNS_FROM, VIEWS_TO);
+ }
+
+ @UiThreadTest
public void testConstructor() {
new SimpleCursorAdapter(mContext, R.layout.cursoradapter_item0,
createTestCursor(DEFAULT_COLUMN_COUNT, ADAPTER_ROW_COUNT),
COLUMNS_FROM, VIEWS_TO);
}
+ @UiThreadTest
public void testBindView() {
- TextView listItem = (TextView) mSimpleCursorAdapter.newView(mContext, null, null);
+ SimpleCursorAdapter simpleCursorAdapter = makeSimpleCursorAdapter();
+ TextView listItem = (TextView) simpleCursorAdapter.newView(mContext, null, null);
listItem.setText("");
mCursor.moveToFirst();
- mSimpleCursorAdapter.bindView(listItem, null, mCursor);
+ simpleCursorAdapter.bindView(listItem, null, mCursor);
assertEquals("01", listItem.getText().toString());
mCursor.moveToLast();
- mSimpleCursorAdapter.bindView(listItem, null, mCursor);
+ simpleCursorAdapter.bindView(listItem, null, mCursor);
assertEquals("191", listItem.getText().toString());
// the binder take care of binding
listItem.setText("");
MockViewBinder binder = new MockViewBinder(true);
- mSimpleCursorAdapter.setViewBinder(binder);
+ simpleCursorAdapter.setViewBinder(binder);
binder.reset();
mCursor.moveToFirst();
- mSimpleCursorAdapter.bindView(listItem, null, mCursor);
+ simpleCursorAdapter.bindView(listItem, null, mCursor);
assertTrue(binder.hasCalledSetViewValueCalledCount());
assertEquals("", listItem.getText().toString());
// the binder try to bind but fail
binder = new MockViewBinder(false);
- mSimpleCursorAdapter.setViewBinder(binder);
+ simpleCursorAdapter.setViewBinder(binder);
mCursor.moveToLast();
- mSimpleCursorAdapter.bindView(listItem, null, mCursor);
+ simpleCursorAdapter.bindView(listItem, null, mCursor);
assertTrue(binder.hasCalledSetViewValueCalledCount());
assertEquals("191", listItem.getText().toString());
final int [] to = { R.id.cursorAdapter_host };
- mSimpleCursorAdapter = new SimpleCursorAdapter(mContext, R.layout.cursoradapter_host,
+ simpleCursorAdapter = new SimpleCursorAdapter(mContext, R.layout.cursoradapter_host,
mCursor, COLUMNS_FROM, to);
- LinearLayout illegalView = (LinearLayout)mSimpleCursorAdapter.newView(mContext, null, null);
+ LinearLayout illegalView = (LinearLayout)simpleCursorAdapter.newView(mContext, null, null);
try {
// The IllegalStateException already gets thrown in the line above.
- mSimpleCursorAdapter.bindView(illegalView, null, mCursor);
+ simpleCursorAdapter.bindView(illegalView, null, mCursor);
fail("Should throw IllegalStateException if the view is not TextView or ImageView");
} catch (IllegalStateException e) {
// expected
}
}
+ @UiThreadTest
public void testAccessViewBinder() {
- assertNull(mSimpleCursorAdapter.getViewBinder());
+ SimpleCursorAdapter simpleCursorAdapter = makeSimpleCursorAdapter();
+ assertNull(simpleCursorAdapter.getViewBinder());
MockViewBinder binder = new MockViewBinder(true);
- mSimpleCursorAdapter.setViewBinder(binder);
- assertSame(binder, mSimpleCursorAdapter.getViewBinder());
+ simpleCursorAdapter.setViewBinder(binder);
+ assertSame(binder, simpleCursorAdapter.getViewBinder());
binder = new MockViewBinder(false);
- mSimpleCursorAdapter.setViewBinder(binder);
- assertSame(binder, mSimpleCursorAdapter.getViewBinder());
+ simpleCursorAdapter.setViewBinder(binder);
+ assertSame(binder, simpleCursorAdapter.getViewBinder());
- mSimpleCursorAdapter.setViewBinder(null);
- assertNull(mSimpleCursorAdapter.getViewBinder());
+ simpleCursorAdapter.setViewBinder(null);
+ assertNull(simpleCursorAdapter.getViewBinder());
}
+ @UiThreadTest
public void testSetViewText() {
+ SimpleCursorAdapter simpleCursorAdapter = makeSimpleCursorAdapter();
TextView view = new TextView(mContext);
- mSimpleCursorAdapter.setViewText(view, "expected");
+ simpleCursorAdapter.setViewText(view, "expected");
assertEquals("expected", view.getText().toString());
- mSimpleCursorAdapter.setViewText(view, null);
+ simpleCursorAdapter.setViewText(view, null);
assertEquals("", view.getText().toString());
}
+ @UiThreadTest
public void testSetViewImage() {
+ SimpleCursorAdapter simpleCursorAdapter = makeSimpleCursorAdapter();
// resId
- int sceneryImgResId = com.android.cts.stub.R.drawable.scenery;
+ int sceneryImgResId = com.android.cts.widget.R.drawable.scenery;
ImageView view = new ImageView(mContext);
assertNull(view.getDrawable());
- mSimpleCursorAdapter.setViewImage(view, String.valueOf(sceneryImgResId));
+ simpleCursorAdapter.setViewImage(view, String.valueOf(sceneryImgResId));
assertNotNull(view.getDrawable());
BitmapDrawable d = (BitmapDrawable) mContext.getResources().getDrawable(
sceneryImgResId);
@@ -188,7 +197,7 @@
// blank
view = new ImageView(mContext);
assertNull(view.getDrawable());
- mSimpleCursorAdapter.setViewImage(view, "");
+ simpleCursorAdapter.setViewImage(view, "");
assertNull(view.getDrawable());
// null
@@ -196,7 +205,7 @@
assertNull(view.getDrawable());
try {
// Should declare NullPoinertException if the uri or value is null
- mSimpleCursorAdapter.setViewImage(view, null);
+ simpleCursorAdapter.setViewImage(view, null);
fail("Should throw NullPointerException if the uri or value is null");
} catch (NullPointerException e) {
// expected
@@ -206,8 +215,8 @@
view = new ImageView(mContext);
assertNull(view.getDrawable());
try {
- int testimgRawId = com.android.cts.stub.R.raw.testimage;
- mSimpleCursorAdapter.setViewImage(view,
+ int testimgRawId = com.android.cts.widget.R.raw.testimage;
+ simpleCursorAdapter.setViewImage(view,
createTestImage(mContext, SAMPLE_IMAGE_NAME, testimgRawId));
assertNotNull(view.getDrawable());
Bitmap actualBitmap = ((BitmapDrawable) view.getDrawable()).getBitmap();
@@ -219,44 +228,50 @@
}
}
+ @UiThreadTest
public void testAccessStringConversionColumn() {
+ SimpleCursorAdapter simpleCursorAdapter = makeSimpleCursorAdapter();
// default is -1
- assertEquals(-1, mSimpleCursorAdapter.getStringConversionColumn());
+ assertEquals(-1, simpleCursorAdapter.getStringConversionColumn());
- mSimpleCursorAdapter.setStringConversionColumn(1);
- assertEquals(1, mSimpleCursorAdapter.getStringConversionColumn());
+ simpleCursorAdapter.setStringConversionColumn(1);
+ assertEquals(1, simpleCursorAdapter.getStringConversionColumn());
// Should check whether the column index is out of bounds
- mSimpleCursorAdapter.setStringConversionColumn(Integer.MAX_VALUE);
- assertEquals(Integer.MAX_VALUE, mSimpleCursorAdapter.getStringConversionColumn());
+ simpleCursorAdapter.setStringConversionColumn(Integer.MAX_VALUE);
+ assertEquals(Integer.MAX_VALUE, simpleCursorAdapter.getStringConversionColumn());
// Should check whether the column index is out of bounds
- mSimpleCursorAdapter.setStringConversionColumn(Integer.MIN_VALUE);
- assertEquals(Integer.MIN_VALUE, mSimpleCursorAdapter.getStringConversionColumn());
+ simpleCursorAdapter.setStringConversionColumn(Integer.MIN_VALUE);
+ assertEquals(Integer.MIN_VALUE, simpleCursorAdapter.getStringConversionColumn());
}
+ @UiThreadTest
public void testAccessCursorToStringConverter() {
+ SimpleCursorAdapter simpleCursorAdapter = makeSimpleCursorAdapter();
// default is null
- assertNull(mSimpleCursorAdapter.getCursorToStringConverter());
+ assertNull(simpleCursorAdapter.getCursorToStringConverter());
CursorToStringConverter converter = new MockCursorToStringConverter();
- mSimpleCursorAdapter.setCursorToStringConverter(converter);
- assertSame(converter, mSimpleCursorAdapter.getCursorToStringConverter());
+ simpleCursorAdapter.setCursorToStringConverter(converter);
+ assertSame(converter, simpleCursorAdapter.getCursorToStringConverter());
- mSimpleCursorAdapter.setCursorToStringConverter(null);
- assertNull(mSimpleCursorAdapter.getCursorToStringConverter());
+ simpleCursorAdapter.setCursorToStringConverter(null);
+ assertNull(simpleCursorAdapter.getCursorToStringConverter());
}
+ @UiThreadTest
public void testChangeCursor() {
+ SimpleCursorAdapter simpleCursorAdapter = makeSimpleCursorAdapter();
// have "column1"
Cursor curWith3Columns = createTestCursor(3, ADAPTER_ROW_COUNT);
- mSimpleCursorAdapter.changeCursor(curWith3Columns);
- assertSame(curWith3Columns, mSimpleCursorAdapter.getCursor());
+ simpleCursorAdapter.changeCursor(curWith3Columns);
+ assertSame(curWith3Columns, simpleCursorAdapter.getCursor());
// does not have "column1"
Cursor curWith1Column = createTestCursor(1, ADAPTER_ROW_COUNT);
try {
- mSimpleCursorAdapter.changeCursor(curWith1Column);
+ simpleCursorAdapter.changeCursor(curWith1Column);
fail("Should throw exception if the cursor does not have the "
+ "original column passed in the constructor");
} catch (IllegalArgumentException e) {
@@ -264,23 +279,25 @@
}
}
+ @UiThreadTest
public void testConvertToString() {
+ SimpleCursorAdapter simpleCursorAdapter = makeSimpleCursorAdapter();
mCursor.moveToFirst();
- assertEquals("", mSimpleCursorAdapter.convertToString(null));
+ assertEquals("", simpleCursorAdapter.convertToString(null));
// converter is null, StringConversionColumn is set to negative
- mSimpleCursorAdapter.setStringConversionColumn(Integer.MIN_VALUE);
- assertEquals(mCursor.toString(), mSimpleCursorAdapter.convertToString(mCursor));
+ simpleCursorAdapter.setStringConversionColumn(Integer.MIN_VALUE);
+ assertEquals(mCursor.toString(), simpleCursorAdapter.convertToString(mCursor));
// converter is null, StringConversionColumn is set to 1
- mSimpleCursorAdapter.setStringConversionColumn(1);
- assertEquals("01", mSimpleCursorAdapter.convertToString(mCursor));
+ simpleCursorAdapter.setStringConversionColumn(1);
+ assertEquals("01", simpleCursorAdapter.convertToString(mCursor));
// converter is null, StringConversionColumn is set to 3 (larger than columns count)
// the cursor has 3 columns including column0, column1 and _id which is added automatically
- mSimpleCursorAdapter.setStringConversionColumn(DEFAULT_COLUMN_COUNT + 1);
+ simpleCursorAdapter.setStringConversionColumn(DEFAULT_COLUMN_COUNT + 1);
try {
- mSimpleCursorAdapter.convertToString(mCursor);
+ simpleCursorAdapter.convertToString(mCursor);
fail("Should throw IndexOutOfBoundsException if index is beyond the columns count");
} catch (IndexOutOfBoundsException e) {
// expected
@@ -291,69 +308,75 @@
// converter is null, StringConversionColumn is set to 3
// and covert with a cursor which has 4 columns
- mSimpleCursorAdapter.setStringConversionColumn(2);
- assertEquals("02", mSimpleCursorAdapter.convertToString(curWith3Columns));
+ simpleCursorAdapter.setStringConversionColumn(2);
+ assertEquals("02", simpleCursorAdapter.convertToString(curWith3Columns));
// converter is not null, StringConversionColumn is 1
CursorToStringConverter converter = new MockCursorToStringConverter();
- mSimpleCursorAdapter.setCursorToStringConverter(converter);
- mSimpleCursorAdapter.setStringConversionColumn(1);
+ simpleCursorAdapter.setCursorToStringConverter(converter);
+ simpleCursorAdapter.setStringConversionColumn(1);
((MockCursorToStringConverter) converter).reset();
- mSimpleCursorAdapter.convertToString(curWith3Columns);
+ simpleCursorAdapter.convertToString(curWith3Columns);
assertTrue(((MockCursorToStringConverter) converter).hasCalledConvertToString());
}
+ @UiThreadTest
public void testNewView() {
+ SimpleCursorAdapter simpleCursorAdapter = makeSimpleCursorAdapter();
LayoutInflater layoutInflater = (LayoutInflater) mContext.getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
ViewGroup viewGroup = (ViewGroup) layoutInflater.inflate(
- com.android.cts.stub.R.layout.cursoradapter_host, null);
- View result = mSimpleCursorAdapter.newView(mContext, null, viewGroup);
+ com.android.cts.widget.R.layout.cursoradapter_host, null);
+ View result = simpleCursorAdapter.newView(mContext, null, viewGroup);
assertNotNull(result);
assertEquals(R.id.cursorAdapter_item0, result.getId());
- result = mSimpleCursorAdapter.newView(mContext, null, null);
+ result = simpleCursorAdapter.newView(mContext, null, null);
assertNotNull(result);
assertEquals(R.id.cursorAdapter_item0, result.getId());
}
+ @UiThreadTest
public void testNewDropDownView() {
+ SimpleCursorAdapter simpleCursorAdapter = makeSimpleCursorAdapter();
LayoutInflater layoutInflater = (LayoutInflater) mContext.getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
ViewGroup viewGroup = (ViewGroup) layoutInflater.inflate(
- com.android.cts.stub.R.layout.cursoradapter_host, null);
- View result = mSimpleCursorAdapter.newDropDownView(null, null, viewGroup);
+ com.android.cts.widget.R.layout.cursoradapter_host, null);
+ View result = simpleCursorAdapter.newDropDownView(null, null, viewGroup);
assertNotNull(result);
assertEquals(R.id.cursorAdapter_item0, result.getId());
}
+ @UiThreadTest
public void testChangeCursorAndColumns() {
- assertSame(mCursor, mSimpleCursorAdapter.getCursor());
+ SimpleCursorAdapter simpleCursorAdapter = makeSimpleCursorAdapter();
+ assertSame(mCursor, simpleCursorAdapter.getCursor());
- TextView listItem = (TextView) mSimpleCursorAdapter.newView(mContext, null, null);
+ TextView listItem = (TextView) simpleCursorAdapter.newView(mContext, null, null);
mCursor.moveToFirst();
- mSimpleCursorAdapter.bindView(listItem, null, mCursor);
+ simpleCursorAdapter.bindView(listItem, null, mCursor);
assertEquals("01", listItem.getText().toString());
mCursor.moveToLast();
- mSimpleCursorAdapter.bindView(listItem, null, mCursor);
+ simpleCursorAdapter.bindView(listItem, null, mCursor);
assertEquals("191", listItem.getText().toString());
Cursor newCursor = createTestCursor(3, ADAPTER_ROW_COUNT);
final String[] from = new String[] { "column2" };
- mSimpleCursorAdapter.changeCursorAndColumns(newCursor, from, VIEWS_TO);
- assertSame(newCursor, mSimpleCursorAdapter.getCursor());
+ simpleCursorAdapter.changeCursorAndColumns(newCursor, from, VIEWS_TO);
+ assertSame(newCursor, simpleCursorAdapter.getCursor());
newCursor.moveToFirst();
- mSimpleCursorAdapter.bindView(listItem, null, newCursor);
+ simpleCursorAdapter.bindView(listItem, null, newCursor);
assertEquals("02", listItem.getText().toString());
newCursor.moveToLast();
- mSimpleCursorAdapter.bindView(listItem, null, newCursor);
+ simpleCursorAdapter.bindView(listItem, null, newCursor);
assertEquals("192", listItem.getText().toString());
- mSimpleCursorAdapter.changeCursorAndColumns(null, null, null);
- assertNull(mSimpleCursorAdapter.getCursor());
+ simpleCursorAdapter.changeCursorAndColumns(null, null, null);
+ assertNull(simpleCursorAdapter.getCursor());
}
/**
diff --git a/tests/tests/widget/src/android/widget/cts/SimpleCursorTreeAdapterTest.java b/tests/tests/widget/src/android/widget/cts/SimpleCursorTreeAdapterTest.java
index bf9e358..0db5322 100644
--- a/tests/tests/widget/src/android/widget/cts/SimpleCursorTreeAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/SimpleCursorTreeAdapterTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.content.Context;
@@ -25,6 +25,7 @@
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.test.InstrumentationTestCase;
+import android.test.UiThreadTest;
import android.view.View;
import android.widget.ImageView;
import android.widget.SimpleCursorTreeAdapter;
@@ -70,6 +71,7 @@
mContext = getInstrumentation().getTargetContext();
}
+ @UiThreadTest
public void testConstructor() {
mGroupCursor = createTestCursor(2, 20, "group");
new MockSimpleCursorTreeAdapter(mContext, mGroupCursor,
@@ -85,6 +87,7 @@
CHILD_LAYOUT, CHILD_LAYOUT, COLUMNS_CHILD_FROM, VIEWS_CHILD_TO);
}
+ @UiThreadTest
public void testBindChildView() {
mGroupCursor = createTestCursor(2, 20, "group");
mChildCursor = createTestCursor(3, 4, "child");
@@ -104,6 +107,7 @@
}
// The param context and isExpanded is never readed.
+ @UiThreadTest
public void testBindGroupView() {
mGroupCursor = createTestCursor(2, 20, "group");
mGroupCursor.moveToFirst();
@@ -120,6 +124,7 @@
assertEquals("group11", view.getText().toString());
}
+ @UiThreadTest
public void testSetViewImage() {
mGroupCursor = createTestCursor(2, 20, "group");
mSimpleCursorTreeAdapter = new MockSimpleCursorTreeAdapter(mContext, mGroupCursor,
@@ -130,9 +135,9 @@
ImageView view = new ImageView(mContext);
assertNull(view.getDrawable());
mSimpleCursorTreeAdapter.setViewImage(view,
- String.valueOf(com.android.cts.stub.R.drawable.scenery));
+ String.valueOf(com.android.cts.widget.R.drawable.scenery));
BitmapDrawable d = (BitmapDrawable) mContext.getResources().getDrawable(
- com.android.cts.stub.R.drawable.scenery);
+ com.android.cts.widget.R.drawable.scenery);
WidgetTestUtils.assertEquals(d.getBitmap(),
((BitmapDrawable) view.getDrawable()).getBitmap());
@@ -158,10 +163,10 @@
try {
mSimpleCursorTreeAdapter.setViewImage(view,
SimpleCursorAdapterTest.createTestImage(mContext, SAMPLE_IMAGE_NAME,
- com.android.cts.stub.R.raw.testimage));
+ com.android.cts.widget.R.raw.testimage));
Bitmap actualBitmap = ((BitmapDrawable) view.getDrawable()).getBitmap();
Bitmap test = WidgetTestUtils.getUnscaledAndDitheredBitmap(mContext.getResources(),
- com.android.cts.stub.R.raw.testimage, actualBitmap.getConfig());
+ com.android.cts.widget.R.raw.testimage, actualBitmap.getConfig());
WidgetTestUtils.assertEquals(test, actualBitmap);
} finally {
SimpleCursorAdapterTest.destroyTestImage(mContext, SAMPLE_IMAGE_NAME);
diff --git a/tests/tests/widget/src/android/widget/cts/SimpleExpandableListAdapterTest.java b/tests/tests/widget/src/android/widget/cts/SimpleExpandableListAdapterTest.java
index 7c4fe23..a7bfc31 100644
--- a/tests/tests/widget/src/android/widget/cts/SimpleExpandableListAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/SimpleExpandableListAdapterTest.java
@@ -98,7 +98,7 @@
mAdapterHost = (LinearLayout) ((LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(
- com.android.cts.stub.R.layout.cursoradapter_host, null);
+ com.android.cts.widget.R.layout.cursoradapter_host, null);
}
public void testConstructor() {
diff --git a/tests/src/android/widget/cts/SlidingDrawerStubActivity.java b/tests/tests/widget/src/android/widget/cts/SlidingDrawerCtsActivity.java
similarity index 90%
rename from tests/src/android/widget/cts/SlidingDrawerStubActivity.java
rename to tests/tests/widget/src/android/widget/cts/SlidingDrawerCtsActivity.java
index d19b9b1..8b55e63 100644
--- a/tests/src/android/widget/cts/SlidingDrawerStubActivity.java
+++ b/tests/tests/widget/src/android/widget/cts/SlidingDrawerCtsActivity.java
@@ -16,12 +16,12 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.app.Activity;
import android.os.Bundle;
-public class SlidingDrawerStubActivity extends Activity {
+public class SlidingDrawerCtsActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
diff --git a/tests/tests/widget/src/android/widget/cts/SlidingDrawerTest.java b/tests/tests/widget/src/android/widget/cts/SlidingDrawerTest.java
index 60666ae..862fccf 100644
--- a/tests/tests/widget/src/android/widget/cts/SlidingDrawerTest.java
+++ b/tests/tests/widget/src/android/widget/cts/SlidingDrawerTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import org.xmlpull.v1.XmlPullParser;
@@ -44,14 +44,14 @@
* Test {@link SlidingDrawer}.
*/
public class SlidingDrawerTest
- extends ActivityInstrumentationTestCase2<SlidingDrawerStubActivity> {
+ extends ActivityInstrumentationTestCase2<SlidingDrawerCtsActivity> {
private static final long TEST_TIMEOUT = 5000L;
private Activity mActivity;
private Object mLock;
public SlidingDrawerTest() {
- super("com.android.cts.stub", SlidingDrawerStubActivity.class);
+ super("com.android.cts.widget", SlidingDrawerCtsActivity.class);
}
@Override
@@ -61,6 +61,7 @@
mLock = new Object();
}
+ @UiThreadTest
public void testConstructor() throws XmlPullParserException, IOException {
XmlPullParser parser = mActivity.getResources().getLayout(R.layout.sliding_drawer_layout);
AttributeSet attrs = Xml.asAttributeSet(parser);
diff --git a/tests/tests/widget/src/android/widget/cts/SpinnerTest.java b/tests/tests/widget/src/android/widget/cts/SpinnerTest.java
index 8ffd90b..1989626 100644
--- a/tests/tests/widget/src/android/widget/cts/SpinnerTest.java
+++ b/tests/tests/widget/src/android/widget/cts/SpinnerTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.app.AlertDialog;
@@ -31,11 +31,11 @@
/**
* Test {@link Spinner}.
*/
-public class SpinnerTest extends ActivityInstrumentationTestCase2<RelativeLayoutStubActivity> {
+public class SpinnerTest extends ActivityInstrumentationTestCase2<RelativeLayoutCtsActivity> {
private Context mTargetContext;
public SpinnerTest() {
- super("com.android.cts.stub", RelativeLayoutStubActivity.class);
+ super("com.android.cts.widget", RelativeLayoutCtsActivity.class);
}
@Override
@@ -44,6 +44,7 @@
mTargetContext = getInstrumentation().getTargetContext();
}
+ @UiThreadTest
public void testConstructor() {
new Spinner(mTargetContext);
@@ -63,12 +64,13 @@
spinner = (Spinner) getActivity().findViewById(R.id.spinner1);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(mTargetContext,
- com.android.cts.stub.R.array.string, android.R.layout.simple_spinner_item);
+ com.android.cts.widget.R.array.string, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
assertTrue(spinner.getBaseline() > 0);
}
+ @UiThreadTest
public void testSetOnItemClickListener() {
Spinner spinner = new Spinner(mTargetContext);
@@ -89,6 +91,7 @@
// Or do UI check?
}
+ @UiThreadTest
public void testOnClick() {
Spinner spinner = new Spinner(mTargetContext);
// normal value
@@ -129,7 +132,8 @@
// TODO: find the dialog and get its title to assert whether setPrompt() takes effect?
}
- public void testsetPromptId() {
+ @UiThreadTest
+ public void testSetPromptId() {
Spinner spinner = new Spinner(mTargetContext);
spinner.setPromptId(R.string.hello_world);
diff --git a/tests/src/android/widget/cts/TabHostStubActivity.java b/tests/tests/widget/src/android/widget/cts/TabHostCtsActivity.java
similarity index 94%
rename from tests/src/android/widget/cts/TabHostStubActivity.java
rename to tests/tests/widget/src/android/widget/cts/TabHostCtsActivity.java
index 78e0894..9703dd7 100644
--- a/tests/src/android/widget/cts/TabHostStubActivity.java
+++ b/tests/tests/widget/src/android/widget/cts/TabHostCtsActivity.java
@@ -22,13 +22,13 @@
import android.widget.TabHost;
import android.widget.TextView;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
/**
* A minimal application for TabHost test.
* It contains an initial tab whose tag is INITIAL_TAB_TAG and label is INITIAL_TAB_LABEL.
*/
-public class TabHostStubActivity extends TabActivity {
+public class TabHostCtsActivity extends TabActivity {
public static final String INITIAL_TAB_TAG = "initial tag";
public static final String INITIAL_TAB_LABEL = "initial label";
public static final String INITIAL_VIEW_TEXT = "initial view text";
diff --git a/tests/tests/widget/src/android/widget/cts/TabHostTest.java b/tests/tests/widget/src/android/widget/cts/TabHostTest.java
index 07334ad..3af8d9c 100644
--- a/tests/tests/widget/src/android/widget/cts/TabHostTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TabHostTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.app.Activity;
@@ -34,15 +34,15 @@
/**
* Test {@link TabHost}.
*/
-public class TabHostTest extends ActivityInstrumentationTestCase2<TabHostStubActivity> {
+public class TabHostTest extends ActivityInstrumentationTestCase2<TabHostCtsActivity> {
private static final String TAG_TAB1 = "tab 1";
private static final String TAG_TAB2 = "tab 2";
private static final int TAB_HOST_ID = android.R.id.tabhost;
- private TabHostStubActivity mActivity;
+ private TabHostCtsActivity mActivity;
public TabHostTest() {
- super("com.android.cts.stub", TabHostStubActivity.class);
+ super("com.android.cts.widget", TabHostCtsActivity.class);
}
@Override
@@ -71,7 +71,7 @@
* 2. no exception occurs when doing normal operation after setup().
*/
public void testSetup1() throws Throwable {
- final Activity activity = launchActivity("com.android.cts.stub", StubActivity.class, null);
+ final Activity activity = launchActivity("com.android.cts.widget", CtsActivity.class, null);
runTestOnUiThread(new Runnable() {
public void run() {
@@ -102,7 +102,7 @@
* 2. no exception occurs when uses TabSpec.setContent(android.content.Intent) after setup().
*/
public void testSetup2() throws Throwable {
- final ActivityGroup activity = launchActivity("com.android.cts.stub",
+ final ActivityGroup activity = launchActivity("com.android.cts.widget",
ActivityGroup.class, null);
@@ -120,7 +120,7 @@
TabSpec tabSpec = tabHost.newTabSpec(TAG_TAB1);
tabSpec.setIndicator(TAG_TAB1);
Intent intent = new Intent(Intent.ACTION_VIEW, null,
- mActivity, StubActivity.class);
+ mActivity, CtsActivity.class);
tabSpec.setContent(intent);
tabHost.addTab(tabSpec);
tabHost.setCurrentTab(0);
@@ -249,7 +249,7 @@
public void testGetCurrentView() {
TabHost tabHost = mActivity.getTabHost();
TextView textView = (TextView) tabHost.getCurrentView();
- assertEquals(TabHostStubActivity.INITIAL_VIEW_TEXT, textView.getText().toString());
+ assertEquals(TabHostCtsActivity.INITIAL_VIEW_TEXT, textView.getText().toString());
TabSpec tabSpec = tabHost.newTabSpec(TAG_TAB2);
tabSpec.setIndicator(TAG_TAB2);
@@ -272,7 +272,7 @@
tabHost.setCurrentTabByTag(TAG_TAB2);
assertEquals(1, tabHost.getCurrentTab());
- tabHost.setCurrentTabByTag(TabHostStubActivity.INITIAL_TAB_TAG);
+ tabHost.setCurrentTabByTag(TabHostCtsActivity.INITIAL_TAB_TAG);
assertEquals(0, tabHost.getCurrentTab());
// exceptional value
@@ -294,7 +294,7 @@
assertTrue(tabHost.getTabContentView().getChildAt(1) instanceof ListView);
TextView child2 = (TextView) tabHost.getTabContentView().getChildAt(2);
tabHost.setCurrentTab(0);
- assertEquals(TabHostStubActivity.INITIAL_VIEW_TEXT, child2.getText().toString());
+ assertEquals(TabHostCtsActivity.INITIAL_VIEW_TEXT, child2.getText().toString());
TabSpec tabSpec = tabHost.newTabSpec(TAG_TAB2);
tabSpec.setIndicator(TAG_TAB2);
@@ -310,7 +310,7 @@
assertTrue(tabHost.getTabContentView().getChildAt(1) instanceof ListView);
child2 = (TextView) tabHost.getTabContentView().getChildAt(2);
tabHost.setCurrentTab(0);
- assertEquals(TabHostStubActivity.INITIAL_VIEW_TEXT, child2.getText().toString());
+ assertEquals(TabHostCtsActivity.INITIAL_VIEW_TEXT, child2.getText().toString());
}
@UiThreadTest
@@ -357,7 +357,7 @@
@UiThreadTest
public void testGetCurrentTabTag() {
TabHost tabHost = mActivity.getTabHost();
- assertEquals(TabHostStubActivity.INITIAL_TAB_TAG, tabHost.getCurrentTabTag());
+ assertEquals(TabHostCtsActivity.INITIAL_TAB_TAG, tabHost.getCurrentTabTag());
TabSpec tabSpec = tabHost.newTabSpec(TAG_TAB2);
tabSpec.setIndicator(TAG_TAB2);
diff --git a/tests/tests/widget/src/android/widget/cts/TabHost_TabSpecTest.java b/tests/tests/widget/src/android/widget/cts/TabHost_TabSpecTest.java
index 470a666..1363491 100644
--- a/tests/tests/widget/src/android/widget/cts/TabHost_TabSpecTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TabHost_TabSpecTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.app.Activity;
@@ -29,7 +29,6 @@
import android.net.Uri;
import android.test.ActivityInstrumentationTestCase2;
import android.test.UiThreadTest;
-import android.text.style.cts.MockURLSpanTestActivity;
import android.view.View;
import android.widget.ImageView;
import android.widget.ListView;
@@ -40,14 +39,14 @@
/**
* Test {@link TabSpec}.
*/
-public class TabHost_TabSpecTest extends ActivityInstrumentationTestCase2<TabHostStubActivity> {
+public class TabHost_TabSpecTest extends ActivityInstrumentationTestCase2<TabHostCtsActivity> {
private static final String TAG_TAB2 = "tab 2";
private TabHost mTabHost;
- private TabHostStubActivity mActivity;
+ private TabHostCtsActivity mActivity;
public TabHost_TabSpecTest() {
- super("com.android.cts.stub", TabHostStubActivity.class);
+ super("com.android.cts.widget", TabHostCtsActivity.class);
}
@Override
@@ -138,7 +137,7 @@
TabSpec tabSpec2 = mTabHost.newTabSpec("tab spec 2");
tabSpec2.setIndicator("tab 2");
// TabContentFactory to create a TextView as the content of the tab.
- tabSpec2.setContent(com.android.cts.stub.R.id.tabhost_textview);
+ tabSpec2.setContent(com.android.cts.widget.R.id.tabhost_textview);
mTabHost.addTab(tabSpec2);
mTabHost.setCurrentTab(1);
TextView currentView = (TextView) mTabHost.getCurrentView();
@@ -148,7 +147,7 @@
TabSpec tabSpec3 = mTabHost.newTabSpec("tab spec 3");
tabSpec3.setIndicator("tab 3");
// TabContentFactory to create a ListView as the content of the tab.
- tabSpec3.setContent(com.android.cts.stub.R.id.tabhost_listview);
+ tabSpec3.setContent(com.android.cts.widget.R.id.tabhost_listview);
mTabHost.addTab(tabSpec3);
mTabHost.setCurrentTab(2);
assertTrue(mTabHost.getCurrentView() instanceof ListView);
diff --git a/tests/tests/widget/src/android/widget/cts/TabWidgetTest.java b/tests/tests/widget/src/android/widget/cts/TabWidgetTest.java
index b5c46c5..1f2e66c 100644
--- a/tests/tests/widget/src/android/widget/cts/TabWidgetTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TabWidgetTest.java
@@ -32,11 +32,11 @@
/**
* Test {@link TabWidget}.
*/
-public class TabWidgetTest extends ActivityInstrumentationTestCase2<TabHostStubActivity> {
+public class TabWidgetTest extends ActivityInstrumentationTestCase2<TabHostCtsActivity> {
private Activity mActivity;
public TabWidgetTest() {
- super("com.android.cts.stub", TabHostStubActivity.class);
+ super("com.android.cts.widget", TabHostCtsActivity.class);
}
@Override
@@ -79,7 +79,7 @@
@UiThreadTest
public void testSetCurrentTab() {
- TabHostStubActivity activity = getActivity();
+ TabHostCtsActivity activity = getActivity();
TabWidget tabWidget = activity.getTabWidget();
tabWidget.addView(new TextView(mActivity));
@@ -97,7 +97,7 @@
@UiThreadTest
public void testFocusCurrentTab() {
- TabHostStubActivity activity = getActivity();
+ TabHostCtsActivity activity = getActivity();
TabWidget tabWidget = activity.getTabWidget();
tabWidget.addView(new TextView(mActivity));
diff --git a/tests/src/android/widget/cts/TableStubActivity.java b/tests/tests/widget/src/android/widget/cts/TableCtsActivity.java
similarity index 91%
rename from tests/src/android/widget/cts/TableStubActivity.java
rename to tests/tests/widget/src/android/widget/cts/TableCtsActivity.java
index 0edc513..f76caed 100644
--- a/tests/src/android/widget/cts/TableStubActivity.java
+++ b/tests/tests/widget/src/android/widget/cts/TableCtsActivity.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.app.Activity;
import android.os.Bundle;
@@ -24,7 +24,7 @@
/**
* A minimal application for TableLayout test.
*/
-public class TableStubActivity extends Activity {
+public class TableCtsActivity extends Activity {
/**
* Called with the activity is first created.
*/
diff --git a/tests/tests/widget/src/android/widget/cts/TableLayoutTest.java b/tests/tests/widget/src/android/widget/cts/TableLayoutTest.java
index ea84071..c8211f6 100644
--- a/tests/tests/widget/src/android/widget/cts/TableLayoutTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TableLayoutTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.content.Context;
@@ -39,11 +39,11 @@
/**
* Test {@link TableLayout}.
*/
-public class TableLayoutTest extends ActivityInstrumentationTestCase2<TableStubActivity> {
+public class TableLayoutTest extends ActivityInstrumentationTestCase2<TableCtsActivity> {
private Context mContext;
public TableLayoutTest() {
- super("com.android.cts.stub", TableStubActivity.class);
+ super("com.android.cts.widget", TableCtsActivity.class);
}
@Override
@@ -58,15 +58,15 @@
new TableLayout(mContext, null);
- TableStubActivity activity = getActivity();
- activity.setContentView(com.android.cts.stub.R.layout.table_layout_1);
+ TableCtsActivity activity = getActivity();
+ activity.setContentView(com.android.cts.widget.R.layout.table_layout_1);
TableLayout tableLayout = (TableLayout) activity
- .findViewById(com.android.cts.stub.R.id.table1);
+ .findViewById(com.android.cts.widget.R.id.table1);
assertTrue(tableLayout.isColumnCollapsed(0));
assertTrue(tableLayout.isColumnStretchable(2));
- activity.setContentView(com.android.cts.stub.R.layout.table_layout_2);
- tableLayout = (TableLayout) activity.findViewById(com.android.cts.stub.R.id.table2);
+ activity.setContentView(com.android.cts.widget.R.layout.table_layout_2);
+ tableLayout = (TableLayout) activity.findViewById(com.android.cts.widget.R.id.table2);
assertTrue(tableLayout.isColumnShrinkable(1));
}
@@ -203,15 +203,15 @@
}
public void testColumnStretchableEffect() {
- final TableStubActivity activity = getActivity();
+ final TableCtsActivity activity = getActivity();
getInstrumentation().runOnMainSync(new Runnable() {
public void run() {
- activity.setContentView(com.android.cts.stub.R.layout.table_layout_1);
+ activity.setContentView(com.android.cts.widget.R.layout.table_layout_1);
}
});
getInstrumentation().waitForIdleSync();
final TableLayout tableLayout =
- (TableLayout) activity.findViewById(com.android.cts.stub.R.id.table1);
+ (TableLayout) activity.findViewById(com.android.cts.widget.R.id.table1);
// Preparation: remove Collapsed mark for column 0.
getInstrumentation().runOnMainSync(new Runnable() {
@@ -554,7 +554,7 @@
public void testGenerateLayoutParams1() {
TableLayout tableLayout = new TableLayout(mContext);
- TableStubActivity activity = getActivity();
+ TableCtsActivity activity = getActivity();
XmlResourceParser parser = activity.getResources().getLayout(R.layout.table_layout_1);
AttributeSet attr = Xml.asAttributeSet(parser);
diff --git a/tests/tests/widget/src/android/widget/cts/TableLayout_LayoutParamsTest.java b/tests/tests/widget/src/android/widget/cts/TableLayout_LayoutParamsTest.java
index d63979a..20a9937 100644
--- a/tests/tests/widget/src/android/widget/cts/TableLayout_LayoutParamsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TableLayout_LayoutParamsTest.java
@@ -139,7 +139,7 @@
AttributeSet attrs = null;
try {
parser = mTargetContext.getResources()
- .getXml(com.android.cts.stub.R.xml.base_attributes);
+ .getXml(com.android.cts.widget.R.xml.base_attributes);
int type;
while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
diff --git a/tests/tests/widget/src/android/widget/cts/TableRowTest.java b/tests/tests/widget/src/android/widget/cts/TableRowTest.java
index 9ab4d13..6012f59 100644
--- a/tests/tests/widget/src/android/widget/cts/TableRowTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TableRowTest.java
@@ -33,18 +33,18 @@
import android.widget.TableRow;
import android.widget.TextView;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
/**
* Test {@link TableRow}.
*/
-public class TableRowTest extends ActivityInstrumentationTestCase2<TableStubActivity> {
+public class TableRowTest extends ActivityInstrumentationTestCase2<TableCtsActivity> {
Context mContext;
Context mTargetContext;
public TableRowTest() {
- super("com.android.cts.stub", TableStubActivity.class);
+ super("com.android.cts.widget", TableCtsActivity.class);
}
@Override
@@ -82,10 +82,10 @@
@UiThreadTest
public void testGetVirtualChildAt() {
- TableStubActivity activity = getActivity();
- activity.setContentView(com.android.cts.stub.R.layout.table_layout_1);
+ TableCtsActivity activity = getActivity();
+ activity.setContentView(com.android.cts.widget.R.layout.table_layout_1);
TableLayout tableLayout = (TableLayout) activity
- .findViewById(com.android.cts.stub.R.id.table1);
+ .findViewById(com.android.cts.widget.R.id.table1);
TableRow tableRow = (TableRow) tableLayout.getChildAt(0);
Resources resources = activity.getResources();
@@ -96,8 +96,8 @@
assertEquals(resources.getString(R.string.table_layout_third),
((TextView) tableRow.getVirtualChildAt(2)).getText().toString());
- activity.setContentView(com.android.cts.stub.R.layout.table_layout_2);
- tableLayout = (TableLayout) activity.findViewById(com.android.cts.stub.R.id.table2);
+ activity.setContentView(com.android.cts.widget.R.layout.table_layout_2);
+ tableLayout = (TableLayout) activity.findViewById(com.android.cts.widget.R.id.table2);
tableRow = (TableRow) tableLayout.getChildAt(0);
assertNull(tableRow.getVirtualChildAt(0));
@@ -113,16 +113,16 @@
@UiThreadTest
public void testGetVirtualChildCount() {
- TableStubActivity activity = getActivity();
- activity.setContentView(com.android.cts.stub.R.layout.table_layout_1);
+ TableCtsActivity activity = getActivity();
+ activity.setContentView(com.android.cts.widget.R.layout.table_layout_1);
TableLayout tableLayout = (TableLayout) activity
- .findViewById(com.android.cts.stub.R.id.table1);
+ .findViewById(com.android.cts.widget.R.id.table1);
TableRow tableRow = (TableRow) tableLayout.getChildAt(0);
assertEquals(3, tableRow.getVirtualChildCount());
- activity.setContentView(com.android.cts.stub.R.layout.table_layout_2);
- tableLayout = (TableLayout) activity.findViewById(com.android.cts.stub.R.id.table2);
+ activity.setContentView(com.android.cts.widget.R.layout.table_layout_2);
+ tableLayout = (TableLayout) activity.findViewById(com.android.cts.widget.R.id.table2);
tableRow = (TableRow) tableLayout.getChildAt(0);
assertEquals(5, tableRow.getVirtualChildCount());
diff --git a/tests/tests/widget/src/android/widget/cts/TableRow_LayoutParamsTest.java b/tests/tests/widget/src/android/widget/cts/TableRow_LayoutParamsTest.java
index 1d6793f..cf2603f 100644
--- a/tests/tests/widget/src/android/widget/cts/TableRow_LayoutParamsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TableRow_LayoutParamsTest.java
@@ -39,11 +39,11 @@
* Test {@link TableRow.LayoutParams}.
*/
public class TableRow_LayoutParamsTest
- extends ActivityInstrumentationTestCase2<TableStubActivity> {
+ extends ActivityInstrumentationTestCase2<TableCtsActivity> {
Context mTargetContext;
public TableRow_LayoutParamsTest() {
- super("com.android.cts.stub", TableStubActivity.class);
+ super("com.android.cts.widget", TableCtsActivity.class);
}
@Override
@@ -91,9 +91,9 @@
assertEquals(0, layoutParams.column);
assertEquals(0, layoutParams.span);
- TableStubActivity activity = getActivity();
- activity.setContentView(com.android.cts.stub.R.layout.table_layout_2);
- int idTable = com.android.cts.stub.R.id.table2;
+ TableCtsActivity activity = getActivity();
+ activity.setContentView(com.android.cts.widget.R.layout.table_layout_2);
+ int idTable = com.android.cts.widget.R.id.table2;
TableLayout tableLayout = (TableLayout) activity.findViewById(idTable);
View vVitural1 = ((TableRow) tableLayout.getChildAt(0)).getVirtualChildAt(1);
layoutParams = (TableRow.LayoutParams) vVitural1.getLayoutParams();
@@ -186,7 +186,7 @@
AttributeSet attrs = null;
try {
parser = mTargetContext.getResources()
- .getXml(com.android.cts.stub.R.xml.base_attributes);
+ .getXml(com.android.cts.widget.R.xml.base_attributes);
int type;
while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
diff --git a/tests/tests/widget/src/android/widget/cts/TestThread.java b/tests/tests/widget/src/android/widget/cts/TestThread.java
new file mode 100644
index 0000000..78295b9
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/TestThread.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2009 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.widget.cts;
+
+/**
+ * Thread class for executing a Runnable containing assertions in a separate thread.
+ * Uncaught exceptions in the Runnable are rethrown in the context of the the thread
+ * calling the <code>runTest()</code> method.
+ */
+public final class TestThread extends Thread {
+ private Throwable mThrowable;
+ private Runnable mTarget;
+
+ public TestThread(Runnable target) {
+ mTarget = target;
+ }
+
+ @Override
+ public final void run() {
+ try {
+ mTarget.run();
+ } catch (Throwable t) {
+ mThrowable = t;
+ }
+ }
+
+ /**
+ * Run the target Runnable object and wait until the test finish or throw
+ * out Exception if test fail.
+ *
+ * @param runTime
+ * @throws Throwable
+ */
+ public void runTest(long runTime) throws Throwable {
+ start();
+ joinAndCheck(runTime);
+ }
+
+ /**
+ * Get the Throwable object which is thrown when test running
+ * @return The Throwable object
+ */
+ public Throwable getThrowable() {
+ return mThrowable;
+ }
+
+ /**
+ * Set the Throwable object which is thrown when test running
+ * @param t The Throwable object
+ */
+ public void setThrowable(Throwable t) {
+ mThrowable = t;
+ }
+
+ /**
+ * Wait for the test thread to complete and throw the stored exception if there is one.
+ *
+ * @param runTime The time to wait for the test thread to complete.
+ * @throws Throwable
+ */
+ public void joinAndCheck(long runTime) throws Throwable {
+ this.join(runTime);
+ if (this.isAlive()) {
+ this.interrupt();
+ this.join(runTime);
+ throw new Exception("Thread did not finish within allotted time.");
+ }
+ checkException();
+ }
+
+ /**
+ * Check whether there is an exception when running Runnable object.
+ * @throws Throwable
+ */
+ public void checkException() throws Throwable {
+ if (mThrowable != null) {
+ throw mThrowable;
+ }
+ }
+}
diff --git a/tests/src/android/widget/cts/TextViewStubActivity.java b/tests/tests/widget/src/android/widget/cts/TextViewCtsActivity.java
similarity index 91%
rename from tests/src/android/widget/cts/TextViewStubActivity.java
rename to tests/tests/widget/src/android/widget/cts/TextViewCtsActivity.java
index 956e264..888f215 100644
--- a/tests/src/android/widget/cts/TextViewStubActivity.java
+++ b/tests/tests/widget/src/android/widget/cts/TextViewCtsActivity.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.app.Activity;
import android.os.Bundle;
@@ -24,7 +24,7 @@
/**
* A minimal application for TextView test.
*/
-public class TextViewStubActivity extends Activity {
+public class TextViewCtsActivity extends Activity {
/**
* Called with the activity is first created.
*/
diff --git a/tests/tests/widget/src/android/widget/cts/TextViewTest.java b/tests/tests/widget/src/android/widget/cts/TextViewTest.java
index c66184f..c5d9985 100644
--- a/tests/tests/widget/src/android/widget/cts/TextViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TextViewTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import com.android.internal.util.FastMath;
import org.xmlpull.v1.XmlPullParserException;
@@ -69,7 +69,6 @@
import android.text.method.TimeKeyListener;
import android.text.method.TransformationMethod;
import android.text.style.URLSpan;
-import android.text.style.cts.MockURLSpanTestActivity;
import android.text.util.Linkify;
import android.util.DisplayMetrics;
import android.util.TypedValue;
@@ -98,7 +97,7 @@
/**
* Test {@link TextView}.
*/
-public class TextViewTest extends ActivityInstrumentationTestCase2<TextViewStubActivity> {
+public class TextViewTest extends ActivityInstrumentationTestCase2<TextViewCtsActivity> {
private TextView mTextView;
private Activity mActivity;
@@ -112,7 +111,7 @@
private CharSequence mTransformedText;
public TextViewTest() {
- super("com.android.cts.stub", TextViewStubActivity.class);
+ super("com.android.cts.widget", TextViewCtsActivity.class);
}
@Override
@@ -1810,7 +1809,8 @@
// getTypeface
// getTypeface will be null if android:typeface is set to normal,
- // and android:style is not set or is set to normal
+ // and android:style is not set or is set to normal, and
+ // android:fontFamily is not set
assertNull(mTextView.getTypeface());
mTextView.setTypeface(Typeface.DEFAULT);
@@ -3293,7 +3293,7 @@
@UiThreadTest
public void testResetTextAlignment() {
- TextViewStubActivity activity = getActivity();
+ TextViewCtsActivity activity = getActivity();
LinearLayout ll = (LinearLayout) activity.findViewById(R.id.layout_textviewtest);
TextView tv = (TextView) activity.findViewById(R.id.textview_rtl);
@@ -3319,7 +3319,7 @@
final int RIGHT = 2;
final int BOTTOM = 3;
- TextViewStubActivity activity = getActivity();
+ TextViewCtsActivity activity = getActivity();
// Case 1.1: left / right drawable defined in default LTR mode
TextView tv = (TextView) activity.findViewById(R.id.textview_drawable_1_1);
@@ -3463,7 +3463,7 @@
final int RIGHT = 2;
final int BOTTOM = 3;
- TextViewStubActivity activity = getActivity();
+ TextViewCtsActivity activity = getActivity();
// Case 1.1: left / right drawable defined in default LTR mode
TextView tv = (TextView) activity.findViewById(R.id.textview_drawable_1_1);
diff --git a/tests/tests/widget/src/android/widget/cts/TimePickerTest.java b/tests/tests/widget/src/android/widget/cts/TimePickerTest.java
index 2ab01a3..fcf787a 100644
--- a/tests/tests/widget/src/android/widget/cts/TimePickerTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TimePickerTest.java
@@ -29,7 +29,7 @@
/**
* Test {@link TimePicker}.
*/
-public class TimePickerTest extends ActivityInstrumentationTestCase2<StubActivity> {
+public class TimePickerTest extends ActivityInstrumentationTestCase2<CtsActivity> {
private TimePicker mTimePicker;
private Activity mActivity;
@@ -39,7 +39,7 @@
private Instrumentation mInstrumentation;
public TimePickerTest() {
- super("com.android.cts.stub", StubActivity.class);
+ super("com.android.cts.widget", CtsActivity.class);
}
@Override
@@ -52,7 +52,7 @@
public void testConstructors() {
AttributeSet attrs =
- mContext.getResources().getLayout(com.android.cts.stub.R.layout.timepicker);
+ mContext.getResources().getLayout(com.android.cts.widget.R.layout.timepicker);
assertNotNull(attrs);
new TimePicker(mContext);
diff --git a/tests/tests/widget/src/android/widget/cts/ToastTest.java b/tests/tests/widget/src/android/widget/cts/ToastTest.java
index 9c7846b..90a161e 100644
--- a/tests/tests/widget/src/android/widget/cts/ToastTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ToastTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.app.Activity;
@@ -33,7 +33,7 @@
import android.widget.ImageView;
import android.widget.Toast;
-public class ToastTest extends ActivityInstrumentationTestCase2<StubActivity> {
+public class ToastTest extends ActivityInstrumentationTestCase2<CtsActivity> {
private static final String TEST_TOAST_TEXT = "test toast";
private static final long TIME_FOR_UI_OPERATION = 1000L;
private static final long TIME_OUT = 5000L;
@@ -44,7 +44,7 @@
private ViewTreeObserver.OnGlobalLayoutListener mLayoutListener;
public ToastTest() {
- super("com.android.cts.stub", StubActivity.class);
+ super("com.android.cts.widget", CtsActivity.class);
}
@Override
@@ -53,7 +53,6 @@
mActivity = getActivity();
mInstrumentation = getInstrumentation();
- mToast = new Toast(mActivity);
mLayoutDone = false;
mLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
public void onGlobalLayout() {
@@ -62,6 +61,7 @@
};
}
+ @UiThreadTest
public void testConstructor() {
new Toast(mActivity);
@@ -113,13 +113,17 @@
view.getViewTreeObserver().removeOnGlobalLayoutListener(mLayoutListener);
}
- public void testShow() {
+ private void makeToast() {
mActivity.runOnUiThread(new Runnable() {
public void run() {
mToast = Toast.makeText(mActivity, TEST_TOAST_TEXT, Toast.LENGTH_LONG);
}
});
mInstrumentation.waitForIdleSync();
+ }
+
+ public void testShow() {
+ makeToast();
final View view = mToast.getView();
@@ -141,10 +145,11 @@
@UiThreadTest
public void testShowFailure() {
+ Toast toast = new Toast(mActivity);
// do not have any views.
- assertNull(mToast.getView());
+ assertNull(toast.getView());
try {
- mToast.show();
+ toast.show();
fail("did not throw RuntimeException when did not set any views.");
} catch (RuntimeException e) {
// expected, test success.
@@ -152,12 +157,7 @@
}
public void testCancel() throws InterruptedException {
- mActivity.runOnUiThread(new Runnable() {
- public void run() {
- mToast = Toast.makeText(mActivity, TEST_TOAST_TEXT, Toast.LENGTH_LONG);
- }
- });
- mInstrumentation.waitForIdleSync();
+ makeToast();
final View view = mToast.getView();
@@ -175,12 +175,7 @@
}
public void testAccessView() {
- mActivity.runOnUiThread(new Runnable() {
- public void run() {
- mToast = Toast.makeText(mActivity, TEST_TOAST_TEXT, Toast.LENGTH_LONG);
- }
- });
- mInstrumentation.waitForIdleSync();
+ makeToast();
assertFalse(mToast.getView() instanceof ImageView);
final ImageView imageView = new ImageView(mActivity);
@@ -197,11 +192,12 @@
assertSame(imageView, mToast.getView());
assertShowAndHide(imageView);
}
+
public void testAccessDuration() {
long start = SystemClock.uptimeMillis();
+ makeToast();
mActivity.runOnUiThread(new Runnable() {
public void run() {
- mToast = Toast.makeText(mActivity, TEST_TOAST_TEXT, Toast.LENGTH_LONG);
mToast.show();
}
});
@@ -230,12 +226,7 @@
}
public void testAccessMargin() {
- mActivity.runOnUiThread(new Runnable() {
- public void run() {
- mToast = Toast.makeText(mActivity, TEST_TOAST_TEXT, Toast.LENGTH_SHORT);
- }
- });
- mInstrumentation.waitForIdleSync();
+ makeToast();
View view = mToast.getView();
assertFalse(view.getLayoutParams() instanceof WindowManager.LayoutParams);
@@ -289,9 +280,9 @@
}
public void testAccessGravity() {
+ makeToast();
mActivity.runOnUiThread(new Runnable() {
public void run() {
- mToast = Toast.makeText(mActivity, TEST_TOAST_TEXT, Toast.LENGTH_SHORT);
mToast.setGravity(Gravity.CENTER, 0, 0);
mToast.show();
registerLayoutListener(mToast.getView());
@@ -357,26 +348,26 @@
@UiThreadTest
public void testMakeText1() {
- mToast = Toast.makeText(mActivity, "android", Toast.LENGTH_SHORT);
- assertNotNull(mToast);
- assertEquals(Toast.LENGTH_SHORT, mToast.getDuration());
- View view = mToast.getView();
+ Toast toast = Toast.makeText(mActivity, "android", Toast.LENGTH_SHORT);
+ assertNotNull(toast);
+ assertEquals(Toast.LENGTH_SHORT, toast.getDuration());
+ View view = toast.getView();
assertNotNull(view);
- mToast = Toast.makeText(mActivity, "cts", Toast.LENGTH_LONG);
- assertNotNull(mToast);
- assertEquals(Toast.LENGTH_LONG, mToast.getDuration());
- view = mToast.getView();
+ toast = Toast.makeText(mActivity, "cts", Toast.LENGTH_LONG);
+ assertNotNull(toast);
+ assertEquals(Toast.LENGTH_LONG, toast.getDuration());
+ view = toast.getView();
assertNotNull(view);
- mToast = Toast.makeText(mActivity, null, Toast.LENGTH_LONG);
- assertNotNull(mToast);
- assertEquals(Toast.LENGTH_LONG, mToast.getDuration());
- view = mToast.getView();
+ toast = Toast.makeText(mActivity, null, Toast.LENGTH_LONG);
+ assertNotNull(toast);
+ assertEquals(Toast.LENGTH_LONG, toast.getDuration());
+ view = toast.getView();
assertNotNull(view);
try {
- mToast = Toast.makeText(null, "test", Toast.LENGTH_LONG);
+ toast = Toast.makeText(null, "test", Toast.LENGTH_LONG);
fail("did not throw NullPointerException when context is null.");
} catch (NullPointerException e) {
//expected, test success.
@@ -385,21 +376,21 @@
@UiThreadTest
public void testMakeText2() {
- mToast = Toast.makeText(mActivity, R.string.hello_world, Toast.LENGTH_LONG);
+ Toast toast = Toast.makeText(mActivity, R.string.hello_world, Toast.LENGTH_LONG);
- assertNotNull(mToast);
- assertEquals(Toast.LENGTH_LONG, mToast.getDuration());
- View view = mToast.getView();
+ assertNotNull(toast);
+ assertEquals(Toast.LENGTH_LONG, toast.getDuration());
+ View view = toast.getView();
assertNotNull(view);
- mToast = Toast.makeText(mActivity, R.string.hello_android, Toast.LENGTH_SHORT);
- assertNotNull(mToast);
- assertEquals(Toast.LENGTH_SHORT, mToast.getDuration());
- view = mToast.getView();
+ toast = Toast.makeText(mActivity, R.string.hello_android, Toast.LENGTH_SHORT);
+ assertNotNull(toast);
+ assertEquals(Toast.LENGTH_SHORT, toast.getDuration());
+ view = toast.getView();
assertNotNull(view);
try {
- mToast = Toast.makeText(null, R.string.hello_android, Toast.LENGTH_SHORT);
+ toast = Toast.makeText(null, R.string.hello_android, Toast.LENGTH_SHORT);
fail("did not throw NullPointerException when context is null.");
} catch (NullPointerException e) {
//expected, test success.
@@ -408,16 +399,16 @@
@UiThreadTest
public void testSetText1() {
- mToast = Toast.makeText(mActivity, R.string.text, Toast.LENGTH_LONG);
+ Toast toast = Toast.makeText(mActivity, R.string.text, Toast.LENGTH_LONG);
- mToast.setText(R.string.hello_world);
+ toast.setText(R.string.hello_world);
// TODO: how to getText to assert?
- mToast.setText(R.string.hello_android);
+ toast.setText(R.string.hello_android);
// TODO: how to getText to assert?
try {
- mToast.setText(-1);
+ toast.setText(-1);
fail("did not throw RuntimeException when resource id is negative.");
} catch (RuntimeException e) {
//expected, test success.
@@ -426,17 +417,17 @@
@UiThreadTest
public void testSetText2() {
- mToast = Toast.makeText(mActivity, R.string.text, Toast.LENGTH_LONG);
+ Toast toast = Toast.makeText(mActivity, R.string.text, Toast.LENGTH_LONG);
- mToast.setText("cts");
+ toast.setText("cts");
// TODO: how to getText to assert?
- mToast.setText("android");
+ toast.setText("android");
// TODO: how to getText to assert?
try {
- mToast.setView(null);
- mToast.setText(null);
+ toast.setView(null);
+ toast.setText(null);
fail("did not throw RuntimeException when view is null.");
} catch (RuntimeException e) {
//expected, test success.
diff --git a/tests/tests/widget/src/android/widget/cts/ToggleButtonTest.java b/tests/tests/widget/src/android/widget/cts/ToggleButtonTest.java
index ca1c94f..b3bc31e 100644
--- a/tests/tests/widget/src/android/widget/cts/ToggleButtonTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ToggleButtonTest.java
@@ -21,18 +21,19 @@
import android.content.Context;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
-import android.test.AndroidTestCase;
+import android.test.InstrumentationTestCase;
+import android.test.UiThreadTest;
import android.util.AttributeSet;
import android.util.Xml;
import android.widget.ToggleButton;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
/**
* Test {@link ToggleButton}.
*/
-public class ToggleButtonTest extends AndroidTestCase {
+public class ToggleButtonTest extends InstrumentationTestCase {
private static final String TEXT_OFF = "text off";
private static final String TEXT_ON = "text on";
ToggleButton mToggleButton;
@@ -43,7 +44,7 @@
protected void setUp() throws Exception {
super.setUp();
- mContext = getContext();
+ mContext = getInstrumentation().getTargetContext();
XmlPullParser parser = mContext.getResources().getXml(R.layout.togglebutton_layout);
mAttrSet = Xml.asAttributeSet(parser);
mToggleButton = new ToggleButton(mContext, mAttrSet);
@@ -88,6 +89,7 @@
assertEquals("", mToggleButton.getTextOff());
}
+ @UiThreadTest
public void testDrawableStateChanged() {
MockToggleButton toggleButton = new MockToggleButton(mContext);
@@ -111,6 +113,7 @@
toggleButton.onFinishInflate();
}
+ @UiThreadTest
public void testSetChecked() {
assertFalse(mToggleButton.isChecked());
@@ -121,6 +124,7 @@
assertFalse(mToggleButton.isChecked());
}
+ @UiThreadTest
public void testToggleText() {
mToggleButton.setText("default text");
mToggleButton.setTextOn(TEXT_ON);
diff --git a/tests/src/android/widget/cts/TwoLineListItemStubActivity.java b/tests/tests/widget/src/android/widget/cts/TwoLineListItemCtsActivity.java
similarity index 91%
rename from tests/src/android/widget/cts/TwoLineListItemStubActivity.java
rename to tests/tests/widget/src/android/widget/cts/TwoLineListItemCtsActivity.java
index 380cefb..bd2c36d 100644
--- a/tests/src/android/widget/cts/TwoLineListItemStubActivity.java
+++ b/tests/tests/widget/src/android/widget/cts/TwoLineListItemCtsActivity.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.app.Activity;
import android.os.Bundle;
@@ -25,7 +25,7 @@
/**
* Stub activity for testing {@link TwoLineListItem}
*/
-public class TwoLineListItemStubActivity extends Activity {
+public class TwoLineListItemCtsActivity extends Activity {
/**
* Called with the activity is first created.
*/
diff --git a/tests/tests/widget/src/android/widget/cts/TwoLineListItemTest.java b/tests/tests/widget/src/android/widget/cts/TwoLineListItemTest.java
index 5ef5961..0d5807f 100644
--- a/tests/tests/widget/src/android/widget/cts/TwoLineListItemTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TwoLineListItemTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.app.Activity;
@@ -32,11 +32,11 @@
* Test {@link TwoLineListItem}.
*/
public class TwoLineListItemTest extends
- ActivityInstrumentationTestCase<TwoLineListItemStubActivity> {
+ ActivityInstrumentationTestCase<TwoLineListItemCtsActivity> {
private Activity mActivity;
public TwoLineListItemTest() {
- super("com.android.cts.stub", TwoLineListItemStubActivity.class);
+ super("com.android.cts.widget", TwoLineListItemCtsActivity.class);
}
@Override
diff --git a/tests/src/android/widget/cts/VideoViewStubActivity.java b/tests/tests/widget/src/android/widget/cts/VideoViewCtsActivity.java
similarity index 91%
rename from tests/src/android/widget/cts/VideoViewStubActivity.java
rename to tests/tests/widget/src/android/widget/cts/VideoViewCtsActivity.java
index 73c7756..ad0d6eb 100644
--- a/tests/src/android/widget/cts/VideoViewStubActivity.java
+++ b/tests/tests/widget/src/android/widget/cts/VideoViewCtsActivity.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.app.Activity;
import android.os.Bundle;
@@ -25,7 +25,7 @@
/**
* A minimal application for {@link VideoView} test.
*/
-public class VideoViewStubActivity extends Activity {
+public class VideoViewCtsActivity extends Activity {
/**
* Called with the activity is first created.
*/
diff --git a/tests/tests/widget/src/android/widget/cts/VideoViewTest.java b/tests/tests/widget/src/android/widget/cts/VideoViewTest.java
index c8d9fc7..6e514f8 100644
--- a/tests/tests/widget/src/android/widget/cts/VideoViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/VideoViewTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.app.Activity;
import android.app.Instrumentation;
@@ -29,6 +29,7 @@
import android.media.MediaPlayer.OnErrorListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.test.ActivityInstrumentationTestCase2;
+import android.test.UiThreadTest;
import android.util.Log;
import android.view.View.MeasureSpec;
import android.widget.MediaController;
@@ -41,7 +42,7 @@
/**
* Test {@link VideoView}.
*/
-public class VideoViewTest extends ActivityInstrumentationTestCase2<VideoViewStubActivity> {
+public class VideoViewTest extends ActivityInstrumentationTestCase2<VideoViewCtsActivity> {
/** Debug TAG. **/
private static final String TAG = "VideoViewTest";
/** The maximum time to wait for an operation. */
@@ -62,7 +63,6 @@
private Activity mActivity;
private Instrumentation mInstrumentation;
private String mVideoPath;
- private MediaController mMediaController;
private static class MockListener {
private boolean mTriggered;
@@ -127,7 +127,7 @@
* Instantiates a new video view test.
*/
public VideoViewTest() {
- super("com.android.cts.stub", VideoViewStubActivity.class);
+ super("com.android.cts.widget", VideoViewCtsActivity.class);
}
/**
@@ -180,10 +180,19 @@
mVideoPath = prepareSampleVideo();
assertNotNull(mVideoPath);
mVideoView = findVideoViewById(R.id.videoview);
- mMediaController = new MediaController(mActivity);
- mVideoView.setMediaController(mMediaController);
}
+ private void makeVideoView() {
+ mActivity.runOnUiThread(new Runnable() {
+ public void run() {
+ MediaController mediaController = new MediaController(mActivity);
+ mVideoView.setMediaController(mediaController);
+ }
+ });
+ mInstrumentation.waitForIdleSync();
+ }
+
+ @UiThreadTest
public void testConstructor() {
new VideoView(mActivity);
@@ -193,6 +202,7 @@
}
public void testPlayVideo1() throws Throwable {
+ makeVideoView();
// Don't run the test if the codec isn't supported.
if (!hasCodec(MIME_TYPE)) {
Log.w(TAG, "Codec " + MIME_TYPE + " not supported. Return from testPlayVideo1.");
@@ -232,6 +242,7 @@
}
public void testSetOnErrorListener() throws Throwable {
+ makeVideoView();
final MockOnErrorListener listener = new MockOnErrorListener();
mVideoView.setOnErrorListener(listener);
@@ -253,6 +264,7 @@
}
public void testGetBufferPercentage() throws Throwable {
+ makeVideoView();
// Don't run the test if the codec isn't supported.
if (!hasCodec(MIME_TYPE)) {
Log.w(TAG, MIME_TYPE + " not supported. Return from testGetBufferPercentage.");
@@ -279,6 +291,7 @@
assertTrue(percent >= 0 && percent <= 100);
}
+ @UiThreadTest
public void testResolveAdjustedSize() {
mVideoView = new VideoView(mActivity);
@@ -310,6 +323,7 @@
assertTrue(Math.abs(mVideoView.getDuration() - TEST_VIDEO_DURATION) < DURATION_DELTA);
}
+ @UiThreadTest
public void testSetMediaController() {
final MediaController ctlr = new MediaController(mActivity);
mVideoView.setMediaController(ctlr);
diff --git a/tests/src/android/widget/cts/ViewAnimatorStubActivity.java b/tests/tests/widget/src/android/widget/cts/ViewAnimatorCtsActivity.java
similarity index 91%
rename from tests/src/android/widget/cts/ViewAnimatorStubActivity.java
rename to tests/tests/widget/src/android/widget/cts/ViewAnimatorCtsActivity.java
index 634f531..21deef7 100644
--- a/tests/src/android/widget/cts/ViewAnimatorStubActivity.java
+++ b/tests/tests/widget/src/android/widget/cts/ViewAnimatorCtsActivity.java
@@ -18,12 +18,12 @@
import android.app.Activity;
import android.os.Bundle;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
/**
* A minimal application for ViewAnimator test.
*/
-public class ViewAnimatorStubActivity extends Activity {
+public class ViewAnimatorCtsActivity extends Activity {
/**
* Called with the activity is first created.
*/
diff --git a/tests/tests/widget/src/android/widget/cts/ViewAnimatorTest.java b/tests/tests/widget/src/android/widget/cts/ViewAnimatorTest.java
index 72f5559..024e3ee 100644
--- a/tests/tests/widget/src/android/widget/cts/ViewAnimatorTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ViewAnimatorTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import org.xmlpull.v1.XmlPullParser;
@@ -36,14 +36,14 @@
import android.widget.ViewAnimator;
public class ViewAnimatorTest extends
- ActivityInstrumentationTestCase2<ViewAnimatorStubActivity> {
+ ActivityInstrumentationTestCase2<ViewAnimatorCtsActivity> {
private ViewAnimator mViewAnimator;
private Activity mActivity;
private Instrumentation mInstrumentation;
private AttributeSet mAttributeSet;
public ViewAnimatorTest() {
- super("com.android.cts.stub", ViewAnimatorStubActivity.class);
+ super("com.android.cts.widget", ViewAnimatorCtsActivity.class);
}
@Override
diff --git a/tests/src/android/widget/cts/ViewFlipperStubActivity.java b/tests/tests/widget/src/android/widget/cts/ViewFlipperCtsActivity.java
similarity index 90%
rename from tests/src/android/widget/cts/ViewFlipperStubActivity.java
rename to tests/tests/widget/src/android/widget/cts/ViewFlipperCtsActivity.java
index 2ac331e..7f13f6c 100644
--- a/tests/src/android/widget/cts/ViewFlipperStubActivity.java
+++ b/tests/tests/widget/src/android/widget/cts/ViewFlipperCtsActivity.java
@@ -16,12 +16,12 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.app.Activity;
import android.os.Bundle;
-public class ViewFlipperStubActivity extends Activity {
+public class ViewFlipperCtsActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
diff --git a/tests/tests/widget/src/android/widget/cts/ViewFlipperTest.java b/tests/tests/widget/src/android/widget/cts/ViewFlipperTest.java
index f223466..025fae4 100644
--- a/tests/tests/widget/src/android/widget/cts/ViewFlipperTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ViewFlipperTest.java
@@ -16,13 +16,14 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import org.xmlpull.v1.XmlPullParser;
import android.app.Activity;
import android.test.ActivityInstrumentationTestCase;
+import android.test.UiThreadTest;
import android.util.AttributeSet;
import android.util.Xml;
import android.view.View;
@@ -32,11 +33,11 @@
/**
* Test {@link ViewFlipper}.
*/
-public class ViewFlipperTest extends ActivityInstrumentationTestCase<ViewFlipperStubActivity> {
+public class ViewFlipperTest extends ActivityInstrumentationTestCase<ViewFlipperCtsActivity> {
private Activity mActivity;
public ViewFlipperTest() {
- super("com.android.cts.stub", ViewFlipperStubActivity.class);
+ super("com.android.cts.widget", ViewFlipperCtsActivity.class);
}
protected void setUp() throws Exception {
@@ -45,6 +46,7 @@
assertNotNull(mActivity);
}
+ @UiThreadTest
public void testConstructor() {
new ViewFlipper(mActivity);
@@ -61,6 +63,7 @@
}
}
+ @UiThreadTest
public void testSetFlipInterval() {
ViewFlipper viewFlipper = new ViewFlipper(mActivity);
viewFlipper.setFlipInterval(0);
diff --git a/tests/src/android/widget/cts/ViewGroupStubActivity.java b/tests/tests/widget/src/android/widget/cts/ViewGroupCtsActivity.java
similarity index 91%
rename from tests/src/android/widget/cts/ViewGroupStubActivity.java
rename to tests/tests/widget/src/android/widget/cts/ViewGroupCtsActivity.java
index 346c067..378395e 100644
--- a/tests/src/android/widget/cts/ViewGroupStubActivity.java
+++ b/tests/tests/widget/src/android/widget/cts/ViewGroupCtsActivity.java
@@ -22,7 +22,7 @@
import android.os.Handler;
import android.widget.TextView;
-public class ViewGroupStubActivity extends Activity {
+public class ViewGroupCtsActivity extends Activity {
public static final String ACTION_INVALIDATE_CHILD = "invalidateChild";
@@ -35,8 +35,8 @@
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setContentView(com.android.cts.stub.R.layout.viewgrouptest_stub);
- TextView textView = (TextView)findViewById(com.android.cts.stub.R.id.viewgrouptest_stub);
+ setContentView(com.android.cts.widget.R.layout.viewgrouptest_stub);
+ TextView textView = (TextView)findViewById(com.android.cts.widget.R.id.viewgrouptest_stub);
textView.setText("test");
}
@@ -49,7 +49,7 @@
mHandler.postDelayed(new Runnable() {
public void run() {
MockLinearLayout mll =
- (MockLinearLayout) findViewById(com.android.cts.stub.R.id.
+ (MockLinearLayout) findViewById(com.android.cts.widget.R.id.
mocklinearlayout);
if (!mll.mIsInvalidateChildInParentCalled) {
fail();
diff --git a/tests/tests/widget/src/android/widget/cts/ViewSwitcherTest.java b/tests/tests/widget/src/android/widget/cts/ViewSwitcherTest.java
index b7bac6c..ce18267 100644
--- a/tests/tests/widget/src/android/widget/cts/ViewSwitcherTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ViewSwitcherTest.java
@@ -28,7 +28,7 @@
import android.widget.ViewSwitcher;
import android.widget.ViewSwitcher.ViewFactory;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
/**
diff --git a/tests/src/android/widget/cts/WidgetTestUtils.java b/tests/tests/widget/src/android/widget/cts/WidgetTestUtils.java
similarity index 100%
rename from tests/src/android/widget/cts/WidgetTestUtils.java
rename to tests/tests/widget/src/android/widget/cts/WidgetTestUtils.java
diff --git a/tests/src/android/widget/cts/ZoomButtonStubActivity.java b/tests/tests/widget/src/android/widget/cts/ZoomButtonCtsActivity.java
similarity index 91%
rename from tests/src/android/widget/cts/ZoomButtonStubActivity.java
rename to tests/tests/widget/src/android/widget/cts/ZoomButtonCtsActivity.java
index a49df7a..e371b3f 100644
--- a/tests/src/android/widget/cts/ZoomButtonStubActivity.java
+++ b/tests/tests/widget/src/android/widget/cts/ZoomButtonCtsActivity.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import android.app.Activity;
import android.os.Bundle;
@@ -24,7 +24,7 @@
/**
* A minimal application for {@link ZoomButton} test.
*/
-public class ZoomButtonStubActivity extends Activity {
+public class ZoomButtonCtsActivity extends Activity {
/**
* Called with the activity is first created.
*/
diff --git a/tests/tests/widget/src/android/widget/cts/ZoomButtonTest.java b/tests/tests/widget/src/android/widget/cts/ZoomButtonTest.java
index 94c2669..3d906db 100644
--- a/tests/tests/widget/src/android/widget/cts/ZoomButtonTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ZoomButtonTest.java
@@ -16,7 +16,7 @@
package android.widget.cts;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
import org.xmlpull.v1.XmlPullParser;
@@ -32,12 +32,12 @@
import android.widget.ListView;
import android.widget.ZoomButton;
-public class ZoomButtonTest extends ActivityInstrumentationTestCase2<ZoomButtonStubActivity> {
+public class ZoomButtonTest extends ActivityInstrumentationTestCase2<ZoomButtonCtsActivity> {
private ZoomButton mZoomButton;
private Activity mActivity;
public ZoomButtonTest() {
- super("com.android.cts.stub", ZoomButtonStubActivity.class);
+ super("com.android.cts.widget", ZoomButtonCtsActivity.class);
}
@Override
@@ -48,6 +48,7 @@
mActivity = getActivity();
}
+ @UiThreadTest
public void testConstructor() {
new ZoomButton(mActivity);
diff --git a/tests/tests/widget/src/android/widget/cts/ZoomControlsTest.java b/tests/tests/widget/src/android/widget/cts/ZoomControlsTest.java
index 5dc7a0e..9b3ffba 100644
--- a/tests/tests/widget/src/android/widget/cts/ZoomControlsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ZoomControlsTest.java
@@ -36,12 +36,14 @@
mContext = getInstrumentation().getContext();
}
+ @UiThreadTest
public void testConstructor() {
new ZoomControls(mContext);
new ZoomControls(mContext, null);
}
+ @UiThreadTest
public void testSetOnZoomInClickListener() {
ZoomControls zoomControls = new ZoomControls(mContext);
@@ -59,6 +61,7 @@
}
}
+ @UiThreadTest
public void testSetOnZoomOutClickListener() {
ZoomControls zoomControls = new ZoomControls(mContext);
@@ -70,6 +73,7 @@
zoomControls.setOnZoomOutClickListener(null);
}
+ @UiThreadTest
public void testSetZoomSpeed() {
ZoomControls zoomControls = new ZoomControls(mContext);
@@ -82,6 +86,7 @@
// onTouchEvent() is implementation details, do NOT test
}
+ @UiThreadTest
public void testShowAndHide() {
final ZoomControls zoomControls = new ZoomControls(mContext);
assertEquals(View.VISIBLE, zoomControls.getVisibility());
@@ -93,12 +98,14 @@
assertEquals(View.VISIBLE, zoomControls.getVisibility());
}
+ @UiThreadTest
public void testSetIsZoomInEnabled() {
ZoomControls zoomControls = new ZoomControls(mContext);
zoomControls.setIsZoomInEnabled(false);
zoomControls.setIsZoomInEnabled(true);
}
+ @UiThreadTest
public void testSetIsZoomOutEnabled() {
ZoomControls zoomControls = new ZoomControls(mContext);
zoomControls.setIsZoomOutEnabled(false);
diff --git a/tests/src/android/widget/cts/util/ExpandableListScenario.java b/tests/tests/widget/src/android/widget/cts/util/ExpandableListScenario.java
similarity index 100%
rename from tests/src/android/widget/cts/util/ExpandableListScenario.java
rename to tests/tests/widget/src/android/widget/cts/util/ExpandableListScenario.java
diff --git a/tests/src/android/widget/cts/util/ListItemFactory.java b/tests/tests/widget/src/android/widget/cts/util/ListItemFactory.java
similarity index 100%
rename from tests/src/android/widget/cts/util/ListItemFactory.java
rename to tests/tests/widget/src/android/widget/cts/util/ListItemFactory.java
diff --git a/tests/src/android/widget/cts/util/ListScenario.java b/tests/tests/widget/src/android/widget/cts/util/ListScenario.java
similarity index 100%
rename from tests/src/android/widget/cts/util/ListScenario.java
rename to tests/tests/widget/src/android/widget/cts/util/ListScenario.java
diff --git a/tests/src/android/widget/cts/util/ListUtil.java b/tests/tests/widget/src/android/widget/cts/util/ListUtil.java
similarity index 100%
rename from tests/src/android/widget/cts/util/ListUtil.java
rename to tests/tests/widget/src/android/widget/cts/util/ListUtil.java
diff --git a/tests/webgl/Android.mk b/tests/webgl/Android.mk
index ce22dd8..624d82a 100755
--- a/tests/webgl/Android.mk
+++ b/tests/webgl/Android.mk
@@ -24,7 +24,8 @@
LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_SRC_FILES := $(call all-java-files-under, src)\
+ ../src/android/webkit/cts/NullWebViewUtils.java
# Must match the package name in CtsTestCaseList.mk
LOCAL_PACKAGE_NAME := CtsWebGLTestCases
diff --git a/tests/webgl/AndroidManifest.xml b/tests/webgl/AndroidManifest.xml
index e30fc86..d648032 100755
--- a/tests/webgl/AndroidManifest.xml
+++ b/tests/webgl/AndroidManifest.xml
@@ -21,7 +21,7 @@
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.INTERNET" />
- <application>
+ <application android:maxRecents="1">
<uses-library android:name="android.test.runner" />
<activity android:name="android.webgl.WebGLActivity" >
<intent-filter>
diff --git a/tests/webgl/src/android/webgl/WebGLActivity.java b/tests/webgl/src/android/webgl/WebGLActivity.java
index bb02938..f851a76 100644
--- a/tests/webgl/src/android/webgl/WebGLActivity.java
+++ b/tests/webgl/src/android/webgl/WebGLActivity.java
@@ -24,6 +24,8 @@
import android.webgl.cts.R;
import android.webkit.WebView;
import android.webkit.JavascriptInterface;
+import android.webkit.WebViewClient;
+import android.webkit.cts.NullWebViewUtils;
import android.widget.Toast;
import java.lang.Override;
import java.io.InputStream;
@@ -36,6 +38,7 @@
public class WebGLActivity extends Activity {
Semaphore mFinished = new Semaphore(0, false);
+ Semaphore mDestroyed = new Semaphore(0, false);
String mWebGlHarnessUrl;
WebView mWebView;
@@ -49,10 +52,25 @@
super.onCreate(icicle);
mWebGlHarnessUrl = "file://" + getCacheDir() + "/harness.html";
- mWebView = new WebView(this);
+ try {
+ mWebView = new WebView(this);
+ } catch (Exception e) {
+ NullWebViewUtils.determineIfWebViewAvailable(this, e);
+ }
+
+ if (mWebView == null) {
+ return;
+ }
+
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setAllowFileAccessFromFileURLs(true);
mWebView.getSettings().setMediaPlaybackRequiresUserGesture(false);
+ mWebView.setWebViewClient(new WebViewClient() {
+ @Override
+ public boolean shouldOverrideUrlLoading(WebView webView, String url) {
+ return false;
+ }
+ });
mWebView.addJavascriptInterface(new Object() {
@JavascriptInterface
@@ -84,6 +102,10 @@
}
public void navigateToTest(String url) throws Exception {
+ if (!NullWebViewUtils.isWebViewAvailable()) {
+ return;
+ }
+
synchronized(WebGLActivity.this) {
mWebGLTestUrl = url;
}
@@ -101,6 +123,17 @@
synchronized(WebGLActivity.this) {
message = mMessage.toString();
}
+
+ // Destroy the webview and wait for it.
+ runOnUiThread(new Runnable() {
+ public void run() {
+ mWebView.destroy();
+ finish();
+ mDestroyed.release();
+ }
+ });
+ mDestroyed.acquire();
+
if (!finished)
throw new Exception("\n" + url + "\n Test timed-out after 60 seconds: " + message);
if(!mPassed)
diff --git a/tools/cts-xml-generator/src/Android.mk b/tools/cts-xml-generator/src/Android.mk
index 62f8692..a6d85b6 100644
--- a/tools/cts-xml-generator/src/Android.mk
+++ b/tools/cts-xml-generator/src/Android.mk
@@ -14,12 +14,14 @@
LOCAL_PATH := $(call my-dir)
-
# cts-xml-generator java library
# ============================================================
include $(CLEAR_VARS)
-LOCAL_SRC_FILES := $(call all-subdir-java-files)
+LOCAL_SRC_FILES := \
+ $(call all-subdir-java-files) \
+ ../../../libs/commonutil/src/com/android/cts/util/AbiUtils.java
+
LOCAL_JAR_MANIFEST := MANIFEST.mf
LOCAL_MODULE := cts-xml-generator
diff --git a/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/CtsXmlGenerator.java b/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/CtsXmlGenerator.java
index 37e94ae..384466a 100644
--- a/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/CtsXmlGenerator.java
+++ b/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/CtsXmlGenerator.java
@@ -36,10 +36,10 @@
private static void usage(String[] args) {
System.err.println("Arguments: " + Arrays.asList(args));
- System.err.println("Usage: cts-xml-generator -p PACKAGE_NAME -n NAME [-t TEST_TYPE]"
- + " [-j JAR_PATH] [-i INSTRUMENTATION] [-m MANIFEST_FILE] [-e EXPECTATION_FILE]"
- + " [-b UNSUPPORTED_ABI_FILE] [-a ARCHITECTURE] [-o OUTPUT_FILE]"
- + " [-n APP_NAME_SPACE] [-x ADDITIONAL_ATTRIBUTE_KEY->VALUE]");
+ System.err.println("Usage: cts-xml-generator -p PACKAGE_NAME -n NAME [-s APP_NAME_SPACE]"
+ + " [-t TEST_TYPE] [-j JAR_PATH] [-i INSTRUMENTATION] [-m MANIFEST_FILE]"
+ + " [-e EXPECTATION_FILE] [-b UNSUPPORTED_ABI_FILE] [-o OUTPUT_FILE]"
+ + " [-x ADDITIONAL_ATTRIBUTE_KEY->VALUE]");
System.exit(1);
}
@@ -49,7 +49,6 @@
String outputPath = null;
Set<File> expectationFiles = new HashSet<File>();
Set<File> abiFiles = new HashSet<File>();
- String architecture = null;
File manifestFile = null;
String instrumentation = null;
String testType = null;
@@ -76,8 +75,6 @@
"Missing value for expectation store")));
} else if ("-b".equals(args[i])) {
abiFiles.add(new File(getArg(args, ++i, "Missing value for abi store")));
- } else if ("-a".equals(args[i])) {
- architecture = getArg(args, ++i, "Missing value for architecture");
} else if ("-o".equals(args[i])) {
outputPath = getArg(args, ++i, "Missing value for output file");
} else if ("-s".equals(args[i])) {
@@ -127,9 +124,9 @@
ExpectationStore failuresStore = ExpectationStore.parse(expectationFiles, ModeId.DEVICE);
ExpectationStore abiStore = ExpectationStore.parse(abiFiles, ModeId.DEVICE);
- XmlGenerator generator = new XmlGenerator(failuresStore, abiStore, architecture,
- appNameSpace, appPackageName, name, runner, instrumentation, targetNameSpace,
- jarPath, testType, outputPath, additionalAttributes);
+ XmlGenerator generator = new XmlGenerator(failuresStore, abiStore, appNameSpace,
+ appPackageName, name, runner, instrumentation, targetNameSpace, jarPath, testType,
+ outputPath, additionalAttributes);
generator.writePackageXml();
}
diff --git a/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/XmlGenerator.java b/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/XmlGenerator.java
index 59b9fb3..4a56a8e 100644
--- a/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/XmlGenerator.java
+++ b/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/XmlGenerator.java
@@ -16,6 +16,8 @@
package com.android.cts.xmlgenerator;
+import com.android.cts.util.AbiUtils;
+
import vogar.Expectation;
import vogar.ExpectationStore;
@@ -27,8 +29,6 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
import java.util.Map;
import java.util.List;
import java.util.Set;
@@ -50,29 +50,6 @@
*/
class XmlGenerator {
- private static final Set<String> ARM_ABI = new HashSet<String>();
- private static final Set<String> INTEL_ABI = new HashSet<String>();
- private static final Set<String> MIPS_ABI = new HashSet<String>();
- private static final Set<String> SUPPORTED_ABIS = new HashSet<String>();
- private static final Map<String, Set<String>> ARCH_TO_ABIS = new HashMap<String, Set<String>>();
- static {
- ARM_ABI.add("armeabi-v7a");
- ARM_ABI.add("arm64-v8a");
- INTEL_ABI.add("x86");
- INTEL_ABI.add("x86_64");
- MIPS_ABI.add("mips");
- MIPS_ABI.add("mips64");
- ARCH_TO_ABIS.put("arm", ARM_ABI);
- ARCH_TO_ABIS.put("arm64", ARM_ABI);
- ARCH_TO_ABIS.put("x86", INTEL_ABI);
- ARCH_TO_ABIS.put("x86_64", INTEL_ABI);
- ARCH_TO_ABIS.put("mips", MIPS_ABI);
- ARCH_TO_ABIS.put("mips64", MIPS_ABI);
- SUPPORTED_ABIS.addAll(ARM_ABI);
- SUPPORTED_ABIS.addAll(INTEL_ABI);
- SUPPORTED_ABIS.addAll(MIPS_ABI);
- }
-
/** Example: com.android.cts.holo */
private final String mAppNamespace;
@@ -102,14 +79,12 @@
/** ExpectationStore to filter out unsupported abis. */
private final ExpectationStore mUnsupportedAbis;
- private final String mArchitecture;
-
private final Map<String, String> mAdditionalAttributes;
XmlGenerator(ExpectationStore knownFailures, ExpectationStore unsupportedAbis,
- String architecture, String appNameSpace, String appPackageName, String name,
- String runner, String targetBinaryName, String targetNameSpace, String jarPath,
- String testType, String outputPath, Map<String, String> additionalAttributes) {
+ String appNameSpace, String appPackageName, String name, String runner,
+ String targetBinaryName, String targetNameSpace, String jarPath, String testType,
+ String outputPath, Map<String, String> additionalAttributes) {
mAppNamespace = appNameSpace;
mAppPackageName = appPackageName;
mName = name;
@@ -121,7 +96,6 @@
mOutputPath = outputPath;
mKnownFailures = knownFailures;
mUnsupportedAbis = unsupportedAbis;
- mArchitecture = architecture;
mAdditionalAttributes = additionalAttributes;
}
@@ -228,7 +202,7 @@
String className = nameCollector.toString();
nameCollector.append('#').append(test.getName());
writer.append("<Test name=\"").append(test.getName()).append("\"");
- String abis = getSupportedAbis(mUnsupportedAbis, mArchitecture, className).toString();
+ String abis = getSupportedAbis(mUnsupportedAbis, className).toString();
writer.append(" abis=\"" + abis.substring(1, abis.length() - 1) + "\"");
if (isKnownFailure(mKnownFailures, nameCollector.toString())) {
writer.append(" expectation=\"failure\"");
@@ -255,8 +229,8 @@
// Returns the list of ABIs supported by this TestCase on this architecture.
public static Set<String> getSupportedAbis(ExpectationStore expectationStore,
- String architecture, String className) {
- Set<String> supportedAbis = new HashSet<String>(ARCH_TO_ABIS.get(architecture));
+ String className) {
+ Set<String> supportedAbis = AbiUtils.getAbisSupportedByCts();
Expectation e = (expectationStore == null) ? null : expectationStore.get(className);
if (e != null && !e.getDescription().isEmpty()) {
// Description should be written in the form "blah blah: abi1, abi2..."
@@ -264,7 +238,7 @@
String[] unsupportedAbis = description.split(",");
for (String a : unsupportedAbis) {
String abi = a.trim();
- if (!SUPPORTED_ABIS.contains(abi)) {
+ if (!AbiUtils.isAbiSupportedByCts(abi)) {
throw new RuntimeException(
String.format("Unrecognised ABI %s in %s", abi, e.getDescription()));
}
diff --git a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoActivity.java b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoActivity.java
index ed82b08..00845bd 100644
--- a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoActivity.java
+++ b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoActivity.java
@@ -57,6 +57,7 @@
final CountDownLatch done = new CountDownLatch(1);
final int version = i;
DeviceInfoActivity.this.runOnUiThread(new Runnable() {
+ @Override
public void run() {
setContentView(new GLESSurfaceView(DeviceInfoActivity.this, version, done));
}
@@ -121,6 +122,7 @@
ConfigurationInfo info = am.getDeviceConfigurationInfo();
final int glVersion = (info.reqGlEsVersion & 0xffff0000) >> 16;
new Thread() {
+ @Override
public void run() {
runIterations(glVersion);
}
diff --git a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoConstants.java b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoConstants.java
index d77a44c..1eb4acb 100644
--- a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoConstants.java
+++ b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoConstants.java
@@ -51,6 +51,9 @@
public static final String VERSION_RELEASE = "buildVersion";
public static final String BUILD_ABI = "build_abi";
public static final String BUILD_ABI2 = "build_abi2";
+ public static final String BUILD_ABIS = "build_abis";
+ public static final String BUILD_ABIS_32 = "build_abis_32";
+ public static final String BUILD_ABIS_64 = "build_abis_64";
public static final String BUILD_FINGERPRINT = "build_fingerprint";
public static final String BUILD_TYPE = "build_type";
public static final String BUILD_MODEL = "build_model";
diff --git a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoInstrument.java b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoInstrument.java
index cdf1df3..19349e5 100644
--- a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoInstrument.java
+++ b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoInstrument.java
@@ -28,6 +28,7 @@
import android.os.Environment;
import android.os.UserManager;
import android.telephony.TelephonyManager;
+import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Display;
@@ -38,6 +39,7 @@
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Scanner;
@@ -71,6 +73,9 @@
addResult(BUILD_FINGERPRINT, Build.FINGERPRINT);
addResult(BUILD_ABI, Build.CPU_ABI);
addResult(BUILD_ABI2, Build.CPU_ABI2);
+ addResult(BUILD_ABIS, TextUtils.join(",", Build.SUPPORTED_ABIS));
+ addResult(BUILD_ABIS_32, TextUtils.join(",", Build.SUPPORTED_32_BIT_ABIS));
+ addResult(BUILD_ABIS_64, TextUtils.join(",", Build.SUPPORTED_64_BIT_ABIS));
addResult(SERIAL_NUMBER, Build.SERIAL);
addResult(VERSION_RELEASE, Build.VERSION.RELEASE);
@@ -163,7 +168,7 @@
* @param key the string of the key name.
* @param value integer value.
*/
- private void addResult(final String key, final int value){
+ static void addResult(final String key, final int value){
mResults.putInt(key, value);
}
@@ -173,7 +178,7 @@
* @param key the string of the key name.
* @param value float value.
*/
- private void addResult(final String key, final float value){
+ static void addResult(final String key, final float value){
mResults.putFloat(key, value);
}
@@ -361,7 +366,6 @@
count, getContext().getExternalFilesDirs(Environment.DIRECTORY_PICTURES).length);
count = Math.max(count, getContext().getObbDirs().length);
- final String result;
if (Environment.isExternalStorageEmulated()) {
if (count == 1) {
return "1 emulated";
diff --git a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/GLESSurfaceView.java b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/GLESSurfaceView.java
index 1d3bf7f..04289e9 100644
--- a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/GLESSurfaceView.java
+++ b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/GLESSurfaceView.java
@@ -16,7 +16,6 @@
package android.tests.getinfo;
-import android.content.Context;
import android.opengl.GLES20;
import android.opengl.GLES30;
import android.opengl.GLSurfaceView;
@@ -89,7 +88,7 @@
}
}
}
-
+ scanner.close();
mDone.countDown();
}
diff --git a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/RootProcessScanner.java b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/RootProcessScanner.java
index fefff99..d8018a1 100644
--- a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/RootProcessScanner.java
+++ b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/RootProcessScanner.java
@@ -146,13 +146,13 @@
try {
scanner = new Scanner(status);
- scanner = findToken(scanner, "Name:");
+ findToken(scanner, "Name:");
String name = scanner.next();
- scanner = findToken(scanner, "Uid:");
+ findToken(scanner, "Uid:");
boolean rootUid = hasRootId(scanner);
- scanner = findToken(scanner, "Gid:");
+ findToken(scanner, "Gid:");
boolean rootGid = hasRootId(scanner);
return !ROOT_PROCESS_WHITELIST_PATTERN.matcher(name).matches()
@@ -182,13 +182,12 @@
*
* @param scanner to call next() until the token is found
* @param token to find like "Name:"
- * @return scanner after finding token
*/
- private static Scanner findToken(Scanner scanner, String token) {
+ private static void findToken(Scanner scanner, String token) {
while (true) {
String next = scanner.next();
if (next.equals(token)) {
- return scanner;
+ return;
}
}
@@ -214,7 +213,7 @@
File status = getProcessStatus(processDir);
Scanner scanner = new Scanner(status);
try {
- scanner = findToken(scanner, "Name:");
+ findToken(scanner, "Name:");
return scanner.next();
} finally {
scanner.close();
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/command/CtsConsole.java b/tools/tradefed-host/src/com/android/cts/tradefed/command/CtsConsole.java
index 24190c5..7333de2 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/command/CtsConsole.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/command/CtsConsole.java
@@ -23,6 +23,7 @@
import com.android.cts.tradefed.result.TestResultRepo;
import com.android.cts.tradefed.testtype.ITestPackageRepo;
import com.android.cts.tradefed.testtype.TestPackageRepo;
+import com.android.cts.util.AbiUtils;
import com.android.tradefed.command.Console;
import com.android.tradefed.config.ArgsOptionParser;
import com.android.tradefed.config.ConfigurationException;
@@ -38,6 +39,7 @@
import java.util.Arrays;
import java.util.List;
import java.util.Map;
+import java.util.Set;
/**
* Specialization of trade federation console that adds CTS commands to list plans and packages.
@@ -78,7 +80,7 @@
public void run() {
CtsBuildHelper ctsBuild = getCtsBuild();
if (ctsBuild != null) {
- listPackages(ctsBuild);
+ listPackages(ctsBuild, AbiUtils.getAbisSupportedByCts());
}
}
}, LIST_PATTERN, "packages");
@@ -114,7 +116,8 @@
}
CtsBuildHelper ctsBuild = getCtsBuild();
if (ctsBuild != null) {
- addDerivedPlan(ctsBuild, flatArgs);
+ // FIXME may want to only add certain ABIs
+ addDerivedPlan(ctsBuild, AbiUtils.getAbisSupportedByCts(), flatArgs);
}
}
};
@@ -190,10 +193,10 @@
}
}
- private void listPackages(CtsBuildHelper ctsBuild) {
- ITestPackageRepo testCaseRepo = new TestPackageRepo(ctsBuild.getTestCasesDir(), false);
- for (String packageUri : testCaseRepo.getPackageNames()) {
- printLine(packageUri);
+ private void listPackages(CtsBuildHelper ctsBuild, Set<String> abis) {
+ ITestPackageRepo testCaseRepo = new TestPackageRepo(ctsBuild.getTestCasesDir(), abis, false);
+ for (String packageName : testCaseRepo.getPackageNames()) {
+ printLine(packageName);
}
}
@@ -215,12 +218,12 @@
tableFormatter.displayTable(table, new PrintWriter(System.out, true));
}
- private void addDerivedPlan(CtsBuildHelper ctsBuild, String[] flatArgs) {
+ private void addDerivedPlan(CtsBuildHelper ctsBuild, Set<String> abis, String[] flatArgs) {
PlanCreator creator = new PlanCreator();
try {
ArgsOptionParser optionParser = new ArgsOptionParser(creator);
optionParser.parse(Arrays.asList(flatArgs));
- creator.createAndSerializeDerivedPlan(ctsBuild);
+ creator.createAndSerializeDerivedPlan(ctsBuild, abis);
} catch (ConfigurationException e) {
printLine("Error: " + e.getMessage());
printLine(ArgsOptionParser.getOptionHelp(false, creator));
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/device/DeviceInfoCollector.java b/tools/tradefed-host/src/com/android/cts/tradefed/device/DeviceInfoCollector.java
index 3aa57a0..903ac74 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/device/DeviceInfoCollector.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/device/DeviceInfoCollector.java
@@ -15,6 +15,7 @@
*/
package com.android.cts.tradefed.device;
+import com.android.cts.util.AbiUtils;
import com.android.ddmlib.Log;
import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.device.ITestDevice;
@@ -22,6 +23,8 @@
import com.android.tradefed.testtype.InstrumentationTest;
import java.io.File;
+import java.util.HashSet;
+import java.util.Set;
/**
* Collects info from device under test.
@@ -36,16 +39,22 @@
private static final String APK_NAME = "TestDeviceSetup";
public static final String APP_PACKAGE_NAME = "android.tests.devicesetup";
private static final String INSTRUMENTATION_NAME = "android.tests.getinfo.DeviceInfoInstrument";
+ public static final Set<String> IDS = new HashSet<String>();
+ static {
+ for (String abi : AbiUtils.getAbisSupportedByCts()) {
+ IDS.add(AbiUtils.createId(abi, APP_PACKAGE_NAME));
+ }
+ }
/**
* Installs and runs the device info collector instrumentation, and forwards results
- * to the <var>listener</var>
+ * to the listener.
*
* @param device
* @param listener
* @throws DeviceNotAvailableException
*/
- public static void collectDeviceInfo(ITestDevice device, File testApkDir,
+ public static void collectDeviceInfo(ITestDevice device, String abi, File testApkDir,
ITestInvocationListener listener) throws DeviceNotAvailableException {
File apkFile = new File(testApkDir, String.format("%s.apk", APK_NAME));
if (!apkFile.exists()) {
@@ -59,6 +68,7 @@
// no need to collect tests and re-run
instrTest.setRerunMode(false);
instrTest.setPackageName(APP_PACKAGE_NAME);
+ instrTest.setRunName(AbiUtils.createId(abi, APP_PACKAGE_NAME));
instrTest.setRunnerName(INSTRUMENTATION_NAME);
instrTest.run(listener);
}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/result/CtsReportUtil.java b/tools/tradefed-host/src/com/android/cts/tradefed/result/CtsReportUtil.java
deleted file mode 100644
index 97f607e..0000000
--- a/tools/tradefed-host/src/com/android/cts/tradefed/result/CtsReportUtil.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2013 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.tradefed.result;
-
-import java.util.Map;
-
-/**
- * Static utility class for handling Cts Results.
- */
-public class CtsReportUtil {
- private static final String CTS_RESULT_KEY = "CTS_RESULT";
-
- /**
- * Utility method to extract CTS result from test metrics
- * @param testMetrics
- * @return result or null if not found
- */
- public static String getCtsResultFromMetrics(Map<String, String> testMetrics) {
- for (Map.Entry<String, String> entry: testMetrics.entrySet()) {
- if (CTS_RESULT_KEY.equals(entry.getKey())) {
- return entry.getValue();
- }
- }
- return null;
- }
-}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/result/CtsTestLogReporter.java b/tools/tradefed-host/src/com/android/cts/tradefed/result/CtsTestLogReporter.java
index bbdcb05..4a1bfb5 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/result/CtsTestLogReporter.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/result/CtsTestLogReporter.java
@@ -17,6 +17,7 @@
package com.android.cts.tradefed.result;
import com.android.cts.tradefed.device.DeviceInfoCollector;
+import com.android.cts.util.AbiUtils;
import com.android.ddmlib.Log;
import com.android.ddmlib.Log.LogLevel;
import com.android.ddmlib.testrunner.TestIdentifier;
@@ -49,24 +50,28 @@
}
/**
- * {@inheritDoc}
+ * Reports the start of a test run.
+ *
+ * @param id the unique identifier of this test run, generated by
+ * {@link AbiUtils#createId(String, String)}.
+ * @param numTests total number of tests in test run
*/
@Override
- public void testRunStarted(String name, int numTests) {
- if (mCurrentPkgResult != null && !name.equals(mCurrentPkgResult.getAppPackageName())) {
+ public void testRunStarted(String id, int numTests) {
+ if (mCurrentPkgResult != null && !id.equals(mCurrentPkgResult.getId())) {
// display results from previous run
logCompleteRun(mCurrentPkgResult);
}
- mIsDeviceInfoRun = name.equals(DeviceInfoCollector.APP_PACKAGE_NAME);
+ mIsDeviceInfoRun = DeviceInfoCollector.IDS.contains(id);
if (mIsDeviceInfoRun) {
logResult("Collecting device info");
} else {
- if (mCurrentPkgResult == null || !name.equals(mCurrentPkgResult.getAppPackageName())) {
+ if (mCurrentPkgResult == null || !id.equals(mCurrentPkgResult.getId())) {
logResult("-----------------------------------------");
- logResult("Test package %s started", name);
+ logResult("Test package %s started", id);
logResult("-----------------------------------------");
}
- mCurrentPkgResult = mResults.getOrCreatePackage(name);
+ mCurrentPkgResult = mResults.getOrCreatePackage(id);
}
}
@@ -91,7 +96,7 @@
*/
@Override
public void testEnded(TestIdentifier test, Map<String, String> testMetrics) {
- mCurrentPkgResult.reportTestEnded(test);
+ mCurrentPkgResult.reportTestEnded(test, testMetrics);
Test result = mCurrentPkgResult.findTest(test);
String stack = result.getStackTrace() == null ? "" : "\n" + result.getStackTrace();
logResult("%s#%s %s %s", test.getClassName(), test.getTestName(), result.getResult(),
@@ -123,7 +128,7 @@
return;
}
logResult("%s package complete: Passed %d, Failed %d, Not Executed %d",
- pkgResult.getAppPackageName(), pkgResult.countTests(CtsTestStatus.PASS),
+ pkgResult.getId(), pkgResult.countTests(CtsTestStatus.PASS),
pkgResult.countTests(CtsTestStatus.FAIL),
pkgResult.countTests(CtsTestStatus.NOT_EXECUTED));
}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/result/CtsXmlResultReporter.java b/tools/tradefed-host/src/com/android/cts/tradefed/result/CtsXmlResultReporter.java
index 956f1b1..0d21fc6 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/result/CtsXmlResultReporter.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/result/CtsXmlResultReporter.java
@@ -19,7 +19,6 @@
import com.android.cts.tradefed.build.CtsBuildHelper;
import com.android.cts.tradefed.device.DeviceInfoCollector;
import com.android.cts.tradefed.testtype.CtsTest;
-import com.android.cts.tradefed.util.CtsHostStore;
import com.android.ddmlib.Log;
import com.android.ddmlib.Log.LogLevel;
import com.android.ddmlib.testrunner.TestIdentifier;
@@ -48,8 +47,6 @@
import java.io.OutputStream;
import java.util.List;
import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
/**
* Writes results to an XML files in the CTS format.
@@ -104,13 +101,6 @@
private String mSuiteName;
private String mReferenceUrl;
- private static final Pattern mCtsLogPattern = Pattern.compile("(.*)\\+\\+\\+\\+(.*)");
-
- @Option(name = AbiFormatter.FORCE_ABI_STRING,
- description = AbiFormatter.FORCE_ABI_DESCRIPTION,
- importance = Importance.IF_UNSET)
- private String mForceAbi = null;
-
public void setReportDir(File reportDir) {
mReportDir = reportDir;
}
@@ -232,9 +222,9 @@
@Override
- public void testRunStarted(String name, int numTests) {
- mCurrentPkgResult = mResults.getOrCreatePackage(name);
- mIsDeviceInfoRun = name.equals(DeviceInfoCollector.APP_PACKAGE_NAME);
+ public void testRunStarted(String id, int numTests) {
+ mCurrentPkgResult = mResults.getOrCreatePackage(id);
+ mIsDeviceInfoRun = DeviceInfoCollector.IDS.contains(id);
}
/**
@@ -258,33 +248,7 @@
*/
@Override
public void testEnded(TestIdentifier test, Map<String, String> testMetrics) {
- collectCtsResults(test, testMetrics);
- mCurrentPkgResult.reportTestEnded(test);
- }
-
- /**
- * Collect Cts results for both device and host tests to the package result.
- * @param test test ran
- * @param testMetrics test metrics which can contain performance result for device tests
- */
- private void collectCtsResults(TestIdentifier test, Map<String, String> testMetrics) {
- // device test can have performance results in testMetrics
- String perfResult = CtsReportUtil.getCtsResultFromMetrics(testMetrics);
- // host test should be checked in CtsHostStore.
- if (perfResult == null) {
- perfResult = CtsHostStore.removeCtsResult(mDeviceSerial, test.toString());
- }
- if (perfResult != null) {
- // CTS result is passed in Summary++++Details format.
- // Extract Summary and Details, and pass them.
- Matcher m = mCtsLogPattern.matcher(perfResult);
- if (m.find()) {
- mCurrentPkgResult.reportPerformanceResult(test, CtsTestStatus.PASS, m.group(1),
- m.group(2));
- } else {
- logResult("CTS Result unrecognizable:" + perfResult);
- }
- }
+ mCurrentPkgResult.reportTestEnded(test, testMetrics);
}
/**
@@ -377,9 +341,6 @@
serializer.attribute(ns, "endtime", endTime);
serializer.attribute(ns, "version", CTS_RESULT_FILE_VERSION);
serializer.attribute(ns, "suite", mSuiteName);
- if (mForceAbi != null) {
- serializer.attribute(ns, "abi", mForceAbi);
- }
mResults.serialize(serializer);
// TODO: not sure why, but the serializer doesn't like this statement
//serializer.endTag(ns, RESULT_TAG);
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/result/DeviceInfoResult.java b/tools/tradefed-host/src/com/android/cts/tradefed/result/DeviceInfoResult.java
index dd91af0..0c947c3 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/result/DeviceInfoResult.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/result/DeviceInfoResult.java
@@ -358,7 +358,8 @@
DeviceInfoConstants.BUILD_MANUFACTURER, DeviceInfoConstants.BUILD_BOARD,
DeviceInfoConstants.BUILD_DEVICE, DeviceInfoConstants.PRODUCT_NAME,
DeviceInfoConstants.BUILD_ABI, DeviceInfoConstants.BUILD_ABI2,
- DeviceInfoConstants.SCREEN_SIZE);
+ DeviceInfoConstants.BUILD_ABIS, DeviceInfoConstants.BUILD_ABIS_32,
+ DeviceInfoConstants.BUILD_ABIS_64, DeviceInfoConstants.SCREEN_SIZE);
}
private void combineMetrics(Map<String, String> metrics, String... keysToCombine) {
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/result/ITestResultRepo.java b/tools/tradefed-host/src/com/android/cts/tradefed/result/ITestResultRepo.java
index d672f41..19b0540 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/result/ITestResultRepo.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/result/ITestResultRepo.java
@@ -41,7 +41,7 @@
/**
* Get the report directory for given result
* @param sessionId
- * @return
+ * @return A {@link File} representing the report directory for the given sessionId
*/
public File getReportDir(int sessionId);
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/result/ITestSummary.java b/tools/tradefed-host/src/com/android/cts/tradefed/result/ITestSummary.java
index 98494ee..e7041ec 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/result/ITestSummary.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/result/ITestSummary.java
@@ -23,43 +23,43 @@
/**
* @return the session id
*/
- int getId();
+ public int getId();
/**
* @return the starting timestamp, also known as result directory name
*/
- String getTimestamp();
+ public String getTimestamp();
/**
* @return the num of not executed tests
*/
- int getNumIncomplete();
+ public int getNumIncomplete();
/**
* @return the number of failed tests
*/
- int getNumFailed();
+ public int getNumFailed();
/**
* @return the number of passed tests
*/
- int getNumPassed();
+ public int getNumPassed();
/**
* @return the test plan associated with result
*/
- String getTestPlan();
+ public String getTestPlan();
/**
* Return the user-friendly displayed start time stored in result XML.
* <p/>
* Expected format: {@link TimeUtil#getTimestamp()}
*/
- String getStartTime();
+ public String getStartTime();
/**
* @return a comma separated list of device serials associated with result
*/
- String getDeviceSerials();
+ public String getDeviceSerials();
}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/result/IssueReporter.java b/tools/tradefed-host/src/com/android/cts/tradefed/result/IssueReporter.java
index 9d903dd..319dd54 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/result/IssueReporter.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/result/IssueReporter.java
@@ -194,7 +194,7 @@
}
@Override
- public void testRunStarted(String name, int numTests) {
+ public void testRunStarted(String id, int numTests) {
}
@Override
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/result/PlanCreator.java b/tools/tradefed-host/src/com/android/cts/tradefed/result/PlanCreator.java
index d263bc8..713e8fa 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/result/PlanCreator.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/result/PlanCreator.java
@@ -22,6 +22,7 @@
import com.android.cts.tradefed.testtype.ITestPlan;
import com.android.cts.tradefed.testtype.TestPackageRepo;
import com.android.cts.tradefed.testtype.TestPlan;
+import com.android.cts.util.AbiUtils;
import com.android.ddmlib.Log;
import com.android.ddmlib.Log.LogLevel;
import com.android.ddmlib.testrunner.TestIdentifier;
@@ -37,6 +38,7 @@
import java.io.IOException;
import java.util.Collection;
import java.util.LinkedHashSet;
+import java.util.Set;
/**
* Class for creating test plans from CTS result XML.
@@ -88,8 +90,9 @@
* {@link Option} values must all be set before this is called.
* @throws ConfigurationException
*/
- public void createAndSerializeDerivedPlan(CtsBuildHelper build) throws ConfigurationException {
- ITestPlan derivedPlan = createDerivedPlan(build);
+ public void createAndSerializeDerivedPlan(CtsBuildHelper build, Set<String> abis)
+ throws ConfigurationException {
+ ITestPlan derivedPlan = createDerivedPlan(build, abis);
if (derivedPlan != null) {
try {
derivedPlan.serialize(new BufferedOutputStream(new FileOutputStream(mPlanFile)));
@@ -110,25 +113,24 @@
* @return test plan
* @throws ConfigurationException
*/
- public ITestPlan createDerivedPlan(CtsBuildHelper build) throws ConfigurationException {
+ public ITestPlan createDerivedPlan(CtsBuildHelper build, Set<String> abis)
+ throws ConfigurationException {
checkFields(build);
ITestPackageRepo pkgDefRepo = new TestPackageRepo(build.getTestCasesDir(),
- mIncludeKnownFailures);
- ITestPlan derivedPlan = new TestPlan(mPlanName);
+ abis, mIncludeKnownFailures);
+ ITestPlan derivedPlan = new TestPlan(mPlanName, abis);
for (TestPackageResult pkg : mResult.getPackages()) {
Collection<TestIdentifier> filteredTests = pkg.getTestsWithStatus(mResultFilter);
- if (!filteredTests.isEmpty()) {
- String pkgUri = pkg.getAppPackageName();
- ITestPackageDef pkgDef = pkgDefRepo.getTestPackage(pkgUri);
- if (pkgDef != null) {
- Collection<TestIdentifier> excludedTests = new LinkedHashSet<TestIdentifier>(
- pkgDef.getTests());
- excludedTests.removeAll(filteredTests);
- derivedPlan.addPackage(pkgUri);
- derivedPlan.addExcludedTests(pkgUri, excludedTests);
- } else {
- CLog.e("Could not find package %s in repository", pkgUri);
- }
+ String pkgId = pkg.getId();
+ ITestPackageDef pkgDef = pkgDefRepo.getTestPackage(pkgId);
+ if (pkgDef != null) {
+ Collection<TestIdentifier> excludedTests =
+ new LinkedHashSet<TestIdentifier>(pkgDef.getTests());
+ excludedTests.removeAll(filteredTests);
+ derivedPlan.addPackage(pkgId);
+ derivedPlan.addExcludedTests(pkgId, excludedTests);
+ } else {
+ CLog.e("Could not find package %s in repository", pkgId);
}
}
return derivedPlan;
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/result/TestPackageResult.java b/tools/tradefed-host/src/com/android/cts/tradefed/result/TestPackageResult.java
index 015a7ae..29a9bde 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/result/TestPackageResult.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/result/TestPackageResult.java
@@ -15,10 +15,9 @@
*/
package com.android.cts.tradefed.result;
-import android.tests.getinfo.DeviceInfoConstants;
-
-import com.android.cts.tradefed.device.DeviceInfoCollector;
import com.android.cts.tradefed.testtype.CtsTest;
+import com.android.cts.tradefed.util.CtsHostStore;
+import com.android.cts.util.AbiUtils;
import com.android.ddmlib.testrunner.TestIdentifier;
import com.android.tradefed.log.LogUtil.CLog;
@@ -31,34 +30,55 @@
import java.util.Collections;
import java.util.Deque;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
-import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
/**
* Data structure for a CTS test package result.
* <p/>
* Provides methods to serialize to XML.
*/
-class TestPackageResult extends AbstractXmlPullParser {
+class TestPackageResult extends AbstractXmlPullParser {
static final String TAG = "TestPackage";
+
+ public static final String CTS_RESULT_KEY = "CTS_TEST_RESULT";
+
private static final String DIGEST_ATTR = "digest";
private static final String APP_PACKAGE_NAME_ATTR = "appPackageName";
private static final String NAME_ATTR = "name";
+ private static final String ABI_ATTR = "abi";
private static final String ns = CtsXmlResultReporter.ns;
private static final String SIGNATURE_TEST_PKG = "android.tests.sigtest";
+ private static final Pattern mCtsLogPattern = Pattern.compile("(.*)\\+\\+\\+\\+(.*)");
+
+ private String mDeviceSerial;
private String mAppPackageName;
private String mName;
+ private String mAbi;
private String mDigest;
private Map<String, String> mMetrics = new HashMap<String, String>();
+ private Map<TestIdentifier, Map<String, String>> mTestMetrics = new HashMap<TestIdentifier, Map<String, String>>();
private TestSuite mSuiteRoot = new TestSuite(null);
+ public void setDeviceSerial(String deviceSerial) {
+ mDeviceSerial = deviceSerial;
+ }
+
+ public String getDeviceSerial() {
+ return mDeviceSerial;
+ }
+
+ public String getId() {
+ return AbiUtils.createId(getAbi(), getAppPackageName());
+ }
+
public void setAppPackageName(String appPackageName) {
mAppPackageName = appPackageName;
}
@@ -75,6 +95,14 @@
return mName;
}
+ public void setAbi(String abi) {
+ mAbi = abi;
+ }
+
+ public String getAbi() {
+ return mAbi;
+ }
+
public void setDigest(String digest) {
mDigest = digest;
}
@@ -94,7 +122,6 @@
* Adds a test result to this test package
*
* @param testId
- * @param testResult
*/
public Test insertTest(TestIdentifier testId) {
return findTest(testId, true);
@@ -109,8 +136,8 @@
// should never happen
classNameSegments.add("UnknownTestClass");
}
- String testCaseName = classNameSegments.remove(classNameSegments.size()-1);
- return mSuiteRoot.findTest(classNameSegments, testCaseName, testId.getTestName(), insertIfMissing);
+ String testCaseName = classNameSegments.remove(classNameSegments.size()-1);
+ return mSuiteRoot.findTest(classNameSegments, testCaseName, testId.getTestName(), insertIfMissing);
}
@@ -133,6 +160,7 @@
serializer.startTag(ns, TAG);
serializeAttribute(serializer, NAME_ATTR, mName);
serializeAttribute(serializer, APP_PACKAGE_NAME_ATTR, mAppPackageName);
+ serializeAttribute(serializer, ABI_ATTR, mAbi);
serializeAttribute(serializer, DIGEST_ATTR, getDigest());
if (SIGNATURE_TEST_PKG.equals(mName)) {
serializer.attribute(ns, "signatureCheck", "true");
@@ -170,6 +198,7 @@
}
setAppPackageName(getAttribute(parser, APP_PACKAGE_NAME_ATTR));
setName(getAttribute(parser, NAME_ATTR));
+ setAbi(getAttribute(parser, ABI_ATTR));
setDigest(getAttribute(parser, DIGEST_ATTR));
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
@@ -186,10 +215,10 @@
}
/**
- * Return a list of {@link TestIdentifer}s contained in this result with the given status
+ * Return a list of {@link TestIdentifier}s contained in this result with the given status
*
* @param resultFilter the {@link CtsTestStatus} to filter by
- * @return a collection of {@link TestIdentifer}s
+ * @return a collection of {@link TestIdentifier}s
*/
public Collection<TestIdentifier> getTestsWithStatus(CtsTestStatus resultFilter) {
Collection<TestIdentifier> tests = new LinkedList<TestIdentifier>();
@@ -200,63 +229,43 @@
/**
* Populate values in this package result from run metrics
- * @param runResult
+ * @param metrics A map of metrics from the completed test run.
*/
public void populateMetrics(Map<String, String> metrics) {
String name = metrics.get(CtsTest.PACKAGE_NAME_METRIC);
if (name != null) {
setName(name);
}
+ String abi = metrics.get(CtsTest.PACKAGE_ABI_METRIC);
+ if (abi != null) {
+ setAbi(abi);
+ }
String digest = metrics.get(CtsTest.PACKAGE_DIGEST_METRIC);
if (digest != null) {
setDigest(digest);
}
- if (DeviceInfoCollector.APP_PACKAGE_NAME.equals(getAppPackageName())) {
- storeDeviceMetrics(metrics);
- } else {
- mMetrics.putAll(metrics);
- }
- }
+ mMetrics.putAll(metrics);
- /**
- * Check that the provided device info metrics are consistent with the currently stored metrics.
- * <p/>
- * If any inconsistencies occur, logs errors and stores error messages in the metrics map
- *
- * @param metrics
- */
- private void storeDeviceMetrics(Map<String, String> metrics) {
- // TODO centralize all the device metrics handling into a single class
- if (mMetrics.isEmpty()) {
- // nothing to check!
- mMetrics.putAll(metrics);
- return;
- }
- // ensure all the metrics we expect to be identical actually are
- checkMetrics(metrics, DeviceInfoConstants.BUILD_FINGERPRINT,
- DeviceInfoConstants.BUILD_MODEL, DeviceInfoConstants.BUILD_BRAND,
- DeviceInfoConstants.BUILD_MANUFACTURER, DeviceInfoConstants.BUILD_BOARD,
- DeviceInfoConstants.BUILD_DEVICE, DeviceInfoConstants.PRODUCT_NAME,
- DeviceInfoConstants.BUILD_ABI, DeviceInfoConstants.BUILD_ABI2,
- DeviceInfoConstants.SCREEN_SIZE);
- }
-
- private void checkMetrics(Map<String, String> metrics, String... keysToCheck) {
- Set<String> keyCheckSet = new HashSet<String>();
- Collections.addAll(keyCheckSet, keysToCheck);
- for (Map.Entry<String, String> metricEntry : metrics.entrySet()) {
- String currentValue = mMetrics.get(metricEntry.getKey());
- if (keyCheckSet.contains(metricEntry.getKey()) && currentValue != null
- && !metricEntry.getValue().equals(currentValue)) {
- CLog.e("Inconsistent info collected from devices. "
- + "Current result has %s='%s', Received '%s'. Are you sharding or " +
- "resuming a test run across different devices and/or builds?",
- metricEntry.getKey(), currentValue, metricEntry.getValue());
- mMetrics.put(metricEntry.getKey(),
- String.format("ERROR: Inconsistent results: %s, %s",
- metricEntry.getValue(), currentValue));
- } else {
- mMetrics.put(metricEntry.getKey(), metricEntry.getValue());
+ // Collect performance results
+ for (TestIdentifier test : mTestMetrics.keySet()) {
+ // device test can have performance results in test metrics
+ String perfResult = mTestMetrics.get(test).get(CTS_RESULT_KEY);
+ // host test should be checked in CtsHostStore.
+ if (perfResult == null) {
+ perfResult = CtsHostStore.removeCtsResult(mDeviceSerial, mAbi, test.toString());
+ }
+ if (perfResult != null) {
+ // CTS result is passed in Summary++++Details format.
+ // Extract Summary and Details, and pass them.
+ Matcher m = mCtsLogPattern.matcher(perfResult);
+ if (m.find()) {
+ Test result = findTest(test);
+ result.setResultStatus(CtsTestStatus.PASS);
+ result.setSummary(m.group(1));
+ result.setDetails(m.group(2));
+ } else {
+ CLog.e("CTS Result unrecognizable:" + perfResult);
+ }
}
}
}
@@ -275,29 +284,22 @@
}
/**
- * report performance result
- * @param test
- * @param status
- * @param perf
- */
- public void reportPerformanceResult(TestIdentifier test, CtsTestStatus status, String summary, String details) {
- Test result = findTest(test);
- result.setResultStatus(status);
- result.setSummary(summary);
- result.setDetails(details);
- }
-
- /**
* Report that the given test has completed.
*
- * @param test
+ * @param test The {@link TestIdentifier} of the completed test.
+ * @param testMetrics A map holding metrics about the completed test, if any.
*/
- public void reportTestEnded(TestIdentifier test) {
+ public void reportTestEnded(TestIdentifier test, Map<String, String> testMetrics) {
Test result = findTest(test);
if (!result.getResult().equals(CtsTestStatus.FAIL)) {
result.setResultStatus(CtsTestStatus.PASS);
}
result.updateEndTime();
+ if (mTestMetrics.containsKey(test)) {
+ CLog.e("Test metrics already contains key: " + test);
+ }
+ mTestMetrics.put(test, testMetrics);
+ CLog.i("Test metrics:" + testMetrics);
}
/**
@@ -311,9 +313,10 @@
}
/**
- * @return
+ * @return A map holding the metrics from the test run.
*/
public Map<String, String> getMetrics() {
return mMetrics;
}
+
}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/result/TestResults.java b/tools/tradefed-host/src/com/android/cts/tradefed/result/TestResults.java
index 2f9eadd..1355ad7 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/result/TestResults.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/result/TestResults.java
@@ -16,6 +16,7 @@
package com.android.cts.tradefed.result;
import com.android.cts.tradefed.build.CtsBuildProvider;
+import com.android.cts.util.AbiUtils;
import com.android.tradefed.log.LogUtil.CLog;
import org.kxml2.io.KXmlSerializer;
@@ -49,7 +50,7 @@
static final String NOT_EXECUTED_ATTR = "notExecuted";
static final String FAILED_ATTR = "failed";
- private Map<String, TestPackageResult> mPackageMap =
+ private Map<String, TestPackageResult> mPackageResults =
new LinkedHashMap<String, TestPackageResult>();
private DeviceInfoResult mDeviceInfo = new DeviceInfoResult();
@@ -68,10 +69,10 @@
TestPackageResult.TAG)) {
TestPackageResult pkg = new TestPackageResult();
pkg.parse(parser);
- if (pkg.getAppPackageName() != null) {
- mPackageMap.put(pkg.getAppPackageName(), pkg);
+ if (pkg.getId() != null) {
+ mPackageResults.put(pkg.getId(), pkg);
} else {
- CLog.w("Found package with no app package name");
+ CLog.w("Found package with no id");
}
}
eventType = parser.next();
@@ -82,17 +83,16 @@
* @return the list of {@link TestPackageResult}.
*/
public Collection<TestPackageResult> getPackages() {
- return mPackageMap.values();
+ return mPackageResults.values();
}
/**
* Count the number of tests with given status
- * @param pass
- * @return
+ * @param status
*/
public int countTests(CtsTestStatus status) {
int total = 0;
- for (TestPackageResult result : mPackageMap.values()) {
+ for (TestPackageResult result : mPackageResults.values()) {
total += result.countTests(status);
}
return total;
@@ -109,7 +109,7 @@
serializeHostInfo(serializer);
serializeTestSummary(serializer);
// sort before serializing
- List<TestPackageResult> pkgs = new ArrayList<TestPackageResult>(mPackageMap.values());
+ List<TestPackageResult> pkgs = new ArrayList<TestPackageResult>(mPackageResults.values());
Collections.sort(pkgs, new PkgComparator());
for (TestPackageResult r : pkgs) {
r.serialize(serializer);
@@ -174,27 +174,25 @@
private static class PkgComparator implements Comparator<TestPackageResult> {
- /**
- * {@inheritDoc}
- */
@Override
- public int compare(TestPackageResult o1, TestPackageResult o2) {
- return o1.getAppPackageName().compareTo(o2.getAppPackageName());
+ public int compare(TestPackageResult lhs, TestPackageResult rhs) {
+ return lhs.getId().compareTo(rhs.getId());
}
-
}
/**
- * Return existing package with given app package name. If not found, create a new one.
- * @param name
+ * Return existing package with given id. If not found, create a new one.
+ * @param id
* @return
*/
- public TestPackageResult getOrCreatePackage(String appPackageName) {
- TestPackageResult pkgResult = mPackageMap.get(appPackageName);
+ public TestPackageResult getOrCreatePackage(String id) {
+ TestPackageResult pkgResult = mPackageResults.get(id);
if (pkgResult == null) {
pkgResult = new TestPackageResult();
- pkgResult.setAppPackageName(appPackageName);
- mPackageMap.put(appPackageName, pkgResult);
+ String[] parts = AbiUtils.parseId(id);
+ pkgResult.setAbi(parts[0]);
+ pkgResult.setAppPackageName(parts[1]);
+ mPackageResults.put(id, pkgResult);
}
return pkgResult;
}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/Abi.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/Abi.java
new file mode 100644
index 0000000..926e14b
--- /dev/null
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/Abi.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2014 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.tradefed.testtype;
+
+import com.android.tradefed.testtype.IAbi;
+/**
+ * A class representing an ABI.
+ */
+public class Abi implements IAbi {
+
+ private String mName;
+ private String mBitness;
+
+ public Abi(String name, String bitness) {
+ mName = name;
+ mBitness = bitness;
+ }
+
+ @Override
+ public String getName() {
+ return mName;
+ }
+
+ @Override
+ public String getBitness() {
+ return mBitness;
+ }
+
+}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/AccessibilityServiceTestRunner.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/AccessibilityServiceTestRunner.java
index 4cfd263..eafd608 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/AccessibilityServiceTestRunner.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/AccessibilityServiceTestRunner.java
@@ -16,8 +16,8 @@
package com.android.cts.tradefed.testtype;
-import com.android.cts.tradefed.build.CtsBuildHelper;
-import com.android.tradefed.build.IBuildInfo;
+import com.android.cts.util.AbiUtils;
+import com.android.ddmlib.Log;
import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.result.ITestInvocationListener;
import com.android.tradefed.util.FileUtil;
@@ -39,7 +39,10 @@
* maintained so cts-tradefed can run against older CTS builds that still
* require this class.
*/
-public class AccessibilityServiceTestRunner extends InstrumentationApkTest {
+@Deprecated
+public class AccessibilityServiceTestRunner extends CtsInstrumentationApkTest {
+
+ private static final String LOG_TAG = AccessibilityServiceTestRunner.class.getSimpleName();
private static final String DELEGATING_ACCESSIBLITY_SERVICE_PACKAGE_NAME =
"android.accessibilityservice.delegate";
@@ -50,14 +53,6 @@
private static final String DELEGATING_ACCESSIBLITY_SERVICE_APK =
"CtsDelegatingAccessibilityService.apk";
- private CtsBuildHelper mCtsBuild;
-
- @Override
- public void setBuild(IBuildInfo build) {
- super.setBuild(build);
- mCtsBuild = CtsBuildHelper.createBuildHelper(build);
- }
-
@Override
public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
beforeTest();
@@ -77,7 +72,8 @@
private void installApkAndAssert(String apkName) throws DeviceNotAvailableException {
File file = FileUtil.getFileForPath(mCtsBuild.getTestCasesDir(), apkName);
- String errorMessage = getDevice().installPackage(file, true);
+ String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
+ String errorMessage = getDevice().installPackage(file, true, options);
TestCase.assertNull("Error installing: " + apkName, errorMessage);
}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/AccessibilityTestRunner.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/AccessibilityTestRunner.java
index 2a4239a..9ba4109 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/AccessibilityTestRunner.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/AccessibilityTestRunner.java
@@ -16,9 +16,9 @@
package com.android.cts.tradefed.testtype;
-import com.android.cts.tradefed.build.CtsBuildHelper;
import com.android.cts.tradefed.targetprep.SettingsToggler;
-import com.android.tradefed.build.IBuildInfo;
+import com.android.cts.util.AbiUtils;
+import com.android.ddmlib.Log;
import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.device.ITestDevice;
import com.android.tradefed.result.ITestInvocationListener;
@@ -37,7 +37,9 @@
* these services, running the tests, disabling the services, and removing
* the accessibility services package.
*/
-public class AccessibilityTestRunner extends InstrumentationApkTest {
+public class AccessibilityTestRunner extends CtsInstrumentationApkTest {
+
+ private static final String LOG_TAG = AccessibilityTestRunner.class.getSimpleName();
private static final String SOME_ACCESSIBLITY_SERVICES_PACKAGE_NAME =
"android.view.accessibility.services";
@@ -51,14 +53,6 @@
private static final String SOME_ACCESSIBLITY_SERVICES_APK =
"CtsSomeAccessibilityServices.apk";
- private CtsBuildHelper mCtsBuild;
-
- @Override
- public void setBuild(IBuildInfo build) {
- super.setBuild(build);
- mCtsBuild = CtsBuildHelper.createBuildHelper(build);
- }
-
@Override
public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
beforeTest();
@@ -78,7 +72,8 @@
private void installApkAndAssert(String apkName) throws DeviceNotAvailableException {
File file = FileUtil.getFileForPath(mCtsBuild.getTestCasesDir(), apkName);
- String errorMessage = getDevice().installPackage(file, true);
+ String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
+ String errorMessage = getDevice().installPackage(file, true, options);
TestCase.assertNull("Error installing: " + apkName, errorMessage);
}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/InstrumentationApkTest.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/CtsInstrumentationApkTest.java
similarity index 74%
rename from tools/tradefed-host/src/com/android/cts/tradefed/testtype/InstrumentationApkTest.java
rename to tools/tradefed-host/src/com/android/cts/tradefed/testtype/CtsInstrumentationApkTest.java
index 4195dda..6765305 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/InstrumentationApkTest.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/CtsInstrumentationApkTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011 The Android Open Source Project
+ * Copyright (C) 2014 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.
@@ -16,18 +16,15 @@
package com.android.cts.tradefed.testtype;
import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.cts.util.AbiUtils;
import com.android.ddmlib.Log;
import com.android.tradefed.build.IBuildInfo;
-import com.android.tradefed.config.Option;
-import com.android.tradefed.config.Option.Importance;
import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.device.ITestDevice;
import com.android.tradefed.result.ITestInvocationListener;
+import com.android.tradefed.testtype.IAbi;
import com.android.tradefed.testtype.IBuildReceiver;
import com.android.tradefed.testtype.InstrumentationTest;
-import com.android.tradefed.util.AbiFormatter;
-
-import junit.framework.Assert;
import java.io.File;
import java.io.FileNotFoundException;
@@ -35,25 +32,32 @@
import java.util.Collection;
/**
- * A {@link InstrumentationTest} that will install CTS apks
+ * An {@link InstrumentationTest} that will install CTS apks
* before test execution, and uninstall on execution completion.
*/
-public class InstrumentationApkTest extends InstrumentationTest implements IBuildReceiver {
+public class CtsInstrumentationApkTest extends InstrumentationTest implements IBuildReceiver {
- private static final String LOG_TAG = "InstrumentationApkTest";
+ private static final String LOG_TAG = "CtsInstrumentationApkTest";
/** the file names of the CTS apks to install */
private Collection<String> mInstallFileNames = new ArrayList<String>();
private Collection<String> mUninstallPackages = new ArrayList<String>();
+ protected CtsBuildHelper mCtsBuild = null;
+ protected IAbi mAbi = null;
- private CtsBuildHelper mCtsBuild = null;
+ /**
+ * @param abi the ABI to run the test on
+ */
+ public void setAbi(IAbi abi) {
+ mAbi = abi;
+ }
/**
* {@inheritDoc}
*/
@Override
public void setBuild(IBuildInfo build) {
- mCtsBuild = CtsBuildHelper.createBuildHelper(build);
+ mCtsBuild = CtsBuildHelper.createBuildHelper(build);
}
/**
@@ -76,11 +80,11 @@
ITestDevice mTestDevice = getDevice();
if (mTestDevice == null) {
- Log.e(LOG_TAG, String.format("Missing device."));
+ Log.e(LOG_TAG, "Missing device.");
return;
}
if (mCtsBuild == null) {
- Log.e(LOG_TAG, String.format("Missing build %s", mCtsBuild));
+ Log.e(LOG_TAG, "Missing build");
return;
}
@@ -90,15 +94,7 @@
try {
File apkFile = mCtsBuild.getTestApp(apkFileName);
String errorCode = null;
- String[] options = {};
- String forceAbi = getForceAbi();
- if (forceAbi != null) {
- String abi = AbiFormatter.getDefaultAbi(mTestDevice, forceAbi);
- if (abi != null) {
- options = new String[]{String.format("--abi %s ", abi)};
- }
- }
- Log.d(LOG_TAG, "installPackage options: " + options);
+ String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
errorCode = mTestDevice.installPackage(apkFile, true, options);
if (errorCode != null) {
Log.e(LOG_TAG, String.format("Failed to install %s on %s. Reason: %s",
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/CtsTest.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/CtsTest.java
index 2e3fadc..67f573d 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/CtsTest.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/CtsTest.java
@@ -20,13 +20,13 @@
import com.android.cts.tradefed.device.DeviceInfoCollector;
import com.android.cts.tradefed.result.CtsTestStatus;
import com.android.cts.tradefed.result.PlanCreator;
+import com.android.cts.util.AbiUtils;
import com.android.ddmlib.Log;
import com.android.ddmlib.Log.LogLevel;
import com.android.ddmlib.testrunner.TestIdentifier;
import com.android.tradefed.build.IBuildInfo;
import com.android.tradefed.config.ConfigurationException;
import com.android.tradefed.config.Option;
-import com.android.tradefed.config.OptionSetter;
import com.android.tradefed.config.Option.Importance;
import com.android.tradefed.config.OptionCopier;
import com.android.tradefed.device.DeviceNotAvailableException;
@@ -42,7 +42,6 @@
import com.android.tradefed.testtype.IRemoteTest;
import com.android.tradefed.testtype.IResumableTest;
import com.android.tradefed.testtype.IShardableTest;
-import com.android.tradefed.testtype.InstrumentationTest;
import com.android.tradefed.util.AbiFormatter;
import com.android.tradefed.util.RunUtil;
import com.android.tradefed.util.xml.AbstractXmlParser.ParseException;
@@ -83,6 +82,7 @@
public static final String RUN_KNOWN_FAILURES_OPTION = "run-known-failures";
public static final String PACKAGE_NAME_METRIC = "packageName";
+ public static final String PACKAGE_ABI_METRIC = "packageAbi";
public static final String PACKAGE_DIGEST_METRIC = "packageDigest";
private ITestDevice mDevice;
@@ -207,7 +207,7 @@
* Return the test run name that should be used for the TestPackage
*/
String getTestRunName() {
- return mPackageDef.getUri();
+ return mPackageDef.getId();
}
}
@@ -434,7 +434,7 @@
// packages are using the same prerequisite apk (I'm looking at you, CtsTestStubs!)
Collection<String> prerequisiteApks = getPrerequisiteApks(mRemainingTestPkgs);
Collection<String> uninstallPackages = getPrerequisitePackageNames(mRemainingTestPkgs);
- ResultFilter filter = new ResultFilter(listener, mRemainingTestPkgs);
+ List<ResultFilter> filters = new ArrayList<ResultFilter>(mRemainingTestPkgs.size());
try {
installPrerequisiteApks(prerequisiteApks);
@@ -450,45 +450,18 @@
while (!mRemainingTestPkgs.isEmpty()) {
TestPackage knownTests = mRemainingTestPkgs.get(0);
+ ResultFilter filter = new ResultFilter(listener, knownTests);
+ filters.add(filter);
IRemoteTest test = knownTests.getTestForPackage();
-
- if (mForceAbi != null) {
- OptionSetter optionSetter = null;
- boolean hasField = false;
- try {
- optionSetter = new OptionSetter(test);
- if (optionSetter.getTypeForOption(AbiFormatter.FORCE_ABI_STRING)
- .equals("string")) {
- hasField = true;
- }
- } catch (ConfigurationException e) {
- // ignore if there are tests not taking force-abi option
- // for example native test do not need this option.
- }
- if (hasField) {
- try{
- optionSetter.setOptionValue(AbiFormatter.FORCE_ABI_STRING, mForceAbi);
- } catch (ConfigurationException e) {
- CLog.e(e);
- throw new RuntimeException(e);
- }
- }
- }
-
- if (test instanceof IDeviceTest) {
- ((IDeviceTest) test).setDevice(getDevice());
- }
if (test instanceof IBuildReceiver) {
((IBuildReceiver) test).setBuild(mBuildInfo);
}
- // setForceAbi should be exposed on device test.
- // This is not the best fix, but works.
- if (test instanceof InstrumentationTest) {
- ((InstrumentationTest)test).setForceAbi(mForceAbi);
+ if (test instanceof IDeviceTest) {
+ ((IDeviceTest) test).setDevice(getDevice());
}
- if (test instanceof DeqpTest) {
- ((DeqpTest)test).setCollectLogs(mCollectDeqpLogs);
+ if (test instanceof DeqpTestRunner) {
+ ((DeqpTestRunner)test).setCollectLogs(mCollectDeqpLogs);
}
forwardPackageDetails(knownTests.getPackageDef(), listener);
@@ -520,7 +493,9 @@
CLog.e(e);
throw e;
} finally {
- filter.reportUnexecutedTests();
+ for (ResultFilter filter : filters) {
+ filter.reportUnexecutedTests();
+ }
}
}
@@ -538,21 +513,19 @@
"CtsViewTestCases",
"CtsWidgetTestCases" );
long intervalInMSec = mRebootIntervalMin * 60 * 1000;
- if (mDevice.getSerialNumber().startsWith("emulator-")) {
+ if (mDisableReboot || mDevice.getSerialNumber().startsWith("emulator-")) {
return;
}
- if (!mDisableReboot) {
- long currentTime = System.currentTimeMillis();
- if (((currentTime - mPrevRebootTime) > intervalInMSec) ||
- rebootAfterList.contains(testFinished.getPackageDef().getName()) ||
- rebootBeforeList.contains(testToRun.getPackageDef().getName()) ) {
- Log.i(LOG_TAG,
- String.format("Rebooting after running package %s, before package %s",
- testFinished.getPackageDef().getName(),
- testToRun.getPackageDef().getName()));
- rebootDevice();
- mPrevRebootTime = System.currentTimeMillis();
- }
+ long currentTime = System.currentTimeMillis();
+ if (((currentTime - mPrevRebootTime) > intervalInMSec) ||
+ rebootAfterList.contains(testFinished.getPackageDef().getName()) ||
+ rebootBeforeList.contains(testToRun.getPackageDef().getName()) ) {
+ Log.i(LOG_TAG,
+ String.format("Rebooting after running package %s, before package %s",
+ testFinished.getPackageDef().getName(),
+ testToRun.getPackageDef().getName()));
+ rebootDevice();
+ mPrevRebootTime = System.currentTimeMillis();
}
}
@@ -592,13 +565,13 @@
}
/**
* Build the list of test packages to run
+ * @throws DeviceNotAvailableException
*/
- private List<TestPackage> buildTestsToRun() {
+ private List<TestPackage> buildTestsToRun() throws DeviceNotAvailableException {
List<TestPackage> testPkgList = new LinkedList<TestPackage>();
try {
ITestPackageRepo testRepo = createTestCaseRepo();
Collection<ITestPackageDef> testPkgDefs = getTestPackagesToRun(testRepo);
-
for (ITestPackageDef testPkgDef : testPkgDefs) {
addTestPackage(testPkgList, testPkgDef);
}
@@ -636,9 +609,10 @@
* @throws ParseException
* @throws FileNotFoundException
* @throws ConfigurationException
+ * @throws DeviceNotAvailableException
*/
private Collection<ITestPackageDef> getTestPackagesToRun(ITestPackageRepo testRepo)
- throws ParseException, FileNotFoundException, ConfigurationException {
+ throws ParseException, FileNotFoundException, ConfigurationException, DeviceNotAvailableException {
// use LinkedHashSet to have predictable iteration order
Set<ITestPackageDef> testPkgDefs = new LinkedHashSet<ITestPackageDef>();
if (mPlanName != null) {
@@ -646,55 +620,60 @@
File ctsPlanFile = mCtsBuild.getTestPlanFile(mPlanName);
ITestPlan plan = createPlan(mPlanName);
plan.parse(createXmlStream(ctsPlanFile));
- for (String uri : plan.getTestUris()) {
- if (!mExcludedPackageNames.contains(uri)) {
- ITestPackageDef testPackage = testRepo.getTestPackage(uri);
- if (testPackage != null) {
- testPackage.setExcludedTestFilter(plan.getExcludedTestFilter(uri));
- testPkgDefs.add(testPackage);
+ for (String id : plan.getTestIds()) {
+ if (!mExcludedPackageNames.contains(AbiUtils.parseId(id)[1])) {
+ ITestPackageDef testPackageDef = testRepo.getTestPackage(id);
+ if (testPackageDef != null) {
+ testPackageDef.setTestFilter(plan.getTestFilter(id));
+ testPkgDefs.add(testPackageDef);
} else {
- CLog.e("Could not find test package uri %s referenced in plan %s", uri,
+ CLog.e("Could not find test package id %s referenced in plan %s", id,
mPlanName);
}
}
}
} else if (mPackageNames.size() > 0){
Log.i(LOG_TAG, String.format("Executing CTS test packages %s", mPackageNames));
- for (String uri : mPackageNames) {
- ITestPackageDef testPackage = testRepo.getTestPackage(uri);
- if (testPackage != null) {
- testPkgDefs.add(testPackage);
+ for (String name : mPackageNames) {
+ Set<ITestPackageDef> testPackages = testRepo.getTestPackages(name);
+ if (!testPackages.isEmpty()) {
+ testPkgDefs.addAll(testPackages);
} else {
throw new IllegalArgumentException(String.format(
"Could not find test package %s. " +
- "Use 'list packages' to see available packages." , uri));
+ "Use 'list packages' to see available packages." , name));
}
}
} else if (mClassName != null) {
Log.i(LOG_TAG, String.format("Executing CTS test class %s", mClassName));
- // try to find package to run from class name
- String packageUri = testRepo.findPackageForTest(mClassName);
- if (packageUri != null) {
- ITestPackageDef testPackageDef = testRepo.getTestPackage(packageUri);
- testPackageDef.setClassName(mClassName, mMethodName);
- testPkgDefs.add(testPackageDef);
+ // try to find packages to run from class name
+ Set<String> packageIds = testRepo.findPackageIdsForTest(mClassName);
+ if (!packageIds.isEmpty()) {
+ for (String packageId: packageIds) {
+ ITestPackageDef testPackageDef = testRepo.getTestPackage(packageId);
+ if (testPackageDef != null) {
+ testPackageDef.setClassName(mClassName, mMethodName);
+ testPkgDefs.add(testPackageDef);
+ }
+ }
} else {
Log.logAndDisplay(LogLevel.WARN, LOG_TAG, String.format(
"Could not find package for test class %s", mClassName));
}
} else if (mContinueSessionId != null) {
// create an in-memory derived plan that contains the notExecuted tests from previous
- // session
- // use timestamp as plan name so it will hopefully be unique
+ // session use timestamp as plan name so it will hopefully be unique
String uniquePlanName = Long.toString(System.currentTimeMillis());
PlanCreator planCreator = new PlanCreator(uniquePlanName, mContinueSessionId,
CtsTestStatus.NOT_EXECUTED);
ITestPlan plan = createPlan(planCreator);
- for (String uri : plan.getTestUris()) {
- if (!mExcludedPackageNames.contains(uri)) {
- ITestPackageDef testPackage = testRepo.getTestPackage(uri);
- testPackage.setExcludedTestFilter(plan.getExcludedTestFilter(uri));
- testPkgDefs.add(testPackage);
+ for (String id : plan.getTestIds()) {
+ if (!mExcludedPackageNames.contains(AbiUtils.parseId(id)[1])) {
+ ITestPackageDef testPackageDef = testRepo.getTestPackage(id);
+ if (testPackageDef != null) {
+ testPackageDef.setTestFilter(plan.getTestFilter(id));
+ testPkgDefs.add(testPackageDef);
+ }
}
}
} else {
@@ -735,6 +714,9 @@
}
/**
+ * FIXME eventually this should be removed once we get rid of CtsTestStubs, any other
+ * prerequisite apks should be installed by the test runner
+ *
* Install the collection of test apk file names
*
* @param prerequisiteApks
@@ -746,13 +728,8 @@
try {
File apkFile = mCtsBuild.getTestApp(apkName);
String errorCode = null;
- String[] options = {};
- if (mForceAbi != null) {
- String abi = AbiFormatter.getDefaultAbi(getDevice(), mForceAbi);
- if (abi != null) {
- options = new String[]{String.format("--abi %s ", abi)};
- }
- }
+ String abi = AbiFormatter.getDefaultAbi(getDevice(), mForceAbi);
+ String[] options = {AbiUtils.createAbiFlag(abi)};
errorCode = getDevice().installPackage(apkFile, true, options);
if (errorCode != null) {
CLog.e("Failed to install %s. Reason: %s", apkName, errorCode);
@@ -784,9 +761,14 @@
return null;
}
checkFields();
- List<TestPackage> allTests = buildTestsToRun();
+ List<TestPackage> allTests = null;
+ try {
+ allTests = buildTestsToRun();
+ } catch (DeviceNotAvailableException e) {
+ e.printStackTrace();
+ }
- if (allTests.size() <= 1) {
+ if (allTests == null || allTests.size() <= 1) {
Log.w(LOG_TAG, "no tests to shard!");
return null;
}
@@ -821,7 +803,8 @@
void collectDeviceInfo(ITestDevice device, CtsBuildHelper ctsBuild,
ITestInvocationListener listener) throws DeviceNotAvailableException {
if (!mSkipDeviceInfo) {
- DeviceInfoCollector.collectDeviceInfo(device, ctsBuild.getTestCasesDir(), listener);
+ String abi = AbiFormatter.getDefaultAbi(device, "");
+ DeviceInfoCollector.collectDeviceInfo(device, abi, ctsBuild.getTestCasesDir(), listener);
}
}
@@ -829,18 +812,39 @@
* Factory method for creating a {@link ITestPackageRepo}.
* <p/>
* Exposed for unit testing
+ * @throws DeviceNotAvailableException
*/
- ITestPackageRepo createTestCaseRepo() {
- return new TestPackageRepo(mCtsBuild.getTestCasesDir(), mIncludeKnownFailures);
+ ITestPackageRepo createTestCaseRepo() throws DeviceNotAvailableException {
+ return new TestPackageRepo(mCtsBuild.getTestCasesDir(), getAbis(), mIncludeKnownFailures);
}
/**
* Factory method for creating a {@link TestPlan}.
* <p/>
* Exposed for unit testing
+ * @throws DeviceNotAvailableException
*/
- ITestPlan createPlan(String planName) {
- return new TestPlan(planName);
+ ITestPlan createPlan(String planName) throws DeviceNotAvailableException {
+ return new TestPlan(planName, getAbis());
+ }
+
+ /**
+ * Gets the set of ABIs supported by both CTS and the device under test
+ * <p/>
+ * Exposed for unit testing
+ * @return The set of ABIs to run the tests on
+ * @throws DeviceNotAvailableException
+ */
+ Set<String> getAbis() throws DeviceNotAvailableException {
+ String bitness = (mForceAbi == null) ? "" : mForceAbi;
+ Set<String> abis = new HashSet<String>();
+ for (String abi : AbiFormatter.getSupportedAbis(mDevice, bitness)) {
+ if (AbiUtils.isAbiSupportedByCts(abi)) {
+ abis.add(abi);
+ }
+ }
+ Log.logAndDisplay(LogLevel.INFO, LOG_TAG, "ABIs: " + abis);
+ return abis;
}
/**
@@ -848,9 +852,11 @@
* <p/>
* Exposed for unit testing
* @throws ConfigurationException
+ * @throws DeviceNotAvailableException
*/
- ITestPlan createPlan(PlanCreator planCreator) throws ConfigurationException {
- return planCreator.createDerivedPlan(mCtsBuild);
+ ITestPlan createPlan(PlanCreator planCreator)
+ throws ConfigurationException, DeviceNotAvailableException {
+ return planCreator.createDerivedPlan(mCtsBuild, getAbis());
}
/**
@@ -907,10 +913,11 @@
* @param listener
*/
private void forwardPackageDetails(ITestPackageDef def, ITestInvocationListener listener) {
- Map<String, String> metrics = new HashMap<String, String>(2);
+ Map<String, String> metrics = new HashMap<String, String>(3);
metrics.put(PACKAGE_NAME_METRIC, def.getName());
+ metrics.put(PACKAGE_ABI_METRIC, def.getAbi().getName());
metrics.put(PACKAGE_DIGEST_METRIC, def.getDigest());
- listener.testRunStarted(def.getUri(), 0);
+ listener.testRunStarted(def.getId(), 0);
listener.testRunEnded(0, metrics);
}
}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DeqpTest.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DeqpTestRunner.java
similarity index 77%
rename from tools/tradefed-host/src/com/android/cts/tradefed/testtype/DeqpTest.java
rename to tools/tradefed-host/src/com/android/cts/tradefed/testtype/DeqpTestRunner.java
index ddb24c2..9077b89 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DeqpTest.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DeqpTestRunner.java
@@ -1,27 +1,19 @@
package com.android.cts.tradefed.testtype;
-import com.android.cts.tradefed.build.CtsBuildHelper;
-import com.android.ddmlib.IShellOutputReceiver;
+import com.android.cts.util.AbiUtils;
import com.android.ddmlib.MultiLineReceiver;
import com.android.ddmlib.testrunner.ITestRunListener;
import com.android.ddmlib.testrunner.TestIdentifier;
-import com.android.tradefed.build.IBuildInfo;
-import com.android.tradefed.config.Option;
import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.log.LogUtil.CLog;
import com.android.tradefed.result.ByteArrayInputStreamSource;
import com.android.tradefed.result.ITestInvocationListener;
import com.android.tradefed.result.LogDataType;
-import com.android.tradefed.testtype.IBuildReceiver;
+import com.android.tradefed.testtype.IAbi;
import com.android.tradefed.testtype.IDeviceTest;
import com.android.tradefed.testtype.IRemoteTest;
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.IOException;
-import java.lang.Thread;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -34,15 +26,17 @@
*
* Supports running drawElements Quality Program tests found under external/deqp.
*/
-public class DeqpTest implements IDeviceTest, IRemoteTest {
+public class DeqpTestRunner implements IDeviceTest, IRemoteTest {
final private int TESTCASE_BATCH_LIMIT = 1000;
private boolean mLogData;
private ITestDevice mDevice;
- private final String mUri;
+ private final String mPackageName;
+ private final String mName;
private Collection<TestIdentifier> mTests;
+ private IAbi mAbi;
private TestIdentifier mCurrentTestId;
private boolean mGotTestResult;
@@ -50,13 +44,21 @@
private ITestInvocationListener mListener;
- public DeqpTest(String uri, Collection<TestIdentifier> tests) {
- mUri = uri;
+ public DeqpTestRunner(String packageName, String name, Collection<TestIdentifier> tests) {
+ mPackageName = packageName;
+ mName = name;
mTests = tests;
mLogData = false;
}
/**
+ * @param abi the ABI to run the test on
+ */
+ public void setAbi(IAbi abi) {
+ mAbi = abi;
+ }
+
+ /**
* Enable or disable raw dEQP test log collection.
*/
public void setCollectLogs(boolean logData) {
@@ -67,14 +69,14 @@
* dEQP instrumentation parser
*/
class InstrumentationParser extends MultiLineReceiver {
- private DeqpTest mDeqpTests;
+ private DeqpTestRunner mDeqpTests;
private Map<String, String> mValues;
private String mCurrentName;
private String mCurrentValue;
- public InstrumentationParser(DeqpTest tests) {
+ public InstrumentationParser(DeqpTestRunner tests) {
mDeqpTests = tests;
}
@@ -83,8 +85,7 @@
*/
@Override
public void processNewLines(String[] lines) {
- for (String line : lines)
- {
+ for (String line : lines) {
if (mValues == null) mValues = new HashMap<String, String>();
if (line.startsWith("INSTRUMENTATION_STATUS_CODE: ")) {
@@ -148,8 +149,7 @@
/**
* Converts dEQP testcase path to TestIdentifier.
*/
- private TestIdentifier pathToIdentifier(String testPath)
- {
+ private TestIdentifier pathToIdentifier(String testPath) {
String[] components = testPath.split("\\.");
String name = components[components.length - 1];
String className = null;
@@ -169,7 +169,8 @@
* Handles beginning of dEQP session.
*/
private void handleBeginSession(Map<String, String> values) {
- mListener.testRunStarted(mUri, mTests.size());
+ String id = AbiUtils.createId(mAbi.getName(), mPackageName);
+ mListener.testRunStarted(id, mTests.size());
}
/**
@@ -283,8 +284,9 @@
public void handleStatus(Map<String, String> values) {
String eventType = values.get("dEQP-EventType");
- if (eventType == null)
+ if (eventType == null) {
return;
+ }
if (eventType.compareTo("BeginSession") == 0) {
handleBeginSession(values);
@@ -327,7 +329,7 @@
}
if (!tests.isEmpty()) {
- HashMap<String, ArrayList<String> > testGroups = new HashMap();
+ HashMap<String, ArrayList<String> > testGroups = new HashMap<>();
// Collect all sub testgroups
for (String test : tests) {
@@ -335,7 +337,7 @@
ArrayList<String> testGroup = testGroups.get(components[0]);
if (testGroup == null) {
- testGroup = new ArrayList();
+ testGroup = new ArrayList<String>();
testGroups.put(components[0], testGroup);
}
@@ -357,10 +359,10 @@
}
/**
- * Generates testacase trie from TestIdentifiers.
+ * Generates testcase trie from TestIdentifiers.
*/
private String generateTestCaseTrie(Collection<TestIdentifier> tests) {
- ArrayList<String> testPaths = new ArrayList();
+ ArrayList<String> testPaths = new ArrayList<String>();
for (TestIdentifier test : tests) {
testPaths.add(test.getClassName() + "." + test.getTestName());
@@ -388,6 +390,7 @@
String instrumentationName =
"com.drawelements.deqp/com.drawelements.deqp.testercore.DeqpInstrumentation";
+ // TODO run the test with the given ABI
String command = "am instrument -w -e deqpLogFileName \"" + logFileName
+ "\" -e deqpCmdLine \"--deqp-caselist-file=" + caseListFileName + " "
+ "--deqp-gl-config-name=rgba8888d24s8\" "
@@ -398,39 +401,74 @@
}
/**
+ * Check if device supports OpenGL ES version.
+ */
+ static boolean isSupportedGles(ITestDevice device, int requiredMajorVersion, int requiredMinorVersion) throws DeviceNotAvailableException {
+ String roOpenglesVersion = device.getProperty("ro.opengles.version");
+
+ if (roOpenglesVersion == null)
+ return false;
+
+ int intValue = Integer.parseInt(roOpenglesVersion);
+
+ int majorVersion = ((intValue & 0xffff0000) >> 16);
+ int minorVersion = (intValue & 0xffff);
+
+ return (majorVersion > requiredMajorVersion)
+ || (majorVersion == requiredMajorVersion && minorVersion >= requiredMinorVersion);
+ }
+
+ /**
* {@inheritDoc}
*/
@Override
public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
mListener = listener;
- while (!mTests.isEmpty()) {
- executeTests(listener);
+ if ((mName.equals( "dEQP-GLES3") && isSupportedGles(mDevice, 3, 0))
+ || (mName.equals("dEQP-GLES31") && isSupportedGles(mDevice, 3, 1))) {
- // Set test to failed if it didn't receive test result
- if (mCurrentTestId != null) {
- Map <String, String> emptyMap = Collections.emptyMap();
+ while (!mTests.isEmpty()) {
+ executeTests(listener);
- if (mLogData && mCurrentTestLog != null && mCurrentTestLog.length() > 0) {
- ByteArrayInputStreamSource source
- = new ByteArrayInputStreamSource(mCurrentTestLog.getBytes());
+ // Set test to failed if it didn't receive test result
+ if (mCurrentTestId != null) {
+ Map <String, String> emptyMap = Collections.emptyMap();
- mListener.testLog(mCurrentTestId.getClassName() + "."
- + mCurrentTestId.getTestName(), LogDataType.XML, source);
+ if (mLogData && mCurrentTestLog != null && mCurrentTestLog.length() > 0) {
+ ByteArrayInputStreamSource source
+ = new ByteArrayInputStreamSource(mCurrentTestLog.getBytes());
- source.cancel();
+ mListener.testLog(mCurrentTestId.getClassName() + "."
+ + mCurrentTestId.getTestName(), LogDataType.XML, source);
+
+ source.cancel();
+ }
+
+
+ if (!mGotTestResult) {
+ mListener.testFailed(ITestRunListener.TestFailure.ERROR, mCurrentTestId,
+ "Log doesn't contain test result");
+ }
+
+ mListener.testEnded(mCurrentTestId, emptyMap);
+ mCurrentTestId = null;
+ mListener.testRunEnded(0, emptyMap);
}
-
-
- if (!mGotTestResult) {
- mListener.testFailed(ITestRunListener.TestFailure.ERROR, mCurrentTestId,
- "Log doesn't contain test result");
- }
-
- mListener.testEnded(mCurrentTestId, emptyMap);
- mCurrentTestId = null;
- mListener.testRunEnded(0, emptyMap);
}
+ } else {
+ /* Pass all tests if OpenGL ES version is not supported */
+ Map <String, String> emptyMap = Collections.emptyMap();
+ String id = AbiUtils.createId(mAbi.getName(), mPackageName);
+ mListener.testRunStarted(id, mTests.size());
+
+ for (TestIdentifier test : mTests) {
+ CLog.d("Skipping test '%s', Opengl ES version not supported", test.toString());
+ mListener.testStarted(test);
+ mListener.testEnded(test, emptyMap);
+ }
+
+ mListener.testRunEnded(0, emptyMap);
}
}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DisplayTestRunner.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DisplayTestRunner.java
index 4c83aa9..59bfcf8 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DisplayTestRunner.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DisplayTestRunner.java
@@ -25,7 +25,7 @@
* Secure settings cannot be changed from device CTS tests since system signature permission is
* required. Such settings can be modified by the shell user, so a host side test is used.
*/
-public class DisplayTestRunner extends InstrumentationApkTest {
+public class DisplayTestRunner extends CtsInstrumentationApkTest {
private static final String OVERLAY_DISPLAY_DEVICES_SETTING_NAME = "overlay_display_devices";
// Use a non-standard pattern, must match values in tests/tests/display/.../DisplayTest.java
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/GeeTest.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/GeeTest.java
index 035b4a2..9bfe151 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/GeeTest.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/GeeTest.java
@@ -23,6 +23,7 @@
import com.android.tradefed.device.ITestDevice;
import com.android.tradefed.log.LogUtil.CLog;
import com.android.tradefed.result.ITestInvocationListener;
+import com.android.tradefed.testtype.IAbi;
import com.android.tradefed.testtype.IBuildReceiver;
import com.android.tradefed.testtype.IDeviceTest;
import com.android.tradefed.testtype.IRemoteTest;
@@ -47,6 +48,7 @@
private CtsBuildHelper mCtsBuild;
private ITestDevice mDevice;
+ private IAbi mAbi;
private final String mPackageName;
private final String mExeName;
@@ -56,6 +58,13 @@
mExeName = exeName;
}
+ /**
+ * @param abi The ABI to run the test on
+ */
+ public void setAbi(IAbi abi) {
+ mAbi = abi;
+ }
+
@Override
public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
if (installTest()) {
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/GeeTestResultParser.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/GeeTestResultParser.java
index c01da20..67bef35 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/GeeTestResultParser.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/GeeTestResultParser.java
@@ -99,7 +99,7 @@
private long mTotalRunTime = 0;
private boolean mTestInProgress = false;
private boolean mTestRunInProgress = false;
- private final String mTestRunName;
+ private final String mTestRunId;
private final Collection<ITestRunListener> mTestListeners;
/** Fake adding a package prefix if the test listener needs it. */
@@ -200,24 +200,24 @@
/**
* Creates the GTestResultParser.
*
- * @param testRunName the test run name to provide to
+ * @param testRunId the test run id to provide to
* {@link ITestRunListener#testRunStarted(String, int)}
* @param listeners informed of test results as the tests are executing
*/
- public GeeTestResultParser(String testRunName, Collection<ITestRunListener> listeners) {
- mTestRunName = testRunName;
+ public GeeTestResultParser(String testRunId, Collection<ITestRunListener> listeners) {
+ mTestRunId = testRunId;
mTestListeners = new ArrayList<ITestRunListener>(listeners);
}
/**
* Creates the GTestResultParser for a single listener.
*
- * @param testRunName the test run name to provide to
+ * @param testRunId the test run id to provide to
* {@link ITestRunListener#testRunStarted(String, int)}
* @param listener informed of test results as the tests are executing
*/
- public GeeTestResultParser(String testRunName, ITestRunListener listener) {
- mTestRunName = testRunName;
+ public GeeTestResultParser(String testRunId, ITestRunListener listener) {
+ mTestRunId = testRunId;
mTestListeners = new ArrayList<ITestRunListener>(1);
mTestListeners.add(listener);
}
@@ -355,7 +355,7 @@
// if start test run not reported yet
if (!mTestRunStartReported) {
for (ITestRunListener listener : mTestListeners) {
- listener.testRunStarted(mTestRunName, mNumTestsExpected);
+ listener.testRunStarted(mTestRunId, mNumTestsExpected);
}
mTestRunStartReported = true;
}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/ITestPackageDef.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/ITestPackageDef.java
index 0c3d9bc..ea01535 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/ITestPackageDef.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/ITestPackageDef.java
@@ -17,6 +17,7 @@
package com.android.cts.tradefed.testtype;
import com.android.ddmlib.testrunner.TestIdentifier;
+import com.android.tradefed.testtype.IAbi;
import com.android.tradefed.testtype.IRemoteTest;
import java.io.File;
@@ -30,10 +31,16 @@
public interface ITestPackageDef {
/**
- * Get the unique URI, aka the appPackageName, of the test package.
- * @return the {@link String} uri
+ * Get the id of the test package.
+ * @return the {@link String} id
*/
- public String getUri();
+ public String getId();
+
+ /**
+ * Get the appPackageName of the test package.
+ * @return the {@link String} appPackageName
+ */
+ public String getAppPackageName();
/**
* Creates a runnable {@link IRemoteTest} from info stored in this definition.
@@ -68,8 +75,7 @@
/**
* Return the sha1sum of the binary file for this test package.
* <p/>
- * Will only return a valid value after {@link #createTest(File, String, String)} has been
- * called.
+ * Will only return a valid value after {@link #createTest(File)} has been called.
*
* @return the sha1sum in {@link String} form
*/
@@ -81,11 +87,16 @@
public String getName();
/**
- * Set the filter to use to exclude tests
- *
- * @param excludedTestFilter
+ * @return the ABI of this test package.
*/
- public void setExcludedTestFilter(TestFilter excludedTestFilter);
+ public IAbi getAbi();
+
+ /**
+ * Set the filter to use for tests
+ *
+ * @param testFilter
+ */
+ public void setTestFilter(TestFilter testFilter);
/**
* Restrict this test package to run a specific class and method name
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/ITestPackageRepo.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/ITestPackageRepo.java
index 53451f1..04ecb83 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/ITestPackageRepo.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/ITestPackageRepo.java
@@ -16,8 +16,10 @@
package com.android.cts.tradefed.testtype;
-import java.util.Collection;
+import com.android.cts.util.AbiUtils;
+import java.util.Collection;
+import java.util.Set;
/**
* Interface for accessing tests from the CTS repository.
@@ -25,23 +27,37 @@
public interface ITestPackageRepo {
/**
- * Get a {@link TestPackageDef} given a uri
+ * Get a {@link TestPackageDef} given an id.
*
- * @param testUri the string uris
- * @return a {@link TestPackageDef} or <code>null</code> if the uri cannot be found in repo
+ * @param id the unique identifier of this test package, generated by
+ * {@link AbiUtils#createId(String, String)}.
+ * @return a {@link TestPackageDef}
*/
- public ITestPackageDef getTestPackage(String testUri);
+ public ITestPackageDef getTestPackage(String id);
/**
- * Attempt to find the package uri for a given test class name
+ * Get a set of {@link TestPackageDef} given a name
+ *
+ * @param name the string package name
+ * @return a {@link Set} of {@link TestPackageDef}
+ */
+ public Set<ITestPackageDef> getTestPackages(String name);
+
+ /**
+ * Attempt to find the package ids for a given test class name
*
* @param testClassName the test class name
- * @return the package uri or <code>null</code> if the package cannot be found
+ * @return a {@link Set} of package ids.
*/
- public String findPackageForTest(String testClassName);
+ public Set<String> findPackageIdsForTest(String testClassName);
/**
- * Return a sorted {@link Collection} of all package names found in repo.
+ * return a sorted {@link Collection} of all package ids found in repo.
+ */
+ public Collection<String> getPackageIds();
+
+ /**
+ * return a sorted {@link Collection} of all package names found in repo.
*/
public Collection<String> getPackageNames();
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/ITestPlan.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/ITestPlan.java
index 191cefd..21b2d0a 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/ITestPlan.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/ITestPlan.java
@@ -37,36 +37,36 @@
public void parse(InputStream xmlStream) throws ParseException;
/**
- * Gets the list of test uris contained in this plan.
+ * Gets a sorted list of test ids contained in this plan.
*/
- public Collection<String> getTestUris();
+ public Collection<String> getTestIds();
/**
- * Gets the {@link TestFilter} that should be used to exclude tests from given package.
+ * Gets the {@link TestFilter} that should be used to filter tests from given package.
*/
- public TestFilter getExcludedTestFilter(String uri);
+ public TestFilter getTestFilter(String id);
/**
* Add a package to this test plan
- * @param uri
+ * @param id
*/
- public void addPackage(String uri);
+ public void addPackage(String id);
/**
* Add a excluded test to this test plan
*
- * @param uri the package uri
+ * @param id the package id
* @param testToExclude the test to exclude for given package
*/
- public void addExcludedTest(String uri, TestIdentifier testToExclude);
+ public void addExcludedTest(String id, TestIdentifier testToExclude);
/**
* Adds the list of excluded tests for given package
*
- * @param pkgUri
+ * @param id
* @param excludedTests
*/
- public void addExcludedTests(String uri, Collection<TestIdentifier> excludedTests);
+ public void addExcludedTests(String id, Collection<TestIdentifier> excludedTests);
/**
* Serialize the contents of this test plan.
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/JUnitDeviceTest.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/JUnitDeviceTest.java
index 4adcb0b..5efa7cd 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/JUnitDeviceTest.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/JUnitDeviceTest.java
@@ -25,6 +25,7 @@
import com.android.tradefed.device.ITestDevice;
import com.android.tradefed.log.LogUtil.CLog;
import com.android.tradefed.result.ITestInvocationListener;
+import com.android.tradefed.testtype.IAbi;
import com.android.tradefed.testtype.IBuildReceiver;
import com.android.tradefed.testtype.IDeviceTest;
import com.android.tradefed.testtype.IRemoteTest;
@@ -52,10 +53,6 @@
private static final String TMP_DIR = "/data/local/tmp/";
- @Option(name = AbiFormatter.FORCE_ABI_STRING, description = AbiFormatter.FORCE_ABI_DESCRIPTION,
- importance = Importance.IF_UNSET)
- private String mForceAbi = null;
-
@Option(name = "junit-device-runtime",
description = "The name of the runtime to use on the device",
importance = Importance.ALWAYS)
@@ -79,12 +76,19 @@
private String mRuntimeArgs;
-
+ private IAbi mAbi;
private static final String JUNIT_JAR = "cts-junit.jar";
private Set<String> mTestJars = new HashSet<String>(Arrays.asList(JUNIT_JAR));
+ /**
+ * @param abi The ABI to run the test on
+ */
+ public void setAbi(IAbi abi) {
+ mAbi = abi;
+ }
+
@Override
public ITestDevice getDevice() {
return mDevice;
@@ -127,7 +131,7 @@
"com.android.cts.junit.SingleJUnitTestRunner %s#%s",
mDeviceTestTmpPath, mRuntimePath, jarPath, mRuntimeArgs,
testId.getClassName(), testId.getTestName());
- String cmd = AbiFormatter.formatCmdForAbi(cmdLine, mForceAbi);
+ String cmd = AbiFormatter.formatCmdForAbi(cmdLine, mAbi.getBitness());
CLog.d("Running %s", cmd);
listener.testStarted(testId);
mDevice.executeShellCommand(cmd, resultParser, mMaxTimeToOutputResponse,
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/JarHostTest.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/JarHostTest.java
index 22a016a..9d9596e 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/JarHostTest.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/JarHostTest.java
@@ -23,8 +23,9 @@
import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.device.ITestDevice;
import com.android.tradefed.result.ITestInvocationListener;
-
import com.android.tradefed.testtype.DeviceTestResult.RuntimeDeviceNotAvailableException;
+import com.android.tradefed.testtype.IAbi;
+import com.android.tradefed.testtype.IAbiReceiver;
import com.android.tradefed.testtype.IBuildReceiver;
import com.android.tradefed.testtype.IDeviceTest;
import com.android.tradefed.testtype.IRemoteTest;
@@ -59,10 +60,17 @@
private String mRunName;
private CtsBuildHelper mCtsBuild = null;
private IBuildInfo mBuildInfo = null;
-
+ private IAbi mAbi;
private ClassLoader mClassLoader;
/**
+ * @param abi the ABI to run the test on
+ */
+ public void setAbi(IAbi abi) {
+ mAbi = abi;
+ }
+
+ /**
* {@inheritDoc}
*/
@Override
@@ -133,7 +141,7 @@
* Tests that take longer than this amount will be failed with a {@link TestTimeoutException}
* as the cause.
*
- * @param testTimeout
+ * @param testTimeoutMs
*/
void setTimeout(long testTimeoutMs) {
mTimeoutMs = testTimeoutMs;
@@ -190,14 +198,6 @@
}
/**
- * setOptions sets options to the tests invoked from this test.
- * It is used to passing options from JarHostTest to the tests started by JarHostTest.
- * The default implementation does nothing.
- */
- protected void setOptions(Test junitTest) throws ConfigurationException {
- }
-
- /**
* Run test with timeout support.
*/
private void runTest(TestIdentifier testId, final Test junitTest, final TestResult junitResult) {
@@ -210,14 +210,12 @@
deviceTest.setDevice(getDevice().getIDevice());
deviceTest.setTestAppPath(mCtsBuild.getTestCasesDir().getAbsolutePath());
}
+ if (junitTest instanceof IAbiReceiver) {
+ ((IAbiReceiver)junitTest).setAbi(mAbi);
+ }
if (junitTest instanceof IBuildReceiver) {
((IBuildReceiver)junitTest).setBuild(mBuildInfo);
}
- try {
- setOptions(junitTest);
- } catch (ConfigurationException e) {
- Log.e(LOG_TAG, e.toString());
- }
TestRunnable testRunnable = new TestRunnable(junitTest, junitResult);
CommandStatus status = RunUtil.getDefault().runTimed(mTimeoutMs, testRunnable, true);
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/PrintTestRunner.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/PrintTestRunner.java
index a7a6ccc..44d2d3a 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/PrintTestRunner.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/PrintTestRunner.java
@@ -18,12 +18,14 @@
import com.android.cts.tradefed.build.CtsBuildHelper;
import com.android.cts.tradefed.targetprep.SettingsToggler;
+import com.android.cts.util.AbiUtils;
import com.android.ddmlib.testrunner.IRemoteAndroidTestRunner;
import com.android.ddmlib.testrunner.IRemoteAndroidTestRunner.TestSize;
import com.android.tradefed.build.IBuildInfo;
import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.device.ITestDevice;
import com.android.tradefed.result.ITestInvocationListener;
+import com.android.tradefed.testtype.IAbi;
import com.android.tradefed.testtype.IBuildReceiver;
import com.android.tradefed.testtype.IDeviceTest;
import com.android.tradefed.testtype.IRemoteTest;
@@ -65,6 +67,7 @@
private CtsBuildHelper mCtsBuild;
+ private IAbi mAbi;
private String mPackageName;
private String mRunnerName = "android.test.InstrumentationTestRunner";
private String mTestClassName;
@@ -75,6 +78,13 @@
private String mRunName = null;
private Map<String, String> mInstrArgMap = new HashMap<String, String>();
+ /**
+ * @param abi The ABI to run the test on
+ */
+ public void setAbi(IAbi abi) {
+ mAbi = abi;
+ }
+
@Override
public void setBuild(IBuildInfo buildInfo) {
mCtsBuild = CtsBuildHelper.createBuildHelper(buildInfo);
@@ -191,8 +201,9 @@
private void installTestsAndServicesApk() throws DeviceNotAvailableException {
try {
+ String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
String installCode = getDevice().installPackage(mCtsBuild.getTestApp(
- PRINT_TEST_AND_SERVICES_APP_NAME), true);
+ PRINT_TEST_AND_SERVICES_APP_NAME), true, options);
if (installCode != null) {
throw new IllegalArgumentException("Failed to install "
+ PRINT_TEST_AND_SERVICES_APP_NAME + " on " + getDevice().getSerialNumber()
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/ResultFilter.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/ResultFilter.java
index e8fdad8..e3fcdc4 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/ResultFilter.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/ResultFilter.java
@@ -28,6 +28,7 @@
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
/**
* A {@link ITestInvocationListener} that filters test results based on the set of expected tests
@@ -38,37 +39,35 @@
*/
class ResultFilter extends ResultForwarder {
- private final Map<String, Collection<TestIdentifier>> mKnownTestsMap;
- private final Map<String, Collection<TestIdentifier>> mRemainingTestsMap;
- private String mCurrentTestRun = null;
+ private final Set<TestIdentifier> mKnownTests;
+ private final Set<TestIdentifier> mRemainingTests;
+ private final String mTestRun;
/**
* Create a {@link ResultFilter}.
*
* @param listener the real {@link ITestInvocationListener} to forward results to
*/
- ResultFilter(ITestInvocationListener listener, List<TestPackage> testPackages) {
+ ResultFilter(ITestInvocationListener listener, TestPackage testPackage) {
super(listener);
-
- mKnownTestsMap = new HashMap<String, Collection<TestIdentifier>>();
+ mTestRun = testPackage.getTestRunName();
+ Collection<TestIdentifier> tests = testPackage.getKnownTests();
+ mKnownTests = new HashSet<TestIdentifier>(tests);
// use LinkedHashMap for predictable test order
- mRemainingTestsMap = new LinkedHashMap<String, Collection<TestIdentifier>>();
-
- for (TestPackage testPkg : testPackages) {
- mKnownTestsMap.put(testPkg.getTestRunName(), new HashSet<TestIdentifier>(
- testPkg.getKnownTests()));
- mRemainingTestsMap.put(testPkg.getTestRunName(), new LinkedHashSet<TestIdentifier>(
- testPkg.getKnownTests()));
- }
+ mRemainingTests = new LinkedHashSet<TestIdentifier>(tests);
}
+
/**
* {@inheritDoc}
*/
@Override
public void testRunStarted(String runName, int testCount) {
- super.testRunStarted(runName, testCount);
- mCurrentTestRun = runName;
+ if (mTestRun.equals(runName)) {
+ super.testRunStarted(runName, testCount);
+ } else {
+ CLog.d("Skipping reporting unknown test run %s", runName);
+ }
}
/**
@@ -109,10 +108,7 @@
* @return
*/
private boolean isKnownTest(TestIdentifier test) {
- if (mCurrentTestRun != null && mKnownTestsMap.containsKey(mCurrentTestRun)) {
- return mKnownTestsMap.get(mCurrentTestRun).contains(test);
- }
- return false;
+ return mKnownTests.contains(test);
}
/**
@@ -120,26 +116,23 @@
* @param test
*/
private void removeExecutedTest(TestIdentifier test) {
- if (mCurrentTestRun != null && mRemainingTestsMap.containsKey(mCurrentTestRun)) {
- mRemainingTestsMap.get(mCurrentTestRun).remove(test);
- }
+ mRemainingTests.remove(test);
}
/**
* Report the set of expected tests that were not executed
*/
public void reportUnexecutedTests() {
- for (Map.Entry<String, Collection<TestIdentifier>> entry : mRemainingTestsMap.entrySet()) {
- if (!entry.getValue().isEmpty()) {
- super.testRunStarted(entry.getKey(), entry.getValue().size());
- for (TestIdentifier test : entry.getValue()) {
- // an unexecuted test is currently reported as a 'testStarted' event without a
- // 'testEnded'. TODO: consider adding an explict API for reporting an unexecuted
- // test
- super.testStarted(test);
- }
- super.testRunEnded(0, new HashMap<String,String>());
- }
+ if (mRemainingTests.isEmpty()) {
+ return;
}
+ super.testRunStarted(mTestRun, mRemainingTests.size());
+ for (TestIdentifier test : mRemainingTests) {
+ // an unexecuted test is currently reported as a 'testStarted' event without a
+ // 'testEnded'. TODO: consider adding an explict API for reporting an unexecuted
+ // test
+ super.testStarted(test);
+ }
+ super.testRunEnded(0, new HashMap<String, String>());
}
}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageDef.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageDef.java
index 4fa3b2b..45c176a 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageDef.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageDef.java
@@ -16,9 +16,11 @@
package com.android.cts.tradefed.testtype;
+import com.android.cts.util.AbiUtils;
import com.android.ddmlib.Log.LogLevel;
import com.android.ddmlib.testrunner.TestIdentifier;
import com.android.tradefed.log.LogUtil.CLog;
+import com.android.tradefed.testtype.IAbi;
import com.android.tradefed.testtype.IRemoteTest;
import com.android.tradefed.testtype.InstrumentationTest;
import com.android.tradefed.util.StreamUtil;
@@ -61,7 +63,7 @@
private static final String SIGNATURE_TEST_METHOD = "testSignature";
private static final String SIGNATURE_TEST_CLASS = "android.tests.sigtest.SignatureTest";
- private String mUri = null;
+ private String mAppPackageName = null;
private String mAppNameSpace = null;
private String mName = null;
private String mRunner = null;
@@ -71,6 +73,7 @@
private boolean mIsSignatureTest = false;
private String mTestPackageName = null;
private String mDigest = null;
+ private IAbi mAbi = null;
// use a LinkedHashSet for predictable iteration insertion-order, and fast
// lookups
@@ -81,7 +84,7 @@
// dynamic options, not parsed from package xml
private String mClassName;
private String mMethodName;
- private TestFilter mExcludedTestFilter = new TestFilter();
+ private TestFilter mTestFilter = new TestFilter();
private String mTargetBinaryName;
private String mTargetNameSpace;
// only timeout per package is supported. To change this to method granularity,
@@ -89,16 +92,36 @@
// So for now, only max timeout for the package is used.
private int mTimeoutInMins = -1;
- void setUri(String uri) {
- mUri = uri;
+ @Override
+ public IAbi getAbi() {
+ return mAbi;
+ }
+
+ /**
+ * @param abi the ABI to run this package on
+ */
+ public void setAbi(IAbi abi) {
+ mAbi = abi;
+ }
+
+ /**
+ * @return unique id representing this test package for this ABI.
+ */
+ @Override
+ public String getId() {
+ return AbiUtils.createId(getAbi().getName(), getAppPackageName());
+ }
+
+ void setAppPackageName(String appPackageName) {
+ mAppPackageName = appPackageName;
}
/**
* {@inheritDoc}
*/
@Override
- public String getUri() {
- return mUri;
+ public String getAppPackageName() {
+ return mAppPackageName;
}
void setRunTimeArgs(String runTimeArgs) {
@@ -193,8 +216,8 @@
* {@inheritDoc}
*/
@Override
- public void setExcludedTestFilter(TestFilter excludeFilter) {
- mExcludedTestFilter = excludeFilter;
+ public void setTestFilter(TestFilter testFilter) {
+ mTestFilter = testFilter;
}
/**
@@ -211,7 +234,7 @@
*/
@Override
public IRemoteTest createTest(File testCaseDir) {
- mExcludedTestFilter.setTestInclusion(mClassName, mMethodName);
+ mTestFilter.setTestInclusion(mClassName, mMethodName);
mTests = filterTests();
if (HOST_SIDE_ONLY_TEST.equals(mTestType)) {
@@ -221,26 +244,34 @@
CLog.d("Setting new timeout to " + mTimeoutInMins + " mins");
hostTest.setTimeout(mTimeoutInMins * 60 * 1000);
}
- hostTest.setRunName(getUri());
+ hostTest.setRunName(mAppPackageName);
hostTest.setJarFileName(mJarPath);
hostTest.setTests(mTests);
+ hostTest.setAbi(mAbi);
mDigest = generateDigest(testCaseDir, mJarPath);
return hostTest;
} else if (VM_HOST_TEST.equals(mTestType)) {
CLog.d("Creating vm host test for %s", mName);
VMHostTest vmHostTest = new VMHostTest();
- vmHostTest.setRunName(getUri());
+ vmHostTest.setRunName(mAppPackageName);
vmHostTest.setJarFileName(mJarPath);
vmHostTest.setTests(mTests);
+ vmHostTest.setAbi(mAbi);
mDigest = generateDigest(testCaseDir, mJarPath);
return vmHostTest;
} else if (DEQP_TEST.equals(mTestType)) {
- return new DeqpTest(mUri, mTests);
+ DeqpTestRunner deqpTest = new DeqpTestRunner(mAppPackageName, mName, mTests);
+ deqpTest.setAbi(mAbi);
+ return deqpTest;
} else if (NATIVE_TEST.equals(mTestType)) {
- return new GeeTest(mUri, mName);
+ GeeTest geeTest = new GeeTest(mAppPackageName, mName);
+ geeTest.setAbi(mAbi);
+ return geeTest;
} else if (WRAPPED_NATIVE_TEST.equals(mTestType)) {
CLog.d("Creating new wrapped native test for %s", mName);
- return new WrappedGTest(mAppNameSpace, mUri, mName, mRunner);
+ WrappedGTest wrappedGeeTest = new WrappedGTest(mAppNameSpace, mAppPackageName, mName, mRunner);
+ wrappedGeeTest.setAbi(mAbi);
+ return wrappedGeeTest;
} else if (ACCESSIBILITY_TEST.equals(mTestType)) {
AccessibilityTestRunner test = new AccessibilityTestRunner();
return setInstrumentationTest(test, testCaseDir);
@@ -248,6 +279,7 @@
PrintTestRunner test = new PrintTestRunner();
return setPrintTest(test, testCaseDir);
} else if (ACCESSIBILITY_SERVICE_TEST.equals(mTestType)) {
+ @SuppressWarnings("deprecation")
AccessibilityServiceTestRunner test = new AccessibilityServiceTestRunner();
return setInstrumentationTest(test, testCaseDir);
} else if (DISPLAY_TEST.equals(mTestType)) {
@@ -261,14 +293,16 @@
// specialized instrumentation. Eventually this special case for signatureTest can be
// removed, and it can be treated just like a normal InstrumentationTest
CLog.d("Creating signature test %s", mName);
- InstrumentationApkTest instrTest = new InstrumentationApkTest();
+ CtsInstrumentationApkTest instrTest = new CtsInstrumentationApkTest();
instrTest.setPackageName(mAppNameSpace);
instrTest.setRunnerName("android.test.InstrumentationTestRunner");
instrTest.setClassName(SIGNATURE_TEST_CLASS);
instrTest.setMethodName(SIGNATURE_TEST_METHOD);
- // set expected tests to the single signature test
- TestIdentifier t = new TestIdentifier(SIGNATURE_TEST_CLASS, SIGNATURE_TEST_METHOD);
+ instrTest.setAbi(mAbi);
mTests.clear();
+ // set expected tests to the single signature test
+ TestIdentifier t = new TestIdentifier(
+ SIGNATURE_TEST_CLASS, SIGNATURE_TEST_METHOD);
mTests.add(t);
// mName means 'apk file name' for instrumentation tests
instrTest.addInstallApk(String.format("%s.apk", mName), mAppNameSpace);
@@ -277,15 +311,16 @@
} else if (JUNIT_DEVICE_TEST.equals(mTestType)){
CLog.d("Creating JUnit device test %s", mName);
JUnitDeviceTest jUnitDeviceTest = new JUnitDeviceTest();
- jUnitDeviceTest.setRunName(getUri());
+ jUnitDeviceTest.setRunName(mAppPackageName);
jUnitDeviceTest.addTestJarFileName(mJarPath);
jUnitDeviceTest.addRunTimeArgs(mRunTimeArgs);
jUnitDeviceTest.setTests(mTests);
+ jUnitDeviceTest.setAbi(mAbi);
mDigest = generateDigest(testCaseDir, mJarPath);
return jUnitDeviceTest;
} else {
CLog.d("Creating instrumentation test for %s", mName);
- InstrumentationApkTest instrTest = new InstrumentationApkTest();
+ CtsInstrumentationApkTest instrTest = new CtsInstrumentationApkTest();
if (mTimeoutInMins >= 0) {
// as timeout cannot be set for each test,
// increase the time-out of the whole package
@@ -298,31 +333,33 @@
private PrintTestRunner setPrintTest(PrintTestRunner printTest,
File testCaseDir) {
- printTest.setRunName(getUri());
+ printTest.setRunName(mAppPackageName);
printTest.setPackageName(mAppNameSpace);
printTest.setRunnerName(mRunner);
printTest.setTestPackageName(mTestPackageName);
printTest.setClassName(mClassName);
printTest.setMethodName(mMethodName);
+ printTest.setAbi(mAbi);
mDigest = generateDigest(testCaseDir, String.format("%s.apk", mName));
return printTest;
}
/**
- * Populates given {@link InstrumentationApkTest} with data from the package xml.
+ * Populates given {@link CtsInstrumentationApkTest} with data from the package xml.
*
* @param testCaseDir
* @param instrTest
* @return the populated {@link InstrumentationTest} or <code>null</code>
*/
- private InstrumentationTest setInstrumentationTest(InstrumentationApkTest instrTest,
+ private InstrumentationTest setInstrumentationTest(CtsInstrumentationApkTest instrTest,
File testCaseDir) {
- instrTest.setRunName(getUri());
+ instrTest.setRunName(mAppPackageName);
instrTest.setPackageName(mAppNameSpace);
instrTest.setRunnerName(mRunner);
instrTest.setTestPackageName(mTestPackageName);
instrTest.setClassName(mClassName);
instrTest.setMethodName(mMethodName);
+ instrTest.setAbi(mAbi);
instrTest.setTestsToRun(mTests, false
/* force batch mode off to always run using testFile */);
instrTest.setReRunUsingTestFile(true);
@@ -342,6 +379,7 @@
* @param uiautomatorTest
* @return the populated {@link UiAutomatorJarTest} or <code>null</code>
*/
+ @SuppressWarnings("deprecation")
private IRemoteTest setUiAutomatorTest(UiAutomatorJarTest uiautomatorTest) {
uiautomatorTest.setInstallArtifacts(getJarPath());
if (mClassName != null) {
@@ -353,19 +391,19 @@
} else {
uiautomatorTest.addClassNames(mTestClasses);
}
- uiautomatorTest.setRunName(getUri());
+ uiautomatorTest.setRunName(mAppPackageName);
uiautomatorTest.setCaptureLogs(false);
return uiautomatorTest;
}
/**
- * Filter the tests to run based on list of excluded tests, class and method name.
+ * Filter the tests to run based on list of included/excluded tests, class and method name.
*
* @return the filtered collection of tests
*/
private Collection<TestIdentifier> filterTests() {
- mExcludedTestFilter.setTestInclusion(mClassName, mMethodName);
- return mExcludedTestFilter.filter(mTests);
+ mTestFilter.setTestInclusion(mClassName, mMethodName);
+ return mTestFilter.filter(mTests);
}
/**
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageRepo.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageRepo.java
index 0f3704d..7b57a44 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageRepo.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageRepo.java
@@ -15,6 +15,7 @@
*/
package com.android.cts.tradefed.testtype;
+import com.android.cts.util.AbiUtils;
import com.android.ddmlib.Log;
import com.android.tradefed.util.xml.AbstractXmlParser.ParseException;
@@ -27,9 +28,12 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
-import java.util.Hashtable;
+import java.util.HashSet;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
/**
* Retrieves CTS test package definitions from the repository.
@@ -40,19 +44,27 @@
private final File mTestCaseDir;
- /** mapping of uri to test definition */
- private final Map<String, TestPackageDef> mTestMap;
-
+ /** mapping of ABI to a mapping of appPackageName to test definition */
+ private final Map<String, Map<String, TestPackageDef>> mTestMap;
+ /** set of ABIs */
+ private final Set<String> mAbis;
private final boolean mIncludeKnownFailures;
/**
* Creates a {@link TestPackageRepo}, initialized from provided repo files
*
* @param testCaseDir directory containing all test case definition xml and build files
+ * @param abis Holds the ABIs which the test must be run against. This must be a subset of the
+ * ABIs supported by the device under test.
+ * @param includeKnownFailures Whether to run tests which are known to fail.
*/
- public TestPackageRepo(File testCaseDir, boolean includeKnownFailures) {
+ public TestPackageRepo(File testCaseDir, Set<String> abis, boolean includeKnownFailures) {
mTestCaseDir = testCaseDir;
- mTestMap = new Hashtable<String, TestPackageDef>();
+ mTestMap = new HashMap<String, Map<String, TestPackageDef>>();
+ mAbis = abis;
+ for (String abi : abis) {
+ mTestMap.put(abi, new HashMap<String, TestPackageDef>());
+ }
mIncludeKnownFailures = includeKnownFailures;
parse(mTestCaseDir);
}
@@ -68,12 +80,14 @@
}
private void parseTestFromXml(File xmlFile) {
- TestPackageXmlParser parser = new TestPackageXmlParser(mIncludeKnownFailures);
+ TestPackageXmlParser parser = new TestPackageXmlParser(mAbis, mIncludeKnownFailures);
try {
parser.parse(createStreamFromFile(xmlFile));
- TestPackageDef def = parser.getTestPackageDef();
- if (def != null) {
- mTestMap.put(def.getUri(), def);
+ Set<TestPackageDef> defs = parser.getTestPackageDefs();
+ if (!defs.isEmpty()) {
+ for (TestPackageDef def : defs) {
+ mTestMap.get(def.getAbi().getName()).put(def.getAppPackageName(), def);
+ }
} else {
Log.w(LOG_TAG, String.format("Could not find test package info in xml file %s",
xmlFile.getAbsolutePath()));
@@ -117,21 +131,60 @@
* {@inheritDoc}
*/
@Override
- public ITestPackageDef getTestPackage(String testUri) {
- return mTestMap.get(testUri);
+ public ITestPackageDef getTestPackage(String id) {
+ String[] parts = AbiUtils.parseId(id);
+ String abi = parts[0];
+ String name = parts[1];
+ if (mTestMap.containsKey(abi) && mTestMap.get(abi).containsKey(name)) {
+ return mTestMap.get(abi).get(name);
+ }
+ return null;
}
/**
* {@inheritDoc}
*/
@Override
- public String findPackageForTest(String testClassName) {
- for (Map.Entry<String, TestPackageDef> entry : mTestMap.entrySet()) {
- if (entry.getValue().isKnownTestClass(testClassName)) {
- return entry.getKey();
+ public Set<ITestPackageDef> getTestPackages(String appPackageName) {
+ Set<ITestPackageDef> defs = new HashSet<ITestPackageDef>();
+ for (String abi : mAbis) {
+ if (mTestMap.get(abi).containsKey(appPackageName)) {
+ defs.add(mTestMap.get(abi).get(appPackageName));
}
}
- return null;
+ return defs;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Set<String> findPackageIdsForTest(String testClassName) {
+ Set<String> ids = new HashSet<String>();
+ for (String abi : mTestMap.keySet()) {
+ for (String name : mTestMap.get(abi).keySet()) {
+ if (mTestMap.get(abi).get(name).isKnownTestClass(testClassName)) {
+ ids.add(AbiUtils.createId(abi, name));
+ }
+ }
+ }
+ return ids;
+ }
+
+ /**
+ * @return list of all package ids found in repo
+ */
+ @Override
+ public Collection<String> getPackageIds() {
+ Set<String> ids = new HashSet<String>();
+ for (String abi : mAbis) {
+ for (String name : mTestMap.get(abi).keySet()) {
+ ids.add(AbiUtils.createId(abi, name));
+ }
+ }
+ List<String> idList = new ArrayList<String>(ids);
+ Collections.sort(idList);
+ return idList;
}
/**
@@ -139,8 +192,11 @@
*/
@Override
public Collection<String> getPackageNames() {
- List<String> packageNames = new ArrayList<String>();
- packageNames.addAll(mTestMap.keySet());
+ Set<String> names = new HashSet<String>();
+ for (String abi : mAbis) {
+ names.addAll(mTestMap.get(abi).keySet());
+ }
+ List<String> packageNames = new ArrayList<String>(names);
Collections.sort(packageNames);
return packageNames;
}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageXmlParser.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageXmlParser.java
index 5d10dfc..71279c7 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageXmlParser.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageXmlParser.java
@@ -15,6 +15,7 @@
*/
package com.android.cts.tradefed.testtype;
+import com.android.cts.util.AbiUtils;
import com.android.ddmlib.Log;
import com.android.ddmlib.testrunner.TestIdentifier;
import com.android.tradefed.util.xml.AbstractXmlParser;
@@ -22,7 +23,11 @@
import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;
+import java.util.HashMap;
+import java.util.HashSet;
import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
import java.util.Stack;
/**
@@ -35,11 +40,18 @@
private static final String LOG_TAG = "TestPackageXmlParser";
+ private final Set<String> mAbis;
private final boolean mIncludeKnownFailures;
- private TestPackageDef mPackageDef;
+ private Map<String, TestPackageDef> mPackageDefs = new HashMap<String, TestPackageDef>();
- public TestPackageXmlParser(boolean includeKnownFailures) {
+ /**
+ * @param abis Holds the ABIs which the test must be run against. This must be a subset of the
+ * ABIs supported by the device under test.
+ * @param includeKnownFailures Whether to run tests which are known to fail.
+ */
+ public TestPackageXmlParser(Set<String> abis, boolean includeKnownFailures) {
+ mAbis = abis;
mIncludeKnownFailures = includeKnownFailures;
}
@@ -65,32 +77,37 @@
@Override
public void startElement(String uri, String localName, String name, Attributes attributes) {
if (TEST_PACKAGE_TAG.equals(localName)) {
- // appPackageName is used as the uri
- final String entryUriValue = attributes.getValue("appPackageName");
+ final String appPackageName = attributes.getValue("appPackageName");
final String testPackageNameSpace = attributes.getValue("appNameSpace");
final String packageName = attributes.getValue("name");
final String runnerName = attributes.getValue("runner");
final String jarPath = attributes.getValue("jarPath");
- final String signatureCheck = attributes.getValue("signatureCheck");
+ final boolean signatureCheck = parseBoolean(attributes.getValue("signatureCheck"));
final String javaPackageFilter = attributes.getValue("javaPackageFilter");
final String targetBinaryName = attributes.getValue("targetBinaryName");
final String targetNameSpace = attributes.getValue("targetNameSpace");
final String runTimeArgs = attributes.getValue("runtimeArgs");
+ final String testType = getTestType(attributes);
- mPackageDef = new TestPackageDef();
- mPackageDef.setUri(entryUriValue);
- mPackageDef.setAppNameSpace(testPackageNameSpace);
- mPackageDef.setName(packageName);
- mPackageDef.setRunner(runnerName);
- mPackageDef.setTestType(getTestType(attributes));
- mPackageDef.setJarPath(jarPath);
- mPackageDef.setIsSignatureCheck(parseBoolean(signatureCheck));
- mPackageDef.setRunTimeArgs(runTimeArgs);
- if (!"".equals(javaPackageFilter)) {
- mPackageDef.setTestPackageName(javaPackageFilter);
+ for (String abiName : mAbis) {
+ Abi abi = new Abi(abiName, AbiUtils.getBitness(abiName));
+ TestPackageDef packageDef = new TestPackageDef();
+ packageDef.setAppPackageName(appPackageName);
+ packageDef.setAppNameSpace(testPackageNameSpace);
+ packageDef.setName(packageName);
+ packageDef.setRunner(runnerName);
+ packageDef.setTestType(testType);
+ packageDef.setJarPath(jarPath);
+ packageDef.setIsSignatureCheck(signatureCheck);
+ packageDef.setRunTimeArgs(runTimeArgs);
+ if (!"".equals(javaPackageFilter)) {
+ packageDef.setTestPackageName(javaPackageFilter);
+ }
+ packageDef.setTargetBinaryName(targetBinaryName);
+ packageDef.setTargetNameSpace(targetNameSpace);
+ packageDef.setAbi(abi);
+ mPackageDefs.put(abiName, packageDef);
}
- mPackageDef.setTargetBinaryName(targetBinaryName);
- mPackageDef.setTargetNameSpace(targetNameSpace);
// reset the class name
mClassNameStack = new Stack<String>();
@@ -112,7 +129,7 @@
}
} else if (TEST_TAG.equals(localName)) {
String methodName = attributes.getValue("name");
- if (mPackageDef == null) {
+ if (mPackageDefs.isEmpty()) {
Log.e(LOG_TAG, String.format(
"Invalid XML: encountered a '%s' tag not enclosed within a '%s' tag",
TEST_TAG, TEST_PACKAGE_TAG));
@@ -133,11 +150,26 @@
if (timeoutStr != null) {
timeout = Integer.parseInt(timeoutStr);
}
- TestIdentifier testId = new TestIdentifier(classNameBuilder.toString(),
- methodName);
boolean isKnownFailure = "failure".equals(attributes.getValue("expectation"));
if (!isKnownFailure || mIncludeKnownFailures) {
- mPackageDef.addTest(testId, timeout);
+ String abiList = attributes.getValue("abis");
+ Set<String> abis = new HashSet<String>();
+ if (abiList == null) {
+ // If no specification, add all supported abis
+ abis.addAll(mAbis);
+ } else {
+ for (String abi : abiList.split(", ")) {
+ if (mAbis.contains(abi)) {
+ // Else only add the abi which are supported
+ abis.add(abi);
+ }
+ }
+ }
+ for (String abi : abis) {
+ TestIdentifier testId = new TestIdentifier(
+ classNameBuilder.toString(), methodName);
+ mPackageDefs.get(abi).addTest(testId, timeout);
+ }
}
}
}
@@ -170,19 +202,15 @@
}
}
- /**
- * {@inheritDoc}
- */
@Override
protected DefaultHandler createXmlHandler() {
return new TestPackageHandler();
}
/**
- * @returns the {@link TestPackageDef} containing data parsed from xml or <code>null</code> if
- * xml did not contain the correct information.
+ * @returns the set of {@link TestPackageDef} containing data parsed from xml
*/
- public TestPackageDef getTestPackageDef() {
- return mPackageDef;
+ public Set<TestPackageDef> getTestPackageDefs() {
+ return new HashSet<TestPackageDef>(mPackageDefs.values());
}
}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPlan.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPlan.java
index c2a1348..8737db6 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPlan.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPlan.java
@@ -16,6 +16,7 @@
package com.android.cts.tradefed.testtype;
+import com.android.cts.util.AbiUtils;
import com.android.ddmlib.testrunner.TestIdentifier;
import com.android.tradefed.util.ArrayUtil;
import com.android.tradefed.util.xml.AbstractXmlParser;
@@ -29,9 +30,11 @@
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import java.util.Set;
/**
* Implementation of {@link TestPlan}.
@@ -39,18 +42,20 @@
public class TestPlan extends AbstractXmlParser implements ITestPlan {
/**
- * Map of uri names found in plan, and their excluded tests
+ * Map of ids found in plan, and their filters
*/
- private Map<String, TestFilter> mUriExcludedTestsMap;
+ private Map<String, TestFilter> mIdFilterMap;
private static final String ENTRY_TAG = "Entry";
private static final String TEST_DELIM = ";";
private static final String METHOD_DELIM = "#";
private static final String EXCLUDE_ATTR = "exclude";
private static final String INCLUDE_ATTR = "include";
- private static final String URI_ATTR = "uri";
+ private static final String ABI_ATTR = "abi";
+ private static final String NAME_ATTR = "name";
private final String mName;
+ private final Set<String> mAbis;
/**
* SAX callback object. Handles parsing data from the xml tags.
@@ -61,10 +66,17 @@
public void startElement(String uri, String localName, String name, Attributes attributes)
throws SAXException {
if (ENTRY_TAG.equals(localName)) {
- final String entryUriValue = attributes.getValue(URI_ATTR);
TestFilter filter = parseTestList(
attributes.getValue(EXCLUDE_ATTR), attributes.getValue(INCLUDE_ATTR));
- mUriExcludedTestsMap.put(entryUriValue, filter);
+ final String entryNameValue = attributes.getValue(NAME_ATTR);
+ final String entryAbiValue = attributes.getValue(ABI_ATTR);
+ if (entryAbiValue != null) {
+ mIdFilterMap.put(AbiUtils.createId(entryAbiValue, entryNameValue), filter);
+ } else {
+ for (String abi : mAbis) {
+ mIdFilterMap.put(AbiUtils.createId(abi, entryNameValue), filter);
+ }
+ }
}
}
@@ -109,10 +121,11 @@
}
}
- public TestPlan(String name) {
+ public TestPlan(String name, Set<String> abis) {
mName = name;
+ mAbis = abis;
// Uses a LinkedHashMap to have predictable iteration order
- mUriExcludedTestsMap = new LinkedHashMap<String, TestFilter>();
+ mIdFilterMap = new LinkedHashMap<String, TestFilter>();
}
/**
@@ -127,24 +140,26 @@
* {@inheritDoc}
*/
@Override
- public Collection<String> getTestUris() {
- return mUriExcludedTestsMap.keySet();
+ public Collection<String> getTestIds() {
+ List<String> ids = new ArrayList<String>(mIdFilterMap.keySet());
+ Collections.sort(ids);
+ return ids;
}
/**
* {@inheritDoc}
*/
@Override
- public TestFilter getExcludedTestFilter(String uri) {
- return mUriExcludedTestsMap.get(uri);
+ public TestFilter getTestFilter(String id) {
+ return mIdFilterMap.get(id);
}
/**
* {@inheritDoc}
*/
@Override
- public void addPackage(String uri) {
- mUriExcludedTestsMap.put(uri, new TestFilter());
+ public void addPackage(String id) {
+ mIdFilterMap.put(id, new TestFilter());
}
/**
@@ -159,12 +174,12 @@
* {@inheritDoc}
*/
@Override
- public void addExcludedTest(String uri, TestIdentifier testToExclude) {
- TestFilter filter = mUriExcludedTestsMap.get(uri);
+ public void addExcludedTest(String id, TestIdentifier testToExclude) {
+ TestFilter filter = mIdFilterMap.get(id);
if (filter != null) {
filter.addExcludedTest(testToExclude);
} else {
- throw new IllegalArgumentException(String.format("Could not find package %s", uri));
+ throw new IllegalArgumentException(String.format("Could not find package %s", id));
}
}
@@ -172,12 +187,12 @@
* {@inheritDoc}
*/
@Override
- public void addExcludedTests(String uri, Collection<TestIdentifier> excludedTests) {
- TestFilter filter = mUriExcludedTestsMap.get(uri);
+ public void addExcludedTests(String id, Collection<TestIdentifier> excludedTests) {
+ TestFilter filter = mIdFilterMap.get(id);
if (filter != null) {
filter.getExcludedTests().addAll(excludedTests);
} else {
- throw new IllegalArgumentException(String.format("Could not find package %s", uri));
+ throw new IllegalArgumentException(String.format("Could not find package %s", id));
}
}
@@ -193,9 +208,11 @@
"http://xmlpull.org/v1/doc/features.html#indent-output", true);
serializer.startTag(null, "TestPlan");
serializer.attribute(null, "version", "1.0");
- for (Map.Entry<String, TestFilter> packageEntry : mUriExcludedTestsMap.entrySet()) {
+ for (Map.Entry<String, TestFilter> packageEntry : mIdFilterMap.entrySet()) {
serializer.startTag(null, ENTRY_TAG);
- serializer.attribute(null, "uri", packageEntry.getKey());
+ String[] parts = AbiUtils.parseId(packageEntry.getKey());
+ serializer.attribute(null, ABI_ATTR, parts[0]);
+ serializer.attribute(null, NAME_ATTR, parts[1]);
serializeFilter(serializer, packageEntry.getValue());
serializer.endTag(null, ENTRY_TAG);
}
@@ -206,10 +223,10 @@
/**
* Adds an xml attribute containing {@link TestFilter} contents.
* <p/>
- * If {@link TestFilter} is empty, no data will be outputted.
+ * If {@link TestFilter} is empty, no data will be output.
*
* @param serializer
- * @param value
+ * @param testFilter
* @throws IOException
*/
private void serializeFilter(KXmlSerializer serializer, TestFilter testFilter)
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/VMHostTest.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/VMHostTest.java
index 9b4c86d..0ebdeea 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/VMHostTest.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/VMHostTest.java
@@ -16,19 +16,12 @@
package com.android.cts.tradefed.testtype;
import com.android.cts.tradefed.build.CtsBuildHelper;
-import com.android.tradefed.config.ConfigurationException;
-import com.android.tradefed.config.Option;
-import com.android.tradefed.config.Option.Importance;
-import com.android.tradefed.config.OptionSetter;
import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.device.ITestDevice;
import com.android.tradefed.log.LogUtil.CLog;
import com.android.tradefed.result.ITestInvocationListener;
-import com.android.tradefed.util.AbiFormatter;
import com.android.tradefed.util.FileUtil;
-import junit.framework.Test;
-
import java.io.File;
import java.io.IOException;
import java.util.zip.ZipFile;
@@ -42,12 +35,6 @@
private static final String VM_TEST_TEMP_DIR = "/data/local/tmp/vm-tests";
private static final String EMULATOR_TEMP_DIR = "/data/local/tmp";
- @Option(name = AbiFormatter.FORCE_ABI_STRING,
- description = AbiFormatter.FORCE_ABI_DESCRIPTION,
- importance = Importance.IF_UNSET)
- private String mForceAbi = null;
-
-
/**
* {@inheritDoc}
*/
@@ -108,14 +95,6 @@
return true;
}
- @Override
- protected void setOptions(Test junitTest) throws ConfigurationException{
- if (mForceAbi != null) {
- OptionSetter optionSetter = new OptionSetter(junitTest);
- optionSetter.setOptionValue(AbiFormatter.FORCE_ABI_STRING, mForceAbi);
- }
- }
-
/**
* Removes temporary file directory from device
*
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/WrappedGTest.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/WrappedGTest.java
index 78cd6f77..a5c3e4c 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/WrappedGTest.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/WrappedGTest.java
@@ -17,18 +17,17 @@
package com.android.cts.tradefed.testtype;
import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.cts.util.AbiUtils;
import com.android.ddmlib.testrunner.ITestRunListener;
import com.android.tradefed.build.IBuildInfo;
-import com.android.tradefed.config.Option;
-import com.android.tradefed.config.Option.Importance;
import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.device.ITestDevice;
import com.android.tradefed.log.LogUtil.CLog;
import com.android.tradefed.result.ITestInvocationListener;
+import com.android.tradefed.testtype.IAbi;
import com.android.tradefed.testtype.IBuildReceiver;
import com.android.tradefed.testtype.IDeviceTest;
import com.android.tradefed.testtype.IRemoteTest;
-import com.android.tradefed.util.AbiFormatter;
import java.io.File;
import java.io.FileNotFoundException;
@@ -38,26 +37,31 @@
*/
public class WrappedGTest implements IBuildReceiver, IDeviceTest, IRemoteTest {
+ private static final String LOG_TAG = WrappedGTest.class.getSimpleName();
+
private int mMaxTestTimeMs = 1 * 60 * 1000;
private CtsBuildHelper mCtsBuild;
private ITestDevice mDevice;
+ private IAbi mAbi;
private final String mAppNameSpace;
- private final String mRunner;
+ private final String mPackageName;
private final String mName;
- private final String mUri;
+ private final String mRunner;
- @Option(name = AbiFormatter.FORCE_ABI_STRING,
- description = AbiFormatter.FORCE_ABI_DESCRIPTION,
- importance = Importance.IF_UNSET)
- private String mForceAbi = null;
-
- public WrappedGTest(String appNameSpace, String uri, String name, String runner) {
+ public WrappedGTest(String appNameSpace, String packageName, String name, String runner) {
mAppNameSpace = appNameSpace;
- mRunner = runner;
+ mPackageName = packageName;
mName = name;
- mUri = uri;
+ mRunner = runner;
+ }
+
+ /**
+ * @param abi The ABI to run the test on
+ */
+ public void setAbi(IAbi abi) {
+ mAbi = abi;
}
@Override
@@ -88,7 +92,8 @@
private boolean installTest() throws DeviceNotAvailableException {
try {
File testApp = mCtsBuild.getTestApp(String.format("%s.apk", mName));
- String installCode = mDevice.installPackage(testApp, true);
+ String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
+ String installCode = mDevice.installPackage(testApp, true, options);
if (installCode != null) {
CLog.e("Failed to install %s.apk on %s. Reason: %s", mName,
@@ -104,16 +109,11 @@
}
private void runTest(ITestRunListener listener) throws DeviceNotAvailableException {
- WrappedGTestResultParser resultParser = new WrappedGTestResultParser(mUri, listener);
- resultParser.setFakePackagePrefix(mUri + ".");
+ String id = AbiUtils.createId(mAbi.getName(), mPackageName);
+ WrappedGTestResultParser resultParser = new WrappedGTestResultParser(id, listener);
+ resultParser.setFakePackagePrefix(mPackageName + ".");
try {
- String options = "";
- if (mForceAbi != null) {
- String abi = AbiFormatter.getDefaultAbi(getDevice(), mForceAbi);
- if (abi != null) {
- options = String.format("--abi %s ", abi);
- }
- }
+ String options = mAbi == null ? "" : String.format("--abi %s ", mAbi);
String command = String.format("am instrument -w %s%s/.%s", options, mAppNameSpace, mRunner);
mDevice.executeShellCommand(command, resultParser, mMaxTestTimeMs, 0);
} catch (DeviceNotAvailableException e) {
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/WrappedGTestResultParser.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/WrappedGTestResultParser.java
index cc3c53a..3050738 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/WrappedGTestResultParser.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/WrappedGTestResultParser.java
@@ -29,23 +29,23 @@
/**
* Creates the WrappedGTestResultParser.
*
- * @param testRunName the test run name to provide to
+ * @param testRunId the test run id to provide to
* {@link ITestRunListener#testRunStarted(String, int)}
* @param listeners informed of test results as the tests are executing
*/
- public WrappedGTestResultParser(String testRunName, Collection<ITestRunListener> listeners) {
- super(testRunName, listeners);
+ public WrappedGTestResultParser(String testRunId, Collection<ITestRunListener> listeners) {
+ super(testRunId, listeners);
}
/**
* Creates the WrappedGTestResultParser for a single listener.
*
- * @param testRunName the test run name to provide to
+ * @param testRunId the test run id to provide to
* {@link ITestRunListener#testRunStarted(String, int)}
* @param listener informed of test results as the tests are executing
*/
- public WrappedGTestResultParser(String testRunName, ITestRunListener listener) {
- super(testRunName, listener);
+ public WrappedGTestResultParser(String testRunId, ITestRunListener listener) {
+ super(testRunId, listener);
}
/**
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/util/CtsHostStore.java b/tools/tradefed-host/src/com/android/cts/tradefed/util/CtsHostStore.java
index 9c1e283..186d08e 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/util/CtsHostStore.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/util/CtsHostStore.java
@@ -33,26 +33,27 @@
* Note that key is generated in the form of device_serial#class#method name.
* So there should be no concurrent test for the same (serial, class, method).
* @param deviceSerial
+ * @param abi
* @param classMethodName
* @param result CTS result string
*/
- public static void storeCtsResult(String deviceSerial, String classMethodName, String result) {
- mMap.put(generateTestKey(deviceSerial, classMethodName), result);
+ public static void storeCtsResult(String deviceSerial, String abi, String classMethodName, String result) {
+ mMap.put(generateTestKey(deviceSerial, abi, classMethodName), result);
}
/**
* retrieves a CTS result for the given condition and remove it from the internal
* storage. If there is no result for the given condition, it will return null.
*/
- public static String removeCtsResult(String deviceSerial, String classMethodName) {
- return mMap.remove(generateTestKey(deviceSerial, classMethodName));
+ public static String removeCtsResult(String deviceSerial, String abi, String classMethodName) {
+ return mMap.remove(generateTestKey(deviceSerial, abi, classMethodName));
}
/**
- * return test key in the form of device_serial#class_name#method_name
+ * return test key in the form of device_serial#abi#class_name#method_name
*/
- private static String generateTestKey(String deviceSerial, String classMethodName) {
- return String.format("%s#%s", deviceSerial, classMethodName);
+ private static String generateTestKey(String deviceSerial, String abi, String classMethodName) {
+ return String.format("%s#%s#%s", deviceSerial, abi, classMethodName);
}
}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/util/HostReportLog.java b/tools/tradefed-host/src/com/android/cts/tradefed/util/HostReportLog.java
index 125c56e..25676ba 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/util/HostReportLog.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/util/HostReportLog.java
@@ -24,19 +24,22 @@
*/
public class HostReportLog extends ReportLog {
private String mDeviceSerial;
+ private String mAbiName;
private String mClassMethodName;
/**
* @param deviceSerial serial number of the device
+ * @param abiName the name of the ABI on which the test was run
* @param classMethodName class name and method name of the test in class#method format.
* Note that ReportLog.getClassMethodNames() provide this.
*/
- public HostReportLog(String deviceSerial, String classMethodName) {
+ public HostReportLog(String deviceSerial, String abiName, String classMethodName) {
mDeviceSerial = deviceSerial;
+ mAbiName = abiName;
mClassMethodName = classMethodName;
}
public void deliverReportToHost() {
- CtsHostStore.storeCtsResult(mDeviceSerial, mClassMethodName, generateReport());
+ CtsHostStore.storeCtsResult(mDeviceSerial, mAbiName, mClassMethodName, generateReport());
}
}
diff --git a/tools/tradefed-host/tests/src/com/android/cts/tradefed/UnitTests.java b/tools/tradefed-host/tests/src/com/android/cts/tradefed/UnitTests.java
index 65528b7..e46cfae 100644
--- a/tools/tradefed-host/tests/src/com/android/cts/tradefed/UnitTests.java
+++ b/tools/tradefed-host/tests/src/com/android/cts/tradefed/UnitTests.java
@@ -21,14 +21,17 @@
import com.android.cts.tradefed.result.TestResultsTest;
import com.android.cts.tradefed.result.TestSummaryXmlTest;
import com.android.cts.tradefed.result.TestTest;
+import com.android.cts.tradefed.testtype.Abi;
import com.android.cts.tradefed.testtype.CtsTestTest;
-import com.android.cts.tradefed.testtype.DeqpTestTest;
+import com.android.cts.tradefed.testtype.DeqpTestRunnerTest;
import com.android.cts.tradefed.testtype.JarHostTestTest;
import com.android.cts.tradefed.testtype.TestFilterTest;
import com.android.cts.tradefed.testtype.TestPackageDefTest;
import com.android.cts.tradefed.testtype.TestPackageXmlParserTest;
import com.android.cts.tradefed.testtype.TestPlanTest;
import com.android.cts.tradefed.testtype.WrappedGTestResultParserTest;
+import com.android.cts.util.AbiUtils;
+import com.android.tradefed.testtype.IAbi;
import junit.framework.Test;
import junit.framework.TestSuite;
@@ -41,6 +44,8 @@
*/
public class UnitTests extends TestSuite {
+ public static final IAbi ABI = new Abi("armeabi-v7a", "32");
+
public UnitTests() {
super();
@@ -60,7 +65,7 @@
addTestSuite(TestPackageXmlParserTest.class);
addTestSuite(TestPlanTest.class);
addTestSuite(WrappedGTestResultParserTest.class);
- addTestSuite(DeqpTestTest.class);
+ addTestSuite(DeqpTestRunnerTest.class);
}
public static Test suite() {
diff --git a/tools/tradefed-host/tests/src/com/android/cts/tradefed/device/DeviceInfoCollectorFuncTest.java b/tools/tradefed-host/tests/src/com/android/cts/tradefed/device/DeviceInfoCollectorFuncTest.java
index b0c9e6d..52a205b 100644
--- a/tools/tradefed-host/tests/src/com/android/cts/tradefed/device/DeviceInfoCollectorFuncTest.java
+++ b/tools/tradefed-host/tests/src/com/android/cts/tradefed/device/DeviceInfoCollectorFuncTest.java
@@ -15,6 +15,7 @@
*/
package com.android.cts.tradefed.device;
+import com.android.cts.tradefed.UnitTests;
import com.android.tradefed.build.BuildInfo;
import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.result.CollectingTestListener;
@@ -34,7 +35,7 @@
CollectingTestListener testListener = new CollectingTestListener();
testListener.invocationStarted(new BuildInfo());
- DeviceInfoCollector.collectDeviceInfo(getDevice(), new File(
+ DeviceInfoCollector.collectDeviceInfo(getDevice(), UnitTests.ABI.getName(), new File(
System.getProperty("java.io.tmpdir")), testListener);
assertNotNull(testListener.getCurrentRunResults());
assertTrue(testListener.getCurrentRunResults().getRunMetrics().size() > 0);
diff --git a/tools/tradefed-host/tests/src/com/android/cts/tradefed/result/CtsXmlResultReporterTest.java b/tools/tradefed-host/tests/src/com/android/cts/tradefed/result/CtsXmlResultReporterTest.java
index 26cf39c..b312526 100644
--- a/tools/tradefed-host/tests/src/com/android/cts/tradefed/result/CtsXmlResultReporterTest.java
+++ b/tools/tradefed-host/tests/src/com/android/cts/tradefed/result/CtsXmlResultReporterTest.java
@@ -17,6 +17,8 @@
import static com.android.cts.tradefed.result.CtsXmlResultReporter.CTS_RESULT_FILE_VERSION;
+import com.android.cts.tradefed.UnitTests;
+import com.android.cts.util.AbiUtils;
import com.android.ddmlib.testrunner.ITestRunListener.TestFailure;
import com.android.ddmlib.testrunner.TestIdentifier;
import com.android.tradefed.build.IFolderBuildInfo;
@@ -48,6 +50,7 @@
new ArrayList<>(Arrays.asList(new TestSummary("TEST_SUMMARY_URL")));
private CtsXmlResultReporter mResultReporter;
private ByteArrayOutputStream mOutputStream;
+ private File mBuildDir;
private File mReportDir;
private IFolderBuildInfo mMockBuild;
@@ -73,8 +76,16 @@
// TODO: use mock file dir instead
mReportDir = FileUtil.createTempDir("foo");
mResultReporter.setReportDir(mReportDir);
+ mBuildDir = FileUtil.createTempDir("build");
+ File ctsDir = new File(mBuildDir, "android-cts");
+ File repoDir = new File(ctsDir, "repository");
+ File casesDir = new File(repoDir, "testcases");
+ File plansDir = new File(repoDir, "plans");
+ assertTrue(casesDir.mkdirs());
+ assertTrue(plansDir.mkdirs());
mMockBuild = EasyMock.createNiceMock(IFolderBuildInfo.class);
EasyMock.expect(mMockBuild.getDeviceSerial()).andStubReturn(null);
+ EasyMock.expect(mMockBuild.getRootDir()).andStubReturn(mBuildDir);
EasyMock.replay(mMockBuild);
}
@@ -83,6 +94,9 @@
if (mReportDir != null) {
FileUtil.recursiveDelete(mReportDir);
}
+ if (mBuildDir != null) {
+ FileUtil.recursiveDelete(mBuildDir);
+ }
super.tearDown();
}
@@ -117,19 +131,18 @@
Map<String, String> emptyMap = Collections.emptyMap();
final TestIdentifier testId = new TestIdentifier("com.foo.FooTest", "testFoo");
mResultReporter.invocationStarted(mMockBuild);
- mResultReporter.testRunStarted("run", 1);
+ mResultReporter.testRunStarted(AbiUtils.createId(UnitTests.ABI.getName(), "run"), 1);
mResultReporter.testStarted(testId);
mResultReporter.testEnded(testId, emptyMap);
mResultReporter.testRunEnded(3000, emptyMap);
mResultReporter.invocationEnded(1);
mResultReporter.putSummary(SUMMARY_LIST);
String output = getOutput();
- CLog.d("Actual output: %s", output);
- System.out.println(output);
// TODO: consider doing xml based compare
assertTrue(output.contains(
- "<Summary failed=\"0\" notExecuted=\"0\" timeout=\"0\" pass=\"1\" />"));
- assertTrue(output.contains("<TestPackage name=\"\" appPackageName=\"run\" digest=\"\">"));
+ "<Summary failed=\"0\" notExecuted=\"0\" timeout=\"0\" pass=\"1\" />"));
+ assertTrue(output.contains("<TestPackage name=\"\" appPackageName=\"run\" abi=\"" +
+ UnitTests.ABI.getName() + "\" digest=\"\">"));
assertTrue(output.contains("<TestCase name=\"FooTest\" priority=\"\">"));
final String testCaseTag = String.format(
@@ -145,20 +158,19 @@
final TestIdentifier testId = new TestIdentifier("FooTest", "testFoo");
final String trace = "this is a trace\nmore trace\nyet more trace";
mResultReporter.invocationStarted(mMockBuild);
- mResultReporter.testRunStarted("run", 1);
+ mResultReporter.testRunStarted(AbiUtils.createId(UnitTests.ABI.getName(), "run"), 1);
mResultReporter.testStarted(testId);
mResultReporter.testFailed(TestFailure.FAILURE, testId, trace);
mResultReporter.testEnded(testId, emptyMap);
mResultReporter.testRunEnded(3, emptyMap);
mResultReporter.invocationEnded(1);
- String output = getOutput();
- System.out.print(getOutput());
+ String output = getOutput();
// TODO: consider doing xml based compare
assertTrue(output.contains(
"<Summary failed=\"1\" notExecuted=\"0\" timeout=\"0\" pass=\"0\" />"));
final String failureTag =
- "<FailedScene message=\"this is a trace more trace\"> " +
- "<StackTrace>this is a tracemore traceyet more trace</StackTrace>";
+ "<FailedScene message=\"this is a trace more trace\"> " +
+ "<StackTrace>this is a tracemore traceyet more trace</StackTrace>";
assertTrue(output.contains(failureTag));
}
diff --git a/tools/tradefed-host/tests/src/com/android/cts/tradefed/result/TestPackageResultTest.java b/tools/tradefed-host/tests/src/com/android/cts/tradefed/result/TestPackageResultTest.java
index df80dbb..57d322e 100644
--- a/tools/tradefed-host/tests/src/com/android/cts/tradefed/result/TestPackageResultTest.java
+++ b/tools/tradefed-host/tests/src/com/android/cts/tradefed/result/TestPackageResultTest.java
@@ -20,6 +20,7 @@
import junit.framework.TestCase;
import java.util.Collection;
+import java.util.HashMap;
/**
* Unit tests for {@link TestPackageResult}.
@@ -33,7 +34,7 @@
TestPackageResult pkgResult = new TestPackageResult();
TestIdentifier excludedTest = new TestIdentifier("com.example.ExampleTest", "testPass");
pkgResult.insertTest(excludedTest);
- pkgResult.reportTestEnded(excludedTest);
+ pkgResult.reportTestEnded(excludedTest, new HashMap<String, String>());
TestIdentifier includedTest = new TestIdentifier("com.example.ExampleTest",
"testNotExecuted");
pkgResult.insertTest(includedTest);
diff --git a/tools/tradefed-host/tests/src/com/android/cts/tradefed/result/TestSummaryXmlTest.java b/tools/tradefed-host/tests/src/com/android/cts/tradefed/result/TestSummaryXmlTest.java
index 3fc7dd2..f8b135a 100644
--- a/tools/tradefed-host/tests/src/com/android/cts/tradefed/result/TestSummaryXmlTest.java
+++ b/tools/tradefed-host/tests/src/com/android/cts/tradefed/result/TestSummaryXmlTest.java
@@ -38,7 +38,7 @@
"<Foo failed=\"1\" notExecuted=\"2\" pass=\"3\" timeout=\"4\"/>" +
"</TestResult>";
- public void testConstructor() throws ParseException {
+ public void testConstructor() {
TestSummaryXml result = new TestSummaryXml(1, "2011-11-01");
assertEquals(1, result.getId());
assertEquals("2011-11-01", result.getTimestamp());
diff --git a/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/CtsTestTest.java b/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/CtsTestTest.java
index f0fd536..40a9475 100644
--- a/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/CtsTestTest.java
+++ b/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/CtsTestTest.java
@@ -15,8 +15,10 @@
*/
package com.android.cts.tradefed.testtype;
+import com.android.cts.tradefed.UnitTests;
import com.android.cts.tradefed.build.StubCtsBuildHelper;
import com.android.cts.tradefed.result.PlanCreator;
+import com.android.cts.util.AbiUtils;
import com.android.ddmlib.testrunner.TestIdentifier;
import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.device.ITestDevice;
@@ -33,14 +35,24 @@
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
-import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
/**
* Unit tests for {@link CtsTest}.
*/
public class CtsTestTest extends TestCase {
- private static final String PACKAGE_NAME = "test-uri";
+ private static final String PLAN_NAME = "CTS";
+ private static final String PACKAGE_NAME = "test-name";
+ private static final String ID = AbiUtils.createId(UnitTests.ABI.getName(), PACKAGE_NAME);
+ private static final Set<String> NAMES = new HashSet<>();
+ private static final Set<String> IDS = new HashSet<>();
+ static {
+ NAMES.add(PACKAGE_NAME);
+ IDS.add(ID);
+ }
+
/** the test fixture under test, with all external dependencies mocked out */
private CtsTest mCtsTest;
private ITestPackageRepo mMockRepo;
@@ -49,10 +61,9 @@
private ITestInvocationListener mMockListener;
private StubCtsBuildHelper mStubBuildHelper;
private ITestPackageDef mMockPackageDef;
+ private Set<ITestPackageDef> mMockPackageDefs;
private IRemoteTest mMockTest;
- private static final String PLAN_NAME = "CTS";
-
/**
* {@inheritDoc}
*/
@@ -64,7 +75,11 @@
mMockDevice = EasyMock.createMock(ITestDevice.class);
mMockListener = EasyMock.createNiceMock(ITestInvocationListener.class);
mStubBuildHelper = new StubCtsBuildHelper();
+ mMockPackageDefs = new HashSet<ITestPackageDef>();
mMockPackageDef = EasyMock.createMock(ITestPackageDef.class);
+ mMockPackageDefs.add(mMockPackageDef);
+ EasyMock.expect(mMockPackageDef.getTargetApkName()).andStubReturn(null);
+ EasyMock.expect(mMockPackageDef.getTargetPackageName()).andStubReturn(null);
mMockTest = EasyMock.createMock(IRemoteTest.class);
mCtsTest = new CtsTest() {
@@ -93,12 +108,13 @@
mCtsTest.setBuildHelper(mStubBuildHelper);
// turn off device collection for simplicity
mCtsTest.setSkipDeviceInfo(true);
- EasyMock.expect(mMockPackageDef.getTargetApkName()).andStubReturn(null);
- EasyMock.expect(mMockPackageDef.getTargetPackageName()).andStubReturn(null);
+ // only run tests on one ABI
+ EasyMock.expect(mMockDevice.getProperty("ro.product.cpu.abilist")).andReturn(
+ UnitTests.ABI.getName()).anyTimes();
}
/**
- * Test normal case {@link CtsTest#run(java.util.List)} when running a plan.
+ * Test normal case {@link CtsTest#run(ITestInvocationListener)} when running a plan.
*/
@SuppressWarnings("unchecked")
public void testRun_plan() throws DeviceNotAvailableException, ParseException {
@@ -112,7 +128,7 @@
}
/**
- * Test normal case {@link CtsTest#run(java.util.List)} when running a package.
+ * Test normal case {@link CtsTest#run(ITestInvocationListener)} when running a package.
*/
@SuppressWarnings("unchecked")
public void testRun_package() throws DeviceNotAvailableException {
@@ -138,8 +154,6 @@
// now expect test to be resumed
mMockTest.run((ITestInvocationListener)EasyMock.anyObject());
- EasyMock.expect(mMockPackageDef.getName()).andReturn(PACKAGE_NAME);
- EasyMock.expect(mMockPackageDef.getDigest()).andReturn("digest");
replayMocks();
try {
@@ -154,7 +168,7 @@
}
/**
- * Test normal case {@link CtsTest#run(java.util.List)} when running a class.
+ * Test normal case {@link CtsTest#run(ITestInvocationListener)} when running a class.
*/
@SuppressWarnings("unchecked")
public void testRun_class() throws DeviceNotAvailableException {
@@ -163,7 +177,7 @@
mCtsTest.setClassName(className);
mCtsTest.setMethodName(methodName);
- EasyMock.expect(mMockRepo.findPackageForTest(className)).andReturn(PACKAGE_NAME);
+ EasyMock.expect(mMockRepo.findPackageIdsForTest(className)).andReturn(IDS);
mMockPackageDef.setClassName(className, methodName);
setCreateAndRunTestExpectations();
@@ -174,14 +188,12 @@
}
/**
- * Test {@link CtsTest#run(java.util.List)} when --excluded-package is specified
+ * Test {@link CtsTest#run(ITestInvocationListener)} when --excluded-package is specified
*/
public void testRun_excludedPackage() throws DeviceNotAvailableException, ParseException {
mCtsTest.setPlanName(PLAN_NAME);
- mMockPlan.parse((InputStream)EasyMock.anyObject());
- Collection<String> uris = new ArrayList<String>(1);
- uris.add(PACKAGE_NAME);
- EasyMock.expect(mMockPlan.getTestUris()).andReturn(uris);
+ mMockPlan.parse((InputStream) EasyMock.anyObject());
+ EasyMock.expect(mMockPlan.getTestIds()).andReturn(IDS);
mCtsTest.addExcludedPackageName(PACKAGE_NAME);
@@ -192,17 +204,15 @@
}
/**
- * Test {@link CtsTest#run(ITestInvocationListener))} when --continue-session is specified
+ * Test {@link CtsTest#run(ITestInvocationListener)} when --continue-session is specified
*/
- public void testRun_continueSession() throws DeviceNotAvailableException, ParseException {
+ public void testRun_continueSession() throws DeviceNotAvailableException {
mCtsTest.setContinueSessionId(1);
- Collection<String> uris = new ArrayList<String>(1);
- uris.add(PACKAGE_NAME);
- EasyMock.expect(mMockPlan.getTestUris()).andReturn(uris);
+ EasyMock.expect(mMockPlan.getTestIds()).andReturn(IDS);
TestFilter filter = new TestFilter();
- EasyMock.expect(mMockPlan.getExcludedTestFilter(PACKAGE_NAME)).andReturn(
- filter);
- mMockPackageDef.setExcludedTestFilter(filter);
+ EasyMock.expect(mMockPlan.getTestFilter(ID)).andReturn(filter);
+
+ mMockPackageDef.setTestFilter(filter);
setCreateAndRunTestExpectations();
@@ -216,34 +226,33 @@
*/
private void setParsePlanExceptations() throws ParseException {
mCtsTest.setPlanName(PLAN_NAME);
- mMockPlan.parse((InputStream)EasyMock.anyObject());
- Collection<String> uris = new ArrayList<String>(1);
- uris.add(PACKAGE_NAME);
- EasyMock.expect(mMockPlan.getTestUris()).andReturn(uris);
+ mMockPlan.parse((InputStream) EasyMock.anyObject());
+ EasyMock.expect(mMockPlan.getTestIds()).andReturn(IDS);
TestFilter filter = new TestFilter();
- EasyMock.expect(mMockPlan.getExcludedTestFilter(PACKAGE_NAME)).andReturn(
- filter);
- mMockPackageDef.setExcludedTestFilter(filter);
+ EasyMock.expect(mMockPlan.getTestFilter(ID)).andReturn(filter);
+ mMockPackageDef.setTestFilter(filter);
}
/**
* Set EasyMock expectations for creating and running a package with PACKAGE_NAME
*/
private void setCreateAndRunTestExpectations() throws DeviceNotAvailableException {
- EasyMock.expect(mMockRepo.getTestPackage(PACKAGE_NAME)).andReturn(mMockPackageDef);
- EasyMock.expect(mMockPackageDef.createTest((File)EasyMock.anyObject())).andReturn(
- mMockTest);
+ EasyMock.expect(mMockRepo.getPackageNames()).andReturn(NAMES).anyTimes();
+ EasyMock.expect(mMockRepo.getPackageIds()).andReturn(IDS).anyTimes();
+ EasyMock.expect(mMockRepo.getTestPackages(PACKAGE_NAME)).andReturn(mMockPackageDefs).anyTimes();
+ EasyMock.expect(mMockRepo.getTestPackage(ID)).andReturn(mMockPackageDef).anyTimes();
+ EasyMock.expect(mMockPackageDef.createTest((File) EasyMock.anyObject())).andReturn(mMockTest);
EasyMock.expect(mMockPackageDef.getTests()).andReturn(new ArrayList<TestIdentifier>());
- EasyMock.expect(mMockPackageDef.getUri()).andStubReturn(PACKAGE_NAME);
- EasyMock.expect(mMockPackageDef.getName()).andReturn(PACKAGE_NAME);
- EasyMock.expect(mMockPackageDef.getDigest()).andReturn("digest");
-
- mMockTest.run((ITestInvocationListener)EasyMock.anyObject());
+ EasyMock.expect(mMockPackageDef.getName()).andReturn(PACKAGE_NAME).atLeastOnce();
+ EasyMock.expect(mMockPackageDef.getAbi()).andReturn(UnitTests.ABI).atLeastOnce();
+ EasyMock.expect(mMockPackageDef.getId()).andReturn(ID).atLeastOnce();
+ EasyMock.expect(mMockPackageDef.getDigest()).andReturn("digest").atLeastOnce();
+ mMockTest.run((ITestInvocationListener) EasyMock.anyObject());
}
/**
- * Test {@link CtsTest#run(java.util.List)} when --plan and --package options have not been
- * specified
+ * Test {@link CtsTest#run(ITestInvocationListener)} when --plan and --package options have not
+ * been specified
*/
public void testRun_nothingToRun() throws DeviceNotAvailableException {
try {
@@ -255,7 +264,7 @@
}
/**
- * Test {@link CtsTest#run(ITestInvocationListener))} when --plan and --package options have
+ * Test {@link CtsTest#run(ITestInvocationListener)} when --plan and --package options have
* been specified.
*/
public void testRun_packagePlan() throws DeviceNotAvailableException {
@@ -270,7 +279,7 @@
}
/**
- * Test {@link CtsTest#run(java.util.List)} when --plan and --class options have been
+ * Test {@link CtsTest#run(ITestInvocationListener)} when --plan and --class options have been
* specified
*/
public void testRun_planClass() throws DeviceNotAvailableException {
@@ -285,8 +294,8 @@
}
/**
- * Test {@link CtsTest#run(java.util.List)} when --package and --class options have been
- * specified
+ * Test {@link CtsTest#run(ITestInvocationListener)} when --package and --class options have
+ * been specified
*/
public void testRun_packageClass() throws DeviceNotAvailableException {
mCtsTest.addPackageName(PACKAGE_NAME);
@@ -300,8 +309,8 @@
}
/**
- * Test {@link CtsTest#run(java.util.List)} when --plan, --package and --class options have been
- * specified
+ * Test {@link CtsTest#run(ITestInvocationListener)} when --plan, --package and --class options
+ * have been specified
*/
public void testRun_planPackageClass() throws DeviceNotAvailableException {
mCtsTest.setPlanName(PLAN_NAME);
@@ -316,8 +325,8 @@
}
/**
- * Test {@link CtsTest#run(java.util.List)} when --plan, --continue-option options have been
- * specified
+ * Test {@link CtsTest#run(ITestInvocationListener)} when --plan, --continue-option options
+ * have been specified
*/
public void testRun_planContinue() throws DeviceNotAvailableException {
mCtsTest.setPlanName(PLAN_NAME);
@@ -331,14 +340,12 @@
}
private void replayMocks(Object... mocks) {
- EasyMock.replay(mMockRepo, mMockPlan, mMockDevice, mMockListener, mMockPackageDef,
- mMockTest);
+ EasyMock.replay(mMockRepo, mMockPlan, mMockDevice, mMockPackageDef, mMockListener, mMockTest);
EasyMock.replay(mocks);
}
private void verifyMocks(Object... mocks) {
- EasyMock.verify(mMockRepo, mMockPlan, mMockDevice, mMockListener, mMockPackageDef,
- mMockTest);
+ EasyMock.verify(mMockRepo, mMockPlan, mMockDevice, mMockPackageDef, mMockListener, mMockTest);
EasyMock.verify(mocks);
}
}
diff --git a/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/DeqpTestTest.java b/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/DeqpTestRunnerTest.java
similarity index 66%
rename from tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/DeqpTestTest.java
rename to tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/DeqpTestRunnerTest.java
index 0be2b80..03ebfc5 100644
--- a/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/DeqpTestTest.java
+++ b/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/DeqpTestRunnerTest.java
@@ -15,11 +15,14 @@
*/
package com.android.cts.tradefed.testtype;
+import com.android.cts.tradefed.UnitTests;
+import com.android.cts.util.AbiUtils;
import com.android.ddmlib.IShellOutputReceiver;
import com.android.ddmlib.testrunner.ITestRunListener;
import com.android.ddmlib.testrunner.TestIdentifier;
import com.android.tradefed.device.ITestDevice;
import com.android.tradefed.result.ITestInvocationListener;
+import com.android.tradefed.testtype.IAbi;
import junit.framework.TestCase;
@@ -28,18 +31,18 @@
import java.util.ArrayList;
import java.util.Collection;
-import java.util.Collections;
import java.util.Map;
/**
- * Unit tests for {@link DeqpTest}.
+ * Unit tests for {@link DeqpTestRunner}.
*/
-public class DeqpTestTest extends TestCase {
- private static final String URI = "dEQP-GLES3";
+public class DeqpTestRunnerTest extends TestCase {
+ private static final String NAME = "dEQP-GLES3";
+ private static final String ID = AbiUtils.createId(UnitTests.ABI.getName(), NAME);
private static final String CASE_LIST_FILE_NAME = "/sdcard/dEQP-TestCaseList.txt";
private static final String LOG_FILE_NAME = "/sdcard/TestLog.qpa";
private static final String INSTRUMENTATION_NAME =
- "com.drawelements.deqp/com.drawelements.deqp.testercore.DeqpInstrumentation";
+ "com.drawelements.deqp/com.drawelements.deqp.testercore.DeqpInstrumentation";
/**
* {@inheritDoc}
@@ -50,6 +53,125 @@
}
/**
+ * Test version of OpenGL ES.
+ */
+ private void testGlesVersion(int requiredMajorVersion, int requiredMinorVersion, int majorVersion, int minorVersion) throws Exception {
+ final TestIdentifier testId = new TestIdentifier("dEQP-GLES"
+ + Integer.toString(requiredMajorVersion) + Integer.toString(requiredMinorVersion)
+ + ".info", "version");
+
+ final String testPath = "dEQP-GLES"
+ + Integer.toString(requiredMajorVersion) + Integer.toString(requiredMinorVersion)
+ +".info.version";
+
+ final String testTrie = "{dEQP-GLES"
+ + Integer.toString(requiredMajorVersion) + Integer.toString(requiredMinorVersion)
+ + "{info{version}}}";
+
+ final String resultCode = "Pass";
+
+ /* MultiLineReceiver expects "\r\n" line ending. */
+ final String output = "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseName\r\n"
+ + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+ + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=2014.x\r\n"
+ + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+ + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseId\r\n"
+ + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+ + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=0xcafebabe\r\n"
+ + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+ + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=targetName\r\n"
+ + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+ + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=android\r\n"
+ + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+ + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginSession\r\n"
+ + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+ + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n"
+ + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=" + testPath + "\r\n"
+ + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+ + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=" + resultCode + "\r\n"
+ + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Detail" + resultCode + "\r\n"
+ + "INSTRUMENTATION_STATUS: dEQP-EventType=TestCaseResult\r\n"
+ + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+ + "INSTRUMENTATION_STATUS: dEQP-EventType=EndTestCase\r\n"
+ + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+ + "INSTRUMENTATION_STATUS: dEQP-EventType=EndSession\r\n"
+ + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+ + "INSTRUMENTATION_CODE: 0\r\n";
+
+ ITestDevice mockDevice = EasyMock.createMock(ITestDevice.class);
+ ITestInvocationListener mockListener
+ = EasyMock.createStrictMock(ITestInvocationListener.class);
+ Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+
+ tests.add(testId);
+
+ DeqpTestRunner deqpTest = new DeqpTestRunner(NAME,
+ "dEQP-GLES" + Integer.toString(requiredMajorVersion)
+ + (requiredMinorVersion > 0 ? Integer.toString(requiredMinorVersion) : ""),
+ tests);
+ deqpTest.setAbi(UnitTests.ABI);
+
+ int version = (majorVersion << 16) | minorVersion;
+ EasyMock.expect(mockDevice.getProperty("ro.opengles.version"))
+ .andReturn(Integer.toString(version)).atLeastOnce();
+
+ if (majorVersion > requiredMajorVersion
+ || (majorVersion == requiredMajorVersion && minorVersion >= requiredMinorVersion)) {
+
+ EasyMock.expect(mockDevice.executeShellCommand(
+ EasyMock.eq("rm " + CASE_LIST_FILE_NAME))).andReturn("").once();
+
+ EasyMock.expect(mockDevice.executeShellCommand(EasyMock.eq("rm " + LOG_FILE_NAME)))
+ .andReturn("").once();
+
+ EasyMock.expect(mockDevice.pushString(testTrie + "\n", CASE_LIST_FILE_NAME))
+ .andReturn(true).once();
+
+ String command = "am instrument -w -e deqpLogFileName \"" + LOG_FILE_NAME
+ + "\" -e deqpCmdLine \"--deqp-caselist-file=" + CASE_LIST_FILE_NAME + " "
+ + "--deqp-gl-config-name=rgba8888d24s8\" "
+ + INSTRUMENTATION_NAME;
+
+ mockDevice.executeShellCommand(EasyMock.eq(command),
+ EasyMock.<IShellOutputReceiver>notNull());
+
+ EasyMock.expectLastCall().andAnswer(new IAnswer<Object>() {
+ @Override
+ public Object answer() {
+ IShellOutputReceiver receiver
+ = (IShellOutputReceiver)EasyMock.getCurrentArguments()[1];
+
+ receiver.addOutput(output.getBytes(), 0, output.length());
+ receiver.flush();
+
+ return null;
+ }
+ });
+ }
+
+ mockListener.testRunStarted(ID, 1);
+ EasyMock.expectLastCall().once();
+
+ mockListener.testStarted(EasyMock.eq(testId));
+ EasyMock.expectLastCall().once();
+
+ mockListener.testEnded(EasyMock.eq(testId), EasyMock.<Map<String, String>>notNull());
+ EasyMock.expectLastCall().once();
+
+ mockListener.testRunEnded(EasyMock.anyLong(), EasyMock.<Map<String, String>>notNull());
+ EasyMock.expectLastCall().once();
+
+ EasyMock.replay(mockDevice);
+ EasyMock.replay(mockListener);
+
+ deqpTest.setDevice(mockDevice);
+ deqpTest.run(mockListener);
+
+ EasyMock.verify(mockListener);
+ EasyMock.verify(mockDevice);
+ }
+
+ /**
* Test that result code produces correctly pass or fail.
*/
private void testResultCode(final String resultCode, boolean pass) throws Exception {
@@ -92,7 +214,12 @@
tests.add(testId);
- DeqpTest deqpTest = new DeqpTest(URI, tests);
+ DeqpTestRunner deqpTest = new DeqpTestRunner(NAME, NAME, tests);
+ deqpTest.setAbi(UnitTests.ABI);
+
+ int version = 3 << 16;
+ EasyMock.expect(mockDevice.getProperty("ro.opengles.version"))
+ .andReturn(Integer.toString(version)).atLeastOnce();
EasyMock.expect(mockDevice.executeShellCommand(EasyMock.eq("rm " + CASE_LIST_FILE_NAME)))
.andReturn("").once();
@@ -124,7 +251,7 @@
}
});
- mockListener.testRunStarted(URI, 1);
+ mockListener.testRunStarted(ID, 1);
EasyMock.expectLastCall().once();
mockListener.testStarted(EasyMock.eq(testId));
@@ -252,14 +379,20 @@
= "{dEQP-GLES3{info{vendor,renderer,version,shading_language_version,extensions,render_target}}}";
ITestDevice mockDevice = EasyMock.createMock(ITestDevice.class);
- ITestInvocationListener mockListener = EasyMock.createStrictMock(ITestInvocationListener.class);
+ ITestInvocationListener mockListener
+ = EasyMock.createStrictMock(ITestInvocationListener.class);
Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
for (TestIdentifier id : testIds) {
tests.add(id);
}
- DeqpTest deqpTest = new DeqpTest(URI, tests);
+ DeqpTestRunner deqpTest = new DeqpTestRunner(NAME, NAME, tests);
+ deqpTest.setAbi(UnitTests.ABI);
+
+ int version = 3 << 16;
+ EasyMock.expect(mockDevice.getProperty("ro.opengles.version"))
+ .andReturn(Integer.toString(version)).atLeastOnce();
EasyMock.expect(mockDevice.executeShellCommand(EasyMock.eq("rm " + CASE_LIST_FILE_NAME)))
.andReturn("").once();
@@ -275,7 +408,6 @@
+ "--deqp-gl-config-name=rgba8888d24s8\" "
+ INSTRUMENTATION_NAME;
-
mockDevice.executeShellCommand(EasyMock.eq(command),
EasyMock.<IShellOutputReceiver>notNull());
@@ -292,7 +424,7 @@
}
});
- mockListener.testRunStarted(URI, testPaths.length);
+ mockListener.testRunStarted(ID, testPaths.length);
EasyMock.expectLastCall().once();
for (int i = 0; i < testPaths.length; i++) {
@@ -319,6 +451,48 @@
}
/**
+ * Test OpeGL ES3 tests on device with OpenGL ES2.
+ */
+ public void testRun_require30DeviceVersion20() throws Exception {
+ testGlesVersion(3, 0, 2, 0);
+ }
+
+ /**
+ * Test OpeGL ES3.1 tests on device with OpenGL ES2.
+ */
+ public void testRun_require31DeviceVersion20() throws Exception {
+ testGlesVersion(3, 1, 2, 0);
+ }
+
+ /**
+ * Test OpeGL ES3 tests on device with OpenGL ES3.
+ */
+ public void testRun_require30DeviceVersion30() throws Exception {
+ testGlesVersion(3, 0, 3, 0);
+ }
+
+ /**
+ * Test OpeGL ES3.1 tests on device with OpenGL ES3.
+ */
+ public void testRun_require31DeviceVersion30() throws Exception {
+ testGlesVersion(3, 1, 3, 0);
+ }
+
+ /**
+ * Test OpeGL ES3 tests on device with OpenGL ES3.1.
+ */
+ public void testRun_require30DeviceVersion31() throws Exception {
+ testGlesVersion(3, 0, 3, 1);
+ }
+
+ /**
+ * Test OpeGL ES3.1 tests on device with OpenGL ES3.1.
+ */
+ public void testRun_require31DeviceVersion31() throws Exception {
+ testGlesVersion(3, 1, 3, 1);
+ }
+
+ /**
* Test dEQP Pass result code.
*/
public void testRun_resultPass() throws Exception {
diff --git a/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/TestPackageXmlParserTest.java b/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/TestPackageXmlParserTest.java
index ac3d394..5591b65 100644
--- a/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/TestPackageXmlParserTest.java
+++ b/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/TestPackageXmlParserTest.java
@@ -16,6 +16,8 @@
package com.android.cts.tradefed.testtype;
+import com.android.cts.tradefed.command.CtsConsole;
+import com.android.cts.util.AbiUtils;
import com.android.ddmlib.testrunner.TestIdentifier;
import com.android.tradefed.util.xml.AbstractXmlParser.ParseException;
@@ -68,67 +70,76 @@
* Test parsing test case xml containing an instrumentation test definition.
*/
public void testParse_instrPackage() throws ParseException {
- TestPackageXmlParser parser = new TestPackageXmlParser(true);
+ TestPackageXmlParser parser = new TestPackageXmlParser(AbiUtils.getAbisSupportedByCts(),
+ true);
parser.parse(getStringAsStream(INSTR_TEST_DATA));
- TestPackageDef def = parser.getTestPackageDef();
- assertEquals("com.example", def.getAppNameSpace());
- assertEquals("android.example", def.getUri());
- assertEquals("android.test.InstrumentationTestRunner", def.getRunner());
+ for (TestPackageDef def : parser.getTestPackageDefs()) {
+ assertEquals("com.example", def.getAppNameSpace());
+ assertEquals("android.example", def.getAppPackageName());
+ assertEquals("android.test.InstrumentationTestRunner", def.getRunner());
+ assertTrue(AbiUtils.isAbiSupportedByCts(def.getAbi().getName()));
+ }
}
/**
* Test parsing test case xml containing an host test attribute and test data.
*/
public void testParse_hostTest() throws ParseException {
- TestPackageXmlParser parser = new TestPackageXmlParser(true);
+ TestPackageXmlParser parser = new TestPackageXmlParser(AbiUtils.getAbisSupportedByCts(),
+ true);
parser.parse(getStringAsStream(HOST_TEST_DATA));
- TestPackageDef def = parser.getTestPackageDef();
- assertEquals(TestPackageDef.HOST_SIDE_ONLY_TEST, def.getTestType());
- assertEquals(3, def.getTests().size());
- Iterator<TestIdentifier> iterator = def.getTests().iterator();
+ for (TestPackageDef def : parser.getTestPackageDefs()) {
+ assertEquals(TestPackageDef.HOST_SIDE_ONLY_TEST, def.getTestType());
+ assertEquals(3, def.getTests().size());
+ Iterator<TestIdentifier> iterator = def.getTests().iterator();
- TestIdentifier firstTest = iterator.next();
- assertEquals("com.example.ExampleTest", firstTest.getClassName());
- assertEquals("testFoo", firstTest.getTestName());
+ TestIdentifier firstTest = iterator.next();
+ assertEquals("com.example.ExampleTest", firstTest.getClassName());
+ assertEquals("testFoo", firstTest.getTestName());
- TestIdentifier secondTest = iterator.next();
- assertEquals("com.example.ExampleTest", secondTest.getClassName());
- assertEquals("testFoo2", secondTest.getTestName());
+ TestIdentifier secondTest = iterator.next();
+ assertEquals("com.example.ExampleTest", secondTest.getClassName());
+ assertEquals("testFoo2", secondTest.getTestName());
- TestIdentifier thirdTest = iterator.next();
- assertEquals("com.example2.Example2Test", thirdTest.getClassName());
- assertEquals("testFoo", thirdTest.getTestName());
+ TestIdentifier thirdTest = iterator.next();
+ assertEquals("com.example2.Example2Test", thirdTest.getClassName());
+ assertEquals("testFoo", thirdTest.getTestName());
- assertFalse(iterator.hasNext());
+ assertFalse(iterator.hasNext());
+ }
}
public void testParse_hostTest_noKnownFailures() throws ParseException {
- TestPackageXmlParser parser = new TestPackageXmlParser(false);
+ TestPackageXmlParser parser = new TestPackageXmlParser(AbiUtils.getAbisSupportedByCts(),
+ false);
parser.parse(getStringAsStream(HOST_TEST_DATA));
- TestPackageDef def = parser.getTestPackageDef();
- assertEquals(TestPackageDef.HOST_SIDE_ONLY_TEST, def.getTestType());
- assertEquals(2, def.getTests().size());
- Iterator<TestIdentifier> iterator = def.getTests().iterator();
+ for (TestPackageDef def : parser.getTestPackageDefs()) {
+ assertEquals(TestPackageDef.HOST_SIDE_ONLY_TEST, def.getTestType());
+ assertEquals(2, def.getTests().size());
+ Iterator<TestIdentifier> iterator = def.getTests().iterator();
- TestIdentifier firstTest = iterator.next();
- assertEquals("com.example.ExampleTest", firstTest.getClassName());
- assertEquals("testFoo", firstTest.getTestName());
+ TestIdentifier firstTest = iterator.next();
+ assertEquals("com.example.ExampleTest", firstTest.getClassName());
+ assertEquals("testFoo", firstTest.getTestName());
- TestIdentifier thirdTest = iterator.next();
- assertEquals("com.example2.Example2Test", thirdTest.getClassName());
- assertEquals("testFoo", thirdTest.getTestName());
+ TestIdentifier thirdTest = iterator.next();
+ assertEquals("com.example2.Example2Test", thirdTest.getClassName());
+ assertEquals("testFoo", thirdTest.getTestName());
- assertFalse(iterator.hasNext());
+ assertFalse(iterator.hasNext());
+ }
}
/**
* Test parsing test case xml containing an invalid host test attribute.
*/
public void testParse_badHostTest() throws ParseException {
- TestPackageXmlParser parser = new TestPackageXmlParser(true);
+ TestPackageXmlParser parser = new TestPackageXmlParser(AbiUtils.getAbisSupportedByCts(),
+ true);
parser.parse(getStringAsStream(BAD_HOST_TEST_DATA));
- TestPackageDef def = parser.getTestPackageDef();
- assertFalse(TestPackageDef.HOST_SIDE_ONLY_TEST.equals(def.getTestType()));
+ for (TestPackageDef def : parser.getTestPackageDefs()) {
+ assertFalse(TestPackageDef.HOST_SIDE_ONLY_TEST.equals(def.getTestType()));
+ }
}
public void testParse_vmHostTest() throws ParseException {
@@ -140,19 +151,22 @@
}
private void assertTestType(String expectedType, String xml) throws ParseException {
- TestPackageXmlParser parser = new TestPackageXmlParser(true);
+ TestPackageXmlParser parser = new TestPackageXmlParser(AbiUtils.getAbisSupportedByCts(),
+ true);
parser.parse(getStringAsStream(xml));
- TestPackageDef def = parser.getTestPackageDef();
- assertEquals(expectedType, def.getTestType());
+ for (TestPackageDef def : parser.getTestPackageDefs()) {
+ assertEquals(expectedType, def.getTestType());
+ }
}
/**
* Test parsing a test case xml with no test package data.
*/
public void testParse_noData() throws ParseException {
- TestPackageXmlParser parser = new TestPackageXmlParser(true);
+ TestPackageXmlParser parser = new TestPackageXmlParser(AbiUtils.getAbisSupportedByCts(),
+ true);
parser.parse(getStringAsStream(NO_TEST_DATA));
- assertNull(parser.getTestPackageDef());
+ assertTrue(parser.getTestPackageDefs().isEmpty());
}
private InputStream getStringAsStream(String input) {
diff --git a/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/TestPlanTest.java b/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/TestPlanTest.java
index 18d4776..5b28539 100644
--- a/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/TestPlanTest.java
+++ b/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/TestPlanTest.java
@@ -16,6 +16,7 @@
package com.android.cts.tradefed.testtype;
+import com.android.cts.util.AbiUtils;
import com.android.ddmlib.testrunner.TestIdentifier;
import com.android.tradefed.util.xml.AbstractXmlParser.ParseException;
@@ -25,15 +26,19 @@
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collections;
import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
/**
* Unit tests for {@link TestPlan}.
*/
public class TestPlanTest extends TestCase {
- private static final String TEST_URI1 = "foo";
- private static final String TEST_URI2 = "foo2";
+ private static final String TEST_NAME1 = "foo";
+ private static final String TEST_NAME2 = "foo2";
private static final String EXCLUDE_TEST_CLASS = "com.example.FooTest";
private static final String EXCLUDE_TEST_METHOD = "testFoo";
private static final String EXCLUDE_TEST_METHOD2 = "testFoo2";
@@ -42,26 +47,26 @@
static final String TEST_DATA =
"<TestPlan version=\"1.0\">" +
- String.format("<Entry uri=\"%s\" />", TEST_URI1) +
- String.format("<Entry uri=\"%s\" />", TEST_URI2) +
+ String.format("<Entry name=\"%s\" />", TEST_NAME1) +
+ String.format("<Entry name=\"%s\" />", TEST_NAME2) +
"</TestPlan>";
static final String TEST_EXCLUDED_DATA =
"<TestPlan version=\"1.0\">" +
- String.format("<Entry uri=\"%s\" exclude=\"%s#%s\" />", TEST_URI1, EXCLUDE_TEST_CLASS,
+ String.format("<Entry name=\"%s\" exclude=\"%s#%s\" />", TEST_NAME1, EXCLUDE_TEST_CLASS,
EXCLUDE_TEST_METHOD) +
"</TestPlan>";
static final String TEST_MULTI_EXCLUDED_DATA =
"<TestPlan version=\"1.0\">" +
- String.format("<Entry uri=\"%s\" exclude=\"%s#%s;%s#%s\" />", TEST_URI1,
+ String.format("<Entry name=\"%s\" exclude=\"%s#%s;%s#%s\" />", TEST_NAME1,
EXCLUDE_TEST_CLASS, EXCLUDE_TEST_METHOD, EXCLUDE_TEST_CLASS,
EXCLUDE_TEST_METHOD2) +
"</TestPlan>";
static final String TEST_CLASS_EXCLUDED_DATA =
"<TestPlan version=\"1.0\">" +
- String.format("<Entry uri=\"%s\" exclude=\"%s\" />", TEST_URI1,
+ String.format("<Entry name=\"%s\" exclude=\"%s\" />", TEST_NAME1,
EXCLUDE_TEST_CLASS) +
"</TestPlan>";
@@ -70,11 +75,11 @@
@Override
protected void setUp() throws Exception {
super.setUp();
- mPlan = new TestPlan("plan");
+ mPlan = new TestPlan("plan", AbiUtils.getAbisSupportedByCts());
}
/**
- * Simple test for parsing a plan containing two uris
+ * Simple test for parsing a plan containing two names
*/
public void testParse() throws ParseException {
mPlan.parse(getStringAsStream(TEST_DATA));
@@ -86,13 +91,20 @@
* @param plan
*/
private void assertTestData(TestPlan plan) {
- assertEquals(2, plan.getTestUris().size());
- Iterator<String> iter = plan.getTestUris().iterator();
- // assert uris in order
- assertEquals(TEST_URI1, iter.next());
- assertEquals(TEST_URI2, iter.next());
- assertFalse(plan.getExcludedTestFilter(TEST_URI1).hasExclusion());
- assertFalse(plan.getExcludedTestFilter(TEST_URI2).hasExclusion());
+ Set<String> abis = AbiUtils.getAbisSupportedByCts();
+ assertEquals(2 * abis.size(), plan.getTestIds().size());
+ List<String> sortedAbis = new ArrayList<String>(abis);
+ Collections.sort(sortedAbis);
+ Iterator<String> iter = plan.getTestIds().iterator();
+ for (String abi : sortedAbis) {
+ String test1Id = AbiUtils.createId(abi, TEST_NAME1);
+ String test2Id = AbiUtils.createId(abi, TEST_NAME2);
+ // assert names in order
+ assertEquals(test1Id, iter.next());
+ assertEquals(test2Id, iter.next());
+ assertFalse(plan.getTestFilter(test1Id).hasExclusion());
+ assertFalse(plan.getTestFilter(test2Id).hasExclusion());
+ }
}
/**
@@ -100,10 +112,15 @@
*/
public void testParse_exclude() throws ParseException {
mPlan.parse(getStringAsStream(TEST_EXCLUDED_DATA));
- assertEquals(1, mPlan.getTestUris().size());
- TestFilter filter = mPlan.getExcludedTestFilter(TEST_URI1);
- assertTrue(filter.getExcludedTests().contains(new TestIdentifier(EXCLUDE_TEST_CLASS,
- EXCLUDE_TEST_METHOD)));
+ Set<String> abis = AbiUtils.getAbisSupportedByCts();
+ assertEquals(abis.size(), mPlan.getTestIds().size());
+
+ for (String abi : abis) {
+ String test1Id = AbiUtils.createId(abi, TEST_NAME1);
+ TestFilter filter = mPlan.getTestFilter(test1Id);
+ assertTrue(filter.getExcludedTests().contains(new TestIdentifier(EXCLUDE_TEST_CLASS,
+ EXCLUDE_TEST_METHOD)));
+ }
}
/**
@@ -119,12 +136,17 @@
* @param plan
*/
private void assertMultiExcluded(TestPlan plan) {
- assertEquals(1, plan.getTestUris().size());
- TestFilter filter = plan.getExcludedTestFilter(TEST_URI1);
- assertTrue(filter.getExcludedTests().contains(new TestIdentifier(EXCLUDE_TEST_CLASS,
- EXCLUDE_TEST_METHOD)));
- assertTrue(filter.getExcludedTests().contains(new TestIdentifier(EXCLUDE_TEST_CLASS,
- EXCLUDE_TEST_METHOD2)));
+ Set<String> abis = AbiUtils.getAbisSupportedByCts();
+ assertEquals(abis.size(), plan.getTestIds().size());
+
+ for (String abi : abis) {
+ String test1Id = AbiUtils.createId(abi, TEST_NAME1);
+ TestFilter filter = plan.getTestFilter(test1Id);
+ assertTrue(filter.getExcludedTests().contains(new TestIdentifier(EXCLUDE_TEST_CLASS,
+ EXCLUDE_TEST_METHOD)));
+ assertTrue(filter.getExcludedTests().contains(new TestIdentifier(EXCLUDE_TEST_CLASS,
+ EXCLUDE_TEST_METHOD2)));
+ }
}
/**
@@ -132,16 +154,21 @@
*/
public void testParse_classExclude() throws ParseException {
mPlan.parse(getStringAsStream(TEST_CLASS_EXCLUDED_DATA));
- assertEquals(1, mPlan.getTestUris().size());
- TestFilter filter = mPlan.getExcludedTestFilter(TEST_URI1);
- assertTrue(filter.getExcludedClasses().contains(EXCLUDE_TEST_CLASS));
+ Set<String> abis = AbiUtils.getAbisSupportedByCts();
+ assertEquals(abis.size(), mPlan.getTestIds().size());
+
+ for (String abi : abis) {
+ String test1Id = AbiUtils.createId(abi, TEST_NAME1);
+ TestFilter filter = mPlan.getTestFilter(test1Id);
+ assertTrue(filter.getExcludedClasses().contains(EXCLUDE_TEST_CLASS));
+ }
}
/**
* Test serializing an empty plan
* @throws IOException
*/
- public void testSerialize_empty() throws ParseException, IOException {
+ public void testSerialize_empty() throws IOException {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
mPlan.serialize(outStream);
assertTrue(outStream.toString().contains(EMPTY_DATA));
@@ -152,11 +179,14 @@
* @throws IOException
*/
public void testSerialize_packages() throws ParseException, IOException {
- mPlan.addPackage(TEST_URI1);
- mPlan.addPackage(TEST_URI2);
+ Set<String> abis = AbiUtils.getAbisSupportedByCts();
+ for (String abi : abis) {
+ mPlan.addPackage(AbiUtils.createId(abi, TEST_NAME1));
+ mPlan.addPackage(AbiUtils.createId(abi, TEST_NAME2));
+ }
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
mPlan.serialize(outStream);
- TestPlan parsedPlan = new TestPlan("parsed");
+ TestPlan parsedPlan = new TestPlan("parsed", AbiUtils.getAbisSupportedByCts());
parsedPlan.parse(getStringAsStream(outStream.toString()));
// parsedPlan should contain same contents as TEST_DATA
assertTestData(parsedPlan);
@@ -166,14 +196,19 @@
* Test serializing and deserializing plan with multiple excluded tests
*/
public void testSerialize_multiExclude() throws ParseException, IOException {
- mPlan.addPackage(TEST_URI1);
- mPlan.addExcludedTest(TEST_URI1, new TestIdentifier(EXCLUDE_TEST_CLASS,
- EXCLUDE_TEST_METHOD));
- mPlan.addExcludedTest(TEST_URI1, new TestIdentifier(EXCLUDE_TEST_CLASS,
- EXCLUDE_TEST_METHOD2));
+ Set<String> abis = AbiUtils.getAbisSupportedByCts();
+
+ for (String abi : abis) {
+ String test1Id = AbiUtils.createId(abi, TEST_NAME1);
+ mPlan.addPackage(test1Id);
+ mPlan.addExcludedTest(test1Id, new TestIdentifier(EXCLUDE_TEST_CLASS,
+ EXCLUDE_TEST_METHOD));
+ mPlan.addExcludedTest(test1Id, new TestIdentifier(EXCLUDE_TEST_CLASS,
+ EXCLUDE_TEST_METHOD2));
+ }
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
mPlan.serialize(outStream);
- TestPlan parsedPlan = new TestPlan("parsed");
+ TestPlan parsedPlan = new TestPlan("parsed", AbiUtils.getAbisSupportedByCts());
parsedPlan.parse(getStringAsStream(outStream.toString()));
// parsedPlan should contain same contents as TEST_DATA
assertMultiExcluded(parsedPlan);
diff --git a/tools/utils/buildCts.py b/tools/utils/buildCts.py
index aa5bbf1..f9228d7 100755
--- a/tools/utils/buildCts.py
+++ b/tools/utils/buildCts.py
@@ -169,15 +169,153 @@
plan.ExcludeTests(package, test_list)
self.__WritePlan(plan, 'CTS-stable')
- # CTS Flaky plan - inversion of CTS Stable
+ # CTS Flaky plan - list of tests known to be flaky in lab environment
plan = tools.TestPlan(packages)
plan.Exclude('.*')
plan.Include(r'com\.android\.cts\.browserbench')
for package, test_list in flaky_tests.iteritems():
- plan.Include(package)
+ plan.Include(package+'$')
plan.IncludeTests(package, test_list)
self.__WritePlan(plan, 'CTS-flaky')
+ small_tests = BuildAospSmallSizeTestList()
+ medium_tests = BuildAospMediumSizeTestList()
+
+ # CTS - sub plan for public, small size tests
+ plan = tools.TestPlan(packages)
+ plan.Exclude('.*')
+ for package, test_list in small_tests.iteritems():
+ plan.Include(package+'$')
+ for package, test_list in flaky_tests.iteritems():
+ plan.ExcludeTests(package, test_list)
+ self.__WritePlan(plan, 'CTS-kitkat-small')
+
+ # CTS - sub plan for public, medium size tests
+ plan = tools.TestPlan(packages)
+ plan.Exclude('.*')
+ for package, test_list in medium_tests.iteritems():
+ plan.Include(package+'$')
+ for package, test_list in flaky_tests.iteritems():
+ plan.ExcludeTests(package, test_list)
+ self.__WritePlan(plan, 'CTS-kitkat-medium')
+
+ # CTS - sub plan for hardware tests which is public, large
+ plan = tools.TestPlan(packages)
+ plan.Exclude('.*')
+ plan.Include(r'android\.hardware$')
+ for package, test_list in flaky_tests.iteritems():
+ plan.ExcludeTests(package, test_list)
+ self.__WritePlan(plan, 'CTS-hardware')
+
+ # CTS - sub plan for media tests which is public, large
+ plan = tools.TestPlan(packages)
+ plan.Exclude('.*')
+ plan.Include(r'android\.media$')
+ for package, test_list in flaky_tests.iteritems():
+ plan.ExcludeTests(package, test_list)
+ self.__WritePlan(plan, 'CTS-media')
+
+ # CTS - sub plan for mediastress tests which is public, large
+ plan = tools.TestPlan(packages)
+ plan.Exclude('.*')
+ plan.Include(r'android\.mediastress$')
+ for package, test_list in flaky_tests.iteritems():
+ plan.ExcludeTests(package, test_list)
+ self.__WritePlan(plan, 'CTS-mediastress')
+
+ #CTS - sub plan for new test packages added for staging
+ plan = tools.TestPlan(packages)
+ for package, test_list in small_tests.iteritems():
+ plan.Exclude(package+'$')
+ for package, test_list in medium_tests.iteritems():
+ plan.Exclude(package+'$')
+ plan.Exclude(r'android\.hardware$')
+ plan.Exclude(r'android\.media$')
+ plan.Exclude(r'android\.mediastress$')
+ for package, test_list in flaky_tests.iteritems():
+ plan.ExcludeTests(package, test_list)
+ self.__WritePlan(plan, 'CTS-staging')
+
+def BuildAospMediumSizeTestList():
+ """ Construct a defaultdic that lists package names of medium tests
+ already published to aosp. """
+ return {
+ 'android.app' : [],
+ 'android.core.tests.libcore.package.libcore' : [],
+ 'android.core.tests.libcore.package.org' : [],
+ 'android.core.vm-tests-tf' : [],
+ 'android.dpi' : [],
+ 'android.host.security' : [],
+ 'android.net' : [],
+ 'android.os' : [],
+ 'android.security' : [],
+ 'android.telephony' : [],
+ 'android.webkit' : [],
+ 'android.widget' : [],
+ 'com.android.cts.browserbench' : []}
+
+def BuildAospSmallSizeTestList():
+ """ Construct a defaultdict that lists packages names of small tests
+ already published to aosp. """
+ return {
+ 'android.aadb' : [],
+ 'android.acceleration' : [],
+ 'android.accessibility' : [],
+ 'android.accessibilityservice' : [],
+ 'android.accounts' : [],
+ 'android.admin' : [],
+ 'android.animation' : [],
+ 'android.bionic' : [],
+ 'android.bluetooth' : [],
+ 'android.calendarcommon' : [],
+ 'android.content' : [],
+ 'android.core.tests.libcore.package.com' : [],
+ 'android.core.tests.libcore.package.conscrypt' : [],
+ 'android.core.tests.libcore.package.dalvik' : [],
+ 'android.core.tests.libcore.package.sun' : [],
+ 'android.core.tests.libcore.package.tests' : [],
+ 'android.database' : [],
+ 'android.dreams' : [],
+ 'android.drm' : [],
+ 'android.effect' : [],
+ 'android.gesture' : [],
+ 'android.graphics' : [],
+ 'android.graphics2' : [],
+ 'android.jni' : [],
+ 'android.keystore' : [],
+ 'android.location' : [],
+ 'android.nativemedia.sl' : [],
+ 'android.nativemedia.xa' : [],
+ 'android.nativeopengl' : [],
+ 'android.ndef' : [],
+ 'android.opengl' : [],
+ 'android.openglperf' : [],
+ 'android.permission' : [],
+ 'android.permission2' : [],
+ 'android.preference' : [],
+ 'android.preference2' : [],
+ 'android.provider' : [],
+ 'android.renderscript' : [],
+ 'android.rscpp' : [],
+ 'android.rsg' : [],
+ 'android.sax' : [],
+ 'android.speech' : [],
+ 'android.tests.appsecurity' : [],
+ 'android.text' : [],
+ 'android.textureview' : [],
+ 'android.theme' : [],
+ 'android.usb' : [],
+ 'android.util' : [],
+ 'android.view' : [],
+ 'com.android.cts.dram' : [],
+ 'com.android.cts.filesystemperf' : [],
+ 'com.android.cts.jank' : [],
+ 'com.android.cts.opengl' : [],
+ 'com.android.cts.simplecpu' : [],
+ 'com.android.cts.ui' : [],
+ 'com.android.cts.uihost' : [],
+ 'com.android.cts.videoperf' : [],
+ 'zzz.android.monkey' : []}
def BuildCtsFlakyTestList():
""" Construct a defaultdict that maps package name to a list of tests
diff --git a/tools/vm-tests-tf/src/util/build/BuildDalvikSuite.java b/tools/vm-tests-tf/src/util/build/BuildDalvikSuite.java
index 3630446..c772c33 100644
--- a/tools/vm-tests-tf/src/util/build/BuildDalvikSuite.java
+++ b/tools/vm-tests-tf/src/util/build/BuildDalvikSuite.java
@@ -211,22 +211,22 @@
curJunitFileData = getWarningMessage() +
"package " + pName + ";\n" +
"import java.io.IOException;\n" +
+ "import com.android.tradefed.testtype.IAbi;\n" +
+ "import com.android.tradefed.testtype.IAbiReceiver;\n" +
"import com.android.tradefed.testtype.DeviceTestCase;\n" +
- "import com.android.tradefed.config.Option;\n" +
- "import com.android.tradefed.config.Option.Importance;\n" +
"import com.android.tradefed.util.AbiFormatter;\n" +
"\n" +
- "public class " + sourceName + " extends DeviceTestCase {\n";
+ "public class " + sourceName + " extends DeviceTestCase implements IAbiReceiver {\n";
}
private String getShellExecJavaLine(String classpath, String mainclass) {
String cmd = String.format("ANDROID_DATA=%s dalvikvm|#ABI#| -Xmx512M -Xss32K " +
"-Djava.io.tmpdir=%s -classpath %s %s", TARGET_JAR_ROOT_PATH, TARGET_JAR_ROOT_PATH,
classpath, mainclass);
- return "String cmd = AbiFormatter.formatCmdForAbi(\"" + cmd + "\", mForceAbi);\n" +
- "String res = getDevice().executeShellCommand(cmd);\n" +
- "// A sucessful adb shell command returns an empty string.\n" +
- "assertEquals(cmd, \"\", res);";
+ return " String cmd = AbiFormatter.formatCmdForAbi(\"" + cmd + "\", mAbi.getBitness());\n" +
+ " String res = getDevice().executeShellCommand(cmd);\n" +
+ " // A sucessful adb shell command returns an empty string.\n" +
+ " assertEquals(cmd, \"\", res);";
}
private String getWarningMessage() {
@@ -257,8 +257,8 @@
//"dot.junit.opcodes.add_double_2addr.Main_testN2";
String mainclass = pName + ".Main_" + method;
- curJunitFileData += " " + getShellExecJavaLine(cp, mainclass);
- curJunitFileData += "}\n\n";
+ curJunitFileData += getShellExecJavaLine(cp, mainclass);
+ curJunitFileData += "\n}\n\n";
}
private void handleTests() throws IOException {
@@ -283,9 +283,12 @@
openCTSHostFileFor(pName, classOnlyName);
- curJunitFileData += "@Option(name = AbiFormatter.FORCE_ABI_STRING,\n" +
- "description = AbiFormatter.FORCE_ABI_DESCRIPTION,\n" +
- "importance = Importance.IF_UNSET)\nprivate String mForceAbi = null;\n\n";
+ curJunitFileData += "\n" +
+ "protected IAbi mAbi;\n" +
+ "@Override\n" +
+ "public void setAbi(IAbi abi) {\n" +
+ " mAbi = abi;\n" +
+ "}\n\n";
List<String> methods = entry.getValue();
Collections.sort(methods, new Comparator<String>() {