Merge "New CTS tests for HCE APIs." into lmp-dev
diff --git a/CtsTestCaseList.mk b/CtsTestCaseList.mk
index d90f4fb..c9cdb15 100644
--- a/CtsTestCaseList.mk
+++ b/CtsTestCaseList.mk
@@ -13,24 +13,25 @@
# 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 \
+ CtsAppTestStubs \
CtsDeviceAdmin \
CtsDeviceOpenGl \
CtsDeviceTaskswitchingAppA \
@@ -39,6 +40,7 @@
CtsDeviceUi \
CtsMonkeyApp \
CtsMonkeyApp2 \
+ CtsProfileOwnerApp \
CtsSomeAccessibilityServices \
CtsTestStubs \
CtsThemeDeviceApp \
@@ -49,13 +51,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 +94,7 @@
CtsJniTestCases \
CtsKeystoreTestCases \
CtsLocationTestCases \
+ CtsLocation2TestCases \
CtsMediaStressTestCases \
CtsMediaTestCases \
CtsNativeOpenGLTestCases \
@@ -111,7 +115,6 @@
CtsSaxTestCases \
CtsSecurityTestCases \
CtsSpeechTestCases \
- CtsTelecomTestCases \
CtsTelephonyTestCases \
CtsTextTestCases \
CtsTextureViewTestCases \
@@ -127,13 +130,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 +147,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 +183,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 88adcbb..c3ae74b 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" />
@@ -715,14 +714,28 @@
<meta-data android:name="android.nfc.cardemulation.host_apdu_service" android:resource="@xml/access_prefix_aid_list"/>
</service>
- <activity android:name=".sensors.AccelerometerTestActivity" android:label="@string/snsr_accel_test"
+ <!--
+ A DeviceAdmin receiver for sensor tests, it allows sensor tests to turn off the screen.
+ -->
+ <receiver android:name=".sensors.helpers.SensorDeviceAdminReceiver"
+ android:label="@string/snsr_device_admin_receiver">
+ <meta-data android:name="android.app.device_admin"
+ android:resource="@xml/sensor_device_admin" />
+ <intent-filter>
+ <action android:name="android.app.action.DEVICE_ADMIN_ENABLED"/>
+ </intent-filter>
+ </receiver>
+
+ <activity android:name=".sensors.AccelerometerTestActivity"
+ android:label="@string/snsr_accel_test"
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" />
- <meta-data android:name="test_required_features" android:value="android.hardware.sensor.accelerometer" />
+ <meta-data android:name="test_required_features"
+ android:value="android.hardware.sensor.accelerometer" />
</activity>
<activity android:name=".sensors.AccelerometerMeasurementTestActivity"
@@ -744,7 +757,8 @@
<category android:name="android.cts.intent.category.MANUAL_TEST" />
</intent-filter>
<meta-data android:name="test_category" android:value="@string/test_category_sensors" />
- <meta-data android:name="test_required_features" android:value="android.hardware.sensor.gyroscope" />
+ <meta-data android:name="test_required_features"
+ android:value="android.hardware.sensor.gyroscope" />
</activity>
<activity android:name=".sensors.GyroscopeMeasurementTestActivity"
@@ -842,6 +856,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>
@@ -1221,67 +1245,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/assets/scripts/execute_power_tests.py b/apps/CtsVerifier/assets/scripts/execute_power_tests.py
index 68e13db..e1b11c2 100755
--- a/apps/CtsVerifier/assets/scripts/execute_power_tests.py
+++ b/apps/CtsVerifier/assets/scripts/execute_power_tests.py
@@ -30,10 +30,10 @@
signal_exit_q = Queue.Queue()
signal_abort = Queue.Queue()
-# let this script know about the power monitor impementations
+# let this script know about the power monitor implementations
sys.path = [os.path.basename(__file__)] + sys.path
-available_monitors = [name for _, name, _ in pkgutil.iter_modules([os.path.join(os.path.dirname(__file__),'power_monitors')])
- if not name.startswith('_')]
+available_monitors = [name for _, name, _ in pkgutil.iter_modules(
+ [os.path.join(os.path.dirname(__file__),'power_monitors')]) if not name.startswith('_')]
APK = os.path.join( os.path.dirname(__file__), '..', "CtsVerifier.apk")
@@ -77,18 +77,28 @@
SAMPLE_COUNT_NOMINAL = 1000
RATE_NOMINAL = 100
- QUERY_EXTERNAL_STORAGE = "EXTERNAL STORAGE?"
-
+ REQUEST_EXTERNAL_STORAGE = "EXTERNAL STORAGE?"
+ REQUEST_EXIT = "EXIT"
+ REQUEST_RAISE = "RAISE %s %s"
+ REQUEST_USER_RESPONSE = "USER RESPONSE %s"
+ REQUEST_SET_TEST_RESULT = "SET TEST RESULT %s %s %s"
+ REQUEST_SENSOR_SWITCH = "SENSOR %s %s"
+ REQUEST_SENSOR_AVAILABILITY = "SENSOR? %s"
+ REQUEST_SCREEN_OFF = "SCREEN OFF"
+ REQUEST_SHOW_MESSAGE = "MESSAGE %s"
+
+
def __init__(self):
power_monitors = do_import("power_monitors.%s" % FLAGS.power_monitor)
testid = time.strftime("%d_%m_%Y__%H__%M_%S")
self._power_monitor = power_monitors.Power_Monitor(log_file_id = testid)
print ("Establishing connection to device...")
- self.setUSBEnabled(True)
+ self.setUsbEnabled(True)
status = self._power_monitor.GetStatus()
self._native_hz = status["sampleRate"] * 1000
self._current_test = "None"
- self._external_storage = self.executeOnDevice(PowerTest.QUERY_EXTERNAL_STORAGE, reportErrors=True )
+ self._external_storage = self.executeOnDevice(PowerTest.REQUEST_EXTERNAL_STORAGE,
+ reportErrors=True)
def __del__(self):
self.finalize()
@@ -97,7 +107,7 @@
"""To be called upon termination of host connection to device"""
if PowerTest.PORT > 0:
# tell device side to exit connection loop, and remove the forwarding connection
- self.executeOnDevice("EXIT", reportErrors=False)
+ self.executeOnDevice(PowerTest.REQUEST_EXIT, reportErrors=False)
self.executeLocal("adb forward --remove tcp:%d" % PowerTest.PORT)
PowerTest.PORT = 0
if self._power_monitor:
@@ -105,18 +115,19 @@
self._power_monitor = None
def _send(self, msg, report_errors=True):
- """Connect to the device, send the given commmand, and then disconnect"""
+ """Connect to the device, send the given command, and then disconnect"""
if PowerTest.PORT == 0:
# on first attempt to send a command, connect to device via any open port number,
# forwarding that port to a local socket on the device via adb
logging.debug("Seeking port for communication...")
- # discover an open port
+ # discover an open port
dummysocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
dummysocket.bind(("localhost", 0))
(_, PowerTest.PORT) = dummysocket.getsockname()
dummysocket.close()
assert(PowerTest.PORT > 0)
- status = self.executeLocal("adb forward tcp:%d localabstract:%s" % (PowerTest.PORT, PowerTest.DOMAIN_NAME))
+ status = self.executeLocal("adb forward tcp:%d localabstract:%s" %
+ (PowerTest.PORT, PowerTest.DOMAIN_NAME))
if report_errors:
self.reportErrorIf(status != 0, msg="Unable to forward requests to client over adb")
logging.info("Forwarding requests over local port %d" % PowerTest.PORT)
@@ -139,11 +150,11 @@
return response
def queryDevice(self, query):
- """Post a yes/no query to the device, return True upon successful query,
- False otherwise"""
+ """Post a yes/no query to the device, return True upon successful query, False otherwise"""
logging.info("Querying device with '%s'" % query)
return self._send(query) == "OK"
+ # TODO: abstract device communication (and string commands) into its own class
def executeOnDevice(self, cmd , reportErrors=True):
"""Execute a (string) command on the remote device"""
return self._send(cmd , reportErrors)
@@ -164,7 +175,7 @@
if condition:
try:
logging.error("Exiting on error: %s" % msg)
- self.executeOnDevice("RAISE " + self._current_test + " " + msg , False)
+ self.executeOnDevice(PowerTest.REQUEST_RAISE % (self._current_test, msg), False)
except:
logging.error("Unable to communicate with device to report error: %s" % msg)
@@ -172,7 +183,7 @@
sys.exit(msg)
raise Exception(msg)
- def setUSBEnabled(self, enabled, verbose=True):
+ def setUsbEnabled(self, enabled, verbose=True):
if enabled:
val = 1
else:
@@ -180,7 +191,7 @@
self._power_monitor.SetUsbPassthrough(val)
tries = 0
- # Sometimes command won't go through first time, paricularly if immediately after a data
+ # Sometimes command won't go through first time, particularly if immediately after a data
# collection, so allow for retries
status = self._power_monitor.GetStatus()
while status is None and tries < 5:
@@ -199,7 +210,8 @@
if verbose: logging.info("...USB disabled")
# re-establish port forwarding
if enabled and PowerTest.PORT > 0:
- status = self.executeLocal("adb forward tcp:%d localabstract:%s" % (PowerTest.PORT, PowerTest.DOMAIN_NAME))
+ status = self.executeLocal("adb forward tcp:%d localabstract:%s" %
+ (PowerTest.PORT, PowerTest.DOMAIN_NAME))
self.reportErrorIf(status != 0, msg="Unable to forward requests to client over adb")
def waitForScreenOff(self):
@@ -211,13 +223,13 @@
# need at least 100 sequential clean low-power measurements to know screen is off
THRESHOLD_COUNT_LOW_POWER = 100
- CURRENT_LOW_POWER_THRESHOLD = 0.060 # mAmps
- TIMEOUT_SCREEN_OFF = 30 #this many tries at most
+ CURRENT_LOW_POWER_THRESHOLD = 0.060 # Amps
+ TIMEOUT_SCREEN_OFF = 30 # this many tries at most
count_good = 0
tries = 0
print("Waiting for screen off and application processor in suspend mode...")
while count_good < THRESHOLD_COUNT_LOW_POWER:
- measurements = self.collectMeasurements( THRESHOLD_COUNT_LOW_POWER,
+ measurements = self.collectMeasurements(THRESHOLD_COUNT_LOW_POWER,
PowerTest.RATE_NOMINAL,
ensure_screen_off=False,
verbose=False)
@@ -225,20 +237,19 @@
if m < CURRENT_LOW_POWER_THRESHOLD])
tries += 1
if count_good < THRESHOLD_COUNT_LOW_POWER and measurements:
- print("This current high: %.2f mAmps. Device is probably not in suspend mode. Waiting..."%\
+ print("Current usage: %.2f mAmps. Device is probably not in suspend mode. Waiting..." %
(1000.0*(sum(measurements)/len(measurements))))
if tries >= TIMEOUT_SCREEN_OFF:
# TODO: dump the state of sensor service to identify if there are features using sensors
- self.reportErrorIf(tries>=TIMEOUT_SCREEN_OFF, msg="Unable to determine application processor suspend mode status.")
+ self.reportErrorIf(tries>=TIMEOUT_SCREEN_OFF,
+ msg="Unable to determine application processor suspend mode status.")
break
if DELAY_SCREEN_OFF:
# add additional delay time if necessary
time.sleep(DELAY_SCREEN_OFF)
print("...Screen off and device in suspend mode.")
-
- def collectMeasurements(self, measurementCount, rate ,
- ensure_screen_off=True,
- verbose=True,
+
+ def collectMeasurements(self, measurementCount, rate , ensure_screen_off=True, verbose=True,
plot_data = False):
assert(measurementCount > 0)
decimate_by = self._native_hz / rate or 1
@@ -253,11 +264,10 @@
try:
while len(measurements) < measurementCount and tries < 5:
if tries:
- #logging.error("Failed attempt %d" % tries)
self._power_monitor.StopDataCollection()
self._power_monitor.StartDataCollection()
time.sleep(1.0)
- tries += 1
+ tries += 1
additional = self._power_monitor.CollectData()
if additional is not None:
tries = 0
@@ -278,7 +288,7 @@
def request_user_acknowledgment(self, msg):
"""Post message to user on screen and wait for acknowledgment"""
- response = self.executeOnDevice("REQUEST USER RESPONSE " + msg)
+ response = self.executeOnDevice(PowerTest.REQUEST_USER_RESPONSE % msg)
self.reportErrorIf(response != "OK", "Unable to request user acknowledgment")
def setTestResult (self, testname, condition, msg):
@@ -289,19 +299,21 @@
else:
val = condition
print ("Test %s : %s" % (testname, val))
- response = self.executeOnDevice("SET TEST RESULT %s %s %s" % (testname, val, msg))
+ response = self.executeOnDevice(PowerTest.REQUEST_SET_TEST_RESULT % (testname, val, msg))
self.reportErrorIf(response != "OK", "Unable to send test status to Verifier")
def setPowerOn(self, sensor, powered_on):
- response = self.executeOnDevice("SENSOR %s %s" % ({True:"ON", False:"OFF"}[powered_on], sensor))
- self.reportErrorIf(response == "ERR", "Unable to set sensor %s state"%sensor)
+ response = self.executeOnDevice(PowerTest.REQUEST_SENSOR_SWITCH %
+ ({True:"ON", False:"OFF"}[powered_on], sensor))
+ self.reportErrorIf(response == "ERR", "Unable to set sensor %s state" % sensor)
logging.info("Set %s %s" % (sensor, {True:"ON", False:"OFF"}[powered_on]))
return response
def runPowerTest(self, sensor, max_power_allowed, user_request = None):
if not signal_abort.empty():
sys.exit( signal_abort.get() )
- self._current_test = "%s_Power_Test_While_%s" % (sensor, {True:"Under_Motion", False:"Still"}[user_request is not None])
+ self._current_test = "%s_Power_Test_While_%s" % (sensor,
+ {True:"Under_Motion", False:"Still"}[user_request is not None])
try:
print ("\n\n---------------------------------")
if user_request is not None:
@@ -309,9 +321,10 @@
else:
print ("Running power test on %s while device is still." % sensor)
print ("---------------------------------")
- response = self.executeOnDevice("SENSOR? %s"%sensor)
+ response = self.executeOnDevice(PowerTest.REQUEST_SENSOR_AVAILABILITY % sensor)
if response == "UNAVAILABLE":
- self.setTestResult(self._current_test, condition="SKIPPED", msg="Sensor %s not available on this platform"%sensor)
+ self.setTestResult(self._current_test, condition="SKIPPED",
+ msg="Sensor %s not available on this platform"%sensor)
self.setPowerOn("ALL", False)
if response == "UNAVAILABLE":
self.setTestResult(self._current_test, condition="SKIPPED",
@@ -321,8 +334,8 @@
self.reportErrorIf(response != "OK", "Unable to set all sensor off")
if not signal_abort.empty():
sys.exit( signal_abort.get() )
- self.executeOnDevice("MESSAGE: \nPlease turn screen off or wait for screen to turn off. Do not interact with the device until screen is turned on again.")
- self.setUSBEnabled(False)
+ self.executeOnDevice(PowerTest.REQUEST_SCREEN_OFF)
+ self.setUsbEnabled(False)
print("Collecting background measurements...")
measurements = self.collectMeasurements( PowerTest.SAMPLE_COUNT_NOMINAL,
PowerTest.RATE_NOMINAL,
@@ -334,17 +347,16 @@
f.write( "%.4f\n"%m)
self.reportErrorIf(not measurements, "No background measurements could be taken")
backgnd = sum(measurements) / len(measurements)
- self.setUSBEnabled( True )
- self.setPowerOn( sensor, True )
+ self.setUsbEnabled(True)
+ self.setPowerOn(sensor, True)
if user_request is not None:
print("===========================================\n" +
"==> Please follow the instructions presented on the device\n" +
"==========================================="
)
self.request_user_acknowledgment(user_request)
- else:
- self.executeOnDevice("MESSAGE: Turn screen off or wait for screen to turn off and do not interact with the device until screen is turned on again.")
- self.setUSBEnabled(False)
+ self.executeOnDevice(PowerTest.REQUEST_SCREEN_OFF)
+ self.setUsbEnabled(False)
self.reportErrorIf(response != "OK", "Unable to set sensor %s ON" % sensor)
print ("Collecting sensor %s measurements" % sensor)
measurements = self.collectMeasurements(PowerTest.SAMPLE_COUNT_NOMINAL,
@@ -355,11 +367,13 @@
{True:"Under_Motion", False:"Still"}[user_request is not None] ),'w') as f:
for m in measurements:
f.write( "%.4f\n"%m)
- self.setUSBEnabled(True, verbose = False)
+ self.setUsbEnabled(True, verbose = False)
print("Saving raw data files to device...")
- self.executeLocal("adb shell mkdir -p %s/ctsVerifierData/sensor_power_test_data"%self._external_storage, False)
- self.executeLocal("adb push %s %s/ctsVerifierData/sensor_power_test_data/."%(f.name, self._external_storage))
- self.setUSBEnabled(False, verbose = False)
+ self.executeLocal("adb shell mkdir -p %s/ctsVerifierData/sensor_power_test_data"
+ % self._external_storage, False)
+ self.executeLocal("adb push %s %s/ctsVerifierData/sensor_power_test_data/." %
+ (f.name, self._external_storage))
+ self.setUsbEnabled(False, verbose = False)
self.reportErrorIf(not measurements, "No measurements could be taken for %s" % sensor)
avg = sum(measurements) / len(measurements)
squared = [(m-avg)*(m-avg) for m in measurements]
@@ -367,7 +381,7 @@
import math
stddev = math.sqrt(sum(squared)/len(squared))
current_diff = avg - backgnd
- self.setUSBEnabled(True)
+ self.setUsbEnabled(True)
max_power = max(measurements) - avg
if current_diff <= max_power_allowed:
# TODO: fail the test of background > current
@@ -383,27 +397,24 @@
except:
import traceback
traceback.print_exc()
- self.setTestResult(self._current_test, condition="FAIL", msg="Exception occurred during run of test.")
+ self.setTestResult(self._current_test, condition="FAIL",
+ msg="Exception occurred during run of test.")
@staticmethod
def run_tests():
testrunner = None
try:
- GENERIC_MOTION_REQUEST = "\n===> Please press Next and when the screen is off, keep the device under motion with only tiny, slow movements" + \
- " until the screen turns on again.\n" + \
- "Please refrain from interacting with the screen or pressing any side buttons " + \
- "while measurements are taken."
- USER_STEPS_REQUEST = "\n===> Please press Next and when the screen is off, then move the device to simulate step motion" + \
- " until the screen turns on again.\n" + \
- "Please refrain from interacting with the screen or pressing any side buttons " + \
- "while measurements are taken."
+ GENERIC_MOTION_REQUEST = "\n===> Please press Next and when the screen is off, keep " + \
+ "the device under motion with only tiny, slow movements until the screen turns " + \
+ "on again.\nPlease refrain from interacting with the screen or pressing any side " + \
+ "buttons while measurements are taken."
+ USER_STEPS_REQUEST = "\n===> Please press Next and when the screen is off, then move " + \
+ "the device to simulate step motion until the screen turns on again.\nPlease " + \
+ "refrain from interacting with the screen or pressing any side buttons while " + \
+ "measurements are taken."
testrunner = PowerTest()
- testrunner.reportErrorIf(not testrunner.queryDevice("AIRPLANE MODE ON?"),
- "Airplane mode not off as expected")
- #testrunner.reportErrorIf(int(testrunner.executeOnDevice("SCREEN OFF TIMEOUT?")) > 15000,
- # "Screen sleep time not set to 15 seconds")
- testrunner.executeOnDevice("MESSAGE: Connected. Running tests...")
+ testrunner.executeOnDevice(PowerTest.REQUEST_SHOW_MESSAGE % "Connected. Running tests...")
testrunner.runPowerTest("SIGNIFICANT_MOTION", PowerTest.MAX_SIGMO_POWER, user_request = GENERIC_MOTION_REQUEST)
testrunner.runPowerTest("STEP_DETECTOR", PowerTest.MAX_STEP_DETECTOR_POWER, user_request = USER_STEPS_REQUEST)
testrunner.runPowerTest("STEP_COUNTER", PowerTest.MAX_STEP_COUNTER_POWER, user_request = USER_STEPS_REQUEST)
@@ -426,9 +437,10 @@
try:
testrunner.finalize()
except socket.error:
- sys.exit("============================\nUnable to connect to device under test. Make sure the device is connected via the usb passthrough,"+\
- " the CtsVerifier app is running the SensorPowerTest on the device, and USB passthrough is enabled."
- "\n===========================")
+ sys.exit("============================\nUnable to connect to device under " + \
+ "test. Make sure the device is connected via the usb pass-through, " + \
+ "the CtsVerifier app is running the SensorPowerTest on the device, " + \
+ "and USB pass-through is enabled.\n===========================")
def main(argv):
@@ -455,9 +467,8 @@
sys.exit("Aborting.")
if not FLAGS.power_monitor:
- sys.exit("You must specify a '--power_monitor' option to specify which power monitor type you are using.\n"+
- "One of:\n " +
- "\n ".join(available_monitors))
+ sys.exit("You must specify a '--power_monitor' option to specify which power monitor type " + \
+ "you are using.\nOne of:\n \n ".join(available_monitors))
power_monitors = do_import('power_monitors.%s' % FLAGS.power_monitor)
try:
mon = power_monitors.Power_Monitor(device=FLAGS.device)
@@ -489,7 +500,7 @@
mon.SetUsbPassthrough(2)
else:
mon.Close()
- sys.exit('bad passthrough flag: %s' % FLAGS.usbpassthrough)
+ sys.exit('bad pass-through flag: %s' % FLAGS.usbpassthrough)
if FLAGS.samples:
# Make sure state is normal
diff --git a/apps/CtsVerifier/res/layout/ble_advertiser_hardware_scan_filter.xml b/apps/CtsVerifier/res/layout/ble_advertiser_hardware_scan_filter.xml
index 1496f81..ce3e1e1 100644
--- a/apps/CtsVerifier/res/layout/ble_advertiser_hardware_scan_filter.xml
+++ b/apps/CtsVerifier/res/layout/ble_advertiser_hardware_scan_filter.xml
@@ -29,6 +29,10 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
+ <TextView android:text="@string/ble_advertiser_scannable_instruction"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ />
<LinearLayout android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -48,6 +52,10 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
+ <TextView android:text="@string/ble_advertiser_unscannable_instruction"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ />
<LinearLayout android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
diff --git a/apps/CtsVerifier/res/layout/ble_advertiser_power_level.xml b/apps/CtsVerifier/res/layout/ble_advertiser_power_level.xml
index 37a7bbc..ec3284d 100644
--- a/apps/CtsVerifier/res/layout/ble_advertiser_power_level.xml
+++ b/apps/CtsVerifier/res/layout/ble_advertiser_power_level.xml
@@ -20,6 +20,10 @@
android:padding="10dip"
>
+ <TextView android:text="@string/ble_advertiser_power_level_instruction"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ />
<LinearLayout android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
diff --git a/apps/CtsVerifier/res/layout/ble_privacy_mac.xml b/apps/CtsVerifier/res/layout/ble_advertiser_privacy_mac.xml
similarity index 90%
rename from apps/CtsVerifier/res/layout/ble_privacy_mac.xml
rename to apps/CtsVerifier/res/layout/ble_advertiser_privacy_mac.xml
index e67c61a..1c68b98 100644
--- a/apps/CtsVerifier/res/layout/ble_privacy_mac.xml
+++ b/apps/CtsVerifier/res/layout/ble_advertiser_privacy_mac.xml
@@ -19,7 +19,10 @@
android:orientation="vertical"
android:padding="10dip"
>
-
+ <TextView android:text="@string/ble_advertiser_privacy_mac_instruction"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ />
<LinearLayout android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
diff --git a/apps/CtsVerifier/res/layout/ble_scanner_hardware_scan_filter.xml b/apps/CtsVerifier/res/layout/ble_scanner_hardware_scan_filter.xml
index 4f5de53..f356ded 100644
--- a/apps/CtsVerifier/res/layout/ble_scanner_hardware_scan_filter.xml
+++ b/apps/CtsVerifier/res/layout/ble_scanner_hardware_scan_filter.xml
@@ -19,9 +19,14 @@
android:orientation="vertical"
android:padding="10dip"
>
+ <TextView android:text="@string/ble_scanner_scan_filter_instruction"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ />
<LinearLayout android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:layout_centerInParent="true"
>
<LinearLayout android:orientation="horizontal"
android:layout_width="match_parent"
diff --git a/apps/CtsVerifier/res/layout/ble_scanner_power_level.xml b/apps/CtsVerifier/res/layout/ble_scanner_power_level.xml
index b1fd2df..970b03a 100644
--- a/apps/CtsVerifier/res/layout/ble_scanner_power_level.xml
+++ b/apps/CtsVerifier/res/layout/ble_scanner_power_level.xml
@@ -19,7 +19,10 @@
android:orientation="vertical"
android:padding="10dip"
>
-
+ <TextView android:text="@string/ble_scanner_power_level_instruction"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ />
<LinearLayout android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
diff --git a/apps/CtsVerifier/res/layout/ble_scanner_privacy_mac.xml b/apps/CtsVerifier/res/layout/ble_scanner_privacy_mac.xml
index f636705..cad78a3 100644
--- a/apps/CtsVerifier/res/layout/ble_scanner_privacy_mac.xml
+++ b/apps/CtsVerifier/res/layout/ble_scanner_privacy_mac.xml
@@ -20,6 +20,11 @@
android:padding="10dip"
>
+ <TextView
+ android:text="@string/ble_scanner_privacy_mac_instruction"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ />
<LinearLayout android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
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 b5bd2d6..0a0852b 100644
--- a/apps/CtsVerifier/res/values/strings.xml
+++ b/apps/CtsVerifier/res/values/strings.xml
@@ -233,12 +233,16 @@
<string name="ble_advertiser_service_name">Bluetooth LE Advertiser Handler Service</string>
<string name="ble_privacy_mac_name">BLE Privacy Mac</string>
<string name="ble_privacy_mac_info">BLE Advertiser should advertise in non-repeating MAC address.</string>
+ <string name="ble_advertiser_privacy_mac_instruction">Click start to start advertising, you can disconnect USB and lock the screen of advertiser. Counts and mac address will show on scanner. You may receive message that this device does not support BLE advertising.</string>
<string name="ble_power_level_name">BLE Tx Power Level</string>
<string name="ble_power_level_info">BLE Advertiser advertises in 4 different power levels. Scanner should receive them in different strength of Rssi, cannot receive weak signals beyond several feet.</string>
+ <string name="ble_advertiser_power_level_instruction">Click start to start multi-advertising. Data packets are advertised in 4 different power levels. You may receive message that this device does not support multi advertising. If advertiser does not advertise in 4 power levels, neither you receive the error message, you may not stop the advertising in previous test, or this device does not support 4 advertisers at the same time. Try rebooting the device and run the test to free those advertisers in use.</string>
<string name="ble_advertiser_scan_filter_name">BLE Hardware Scan Filter</string>
<string name="ble_advertiser_scan_filter_info">BLE Advertiser advertises with 2 different data separately. One can wake up the scanner, the other cannot.</string>
<string name="ble_advertiser_scannable">Scannable advertising</string>
+ <string name="ble_advertiser_scannable_instruction">Start scannable advertising, expect scanner consume more power on Monsoon monitor, or see log of GattService from scanner logcat.</string>
<string name="ble_advertiser_unscannable">Unscannble advertising</string>
+ <string name="ble_advertiser_unscannable_instruction">Start unscannable advertising, expect scanner stay calm on Monsoon monitor, no log of GattService from scanner logcat.</string>
<string name="ble_advertiser_start">Start</string>
<string name="ble_advertiser_stop">Stop</string>
@@ -247,12 +251,15 @@
<string name="ble_scanner_service_name">Bluetooth LE Scanner Handler Service</string>
<string name="ble_scanner_test_info">The BLE test must be done simultaneously on two devices, an advertiser and a scanner. This device is the scanner.</string>
<string name="ble_scanner_privacy_mac">Hold for 15 min to see if receive a different MAC address from advertiser.</string>
+ <string name="ble_scanner_privacy_mac_instruction">Mac address, counts are shown on screen. It should continuously receive data packet from advertiser. Every 15 min, a new mac address should show up, which prevents mac address disclosure.</string>
<string name="ble_ultra_low">Ultra low</string>
<string name="ble_low">Low</string>
<string name="ble_medium">Medium</string>
<string name="ble_high">High</string>
+ <string name="ble_scanner_power_level_instruction">Count: Ultra low < low < medium < high\nRssi: Ultra low < low < medium < high\nDistance to see count freezing: Ultra low < low < medium < high\nA common error is ultra low, low and medium behave similarly, with similar rssi, freeze at similar distance.</string>
<string name="ble_scanner_scan_filter_name">BLE Hardware Scan Filter</string>
<string name="ble_scanner_scan_filter_info">Lock the screen of scanner, and connect to monsoon. It will not wake up when advertiser is advertising unscannable, and scanner is scanning with filter.</string>
+ <string name="ble_scanner_scan_filter_instruction">For monsoon test:\n\tClick scan with filter, lock the screen, connect to monsoon. It will not wake up when advertiser is advertising unscannable data packets, but will show a peak in power usage when advertiser is advertising scannable data.\nFor logcat test:\n\tClick scan with filter, logcat the scanner. No data will be received by GattService when advertiser is advertising unscannable data.</string>
<string name="ble_scan_with_filter">Scan with filter</string>
<string name="ble_scan_without_filter">Scan without filter</string>
@@ -453,6 +460,7 @@
<string name="offhostService">OffhostService</string>
<!-- Strings for Sensor Test Activities -->
+ <string name="snsr_device_admin_receiver">Sensor Tests Device Admin Receiver</string>
<string name="snsr_test_summary">Tests passed: %1$d, Tests skipped: %2$d, Tests failed: %3$d</string>
<string name="snsr_test_complete">Test completed.</string>
<string name="snsr_test_pass">PASS</string>
@@ -461,7 +469,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>
@@ -530,7 +537,8 @@
<string name="snsr_mag_verify_std_dev">Verifying the Standard Deviation...</string>
<string name="snsr_mag_calibration_description">Please calibrate the Magnetometer by moving
it in 8 shapes in different orientations.</string>
- <string name="snsr_mag_calibration_complete">When done, leave the device in a flat surface.</string>
+ <string name="snsr_mag_calibration_complete">When done, leave the device in a flat surface, far
+ from all metallic objects (if the test does not pass, try re-running it outdoors).</string>
<!-- Sensor Value Accuracy -->
<string name="snsr_val_acc_test">Sensor Value Accuracy Tests</string>
@@ -546,8 +554,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>
@@ -577,13 +583,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>
@@ -1150,29 +1157,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/res/xml/sensor_device_admin.xml b/apps/CtsVerifier/res/xml/sensor_device_admin.xml
new file mode 100644
index 0000000..2a3437d
--- /dev/null
+++ b/apps/CtsVerifier/res/xml/sensor_device_admin.xml
@@ -0,0 +1,20 @@
+<!-- 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.
+-->
+
+<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
+ <uses-policies>
+ <force-lock />
+ </uses-policies>
+</device-admin>
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleAdvertiserPrivacyMacActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleAdvertiserPrivacyMacActivity.java
index f2bfd9c..87879bd 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleAdvertiserPrivacyMacActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleAdvertiserPrivacyMacActivity.java
@@ -36,7 +36,7 @@
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setContentView(R.layout.ble_privacy_mac);
+ setContentView(R.layout.ble_advertiser_privacy_mac);
setPassFailButtonClickListeners();
setInfoResources(R.string.ble_privacy_mac_name,
R.string.ble_privacy_mac_info, -1);
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/camera/formats/CameraFormatsActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/formats/CameraFormatsActivity.java
index 3e52ed8..8d6ef2c 100755
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/formats/CameraFormatsActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/camera/formats/CameraFormatsActivity.java
@@ -51,6 +51,7 @@
import java.lang.Math;
import java.lang.Thread;
import java.util.ArrayList;
+import java.util.HashSet;
import java.util.Comparator;
import java.util.List;
import java.util.TreeSet;
@@ -344,9 +345,10 @@
new ArrayAdapter<String>(
this, R.layout.cf_format_list_item, availableSizeNames));
- // Get preview formats
+ // Get preview formats, removing duplicates
- mPreviewFormats = p.getSupportedPreviewFormats();
+ HashSet<Integer> formatSet = new HashSet<>(p.getSupportedPreviewFormats());
+ mPreviewFormats = new ArrayList<Integer>(formatSet);
String[] availableFormatNames = new String[mPreviewFormats.size()];
for (int i = 0; i < mPreviewFormats.size(); i++) {
@@ -600,9 +602,11 @@
mCamera = Camera.open(i);
Camera.Parameters p = mCamera.getParameters();
+ HashSet<Integer> formatSet = new HashSet<>(p.getSupportedPreviewFormats());
+
allCombinationsSize +=
p.getSupportedPreviewSizes().size() * // resolutions
- p.getSupportedPreviewFormats().size(); // formats
+ formatSet.size(); // unique formats
}
return allCombinationsSize;
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..cfc4db0 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorPowerTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorPowerTestActivity.java
@@ -18,51 +18,54 @@
import com.android.cts.verifier.sensors.base.SensorCtsVerifierTestActivity;
import com.android.cts.verifier.sensors.helpers.PowerTestHostLink;
+import com.android.cts.verifier.sensors.helpers.SensorTestScreenManipulator;
import com.android.cts.verifier.sensors.reporting.SensorTestDetails;
import junit.framework.Assert;
-import java.util.concurrent.TimeUnit;
-
public class SensorPowerTestActivity
extends SensorCtsVerifierTestActivity
implements PowerTestHostLink.HostToDeviceInterface {
- public class TestExecutionException extends Exception {
- public TestExecutionException(final String message) {
- super(message);
- }
- }
+
+ private PowerTestHostLink mHostLink;
+ private SensorTestScreenManipulator mScreenManipulator;
public SensorPowerTestActivity() {
super(SensorPowerTestActivity.class);
}
- private PowerTestHostLink mHostLink;
- /** HostToDeviceInterface implementation **/
+ @Override
public void waitForUserAcknowledgement(final String message) {
appendText(message);
waitForUser();
}
- /* channel for host to raise an exception on the device if needed */
+ @Override
public void raiseError(String testName, String message) throws Exception {
getTestLogger().logTestFail(testName, message);
- throw new TestExecutionException(message);
+ throw new RuntimeException(message);
}
+ @Override
public void logText(String text) {
appendText(text);
}
+ @Override
public void logTestResult(SensorTestDetails testDetails) {
getTestLogger().logTestDetails(testDetails);
}
@Override
- protected void activitySetUp() throws InterruptedException {
- setScreenOffTimeout(15, TimeUnit.SECONDS);
- deactivateSensorFeatures();
+ public void turnScreenOff() {
+ mScreenManipulator.turnScreenOffOnNextPowerDisconnect();
+ }
+
+ @Override
+ protected void activitySetUp() {
+ mScreenManipulator = new SensorTestScreenManipulator(getApplicationContext());
+ mScreenManipulator.initialize(this);
}
@Override
@@ -70,9 +73,7 @@
if (mHostLink != null) {
mHostLink.close();
}
-
- restoreSensorFeatures();
- resetScreenOffTimeout();
+ mScreenManipulator.close();
}
public String testSensorsPower() throws Throwable {
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..4f20a1f 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;
@@ -51,14 +52,12 @@
private static final int EVENTS_TO_COLLECT = 100;
private static final int SENSOR_RATE = SensorManager.SENSOR_DELAY_FASTEST;
- private static final float MAGNETIC_FIELD_CALIBRATED_UNCALIBRATED_THRESHOLD_UT = 1f;
+ private static final float MAGNETIC_FIELD_CALIBRATED_UNCALIBRATED_THRESHOLD_UT = 3f;
private static final float GYROSCOPE_CALIBRATED_UNCALIBRATED_THRESHOLD_RAD_SEC = 0.01f;
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..fbc56c2 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,8 @@
import android.hardware.SensorManager;
import android.hardware.TriggerEvent;
import android.hardware.TriggerEventListener;
-import android.os.Bundle;
+import android.hardware.cts.helpers.SensorNotSupportedException;
+import android.hardware.cts.helpers.TestSensorEnvironment;
import android.os.SystemClock;
import java.util.concurrent.CountDownLatch;
@@ -144,9 +145,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 +170,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);
+ }
}
/**
@@ -236,10 +237,12 @@
sensorName);
Assert.assertEquals(valuesMessage, EXPECTED_EVENT_VALUE, value);
+ long deltaThreshold = MAX_ACCEPTABLE_EVENT_TIME_DELAY_NANOS
+ + TestSensorEnvironment.getSensorMaxDetectionLatencyNs(event.sensor);
return assertTimestampSynchronization(
event.timestamp,
registry.realtimeTimestampNanos,
- MAX_ACCEPTABLE_EVENT_TIME_DELAY_NANOS,
+ deltaThreshold,
sensorName);
}
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..f66d754 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,13 @@
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.TestSensorEnvironment;
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 +69,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 +81,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 +138,8 @@
mMoveDetected = false;
mCheckForMotion = false;
- appendText(instructionsResId);
- waitForUser();
+ getTestLogger().logInstructions(instructionsResId);
+ waitForUserToBegin();
mCheckForMotion = (expectedSteps > 0);
if (vibrate) {
@@ -140,7 +155,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 +175,7 @@
mMovementDetectorHelper.start();
}
- private String verifyMeasurements(int stepsExpected) throws Throwable {
+ private String verifyMeasurements(int stepsExpected) {
mSensorManager.unregisterListener(this);
mMovementDetectorHelper.stop();
@@ -184,8 +199,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) {
@@ -214,19 +233,15 @@
counterEvent.timestamp);
Assert.assertTrue(eventTriggered, countDelta > 0);
- long systemTimestamp = counterEvent.receivedTimestamp;
- long timestamp = counterEvent.timestamp;
- long timestampDelta = Math.abs(timestamp - systemTimestamp);
- String eventTimestampMessage = getString(
- R.string.snsr_event_time,
- systemTimestamp,
- timestamp,
- timestampDelta,
- TIMESTAMP_SYNCHRONIZATION_THRESHOLD_NANOS,
- sensorName);
- Assert.assertTrue(
- eventTimestampMessage,
- timestampDelta < TIMESTAMP_SYNCHRONIZATION_THRESHOLD_NANOS);
+ // TODO: abstract this into an ISensorVerification
+
+ long deltaThreshold = TIMESTAMP_SYNCHRONIZATION_THRESHOLD_NANOS
+ + TestSensorEnvironment.getSensorMaxDetectionLatencyNs(counterEvent.sensor);
+ assertTimestampSynchronization(
+ counterEvent.timestamp,
+ counterEvent.receivedTimestamp,
+ deltaThreshold,
+ counterEvent.sensor.getName());
totalStepsCounted = stepsCounted;
}
@@ -255,8 +270,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 +318,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..c044894 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
@@ -25,9 +25,10 @@
import junit.framework.Assert;
import android.app.Activity;
-import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
+import android.hardware.cts.helpers.ActivityResultMultiplexedLatch;
+import android.hardware.cts.helpers.SensorTestStateNotSupportedException;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Vibrator;
@@ -40,9 +41,7 @@
import android.widget.TextView;
import java.security.InvalidParameterException;
-import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
/**
* A base Activity that is used to build different methods to execute tests inside CtsVerifier.
@@ -66,18 +65,19 @@
*/
public abstract class BaseSensorTestActivity
extends Activity
- implements View.OnClickListener, Runnable {
+ implements View.OnClickListener, Runnable, ISensorTestStateContainer {
@Deprecated
protected static final String LOG_TAG = "SensorTest";
protected final Class mTestClass;
private final int mLayoutId;
- private final DeactivatorActivityHandler mDeactivatorActivityHandler;
private final SensorFeaturesDeactivator mSensorFeaturesDeactivator;
private final Semaphore mSemaphore = new Semaphore(0);
private final SensorTestLogger mTestLogger = new SensorTestLogger();
+ private final ActivityResultMultiplexedLatch mActivityResultMultiplexedLatch =
+ new ActivityResultMultiplexedLatch();
private ScrollView mLogScrollView;
private LinearLayout mLogLayout;
@@ -104,8 +104,7 @@
protected BaseSensorTestActivity(Class testClass, int layoutId) {
mTestClass = testClass;
mLayoutId = layoutId;
- mDeactivatorActivityHandler = new DeactivatorActivityHandler();
- mSensorFeaturesDeactivator = new SensorFeaturesDeactivator(mDeactivatorActivityHandler);
+ mSensorFeaturesDeactivator = new SensorFeaturesDeactivator(this);
}
@Override
@@ -129,7 +128,7 @@
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- mDeactivatorActivityHandler.onActivityResult();
+ mActivityResultMultiplexedLatch.onActivityResult(requestCode, resultCode);
}
/**
@@ -143,12 +142,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 +172,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)
@@ -199,51 +205,8 @@
*/
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.
- *
- * @param timeout The expected timeout.
- * @param timeUnit The unit of the provided timeout.
- *
- * @throws InterruptedException
- */
- protected void setScreenOffTimeout(long timeout, TimeUnit timeUnit)
- throws InterruptedException {
- mSensorFeaturesDeactivator.requestToSetScreenOffTimeout(timeout, timeUnit);
- }
-
- /**
- * Guides the operator throughout the process of restoring the state of the Screen Off timeout
- * to its original state.
- *
- * @throws InterruptedException
- */
- protected void resetScreenOffTimeout() throws InterruptedException {
- mSensorFeaturesDeactivator.requestToResetScreenOffTimeout();
- }
-
- protected SensorTestLogger getTestLogger() {
+ @Override
+ public SensorTestLogger getTestLogger() {
return mTestLogger;
}
@@ -302,9 +265,35 @@
waitForUser(R.string.snsr_wait_to_begin);
}
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void waitForUserToContinue() {
+ waitForUser(R.string.snsr_wait_for_user);
+ }
+
@Deprecated
protected void waitForUser() {
- waitForUser(R.string.snsr_wait_for_user);
+ waitForUserToContinue();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public int executeActivity(String action) {
+ return executeActivity(new Intent(action));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public int executeActivity(Intent intent) {
+ ActivityResultMultiplexedLatch.Latch latch = mActivityResultMultiplexedLatch.bindThread();
+ startActivityForResult(intent, latch.getRequestCode());
+ return latch.await();
}
protected void playSound() {
@@ -382,12 +371,12 @@
}
// a logger available until sensor reporting is in place
- protected class SensorTestLogger {
+ public class SensorTestLogger {
private static final String SUMMARY_SEPARATOR = " | ";
private final StringBuilder mOverallSummaryBuilder = new StringBuilder();
- public void logTestStart(String testName) {
+ void logTestStart(String testName) {
// TODO: log the sensor information and expected execution time of each test
TextAppender textAppender = new TextAppender(R.layout.snsr_test_title);
textAppender.setText(testName);
@@ -402,6 +391,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();
@@ -421,7 +416,7 @@
}
}
- public void logTestPass(String testName, String testSummary) {
+ void logTestPass(String testName, String testSummary) {
testSummary = getValidTestSummary(testSummary, R.string.snsr_test_pass);
logTestEnd(R.layout.snsr_success, testSummary);
Log.d(LOG_TAG, testSummary);
@@ -435,14 +430,14 @@
saveResult(testName, SensorTestDetails.ResultCode.FAIL, testSummary);
}
- public void logTestSkip(String testName, String testSummary) {
+ void logTestSkip(String testName, String testSummary) {
testSummary = getValidTestSummary(testSummary, R.string.snsr_test_skipped);
logTestEnd(R.layout.snsr_warning, testSummary);
Log.i(LOG_TAG, testSummary);
saveResult(testName, SensorTestDetails.ResultCode.SKIPPED, testSummary);
}
- public String getOverallSummary() {
+ String getOverallSummary() {
return mOverallSummaryBuilder.toString();
}
@@ -517,42 +512,4 @@
mButtonView.setEnabled(mButtonEnabled);
}
}
-
- private class DeactivatorActivityHandler implements SensorFeaturesDeactivator.ActivityHandler {
- private static final int SENSOR_FEATURES_DEACTIVATOR_RESULT = 0;
-
- private CountDownLatch mCountDownLatch;
-
- @Override
- public ContentResolver getContentResolver() {
- return BaseSensorTestActivity.this.getContentResolver();
- }
-
- @Override
- public void logInstructions(int instructionsResId, Object ... params) {
- mTestLogger.logInstructions(instructionsResId, params);
- }
-
- @Override
- public void waitForUser() {
- BaseSensorTestActivity.this.waitForUser(R.string.snsr_wait_for_user);
- }
-
- @Override
- public void launchAndWaitForSubactivity(String action) throws InterruptedException {
- mCountDownLatch = new CountDownLatch(1);
- Intent intent = new Intent(action);
- startActivityForResult(intent, SENSOR_FEATURES_DEACTIVATOR_RESULT);
- mCountDownLatch.await();
- }
-
- public void onActivityResult() {
- mCountDownLatch.countDown();
- }
-
- @Override
- public String getString(int resId, Object ... params) {
- return BaseSensorTestActivity.this.getString(resId, params);
- }
- }
}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/ISensorTestStateContainer.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/ISensorTestStateContainer.java
new file mode 100644
index 0000000..3ef7e21
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/ISensorTestStateContainer.java
@@ -0,0 +1,73 @@
+/*
+ * 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 android.content.ContentResolver;
+import android.content.Intent;
+
+/**
+ * An interface that defines a facade for {@link BaseSensorTestActivity}, so it can be consumed by
+ * other CtsVerifier Sensor Test Framework helper components.
+ */
+public interface ISensorTestStateContainer {
+
+ /**
+ * @return The current logger.
+ */
+ BaseSensorTestActivity.SensorTestLogger getTestLogger();
+
+ /**
+ * Waits for the operator to acknowledge to continue execution.
+ */
+ void waitForUserToContinue();
+
+ /**
+ * @param resId The resource Id to extract.
+ * @return The extracted string.
+ */
+ String getString(int resId);
+
+ /**
+ * @param resId The resource Id to extract.
+ * @param params The parameters to format the string represented by the resource contents.
+ * @return The formatted extracted string.
+ */
+ String getString(int resId, Object ... params);
+
+ /**
+ * Starts an Activity and blocks until it completes, then it returns its result back to the
+ * client.
+ *
+ * @param action The action to start the Activity.
+ * @return The Activity's result code.
+ */
+ int executeActivity(String action);
+
+ /**
+ * Starts an Activity and blocks until it completes, then it returns its result back to the
+ * client.
+ *
+ * @param intent The intent to start the Activity.
+ * @return The Activity's result code.
+ */
+ int executeActivity(Intent intent);
+
+ /**
+ * @return The {@link ContentResolver} associated with the test.
+ */
+ ContentResolver getContentResolver();
+}
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..4d2813c 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;
@@ -61,8 +62,6 @@
protected void activitySetUp() {
getTestLogger().logInstructions(R.string.snsr_no_interaction);
waitForUserToBegin();
-
- // TODO: deactivate Sensor features?
}
/**
@@ -93,27 +92,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/PowerTestHostLink.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/helpers/PowerTestHostLink.java
index 645bdb2..59caadf 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/helpers/PowerTestHostLink.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/helpers/PowerTestHostLink.java
@@ -25,8 +25,6 @@
import android.hardware.SensorManager;
import android.net.LocalServerSocket;
import android.net.LocalSocket;
-import android.os.PowerManager;
-import android.provider.Settings;
import android.util.Log;
import java.io.IOException;
@@ -38,13 +36,14 @@
/**
* This class handles communication with the host to respond to commands.
* The command/response link is through a TCP socket on the host side, forwarded via adb to a local
- * socket on the device. The system uses a standard "accept-read_command-send_response-close" to
- * execute commands sent from the host.
- *
+ * socket on the device. The system uses a standard "accept-read_command-send_response-close" to
+ * execute commands sent from the host.
+ *
* CAUTION: The local socket name (SOCKET_NAME below) must match that used by the host to set up
* the adb-forwarding.
*/
public class PowerTestHostLink {
+ private static final String TAG = "PowerTestHostLink";
/**
* Host-to-device bridge will use a Listener instance to drive the test via the CtsVerifier
@@ -55,17 +54,15 @@
void raiseError(String testName, String message) throws Exception;
void waitForUserAcknowledgement(String message);
void logText(String text);
- };
+ void turnScreenOff();
+ }
/** This is a data-only message to communicate result of a power test */
public class PowerTestResult{
public int passedCount = 0;
public int skippedCount = 0;
public int failedCount = 0;
- };
-
-
- public final String TAG = "PowerTestHostLink";
+ }
/**
* Standard response types back to host. Host-side code must match these definitions.
@@ -79,35 +76,15 @@
*/
public final static String SOCKET_NAME = "/android/cts/powertest";
- private LocalServerSocket mServerSocket;
private volatile boolean mStopThread;
private final SensorManager mSensorManager;
- private final PowerManager mPowerManager;
- private final Context mContext;
private final HostToDeviceInterface mHostToDeviceExecutor;
- private PowerTestResult mTestResult;
+ private final PowerTestResult mTestResult = new PowerTestResult();
- public PowerTestHostLink(Context context, final HostToDeviceInterface listener) {
+ public PowerTestHostLink(Context context, HostToDeviceInterface listener) {
Log.d(TAG, " +++ Begin of localSocketServer() +++ ");
mHostToDeviceExecutor = listener;
- mContext = context;
- try {
- mServerSocket = new LocalServerSocket(SOCKET_NAME);
- Log.i(TAG, "OKAY");
-
- } catch (IOException e) {
- Log.e(TAG, "The local Socket Server create failed");
- e.printStackTrace();
- }
- if (mServerSocket != null) {
- Log.d(TAG, "Bound to local server socket");
- } else {
- Log.e(TAG, "Unable to bind to local socket ");
- }
- mStopThread = false;
-
mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
- mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
}
/**
@@ -124,15 +101,15 @@
* @throws Exception
*/
public PowerTestResult run() throws Exception {
- mTestResult = new PowerTestResult();
// define buffer to receive data from host
final int BUFFER_SIZE = 4096;
byte[] buffer = new byte[BUFFER_SIZE];
- if (null == mServerSocket) {
- Log.d(TAG, "The localSocketServer is NULL !!!");
+ LocalServerSocket serverSocket = createSocket();
+ if (null == serverSocket) {
mStopThread = true;
}
+
InputStream streamIn;
OutputStream streamOut;
LocalSocket receiverSocket;
@@ -140,7 +117,7 @@
try {
Log.d(TAG, "localSocketServer accept...");
- receiverSocket = mServerSocket.accept();
+ receiverSocket = serverSocket.accept();
Log.d(TAG, "Got new connection");
} catch (IOException e) {
Log.d(TAG, "localSocketServer accept() failed !!!", e);
@@ -188,7 +165,7 @@
Log.d(TAG, "Sending response " + response);
streamOut.write(response.getBytes(), 0, response.length());
}
- // null response means response is defered awaiting user response
+ // null response means response is deferred awaiting user response
} catch (Exception e) {
Log.e(TAG, "Error executing " + clientRequest, e);
streamOut.write(RESPONSE_ERR.getBytes(), 0, RESPONSE_ERR.length());
@@ -196,75 +173,80 @@
}
receiverSocket.close();
} catch (IOException e) {
- Log.e(TAG, "There is an exception when reading from or writing tosocket", e);
+ Log.e(TAG, "There is an exception when reading from or writing to socket", e);
break;
}
}
Log.d(TAG, "The LocalSocketServer thread is going to stop !!!");
- if (mServerSocket != null) {
+ if (serverSocket != null) {
try {
- mServerSocket.close();
+ serverSocket.close();
} catch (IOException e) {
Log.d(TAG, "Exception on close of server socket", e);
}
}
mHostToDeviceExecutor.logText("Device disconnected.");
- Log.d(TAG, "Returning " + mTestResult.passedCount + "passed " + mTestResult.skippedCount + "skipped " +
- mTestResult.failedCount + "failed.");
+ Log.d(TAG, "Returning " + mTestResult.passedCount + "passed " + mTestResult.skippedCount +
+ "skipped " + mTestResult.failedCount + "failed.");
return mTestResult;
}
- protected String processClientRequest(String request) throws Exception {
- final String USER_REQUEST = "REQUEST USER RESPONSE";
+ private String processClientRequest(String request) throws Exception {
+ // the following constants need to match the definitions in execute_power_tests.py
+ final String REQUEST_EXTERNAL_STORAGE = "EXTERNAL STORAGE?";
+ final String REQUEST_EXIT = "EXIT";
+ final String REQUEST_RAISE = "RAISE ";
+ final String REQUEST_USER_RESPONSE = "USER RESPONSE ";
+ final String REQUEST_SET_TEST_RESULT = "SET TEST RESULT ";
+ final String REQUEST_SENSOR_ON = "SENSOR ON ";
+ final String REQUEST_SENSOR_OFF = "SENSOR OFF";
+ final String REQUEST_SENSOR_AVAILABILITY = "SENSOR? ";
+ final String REQUEST_SCREEN_OFF = "SCREEN OFF";
+ final String REQUEST_SHOW_MESSAGE = "MESSAGE ";
+
String response = RESPONSE_ERR;
// Queries must appear first and then commands to direct actions after in these statements
- if (request.startsWith("SCREEN OFF TIMEOUT?")) {
- int timeout = Settings.System.getInt(mContext.getContentResolver(),
- Settings.System.SCREEN_OFF_TIMEOUT);
- response = "" + timeout;
- } else if (request.startsWith("AIRPLANE MODE ON?")) {
- boolean airplaneModeOn = Settings.Global.getInt
- (mContext.getContentResolver(),
- Settings.Global.AIRPLANE_MODE_ON, 0) != 0;
- response = airplaneModeOn ? RESPONSE_OK : RESPONSE_ERR;
- } else if (request.startsWith("SENSOR?")) {
- final String sensor = request.substring(9);
+ if (request.startsWith(REQUEST_SENSOR_AVAILABILITY)) {
+ final String sensor = request.substring(REQUEST_SENSOR_AVAILABILITY.length());
final int sensorId = getSensorId(sensor);
if (mSensorManager.getDefaultSensor(sensorId) == null) {
response = RESPONSE_UNAVAILABLE;
} else {
response = RESPONSE_OK;
}
- } else if (request.startsWith("EXTERNAL STORAGE?")){
+ } else if (request.startsWith(REQUEST_EXTERNAL_STORAGE)){
response = System.getenv("EXTERNAL_STORAGE");
Log.d(TAG,"External storage is " + response);
- } else if (request.startsWith("SCREEN OFF?")) {
- boolean screenOn = mPowerManager.isScreenOn();
- response = screenOn ? RESPONSE_ERR : RESPONSE_OK;
- } else if (request.startsWith("SCREEN ON?")) {
- boolean screenOn = mPowerManager.isScreenOn();
- response = screenOn ? RESPONSE_OK : RESPONSE_ERR;
- } else if (request.startsWith("SENSOR ON ")) {
- String sensorList = request.substring(10).trim();
- response = handleSensorSensorSwitchCmd(sensorList, true);
- } else if (request.startsWith("SENSOR OFF")) {
- String sensorList = request.substring(10).trim();
- response = handleSensorSensorSwitchCmd(sensorList, false);
- } else if (request.startsWith("MESSAGE")) {
- final String message = request.substring(8);
+ } else if (request.startsWith(REQUEST_SCREEN_OFF)) {
+ try {
+ mHostToDeviceExecutor.turnScreenOff();
+ response = RESPONSE_OK;
+ } catch (SecurityException e) {
+ Log.e(TAG, "Error Turning screen off", e);
+ response = RESPONSE_ERR;
+ }
+ } else if (request.startsWith(REQUEST_SENSOR_ON)) {
+ String sensorList = request.substring(REQUEST_SENSOR_ON.length()).trim();
+ response = handleSensorSwitchCommand(sensorList, true);
+ } else if (request.startsWith(REQUEST_SENSOR_OFF)) {
+ String sensorList = request.substring(REQUEST_SENSOR_ON.length()).trim();
+ response = handleSensorSwitchCommand(sensorList, false);
+ } else if (request.startsWith(REQUEST_SHOW_MESSAGE)) {
+ final String message = request.substring(REQUEST_SHOW_MESSAGE.length());
mHostToDeviceExecutor.logText(message);
response = RESPONSE_OK;
- } else if (request.startsWith(USER_REQUEST)) {
- final String message = request.substring(USER_REQUEST.length() + 1);
+ } else if (request.startsWith(REQUEST_USER_RESPONSE)) {
+ String message = request.substring(REQUEST_USER_RESPONSE.length());
mHostToDeviceExecutor.waitForUserAcknowledgement(message);
response = RESPONSE_OK;
- } else if (request.startsWith("SET TEST RESULT")) {
- response = handleSetTestResultCmd(request);
- } else if (request.startsWith("RAISE")) {
- StringTokenizer tokenizer = new StringTokenizer(request);
+ } else if (request.startsWith(REQUEST_SET_TEST_RESULT)) {
+ String testResult = request.substring(REQUEST_SET_TEST_RESULT.length());
+ response = handleSetTestResultCmd(testResult);
+ } else if (request.startsWith(REQUEST_RAISE)) {
+ String command = request.substring(REQUEST_RAISE.length());
+ StringTokenizer tokenizer = new StringTokenizer(command);
try {
- tokenizer.nextToken();/* RAISE */
final String testName = tokenizer.nextToken();
final String message = request.substring(7 + testName.length());
mHostToDeviceExecutor.raiseError(testName, message);
@@ -273,7 +255,7 @@
Log.e(TAG, "Invalid RAISE command received (bad arguments): " + request);
response = RESPONSE_ERR;
}
- } else if (request.startsWith("EXIT")) {
+ } else if (request.startsWith(REQUEST_EXIT)) {
mStopThread = true;
response = RESPONSE_OK;
} else {
@@ -282,7 +264,7 @@
return response;
}
- protected String handleSetTestResultCmd(final String request) {
+ private String handleSetTestResultCmd(final String request) {
String response;
StringTokenizer tokenizer = new StringTokenizer(request, " ");
String testName = "";
@@ -290,9 +272,6 @@
String message = "";
try {
- tokenizer.nextToken();/* SET */
- tokenizer.nextToken();/* TEST */
- tokenizer.nextToken();/* RESULT */
testName = tokenizer.nextToken();
final String resultToken = tokenizer.nextToken();
@@ -328,7 +307,7 @@
return response;
}
- protected String handleSensorSensorSwitchCmd(String sensorList, boolean switchOn) {
+ private String handleSensorSwitchCommand(String sensorList, boolean switchOn) {
String response;
try {
StringTokenizer tokenizer = new StringTokenizer(sensorList, " ");
@@ -360,7 +339,7 @@
return response;
}
- protected int getSensorId(String sensorName) {
+ private static int getSensorId(String sensorName) {
int sensorId = -1;
if (sensorName.compareToIgnoreCase("ACCELEROMETER") == 0) {
@@ -398,11 +377,11 @@
return sensorId;
}
- protected String switchSensor(int sensorId, boolean switchOn) {
+ private String switchSensor(int sensorId, boolean switchOn) {
return switchSensor(sensorId, switchOn, "SENSOR_DELAY_NORMAL");
}
- protected String switchSensor(int sensorId, boolean switchOn, String requestFrequency) {
+ private String switchSensor(int sensorId, boolean switchOn, String requestFrequency) {
String response;
int rateUs = SensorManager.SENSOR_DELAY_NORMAL;
@@ -429,7 +408,7 @@
return response;
}
- protected String switchAllSensors(boolean on) {
+ private String switchAllSensors(boolean on) {
List<Sensor> allSensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);
String response = RESPONSE_OK;
for (Sensor sensor : allSensors) {
@@ -441,13 +420,20 @@
return response;
}
+ private LocalServerSocket createSocket() {
+ try {
+ return new LocalServerSocket(SOCKET_NAME);
+ } catch (IOException e) {
+ Log.e(TAG, "LocalSocketServer creation failure.", e);
+ return null;
+ }
+ }
+
private SensorEventListener mSensorEventListener = new SensorEventListener() {
@Override
- public void onAccuracyChanged(Sensor sensor, int accuracy) {
- }
+ public void onAccuracyChanged(Sensor sensor, int accuracy) {}
@Override
- public void onSensorChanged(SensorEvent event) {
- }
+ public void onSensorChanged(SensorEvent event) {}
};
}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/helpers/SensorDeviceAdminReceiver.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/helpers/SensorDeviceAdminReceiver.java
new file mode 100644
index 0000000..9d75a98
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/helpers/SensorDeviceAdminReceiver.java
@@ -0,0 +1,34 @@
+/*
+ * 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.helpers;
+
+import android.app.admin.DeviceAdminReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+
+/**
+ * Receiver to be used with {@link SensorTestScreenManipulator}.
+ */
+public class SensorDeviceAdminReceiver extends DeviceAdminReceiver {
+
+ /**
+ * Gets the associated {@link ComponentName} of the current receiver.
+ */
+ public static ComponentName getComponentName(Context context) {
+ return new ComponentName(context, SensorDeviceAdminReceiver.class);
+ }
+}
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..75c0ec0 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
@@ -17,119 +17,63 @@
package com.android.cts.verifier.sensors.helpers;
import com.android.cts.verifier.R;
+import com.android.cts.verifier.sensors.base.ISensorTestStateContainer;
import android.content.ContentResolver;
import android.os.Build;
import android.provider.Settings;
-import android.util.Log;
-
-import java.util.concurrent.TimeUnit;
/**
- * A helper class that provides a mechanism to prompt users to deactivate features that are known
- * to register for sensor data.
- *
- * It also keeps stored the initial state for each feature modified.
+ * A helper class that provides a mechanism to:
+ * - prompt users to activate/deactivate features that are known to register for sensor data.
+ * - turn on/off certain components of the device on behalf of the test (described as 'runtime
+ * features')
+ * - keep track of the initial state for each sensor feature, so it can be restored at will
*/
public class SensorFeaturesDeactivator {
- private static final String TAG = "SensorFeaturesDeactivator";
-
- private final ActivityHandler mActivityHandler;
private boolean mInitialStateCaptured;
- private long mScreenOffTimeoutInMs;
- private final SensorSettingContainer mAirplaneMode;
- private final SensorSettingContainer mScreenBrightnessMode;
- private final SensorSettingContainer mAutoRotateScreenMode;
- private final SensorSettingContainer mKeepScreenOnMode;
- private final SensorSettingContainer mLocationMode;
+ private final ISensorTestStateContainer mStateContainer;
- /**
- * The handler is a facade for the Activity making use of the {@link SensorFeaturesDeactivator}.
- */
- public interface ActivityHandler {
- ContentResolver getContentResolver();
- void logInstructions(int instructionsResId, Object ... params);
- void waitForUser();
- void launchAndWaitForSubactivity(String action) throws InterruptedException;
- String getString(int resId, Object ... params);
+ private final SensorSettingContainer mAirplaneMode = new AirplaneModeSettingContainer();
+ private final SensorSettingContainer mScreenBrightnessMode =
+ new ScreenBrightnessModeSettingContainer();
+ private final SensorSettingContainer mAutoRotateScreenMode =
+ new AutoRotateScreenModeSettingContainer();
+ private final SensorSettingContainer mKeepScreenOnMode = new KeepScreenOnModeSettingContainer();
+ private final SensorSettingContainer mLocationMode = new LocationModeSettingContainer();
+
+ public SensorFeaturesDeactivator(ISensorTestStateContainer stateContainer) {
+ mStateContainer = stateContainer;
}
- public SensorFeaturesDeactivator(ActivityHandler activityHandler) {
- mActivityHandler = activityHandler;
- mAirplaneMode = new AirplaneModeSettingContainer();
- mScreenBrightnessMode = new ScreenBrightnessModeSettingContainer();
- mAutoRotateScreenMode = new AutoRotateScreenModeSettingContainer();
- mKeepScreenOnMode = new KeepScreenOnModeSettingContainer();
- mLocationMode = new LocationModeSettingContainer();
- }
-
- public synchronized void requestDeactivationOfFeatures() throws InterruptedException {
+ public synchronized void requestDeactivationOfFeatures() {
captureInitialState();
- mAirplaneMode.requestToSetMode(true);
- mScreenBrightnessMode.requestToSetMode(false);
- mAutoRotateScreenMode.requestToSetMode(false);
- mKeepScreenOnMode.requestToSetMode(false);
- mLocationMode.requestToSetMode(false);
+ mAirplaneMode.requestToSetMode(mStateContainer, true);
+ mScreenBrightnessMode.requestToSetMode(mStateContainer, false);
+ mAutoRotateScreenMode.requestToSetMode(mStateContainer, false);
+ mKeepScreenOnMode.requestToSetMode(mStateContainer, false);
+ mLocationMode.requestToSetMode(mStateContainer, false);
// TODO: try to use adb shell dumpsys sensorservice to find out if there are clients still
// registered at this time
- mActivityHandler.logInstructions(R.string.snsr_sensor_feature_deactivation);
- mActivityHandler.waitForUser();
+ mStateContainer.getTestLogger()
+ .logInstructions(R.string.snsr_sensor_feature_deactivation);
+ mStateContainer.waitForUserToContinue();
}
- public synchronized void requestToRestoreFeatures() throws InterruptedException {
+ public synchronized void requestToRestoreFeatures() {
if (!isInitialStateCaptured()) {
return;
}
- mAirplaneMode.requestToResetMode();
- mScreenBrightnessMode.requestToResetMode();
- mAutoRotateScreenMode.requestToResetMode();
- mKeepScreenOnMode.requestToResetMode();
- mLocationMode.requestToResetMode();
- }
- public synchronized void requestToResetScreenOffTimeout() throws InterruptedException {
- if (!isInitialStateCaptured()) {
- return;
- }
- try {
- requestToSetScreenOffTimeout(mScreenOffTimeoutInMs, TimeUnit.MILLISECONDS);
- } catch (IllegalStateException e) {
- Log.e(TAG, "Error resetting screen off timeout.", e);
- }
- }
-
- public synchronized void requestToSetScreenOffTimeout(long timeout, TimeUnit timeUnit)
- throws InterruptedException {
- captureInitialState();
-
- String settingName = mActivityHandler.getString(R.string.snsr_setting_auto_screen_off_mode);
- long timeoutInMs = TimeUnit.MILLISECONDS.convert(timeout, timeUnit);
- long timeoutInSec = TimeUnit.SECONDS.convert(timeout, timeUnit);
- if (isScreenOffTimeout(timeoutInMs)) {
- mActivityHandler.logInstructions(
- R.string.snsr_setting_mode_set,
- settingName,
- timeoutInSec + "s");
- return;
- }
-
- mActivityHandler.logInstructions(
- R.string.snsr_setting_mode_request,
- settingName,
- timeoutInSec + "s");
- mActivityHandler.logInstructions(R.string.snsr_on_complete_return);
- mActivityHandler.waitForUser();
- mActivityHandler.launchAndWaitForSubactivity(Settings.ACTION_DISPLAY_SETTINGS);
-
- if (!isScreenOffTimeout(timeoutInMs)) {
- String message = mActivityHandler
- .getString(R.string.snsr_setting_mode_not_set, settingName, timeoutInSec + "s");
- throw new IllegalStateException(message);
- }
+ mAirplaneMode.requestToResetMode(mStateContainer);
+ mScreenBrightnessMode.requestToResetMode(mStateContainer);
+ mAutoRotateScreenMode.requestToResetMode(mStateContainer);
+ mKeepScreenOnMode.requestToResetMode(mStateContainer);
+ mLocationMode.requestToResetMode(mStateContainer);
}
private void captureInitialState() {
@@ -142,7 +86,6 @@
mAutoRotateScreenMode.captureInitialState();
mLocationMode.captureInitialState();
mKeepScreenOnMode.captureInitialState();
- mScreenOffTimeoutInMs = getScreenOffTimeoutInMs();
mInitialStateCaptured = true;
}
@@ -151,27 +94,14 @@
return mInitialStateCaptured;
}
- private boolean isScreenOffTimeout(long expectedTimeoutInMs) {
- return getScreenOffTimeoutInMs() == expectedTimeoutInMs;
- }
-
- private long getScreenOffTimeoutInMs() {
- return Settings.System.getLong(
- mActivityHandler.getContentResolver(),
- Settings.System.SCREEN_OFF_TIMEOUT,
- Integer.MAX_VALUE);
- }
-
private class AirplaneModeSettingContainer extends SensorSettingContainer {
public AirplaneModeSettingContainer() {
- super(mActivityHandler,
- Settings.ACTION_WIRELESS_SETTINGS,
- R.string.snsr_setting_airplane_mode);
+ super(Settings.ACTION_WIRELESS_SETTINGS, R.string.snsr_setting_airplane_mode);
}
@Override
protected int getSettingMode() {
- ContentResolver contentResolver = mActivityHandler.getContentResolver();
+ ContentResolver contentResolver = mStateContainer.getContentResolver();
// Settings.System.AIRPLANE_MODE_ON is deprecated in API 17
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
return Settings.System.getInt(contentResolver, Settings.System.AIRPLANE_MODE_ON, 0);
@@ -183,15 +113,13 @@
private class ScreenBrightnessModeSettingContainer extends SensorSettingContainer {
public ScreenBrightnessModeSettingContainer() {
- super(mActivityHandler,
- Settings.ACTION_DISPLAY_SETTINGS,
- R.string.snsr_setting_screen_brightness_mode);
+ super(Settings.ACTION_DISPLAY_SETTINGS, R.string.snsr_setting_screen_brightness_mode);
}
@Override
public int getSettingMode() {
return Settings.System.getInt(
- mActivityHandler.getContentResolver(),
+ mStateContainer.getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS_MODE,
Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
}
@@ -199,15 +127,14 @@
private class AutoRotateScreenModeSettingContainer extends SensorSettingContainer {
public AutoRotateScreenModeSettingContainer() {
- super(mActivityHandler,
- Settings.ACTION_ACCESSIBILITY_SETTINGS,
+ super(Settings.ACTION_ACCESSIBILITY_SETTINGS,
R.string.snsr_setting_auto_rotate_screen_mode);
}
@Override
protected int getSettingMode() {
return Settings.System.getInt(
- mActivityHandler.getContentResolver(),
+ mStateContainer.getContentResolver(),
Settings.System.ACCELEROMETER_ROTATION,
0 /* default */);
}
@@ -215,15 +142,14 @@
private class KeepScreenOnModeSettingContainer extends SensorSettingContainer {
public KeepScreenOnModeSettingContainer() {
- super(mActivityHandler,
- Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS,
+ super(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS,
R.string.snsr_setting_keep_screen_on);
}
@Override
protected int getSettingMode() {
return Settings.Global.getInt(
- mActivityHandler.getContentResolver(),
+ mStateContainer.getContentResolver(),
Settings.Global.STAY_ON_WHILE_PLUGGED_IN,
0);
}
@@ -231,15 +157,13 @@
private class LocationModeSettingContainer extends SensorSettingContainer {
public LocationModeSettingContainer() {
- super(mActivityHandler,
- Settings.ACTION_LOCATION_SOURCE_SETTINGS,
- R.string.snsr_setting_location_mode);
+ super(Settings.ACTION_LOCATION_SOURCE_SETTINGS, R.string.snsr_setting_location_mode);
}
@Override
protected int getSettingMode() {
return Settings.Secure.getInt(
- mActivityHandler.getContentResolver(),
+ mStateContainer.getContentResolver(),
Settings.Secure.LOCATION_MODE,
Settings.Secure.LOCATION_MODE_OFF);
}
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..27fa699 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
@@ -17,6 +17,8 @@
package com.android.cts.verifier.sensors.helpers;
import com.android.cts.verifier.R;
+import com.android.cts.verifier.sensors.base.BaseSensorTestActivity;
+import com.android.cts.verifier.sensors.base.ISensorTestStateContainer;
import android.util.Log;
@@ -28,17 +30,12 @@
*/
abstract class SensorSettingContainer {
private static final String TAG = "SensorSettingContainer";
- private final SensorFeaturesDeactivator.ActivityHandler mActivityHandler;
private final String mAction;
private final int mSettingNameResId;
private boolean mCapturedModeOn;
- public SensorSettingContainer(
- SensorFeaturesDeactivator.ActivityHandler activityHandler,
- String action,
- int settingNameResId) {
- mActivityHandler = activityHandler;
+ public SensorSettingContainer(String action, int settingNameResId) {
mAction = action;
mSettingNameResId = settingNameResId;
}
@@ -47,28 +44,31 @@
mCapturedModeOn = getCurrentSettingMode();
}
- public synchronized void requestToSetMode(boolean modeOn) throws InterruptedException {
- String settingName = mActivityHandler.getString(mSettingNameResId);
+ public synchronized void requestToSetMode(
+ ISensorTestStateContainer stateContainer,
+ boolean modeOn) {
+ BaseSensorTestActivity.SensorTestLogger logger = stateContainer.getTestLogger();
+ String settingName = stateContainer.getString(mSettingNameResId);
if (getCurrentSettingMode() == modeOn) {
- mActivityHandler.logInstructions(R.string.snsr_setting_mode_set, settingName, modeOn);
+ logger.logInstructions(R.string.snsr_setting_mode_set, settingName, modeOn);
return;
}
- mActivityHandler.logInstructions(R.string.snsr_setting_mode_request, settingName, modeOn);
- mActivityHandler.logInstructions(R.string.snsr_on_complete_return);
- mActivityHandler.waitForUser();
+ logger.logInstructions(R.string.snsr_setting_mode_request, settingName, modeOn);
+ logger.logInstructions(R.string.snsr_on_complete_return);
+ stateContainer.waitForUserToContinue();
- mActivityHandler.launchAndWaitForSubactivity(mAction);
+ stateContainer.executeActivity(mAction);
if (getCurrentSettingMode() != modeOn) {
- String message = mActivityHandler
+ String message = stateContainer
.getString(R.string.snsr_setting_mode_not_set, settingName, modeOn);
throw new IllegalStateException(message);
}
}
- public synchronized void requestToResetMode() throws InterruptedException {
+ public synchronized void requestToResetMode(ISensorTestStateContainer stateContainer) {
try {
- requestToSetMode(mCapturedModeOn);
+ requestToSetMode(stateContainer, mCapturedModeOn);
} catch (IllegalStateException e) {
Log.e(TAG, "Error restoring state of action: " + mAction, e);
}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/helpers/SensorTestScreenManipulator.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/helpers/SensorTestScreenManipulator.java
new file mode 100644
index 0000000..8986cd9
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/helpers/SensorTestScreenManipulator.java
@@ -0,0 +1,138 @@
+/*
+ * 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.helpers;
+
+import com.android.cts.verifier.sensors.base.BaseSensorTestActivity;
+import com.android.cts.verifier.sensors.base.ISensorTestStateContainer;
+
+import android.app.Activity;
+import android.app.admin.DeviceAdminInfo;
+import android.app.admin.DevicePolicyManager;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.text.TextUtils;
+
+/**
+ * A class that provides functionality to manipulate the state of the device's screen.
+ */
+public class SensorTestScreenManipulator {
+
+ private final Context mContext;
+ private final DevicePolicyManager mDevicePolicyManager;
+ private final ComponentName mComponentName;
+
+ private volatile InternalBroadcastReceiver mBroadcastReceiver;
+ private volatile boolean mTurnOffScreenOnPowerDisconnected;
+
+ public SensorTestScreenManipulator(Context context) {
+ mContext = context;
+ mComponentName = SensorDeviceAdminReceiver.getComponentName(context);
+ mDevicePolicyManager =
+ (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
+ }
+
+ /**
+ * Initializes the current instance.
+ * Initialization should usually happen inside {@link BaseSensorTestActivity#activitySetUp}.
+ *
+ * NOTE: Initialization will bring up an Activity to let the user activate the Device Admin,
+ * this method will block until the user completes the operation.
+ */
+ public synchronized void initialize(ISensorTestStateContainer stateContainer) {
+ if (!isDeviceAdminInitialized()) {
+ Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
+ intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mComponentName);
+ int resultCode = stateContainer.executeActivity(intent);
+ if (resultCode != Activity.RESULT_OK) {
+ throw new IllegalStateException(
+ "Test cannot execute without Activating the Device Administrator.");
+ }
+ }
+
+ if (mBroadcastReceiver == null) {
+ mBroadcastReceiver = new InternalBroadcastReceiver();
+ IntentFilter intentFilter = new IntentFilter();
+ intentFilter.addAction(Intent.ACTION_POWER_DISCONNECTED);
+ mContext.registerReceiver(mBroadcastReceiver, intentFilter);
+ }
+ }
+
+ /**
+ * Closes the current instance.
+ * This operation should usually happen inside {@link BaseSensorTestActivity#activityCleanUp}.
+ */
+ public synchronized void close() {
+ if (mBroadcastReceiver != null) {
+ mContext.unregisterReceiver(mBroadcastReceiver);
+ mBroadcastReceiver = null;
+ }
+ }
+
+ /**
+ * Instruct the device to turn off the screen immediately.
+ */
+ public synchronized void turnScreenOff() {
+ ensureDeviceAdminInitialized();
+ mDevicePolicyManager.lockNow();
+ }
+
+ /**
+ * Queues a request to turn off the screen off when the device has been disconnected from a
+ * power source (usually upon USB disconnected).
+ *
+ * (It is useful for Sensor Power Tests, as the Power Monitor usually detaches itself from the
+ * device before beginning to sample data).
+ */
+ public synchronized void turnScreenOffOnNextPowerDisconnect() {
+ ensureDeviceAdminInitialized();
+ mTurnOffScreenOnPowerDisconnected = true;
+ }
+
+ private void ensureDeviceAdminInitialized() throws IllegalStateException {
+ if (!isDeviceAdminInitialized()) {
+ throw new IllegalStateException("Component must be initialized before it can be used.");
+ }
+ }
+
+ private boolean isDeviceAdminInitialized() {
+ if (!mDevicePolicyManager.isAdminActive(mComponentName)) {
+ return false;
+ }
+ return mDevicePolicyManager
+ .hasGrantedPolicy(mComponentName, DeviceAdminInfo.USES_POLICY_FORCE_LOCK);
+ }
+
+ private class InternalBroadcastReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+
+ if (mTurnOffScreenOnPowerDisconnected &&
+ TextUtils.equals(action, Intent.ACTION_POWER_DISCONNECTED)) {
+ turnScreenOff();
+
+ // reset the flag after it has triggered once, we try to avoid cases when the test
+ // might leave the receiver enabled after itself,
+ // this approach still provides a way to multiplex one time requests
+ mTurnOffScreenOnPowerDisconnected = false;
+ }
+ }
+ }
+}
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/common/host-side/tradefed/Android.mk b/common/host-side/tradefed/Android.mk
index 2cb559a..8ff7c8c 100644
--- a/common/host-side/tradefed/Android.mk
+++ b/common/host-side/tradefed/Android.mk
@@ -28,7 +28,7 @@
LOCAL_MODULE_TAGS := optional
-LOCAL_JAVA_LIBRARIES := ddmlib-prebuilt tradefed-prebuilt hosttestlib compatibility-common-util-hostsidelib_v2
+LOCAL_JAVA_LIBRARIES := tradefed-prebuilt hosttestlib compatibility-common-util-hostsidelib_v2
include $(BUILD_HOST_JAVA_LIBRARY)
@@ -44,7 +44,7 @@
LOCAL_MODULE_TAGS := optional
-LOCAL_JAVA_LIBRARIES := ddmlib-prebuilt tradefed-prebuilt compatibility-tradefed_v2 junit
+LOCAL_JAVA_LIBRARIES := tradefed-prebuilt compatibility-tradefed_v2 junit
LOCAL_STATIC_JAVA_LIBRARIES := easymock
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/aadb/Android.mk b/hostsidetests/aadb/Android.mk
index 2f2113c..b9551d1 100644
--- a/hostsidetests/aadb/Android.mk
+++ b/hostsidetests/aadb/Android.mk
@@ -21,7 +21,7 @@
LOCAL_MODULE := CtsAdbTests
-LOCAL_JAVA_LIBRARIES := cts-tradefed tradefed-prebuilt ddmlib-prebuilt junit
+LOCAL_JAVA_LIBRARIES := cts-tradefed tradefed-prebuilt
LOCAL_CTS_TEST_PACKAGE := android.aadb
diff --git a/hostsidetests/appsecurity/Android.mk b/hostsidetests/appsecurity/Android.mk
index 4dd8d5c..61f9a4d 100644
--- a/hostsidetests/appsecurity/Android.mk
+++ b/hostsidetests/appsecurity/Android.mk
@@ -21,7 +21,7 @@
LOCAL_MODULE := CtsAppSecurityTests
-LOCAL_JAVA_LIBRARIES := cts-tradefed tradefed-prebuilt ddmlib-prebuilt junit
+LOCAL_JAVA_LIBRARIES := cts-tradefed tradefed-prebuilt
LOCAL_CTS_TEST_PACKAGE := android.tests.appsecurity
diff --git a/hostsidetests/appsecurity/src/com/android/cts/appsecurity/AppSecurityTests.java b/hostsidetests/appsecurity/src/com/android/cts/appsecurity/AppSecurityTests.java
index 702002c..9dc51c9 100644
--- a/hostsidetests/appsecurity/src/com/android/cts/appsecurity/AppSecurityTests.java
+++ b/hostsidetests/appsecurity/src/com/android/cts/appsecurity/AppSecurityTests.java
@@ -17,18 +17,21 @@
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;
import com.android.ddmlib.testrunner.TestIdentifier;
+import com.android.ddmlib.testrunner.TestResult;
+import com.android.ddmlib.testrunner.TestResult.TestStatus;
+import com.android.ddmlib.testrunner.TestRunResult;
import com.android.tradefed.build.IBuildInfo;
import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.device.ITestDevice;
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.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/hostsidetests/devicepolicy/.gitignore b/hostsidetests/devicepolicy/.gitignore
new file mode 100644
index 0000000..5e56e04
--- /dev/null
+++ b/hostsidetests/devicepolicy/.gitignore
@@ -0,0 +1 @@
+/bin
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..6708c3d 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 := 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..820ba56
--- /dev/null
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ProfileOwnerTest.java
@@ -0,0 +1,226 @@
+/*
+ * 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.ddmlib.testrunner.TestResult;
+import com.android.ddmlib.testrunner.TestResult.TestStatus;
+import com.android.ddmlib.testrunner.TestRunResult;
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.device.DeviceNotAvailableException;
+import com.android.tradefed.log.LogUtil.CLog;
+import com.android.tradefed.result.CollectingTestListener;
+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.getNumTestsInState(TestStatus.PASSED) > 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/Android.mk b/hostsidetests/monkey/Android.mk
index 45d2e37..c9f3bb3 100644
--- a/hostsidetests/monkey/Android.mk
+++ b/hostsidetests/monkey/Android.mk
@@ -22,7 +22,7 @@
LOCAL_MODULE := CtsMonkeyTestCases
-LOCAL_JAVA_LIBRARIES := cts-tradefed tradefed-prebuilt ddmlib-prebuilt junit
+LOCAL_JAVA_LIBRARIES := cts-tradefed tradefed-prebuilt
# prefix zzz intentional to run this last
LOCAL_CTS_TEST_PACKAGE := zzz.android.monkey
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/Android.mk b/hostsidetests/sample/Android.mk
index 1d3ddc8..e8cbdda 100644
--- a/hostsidetests/sample/Android.mk
+++ b/hostsidetests/sample/Android.mk
@@ -23,7 +23,7 @@
# Must match the package name in CtsTestCaseList.mk
LOCAL_MODULE := CtsSampleHostTestCases
-LOCAL_JAVA_LIBRARIES := cts-tradefed ddmlib-prebuilt tradefed-prebuilt
+LOCAL_JAVA_LIBRARIES := cts-tradefed tradefed-prebuilt
LOCAL_CTS_TEST_PACKAGE := android.host.sample
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/security/Android.mk b/hostsidetests/security/Android.mk
index 9796979..a42ee8a 100644
--- a/hostsidetests/security/Android.mk
+++ b/hostsidetests/security/Android.mk
@@ -23,7 +23,7 @@
# Must match the package name in CtsTestCaseList.mk
LOCAL_MODULE := CtsSecurityHostTestCases
-LOCAL_JAVA_LIBRARIES := cts-tradefed ddmlib-prebuilt tradefed-prebuilt
+LOCAL_JAVA_LIBRARIES := cts-tradefed tradefed-prebuilt
LOCAL_CTS_TEST_PACKAGE := android.host.security
diff --git a/hostsidetests/theme/Android.mk b/hostsidetests/theme/Android.mk
index 8e283a3..71027c7 100644
--- a/hostsidetests/theme/Android.mk
+++ b/hostsidetests/theme/Android.mk
@@ -25,7 +25,7 @@
# Must match the package name in CtsTestCaseList.mk
LOCAL_MODULE := CtsThemeHostTestCases
-LOCAL_JAVA_LIBRARIES := cts-tradefed ddmlib-prebuilt tradefed-prebuilt
+LOCAL_JAVA_LIBRARIES := cts-tradefed tradefed-prebuilt
LOCAL_CTS_TEST_PACKAGE := android.host.theme
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/.gitignore b/hostsidetests/usb/.gitignore
new file mode 100644
index 0000000..5e56e04
--- /dev/null
+++ b/hostsidetests/usb/.gitignore
@@ -0,0 +1 @@
+/bin
diff --git a/hostsidetests/usb/Android.mk b/hostsidetests/usb/Android.mk
index 488acbb..f93dfa4 100644
--- a/hostsidetests/usb/Android.mk
+++ b/hostsidetests/usb/Android.mk
@@ -21,7 +21,7 @@
LOCAL_MODULE := CtsUsbTests
-LOCAL_JAVA_LIBRARIES := cts-tradefed tradefed-prebuilt ddmlib-prebuilt junit
+LOCAL_JAVA_LIBRARIES := cts-tradefed tradefed-prebuilt
LOCAL_CTS_TEST_PACKAGE := android.usb
diff --git a/hostsidetests/usb/src/com/android/cts/usb/TestUsbTest.java b/hostsidetests/usb/src/com/android/cts/usb/TestUsbTest.java
index a8ac3e0..4736e51 100644
--- a/hostsidetests/usb/src/com/android/cts/usb/TestUsbTest.java
+++ b/hostsidetests/usb/src/com/android/cts/usb/TestUsbTest.java
@@ -16,48 +16,45 @@
package com.android.cts.usb;
import com.android.cts.tradefed.build.CtsBuildHelper;
-import com.android.ddmlib.IDevice;
-import com.android.ddmlib.Log;
+import com.android.cts.util.AbiUtils;
import com.android.ddmlib.testrunner.RemoteAndroidTestRunner;
-import com.android.ddmlib.testrunner.TestIdentifier;
+import com.android.ddmlib.testrunner.TestRunResult;
import com.android.tradefed.build.IBuildInfo;
import com.android.tradefed.device.DeviceNotAvailableException;
-import com.android.tradefed.device.IFileEntry;
import com.android.tradefed.device.ITestDevice;
-import com.android.tradefed.log.LogUtil.CLog;
import com.android.tradefed.result.CollectingTestListener;
-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;
-import com.android.tradefed.util.FileUtil;
import com.android.tradefed.util.RunUtil;
-import com.android.tradefed.util.StreamUtil;
-import java.io.BufferedInputStream;
import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 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 +65,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/commonutil/src/com/android/cts/util/ReportLog.java b/libs/commonutil/src/com/android/cts/util/ReportLog.java
index 115cec6..56b431a 100644
--- a/libs/commonutil/src/com/android/cts/util/ReportLog.java
+++ b/libs/commonutil/src/com/android/cts/util/ReportLog.java
@@ -43,22 +43,19 @@
/**
* print array of values to output log
*/
- public void printArray(String message, double[] values, ResultType type,
- ResultUnit unit) {
+ public void printArray(String message, double[] values, ResultType type, ResultUnit unit) {
doPrintArray(message, values, type, unit);
}
/**
* Print a value to output log
*/
- public void printValue(String message, double value, ResultType type,
- ResultUnit unit) {
+ public void printValue(String message, double value, ResultType type, ResultUnit unit) {
double[] vals = { value };
doPrintArray(message, vals, type, unit);
}
- private void doPrintArray(String message, double[] values, ResultType type,
- ResultUnit unit) {
+ private void doPrintArray(String message, double[] values, ResultType type, ResultUnit unit) {
StringBuilder builder = new StringBuilder();
// note mDepth + 1 as this function will be called by printVaue or printArray
// and we need caller of printValue / printArray
@@ -104,17 +101,19 @@
/**
* For standard report summary without target value.
* Note that this function will not fail as there is no target.
- * @param messsage
+ * @param message
* @param value
* @param type type of the value
* @param unit unit of the data
*/
- public void printSummary(String message, double value, ResultType type,
- ResultUnit unit) {
+ public void printSummary(String message, double value, ResultType type, ResultUnit unit) {
mSummary = message + LOG_ELEM_SEPARATOR + " " + LOG_ELEM_SEPARATOR + type.getXmlString() +
LOG_ELEM_SEPARATOR + unit.getXmlString() + LOG_ELEM_SEPARATOR + value;
}
+ /**
+ * @return a string representation of this report.
+ */
protected String generateReport() {
if ((mSummary == null) && mMessages.isEmpty()) {
// just return empty string
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/deviceTests/videoperf/src/com/android/cts/videoperf/VideoEncoderDecoderTest.java b/suite/cts/deviceTests/videoperf/src/com/android/cts/videoperf/VideoEncoderDecoderTest.java
index fe28a96..a009ce2 100644
--- a/suite/cts/deviceTests/videoperf/src/com/android/cts/videoperf/VideoEncoderDecoderTest.java
+++ b/suite/cts/deviceTests/videoperf/src/com/android/cts/videoperf/VideoEncoderDecoderTest.java
@@ -387,31 +387,36 @@
int res = codec.dequeueOutputBuffer(info, VIDEO_CODEC_WAIT_TIME_US);
if (res >= 0) {
int outputBufIndex = res;
- ByteBuffer buf = codecOutputBuffers[outputBufIndex];
- if (VERBOSE && (outFrameCount == 0)) {
- printByteBuffer("Y ", buf, 0, 20);
- printByteBuffer("UV ", buf, mVideoWidth * mVideoHeight, 20);
- printByteBuffer("UV ", buf, mVideoWidth * mVideoHeight + mVideoWidth * 60, 20);
- }
- Point origin = getOrigin(outFrameCount);
- for (int i = 0; i < PIXEL_CHECK_PER_FRAME; i++) {
- int w = mRandom.nextInt(mVideoWidth);
- int h = mRandom.nextInt(mVideoHeight);
- getPixelValuesFromYUVBuffers(origin.x, origin.y, w, h, expected);
- getPixelValuesFromOutputBuffer(buf, w, h, decoded);
- if (VERBOSE) {
- Log.i(TAG, outFrameCount + "-" + i + "- th round expcted " + expected.mY +
- "," + expected.mU + "," + expected.mV + " decoded " + decoded.mY +
- "," + decoded.mU + "," + decoded.mV);
+
+ // only do YUV compare on EOS frame if the buffer size is none-zero
+ if (info.size > 0) {
+ ByteBuffer buf = codecOutputBuffers[outputBufIndex];
+ if (VERBOSE && (outFrameCount == 0)) {
+ printByteBuffer("Y ", buf, 0, 20);
+ printByteBuffer("UV ", buf, mVideoWidth * mVideoHeight, 20);
+ printByteBuffer("UV ", buf,
+ mVideoWidth * mVideoHeight + mVideoWidth * 60, 20);
}
- totalErrorSquared += expected.calcErrorSquared(decoded);
+ Point origin = getOrigin(outFrameCount);
+ for (int i = 0; i < PIXEL_CHECK_PER_FRAME; i++) {
+ int w = mRandom.nextInt(mVideoWidth);
+ int h = mRandom.nextInt(mVideoHeight);
+ getPixelValuesFromYUVBuffers(origin.x, origin.y, w, h, expected);
+ getPixelValuesFromOutputBuffer(buf, w, h, decoded);
+ if (VERBOSE) {
+ Log.i(TAG, outFrameCount + "-" + i + "- th round expcted " + expected.mY
+ + "," + expected.mU + "," + expected.mV + " decoded "
+ + decoded.mY + "," + decoded.mU + "," + decoded.mV);
+ }
+ totalErrorSquared += expected.calcErrorSquared(decoded);
+ }
+ outFrameCount++;
}
codec.releaseOutputBuffer(outputBufIndex, false /* render */);
if ((info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
Log.d(TAG, "saw output EOS.");
sawOutputEOS = true;
}
- outFrameCount++;
} else if (res == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
codecOutputBuffers = codec.getOutputBuffers();
Log.d(TAG, "output buffers have changed.");
diff --git a/suite/cts/hostTests/jank/Android.mk b/suite/cts/hostTests/jank/Android.mk
index a7d85de..a1f4d90 100644
--- a/suite/cts/hostTests/jank/Android.mk
+++ b/suite/cts/hostTests/jank/Android.mk
@@ -22,7 +22,7 @@
LOCAL_MODULE := CtsHostJank
-LOCAL_JAVA_LIBRARIES := cts-tradefed tradefed-prebuilt ddmlib-prebuilt
+LOCAL_JAVA_LIBRARIES := cts-tradefed tradefed-prebuilt
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
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/.gitignore b/suite/cts/hostTests/uihost/.gitignore
new file mode 100644
index 0000000..5e56e04
--- /dev/null
+++ b/suite/cts/hostTests/uihost/.gitignore
@@ -0,0 +1 @@
+/bin
diff --git a/suite/cts/hostTests/uihost/Android.mk b/suite/cts/hostTests/uihost/Android.mk
index dd51b6b..67ebcbb 100644
--- a/suite/cts/hostTests/uihost/Android.mk
+++ b/suite/cts/hostTests/uihost/Android.mk
@@ -22,7 +22,7 @@
LOCAL_MODULE := CtsHostUi
-LOCAL_JAVA_LIBRARIES := cts-tradefed tradefed-prebuilt ddmlib-prebuilt junit
+LOCAL_JAVA_LIBRARIES := cts-tradefed tradefed-prebuilt
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
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..100f448 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,23 +17,20 @@
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;
-import com.android.ddmlib.Log.LogLevel;
import com.android.ddmlib.testrunner.RemoteAndroidTestRunner;
import com.android.ddmlib.testrunner.TestIdentifier;
+import com.android.ddmlib.testrunner.TestRunResult;
import com.android.tradefed.build.IBuildInfo;
-import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.device.ITestDevice;
-import com.android.tradefed.device.TestDeviceOptions;
import com.android.tradefed.result.CollectingTestListener;
-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 +42,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 +62,11 @@
};
@Override
+ public void setAbi(IAbi abi) {
+ mAbi = abi;
+ }
+
+ @Override
public void setBuild(IBuildInfo buildInfo) {
mBuild = CtsBuildHelper.createBuildHelper(buildInfo);
}
@@ -72,10 +75,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 +94,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 +106,7 @@
fail(result.getRunFailureMessage());
}
assertNotNull("no performance data", mCtsReport);
- CtsHostStore.storeCtsResult(mDevice.getSerialNumber(),
+ CtsHostStore.storeCtsResult(mDevice.getSerialNumber(), mAbi.getName(),
ReportLog.getClassMethodNames(), mCtsReport);
}
@@ -110,7 +115,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/tests/telecomm/Android.mk b/tests/app/Android.mk
similarity index 65%
copy from tests/tests/telecomm/Android.mk
copy to tests/app/Android.mk
index de1d8b3..69bf590 100644
--- a/tests/tests/telecomm/Android.mk
+++ b/tests/app/Android.mk
@@ -1,4 +1,4 @@
-# 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.
@@ -12,7 +12,6 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
@@ -22,18 +21,15 @@
# and when built explicitly put it in the data partition
LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-#LOCAL_JAVA_LIBRARIES := Telecomm
+LOCAL_PROGUARD_ENABLED := disabled
-LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
+LOCAL_JAVA_LIBRARIES := android.test.runner telephony-common voip-common
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner ctstestserver
-LOCAL_PACKAGE_NAME := CtsTelecomTestCases
+LOCAL_SRC_FILES := $(call all-java-files-under, src) \
+ src/android/app/cts/ISecondary.aidl
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
+LOCAL_PACKAGE_NAME := CtsAppTestStubs
-# uncomment when b/13250611 is fixed
-#LOCAL_SDK_VERSION := current
-LOCAL_JAVA_LIBRARIES += android.test.runner
-
-include $(BUILD_CTS_PACKAGE)
+include $(BUILD_PACKAGE)
diff --git a/tests/app/AndroidManifest.xml b/tests/app/AndroidManifest.xml
new file mode 100644
index 0000000..b628a0c
--- /dev/null
+++ b/tests/app/AndroidManifest.xml
@@ -0,0 +1,283 @@
+<?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.app.stub">
+
+ <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.DialogStubActivity"
+ android:label="DialogStubActivity"
+ 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.SearchManagerStubActivity"
+ android:label="SearchManagerStubActivity">
+ <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.PendingIntentStubActivity"
+ android:label="PendingIntentStubActivity"/>
+
+ <activity android:name="android.app.cts.LocalActivityManagerStubActivity"
+ android:label="LocalActivityManagerStubActivity" />
+
+ <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.AppStubActivity" android:label="AppStubActivity">
+ <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.DialogStubActivity"
+ android:theme="@style/Theme_NoSwipeDismiss"
+ android:label="DialogStubActivity">
+ <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>
+
+</manifest>
+
diff --git a/tests/assets/noiseandchirps b/tests/app/assets/noiseandchirps
similarity index 100%
rename from tests/assets/noiseandchirps
rename to tests/app/assets/noiseandchirps
Binary files differ
diff --git a/tests/assets/noiseandchirps.mp3 b/tests/app/assets/noiseandchirps.mp3
similarity index 100%
rename from tests/assets/noiseandchirps.mp3
rename to tests/app/assets/noiseandchirps.mp3
Binary files differ
diff --git a/tests/assets/noiseandchirps.ogg b/tests/app/assets/noiseandchirps.ogg
similarity index 100%
rename from tests/assets/noiseandchirps.ogg
rename to tests/app/assets/noiseandchirps.ogg
Binary files differ
diff --git a/tests/assets/noiseandchirps.wrong b/tests/app/assets/noiseandchirps.wrong
similarity index 100%
rename from tests/assets/noiseandchirps.wrong
rename to tests/app/assets/noiseandchirps.wrong
Binary files differ
diff --git a/tests/app/res/drawable/icon_black.jpg b/tests/app/res/drawable/icon_black.jpg
new file mode 100644
index 0000000..4c9062a
--- /dev/null
+++ b/tests/app/res/drawable/icon_black.jpg
Binary files differ
diff --git a/tests/app/res/drawable/icon_blue.jpg b/tests/app/res/drawable/icon_blue.jpg
new file mode 100644
index 0000000..9e6c1c8
--- /dev/null
+++ b/tests/app/res/drawable/icon_blue.jpg
Binary files differ
diff --git a/tests/app/res/drawable/icon_green.jpg b/tests/app/res/drawable/icon_green.jpg
new file mode 100644
index 0000000..55a78f2
--- /dev/null
+++ b/tests/app/res/drawable/icon_green.jpg
Binary files differ
diff --git a/tests/app/res/drawable/icon_red.jpg b/tests/app/res/drawable/icon_red.jpg
new file mode 100644
index 0000000..6bc9e1f
--- /dev/null
+++ b/tests/app/res/drawable/icon_red.jpg
Binary files differ
diff --git a/tests/app/res/drawable/icon_yellow.jpg b/tests/app/res/drawable/icon_yellow.jpg
new file mode 100644
index 0000000..e748059
--- /dev/null
+++ b/tests/app/res/drawable/icon_yellow.jpg
Binary files differ
diff --git a/tests/app/res/drawable/ninepatch_0.9.png b/tests/app/res/drawable/ninepatch_0.9.png
new file mode 100644
index 0000000..24019d8
--- /dev/null
+++ b/tests/app/res/drawable/ninepatch_0.9.png
Binary files differ
diff --git a/tests/app/res/drawable/ninepatch_1.9.png b/tests/app/res/drawable/ninepatch_1.9.png
new file mode 100644
index 0000000..c56b1db
--- /dev/null
+++ b/tests/app/res/drawable/ninepatch_1.9.png
Binary files differ
diff --git a/tests/app/res/drawable/pass.jpg b/tests/app/res/drawable/pass.jpg
new file mode 100644
index 0000000..2f4b083
--- /dev/null
+++ b/tests/app/res/drawable/pass.jpg
Binary files differ
diff --git a/tests/assets/images/robot.png b/tests/app/res/drawable/robot.png
similarity index 100%
copy from tests/assets/images/robot.png
copy to tests/app/res/drawable/robot.png
Binary files differ
diff --git a/tests/app/res/drawable/size_48x48.jpg b/tests/app/res/drawable/size_48x48.jpg
new file mode 100644
index 0000000..5c2291e
--- /dev/null
+++ b/tests/app/res/drawable/size_48x48.jpg
Binary files differ
diff --git a/tests/app/res/layout/alert_dialog_text_entry.xml b/tests/app/res/layout/alert_dialog_text_entry.xml
new file mode 100644
index 0000000..8b87a5d
--- /dev/null
+++ b/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/app/res/layout/alert_dialog_text_entry_2.xml b/tests/app/res/layout/alert_dialog_text_entry_2.xml
new file mode 100644
index 0000000..848b342
--- /dev/null
+++ b/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/app/res/layout/alertdialog_custom_title.xml b/tests/app/res/layout/alertdialog_custom_title.xml
new file mode 100644
index 0000000..ff36f2a
--- /dev/null
+++ b/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/app/res/layout/app_activity.xml b/tests/app/res/layout/app_activity.xml
new file mode 100644
index 0000000..8b7206f
--- /dev/null
+++ b/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/app/res/layout/checkbox_layout.xml b/tests/app/res/layout/checkbox_layout.xml
new file mode 100644
index 0000000..a1f1718
--- /dev/null
+++ b/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/app/res/layout/dialog_stub_layout.xml b/tests/app/res/layout/dialog_stub_layout.xml
new file mode 100644
index 0000000..c6eb10d
--- /dev/null
+++ b/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/app/res/menu/browser.xml b/tests/app/res/menu/browser.xml
new file mode 100644
index 0000000..29e5149
--- /dev/null
+++ b/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/app/res/values/arrays.xml b/tests/app/res/values/arrays.xml
new file mode 100644
index 0000000..71e0133
--- /dev/null
+++ b/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/app/res/values/attrs.xml b/tests/app/res/values/attrs.xml
new file mode 100644
index 0000000..4c3d9db
--- /dev/null
+++ b/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/app/res/values/colors.xml
similarity index 60%
copy from tests/src/android/widget/cts/ProgressBarStubActivity.java
copy to tests/app/res/values/colors.xml
index 57cfa1a..f3cc325 100644
--- a/tests/src/android/widget/cts/ProgressBarStubActivity.java
+++ b/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/app/res/values/strings.xml b/tests/app/res/values/strings.xml
new file mode 100644
index 0000000..c167278
--- /dev/null
+++ b/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/app/res/values/styles.xml b/tests/app/res/values/styles.xml
new file mode 100644
index 0000000..81925cc
--- /dev/null
+++ b/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/app/res/xml/alias.xml b/tests/app/res/xml/alias.xml
new file mode 100644
index 0000000..321e536
--- /dev/null
+++ b/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.stub"
+ android:targetClass="android.app.cts.ChildActivity"
+ android:data="http://www.google.com/">
+ </intent>
+</alias>
+
diff --git a/tests/app/res/xml/intentfilter.xml b/tests/app/res/xml/intentfilter.xml
new file mode 100644
index 0000000..7ed3a53
--- /dev/null
+++ b/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/app/res/xml/metadata.xml b/tests/app/res/xml/metadata.xml
new file mode 100644
index 0000000..336b931
--- /dev/null
+++ b/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/app/res/xml/searchable.xml b/tests/app/res/xml/searchable.xml
new file mode 100644
index 0000000..f09c917
--- /dev/null
+++ b/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/cts/ActionBarActivity.java b/tests/app/src/android/app/cts/ActionBarActivity.java
similarity index 100%
rename from tests/tests/app/src/android/app/cts/ActionBarActivity.java
rename to tests/app/src/android/app/cts/ActionBarActivity.java
diff --git a/tests/src/android/app/cts/ActivityManagerMemoryClassLaunchActivity.java b/tests/app/src/android/app/cts/ActivityManagerMemoryClassLaunchActivity.java
similarity index 100%
rename from tests/src/android/app/cts/ActivityManagerMemoryClassLaunchActivity.java
rename to tests/app/src/android/app/cts/ActivityManagerMemoryClassLaunchActivity.java
diff --git a/tests/src/android/app/cts/ActivityManagerMemoryClassTestActivity.java b/tests/app/src/android/app/cts/ActivityManagerMemoryClassTestActivity.java
similarity index 100%
rename from tests/src/android/app/cts/ActivityManagerMemoryClassTestActivity.java
rename to tests/app/src/android/app/cts/ActivityManagerMemoryClassTestActivity.java
diff --git a/tests/src/android/app/cts/ActivityManagerRecentOneActivity.java b/tests/app/src/android/app/cts/ActivityManagerRecentOneActivity.java
similarity index 100%
rename from tests/src/android/app/cts/ActivityManagerRecentOneActivity.java
rename to tests/app/src/android/app/cts/ActivityManagerRecentOneActivity.java
diff --git a/tests/src/android/app/cts/ActivityManagerRecentTwoActivity.java b/tests/app/src/android/app/cts/ActivityManagerRecentTwoActivity.java
similarity index 100%
rename from tests/src/android/app/cts/ActivityManagerRecentTwoActivity.java
rename to tests/app/src/android/app/cts/ActivityManagerRecentTwoActivity.java
diff --git a/tests/src/android/app/cts/ActivityManagerStubCrashActivity.java b/tests/app/src/android/app/cts/ActivityManagerStubCrashActivity.java
similarity index 100%
rename from tests/src/android/app/cts/ActivityManagerStubCrashActivity.java
rename to tests/app/src/android/app/cts/ActivityManagerStubCrashActivity.java
diff --git a/tests/src/android/app/cts/ActivityManagerStubFooActivity.java b/tests/app/src/android/app/cts/ActivityManagerStubFooActivity.java
similarity index 100%
rename from tests/src/android/app/cts/ActivityManagerStubFooActivity.java
rename to tests/app/src/android/app/cts/ActivityManagerStubFooActivity.java
diff --git a/tests/src/android/app/cts/ActivityTestsBase.java b/tests/app/src/android/app/cts/ActivityTestsBase.java
similarity index 100%
rename from tests/src/android/app/cts/ActivityTestsBase.java
rename to tests/app/src/android/app/cts/ActivityTestsBase.java
diff --git a/tests/src/android/app/cts/AliasActivityStub.java b/tests/app/src/android/app/cts/AliasActivityStub.java
similarity index 100%
rename from tests/src/android/app/cts/AliasActivityStub.java
rename to tests/app/src/android/app/cts/AliasActivityStub.java
diff --git a/tests/src/android/app/cts/AppStubActivity.java b/tests/app/src/android/app/cts/AppStubActivity.java
similarity index 98%
rename from tests/src/android/app/cts/AppStubActivity.java
rename to tests/app/src/android/app/cts/AppStubActivity.java
index fa786fa..da5e55a 100644
--- a/tests/src/android/app/cts/AppStubActivity.java
+++ b/tests/app/src/android/app/cts/AppStubActivity.java
@@ -26,7 +26,7 @@
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
-import com.android.cts.stub.R;
+import com.android.cts.app.stub.R;
/**
* A minimal "Hello, World!" application.
diff --git a/tests/tests/app/src/android/app/cts/CTSActivityTestCaseBase.java b/tests/app/src/android/app/cts/CTSActivityTestCaseBase.java
similarity index 100%
rename from tests/tests/app/src/android/app/cts/CTSActivityTestCaseBase.java
rename to tests/app/src/android/app/cts/CTSActivityTestCaseBase.java
diff --git a/tests/src/android/app/cts/ChildActivity.java b/tests/app/src/android/app/cts/ChildActivity.java
similarity index 100%
rename from tests/src/android/app/cts/ChildActivity.java
rename to tests/app/src/android/app/cts/ChildActivity.java
diff --git a/tests/src/android/app/cts/ChildTabActivity.java b/tests/app/src/android/app/cts/ChildTabActivity.java
similarity index 100%
rename from tests/src/android/app/cts/ChildTabActivity.java
rename to tests/app/src/android/app/cts/ChildTabActivity.java
diff --git a/tests/src/android/app/cts/ClearTop.java b/tests/app/src/android/app/cts/ClearTop.java
similarity index 100%
rename from tests/src/android/app/cts/ClearTop.java
rename to tests/app/src/android/app/cts/ClearTop.java
diff --git a/tests/src/android/app/cts/DialogStubActivity.java b/tests/app/src/android/app/cts/DialogStubActivity.java
similarity index 99%
rename from tests/src/android/app/cts/DialogStubActivity.java
rename to tests/app/src/android/app/cts/DialogStubActivity.java
index 817e716..a773ae2 100644
--- a/tests/src/android/app/cts/DialogStubActivity.java
+++ b/tests/app/src/android/app/cts/DialogStubActivity.java
@@ -16,7 +16,7 @@
package android.app.cts;
-import com.android.cts.stub.R;
+import com.android.cts.app.stub.R;
import android.app.Activity;
import android.app.AlertDialog;
@@ -236,7 +236,7 @@
@SuppressWarnings("deprecation")
private AlertDialog getAlertDialogInstance(boolean deprecated) {
mAlertDialog = new AlertDialog.Builder(DialogStubActivity.this).create();
- mAlertDialog.setIcon(com.android.cts.stub.R.drawable.pass);
+ mAlertDialog.setIcon(com.android.cts.app.stub.R.drawable.pass);
mAlertDialog.setTitle(DEFAULT_ALERTDIALOG_TITLE);
mAlertDialog.setMessage(DEFAULT_ALERTDIALOG_MESSAGE);
mAlertDialog.setInverseBackgroundForced(true);
diff --git a/tests/src/android/app/cts/ExpandableListTestActivity.java b/tests/app/src/android/app/cts/ExpandableListTestActivity.java
similarity index 100%
rename from tests/src/android/app/cts/ExpandableListTestActivity.java
rename to tests/app/src/android/app/cts/ExpandableListTestActivity.java
diff --git a/tests/src/android/app/cts/IBinderParcelable.java b/tests/app/src/android/app/cts/IBinderParcelable.java
similarity index 100%
rename from tests/src/android/app/cts/IBinderParcelable.java
rename to tests/app/src/android/app/cts/IBinderParcelable.java
diff --git a/tests/src/android/app/cts/ISecondary.aidl b/tests/app/src/android/app/cts/ISecondary.aidl
similarity index 100%
rename from tests/src/android/app/cts/ISecondary.aidl
rename to tests/app/src/android/app/cts/ISecondary.aidl
diff --git a/tests/src/android/app/cts/InstrumentationTestActivity.java b/tests/app/src/android/app/cts/InstrumentationTestActivity.java
similarity index 99%
rename from tests/src/android/app/cts/InstrumentationTestActivity.java
rename to tests/app/src/android/app/cts/InstrumentationTestActivity.java
index 1cedd9f..bec721e 100644
--- a/tests/src/android/app/cts/InstrumentationTestActivity.java
+++ b/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.stub.R;
public class InstrumentationTestActivity extends Activity {
diff --git a/tests/src/android/app/cts/IntentServiceStub.java b/tests/app/src/android/app/cts/IntentServiceStub.java
similarity index 100%
rename from tests/src/android/app/cts/IntentServiceStub.java
rename to tests/app/src/android/app/cts/IntentServiceStub.java
diff --git a/tests/src/android/app/cts/KeyguardManagerActivity.java b/tests/app/src/android/app/cts/KeyguardManagerActivity.java
similarity index 100%
rename from tests/src/android/app/cts/KeyguardManagerActivity.java
rename to tests/app/src/android/app/cts/KeyguardManagerActivity.java
diff --git a/tests/src/android/app/cts/LauncherActivityStub.java b/tests/app/src/android/app/cts/LauncherActivityStub.java
similarity index 100%
rename from tests/src/android/app/cts/LauncherActivityStub.java
rename to tests/app/src/android/app/cts/LauncherActivityStub.java
diff --git a/tests/src/android/app/cts/LaunchpadActivity.java b/tests/app/src/android/app/cts/LaunchpadActivity.java
similarity index 100%
rename from tests/src/android/app/cts/LaunchpadActivity.java
rename to tests/app/src/android/app/cts/LaunchpadActivity.java
diff --git a/tests/src/android/app/cts/LaunchpadTabActivity.java b/tests/app/src/android/app/cts/LaunchpadTabActivity.java
similarity index 100%
rename from tests/src/android/app/cts/LaunchpadTabActivity.java
rename to tests/app/src/android/app/cts/LaunchpadTabActivity.java
diff --git a/tests/src/android/app/cts/LocalActivity.java b/tests/app/src/android/app/cts/LocalActivity.java
similarity index 100%
rename from tests/src/android/app/cts/LocalActivity.java
rename to tests/app/src/android/app/cts/LocalActivity.java
diff --git a/tests/src/android/app/cts/LocalActivityManagerStubActivity.java b/tests/app/src/android/app/cts/LocalActivityManagerStubActivity.java
similarity index 100%
rename from tests/src/android/app/cts/LocalActivityManagerStubActivity.java
rename to tests/app/src/android/app/cts/LocalActivityManagerStubActivity.java
diff --git a/tests/src/android/app/cts/LocalActivityManagerTestHelper.java b/tests/app/src/android/app/cts/LocalActivityManagerTestHelper.java
similarity index 100%
rename from tests/src/android/app/cts/LocalActivityManagerTestHelper.java
rename to tests/app/src/android/app/cts/LocalActivityManagerTestHelper.java
diff --git a/tests/src/android/app/cts/LocalDeniedService.java b/tests/app/src/android/app/cts/LocalDeniedService.java
similarity index 100%
rename from tests/src/android/app/cts/LocalDeniedService.java
rename to tests/app/src/android/app/cts/LocalDeniedService.java
diff --git a/tests/src/android/app/cts/LocalDialog.java b/tests/app/src/android/app/cts/LocalDialog.java
similarity index 100%
rename from tests/src/android/app/cts/LocalDialog.java
rename to tests/app/src/android/app/cts/LocalDialog.java
diff --git a/tests/src/android/app/cts/LocalGrantedService.java b/tests/app/src/android/app/cts/LocalGrantedService.java
similarity index 100%
rename from tests/src/android/app/cts/LocalGrantedService.java
rename to tests/app/src/android/app/cts/LocalGrantedService.java
diff --git a/tests/src/android/app/cts/LocalScreen.java b/tests/app/src/android/app/cts/LocalScreen.java
similarity index 100%
rename from tests/src/android/app/cts/LocalScreen.java
rename to tests/app/src/android/app/cts/LocalScreen.java
diff --git a/tests/src/android/app/cts/LocalService.java b/tests/app/src/android/app/cts/LocalService.java
similarity index 100%
rename from tests/src/android/app/cts/LocalService.java
rename to tests/app/src/android/app/cts/LocalService.java
diff --git a/tests/src/android/app/cts/MockActivity.java b/tests/app/src/android/app/cts/MockActivity.java
similarity index 100%
rename from tests/src/android/app/cts/MockActivity.java
rename to tests/app/src/android/app/cts/MockActivity.java
diff --git a/tests/src/android/app/cts/MockAlarmReceiver.java b/tests/app/src/android/app/cts/MockAlarmReceiver.java
similarity index 100%
rename from tests/src/android/app/cts/MockAlarmReceiver.java
rename to tests/app/src/android/app/cts/MockAlarmReceiver.java
diff --git a/tests/src/android/app/cts/MockApplication.java b/tests/app/src/android/app/cts/MockApplication.java
similarity index 100%
rename from tests/src/android/app/cts/MockApplication.java
rename to tests/app/src/android/app/cts/MockApplication.java
diff --git a/tests/src/android/app/cts/MockApplicationActivity.java b/tests/app/src/android/app/cts/MockApplicationActivity.java
similarity index 100%
rename from tests/src/android/app/cts/MockApplicationActivity.java
rename to tests/app/src/android/app/cts/MockApplicationActivity.java
diff --git a/tests/src/android/app/cts/MockReceiver.java b/tests/app/src/android/app/cts/MockReceiver.java
similarity index 100%
rename from tests/src/android/app/cts/MockReceiver.java
rename to tests/app/src/android/app/cts/MockReceiver.java
diff --git a/tests/src/android/app/cts/MockService.java b/tests/app/src/android/app/cts/MockService.java
similarity index 100%
rename from tests/src/android/app/cts/MockService.java
rename to tests/app/src/android/app/cts/MockService.java
diff --git a/tests/src/android/app/cts/MockTabActivity.java b/tests/app/src/android/app/cts/MockTabActivity.java
similarity index 100%
rename from tests/src/android/app/cts/MockTabActivity.java
rename to tests/app/src/android/app/cts/MockTabActivity.java
diff --git a/tests/src/android/app/cts/OrientationTestUtils.java b/tests/app/src/android/app/cts/OrientationTestUtils.java
similarity index 100%
rename from tests/src/android/app/cts/OrientationTestUtils.java
rename to tests/app/src/android/app/cts/OrientationTestUtils.java
diff --git a/tests/src/android/app/cts/PendingIntentStubActivity.java b/tests/app/src/android/app/cts/PendingIntentStubActivity.java
similarity index 100%
rename from tests/src/android/app/cts/PendingIntentStubActivity.java
rename to tests/app/src/android/app/cts/PendingIntentStubActivity.java
diff --git a/tests/src/android/app/cts/SearchManagerStubActivity.java b/tests/app/src/android/app/cts/SearchManagerStubActivity.java
similarity index 100%
rename from tests/src/android/app/cts/SearchManagerStubActivity.java
rename to tests/app/src/android/app/cts/SearchManagerStubActivity.java
diff --git a/tests/src/android/app/cts/StubRemoteService.java b/tests/app/src/android/app/cts/StubRemoteService.java
similarity index 100%
rename from tests/src/android/app/cts/StubRemoteService.java
rename to tests/app/src/android/app/cts/StubRemoteService.java
diff --git a/tests/src/android/app/cts/TestDialog.java b/tests/app/src/android/app/cts/TestDialog.java
similarity index 100%
rename from tests/src/android/app/cts/TestDialog.java
rename to tests/app/src/android/app/cts/TestDialog.java
diff --git a/tests/src/android/app/cts/TestedActivity.java b/tests/app/src/android/app/cts/TestedActivity.java
similarity index 100%
rename from tests/src/android/app/cts/TestedActivity.java
rename to tests/app/src/android/app/cts/TestedActivity.java
diff --git a/tests/src/android/app/cts/TestedScreen.java b/tests/app/src/android/app/cts/TestedScreen.java
similarity index 100%
rename from tests/src/android/app/cts/TestedScreen.java
rename to tests/app/src/android/app/cts/TestedScreen.java
diff --git a/tests/expectations/knownfailures.txt b/tests/expectations/knownfailures.txt
index 131b264..d7c7500 100644
--- a/tests/expectations/knownfailures.txt
+++ b/tests/expectations/knownfailures.txt
@@ -60,6 +60,53 @@
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: "Current implementation of uninstallAllUserCaCerts does not throw expected security exception, wait for fix from framework",
+ names: [
+ "android.admin.cts.DevicePolicyManagerTest#testUninstallAllUserCaCerts_failIfNotProfileOwner"
+ ],
+ bug: 17508787
+},
+{
+
+ description: "These tests fail on some devices.",
+ names: [
+ "android.uirendering.cts.testclasses.ExactCanvasTests#testBlueRect",
+ "android.uirendering.cts.testclasses.ExactCanvasTests#testBluePaddedSquare",
+ "android.uirendering.cts.testclasses.ViewClippingTests#testSimplePaddingClip",
+ "android.uirendering.cts.testclasses.ViewClippingTests#testSimpleClipBoundsClip",
+ "android.uirendering.cts.testclasses.ViewClippingTests#testSimpleOutlineClip",
+ "android.uirendering.cts.testclasses.ViewClippingTests#testSimpleBoundsClip",
+ "android.uirendering.cts.testclasses.InfrastructureTests#testViewInitializer"
+ ],
+ bug: 17511118
+},
+{
+ description: "This test failed on devices that use effect off loading. In addition it uses hidden apis",
+ names: [
+ "android.meida.cts.AudioEffectTest#test1_1ConstructorFromUuid"
+ ],
+ bug: 17605875
}
]
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..39be0dc 100644
--- a/tests/tests/app/Android.mk
+++ b/tests/tests/app/Android.mk
@@ -23,12 +23,12 @@
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) \
LOCAL_PACKAGE_NAME := CtsAppTestCases
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
+LOCAL_INSTRUMENTATION_FOR := CtsAppTestStubs
include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/app/AndroidManifest.xml b/tests/tests/app/AndroidManifest.xml
index a558564..08b0dda 100644
--- a/tests/tests/app/AndroidManifest.xml
+++ b/tests/tests/app/AndroidManifest.xml
@@ -16,23 +16,16 @@
-->
<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>
<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>
<instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
- android:targetPackage="com.android.cts.stub"
+ android:targetPackage="com.android.cts.app.stub"
android:label="CTS tests of android.app">
<meta-data android:name="listener"
android:value="com.android.cts.runner.CtsTestRunListener" />
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..1b0a401 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.stub");
// Backup isn't expected to work in this test but check for obvious bugs...
int result = backupManager.requestRestore(new RestoreObserver() {});
diff --git a/tests/tests/app/src/android/app/cts/ActivityManagerTest.java b/tests/tests/app/src/android/app/cts/ActivityManagerTest.java
index 6a1ccb5..e633f1f 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.stub";
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.stub:remote")) {
+ fail("should be no process named com.android.cts.app.stub:remote");
}
}
// start a new process
mIntent = new Intent("android.app.REMOTESERVICE");
- mIntent.setPackage("com.android.cts.stub");
+ mIntent.setPackage("com.android.cts.app.stub");
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.stub:remote")) {
return;
}
}
- fail("com.android.cts.stub:remote process should be available");
+ fail("com.android.cts.app.stub:remote process should be available");
}
public void testGetProcessInErrorState() throws Exception {
diff --git a/tests/tests/app/src/android/app/cts/AlertDialogTest.java b/tests/tests/app/src/android/app/cts/AlertDialogTest.java
index aefcf01..3e9f3b2 100644
--- a/tests/tests/app/src/android/app/cts/AlertDialogTest.java
+++ b/tests/tests/app/src/android/app/cts/AlertDialogTest.java
@@ -45,7 +45,7 @@
private Button mNeutralButton;
public AlertDialogTest() {
- super("com.android.cts.stub", DialogStubActivity.class);
+ super("com.android.cts.app.stub", DialogStubActivity.class);
}
@Override
@@ -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.stub.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.stub.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.stub.R.string.alert_dialog_negative),
mNegativeButton.getText());
assertFalse(mActivity.isPositiveButtonClicked);
@@ -112,17 +112,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.stub.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.stub.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.stub.R.string.alert_dialog_neutral),
mNeutralButton.getText());
DialogStubActivity.buttonIndex = 0;
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..9554438 100644
--- a/tests/tests/app/src/android/app/cts/AlertDialog_BuilderTest.java
+++ b/tests/tests/app/src/android/app/cts/AlertDialog_BuilderTest.java
@@ -127,7 +127,7 @@
}
public AlertDialog_BuilderTest() {
- super("com.android.cts.stub", DialogStubActivity.class);
+ super("com.android.cts.app.stub", DialogStubActivity.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.stub.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.stub.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.stub.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.stub.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.stub.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.stub.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.stub.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.stub.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.stub.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.stub.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.stub.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.stub.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.stub.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.stub.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.stub.R.array.difficultyLevel, mOnClickListener);
mDialog = mBuilder.show();
mListView = mDialog.getListView();
mListView.pointToPosition(0, 0);
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/tests/app/src/android/app/cts/DialogTest.java b/tests/tests/app/src/android/app/cts/DialogTest.java
index f0d00ba..56e731b 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.stub.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;
@@ -52,7 +53,7 @@
public class DialogTest extends ActivityInstrumentationTestCase2<DialogStubActivity> {
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.stub";
private static final long TEST_TIMEOUT = 1000L;
/**
@@ -86,7 +87,8 @@
mActivity = DialogStubActivity.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,
@@ -151,7 +153,7 @@
assertTrue(d.isOnStopCalled);
}
- public void testAccessOwnerActivity() {
+ public void testAccessOwnerActivity() throws Throwable {
startDialogActivity(DialogStubActivity.TEST_DIALOG_WITHOUT_THEME);
Dialog d = mActivity.getDialog();
assertNotNull(d);
@@ -166,8 +168,13 @@
// 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 {
diff --git a/tests/tests/app/src/android/app/cts/InstrumentationTest.java b/tests/tests/app/src/android/app/cts/InstrumentationTest.java
index 16a4ee1..0c2e9fa 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.stub.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/tests/app/src/android/app/cts/KeyguardManagerTest.java b/tests/tests/app/src/android/app/cts/KeyguardManagerTest.java
index 13264ac..cb7cd4a 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.stub", KeyguardManagerActivity.class);
}
public void testNewKeyguardLock() {
diff --git a/tests/tests/app/src/android/app/cts/LauncherActivityTest.java b/tests/tests/app/src/android/app/cts/LauncherActivityTest.java
index a7e0481..3eea0b7 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.stub", 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..2fdc8ec 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.stub.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.stub";
private LauncherActivityStub mActivity;
public LauncherActivity_IconResizerTest() {
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/tests/app/src/android/app/cts/NotificationManagerTest.java b/tests/tests/app/src/android/app/cts/NotificationManagerTest.java
index 4add582..9a895ea 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.stub.R;
public class NotificationManagerTest extends AndroidTestCase {
diff --git a/tests/tests/app/src/android/app/cts/ProgressDialogTest.java b/tests/tests/app/src/android/app/cts/ProgressDialogTest.java
index 1d08d30..038b57b 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.stub", 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.stub.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.stub.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/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..9c028a1 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.stub";
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/tests/app/src/android/app/cts/TimePickerDialogTest.java b/tests/tests/app/src/android/app/cts/TimePickerDialogTest.java
index e03003b..79a91a1 100644
--- a/tests/tests/app/src/android/app/cts/TimePickerDialogTest.java
+++ b/tests/tests/app/src/android/app/cts/TimePickerDialogTest.java
@@ -22,6 +22,7 @@
import android.content.Context;
import android.os.Bundle;
import android.test.ActivityInstrumentationTestCase2;
+import android.test.UiThreadTest;
import android.widget.TimePicker;
/**
@@ -42,10 +43,9 @@
private Context mContext;
private DialogStubActivity mActivity;
- private TimePickerDialog mTimePickerDialog;
public TimePickerDialogTest() {
- super("com.android.cts.stub", DialogStubActivity.class);
+ super("com.android.cts.app.stub", DialogStubActivity.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.stub.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);
@@ -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));
@@ -136,4 +142,9 @@
private void startDialogActivity(int dialogNumber) {
mActivity = DialogStubActivity.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/FeatureTest.java b/tests/tests/content/src/android/content/pm/cts/FeatureTest.java
new file mode 100644
index 0000000..19bf128
--- /dev/null
+++ b/tests/tests/content/src/android/content/pm/cts/FeatureTest.java
@@ -0,0 +1,53 @@
+/**
+ * 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.content.pm.cts;
+
+import android.app.ActivityManager;
+import android.content.Context;
+import android.content.pm.FeatureGroupInfo;
+import android.content.pm.FeatureInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.test.AndroidTestCase;
+import android.util.Log;
+
+import java.util.Arrays;
+import java.util.Comparator;
+
+public class FeatureTest extends AndroidTestCase {
+
+ private static final String TAG = "FeatureTest";
+
+ private PackageManager mPackageManager;
+ private ActivityManager mActivityManager;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ mPackageManager = getContext().getPackageManager();
+ mActivityManager = (ActivityManager)getContext().getSystemService(Context.ACTIVITY_SERVICE);
+ }
+
+ public void testNoManagedUsersIfLowRamDevice() {
+ if (mPackageManager == null || mActivityManager == null) {
+ Log.w(TAG, "Skipping testNoManagedUsersIfLowRamDevice");
+ return;
+ }
+ if (mActivityManager.isLowRamDevice()) {
+ assertFalse(mPackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS));
+ }
+ }
+}
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/anim/animation_grouping_1_01.xml b/tests/tests/graphics/res/anim/animation_grouping_1_01.xml
new file mode 100644
index 0000000..8cc9f92
--- /dev/null
+++ b/tests/tests/graphics/res/anim/animation_grouping_1_01.xml
@@ -0,0 +1,26 @@
+<?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.
+-->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android" >
+
+ <objectAnimator
+ android:duration="3300"
+ android:propertyName="rotation"
+ android:valueFrom="0"
+ android:valueTo="180"
+ android:repeatCount="-1" />
+</set>
\ No newline at end of file
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/animation_vector_drawable_grouping_1.xml b/tests/tests/graphics/res/drawable/animation_vector_drawable_grouping_1.xml
new file mode 100644
index 0000000..4a7e4f6
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/animation_vector_drawable_grouping_1.xml
@@ -0,0 +1,26 @@
+<!--
+ 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.
+-->
+<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:drawable="@drawable/vector_drawable_grouping_1" >
+
+ <target
+ android:name="sun"
+ android:animation="@anim/animation_grouping_1_01" />
+ <target
+ android:name="earth"
+ android:animation="@anim/animation_grouping_1_01" />
+
+</animated-vector>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/drawable/vector_drawable_grouping_1.xml b/tests/tests/graphics/res/drawable/vector_drawable_grouping_1.xml
new file mode 100644
index 0000000..7839ad1
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/vector_drawable_grouping_1.xml
@@ -0,0 +1,52 @@
+<!--
+ 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:height="64dp"
+ android:width="64dp"
+ android:viewportHeight="256"
+ android:viewportWidth="256" >
+
+ <group
+ android:name="shape_layer_1"
+ android:translateX="128"
+ android:translateY="128" >
+ <group android:name="sun" >
+ <path
+ android:name="ellipse_path_1"
+ android:fillColor="#ffff8000"
+ android:pathData="m -25 0 a 25,25 0 1,0 50,0 a 25,25 0 1,0 -50,0" />
+
+ <group
+ android:name="earth"
+ android:translateX="75" >
+ <path
+ android:name="ellipse_path_1_1"
+ android:fillColor="#ff5656ea"
+ android:pathData="m -10 0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0" />
+
+ <group
+ android:name="moon"
+ android:translateX="25" >
+ <path
+ android:name="ellipse_path_1_2"
+ android:fillColor="#ffadadad"
+ android:pathData="m -5 0 a 5,5 0 1,0 10,0 a 5,5 0 1,0 -10,0" />
+ </group>
+ </group>
+ </group>
+ </group>
+
+</vector>
\ No newline at end of file
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/AnimatedVectorDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/AnimatedVectorDrawableTest.java
new file mode 100644
index 0000000..b4c64e2
--- /dev/null
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/AnimatedVectorDrawableTest.java
@@ -0,0 +1,186 @@
+/*
+ * 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.graphics.drawable.cts;
+
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.drawable.AnimatedVectorDrawable;
+import android.graphics.drawable.Drawable.ConstantState;
+import android.test.AndroidTestCase;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.util.Xml;
+
+import com.android.cts.graphics.R;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+public class AnimatedVectorDrawableTest extends AndroidTestCase {
+ private static final String LOGTAG = AnimatedVectorDrawableTest.class.getSimpleName();
+
+ private static final int IMAGE_WIDTH = 64;
+ private static final int IMAGE_HEIGHT = 64;
+
+ private Resources mResources;
+ private AnimatedVectorDrawable mAnimatedVectorDrawable;
+ private Bitmap mBitmap;
+ private Canvas mCanvas;
+ private static final boolean DBG_DUMP_PNG = false;
+ private int mResId = R.drawable.animation_vector_drawable_grouping_1;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ mBitmap = Bitmap.createBitmap(IMAGE_WIDTH, IMAGE_HEIGHT, Bitmap.Config.ARGB_8888);
+ mCanvas = new Canvas(mBitmap);
+ mAnimatedVectorDrawable = new AnimatedVectorDrawable();
+
+ mResources = mContext.getResources();
+ }
+
+ // This is only for debugging or golden image (re)generation purpose.
+ private void saveVectorDrawableIntoPNG(Bitmap bitmap, int resId) throws IOException {
+ // Save the image to the disk.
+ FileOutputStream out = null;
+ try {
+ String outputFolder = "/sdcard/temp/";
+ File folder = new File(outputFolder);
+ if (!folder.exists()) {
+ folder.mkdir();
+ }
+ String originalFilePath = mResources.getString(resId);
+ File originalFile = new File(originalFilePath);
+ String fileFullName = originalFile.getName();
+ String fileTitle = fileFullName.substring(0, fileFullName.lastIndexOf("."));
+ String outputFilename = outputFolder + fileTitle + "_golden.png";
+ File outputFile = new File(outputFilename);
+ if (!outputFile.exists()) {
+ outputFile.createNewFile();
+ }
+
+ out = new FileOutputStream(outputFile, false);
+ bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
+ Log.v(LOGTAG, "Write test No." + outputFilename + " to file successfully.");
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ if (out != null) {
+ out.close();
+ }
+ }
+ }
+
+ public void testInflate() throws Exception {
+ // Setup AnimatedVectorDrawable from xml file
+ XmlPullParser parser = mResources.getXml(mResId);
+ AttributeSet attrs = Xml.asAttributeSet(parser);
+
+ int type;
+ while ((type=parser.next()) != XmlPullParser.START_TAG &&
+ type != XmlPullParser.END_DOCUMENT) {
+ // Empty loop
+ }
+
+ if (type != XmlPullParser.START_TAG) {
+ throw new XmlPullParserException("No start tag found");
+ }
+
+ mAnimatedVectorDrawable.inflate(mResources, parser, attrs);
+ mAnimatedVectorDrawable.setBounds(0, 0, IMAGE_WIDTH, IMAGE_HEIGHT);
+ mBitmap.eraseColor(0);
+ mAnimatedVectorDrawable.draw(mCanvas);
+ int sunColor = mBitmap.getPixel(IMAGE_WIDTH / 2, IMAGE_HEIGHT / 2);
+ int earthColor = mBitmap.getPixel(IMAGE_WIDTH * 3 / 4 + 2, IMAGE_HEIGHT / 2);
+ assertTrue(sunColor == 0xFFFF8000);
+ assertTrue(earthColor == 0xFF5656EA);
+
+ if (DBG_DUMP_PNG) {
+ saveVectorDrawableIntoPNG(mBitmap, mResId);
+ }
+ }
+
+ public void testGetChangingConfigurations() {
+ AnimatedVectorDrawable avd = new AnimatedVectorDrawable();
+ ConstantState constantState = avd.getConstantState();
+
+ // default
+ assertEquals(0, constantState.getChangingConfigurations());
+ assertEquals(0, avd.getChangingConfigurations());
+
+ // change the drawable's configuration does not affect the state's configuration
+ avd.setChangingConfigurations(0xff);
+ assertEquals(0xff, avd.getChangingConfigurations());
+ assertEquals(0, constantState.getChangingConfigurations());
+
+ // the state's configuration get refreshed
+ constantState = avd.getConstantState();
+ assertEquals(0xff, constantState.getChangingConfigurations());
+
+ // set a new configuration to drawable
+ avd.setChangingConfigurations(0xff00);
+ assertEquals(0xff, constantState.getChangingConfigurations());
+ assertEquals(0xffff, avd.getChangingConfigurations());
+ }
+
+ public void testGetConstantState() {
+ AnimatedVectorDrawable AnimatedVectorDrawable = new AnimatedVectorDrawable();
+ ConstantState constantState = AnimatedVectorDrawable.getConstantState();
+ assertNotNull(constantState);
+ assertEquals(0, constantState.getChangingConfigurations());
+
+ AnimatedVectorDrawable.setChangingConfigurations(1);
+ constantState = AnimatedVectorDrawable.getConstantState();
+ assertNotNull(constantState);
+ assertEquals(1, constantState.getChangingConfigurations());
+ }
+
+ public void testMutate() {
+ Resources resources = mContext.getResources();
+
+ AnimatedVectorDrawable d1 = (AnimatedVectorDrawable) resources.getDrawable(mResId);
+ AnimatedVectorDrawable d2 = (AnimatedVectorDrawable) resources.getDrawable(mResId);
+ AnimatedVectorDrawable d3 = (AnimatedVectorDrawable) resources.getDrawable(mResId);
+ int originalAlpha = d2.getAlpha();
+ int newAlpha = (originalAlpha + 1) % 255;
+
+ // AVD is different than VectorDrawable. Every instance of it is a deep copy
+ // of the VectorDrawable.
+ // So every setAlpha operation will happen only to that specific object.
+ d1.setAlpha(newAlpha);
+ assertEquals(newAlpha, d1.getAlpha());
+ assertEquals(originalAlpha, d2.getAlpha());
+ assertEquals(originalAlpha, d3.getAlpha());
+
+ d1.mutate();
+ d1.setAlpha(0x40);
+ assertEquals(0x40, d1.getAlpha());
+ assertEquals(originalAlpha, d2.getAlpha());
+ assertEquals(originalAlpha, d3.getAlpha());
+
+ d2.setAlpha(0x20);
+ assertEquals(0x40, d1.getAlpha());
+ assertEquals(0x20, d2.getAlpha());
+ assertEquals(originalAlpha, d3.getAlpha());
+ }
+}
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 3a7df4c..d4a0e73 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/PerformanceTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/PerformanceTest.java
@@ -211,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);
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..fd2c2b9 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/RecordingTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/RecordingTest.java
@@ -78,7 +78,7 @@
private static final int MAX_VIDEO_SNAPSHOT_IMAGES = 5;
private static final int BURST_VIDEO_SNAPSHOT_NUM = 3;
private static final int SLOWMO_SLOW_FACTOR = 4;
-
+ private static final int MAX_NUM_FRAME_DROP_ALLOWED = 3;
private List<Size> mSupportedVideoSizes;
private Surface mRecordingSurface;
private MediaRecorder mMediaRecorder;
@@ -546,12 +546,26 @@
CamcorderProfile profile = CamcorderProfile.get(cameraId, profileId);
Size videoSz = new Size(profile.videoFrameWidth, profile.videoFrameHeight);
- assertTrue("Video size " + videoSz.toString() + " for profile ID " + profileId +
- " must be one of the camera device supported video size!",
- mSupportedVideoSizes.contains(videoSz));
+ if (!mSupportedVideoSizes.contains(videoSz)) {
+ mCollector.addMessage("Video size " + videoSz.toString() + " for profile ID " +
+ profileId + " must be one of the camera device supported video size!");
+ continue;
+ }
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()) {
+ videoSnapshotSz = candidateSize;
+ }
+ }
+
/**
* Only test full res snapshot when below conditions are all true.
* 1. Camera is a FULL device
@@ -584,7 +598,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);
@@ -866,8 +881,18 @@
mVideoSize.getWidth(), mVideoSize.getHeight(),
durationMs, expectedDurationMs
),
- durationMs < (expectedDurationMs * 2)
+ durationMs <= (expectedDurationMs * MAX_NUM_FRAME_DROP_ALLOWED)
);
+ // Log a warning is there is any frame drop detected.
+ if (durationMs >= expectedDurationMs * 2) {
+ Log.w(TAG, String.format(
+ "Video %dx%d Frame drop detected before video snapshot: " +
+ "duration %dms (expected %dms)",
+ mVideoSize.getWidth(), mVideoSize.getHeight(),
+ durationMs, expectedDurationMs
+ ));
+ }
+
durationMs = (int) (nextTS - currentTS) / 1000000;
mCollector.expectTrue(
String.format(
@@ -876,8 +901,17 @@
mVideoSize.getWidth(), mVideoSize.getHeight(),
durationMs, expectedDurationMs
),
- durationMs < (expectedDurationMs * 2)
+ durationMs <= (expectedDurationMs * MAX_NUM_FRAME_DROP_ALLOWED)
);
+ // Log a warning is there is any frame drop detected.
+ if (durationMs >= expectedDurationMs * 2) {
+ Log.w(TAG, String.format(
+ "Video %dx%d Frame drop detected after video snapshot: " +
+ "duration %dms (expected %dms)",
+ mVideoSize.getWidth(), mVideoSize.getHeight(),
+ durationMs, expectedDurationMs
+ ));
+ }
}
return;
}
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..8dd35f6 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/StillCaptureTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/StillCaptureTest.java
@@ -572,8 +572,11 @@
if (canSetAfRegion) {
MeteringRectangle[] resultAfRegions =
getValueNotNull(result, CaptureResult.CONTROL_AF_REGIONS);
- mCollector.expectEquals("AF regions in result and request should be same",
- afRegions, resultAfRegions);
+ mCollector.expectMeteringRegionsAreSimilar(
+ "AF regions in result and request should be similar",
+ afRegions,
+ resultAfRegions,
+ METERING_REGION_ERROR_PERCENT_DELTA);
}
if (hasFocuser) {
@@ -680,8 +683,6 @@
dumpFile(rawFileName, rawBuffer);
}
- verifyRawCaptureResult(rawRequest, resultListener.getCaptureResultForRequest(rawRequest,
- NUM_RESULTS_WAIT_TIMEOUT));
stopPreview();
}
@@ -995,8 +996,10 @@
EXIF_TEST_DATA[i].thumbnailQuality,
stillResult.get(CaptureResult.JPEG_THUMBNAIL_QUALITY));
- // Validate other exif tags.
- jpegTestExifExtraTags(exif, maxStillSz, stillResult);
+ // Validate other exif tags for all non-legacy devices
+ if (!mStaticInfo.isHardwareLevelLegacy()) {
+ jpegTestExifExtraTags(exif, maxStillSz, stillResult);
+ }
}
}
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/CameraTest.java b/tests/tests/hardware/src/android/hardware/cts/CameraTest.java
index ad16036..3476895 100644
--- a/tests/tests/hardware/src/android/hardware/cts/CameraTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/CameraTest.java
@@ -905,7 +905,6 @@
exif = new ExifInterface(JPEG_PATH);
checkGpsDataNull(exif);
assertBitmapAndJpegSizeEqual(mJpegData, exif);
- assertTrue(failedCause.toString(), extraExiftestPassed);
// Reset the rotation to prevent from affecting other tests.
parameters.setRotation(0);
mCamera.setParameters(parameters);
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/ActivityResultMultiplexedLatch.java b/tests/tests/hardware/src/android/hardware/cts/helpers/ActivityResultMultiplexedLatch.java
new file mode 100644
index 0000000..bfc59c4
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/ActivityResultMultiplexedLatch.java
@@ -0,0 +1,128 @@
+/*
+ * 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.app.Activity;
+import android.util.Log;
+
+import java.util.HashMap;
+import java.util.concurrent.CountDownLatch;
+
+/**
+ * An abstraction on top of {@link CountDownLatch} to synchronize the results of Activities
+ * started by a parent activity.
+ *
+ * It holds a {@link CountDownLatch} latch for each thread that requests synchronization.
+ *
+ * Each thread requests a {@link Latch} to synchronize an Activity that will be started, by invoking
+ * {@link #bindThread()}, this guarantees that a latch is associated with the thread, and the result
+ * can be retrieved.
+ */
+public class ActivityResultMultiplexedLatch {
+ private static final String TAG = "ActivityResultMultiplexedLatch";
+
+ private final HashMap<Integer, Entry> mActivityEntries = new HashMap<Integer, Entry>();
+
+ /**
+ * A latch for a bound thread.
+ * Applications get an instance by invoking {@link ActivityResultMultiplexedLatch#bindThread()}.
+ */
+ public class Latch {
+ private Entry mEntry;
+
+ private Latch(Entry entry) {
+ mEntry = entry;
+ }
+
+ /**
+ * Awaits for the Activity bound to unblock the current thread.
+ *
+ * @return The result code of the Activity executed.
+ */
+ public int await() {
+ try {
+ mEntry.latch.await();
+ } catch (InterruptedException e) {
+ Log.e(TAG, "Error waiting for Activity result.", e);
+ return Activity.RESULT_CANCELED;
+ }
+ return mEntry.resultCode;
+ }
+
+ /**
+ * @return A request code for the bound thread. It can be passed to the Activity to start.
+ */
+ public int getRequestCode() {
+ return mEntry.requestCode;
+ }
+ }
+
+ /**
+ * A class that represents the state for each thread/Activity being tracked.
+ */
+ private class Entry {
+ public final CountDownLatch latch = new CountDownLatch(1);
+ public final int requestCode;
+
+ public volatile int resultCode;
+
+ public Entry(int requestCode) {
+ this.requestCode = requestCode;
+ }
+ }
+
+ /**
+ * Binds a thread with this object.
+ *
+ * @return A request code (or session Id) for the bound thread.
+ */
+ public Latch bindThread() {
+ Entry entry;
+ int requestCode = getRequestCode();
+
+ synchronized (mActivityEntries) {
+ if (mActivityEntries.containsKey(requestCode)) {
+ throw new IllegalStateException("The thread has already been bound.");
+ }
+ entry = new Entry(requestCode);
+ mActivityEntries.put(requestCode, entry);
+ }
+
+ return new Latch(entry);
+ }
+
+ /**
+ * Used by the owner of the instance to record an Activity's result.
+ */
+ public void onActivityResult(int requestCode, int resultCode) {
+ Entry entry;
+ synchronized (mActivityEntries) {
+ entry = mActivityEntries.remove(requestCode);
+ }
+ if (entry == null) {
+ return;
+ }
+
+ entry.resultCode = resultCode;
+ entry.latch.countDown();
+ }
+
+ // there is no need for a better request Id, only one Activity can be launched at any time
+ private int getRequestCode() {
+ return Thread.currentThread().hashCode();
+ }
+}
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..c45d640
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorEnvironment.java
@@ -0,0 +1,267 @@
+/*
+ * 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 The maximum latency of a given sensor, on top of {@link #getMaxReportLatencyUs()}.
+ *
+ * NOTE: The latency is defined as the time between the event happens and the time the event is
+ * generated.
+ *
+ * - At time event_time (reported in the sensor event), the physical event happens
+ * - At time event_time + detection_latency, the physical event is detected and the event is
+ * saved in the hardware fifo
+ * - At time event_time + detection_latency + report_latency, the event is reported through the
+ * HAL
+ *
+ * Soon after that, the event is piped through the framework to the application. This time may
+ * vary depending on the CPU load. The time 'detection_latency' must be less than
+ * {@link #getSensorMaxDetectionLatencyNs(Sensor)}, and 'report_latency' must be less than
+ * {@link #getMaxReportLatencyUs()} passed through batch() at the HAL level.
+ */
+ // TODO: when all tests are moved to use the Sensor test framework, make this method non-static
+ public static long getSensorMaxDetectionLatencyNs(Sensor sensor) {
+ int reportLatencySec;
+ switch (sensor.getType()) {
+ case Sensor.TYPE_STEP_DETECTOR:
+ reportLatencySec = 2;
+ break;
+ case Sensor.TYPE_STEP_COUNTER:
+ reportLatencySec = 10;
+ break;
+ case Sensor.TYPE_SIGNIFICANT_MOTION:
+ reportLatencySec = 10;
+ break;
+ default:
+ reportLatencySec = 0;
+ }
+ return TimeUnit.SECONDS.toNanos(reportLatencySec);
+ }
+
+ /**
+ * 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/AudioEffectTest.java b/tests/tests/media/src/android/media/cts/AudioEffectTest.java
index 27189a1..7ff78d8 100644
--- a/tests/tests/media/src/android/media/cts/AudioEffectTest.java
+++ b/tests/tests/media/src/android/media/cts/AudioEffectTest.java
@@ -169,42 +169,11 @@
}
}
- //Test case 1.1: test constructor from effect uuid
- public void test1_1ConstructorFromUuid() throws Exception {
- AudioEffect.Descriptor[] desc = AudioEffect.queryEffects();
- assertTrue("no effects found", (desc.length != 0));
- for (int i = 0; i < desc.length; i++) {
- try {
- int sessionId;
- AudioRecord ar = null;
- if (AudioEffect.EFFECT_PRE_PROCESSING.equals(desc[i].connectMode)) {
- ar = getAudioRecord();
- sessionId = ar.getAudioSessionId();
- } else {
- sessionId = 0;
- }
- AudioEffect effect = new AudioEffect(AudioEffect.EFFECT_TYPE_NULL,
- desc[i].uuid,
- 0,
- sessionId);
- assertNotNull("could not create AudioEffect", effect);
- try {
- assertTrue("invalid effect ID", (effect.getId() != 0));
- } catch (IllegalStateException e) {
- fail("AudioEffect not initialized");
- } finally {
- effect.release();
- if (ar != null) {
- ar.release();
- }
- }
- } catch (IllegalArgumentException e) {
- fail("Effect not found: "+desc[i].name);
- } catch (UnsupportedOperationException e) {
- fail("Effect library not loaded");
- }
- }
- }
+// //Test case 1.1: test constructor from effect uuid
+// public void test1_1ConstructorFromUuid() ...
+// Note: This test was removed because:
+// 1. will fail in devices that offload effects
+// 2. it used hidden api's.
//Test case 1.2: test constructor failure from unknown type
public void test1_2ConstructorUnknownType() throws Exception {
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/DecodeEditEncodeTest.java b/tests/tests/media/src/android/media/cts/DecodeEditEncodeTest.java
index bb430e3..9ee3118 100644
--- a/tests/tests/media/src/android/media/cts/DecodeEditEncodeTest.java
+++ b/tests/tests/media/src/android/media/cts/DecodeEditEncodeTest.java
@@ -190,17 +190,17 @@
InputSurface inputSurface = null;
try {
- MediaCodecInfo codecInfo = selectCodec(MIME_TYPE);
- if (codecInfo == null) {
+ // We avoid the device-specific limitations on width and height by using values that
+ // are multiples of 16, which all tested devices seem to be able to handle.
+ MediaFormat format = MediaFormat.createVideoFormat(MIME_TYPE, mWidth, mHeight);
+
+ String codecName = selectCodec(format);
+ if (codecName == null) {
// Don't fail CTS if they don't have an AVC codec (not here, anyway).
Log.e(TAG, "Unable to find an appropriate codec for " + MIME_TYPE);
return false;
}
- if (VERBOSE) Log.d(TAG, "found codec: " + codecInfo.getName());
-
- // We avoid the device-specific limitations on width and height by using values that
- // are multiples of 16, which all tested devices seem to be able to handle.
- MediaFormat format = MediaFormat.createVideoFormat(MIME_TYPE, mWidth, mHeight);
+ if (VERBOSE) Log.d(TAG, "found codec: " + codecName);
// Set some properties. Failing to specify some of these can cause the MediaCodec
// configure() call to throw an unhelpful exception.
@@ -214,7 +214,7 @@
// Create a MediaCodec for the desired codec, then configure it as an encoder with
// our desired properties.
- encoder = MediaCodec.createByCodecName(codecInfo.getName());
+ encoder = MediaCodec.createByCodecName(codecName);
encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
inputSurface = new InputSurface(encoder.createInputSurface());
inputSurface.makeCurrent();
@@ -240,23 +240,9 @@
* Returns the first codec capable of encoding the specified MIME type, or null if no
* match was found.
*/
- private static MediaCodecInfo selectCodec(String mimeType) {
- int numCodecs = MediaCodecList.getCodecCount();
- for (int i = 0; i < numCodecs; i++) {
- MediaCodecInfo codecInfo = MediaCodecList.getCodecInfoAt(i);
-
- if (!codecInfo.isEncoder()) {
- continue;
- }
-
- String[] types = codecInfo.getSupportedTypes();
- for (int j = 0; j < types.length; j++) {
- if (types[j].equalsIgnoreCase(mimeType)) {
- return codecInfo;
- }
- }
- }
- return null;
+ private static String selectCodec(MediaFormat format) {
+ MediaCodecList mcl = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
+ return mcl.findEncoderForFormat(format);
}
/**
diff --git a/tests/tests/media/src/android/media/cts/DecoderTest.java b/tests/tests/media/src/android/media/cts/DecoderTest.java
index f418649..ba70f32 100644
--- a/tests/tests/media/src/android/media/cts/DecoderTest.java
+++ b/tests/tests/media/src/android/media/cts/DecoderTest.java
@@ -20,6 +20,8 @@
import android.content.res.AssetFileDescriptor;
import android.content.res.Resources;
+import android.graphics.ImageFormat;
+import android.media.Image;
import android.media.MediaCodec;
import android.media.MediaCodecInfo;
import android.media.MediaExtractor;
@@ -1326,12 +1328,19 @@
if ((checkFlags & (CHECKFLAG_SETCHECKSUM | CHECKFLAG_COMPARECHECKSUM)) != 0) {
long sum = 0; // note: checksum is 0 if buffer format unrecognized
if (dochecksum) {
- // TODO: add stride - right now just use info.size (as before)
- //sum = checksum(codecOutputBuffers[outputBufIndex], width, height,
- // stride);
- ByteBuffer outputBuffer = codecOutputBuffers[outputBufIndex];
- outputBuffer.position(info.offset);
- sum = checksum(outputBuffer, info.size);
+ Image image = codec.getOutputImage(outputBufIndex);
+ // use image to do crc if it's available
+ // fall back to buffer if image is not available
+ if (image != null) {
+ sum = checksum(image);
+ } else {
+ // TODO: add stride - right now just use info.size (as before)
+ //sum = checksum(codecOutputBuffers[outputBufIndex], width, height,
+ // stride);
+ ByteBuffer outputBuffer = codec.getOutputBuffer(outputBufIndex);
+ outputBuffer.position(info.offset);
+ sum = checksum(outputBuffer, info.size);
+ }
}
if ((checkFlags & CHECKFLAG_COMPARECHECKSUM) != 0) {
assertTrue("number of frames (" + numframes
@@ -1506,13 +1515,13 @@
if (true) { // this {} is 80x times faster than else {} below.
byte[] bb = new byte[width]; // local line buffer
for (int i = 0; i < height; i += lineinterval) {
- buf.position(i * stride);
+ buf.position(pos + i * stride);
buf.get(bb, 0, width);
crc.update(bb, 0, width);
}
} else {
for (int i = 0; i < height; i += lineinterval) {
- buf.position(i * stride);
+ buf.position(pos + i * stride);
for (int j = 0; j < width; ++j) {
crc.update(buf.get());
}
@@ -1525,6 +1534,75 @@
return crc.getValue();
}
+ private static long checksum(Image image) {
+ int format = image.getFormat();
+ assertEquals("unsupported image format", ImageFormat.YUV_420_888, format);
+
+ CRC32 crc = new CRC32();
+
+ int imageWidth = image.getWidth();
+ int imageHeight = image.getHeight();
+
+ Image.Plane[] planes = image.getPlanes();
+ for (int i = 0; i < planes.length; ++i) {
+ ByteBuffer buf = planes[i].getBuffer();
+
+ int width, height, rowStride, pixelStride, x, y;
+ rowStride = planes[i].getRowStride();
+ pixelStride = planes[i].getPixelStride();
+ if (i == 0) {
+ width = imageWidth;
+ height = imageHeight;
+ } else {
+ width = imageWidth / 2;
+ height = imageHeight /2;
+ }
+ // local contiguous pixel buffer
+ byte[] bb = new byte[width * height];
+ if (buf.hasArray()) {
+ byte b[] = buf.array();
+ int offs = buf.arrayOffset();
+ if (pixelStride == 1) {
+ for (y = 0; y < height; ++y) {
+ System.arraycopy(bb, y * width, b, y * rowStride + offs, width);
+ }
+ } else {
+ // do it pixel-by-pixel
+ for (y = 0; y < height; ++y) {
+ int lineOffset = offs + y * rowStride;
+ for (x = 0; x < width; ++x) {
+ bb[y * width + x] = b[lineOffset + x * pixelStride];
+ }
+ }
+ }
+ } else { // almost always ends up here due to direct buffers
+ int pos = buf.position();
+ if (pixelStride == 1) {
+ for (y = 0; y < height; ++y) {
+ buf.position(pos + y * rowStride);
+ buf.get(bb, y * width, width);
+ }
+ } else {
+ // local line buffer
+ byte[] lb = new byte[rowStride];
+ // do it pixel-by-pixel
+ for (y = 0; y < height; ++y) {
+ buf.position(pos + y * rowStride);
+ // we're only guaranteed to have pixelStride * (width - 1) + 1 bytes
+ buf.get(lb, 0, pixelStride * (width - 1) + 1);
+ for (x = 0; x < width; ++x) {
+ bb[y * width + x] = lb[x * pixelStride];
+ }
+ }
+ }
+ buf.position(pos);
+ }
+ crc.update(bb, 0, width * height);
+ }
+
+ return crc.getValue();
+ }
+
public void testFlush() throws Exception {
testFlush(R.raw.loudsoftwav);
testFlush(R.raw.loudsoftogg);
diff --git a/tests/tests/media/src/android/media/cts/MediaCodecCapabilitiesTest.java b/tests/tests/media/src/android/media/cts/MediaCodecCapabilitiesTest.java
index a3f1815..08e6212 100644
--- a/tests/tests/media/src/android/media/cts/MediaCodecCapabilitiesTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaCodecCapabilitiesTest.java
@@ -39,7 +39,7 @@
if (!supports(AVC_MIME, CodecProfileLevel.AVCProfileBaseline)) {
return;
}
- if (supports(AVC_MIME, CodecProfileLevel.AVCProfileBaseline,
+ if (!supports(AVC_MIME, CodecProfileLevel.AVCProfileBaseline,
CodecProfileLevel.AVCLevel1)) {
throw new RuntimeException("AVCLevel1 support is required by CDD");
}
@@ -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..2815d81 100644
--- a/tests/tests/media/src/android/media/cts/MediaPlayerTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaPlayerTest.java
@@ -46,6 +46,8 @@
import java.util.Vector;
import java.util.concurrent.CountDownLatch;
+import junit.framework.AssertionFailedError;
+
/**
* Tests for the MediaPlayer API and local video/audio playback.
*
@@ -237,6 +239,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);
}
@@ -914,9 +1008,18 @@
}
}
- public void testDeselectTrack() throws Exception {
+ public void testDeselectTrack() throws Throwable {
loadResource(R.raw.testvideo_with_2_subtitles);
- loadSubtitleSource(R.raw.test_subtitle1_srt);
+ runTestOnUiThread(new Runnable() {
+ public void run() {
+ try {
+ loadSubtitleSource(R.raw.test_subtitle1_srt);
+ } catch (Exception e) {
+ throw new AssertionFailedError(e.getMessage());
+ }
+ }
+ });
+ getInstrumentation().waitForIdleSync();
mMediaPlayer.setDisplay(getActivity().getSurfaceHolder());
mMediaPlayer.setScreenOnWhilePlaying(true);
@@ -945,24 +1048,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 {
@@ -976,7 +1079,7 @@
mMediaPlayer.stop();
}
- public void testChangeSubtitleTrack() throws Exception {
+ public void testChangeSubtitleTrack() throws Throwable {
loadResource(R.raw.testvideo_with_2_subtitles);
mMediaPlayer.setDisplay(getActivity().getSurfaceHolder());
@@ -985,7 +1088,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) {
@@ -1012,13 +1115,31 @@
mMediaPlayer.prepare();
assertFalse(mMediaPlayer.isPlaying());
- readTimedTextTracks();
+ runTestOnUiThread(new Runnable() {
+ public void run() {
+ try {
+ readTimedTextTracks();
+ } catch (Exception e) {
+ throw new AssertionFailedError(e.getMessage());
+ }
+ }
+ });
+ getInstrumentation().waitForIdleSync();
assertEquals(getTimedTextTrackCount(), 2);
- // Adds two more external subtitle files.
- loadSubtitleSource(R.raw.test_subtitle1_srt);
- loadSubtitleSource(R.raw.test_subtitle2_srt);
- readTimedTextTracks();
+ runTestOnUiThread(new Runnable() {
+ public void run() {
+ try {
+ // Adds two more external subtitle files.
+ loadSubtitleSource(R.raw.test_subtitle1_srt);
+ loadSubtitleSource(R.raw.test_subtitle2_srt);
+ readTimedTextTracks();
+ } catch (Exception e) {
+ throw new AssertionFailedError(e.getMessage());
+ }
+ }
+ });
+ getInstrumentation().waitForIdleSync();
assertEquals(getTimedTextTrackCount(), 4);
selectSubtitleTrack(0);
@@ -1030,26 +1151,35 @@
// 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();
}
- public void testGetTrackInfo() throws Exception {
+ public void testGetTrackInfo() throws Throwable {
loadResource(R.raw.testvideo_with_2_subtitles);
- loadSubtitleSource(R.raw.test_subtitle1_srt);
- loadSubtitleSource(R.raw.test_subtitle2_srt);
+ runTestOnUiThread(new Runnable() {
+ public void run() {
+ try {
+ loadSubtitleSource(R.raw.test_subtitle1_srt);
+ loadSubtitleSource(R.raw.test_subtitle2_srt);
+ } catch (Exception e) {
+ throw new AssertionFailedError(e.getMessage());
+ }
+ }
+ });
+ getInstrumentation().waitForIdleSync();
mMediaPlayer.prepare();
mMediaPlayer.start();
diff --git a/tests/tests/media/src/android/media/cts/MediaSessionTest.java b/tests/tests/media/src/android/media/cts/MediaSessionTest.java
index 7409ff5..df68392 100644
--- a/tests/tests/media/src/android/media/cts/MediaSessionTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaSessionTest.java
@@ -20,6 +20,7 @@
import android.content.Intent;
import android.media.AudioAttributes;
import android.media.AudioManager;
+import android.media.MediaDescription;
import android.media.MediaMetadata;
import android.media.Rating;
import android.media.VolumeProvider;
@@ -30,6 +31,7 @@
import android.os.Bundle;
import android.test.AndroidTestCase;
+import java.util.ArrayList;
import java.util.Set;
public class MediaSessionTest extends AndroidTestCase {
@@ -121,7 +123,24 @@
assertNotNull(tags);
assertTrue(tags.contains(val));
- // TODO test Queue APIs after fixing b/17205016
+ // test setQueue and setQueueTitle
+ ArrayList<MediaSession.QueueItem> queue = new ArrayList<MediaSession.QueueItem>();
+ MediaSession.QueueItem item = new MediaSession.QueueItem(new MediaDescription.Builder()
+ .setMediaId(val).setTitle("title").build(), 11);
+ queue.add(item);
+ session.setQueue(queue);
+ session.setQueueTitle(val);
+
+ assertEquals(val, controller.getQueueTitle());
+ assertEquals(1, controller.getQueue().size());
+ assertEquals(11, controller.getQueue().get(0).getQueueId());
+ assertEquals(val, controller.getQueue().get(0).getDescription().getMediaId());
+
+ session.setQueue(null);
+ session.setQueueTitle(null);
+
+ assertNull(controller.getQueueTitle());
+ assertNull(controller.getQueue());
// test setSessionActivity
Intent intent = new Intent("cts.MEDIA_SESSION_ACTION");
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..7d2d4ff 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;
@@ -29,8 +29,12 @@
import android.test.ComparisonFailure;
import android.util.Log;
+import libcore.io.Streams;
+
import java.io.File;
+import java.io.FileInputStream;
import java.io.InputStream;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -43,6 +47,7 @@
private static final long WAIT_TIME_INCR = 5*1000;
private static final String OBB_MOUNT_PREFIX = "/mnt/obb/";
+ private static final String TEST1_CONTENTS = "1\n";
private StorageManager mStorageManager;
@@ -52,7 +57,7 @@
mStorageManager = (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE);
}
- public void testMountAndUnmountObbNormal() {
+ public void testMountAndUnmountObbNormal() throws IOException {
for (File target : getTargetFiles()) {
target = new File(target, "test1.obb");
Log.d(TAG, "Testing path " + target);
@@ -60,17 +65,22 @@
}
}
- private void doMountAndUnmountObbNormal(File outFile) {
+ private void doMountAndUnmountObbNormal(File outFile) throws IOException {
final String canonPath = mountObb(R.raw.test1, outFile, OnObbStateChangeListener.MOUNTED);
mountObb(R.raw.test1, outFile, OnObbStateChangeListener.ERROR_ALREADY_MOUNTED);
- final String mountPath = checkMountedPath(canonPath);
- final File mountDir = new File(mountPath);
+ try {
+ final String mountPath = checkMountedPath(canonPath);
+ final File mountDir = new File(mountPath);
+ final File testFile = new File(mountDir, "test1.txt");
- assertTrue("OBB mounted path should be a directory", mountDir.isDirectory());
-
- unmountObb(outFile, OnObbStateChangeListener.UNMOUNTED);
+ assertTrue("OBB mounted path should be a directory", mountDir.isDirectory());
+ assertTrue("test1.txt does not exist in OBB dir", testFile.exists());
+ assertFileContains(testFile, TEST1_CONTENTS);
+ } finally {
+ unmountObb(outFile, OnObbStateChangeListener.UNMOUNTED);
+ }
}
public void testAttemptMountNonObb() {
@@ -110,7 +120,7 @@
mStorageManager.getMountedObbPath(outFile.getPath()));
}
- public void testMountAndUnmountTwoObbs() {
+ public void testMountAndUnmountTwoObbs() throws IOException {
for (File target : getTargetFiles()) {
Log.d(TAG, "Testing target " + target);
final File test1 = new File(target, "test1.obb");
@@ -119,7 +129,7 @@
}
}
- private void doMountAndUnmountTwoObbs(File file1, File file2) {
+ private void doMountAndUnmountTwoObbs(File file1, File file2) throws IOException {
ObbObserver oo1 = mountObbWithoutWait(R.raw.test1, file1);
ObbObserver oo2 = mountObbWithoutWait(R.raw.test1, file2);
@@ -128,16 +138,24 @@
Log.d(TAG, "Waiting for OBB #2 to complete mount");
waitForObbActionCompletion(file2, oo2, OnObbStateChangeListener.MOUNTED);
- final String mountPath1 = checkMountedPath(oo1.getPath());
- final File mountDir1 = new File(mountPath1);
- assertTrue("OBB mounted path should be a directory", mountDir1.isDirectory());
+ try {
+ final String mountPath1 = checkMountedPath(oo1.getPath());
+ final File mountDir1 = new File(mountPath1);
+ final File testFile1 = new File(mountDir1, "test1.txt");
+ assertTrue("OBB mounted path should be a directory", mountDir1.isDirectory());
+ assertTrue("test1.txt does not exist in OBB dir", testFile1.exists());
+ assertFileContains(testFile1, TEST1_CONTENTS);
- final String mountPath2 = checkMountedPath(oo2.getPath());
- final File mountDir2 = new File(mountPath2);
- assertTrue("OBB mounted path should be a directory", mountDir2.isDirectory());
-
- unmountObb(file1, OnObbStateChangeListener.UNMOUNTED);
- unmountObb(file2, OnObbStateChangeListener.UNMOUNTED);
+ final String mountPath2 = checkMountedPath(oo2.getPath());
+ final File mountDir2 = new File(mountPath2);
+ final File testFile2 = new File(mountDir2, "test1.txt");
+ assertTrue("OBB mounted path should be a directory", mountDir2.isDirectory());
+ assertTrue("test1.txt does not exist in OBB dir", testFile2.exists());
+ assertFileContains(testFile2, TEST1_CONTENTS);
+ } finally {
+ unmountObb(file1, OnObbStateChangeListener.UNMOUNTED);
+ unmountObb(file2, OnObbStateChangeListener.UNMOUNTED);
+ }
}
private static void assertStartsWith(String message, String prefix, String actual) {
@@ -146,6 +164,15 @@
}
}
+ private static void assertFileContains(File file, String contents) throws IOException {
+ byte[] actual = Streams.readFully(new FileInputStream(file));
+ byte[] expected = contents.getBytes("UTF-8");
+ assertEquals("unexpected size", expected.length, actual.length);
+ for (int i = 0; i < expected.length; i++) {
+ assertEquals("unexpected value at offset " + i, expected[i], actual[i]);
+ }
+ }
+
private static class ObbObserver extends OnObbStateChangeListener {
private String path;
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/ConnectivityManagerPermissionTest.java b/tests/tests/permission/src/android/permission/cts/ConnectivityManagerPermissionTest.java
index d9a61f4..8714100 100644
--- a/tests/tests/permission/src/android/permission/cts/ConnectivityManagerPermissionTest.java
+++ b/tests/tests/permission/src/android/permission/cts/ConnectivityManagerPermissionTest.java
@@ -55,22 +55,6 @@
}
/**
- * Verify that calling {@link ConnectivityManager#getNetworkPreference()}
- * requires permissions.
- * <p>Tests Permission:
- * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
- */
- @SmallTest
- public void testGetNetworkPreference() {
- try {
- mConnectivityManager.getNetworkPreference();
- fail("Was able to call getNetworkPreference");
- } catch (SecurityException e) {
- // expected
- }
- }
-
- /**
* Verify that calling {@link ConnectivityManager#requestRouteToHost(int, int)}
* requires permissions.
* <p>Tests Permission:
@@ -85,37 +69,5 @@
// expected
}
}
-
- /**
- * Verify that calling {@link ConnectivityManager#setNetworkPreference(int)}
- * requires permissions.
- * <p>Tests Permission:
- * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
- */
- @SmallTest
- public void testSetNetworkPreference() {
- try {
- mConnectivityManager.setNetworkPreference(ConnectivityManager.TYPE_MOBILE);
- fail("Was able to call setNetworkPreference");
- } catch (SecurityException e) {
- // expected
- }
- }
-
- /**
- * Verify that calling {@link ConnectivityManager#setNetworkPreference(int)}
- * requires permissions.
- * <p>Tests Permission:
- * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
- */
- @SmallTest
- public void testStartUsingNetworkPreference() {
- try {
- mConnectivityManager.setNetworkPreference(ConnectivityManager.TYPE_MOBILE);
- fail("Was able to call setNetworkPreference");
- } catch (SecurityException e) {
- // expected
- }
- }
}
diff --git a/tests/tests/permission/src/android/permission/cts/NoActivityRelatedPermissionTest.java b/tests/tests/permission/src/android/permission/cts/NoActivityRelatedPermissionTest.java
index 62b3683..91ffdf4 100644
--- a/tests/tests/permission/src/android/permission/cts/NoActivityRelatedPermissionTest.java
+++ b/tests/tests/permission/src/android/permission/cts/NoActivityRelatedPermissionTest.java
@@ -27,6 +27,8 @@
import android.view.WindowManager;
import android.view.WindowManager.BadTokenException;
+import java.util.List;
+
/**
* Verify the Activity related operations require specific permissions.
*/
@@ -54,18 +56,16 @@
public void testGetTask() {
ActivityManager manager = (ActivityManager) getActivity()
.getSystemService(Context.ACTIVITY_SERVICE);
- try {
- manager.getRunningTasks(1);
- fail("Activity.getRunningTasks did not throw SecurityException as expected");
- } catch (SecurityException e) {
- // Expected
- }
+ List<ActivityManager.RunningTaskInfo> runningTasks = manager.getRunningTasks(10);
+ // Current implementation should only return tasks for home and the caller.
+ // We'll be done and task this to mean it shouldn't return more than 2.
+ assertTrue("Found tasks: " + runningTasks,
+ runningTasks == null || runningTasks.size() <= 2);
- try {
- manager.getRecentTasks(1, 0);
- fail("Activity.getRunningTasks did not throw SecurityException as expected");
- } catch (SecurityException e) {
- // Expected
- }
+ List<ActivityManager.RecentTaskInfo> recentTasks = manager.getRecentTasks(10,
+ ActivityManager.RECENT_WITH_EXCLUDED);
+ // Current implementation should only return tasks for home and the caller.
+ // We'll be done and task this to mean it shouldn't return more than 2.
+ assertTrue("Found tasks: " + recentTasks, recentTasks == null || recentTasks.size() <= 2);
}
}
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/NoNetworkStatePermissionTest.java b/tests/tests/permission/src/android/permission/cts/NoNetworkStatePermissionTest.java
index 0f24cf5..0eae9cc 100644
--- a/tests/tests/permission/src/android/permission/cts/NoNetworkStatePermissionTest.java
+++ b/tests/tests/permission/src/android/permission/cts/NoNetworkStatePermissionTest.java
@@ -27,9 +27,8 @@
*/
public class NoNetworkStatePermissionTest extends AndroidTestCase {
private ConnectivityManager mConnectivityManager;
- private static final int TEST_NETWORK_TYPE = 1;
- private static final int TEST_PREFERENCE = 1;
- private static final String TEST_FEATURE = "feature";
+ private static final int TEST_NETWORK_TYPE = ConnectivityManager.TYPE_MOBILE;
+ private static final String TEST_FEATURE = "enableHIPRI";
@Override
protected void setUp() throws Exception {
@@ -40,22 +39,6 @@
}
/**
- * Verify that ConnectivityManager#getNetworkPreference() requires permissions.
- * <p>Requires Permission:
- * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
- */
- @SmallTest
- public void testGetNetworkPreference() {
- try {
- mConnectivityManager.getNetworkPreference();
- fail("ConnectivityManager.getNetworkPreference didn't throw SecurityException as"
- + " expected");
- } catch (SecurityException e) {
- // expected
- }
- }
-
- /**
* Verify that ConnectivityManager#getActiveNetworkInfo() requires permissions.
* <p>Requires Permission:
* {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
@@ -104,22 +87,6 @@
}
/**
- * Verify that ConnectivityManager#setNetworkPreference() requires permissions.
- * <p>Requires Permission:
- * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
- */
- @SmallTest
- public void testSetNetworkPreference() {
- try {
- mConnectivityManager.setNetworkPreference(TEST_PREFERENCE);
- fail("ConnectivityManager.setNetworkPreference didn't throw SecurityException as"
- + " expected");
- } catch (SecurityException e) {
- // expected
- }
- }
-
- /**
* Verify that ConnectivityManager#startUsingNetworkFeature() requires permissions.
* <p>Requires Permission:
* {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
@@ -136,22 +103,6 @@
}
/**
- * Verify that ConnectivityManager#stopUsingNetworkFeature() requires permissions.
- * <p>Requires Permission:
- * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
- */
- @SmallTest
- public void testStopUsingNetworkFeature() {
- try {
- mConnectivityManager.stopUsingNetworkFeature(TEST_NETWORK_TYPE, TEST_FEATURE);
- fail("ConnectivityManager.stopUsingNetworkFeature didn't throw SecurityException as"
- + " expected");
- } catch (SecurityException e) {
- // expected
- }
- }
-
- /**
* Verify that ConnectivityManager#requestRouteToHost() requires permissions.
* <p>Requires Permission:
* {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
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/TestGetSet.java b/tests/tests/renderscript/src/android/renderscript/cts/TestGetSet.java
new file mode 100644
index 0000000..d11de84
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestGetSet.java
@@ -0,0 +1,1084 @@
+ /*
+ * 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.renderscript.cts;
+
+import android.renderscript.*;
+
+public class TestGetSet extends RSBaseCompute {
+
+ private ScriptC_getset script;
+ private ScriptC_getset_relaxed scriptRelaxed;
+ Allocation walkAlloc;
+ Allocation in1DAlloc;
+ Allocation out1DAlloc;
+ Allocation in2DAlloc;
+ Allocation out2DAlloc;
+ Allocation in3DAlloc;
+ Allocation out3DAlloc;
+ private static java.util.Random random = new java.util.Random();
+
+ final int gWidth = 252;
+ final int gHeight = 31;
+ final int gDepth = 4;
+ final int gCount = gWidth * gHeight * gDepth;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ random.setSeed(10);
+ script = new ScriptC_getset(mRS);
+ scriptRelaxed = new ScriptC_getset_relaxed(mRS);
+ script.set_gWidth(gWidth);
+ script.set_gHeight(gHeight);
+ scriptRelaxed.set_gWidth(gWidth);
+ scriptRelaxed.set_gHeight(gHeight);
+ }
+
+
+
+ protected void createWalk(int vsize) {
+ // We do a random copy order to attempt to get multiple threads
+ // reading and writing the same cache line
+ // We could do this as a simple walk but that would likely miss
+ // some caching issues.
+ final int tw = gCount / vsize;
+ int tmp[] = new int[tw];
+ boolean b[] = new boolean[tw];
+ int toCopy = tw;
+ int i = 0;
+
+ while (toCopy > 0) {
+ int x = random.nextInt(tw);
+
+ while ((x < tw) && b[x]) {
+ x++;
+ if (x >= tw) {
+ x = 0;
+ }
+ }
+
+ b[x] = true;
+ toCopy --;
+
+ //android.util.Log.v("rs", "walk " + i + ", " + x);
+ tmp[i++] = x;
+ }
+
+ walkAlloc = Allocation.createSized(mRS, Element.I32(mRS), tw);
+ walkAlloc.copy1DRangeFrom(0, tw, tmp);
+ }
+
+ private void testSetup(Element e) {
+ int vs = e.getVectorSize();
+ if (vs == 3) {
+ vs = 4;
+ }
+ createWalk(vs);
+
+ Type t1 = Type.createX(mRS, e, gWidth * gHeight * gDepth / vs);
+ in1DAlloc = Allocation.createTyped(mRS, t1);
+ out1DAlloc = Allocation.createTyped(mRS, t1);
+ script.set_gAlloc1DIn(in1DAlloc);
+ script.set_gAlloc1DOut(out1DAlloc);
+ scriptRelaxed.set_gAlloc1DIn(in1DAlloc);
+ scriptRelaxed.set_gAlloc1DOut(out1DAlloc);
+
+ Type t2 = Type.createXY(mRS, e, gWidth / vs, gHeight * gDepth);
+ in2DAlloc = Allocation.createTyped(mRS, t2);
+ out2DAlloc = Allocation.createTyped(mRS, t2);
+ script.set_gAlloc2DIn(in2DAlloc);
+ script.set_gAlloc2DOut(out2DAlloc);
+ scriptRelaxed.set_gAlloc2DIn(in2DAlloc);
+ scriptRelaxed.set_gAlloc2DOut(out2DAlloc);
+
+ Type t3 = Type.createXYZ(mRS, e, gWidth / vs, gHeight, gDepth);
+ in3DAlloc = Allocation.createTyped(mRS, t3);
+ out3DAlloc = Allocation.createTyped(mRS, t3);
+ script.set_gAlloc3DIn(in3DAlloc);
+ script.set_gAlloc3DOut(out3DAlloc);
+ scriptRelaxed.set_gAlloc3DIn(in3DAlloc);
+ scriptRelaxed.set_gAlloc3DOut(out3DAlloc);
+ }
+
+ private void verify(byte[] a1, byte[] a2, Allocation alloc, String s, int vsize) {
+ alloc.copyTo(a2);
+ for (int i=0; i < gWidth; i++) {
+ if (a1[i] != a2[i]) {
+ if ((vsize == 3) && ((i % 4) == 3)) {
+ continue;
+ }
+ throw new RSRuntimeException(s + a1[i] + ", " + a2[i] + ", at " + i);
+ }
+ a2[i] = 0;
+ }
+ alloc.copyFrom(a2);
+ }
+
+ private void verify(short[] a1, short[] a2, Allocation alloc, String s, int vsize) {
+ alloc.copyTo(a2);
+ for (int i=0; i < gWidth; i++) {
+ if (a1[i] != a2[i]) {
+ if ((vsize == 3) && ((i % 4) == 3)) {
+ continue;
+ }
+ throw new RSRuntimeException(s + a1[i] + ", " + a2[i] + ", at " + i);
+ }
+ a2[i] = 0;
+ }
+ alloc.copyFrom(a2);
+ }
+
+ private void verify(int[] a1, int[] a2, Allocation alloc, String s, int vsize) {
+ alloc.copyTo(a2);
+ for (int i=0; i < gWidth; i++) {
+ if (a1[i] != a2[i]) {
+ if ((vsize == 3) && ((i % 4) == 3)) {
+ continue;
+ }
+ throw new RSRuntimeException(s + a1[i] + ", " + a2[i] + ", at " + i);
+ }
+ a2[i] = 0;
+ }
+ alloc.copyFrom(a2);
+ }
+
+ private void verify(long[] a1, long[] a2, Allocation alloc, String s, int vsize) {
+ alloc.copyTo(a2);
+ for (int i=0; i < gWidth; i++) {
+ if (a1[i] != a2[i]) {
+ if ((vsize == 3) && ((i % 4) == 3)) {
+ continue;
+ }
+ throw new RSRuntimeException(s + a1[i] + ", " + a2[i] + ", at " + i);
+ }
+ a2[i] = 0;
+ }
+ alloc.copyFrom(a2);
+ }
+
+ private void verify(float[] a1, float[] a2, Allocation alloc, String s, int vsize) {
+ alloc.copyTo(a2);
+ for (int i=0; i < gWidth; i++) {
+ if (a1[i] != a2[i]) {
+ if ((vsize == 3) && ((i % 4) == 3)) {
+ continue;
+ }
+ throw new RSRuntimeException(s + a1[i] + ", " + a2[i] + ", at " + i);
+ }
+ a2[i] = 0;
+ }
+ alloc.copyFrom(a2);
+ }
+
+ private void verify(double[] a1, double[] a2, Allocation alloc, String s, int vsize) {
+ alloc.copyTo(a2);
+ for (int i=0; i < gWidth; i++) {
+ if (a1[i] != a2[i]) {
+ if ((vsize == 3) && ((i % 4) == 3)) {
+ continue;
+ }
+ throw new RSRuntimeException(s + a1[i] + ", " + a2[i] + ", at " + i);
+ }
+ a2[i] = 0;
+ }
+ alloc.copyFrom(a2);
+ }
+
+ private byte[] randomByteArray(int len) {
+ byte t[] = new byte[len];
+ random.nextBytes(t);
+ in1DAlloc.copyFrom(t);
+ in2DAlloc.copyFrom(t);
+ in3DAlloc.copyFrom(t);
+ return t;
+ }
+
+ private short[] randomShortArray(int len) {
+ short t[] = new short[len];
+ for (int i = 0; i < t.length; i++) {
+ t[i] = (short)(random.nextInt() & 0xffff);
+ }
+ in1DAlloc.copyFrom(t);
+ in2DAlloc.copyFrom(t);
+ in3DAlloc.copyFrom(t);
+ return t;
+ }
+
+ private int[] randomIntArray(int len) {
+ int t[] = new int[len];
+ for (int i = 0; i < t.length; i++) {
+ t[i] = random.nextInt();
+ }
+ in1DAlloc.copyFrom(t);
+ in2DAlloc.copyFrom(t);
+ in3DAlloc.copyFrom(t);
+ return t;
+ }
+
+ private long[] randomLongArray(int len) {
+ long t[] = new long[len];
+ for (int i = 0; i < t.length; i++) {
+ t[i] = random.nextLong();
+ }
+ in1DAlloc.copyFrom(t);
+ in2DAlloc.copyFrom(t);
+ in3DAlloc.copyFrom(t);
+ return t;
+ }
+
+ private float[] randomFloatArray(int len) {
+ float t[] = new float[len];
+ for (int i = 0; i < t.length; i++) {
+ t[i] = random.nextFloat();
+ }
+ in1DAlloc.copyFrom(t);
+ in2DAlloc.copyFrom(t);
+ in3DAlloc.copyFrom(t);
+ return t;
+ }
+
+ private double[] randomDoubleArray(int len) {
+ double t[] = new double[len];
+ for (int i = 0; i < t.length; i++) {
+ t[i] = random.nextDouble();
+ }
+ in1DAlloc.copyFrom(t);
+ in2DAlloc.copyFrom(t);
+ in3DAlloc.copyFrom(t);
+ return t;
+ }
+
+ public void testGetSet_char() {
+ testSetup(Element.I8(mRS));
+ byte tmp[] = randomByteArray(gCount);
+ byte tmp2[] = new byte[gCount];
+
+ script.forEach_copy1D_char(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch char: ", 1);
+ scriptRelaxed.forEach_copy1D_char(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed char: ", 1);
+
+ script.forEach_copy2D_char(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch char: ", 1);
+ scriptRelaxed.forEach_copy2D_char(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed char: ", 1);
+
+ script.forEach_copy3D_char(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch char: ", 1);
+ scriptRelaxed.forEach_copy3D_char(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed char: ", 1);
+ }
+
+ public void testGetSet_char2() {
+ testSetup(Element.I8_2(mRS));
+ byte tmp[] = randomByteArray(gCount);
+ byte tmp2[] = new byte[gCount];
+ script.forEach_copy1D_char2(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch char2: ", 2);
+ scriptRelaxed.forEach_copy1D_char2(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed char2: ", 2);
+
+ script.forEach_copy2D_char2(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch char2: ", 2);
+ scriptRelaxed.forEach_copy2D_char2(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed char2: ", 2);
+
+ script.forEach_copy3D_char2(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch char2: ", 2);
+ scriptRelaxed.forEach_copy3D_char2(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed char2: ", 2);
+ }
+
+ public void testGetSet_char3() {
+ testSetup(Element.I8_3(mRS));
+ byte tmp[] = randomByteArray(gCount);
+ byte tmp2[] = new byte[gCount];
+ script.forEach_copy1D_char3(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch char3: ", 3);
+ scriptRelaxed.forEach_copy1D_char3(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed char3: ", 3);
+
+ script.forEach_copy2D_char3(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch char3: ", 3);
+ scriptRelaxed.forEach_copy2D_char3(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed char3: ", 3);
+
+ script.forEach_copy3D_char3(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch char3: ", 3);
+ scriptRelaxed.forEach_copy3D_char3(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed char3: ", 3);
+ }
+
+ public void testGetSet_char4() {
+ testSetup(Element.I8_4(mRS));
+ byte tmp[] = randomByteArray(gCount);
+ byte tmp2[] = new byte[gCount];
+ script.forEach_copy1D_char4(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch char4: ", 4);
+ scriptRelaxed.forEach_copy1D_char4(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed char4: ", 4);
+
+ script.forEach_copy2D_char4(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch char4: ", 4);
+ scriptRelaxed.forEach_copy2D_char4(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed char4: ", 4);
+
+ script.forEach_copy3D_char4(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch char4: ", 4);
+ scriptRelaxed.forEach_copy3D_char4(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed char4: ", 4);
+ }
+
+ public void testGetSet_uchar() {
+ testSetup(Element.U8(mRS));
+ byte tmp[] = randomByteArray(gCount);
+ byte tmp2[] = new byte[gCount];
+ script.forEach_copy1D_uchar(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch uchar: ", 1);
+ scriptRelaxed.forEach_copy1D_uchar(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed uchar: ", 1);
+
+ script.forEach_copy2D_uchar(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch uchar: ", 1);
+ scriptRelaxed.forEach_copy2D_uchar(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed uchar: ", 1);
+
+ script.forEach_copy3D_uchar(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch uchar: ", 1);
+ scriptRelaxed.forEach_copy3D_uchar(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed uchar: ", 1);
+ }
+
+ public void testGetSet_uchar2() {
+ testSetup(Element.U8_2(mRS));
+ byte tmp[] = randomByteArray(gCount);
+ byte tmp2[] = new byte[gCount];
+ script.forEach_copy1D_uchar2(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch uchar2: ", 2);
+ scriptRelaxed.forEach_copy1D_uchar2(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed uchar2: ", 2);
+
+ script.forEach_copy2D_uchar2(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch uchar2: ", 2);
+ scriptRelaxed.forEach_copy2D_uchar2(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed uchar2: ", 2);
+
+ script.forEach_copy3D_uchar2(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch uchar2: ", 2);
+ scriptRelaxed.forEach_copy3D_uchar2(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed uchar2: ", 2);
+ }
+
+ public void testGetSet_uchar3() {
+ testSetup(Element.U8_3(mRS));
+ byte tmp[] = randomByteArray(gCount);
+ byte tmp2[] = new byte[gCount];
+ script.forEach_copy1D_uchar3(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch uchar3: ", 3);
+ scriptRelaxed.forEach_copy1D_uchar3(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed uchar3: ", 3);
+
+ script.forEach_copy2D_uchar3(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch uchar3: ", 3);
+ scriptRelaxed.forEach_copy2D_uchar3(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed uchar3: ", 3);
+
+ script.forEach_copy3D_uchar3(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch uchar3: ", 3);
+ scriptRelaxed.forEach_copy3D_uchar3(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed uchar3: ", 3);
+ }
+
+ public void testGetSet_uchar4() {
+ testSetup(Element.U8_4(mRS));
+ byte tmp[] = randomByteArray(gCount);
+ byte tmp2[] = new byte[gCount];
+ script.forEach_copy1D_uchar4(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch uchar4: ", 4);
+ scriptRelaxed.forEach_copy1D_uchar4(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed uchar4: ", 4);
+
+ script.forEach_copy2D_uchar4(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch uchar4: ", 4);
+ scriptRelaxed.forEach_copy2D_uchar4(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed uchar4: ", 4);
+
+ script.forEach_copy3D_uchar4(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch uchar4: ", 4);
+ scriptRelaxed.forEach_copy3D_uchar4(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed uchar4: ", 4);
+ }
+
+
+
+
+
+
+ public void testGetSet_short() {
+ testSetup(Element.I16(mRS));
+ short tmp[] = randomShortArray(gCount);
+ short tmp2[] = new short[gCount];
+ script.forEach_copy1D_short(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch short: ", 1);
+ scriptRelaxed.forEach_copy1D_short(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed short: ", 1);
+
+ script.forEach_copy2D_short(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch short: ", 1);
+ scriptRelaxed.forEach_copy2D_short(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed short: ", 1);
+
+ script.forEach_copy3D_short(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch short: ", 1);
+ scriptRelaxed.forEach_copy3D_short(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed short: ", 1);
+ }
+
+ public void testGetSet_short2() {
+ testSetup(Element.I16_2(mRS));
+ short tmp[] = randomShortArray(gCount);
+ short tmp2[] = new short[gCount];
+ script.forEach_copy1D_short2(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch short2: ", 2);
+ scriptRelaxed.forEach_copy1D_short2(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed short2: ", 2);
+
+ script.forEach_copy2D_short2(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch short2: ", 2);
+ scriptRelaxed.forEach_copy2D_short2(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed short2: ", 2);
+
+ script.forEach_copy3D_short2(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch short2: ", 2);
+ scriptRelaxed.forEach_copy3D_short2(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed short2: ", 2);
+ }
+
+ public void testGetSet_short3() {
+ testSetup(Element.I16_3(mRS));
+ short tmp[] = randomShortArray(gCount);
+ short tmp2[] = new short[gCount];
+ script.forEach_copy1D_short3(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch short3: ", 3);
+ scriptRelaxed.forEach_copy1D_short3(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed short3: ", 3);
+
+ script.forEach_copy2D_short3(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch short3: ", 3);
+ scriptRelaxed.forEach_copy2D_short3(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed short3: ", 3);
+
+ script.forEach_copy3D_short3(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch short3: ", 3);
+ scriptRelaxed.forEach_copy3D_short3(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed short3: ", 3);
+ }
+
+ public void testGetSet_short4() {
+ testSetup(Element.I16_4(mRS));
+ short tmp[] = randomShortArray(gCount);
+ short tmp2[] = new short[gCount];
+ script.forEach_copy1D_short4(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch short4: ", 4);
+ scriptRelaxed.forEach_copy1D_short4(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed short4: ", 4);
+
+ script.forEach_copy2D_short4(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch short4: ", 4);
+ scriptRelaxed.forEach_copy2D_short4(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed short4: ", 4);
+
+ script.forEach_copy3D_short4(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch short4: ", 4);
+ scriptRelaxed.forEach_copy3D_short4(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed short4: ", 4);
+ }
+
+ public void testGetSet_ushort() {
+ testSetup(Element.U16(mRS));
+ short tmp[] = randomShortArray(gCount);
+ short tmp2[] = new short[gCount];
+ script.forEach_copy1D_ushort(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch ushort: ", 1);
+ scriptRelaxed.forEach_copy1D_ushort(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed ushort: ", 1);
+
+ script.forEach_copy2D_ushort(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch ushort: ", 1);
+ scriptRelaxed.forEach_copy2D_ushort(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed ushort: ", 1);
+
+ script.forEach_copy3D_ushort(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch ushort: ", 1);
+ scriptRelaxed.forEach_copy3D_ushort(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed ushort: ", 1);
+ }
+
+ public void testGetSet_ushort2() {
+ testSetup(Element.U16_2(mRS));
+ short tmp[] = randomShortArray(gCount);
+ short tmp2[] = new short[gCount];
+ script.forEach_copy1D_ushort2(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch ushort2: ", 2);
+ scriptRelaxed.forEach_copy1D_ushort2(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed ushort2: ", 2);
+
+ script.forEach_copy2D_ushort2(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch ushort2: ", 2);
+ scriptRelaxed.forEach_copy2D_ushort2(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed ushort2: ", 2);
+
+ script.forEach_copy3D_ushort2(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch ushort2: ", 2);
+ scriptRelaxed.forEach_copy3D_ushort2(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed ushort2: ", 2);
+ }
+
+ public void testGetSet_ushort3() {
+ testSetup(Element.U16_3(mRS));
+ short tmp[] = randomShortArray(gCount);
+ short tmp2[] = new short[gCount];
+ script.forEach_copy1D_ushort3(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch ushort3: ", 3);
+ scriptRelaxed.forEach_copy1D_ushort3(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed ushort3: ", 3);
+
+ script.forEach_copy2D_ushort3(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch ushort3: ", 3);
+ scriptRelaxed.forEach_copy2D_ushort3(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed ushort3: ", 3);
+
+ script.forEach_copy3D_ushort3(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch ushort3: ", 3);
+ scriptRelaxed.forEach_copy3D_ushort3(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed ushort3: ", 3);
+ }
+
+ public void testGetSet_ushort4() {
+ testSetup(Element.U16_4(mRS));
+ short tmp[] = randomShortArray(gCount);
+ short tmp2[] = new short[gCount];
+ script.forEach_copy1D_ushort4(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch ushort4: ", 4);
+ scriptRelaxed.forEach_copy1D_ushort4(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed ushort4: ", 4);
+
+ script.forEach_copy2D_ushort4(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch ushort4: ", 4);
+ scriptRelaxed.forEach_copy2D_ushort4(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed ushort4: ", 4);
+
+ script.forEach_copy3D_ushort4(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch ushort4: ", 4);
+ scriptRelaxed.forEach_copy3D_ushort4(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed ushort4: ", 4);
+ }
+
+
+
+
+ public void testGetSet_int() {
+ testSetup(Element.I32(mRS));
+ int tmp[] = randomIntArray(gCount);
+ int tmp2[] = new int[gCount];
+ script.forEach_copy1D_int(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch int: ", 1);
+ scriptRelaxed.forEach_copy1D_int(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed int: ", 1);
+
+ script.forEach_copy2D_int(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch int: ", 1);
+ scriptRelaxed.forEach_copy2D_int(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed int: ", 1);
+
+ script.forEach_copy3D_int(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch int: ", 1);
+ scriptRelaxed.forEach_copy3D_int(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed int: ", 1);
+ }
+
+ public void testGetSet_int2() {
+ testSetup(Element.I32_2(mRS));
+ int tmp[] = randomIntArray(gCount);
+ int tmp2[] = new int[gCount];
+ script.forEach_copy1D_int2(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch int2: ", 2);
+ scriptRelaxed.forEach_copy1D_int2(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed int2: ", 2);
+
+ script.forEach_copy2D_int2(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch int2: ", 2);
+ scriptRelaxed.forEach_copy2D_int2(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed int2: ", 2);
+
+ script.forEach_copy3D_int2(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch int2: ", 2);
+ scriptRelaxed.forEach_copy3D_int2(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed int2: ", 2);
+ }
+
+ public void testGetSet_int3() {
+ testSetup(Element.I32_3(mRS));
+ int tmp[] = randomIntArray(gCount);
+ int tmp2[] = new int[gCount];
+ script.forEach_copy1D_int3(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch int3: ", 3);
+ scriptRelaxed.forEach_copy1D_int3(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed int3: ", 3);
+
+ script.forEach_copy2D_int3(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch int3: ", 3);
+ scriptRelaxed.forEach_copy2D_int3(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed int3: ", 3);
+
+ script.forEach_copy3D_int3(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch int3: ", 3);
+ scriptRelaxed.forEach_copy3D_int3(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed int3: ", 3);
+ }
+
+ public void testGetSet_int4() {
+ testSetup(Element.I32_4(mRS));
+ int tmp[] = randomIntArray(gCount);
+ int tmp2[] = new int[gCount];
+ script.forEach_copy1D_int4(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch int4: ", 4);
+ scriptRelaxed.forEach_copy1D_int4(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed int4: ", 4);
+
+ script.forEach_copy2D_int4(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch int4: ", 4);
+ scriptRelaxed.forEach_copy2D_int4(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed int4: ", 4);
+
+ script.forEach_copy3D_int4(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch int4: ", 4);
+ scriptRelaxed.forEach_copy3D_int4(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed int4: ", 4);
+ }
+
+ public void testGetSet_uint() {
+ testSetup(Element.U32(mRS));
+ int tmp[] = randomIntArray(gCount);
+ int tmp2[] = new int[gCount];
+ script.forEach_copy1D_uint(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch uint: ", 1);
+ scriptRelaxed.forEach_copy1D_uint(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed uint: ", 1);
+
+ script.forEach_copy2D_uint(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch uint: ", 1);
+ scriptRelaxed.forEach_copy2D_uint(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed uint: ", 1);
+
+ script.forEach_copy3D_uint(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch uint: ", 1);
+ scriptRelaxed.forEach_copy3D_uint(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed uint: ", 1);
+ }
+
+ public void testGetSet_uint2() {
+ testSetup(Element.U32_2(mRS));
+ int tmp[] = randomIntArray(gCount);
+ int tmp2[] = new int[gCount];
+ script.forEach_copy1D_uint2(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch uint2: ", 2);
+ scriptRelaxed.forEach_copy1D_uint2(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed uint2: ", 2);
+
+ script.forEach_copy2D_uint2(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch uint2: ", 2);
+ scriptRelaxed.forEach_copy2D_uint2(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed uint2: ", 2);
+
+ script.forEach_copy3D_uint2(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch uint2: ", 2);
+ scriptRelaxed.forEach_copy3D_uint2(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed uint2: ", 2);
+ }
+
+ public void testGetSet_uint3() {
+ testSetup(Element.U32_3(mRS));
+ int tmp[] = randomIntArray(gCount);
+ int tmp2[] = new int[gCount];
+ script.forEach_copy1D_uint3(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch uint3: ", 3);
+ scriptRelaxed.forEach_copy1D_uint3(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed uint3: ", 3);
+
+ script.forEach_copy2D_uint3(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch uint3: ", 3);
+ scriptRelaxed.forEach_copy2D_uint3(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed uint3: ", 3);
+
+ script.forEach_copy3D_uint3(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch uint3: ", 3);
+ scriptRelaxed.forEach_copy3D_uint3(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed uint3: ", 3);
+ }
+
+ public void testGetSet_uint4() {
+ testSetup(Element.U32_4(mRS));
+ int tmp[] = randomIntArray(gCount);
+ int tmp2[] = new int[gCount];
+ script.forEach_copy1D_uint4(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch uint4: ", 4);
+ scriptRelaxed.forEach_copy1D_uint4(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed uint4: ", 4);
+
+ script.forEach_copy2D_uint4(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch uint4: ", 4);
+ scriptRelaxed.forEach_copy2D_uint4(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed uint4: ", 4);
+
+ script.forEach_copy3D_uint4(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch uint4: ", 4);
+ scriptRelaxed.forEach_copy3D_uint4(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed uint4: ", 4);
+ }
+
+
+
+
+ public void testGetSet_long() {
+ testSetup(Element.I64(mRS));
+ long tmp[] = randomLongArray(gCount);
+ long tmp2[] = new long[gCount];
+ script.forEach_copy1D_long(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch long: ", 1);
+ scriptRelaxed.forEach_copy1D_long(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed long: ", 1);
+
+ script.forEach_copy2D_long(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch long: ", 1);
+ scriptRelaxed.forEach_copy2D_long(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed long: ", 1);
+
+ script.forEach_copy3D_long(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch long: ", 1);
+ scriptRelaxed.forEach_copy3D_long(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed long: ", 1);
+ }
+
+ public void testGetSet_long2() {
+ testSetup(Element.I64_2(mRS));
+ long tmp[] = randomLongArray(gCount);
+ long tmp2[] = new long[gCount];
+ script.forEach_copy1D_long2(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch long2: ", 2);
+ scriptRelaxed.forEach_copy1D_long2(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed long2: ", 2);
+
+ script.forEach_copy2D_long2(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch long2: ", 2);
+ scriptRelaxed.forEach_copy2D_long2(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed long2: ", 2);
+
+ script.forEach_copy3D_long2(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch long2: ", 2);
+ scriptRelaxed.forEach_copy3D_long2(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed long2: ", 2);
+ }
+
+ public void testGetSet_long3() {
+ testSetup(Element.I64_3(mRS));
+ long tmp[] = randomLongArray(gCount);
+ long tmp2[] = new long[gCount];
+ script.forEach_copy1D_long3(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch long3: ", 3);
+ scriptRelaxed.forEach_copy1D_long3(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed long3: ", 3);
+
+ script.forEach_copy2D_long3(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch long3: ", 3);
+ scriptRelaxed.forEach_copy2D_long3(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed long3: ", 3);
+
+ script.forEach_copy3D_long3(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch long3: ", 3);
+ scriptRelaxed.forEach_copy3D_long3(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed long3: ", 3);
+ }
+
+ public void testGetSet_long4() {
+ testSetup(Element.I64_4(mRS));
+ long tmp[] = randomLongArray(gCount);
+ long tmp2[] = new long[gCount];
+ script.forEach_copy1D_long4(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch long4: ", 4);
+ scriptRelaxed.forEach_copy1D_long4(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed long4: ", 4);
+
+ script.forEach_copy2D_long4(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch long4: ", 4);
+ scriptRelaxed.forEach_copy2D_long4(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed long4: ", 4);
+
+ script.forEach_copy3D_long4(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch long4: ", 4);
+ scriptRelaxed.forEach_copy3D_long4(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed long4: ", 4);
+ }
+
+ public void testGetSet_ulong() {
+ testSetup(Element.U64(mRS));
+ long tmp[] = randomLongArray(gCount);
+ long tmp2[] = new long[gCount];
+ script.forEach_copy1D_ulong(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch ulong: ", 1);
+ scriptRelaxed.forEach_copy1D_ulong(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed ulong: ", 1);
+
+ script.forEach_copy2D_ulong(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch ulong: ", 1);
+ scriptRelaxed.forEach_copy2D_ulong(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed ulong: ", 1);
+
+ script.forEach_copy3D_ulong(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch ulong: ", 1);
+ scriptRelaxed.forEach_copy3D_ulong(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed ulong: ", 1);
+ }
+
+ public void testGetSet_ulong2() {
+ testSetup(Element.U64_2(mRS));
+ long tmp[] = randomLongArray(gCount);
+ long tmp2[] = new long[gCount];
+ script.forEach_copy1D_ulong2(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch ulong2: ", 2);
+ scriptRelaxed.forEach_copy1D_ulong2(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed ulong2: ", 2);
+
+ script.forEach_copy2D_ulong2(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch ulong2: ", 2);
+ scriptRelaxed.forEach_copy2D_ulong2(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed ulong2: ", 2);
+
+ script.forEach_copy3D_ulong2(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch ulong2: ", 2);
+ scriptRelaxed.forEach_copy3D_ulong2(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed ulong2: ", 2);
+ }
+
+ public void testGetSet_ulong3() {
+ testSetup(Element.U64_3(mRS));
+ long tmp[] = randomLongArray(gCount);
+ long tmp2[] = new long[gCount];
+ script.forEach_copy1D_ulong3(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch ulong3: ", 3);
+ scriptRelaxed.forEach_copy1D_ulong3(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed ulong3: ", 3);
+
+ script.forEach_copy2D_ulong3(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch ulong3: ", 3);
+ scriptRelaxed.forEach_copy2D_ulong3(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed ulong3: ", 3);
+
+ script.forEach_copy3D_ulong3(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch ulong3: ", 3);
+ scriptRelaxed.forEach_copy3D_ulong3(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed ulong3: ", 3);
+ }
+
+ public void testGetSet_ulong4() {
+ testSetup(Element.U64_4(mRS));
+ long tmp[] = randomLongArray(gCount);
+ long tmp2[] = new long[gCount];
+ script.forEach_copy1D_ulong4(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch ulong4: ", 4);
+ scriptRelaxed.forEach_copy1D_ulong4(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed ulong4: ", 4);
+
+ script.forEach_copy2D_ulong4(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch ulong4: ", 4);
+ scriptRelaxed.forEach_copy2D_ulong4(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed ulong4: ", 4);
+
+ script.forEach_copy3D_ulong4(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch ulong4: ", 4);
+ scriptRelaxed.forEach_copy3D_ulong4(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed ulong4: ", 4);
+ }
+
+
+
+
+ public void testGetSet_float() {
+ testSetup(Element.F32(mRS));
+ float tmp[] = randomFloatArray(gCount);
+ float tmp2[] = new float[gCount];
+ script.forEach_copy1D_float(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch float: ", 1);
+ scriptRelaxed.forEach_copy1D_float(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed float: ", 1);
+
+ script.forEach_copy2D_float(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch float: ", 1);
+ scriptRelaxed.forEach_copy2D_float(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed float: ", 1);
+
+ script.forEach_copy3D_float(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch float: ", 1);
+ scriptRelaxed.forEach_copy3D_float(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed float: ", 1);
+ }
+
+ public void testGetSet_float2() {
+ testSetup(Element.F32_2(mRS));
+ float tmp[] = randomFloatArray(gCount);
+ float tmp2[] = new float[gCount];
+ script.forEach_copy1D_float2(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch float2: ", 2);
+ scriptRelaxed.forEach_copy1D_float2(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed float2: ", 2);
+
+ script.forEach_copy2D_float2(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch float2: ", 2);
+ scriptRelaxed.forEach_copy2D_float2(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed float2: ", 2);
+
+ script.forEach_copy3D_float2(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch float2: ", 2);
+ scriptRelaxed.forEach_copy3D_float2(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed float2: ", 2);
+ }
+
+ public void testGetSet_float3() {
+ testSetup(Element.F32_3(mRS));
+ float tmp[] = randomFloatArray(gCount);
+ float tmp2[] = new float[gCount];
+ script.forEach_copy1D_float3(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch float3: ", 3);
+ scriptRelaxed.forEach_copy1D_float3(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed float3: ", 3);
+
+ script.forEach_copy2D_float3(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch float3: ", 3);
+ scriptRelaxed.forEach_copy2D_float3(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed float3: ", 3);
+
+ script.forEach_copy3D_float3(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch float3: ", 3);
+ scriptRelaxed.forEach_copy3D_float3(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed float3: ", 3);
+ }
+
+ public void testGetSet_float4() {
+ testSetup(Element.F32_4(mRS));
+ float tmp[] = randomFloatArray(gCount);
+ float tmp2[] = new float[gCount];
+ script.forEach_copy1D_float4(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch float4: ", 4);
+ scriptRelaxed.forEach_copy1D_float4(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed float4: ", 4);
+
+ script.forEach_copy2D_float4(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch float4: ", 4);
+ scriptRelaxed.forEach_copy2D_float4(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed float4: ", 4);
+
+ script.forEach_copy3D_float4(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch float4: ", 4);
+ scriptRelaxed.forEach_copy3D_float4(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed float4: ", 4);
+ }
+
+
+ public void testGetSet_double() {
+ testSetup(Element.F64(mRS));
+ double tmp[] = randomDoubleArray(gCount);
+ double tmp2[] = new double[gCount];
+ script.forEach_copy1D_double(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch double: ", 1);
+ scriptRelaxed.forEach_copy1D_double(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed double: ", 1);
+
+ script.forEach_copy2D_double(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch double: ", 1);
+ scriptRelaxed.forEach_copy2D_double(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed double: ", 1);
+
+ script.forEach_copy3D_double(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch double: ", 1);
+ scriptRelaxed.forEach_copy3D_double(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed double: ", 1);
+ }
+
+ public void testGetSet_double2() {
+ testSetup(Element.F64_2(mRS));
+ double tmp[] = randomDoubleArray(gCount);
+ double tmp2[] = new double[gCount];
+ script.forEach_copy1D_double2(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch double2: ", 2);
+ scriptRelaxed.forEach_copy1D_double2(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed double2: ", 2);
+
+ script.forEach_copy2D_double2(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch double2: ", 2);
+ scriptRelaxed.forEach_copy2D_double2(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed double2: ", 2);
+
+ script.forEach_copy3D_double2(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch double2: ", 2);
+ scriptRelaxed.forEach_copy3D_double2(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed double2: ", 2);
+ }
+
+ public void testGetSet_double3() {
+ testSetup(Element.F64_3(mRS));
+ double tmp[] = randomDoubleArray(gCount);
+ double tmp2[] = new double[gCount];
+ script.forEach_copy1D_double3(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch double3: ", 3);
+ scriptRelaxed.forEach_copy1D_double3(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed double3: ", 3);
+
+ script.forEach_copy2D_double3(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch double3: ", 3);
+ scriptRelaxed.forEach_copy2D_double3(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed double3: ", 3);
+
+ script.forEach_copy3D_double3(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch double3: ", 3);
+ scriptRelaxed.forEach_copy3D_double3(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed double3: ", 3);
+ }
+
+ public void testGetSet_double4() {
+ testSetup(Element.F64_4(mRS));
+ double tmp[] = randomDoubleArray(gCount);
+ double tmp2[] = new double[gCount];
+ script.forEach_copy1D_double4(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch double4: ", 4);
+ scriptRelaxed.forEach_copy1D_double4(walkAlloc);
+ verify(tmp, tmp2, out1DAlloc, "Data mismatch relaxed double4: ", 4);
+
+ script.forEach_copy2D_double4(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch double4: ", 4);
+ scriptRelaxed.forEach_copy2D_double4(walkAlloc);
+ verify(tmp, tmp2, out2DAlloc, "Data mismatch relaxed double4: ", 4);
+
+ script.forEach_copy3D_double4(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch double4: ", 4);
+ scriptRelaxed.forEach_copy3D_double4(walkAlloc);
+ verify(tmp, tmp2, out3DAlloc, "Data mismatch relaxed double4: ", 4);
+ }
+
+
+}
+
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/renderscript/src/android/renderscript/cts/getset.rs b/tests/tests/renderscript/src/android/renderscript/cts/getset.rs
new file mode 100644
index 0000000..4a8fa7f
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/getset.rs
@@ -0,0 +1,143 @@
+ /*
+ * 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.
+ */
+
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+rs_allocation gAlloc1DIn;
+rs_allocation gAlloc1DOut;
+rs_allocation gAlloc2DIn;
+rs_allocation gAlloc2DOut;
+rs_allocation gAlloc3DIn;
+rs_allocation gAlloc3DOut;
+
+uint gWidth;
+uint gHeight;
+
+
+
+
+#define COPY_1D(ty) \
+ void __attribute__((kernel)) copy1D_##ty(int idx) { \
+ ty i = rsGetElementAt_##ty(gAlloc1DIn, idx); \
+ rsSetElementAt_##ty(gAlloc1DOut, i, idx); \
+ } \
+ void __attribute__((kernel)) copy1D_##ty##2(int idx) { \
+ ty##2 i = rsGetElementAt_##ty##2(gAlloc1DIn, idx); \
+ rsSetElementAt_##ty##2(gAlloc1DOut, i, idx); \
+ } \
+ void __attribute__((kernel)) copy1D_##ty##3(int idx) { \
+ ty##3 i = rsGetElementAt_##ty##3(gAlloc1DIn, idx); \
+ rsSetElementAt_##ty##3(gAlloc1DOut, i, idx); \
+ } \
+ void __attribute__((kernel)) copy1D_##ty##4(int idx) { \
+ ty##4 i = rsGetElementAt_##ty##4(gAlloc1DIn, idx); \
+ rsSetElementAt_##ty##4(gAlloc1DOut, i, idx); \
+ }
+
+COPY_1D(char)
+COPY_1D(uchar)
+COPY_1D(short)
+COPY_1D(ushort)
+COPY_1D(int)
+COPY_1D(uint)
+COPY_1D(long)
+COPY_1D(ulong)
+COPY_1D(float)
+COPY_1D(double)
+
+
+
+#define COPY_2D(ty) \
+ void __attribute__((kernel)) copy2D_##ty(int idx) { \
+ uint x = idx % gWidth; \
+ uint y = idx / gWidth; \
+ ty i = rsGetElementAt_##ty(gAlloc2DIn, x, y); \
+ rsSetElementAt_##ty(gAlloc2DOut, i, x, y); \
+ } \
+ void __attribute__((kernel)) copy2D_##ty##2(int idx) { \
+ uint x = idx % gWidth; \
+ uint y = idx / gWidth; \
+ ty##2 i = rsGetElementAt_##ty##2(gAlloc2DIn, x, y); \
+ rsSetElementAt_##ty##2(gAlloc2DOut, i, x, y); \
+ } \
+ void __attribute__((kernel)) copy2D_##ty##3(int idx) { \
+ uint x = idx % gWidth; \
+ uint y = idx / gWidth; \
+ ty##3 i = rsGetElementAt_##ty##3(gAlloc2DIn, x, y); \
+ rsSetElementAt_##ty##3(gAlloc2DOut, i, x, y); \
+ } \
+ void __attribute__((kernel)) copy2D_##ty##4(int idx) { \
+ uint x = idx % gWidth; \
+ uint y = idx / gWidth; \
+ ty##4 i = rsGetElementAt_##ty##4(gAlloc2DIn, x, y); \
+ rsSetElementAt_##ty##4(gAlloc2DOut, i, x, y); \
+ }
+
+COPY_2D(char)
+COPY_2D(uchar)
+COPY_2D(short)
+COPY_2D(ushort)
+COPY_2D(int)
+COPY_2D(uint)
+COPY_2D(long)
+COPY_2D(ulong)
+COPY_2D(float)
+COPY_2D(double)
+
+
+
+#define COPY_3D(ty) \
+ void __attribute__((kernel)) copy3D_##ty(int idx) { \
+ uint x = idx % gWidth; \
+ uint y = (idx / gWidth) % gHeight; \
+ uint z = idx / (gWidth * gHeight); \
+ ty i = rsGetElementAt_##ty(gAlloc3DIn, x, y, z); \
+ rsSetElementAt_##ty(gAlloc3DOut, i, x, y, z); \
+ } \
+ void __attribute__((kernel)) copy3D_##ty##2(int idx) { \
+ uint x = idx % gWidth; \
+ uint y = (idx / gWidth) % gHeight; \
+ uint z = idx / (gWidth * gHeight); \
+ ty##2 i = rsGetElementAt_##ty##2(gAlloc3DIn, x, y, z); \
+ rsSetElementAt_##ty##2(gAlloc3DOut, i, x, y, z); \
+ } \
+ void __attribute__((kernel)) copy3D_##ty##3(int idx) { \
+ uint x = idx % gWidth; \
+ uint y = (idx / gWidth) % gHeight; \
+ uint z = idx / (gWidth * gHeight); \
+ ty##3 i = rsGetElementAt_##ty##3(gAlloc3DIn, x, y, z); \
+ rsSetElementAt_##ty##3(gAlloc3DOut, i, x, y, z); \
+ } \
+ void __attribute__((kernel)) copy3D_##ty##4(int idx) { \
+ uint x = idx % gWidth; \
+ uint y = (idx / gWidth) % gHeight; \
+ uint z = idx / (gWidth * gHeight); \
+ ty##4 i = rsGetElementAt_##ty##4(gAlloc3DIn, x, y, z); \
+ rsSetElementAt_##ty##4(gAlloc3DOut, i, x, y, z); \
+ }
+
+COPY_3D(char)
+COPY_3D(uchar)
+COPY_3D(short)
+COPY_3D(ushort)
+COPY_3D(int)
+COPY_3D(uint)
+COPY_3D(long)
+COPY_3D(ulong)
+COPY_3D(float)
+COPY_3D(double)
+
diff --git a/tests/src/android/os/cts/TaggedPointer.java b/tests/tests/renderscript/src/android/renderscript/cts/getset_relaxed.rs
similarity index 77%
copy from tests/src/android/os/cts/TaggedPointer.java
copy to tests/tests/renderscript/src/android/renderscript/cts/getset_relaxed.rs
index 16e76c9..6b62faf 100644
--- a/tests/src/android/os/cts/TaggedPointer.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/getset_relaxed.rs
@@ -1,4 +1,4 @@
-/*
+ /*
* Copyright (C) 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,13 +14,7 @@
* limitations under the License.
*/
-package android.os.cts;
+#pragma rs_fp_relaxed
-public class TaggedPointer {
+#include "getset.rs"
- static {
- System.loadLibrary("cts_jni");
- }
-
- public static native boolean hasTaggedPointer();
-}
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/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/SimRestrictedApisTest.java b/tests/tests/telephony/src/android/telephony/cts/SimRestrictedApisTest.java
deleted file mode 100644
index 18b0d12..0000000
--- a/tests/tests/telephony/src/android/telephony/cts/SimRestrictedApisTest.java
+++ /dev/null
@@ -1,262 +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.telephony.cts;
-
-import android.telephony.SmsManager;
-import android.telephony.TelephonyManager;
-import android.test.AndroidTestCase;
-
-public class SimRestrictedApisTest extends AndroidTestCase {
- private static final byte[] TEST_PDU = {0,0};
-
- /**
- * Tests the SmsManager.injectSmsPdu() API. This makes a call to injectSmsPdu() API and expects
- * a SecurityException since the test apk is not signed by a certificate on the SIM.
- */
- public void testInjectSmsPdu() {
- try {
- SmsManager.getDefault().injectSmsPdu(TEST_PDU, "3gpp", null);
- fail("Expected SecurityException. App doesn't have carrier privileges.");
- } catch (SecurityException expected) {}
- }
-
- /**
- * Tests the SmsManager.updateMmsDownloadStatus() API. This makes a call to
- * updateMmsDownloadStatus() API and expects a SecurityException since the test apk is not
- * signed by a certificate on the SIM.
- */
- public void testUpdateMmsDownloadStatus() {
- try {
- SmsManager.getDefault().updateMmsDownloadStatus(null, 0, 0, null);
- fail("Expected SecurityException. App doesn't have carrier privileges.");
- } catch (SecurityException expected) {}
- }
-
- /**
- * Tests the SmsManager.updateMmsSendStatus() API. This makes a call to updateMmsSendStatus()
- * API and expects a SecurityException since the test apk is not signed by a certificate
- * on the SIM.
- */
- public void testUpdateMmsSendStatus() {
- try {
- SmsManager.getDefault().updateMmsSendStatus(null, 0, TEST_PDU, 0, null);
- fail("Expected SecurityException. App doesn't have carrier privileges.");
- } catch (SecurityException expected) {}
- }
-
- /**
- * Tests the SmsManager.updateSmsSendStatus() API. This makes a call to updateSmsSendStatus()
- * API and expects a SecurityException since the test apk is not signed by a
- * certificate on the SIM.
- */
- public void testUpdateSmsSendStatus() {
- try {
- SmsManager.getDefault().updateSmsSendStatus(0, false);
- fail("Expected SecurityException. App doesn't have carrier privileges.");
- } catch (SecurityException expected) {}
- }
-
- /**
- * Tests the TelephonyManager.setLine1NumberForDisplay() API. This makes a call to
- * setLine1NumberForDisplay() API and expects a SecurityException since the test apk is not
- * signed by a certificate on the SIM.
- */
- public void testSetLine1NumberForDisplay() {
- try {
- TelephonyManager.getDefault().setLine1NumberForDisplay("", "");
- fail("Expected SecurityException. App doesn't have carrier privileges.");
- } catch (SecurityException expected) {}
- }
-
- /**
- * Tests the TelephonyManager.setLine1NumberForDisplay(long, string, string) API. This makes a
- * call to setLine1NumberForDisplay() API and expects a SecurityException since the test apk is
- * not signed by the certificate on the SIM.
- */
- public void testSetLine1NumberForDisplay2() {
- try {
- TelephonyManager.getDefault().setLine1NumberForDisplayForSubscriber(0, "", "");
- fail("Expected SecurityException. App doesn't have carrier privileges.");
- } catch (SecurityException expected) {}
- }
-
- /**
- * Tests the TelephonyManager.iccOpenLogicalChannel() API. This makes a call to
- * iccOpenLogicalChannel() API and expects a SecurityException since the test apk
- * is not signed by certificate on the SIM.
- */
- public void testIccOpenLogicalChannel() {
- try {
- TelephonyManager.getDefault().iccOpenLogicalChannel("");
- fail("Expected SecurityException. App doesn't have carrier privileges.");
- } catch (SecurityException expected) {}
- }
-
- /**
- * Tests the TelephonyManager.iccCloseLogicalChannel() API. This makes a call to
- * iccCloseLogicalChannel() API and expects a SecurityException since the test apk
- * is not signed by certificate on the SIM.
- */
- public void testIccCloseLogicalChannel() {
- try {
- TelephonyManager.getDefault().iccCloseLogicalChannel(0);
- fail("Expected SecurityException. App doesn't have carrier privileges.");
- } catch (SecurityException expected) {}
- }
-
- /**
- * Tests the TelephonyManager.iccTransmitApduLogicalChannel() API. This makes a call to
- * iccTransmitApduLogicalChannel() API and expects a SecurityException since the test apk
- * is not signed by a certificate on the SIM.
- */
- public void testIccTransmitApduLogicalChannel() {
- try {
- TelephonyManager.getDefault().iccTransmitApduLogicalChannel(
- 0, 0, 0, 0, 0, 0, "");
- fail("Expected SecurityException. App doesn't have carrier privileges.");
- } catch (SecurityException expected) {}
- }
-
- /**
- * Tests the TelephonyManager.iccTransmitApduBasicChannel() API. This makes a call to
- * iccTransmitApduBasicChannel() API and expects a SecurityException since the test apk
- * is not signed by a certificate on the SIM.
- */
- public void testIccTransmitApduBasicChannel() {
- try {
- TelephonyManager.getDefault().iccTransmitApduBasicChannel(
- 0, 0, 0, 0, 0, "");
- fail("Expected SecurityException. App doesn't have carrier privileges.");
- } catch (SecurityException expected) {}
- }
-
- /**
- * Tests the TelephonyManager.sendEnvelopeWithStatus() API. This makes a call to
- * sendEnvelopeWithStatus() API and expects a SecurityException since the test apk is not
- * signed by certificate on the SIM.
- */
- public void testSendEnvelopeWithStatus() {
- try {
- TelephonyManager.getDefault().sendEnvelopeWithStatus("");
- fail("Expected SecurityException. App doesn't have carrier privileges.");
- } catch (SecurityException expected) {}
- }
-
- /**
- * Tests the TelephonyManager.nvReadItem() API. This makes a call to nvReadItem() API and
- * expects a SecurityException since the test apk is not signed by a certificate on the SIM.
- */
- public void testNvReadItem() {
- try {
- TelephonyManager.getDefault().nvReadItem(0);
- fail("Expected SecurityException. App doesn't have carrier privileges.");
- } catch (SecurityException expected) {}
- }
-
- /**
- * Tests the TelephonyManager.nvWriteItem() API. This makes a call to nvWriteItem() API and
- * expects a SecurityException since the test apk is not signed by a certificate on the SIM.
- */
- public void testNvWriteItem() {
- try {
- TelephonyManager.getDefault().nvWriteItem(0, "");
- fail("Expected SecurityException. App doesn't have carrier privileges.");
- } catch (SecurityException expected) {}
- }
-
- /**
- * Tests the TelephonyManager.nvWriteCdmaPrl() API. This makes a call to nvWriteCdmaPrl() API
- * and expects a SecurityException since the test apk is not signed by a certificate
- * on the SIM.
- */
- public void testNvWriteCdmaPrl() {
- try {
- TelephonyManager.getDefault().nvWriteCdmaPrl(null);
- fail("Expected SecurityException. App doesn't have carrier privileges.");
- } catch (SecurityException expected) {}
- }
-
- /**
- * Tests the TelephonyManager.nvResetConfig() API. This makes a call to nvResetConfig() API and
- * expects a SecurityException since the test apk is not signed by a certificate on the SIM.
- */
- public void testNvResetConfig() {
- try {
- TelephonyManager.getDefault().nvResetConfig(0);
- fail("Expected SecurityException. App doesn't have carrier privileges.");
- } catch (SecurityException expected) {}
- }
-
- /**
- * Tests the TelephonyManager.getPreferredNetworkType() API. This makes a call to
- * getPreferredNetworkType() API and expects a SecurityException since the test apk
- * is not signed by certificate on the SIM.
- */
- public void testGetPreferredNetworkType() {
- try {
- TelephonyManager.getDefault().getPreferredNetworkType();
- fail("Expected SecurityException. App doesn't have carrier privileges.");
- } catch (SecurityException expected) {}
- }
-
- /**
- * Tests the TelephonyManager.setGlobalPreferredNetworkType() API. This makes a call to
- * setGlobalPreferredNetworkType() API and expects a SecurityException since the test apk
- * is not signed by certificate on the SIM.
- */
- public void testSetGlobalPreferredNetworkType() {
- try {
- TelephonyManager.getDefault().setGlobalPreferredNetworkType();
- fail("Expected SecurityException. App doesn't have carrier privileges.");
- } catch (SecurityException expected) {}
- }
-
- /**
- * Tests that the test apk doesn't have carrier previliges.
- */
- public void testHasCarrierPrivileges() {
- int previlegeStatus = TelephonyManager.getDefault().hasCarrierPrivileges();
- if(previlegeStatus != TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS &&
- previlegeStatus != TelephonyManager.CARRIER_PRIVILEGE_STATUS_RULES_NOT_LOADED) {
- fail("Unexpected carrier previlege status");
- }
- }
-
- /**
- * Tests the TelephonyManager.setOperatorBrandOverride() API. This makes a call to
- * setOperatorBrandOverride() API and expects a SecurityException since the test apk
- * is not signed by certificate on the SIM.
- */
- public void testSetOperatorBrandOverride() {
- try {
- TelephonyManager.getDefault().setOperatorBrandOverride("");
- fail("Expected SecurityException. App doesn't have carrier privileges.");
- } catch (SecurityException expected) {}
- }
-
- /**
- * Tests the TelephonyManager.enableSimplifiedNetworkSettings() API. This makes a call to
- * enableSimplifiedNetworkSettings() API and expects a SecurityException since the test apk
- * is not signed by a certificate on the SIM.
- */
- public void testEnableSimplifiedNetworkSettings() {
- try {
- TelephonyManager.getDefault().enableSimplifiedNetworkSettingsForSubscriber(0, false);
- fail("Expected SecurityException. App doesn't have carrier privileges.");
- } catch (SecurityException expected) {}
- }
-}
diff --git a/tests/tests/telephony/src/android/telephony/cts/SmsUsageMonitorShortCodeTest.java b/tests/tests/telephony/src/android/telephony/cts/SmsUsageMonitorShortCodeTest.java
index fbe65b1..67cdd24 100644
--- a/tests/tests/telephony/src/android/telephony/cts/SmsUsageMonitorShortCodeTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/SmsUsageMonitorShortCodeTest.java
@@ -18,17 +18,18 @@
import android.content.Context;
import android.content.pm.PackageManager;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import android.test.InstrumentationTestCase;
+import android.test.UiThreadTest;
import com.android.internal.telephony.SmsUsageMonitor;
/**
* Test cases for SMS short code pattern matching in SmsUsageMonitor.
*/
-public class SmsUsageMonitorShortCodeTest extends AndroidTestCase {
+public class SmsUsageMonitorShortCodeTest extends InstrumentationTestCase {
private PackageManager mPackageManager;
+ private Context mContext;
/** Return value from {@link SmsUsageMonitor#checkDestination} for regular phone numbers. */
static final int CATEGORY_NOT_SHORT_CODE = 0;
@@ -482,17 +483,18 @@
@Override
protected void setUp() throws Exception {
super.setUp();
- mPackageManager = getContext().getPackageManager();
+ mContext = getInstrumentation().getTargetContext();
+ mPackageManager = mContext.getPackageManager();
}
- @SmallTest
+ @UiThreadTest
public void testSmsUsageMonitor() {
if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
// do not test if device does not support telephony (voice or sms)
return;
}
- SmsUsageMonitor monitor = new SmsUsageMonitor(getContext());
+ SmsUsageMonitor monitor = new SmsUsageMonitor(mContext);
for (ShortCodeTest test : sShortCodeTests) {
assertEquals("country: " + test.countryIso + " number: " + test.address,
test.category, monitor.checkDestination(test.address, test.countryIso));
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..419bbf9
--- /dev/null
+++ b/tests/tests/widget/res/layout/textview_layout.xml
@@ -0,0 +1,220 @@
+<?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:textAppearance="@null"
+ 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-native-scanner/tests/Android.mk b/tools/cts-native-scanner/tests/Android.mk
index 6044b0d..29c5514 100644
--- a/tools/cts-native-scanner/tests/Android.mk
+++ b/tools/cts-native-scanner/tests/Android.mk
@@ -21,7 +21,7 @@
LOCAL_MODULE := cts-native-scanner-tests
LOCAL_MODULE_TAGS := optional
-LOCAL_JAVA_LIBRARIES := ddmlib-prebuilt tradefed-prebuilt cts-native-scanner
+LOCAL_JAVA_LIBRARIES := tradefed-prebuilt cts-native-scanner
include $(BUILD_HOST_JAVA_LIBRARY)
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/.classpath b/tools/tradefed-host/.classpath
index b82e340..e716219 100644
--- a/tools/tradefed-host/.classpath
+++ b/tools/tradefed-host/.classpath
@@ -5,8 +5,7 @@
<classpathentry kind="src" path="commonutil-src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry exported="true" kind="var" path="CTS_SRC_ROOT/out/host/common/obj/JAVA_LIBRARIES/ctsdeviceinfolib_intermediates/javalib.jar"/>
- <classpathentry exported="true" kind="var" path="CTS_SRC_ROOT/out/host/common/obj/JAVA_LIBRARIES/hosttestlib_intermediates/javalib.jar"/>
- <classpathentry kind="var" path="CTS_SRC_ROOT/out/host/common/obj/JAVA_LIBRARIES/ddmlib-prebuilt_intermediates/ddmlib-prebuilt.jar" sourcepath="/SDK_SRC_ROOT"/>
- <classpathentry kind="var" path="CTS_SRC_ROOT/out/host/common/obj/JAVA_LIBRARIES/tradefed-prebuilt_intermediates/tradefed-prebuilt.jar" sourcepath="/TRADEFED_ROOT/tools/tradefederation/src"/>
+ <classpathentry kind="var" path="CTS_SRC_ROOT/out/host/common/obj/JAVA_LIBRARIES/hosttestlib_intermediates/javalib.jar"/>
+ <classpathentry kind="var" path="CTS_SRC_ROOT/prebuilts/misc/common/tradefed/tradefed-prebuilt.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>
diff --git a/tools/tradefed-host/Android.mk b/tools/tradefed-host/Android.mk
index 0b5d764..bd28575 100644
--- a/tools/tradefed-host/Android.mk
+++ b/tools/tradefed-host/Android.mk
@@ -24,7 +24,7 @@
LOCAL_MODULE := cts-tradefed
LOCAL_MODULE_TAGS := optional
-LOCAL_JAVA_LIBRARIES := ddmlib-prebuilt tradefed-prebuilt hosttestlib
+LOCAL_JAVA_LIBRARIES := tradefed-prebuilt hosttestlib
LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceinfolib
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
diff --git a/tools/tradefed-host/etc/cts-tradefed b/tools/tradefed-host/etc/cts-tradefed
index 485740e..f9f43bb 100755
--- a/tools/tradefed-host/etc/cts-tradefed
+++ b/tools/tradefed-host/etc/cts-tradefed
@@ -78,7 +78,7 @@
fi;
JAR_DIR=${CTS_ROOT}/android-cts/tools
-JARS="ddmlib-prebuilt.jar tradefed-prebuilt.jar hosttestlib.jar cts-tradefed.jar"
+JARS="tradefed-prebuilt.jar hosttestlib.jar cts-tradefed.jar"
for JAR in $JARS; do
checkFile ${JAR_DIR}/${JAR}
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..5029dfe 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);
}
}
@@ -82,7 +87,16 @@
* {@inheritDoc}
*/
@Override
- public void testFailed(TestFailure status, TestIdentifier test, String trace) {
+ public void testFailed(TestIdentifier test, String trace) {
+ mCurrentPkgResult.reportTestFailure(test, CtsTestStatus.FAIL, trace);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void testAssumptionFailure(TestIdentifier test, String trace) {
+ // TODO: do something different here?
mCurrentPkgResult.reportTestFailure(test, CtsTestStatus.FAIL, trace);
}
@@ -91,7 +105,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 +137,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..e8d6e71 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);
}
/**
@@ -249,7 +239,7 @@
* {@inheritDoc}
*/
@Override
- public void testFailed(TestFailure status, TestIdentifier test, String trace) {
+ public void testFailed(TestIdentifier test, String trace) {
mCurrentPkgResult.reportTestFailure(test, CtsTestStatus.FAIL, trace);
}
@@ -257,34 +247,25 @@
* {@inheritDoc}
*/
@Override
- public void testEnded(TestIdentifier test, Map<String, String> testMetrics) {
- collectCtsResults(test, testMetrics);
- mCurrentPkgResult.reportTestEnded(test);
+ public void testAssumptionFailure(TestIdentifier test, String trace) {
+ // TODO: do something different here?
+ mCurrentPkgResult.reportTestFailure(test, CtsTestStatus.FAIL, trace);
}
/**
- * 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
+ * {@inheritDoc}
*/
- 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);
- }
- }
+ @Override
+ public void testIgnored(TestIdentifier test) {
+ // TODO: ??
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void testEnded(TestIdentifier test, Map<String, String> testMetrics) {
+ mCurrentPkgResult.reportTestEnded(test, testMetrics);
}
/**
@@ -377,9 +358,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..ed5f238 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
@@ -58,13 +58,25 @@
private String mProductName;
@Override
- public void testFailed(TestFailure status, TestIdentifier test, String trace) {
+ public void testFailed(TestIdentifier test, String trace) {
mCurrentIssue = new Issue();
mCurrentIssue.mTestName = test.toString();
mCurrentIssue.mStackTrace = trace;
}
@Override
+ public void testAssumptionFailure(TestIdentifier test, String trace) {
+ mCurrentIssue = new Issue();
+ mCurrentIssue.mTestName = test.toString();
+ mCurrentIssue.mStackTrace = trace;
+ }
+
+ @Override
+ public void testIgnored(TestIdentifier test) {
+ // TODO: ??
+ }
+
+ @Override
public void testLog(String dataName, LogDataType dataType, InputStreamSource dataStream) {
if (dataName.startsWith("bug-")) {
try {
@@ -194,7 +206,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/Test.java b/tools/tradefed-host/src/com/android/cts/tradefed/result/Test.java
index 8c5b8d1..023cfcb 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/result/Test.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/result/Test.java
@@ -16,7 +16,6 @@
package com.android.cts.tradefed.result;
import com.android.ddmlib.Log;
-import com.android.tradefed.result.TestResult;
import org.kxml2.io.KXmlSerializer;
import org.xmlpull.v1.XmlPullParser;
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..f5a3d02 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..8c1a5bd 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[] abiAndName = AbiUtils.parseId(id);
+ pkgResult.setAbi(abiAndName[0]);
+ pkgResult.setAppPackageName(abiAndName[1]);
+ mPackageResults.put(id, pkgResult);
}
return pkgResult;
}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/result/TestSuite.java b/tools/tradefed-host/src/com/android/cts/tradefed/result/TestSuite.java
index df1dceb..ca287ca 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/result/TestSuite.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/result/TestSuite.java
@@ -16,7 +16,6 @@
package com.android.cts.tradefed.result;
import com.android.ddmlib.testrunner.TestIdentifier;
-import com.android.tradefed.result.TestResult;
import org.kxml2.io.KXmlSerializer;
import org.xmlpull.v1.XmlPullParser;
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 64%
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..66d1135 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);
}
/**
@@ -73,46 +77,42 @@
@Override
public void run(final ITestInvocationListener listener)
throws DeviceNotAvailableException {
- ITestDevice mTestDevice = getDevice();
+ ITestDevice testDevice = getDevice();
- if (mTestDevice == null) {
- Log.e(LOG_TAG, String.format("Missing device."));
+ if (testDevice == null) {
+ 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;
}
-
+ boolean success = true;
for (String apkFileName : mInstallFileNames) {
Log.d(LOG_TAG, String.format("Installing %s on %s", apkFileName,
- mTestDevice.getSerialNumber()));
+ testDevice.getSerialNumber()));
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);
- errorCode = mTestDevice.installPackage(apkFile, true, options);
+ String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
+ errorCode = testDevice.installPackage(apkFile, true, options);
if (errorCode != null) {
Log.e(LOG_TAG, String.format("Failed to install %s on %s. Reason: %s",
- apkFileName, mTestDevice.getSerialNumber(), errorCode));
+ apkFileName, testDevice.getSerialNumber(), errorCode));
+ success = false;
}
} catch (FileNotFoundException e) {
Log.e(LOG_TAG, String.format("Could not find file %s", apkFileName));
+ success = false;
}
}
- super.run(listener);
+ if (success) {
+ super.run(listener);
+ }
for (String packageName : mUninstallPackages) {
Log.d(LOG_TAG, String.format("Uninstalling %s on %s", packageName,
- mTestDevice.getSerialNumber()));
- mTestDevice.uninstallPackage(packageName);
+ testDevice.getSerialNumber()));
+ testDevice.uninstallPackage(packageName);
}
}
}
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..2505318 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();
}
}
@@ -223,8 +223,8 @@
}
@Override
- public void testFailed(TestFailure status, TestIdentifier test, String trace) {
- super.testFailed(status, test, trace);
+ public void testFailed(TestIdentifier test, String trace) {
+ super.testFailed(test, trace);
InputStreamSource bugSource = mDevice.getBugreport();
super.testLog(String.format("bug-%s_%s", test.getClassName(), test.getTestName()),
LogDataType.TEXT, bugSource);
@@ -247,8 +247,8 @@
}
@Override
- public void testFailed(TestFailure status, TestIdentifier test, String trace) {
- super.testFailed(status, test, trace);
+ public void testFailed(TestIdentifier test, String trace) {
+ super.testFailed(test, trace);
// sleep a small amount of time to ensure test failure stack trace makes it into logcat
// capture
RunUtil.getDefault().sleep(10);
@@ -272,8 +272,8 @@
}
@Override
- public void testFailed(TestFailure status, TestIdentifier test, String trace) {
- super.testFailed(status, test, trace);
+ public void testFailed(TestIdentifier test, String trace) {
+ super.testFailed(test, trace);
try {
InputStreamSource screenSource = mDevice.getScreenshot();
@@ -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,17 @@
}
/**
* Build the list of test packages to run
+ * @throws DeviceNotAvailableException
*/
- private List<TestPackage> buildTestsToRun() {
+ private List<TestPackage> buildTestsToRun() throws DeviceNotAvailableException {
+ Set<String> abis = getAbis();
+ if (abis == null || abis.isEmpty()) {
+ throw new IllegalArgumentException("could not get device's ABIs");
+ }
List<TestPackage> testPkgList = new LinkedList<TestPackage>();
try {
- ITestPackageRepo testRepo = createTestCaseRepo();
- Collection<ITestPackageDef> testPkgDefs = getTestPackagesToRun(testRepo);
-
+ ITestPackageRepo testRepo = createTestCaseRepo(abis);
+ Collection<ITestPackageDef> testPkgDefs = getTestPackagesToRun(testRepo, abis);
for (ITestPackageDef testPkgDef : testPkgDefs) {
addTestPackage(testPkgList, testPkgDef);
}
@@ -637,64 +614,69 @@
* @throws FileNotFoundException
* @throws ConfigurationException
*/
- private Collection<ITestPackageDef> getTestPackagesToRun(ITestPackageRepo testRepo)
- throws ParseException, FileNotFoundException, ConfigurationException {
+ private Collection<ITestPackageDef> getTestPackagesToRun(ITestPackageRepo testRepo,
+ Set<String> abis) throws ParseException, FileNotFoundException, ConfigurationException {
// use LinkedHashSet to have predictable iteration order
Set<ITestPackageDef> testPkgDefs = new LinkedHashSet<ITestPackageDef>();
if (mPlanName != null) {
Log.i(LOG_TAG, String.format("Executing CTS test plan %s", mPlanName));
File ctsPlanFile = mCtsBuild.getTestPlanFile(mPlanName);
- ITestPlan plan = createPlan(mPlanName);
+ ITestPlan plan = createPlan(mPlanName, abis);
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
+ List<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);
+ ITestPlan plan = createPlan(planCreator, abis);
+ 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 +717,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 +731,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 +764,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 +806,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);
}
}
@@ -830,8 +816,8 @@
* <p/>
* Exposed for unit testing
*/
- ITestPackageRepo createTestCaseRepo() {
- return new TestPackageRepo(mCtsBuild.getTestCasesDir(), mIncludeKnownFailures);
+ ITestPackageRepo createTestCaseRepo(Set<String> abis) {
+ return new TestPackageRepo(mCtsBuild.getTestCasesDir(), abis, mIncludeKnownFailures);
}
/**
@@ -839,8 +825,27 @@
* <p/>
* Exposed for unit testing
*/
- ITestPlan createPlan(String planName) {
- return new TestPlan(planName);
+ ITestPlan createPlan(String planName, Set<String> abis) {
+ return new TestPlan(planName, abis);
+ }
+
+ /**
+ * 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;
}
/**
@@ -849,8 +854,9 @@
* Exposed for unit testing
* @throws ConfigurationException
*/
- ITestPlan createPlan(PlanCreator planCreator) throws ConfigurationException {
- return planCreator.createDerivedPlan(mCtsBuild);
+ ITestPlan createPlan(PlanCreator planCreator, Set<String> abis)
+ throws ConfigurationException {
+ return planCreator.createDerivedPlan(mCtsBuild, abis);
}
/**
@@ -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 76%
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..a981d96 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,18 @@
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 +25,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 +43,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 +68,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 +84,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 +148,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 +168,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());
}
/**
@@ -199,7 +199,7 @@
Map <String, String> emptyMap = Collections.emptyMap();
if (!mGotTestResult) {
- mListener.testFailed(ITestRunListener.TestFailure.ERROR, mCurrentTestId,
+ mListener.testFailed(mCurrentTestId,
"Log doesn't contain test result");
}
@@ -235,11 +235,11 @@
} else if (code.compareTo("Fail") == 0 || code.compareTo("ResourceError") == 0
|| code.compareTo("InternalError") == 0 || code.compareTo("Crash") == 0
|| code.compareTo("Timeout") == 0) {
- mListener.testFailed(ITestRunListener.TestFailure.ERROR, mCurrentTestId,
+ mListener.testFailed(mCurrentTestId,
code + ":" + details);
mGotTestResult = true;
} else {
- mListener.testFailed(ITestRunListener.TestFailure.ERROR, mCurrentTestId,
+ mListener.testFailed(mCurrentTestId,
"Unknown result code: " + code + ":" + details);
mGotTestResult = true;
}
@@ -252,7 +252,7 @@
Map <String, String> emptyMap = Collections.emptyMap();
String reason = values.get("dEQP-TerminateTestCase-Reason");
- mListener.testFailed(ITestRunListener.TestFailure.ERROR, mCurrentTestId,
+ mListener.testFailed(mCurrentTestId,
"Terminated: " + reason);
mListener.testEnded(mCurrentTestId, emptyMap);
@@ -283,8 +283,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 +328,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 +336,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 +358,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 +389,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 +400,72 @@
}
/**
+ * 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,
+ mListener.testFailed(mCurrentTestId,
"Log doesn't contain test result");
}
- mListener.testEnded(mCurrentTestId, emptyMap);
- mCurrentTestId = null;
- mListener.testRunEnded(0, emptyMap);
+ 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..d0ea0cf 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);
}
@@ -311,6 +311,7 @@
*
* @see IShellOutputReceiver#isCancelled()
*/
+ @Override
public boolean isCancelled() {
return mIsCancelled;
}
@@ -355,7 +356,7 @@
// if start test run not reported yet
if (!mTestRunStartReported) {
for (ITestRunListener listener : mTestListeners) {
- listener.testRunStarted(mTestRunName, mNumTestsExpected);
+ listener.testRunStarted(mTestRunId, mNumTestsExpected);
}
mTestRunStartReported = true;
}
@@ -548,14 +549,12 @@
// If the test name of the result changed from what we started with, report that
// the last known test failed, regardless of whether we received a pass or fail tag.
for (ITestRunListener listener : mTestListeners) {
- listener.testFailed(ITestRunListener.TestFailure.ERROR, testId,
- mCurrentTestResult.getTrace());
+ listener.testFailed(testId, mCurrentTestResult.getTrace());
}
}
else if (!testPassed) { // test failed
for (ITestRunListener listener : mTestListeners) {
- listener.testFailed(ITestRunListener.TestFailure.FAILURE, testId,
- mCurrentTestResult.getTrace());
+ listener.testFailed(testId, mCurrentTestResult.getTrace());
}
}
// For all cases (pass or fail), we ultimately need to report test has ended
@@ -629,8 +628,7 @@
testRunStackTrace = mCurrentTestResult.getTrace();
}
for (ITestRunListener listener : mTestListeners) {
- listener.testFailed(ITestRunListener.TestFailure.ERROR, testId,
- "No test results.\r\n" + testRunStackTrace);
+ listener.testFailed(testId, "No test results.\r\n" + testRunStackTrace);
listener.testEnded(testId, emptyMap);
}
clearCurrentTestResult();
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..d1d4111 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.List;
+import java.util.Set;
/**
* Interface for accessing tests from the CTS repository.
@@ -25,24 +27,38 @@
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 {@link 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 List} of package ids.
*/
- public String findPackageForTest(String testClassName);
+ public List<String> findPackageIdsForTest(String testClassName);
/**
- * Return a sorted {@link Collection} of all package names found in repo.
+ * @return a sorted {@link List} of all package ids found in repo.
*/
- public Collection<String> getPackageNames();
+ public List<String> getPackageIds();
+
+ /**
+ * @return a sorted {@link List} of all package names found in repo.
+ */
+ public List<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..7931660 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);
+ }
}
/**
@@ -87,9 +86,9 @@
* {@inheritDoc}
*/
@Override
- public void testFailed(TestFailure status, TestIdentifier test, String trace) {
+ public void testFailed(TestIdentifier test, String trace) {
if (isKnownTest(test)) {
- super.testFailed(status, test, trace);
+ super.testFailed(test, trace);
}
}
@@ -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/SingleJUnitTestResultParser.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/SingleJUnitTestResultParser.java
index 117a974..150d265 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/SingleJUnitTestResultParser.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/SingleJUnitTestResultParser.java
@@ -19,6 +19,7 @@
import com.android.ddmlib.MultiLineReceiver;
import com.android.ddmlib.testrunner.ITestRunListener;
import com.android.ddmlib.testrunner.TestIdentifier;
+
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -83,8 +84,7 @@
// If test failed.
if (!testPassed) {
for (ITestRunListener listener : mTestListeners) {
- listener.testFailed(ITestRunListener.TestFailure.FAILURE, mTestId,
- mStackTrace.toString());
+ listener.testFailed(mTestId, mStackTrace.toString());
}
}
Map<String, String> emptyMap = Collections.emptyMap();
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..4c549e2 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;
@@ -25,11 +26,12 @@
import java.io.FilenameFilter;
import java.io.InputStream;
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.Set;
/**
* Retrieves CTS test package definitions from the repository.
@@ -40,19 +42,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 +78,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,30 +129,74 @@
* {@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;
}
/**
- * @return list of all package names found in repo
+ * {@inheritDoc}
*/
@Override
- public Collection<String> getPackageNames() {
- List<String> packageNames = new ArrayList<String>();
- packageNames.addAll(mTestMap.keySet());
+ public List<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));
+ }
+ }
+ }
+ List<String> idList = new ArrayList<String>(ids);
+ Collections.sort(idList);
+ return idList;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public List<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;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public List<String> getPackageNames() {
+ 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..288b48c 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
@@ -23,7 +23,7 @@
*/
public class CtsHostStore {
- // needs concurrent verion as there can be multiple client accessing this.
+ // needs concurrent version as there can be multiple client accessing this.
// But there is no additional protection for the same key as that should not happen.
private static final ConcurrentHashMap<String, String> mMap =
new ConcurrentHashMap<String, String>();
@@ -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..645dbb9 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
@@ -23,20 +23,23 @@
* Note that setTestInfo should be set before throwing report
*/
public class HostReportLog extends ReportLog {
- private String mDeviceSerial;
- private String mClassMethodName;
+ private final String mDeviceSerial;
+ private final String mAbiName;
+ private final 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/Android.mk b/tools/tradefed-host/tests/Android.mk
index d3b94cd..7d4ab4a 100644
--- a/tools/tradefed-host/tests/Android.mk
+++ b/tools/tradefed-host/tests/Android.mk
@@ -21,7 +21,7 @@
LOCAL_MODULE := cts-tradefed-tests
LOCAL_MODULE_TAGS := optional
-LOCAL_JAVA_LIBRARIES := ddmlib-prebuilt tradefed-prebuilt cts-tradefed
+LOCAL_JAVA_LIBRARIES := tradefed-prebuilt cts-tradefed
LOCAL_STATIC_JAVA_LIBRARIES := easymock
include $(BUILD_HOST_JAVA_LIBRARY)
diff --git a/tools/tradefed-host/tests/run_unit_tests.sh b/tools/tradefed-host/tests/run_unit_tests.sh
index fc19a02..771dc75 100755
--- a/tools/tradefed-host/tests/run_unit_tests.sh
+++ b/tools/tradefed-host/tests/run_unit_tests.sh
@@ -37,7 +37,7 @@
fi;
JAR_DIR=${ANDROID_BUILD_TOP}/out/host/$OS/framework
-JARS="ddmlib-prebuilt.jar tradefed-prebuilt.jar hosttestlib.jar cts-tradefed.jar cts-tradefed-tests.jar"
+JARS="tradefed-prebuilt.jar hosttestlib.jar cts-tradefed.jar cts-tradefed-tests.jar"
for JAR in $JARS; do
checkFile ${JAR_DIR}/${JAR}
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..22dd6d9 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,16 @@
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.tradefed.testtype.IAbi;
import junit.framework.Test;
import junit.framework.TestSuite;
@@ -41,6 +43,8 @@
*/
public class UnitTests extends TestSuite {
+ public static final IAbi ABI = new Abi("armeabi-v7a", "32");
+
public UnitTests() {
super();
@@ -60,7 +64,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..48f1ba5 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,7 +17,8 @@
import static com.android.cts.tradefed.result.CtsXmlResultReporter.CTS_RESULT_FILE_VERSION;
-import com.android.ddmlib.testrunner.ITestRunListener.TestFailure;
+import com.android.cts.tradefed.UnitTests;
+import com.android.cts.util.AbiUtils;
import com.android.ddmlib.testrunner.TestIdentifier;
import com.android.tradefed.build.IFolderBuildInfo;
import com.android.tradefed.log.LogUtil.CLog;
@@ -48,6 +49,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 +75,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 +93,9 @@
if (mReportDir != null) {
FileUtil.recursiveDelete(mReportDir);
}
+ if (mBuildDir != null) {
+ FileUtil.recursiveDelete(mBuildDir);
+ }
super.tearDown();
}
@@ -117,19 +130,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 +157,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.testFailed(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..6c3c0c3 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,25 @@
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
-import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+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 List<String> NAMES = new ArrayList<>();
+ private static final List<String> IDS = new ArrayList<>();
+ 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 +62,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,22 +76,26 @@
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() {
@Override
- ITestPackageRepo createTestCaseRepo() {
+ ITestPackageRepo createTestCaseRepo(Set<String> abis) {
return mMockRepo;
}
@Override
- ITestPlan createPlan(String planName) {
+ ITestPlan createPlan(String planName, Set<String> abis) {
return mMockPlan;
}
@Override
- ITestPlan createPlan(PlanCreator planCreator) {
+ ITestPlan createPlan(PlanCreator planCreator, Set<String> abis) {
return mMockPlan;
}
@@ -93,12 +109,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 +129,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 +155,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 +169,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 +178,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 +189,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 +205,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 +227,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 +265,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 +280,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 +295,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 +310,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 +326,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 +341,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..1a92a39 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,14 +251,14 @@
}
});
- mockListener.testRunStarted(URI, 1);
+ mockListener.testRunStarted(ID, 1);
EasyMock.expectLastCall().once();
mockListener.testStarted(EasyMock.eq(testId));
EasyMock.expectLastCall().once();
if (!pass) {
- mockListener.testFailed(ITestRunListener.TestFailure.ERROR, testId,
+ mockListener.testFailed(testId,
resultCode + ":Detail" + resultCode);
EasyMock.expectLastCall().once();
@@ -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/utils/cts/tools.py b/tools/utils/cts/tools.py
index 0a4c97c..649e4d7 100644
--- a/tools/utils/cts/tools.py
+++ b/tools/utils/cts/tools.py
@@ -205,7 +205,7 @@
for package in self.all_packages:
if self.map[package]:
entry = doc.createElement('Entry')
- entry.setAttribute('uri', package)
+ entry.setAttribute('name', package)
if package in self.excludedTestsMap:
entry.setAttribute('exclude', ';'.join(self.excludedTestsMap[package]))
if package in self.includedTestsMap:
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>() {