Merge "CTS tests for accessibility docking windows." into nyc-dev
diff --git a/CtsTestCaseList.mk b/CtsTestCaseList.mk
index 92499aa..4b973e7 100644
--- a/CtsTestCaseList.mk
+++ b/CtsTestCaseList.mk
@@ -88,6 +88,7 @@
CtsCertInstallerApp \
CtsContactDirectoryProvider \
CtsAdminApp \
+ CtsCppToolsApp \
CtsWifiConfigCreator \
CtsDeviceAdminApp23 \
CtsDeviceAdminApp24 \
@@ -95,6 +96,7 @@
CtsDeviceInfo \
CtsDeviceOsTestApp \
CtsDeviceOwnerApp \
+ CtsProfileOwnerApp \
CtsDeviceServicesTestApp \
CtsDeviceTaskSwitchingAppA \
CtsDeviceTaskSwitchingAppB \
@@ -116,13 +118,14 @@
CtsSomeAccessibilityServices \
CtsSystemUiDeviceApp \
CtsThemeDeviceApp \
- TestDeviceSetup \
CtsUiAutomatorTestApp \
CtsUsbSerialTestApp \
CtsVoiceInteractionService \
CtsVoiceInteractionApp \
CtsVoiceSettingsService \
+ CtsVpnFirewallApp \
CtsWidgetProviderApp \
+ TestDeviceSetup \
$(cts_account_support_packages) \
$(cts_security_apps_list) \
$(cts_security_keysets_list)
@@ -140,7 +143,6 @@
# Test packages that require an associated test package XML.
cts_test_packages := \
CtsIcuTestCases \
- CtsAbiOverrideTestCases \
CtsAccelerationTestCases \
CtsAccountManagerTestCases \
CtsAccessibilityServiceTestCases \
@@ -246,9 +248,11 @@
# Host side only tests
cts_host_libraries := \
CtsAadbHostTestCases \
+ CtsAbiOverrideHostTestCases \
CtsAppSecurityHostTestCases \
CtsAppUsageHostTestCases \
CtsAtraceHostTestCases \
+ CtsCppToolsTestCases \
CtsDevicePolicyManagerTestCases \
CtsDumpsysHostTestCases \
CtsJankHostTestCases \
diff --git a/apps/CameraITS/CameraITS.pdf b/apps/CameraITS/CameraITS.pdf
index 8953af9..01ecf54 100644
--- a/apps/CameraITS/CameraITS.pdf
+++ b/apps/CameraITS/CameraITS.pdf
Binary files differ
diff --git a/apps/CameraITS/pymodules/its/caps.py b/apps/CameraITS/pymodules/its/caps.py
index 95f19d9..dd35ca2 100644
--- a/apps/CameraITS/pymodules/its/caps.py
+++ b/apps/CameraITS/pymodules/its/caps.py
@@ -36,6 +36,17 @@
print "Test skipped"
sys.exit(SKIP_RET_CODE)
+def level3(props):
+ """Returns whether a device is a LEVEL3 capability camera2 device.
+
+ Args:
+ props: Camera properties object.
+
+ Returns:
+ Boolean.
+ """
+ return props.has_key("android.info.supportedHardwareLevel") and \
+ props["android.info.supportedHardwareLevel"] == 3
def full(props):
"""Returns whether a device is a FULL capability camera2 device.
@@ -73,6 +84,19 @@
return props.has_key("android.info.supportedHardwareLevel") and \
props["android.info.supportedHardwareLevel"] == 2
+def radial_distortion_correction(props):
+ """Returns whether a device supports RADIAL_DISTORTION_CORRECTION
+ capabilities.
+
+ Args:
+ props: Camera properties object.
+
+ Returns:
+ Boolean.
+ """
+ return props.has_key("android.lens.radialDistortion") and \
+ props["android.lens.radialDistortion"] is not None
+
def manual_sensor(props):
"""Returns whether a device supports MANUAL_SENSOR capabilities.
@@ -144,6 +168,29 @@
"""
return len(its.objects.get_available_output_sizes("raw12", props)) > 0
+def raw_output(props):
+ """Returns whether a device supports any of RAW output format.
+
+ Args:
+ props: Camera properties object.
+
+ Returns:
+ Boolean.
+ """
+ return raw16(props) or raw10(props) or raw12(props)
+
+def post_raw_sensitivity_boost(props):
+ """Returns whether a device supports post RAW sensitivity boost..
+
+ Args:
+ props: Camera properties object.
+
+ Returns:
+ Boolean.
+ """
+ return props.has_key("android.control.postRawSensitivityBoostRange") and \
+ props["android.control.postRawSensitivityBoostRange"] != [100, 100]
+
def sensor_fusion(props):
"""Returns whether the camera and motion sensor timestamps for the device
are in the same time domain and can be compared directly.
diff --git a/apps/CameraITS/pymodules/its/device.py b/apps/CameraITS/pymodules/its/device.py
index 835a4a4..008f095 100644
--- a/apps/CameraITS/pymodules/its/device.py
+++ b/apps/CameraITS/pymodules/its/device.py
@@ -595,8 +595,20 @@
formats = ['yuv']
ncap = len(cmd["captureRequests"])
nsurf = 1 if out_surfaces is None else len(cmd["outputSurfaces"])
+ # Only allow yuv output to multiple targets
+ yuv_surfaces = [s for s in cmd["outputSurfaces"] if s["format"]=="yuv"]
+ n_yuv = len(yuv_surfaces)
+ # Compute the buffer size of YUV targets
+ yuv_sizes = [c["width"]*c["height"]*3/2 for c in yuv_surfaces]
+ # Currently we don't pass enough metadta from ItsService to distinguish
+ # different yuv stream of same buffer size
+ if len(yuv_sizes) != len(set(yuv_sizes)):
+ raise its.error.Error(
+ 'ITS does not support yuv outputs of same buffer size')
if len(formats) > len(set(formats)):
- raise its.error.Error('Duplicate format requested')
+ if n_yuv != len(formats) - len(set(formats)) + 1:
+ raise its.error.Error('Duplicate format requested')
+
raw_formats = 0;
raw_formats += 1 if "dng" in formats else 0
raw_formats += 1 if "raw" in formats else 0
@@ -627,19 +639,24 @@
# the burst, however individual images of different formats can come
# out in any order for that capture.
nbufs = 0
- bufs = {"yuv":[], "raw":[], "raw10":[], "raw12":[],
+ bufs = {"raw":[], "raw10":[], "raw12":[],
"rawStats":[], "dng":[], "jpeg":[]}
+ yuv_bufs = {size:[] for size in yuv_sizes}
mds = []
widths = None
heights = None
while nbufs < ncap*nsurf or len(mds) < ncap:
jsonObj,buf = self.__read_response_from_socket()
- if jsonObj['tag'] in ['jpegImage', 'yuvImage', 'rawImage', \
+ if jsonObj['tag'] in ['jpegImage', 'rawImage', \
'raw10Image', 'raw12Image', 'rawStatsImage', 'dngImage'] \
and buf is not None:
fmt = jsonObj['tag'][:-5]
bufs[fmt].append(buf)
nbufs += 1
+ elif jsonObj['tag'] == 'yuvImage':
+ buf_size = numpy.product(buf.shape)
+ yuv_bufs[buf_size].append(buf)
+ nbufs += 1
elif jsonObj['tag'] == 'captureResults':
mds.append(jsonObj['objValue']['captureResult'])
outputs = jsonObj['objValue']['outputs']
@@ -653,11 +670,15 @@
objs = []
for i in range(ncap):
obj = {}
- obj["data"] = bufs[fmt][i]
obj["width"] = widths[j]
obj["height"] = heights[j]
obj["format"] = fmt
obj["metadata"] = mds[i]
+ if fmt == 'yuv':
+ buf_size = widths[j] * heights[j] * 3 / 2
+ obj["data"] = yuv_bufs[buf_size][i]
+ else:
+ obj["data"] = bufs[fmt][i]
objs.append(obj)
rets.append(objs if ncap>1 else objs[0])
self.sock.settimeout(self.SOCK_TIMEOUT)
diff --git a/apps/CameraITS/tests/scene1/test_post_raw_sensitivity_boost.py b/apps/CameraITS/tests/scene1/test_post_raw_sensitivity_boost.py
new file mode 100644
index 0000000..b0689c1
--- /dev/null
+++ b/apps/CameraITS/tests/scene1/test_post_raw_sensitivity_boost.py
@@ -0,0 +1,135 @@
+# Copyright 2016 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import its.device
+import its.caps
+import its.objects
+import its.image
+import os.path
+import pylab
+import matplotlib
+import matplotlib.pyplot
+
+def main():
+ """Capture a set of raw/yuv images with different
+ sensitivity/post Raw sensitivity boost combination
+ and check if the output pixel mean matches request settings
+ """
+ NAME = os.path.basename(__file__).split(".")[0]
+
+ # Each raw image
+ RATIO_THRESHOLD = 0.03
+
+ with its.device.ItsSession() as cam:
+ props = cam.get_camera_properties()
+ its.caps.skip_unless(its.caps.raw_output(props) and
+ its.caps.post_raw_sensitivity_boost(props) and
+ its.caps.compute_target_exposure(props) and
+ its.caps.per_frame_control(props))
+
+ w,h = its.objects.get_available_output_sizes(
+ "yuv", props, (1920, 1080))[0]
+
+ if its.caps.raw16(props):
+ raw_format = 'raw'
+ elif its.caps.raw10(props):
+ raw_format = 'raw10'
+ elif its.caps.raw12(props):
+ raw_format = 'raw12'
+ else # should not reach here
+ raise its.error.Error('Cannot find available RAW output format')
+
+ out_surfaces = [{"format": raw_format},
+ {"format": "yuv", "width": w, "height": h}]
+
+ sens_min, sens_max = props['android.sensor.info.sensitivityRange']
+ sens_boost_min, sens_boost_max =
+ props['android.control.postRawSensitivityBoostRange']
+
+ e_targer, s_target =
+ its.target.get_target_exposure_combos(cam)["midSensitivity"]
+
+ reqs = []
+ settings = []
+ s_boost = sens_boost_min
+ while s_boost <= sens_boost_min:
+ s_raw = int(round(s_target * 100.0 / s_boost))
+ if s_raw < sens_min or s_raw > sens_max:
+ continue
+ req = its.objects.manual_capture_request(s_raw, e_target)
+ req['android.control.postRawSensitivityBoost'] = s_boost
+ reqs.append(req)
+ settings.append((s_raw, s_boost))
+ s_boost *= 2
+
+ caps = cam.do_capture(reqs, out_surfaces)
+
+ raw_rgb_means = []
+ yuv_rgb_means = []
+ for i,cap in enumerate(caps):
+ (s, s_boost) = settings[i]
+ raw_cap, yuv_cap = cap
+ raw_rgb = its.image.convert_capture_to_rgb_image(raw_cap, props=props)
+ yuv_rgb = its.image.convert_capture_to_rgb_image(yuv_cap)
+ raw_tile = its.image.get_image_patch(raw_rgb, 0.45,0.45,0.1,0.1)
+ yuv_tile = its.image.get_image_patch(yuv_rgb, 0.45,0.45,0.1,0.1)
+ raw_rgb_means.append(its.image.compute_image_means(raw_tile))
+ yuv_rgb_means.append(its.image.compute_image_means(yuv_tile))
+ its.image.write_image(raw_tile,
+ "%s_raw_s=%04d_boost=%04d.jpg" % (NAME,s,s_boost))
+ its.image.write_image(yuv_tile,
+ "%s_yuv_s=%04d_boost=%04d.jpg" % (NAME,s,s_boost))
+ print "s=%d, s_boost=%d: raw_means %s, yuv_means %d"%(
+ s,s_boost,raw_rgb_means[-1], yuv_rgb_means[-1])
+
+ xs = range(len(reqs))
+ pylab.plot(xs, [rgb[0] for rgb in raw_rgb_means], 'r')
+ pylab.plot(xs, [rgb[1] for rgb in raw_rgb_means], 'g')
+ pylab.plot(xs, [rgb[2] for rgb in raw_rgb_means], 'b')
+ pylab.ylim([0,1])
+ matplotlib.pyplot.savefig("%s_raw_plot_means.png" % (NAME))
+ pylab.clf()
+ pylab.plot(xs, [rgb[0] for rgb in yuv_rgb_means], 'r')
+ pylab.plot(xs, [rgb[1] for rgb in yuv_rgb_means], 'g')
+ pylab.plot(xs, [rgb[2] for rgb in yuv_rgb_means], 'b')
+ pylab.ylim([0,1])
+ matplotlib.pyplot.savefig("%s_yuv_plot_means.png" % (NAME))
+
+ rgb_str = ["R", "G", "B"]
+ # Test that raw means is about 2x brighter than next step
+ raw_thres_min = 2 * (1 - RATIO_THRESHOLD)
+ raw_thres_max = 2 * (1 + RATIO_THRESHOLD)
+ for step in range(1, len(reqs)):
+ for rgb in range(3):
+ ratio = raw_rgb_means[step - 1][rgb] / raw_rgb_means[step][rgb]
+ print "Step (%d,%d) %s channel: %f, %f, ratio %f" % (
+ step-1, step, rgb_str[rgb],
+ raw_rgb_means[step - 1][rgb],
+ raw_rgb_means[step][rgb],
+ ratio)
+ assert(raw_thres_min < ratio < raw_thres_max)
+
+ # Test that each yuv step is about the same bright as their mean
+ yuv_thres_min = 1 - RATIO_THRESHOLD
+ yuv_thres_max = 1 + RATIO_THRESHOLD
+ for rgb in range(3):
+ vals = [val[rgb] for val in yuv_rgb_means]
+ mean = sum(vals) / len(vales)
+ print "%s channel vals %s mean %f"%(rgb_str[rgb], vals, mean)
+ for step in range(len(reqs)):
+ ratio = vals[step] / mean
+ assert(yuv_thres_min < ratio < yuv_thres_max)
+
+if __name__ == '__main__':
+ main()
diff --git a/apps/CameraITS/tests/scene4/SampleTarget.pdf b/apps/CameraITS/tests/scene4/SampleTarget.pdf
new file mode 100644
index 0000000..e693b34
--- /dev/null
+++ b/apps/CameraITS/tests/scene4/SampleTarget.pdf
Binary files differ
diff --git a/apps/CameraITS/tests/scene4/test_aspect_ratio_and_crop.py b/apps/CameraITS/tests/scene4/test_aspect_ratio_and_crop.py
new file mode 100644
index 0000000..7733c5d
--- /dev/null
+++ b/apps/CameraITS/tests/scene4/test_aspect_ratio_and_crop.py
@@ -0,0 +1,408 @@
+# Copyright 2015 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import its.image
+import its.caps
+import its.device
+import its.objects
+import os.path
+import cv2
+import numpy as np
+
+
+def main():
+ """ Test aspect ratio and check if images are cropped correctly under each
+ output size
+ Aspect ratio test runs on level3, full and limited devices. Crop test only
+ runs on full and level3 devices.
+ The test image is a black circle inside a black square. When raw capture is
+ available, set the height vs. width ratio of the circle in the full-frame
+ raw as ground truth. Then compare with images of request combinations of
+ different formats ("jpeg" and "yuv") and sizes.
+ If raw capture is unavailable, take a picture of the test image right in
+ front to eliminate shooting angle effect. the height vs. width ratio for
+ the circle should be close to 1. Considering shooting position error, aspect
+ ratio greater than 1.05 or smaller than 0.95 will fail the test.
+ """
+ NAME = os.path.basename(__file__).split(".")[0]
+ LARGE_SIZE = 2000 # Define the size of a large image
+ # pass/fail threshold of large size images for aspect ratio test
+ THRES_L_AR_TEST = 0.02
+ # pass/fail threshold of mini size images for aspect ratio test
+ THRES_XS_AR_TEST = 0.05
+ # pass/fail threshold of large size images for crop test
+ THRES_L_CP_TEST = 0.02
+ # pass/fail threshold of mini size images for crop test
+ THRES_XS_CP_TEST = 0.05
+ PREVIEW_SIZE = (1920, 1080) # preview size
+ aspect_ratio_gt = 1 # ground truth
+ failed_ar = [] # streams failed the aspect ration test
+ failed_crop = [] # streams failed the crop test
+ format_list = [] # format list for multiple capture objects.
+ # Do multi-capture of "iter" and "cmpr". Iterate through all the
+ # available sizes of "iter", and only use the size specified for "cmpr"
+ # Do single-capture to cover untouched sizes in multi-capture when needed.
+ format_list.append({"iter": "yuv", "iter_max": None,
+ "cmpr": "yuv", "cmpr_size": PREVIEW_SIZE})
+ format_list.append({"iter": "yuv", "iter_max": PREVIEW_SIZE,
+ "cmpr": "jpeg", "cmpr_size": None})
+ format_list.append({"iter": "yuv", "iter_max": PREVIEW_SIZE,
+ "cmpr": "raw", "cmpr_size": None})
+ format_list.append({"iter": "jpeg", "iter_max": None,
+ "cmpr": "raw", "cmpr_size": None})
+ format_list.append({"iter": "jpeg", "iter_max": None,
+ "cmpr": "yuv", "cmpr_size": PREVIEW_SIZE})
+ with its.device.ItsSession() as cam:
+ props = cam.get_camera_properties()
+ # Todo: test for radial distortion enabled devices has not yet been
+ # implemented
+ its.caps.skip_unless(not its.caps.radial_distortion_correction(props))
+ full_device = its.caps.full(props)
+ limited_device = its.caps.limited(props)
+ its.caps.skip_unless(full_device or limited_device)
+ level3_device = its.caps.level3(props)
+ raw_avlb = its.caps.raw16(props)
+ run_crop_test = (level3_device or full_device) and raw_avlb
+ if not run_crop_test:
+ print "Crop test skipped"
+ # Converge 3A and get the estimates.
+ sens, exp, gains, xform, focus = cam.do_3a(get_results=True,
+ lock_ae=True, lock_awb=True)
+ print "AE sensitivity %d, exposure %dms" % (sens, exp / 1000000.0)
+ print "AWB gains", gains
+ print "AWB transform", xform
+ print "AF distance", focus
+ req = its.objects.manual_capture_request(
+ sens, exp, True, props)
+ xform_rat = its.objects.float_to_rational(xform)
+ req["android.colorCorrection.gains"] = gains
+ req["android.colorCorrection.transform"] = xform_rat
+
+ # If raw capture is available, use it as ground truth.
+ if raw_avlb:
+ # Capture full-frame raw. Use its aspect ratio and circle center
+ # location as ground truth for the other jepg or yuv images.
+ out_surface = {"format": "raw"}
+ cap_raw = cam.do_capture(req, out_surface)
+ print "Captured %s %dx%d" % ("raw", cap_raw["width"],
+ cap_raw["height"])
+ img_raw = its.image.convert_capture_to_rgb_image(cap_raw,
+ props=props)
+ size_raw = img_raw.shape
+ img_name = "%s_%s_w%d_h%d.png" \
+ % (NAME, "raw", size_raw[1], size_raw[0])
+ aspect_ratio_gt, cc_ct_gt, circle_size_raw = measure_aspect_ratio(
+ img_raw, 1, img_name)
+ # Normalize the circle size to 1/4 of the image size, so that
+ # circle size won"t affect the crop test result
+ factor_cp_thres = (min(size_raw[0:1])/4.0) / max(circle_size_raw)
+ thres_l_cp_test = THRES_L_CP_TEST * factor_cp_thres
+ thres_xs_cp_test = THRES_XS_CP_TEST * factor_cp_thres
+
+ # Take pictures of each settings with all the image sizes available.
+ for fmt in format_list:
+ fmt_iter = fmt["iter"]
+ fmt_cmpr = fmt["cmpr"]
+ dual_target = fmt_cmpr is not "none"
+ # Get the size of "cmpr"
+ if dual_target:
+ size_cmpr = its.objects.get_available_output_sizes(
+ fmt_cmpr, props, fmt["cmpr_size"])[0]
+ for size_iter in its.objects.get_available_output_sizes(
+ fmt_iter, props, fmt["iter_max"]):
+ w_iter = size_iter[0]
+ h_iter = size_iter[1]
+ # Skip testing same format/size combination
+ # ITS does not handle that properly now
+ if dual_target and \
+ w_iter == size_cmpr[0] and \
+ h_iter == size_cmpr[1] and \
+ fmt_iter == fmt_cmpr:
+ continue
+ out_surface = [{"width": w_iter,
+ "height": h_iter,
+ "format": fmt_iter}]
+ if dual_target:
+ out_surface.append({"width": size_cmpr[0],
+ "height": size_cmpr[1],
+ "format": fmt_cmpr})
+ cap = cam.do_capture(req, out_surface)
+ if dual_target:
+ frm_iter = cap[0]
+ else:
+ frm_iter = cap
+ assert (frm_iter["format"] == fmt_iter)
+ assert (frm_iter["width"] == w_iter)
+ assert (frm_iter["height"] == h_iter)
+ print "Captured %s with %s %dx%d" \
+ % (fmt_iter, fmt_cmpr, w_iter, h_iter)
+ img = its.image.convert_capture_to_rgb_image(frm_iter)
+ img_name = "%s_%s_with_%s_w%d_h%d.png" \
+ % (NAME, fmt_iter, fmt_cmpr, w_iter, h_iter)
+ aspect_ratio, cc_ct, _ = measure_aspect_ratio(img, raw_avlb,
+ img_name)
+ # check pass/fail for aspect ratio
+ # image size >= LARGE_SIZE: use THRES_L_AR_TEST
+ # image size == 0 (extreme case): THRES_XS_AR_TEST
+ # 0 < image size < LARGE_SIZE: scale between THRES_XS_AR_TEST
+ # and THRES_L_AR_TEST
+ thres_ar_test = max(THRES_L_AR_TEST,
+ THRES_XS_AR_TEST + max(w_iter, h_iter) *
+ (THRES_L_AR_TEST-THRES_XS_AR_TEST)/LARGE_SIZE)
+ thres_range_ar = (aspect_ratio_gt-thres_ar_test,
+ aspect_ratio_gt+thres_ar_test)
+ if aspect_ratio < thres_range_ar[0] \
+ or aspect_ratio > thres_range_ar[1]:
+ failed_ar.append({"fmt_iter": fmt_iter,
+ "fmt_cmpr": fmt_cmpr,
+ "w": w_iter, "h": h_iter,
+ "ar": aspect_ratio,
+ "valid_range": thres_range_ar})
+
+ # check pass/fail for crop
+ if run_crop_test:
+ # image size >= LARGE_SIZE: use thres_l_cp_test
+ # image size == 0 (extreme case): thres_xs_cp_test
+ # 0 < image size < LARGE_SIZE: scale between
+ # thres_xs_cp_test and thres_l_cp_test
+ thres_hori_cp_test = max(thres_l_cp_test,
+ thres_xs_cp_test + w_iter *
+ (thres_l_cp_test-thres_xs_cp_test)/LARGE_SIZE)
+ thres_range_h_cp = (cc_ct_gt["hori"]-thres_hori_cp_test,
+ cc_ct_gt["hori"]+thres_hori_cp_test)
+ thres_vert_cp_test = max(thres_l_cp_test,
+ thres_xs_cp_test + h_iter *
+ (thres_l_cp_test-thres_xs_cp_test)/LARGE_SIZE)
+ thres_range_v_cp = (cc_ct_gt["vert"]-thres_vert_cp_test,
+ cc_ct_gt["vert"]+thres_vert_cp_test)
+ if cc_ct["hori"] < thres_range_h_cp[0] \
+ or cc_ct["hori"] > thres_range_h_cp[1] \
+ or cc_ct["vert"] < thres_range_v_cp[0] \
+ or cc_ct["vert"] > thres_range_v_cp[1]:
+ failed_crop.append({"fmt_iter": fmt_iter,
+ "fmt_cmpr": fmt_cmpr,
+ "w": w_iter, "h": h_iter,
+ "ct_hori": cc_ct["hori"],
+ "ct_vert": cc_ct["vert"],
+ "valid_range_h": thres_range_h_cp,
+ "valid_range_v": thres_range_v_cp})
+
+ # Print aspect ratio test results
+ failed_image_number_for_aspect_ratio_test = len(failed_ar)
+ if failed_image_number_for_aspect_ratio_test > 0:
+ print "\nAspect ratio test summary"
+ print "Images failed in the aspect ratio test:"
+ print "Aspect ratio value: width / height"
+ for fa in failed_ar:
+ print "%s with %s %dx%d: %.3f; valid range: %.3f ~ %.3f" % \
+ (fa["fmt_iter"], fa["fmt_cmpr"], fa["w"], fa["h"], fa["ar"],
+ fa["valid_range"][0], fa["valid_range"][1])
+
+ # Print crop test results
+ failed_image_number_for_crop_test = len(failed_crop)
+ if failed_image_number_for_crop_test > 0:
+ print "\nCrop test summary"
+ print "Images failed in the crop test:"
+ print "Circle center position, (horizontal x vertical), listed " \
+ "below is relative to the image center."
+ for fc in failed_crop:
+ print "%s with %s %dx%d: %.3f x %.3f; " \
+ "valid horizontal range: %.3f ~ %.3f; " \
+ "valid vertical range: %.3f ~ %.3f" \
+ % (fc["fmt_iter"], fc["fmt_cmpr"], fc["w"], fc["h"],
+ fc["ct_hori"], fc["ct_vert"], fc["valid_range_h"][0],
+ fc["valid_range_h"][1], fc["valid_range_v"][0],
+ fc["valid_range_v"][1])
+
+ assert (failed_image_number_for_aspect_ratio_test == 0)
+ if level3_device:
+ assert (failed_image_number_for_crop_test == 0)
+
+
+def measure_aspect_ratio(img, raw_avlb, img_name):
+ """ Measure the aspect ratio of the black circle in the test image.
+
+ Args:
+ img: Numpy float image array in RGB, with pixel values in [0,1].
+ raw_avlb: True: raw capture is available; False: raw capture is not
+ available.
+ img_name: string with image info of format and size.
+ Returns:
+ aspect_ratio: aspect ratio number in float.
+ cc_ct: circle center position relative to the center of image.
+ (circle_w, circle_h): tuple of the circle size
+ """
+ size = img.shape
+ img = img * 255
+ # Gray image
+ img_gray = 0.299 * img[:,:,2] + 0.587 * img[:,:,1] + 0.114 * img[:,:,0]
+
+ # otsu threshold to binarize the image
+ ret3, img_bw = cv2.threshold(np.uint8(img_gray), 0, 255,
+ cv2.THRESH_BINARY + cv2.THRESH_OTSU)
+
+ # connected component
+ contours, hierarchy = cv2.findContours(255-img_bw, cv2.RETR_TREE,
+ cv2.CHAIN_APPROX_SIMPLE)
+
+ # Check each component and find the black circle
+ min_cmpt = size[0] * size[1] * 0.005
+ max_cmpt = size[0] * size[1] * 0.35
+ num_circle = 0
+ aspect_ratio = 0
+ for ct, hrch in zip(contours, hierarchy[0]):
+ # The radius of the circle is 1/3 of the length of the square, meaning
+ # around 1/3 of the area of the square
+ # Parental component should exist and the area is acceptable.
+ # The coutour of a circle should have at least 5 points
+ child_area = cv2.contourArea(ct)
+ if hrch[3] == -1 or child_area < min_cmpt or child_area > max_cmpt or \
+ len(ct) < 15:
+ continue
+ # Check the shapes of current component and its parent
+ child_shape = component_shape(ct)
+ parent = hrch[3]
+ prt_shape = component_shape(contours[parent])
+ prt_area = cv2.contourArea(contours[parent])
+ dist_x = abs(child_shape["ctx"]-prt_shape["ctx"])
+ dist_y = abs(child_shape["cty"]-prt_shape["cty"])
+ # 1. 0.56*Parent"s width < Child"s width < 0.76*Parent"s width.
+ # 2. 0.56*Parent"s height < Child"s height < 0.76*Parent"s height.
+ # 3. Child"s width > 0.1*Image width
+ # 4. Child"s height > 0.1*Image height
+ # 5. 0.25*Parent"s area < Child"s area < 0.45*Parent"s area
+ # 6. Child is a black, and Parent is white
+ # 7. Center of Child and center of parent should overlap
+ if prt_shape["width"] * 0.56 < child_shape["width"] \
+ < prt_shape["width"] * 0.76 \
+ and prt_shape["height"] * 0.56 < child_shape["height"] \
+ < prt_shape["height"] * 0.76 \
+ and child_shape["width"] > 0.1 * size[1] \
+ and child_shape["height"] > 0.1 * size[0] \
+ and 0.30 * prt_area < child_area < 0.50 * prt_area \
+ and img_bw[child_shape["cty"]][child_shape["ctx"]] == 0 \
+ and img_bw[child_shape["top"]][child_shape["left"]] == 255 \
+ and dist_x < 0.1 * child_shape["width"] \
+ and dist_y < 0.1 * child_shape["height"]:
+ # If raw capture is not available, check the camera is placed right
+ # in front of the test page:
+ # 1. Distances between parent and child horizontally on both side,0
+ # dist_left and dist_right, should be close.
+ # 2. Distances between parent and child vertically on both side,
+ # dist_top and dist_bottom, should be close.
+ if not raw_avlb:
+ dist_left = child_shape["left"] - prt_shape["left"]
+ dist_right = prt_shape["right"] - child_shape["right"]
+ dist_top = child_shape["top"] - prt_shape["top"]
+ dist_bottom = prt_shape["bottom"] - child_shape["bottom"]
+ if abs(dist_left-dist_right) > 0.05 * child_shape["width"] or \
+ abs(dist_top-dist_bottom) > \
+ 0.05 * child_shape["height"]:
+ continue
+ # Calculate aspect ratio
+ aspect_ratio = float(child_shape["width"]) / \
+ float(child_shape["height"])
+ circle_ctx = child_shape["ctx"]
+ circle_cty = child_shape["cty"]
+ circle_w = float(child_shape["width"])
+ circle_h = float(child_shape["height"])
+ cc_ct = {"hori": float(child_shape["ctx"]-size[1]/2) / circle_w,
+ "vert": float(child_shape["cty"]-size[0]/2) / circle_h}
+ num_circle += 1
+ # If more than one circle found, break
+ if num_circle == 2:
+ break
+
+ if num_circle == 0:
+ its.image.write_image(img/255, img_name, True)
+ print "No black circle was detected. Please take pictures according " \
+ "to instruction carefully!\n"
+ assert (num_circle == 1)
+
+ if num_circle > 1:
+ its.image.write_image(img/255, img_name, True)
+ print "More than one black circle was detected. Background of scene " \
+ "may be too complex.\n"
+ assert (num_circle == 1)
+
+ # draw circle center and image center, and save the image
+ line_width = max(1, max(size)/500)
+ move_text_dist = line_width * 3
+ cv2.line(img, (circle_ctx, circle_cty), (size[1]/2, size[0]/2),
+ (255, 0, 0), line_width)
+ if circle_cty > size[0]/2:
+ move_text_down_circle = 4
+ move_text_down_image = -1
+ else:
+ move_text_down_circle = -1
+ move_text_down_image = 4
+ if circle_ctx > size[1]/2:
+ move_text_right_circle = 2
+ move_text_right_image = -1
+ else:
+ move_text_right_circle = -1
+ move_text_right_image = 2
+ # circle center
+ text_circle_x = move_text_dist * move_text_right_circle + circle_ctx
+ text_circle_y = move_text_dist * move_text_down_circle + circle_cty
+ cv2.circle(img, (circle_ctx, circle_cty), line_width*2, (255, 0, 0), -1)
+ cv2.putText(img, "circle center", (text_circle_x, text_circle_y),
+ cv2.FONT_HERSHEY_SIMPLEX, line_width/2.0, (255, 0, 0),
+ line_width)
+ # image center
+ text_imgct_x = move_text_dist * move_text_right_image + size[1]/2
+ text_imgct_y = move_text_dist * move_text_down_image + size[0]/2
+ cv2.circle(img, (size[1]/2, size[0]/2), line_width*2, (255, 0, 0), -1)
+ cv2.putText(img, "image center", (text_imgct_x, text_imgct_y),
+ cv2.FONT_HERSHEY_SIMPLEX, line_width/2.0, (255, 0, 0),
+ line_width)
+ its.image.write_image(img/255, img_name, True)
+
+ print "Aspect ratio: %.3f" % aspect_ratio
+ print "Circle center position regarding to image center: %.3fx%.3f" % \
+ (cc_ct["vert"], cc_ct["hori"])
+ return aspect_ratio, cc_ct, (circle_w, circle_h)
+
+
+def component_shape(contour):
+ """ Measure the shape for a connected component in the aspect ratio test
+
+ Args:
+ contour: return from cv2.findContours. A list of pixel coordinates of
+ the contour.
+
+ Returns:
+ The most left, right, top, bottom pixel location, height, width, and
+ the center pixel location of the contour.
+ """
+ shape = {"left": np.inf, "right": 0, "top": np.inf, "bottom": 0,
+ "width": 0, "height": 0, "ctx": 0, "cty": 0}
+ for pt in contour:
+ if pt[0][0] < shape["left"]:
+ shape["left"] = pt[0][0]
+ if pt[0][0] > shape["right"]:
+ shape["right"] = pt[0][0]
+ if pt[0][1] < shape["top"]:
+ shape["top"] = pt[0][1]
+ if pt[0][1] > shape["bottom"]:
+ shape["bottom"] = pt[0][1]
+ shape["width"] = shape["right"] - shape["left"] + 1
+ shape["height"] = shape["bottom"] - shape["top"] + 1
+ shape["ctx"] = (shape["left"]+shape["right"])/2
+ shape["cty"] = (shape["top"]+shape["bottom"])/2
+ return shape
+
+
+if __name__ == "__main__":
+ main()
diff --git a/apps/CameraITS/tools/run_all_tests.py b/apps/CameraITS/tools/run_all_tests.py
index dd12512..ec0aab7 100644
--- a/apps/CameraITS/tools/run_all_tests.py
+++ b/apps/CameraITS/tools/run_all_tests.py
@@ -43,17 +43,21 @@
"test_yuv_plus_jpeg"
],
"scene2":[],
- "scene3":[]
+ "scene3":[],
+ "scene4":[]
}
# Get all the scene0 and scene1 tests, which can be run using the same
# physical setup.
- scenes = ["scene0", "scene1", "scene2", "scene3"]
+ scenes = ["scene0", "scene1", "scene2", "scene3", "scene4"]
scene_req = {
"scene0" : None,
"scene1" : "A grey card covering at least the middle 30% of the scene",
"scene2" : "A picture containing human faces",
- "scene3" : "A chart containing sharp edges like ISO 12233"
+ "scene3" : "A chart containing sharp edges like ISO 12233",
+ "scene4" : "A specific test page of a circle covering at least the "
+ "middle 50% of the scene. See CameraITS.pdf section 2.3.4 "
+ "for more detail"
}
tests = []
for d in scenes:
diff --git a/apps/CtsVerifier/AndroidManifest.xml b/apps/CtsVerifier/AndroidManifest.xml
index b6a992f..fda6d59 100644
--- a/apps/CtsVerifier/AndroidManifest.xml
+++ b/apps/CtsVerifier/AndroidManifest.xml
@@ -119,6 +119,8 @@
<category android:name="android.cts.intent.category.MANUAL_TEST" />
</intent-filter>
<meta-data android:name="test_category" android:value="@string/test_category_device_admin" />
+ <meta-data android:name="test_required_features"
+ android:value="android.software.device_admin" />
</activity>
<activity android:name=".admin.RedactedNotificationKeyguardDisabledFeaturesActivity"
@@ -129,6 +131,8 @@
<category android:name="android.cts.intent.category.MANUAL_TEST" />
</intent-filter>
<meta-data android:name="test_category" android:value="@string/test_category_device_admin" />
+ <meta-data android:name="test_required_features"
+ android:value="android.software.device_admin" />
</activity>
<activity android:name=".admin.ScreenLockTestActivity"
@@ -152,6 +156,15 @@
android:value="android.software.backup" />
</activity>
+ <activity android:name=".backup.BackupAccessibilityTestActivity" android:label="@string/backup_accessibility_test">
+ <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_required_features"
+ android:value="android.software.backup" />
+ </activity>
+
<activity android:name=".bluetooth.BluetoothTestActivity"
android:label="@string/bluetooth_test"
android:configChanges="keyboardHidden|orientation|screenSize">
@@ -1647,12 +1660,6 @@
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
- <action android:name="android.intent.action.SEND" />
- <action android:name="android.intent.action.SEND_MULTIPLE" />
- <data android:mimeType="*/*" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- <intent-filter>
<action android:name="android.intent.action.GET_CONTENT" />
<action android:name="android.intent.action.OPEN_DOCUMENT" />
<data android:mimeType="*/*" />
@@ -1688,12 +1695,6 @@
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
- <category android:name="android.intent.category.BROWSABLE" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:scheme="http" android:host="com.android.cts.verifier" />
- </intent-filter>
- <intent-filter>
- <action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http" />
<data android:mimeType="video/mp4" />
@@ -1715,6 +1716,18 @@
<action android:name="com.android.cts.verifier.managedprovisioning.CROSS_PROFILE_TO_WORK" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:scheme="http" android:host="com.android.cts.verifier" />
+ </intent-filter>
+ <intent-filter>
+ <action android:name="android.intent.action.SEND" />
+ <action android:name="android.intent.action.SEND_MULTIPLE" />
+ <data android:mimeType="*/*" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
</activity>
<activity android:name=".managedprovisioning.WorkStatusTestActivity">
diff --git a/apps/CtsVerifier/res/layout/bua_main.xml b/apps/CtsVerifier/res/layout/bua_main.xml
new file mode 100644
index 0000000..e2d5ef1
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/bua_main.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ >
+
+ <ListView android:id="@+id/android:list"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ />
+
+ <TextView android:id="@id/android:empty"
+ android:gravity="center"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="@string/bu_loading"
+ />
+
+ <Button android:id="@+id/generate_button"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/bua_read_settings"
+ />
+
+ <Button android:id="@+id/show_instructions_button"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/bua_show_instructions"
+ />
+
+ <include layout="@layout/pass_fail_buttons" />
+
+</LinearLayout>
diff --git a/apps/CtsVerifier/res/values/strings.xml b/apps/CtsVerifier/res/values/strings.xml
index bfab6cd..1d2d8c4d 100644
--- a/apps/CtsVerifier/res/values/strings.xml
+++ b/apps/CtsVerifier/res/values/strings.xml
@@ -52,6 +52,11 @@
<!-- Strings for ReportViewerActivity -->
<string name="report_viewer">Report Viewer</string>
+ <!-- String shared between BackupTestActivity and BackupAccessibilityTestActivity -->
+ <string name="bu_loading">Loading...</string>
+ <string name="bu_generate_error">Error occurred while generating test data...</string>
+ <string name="bu_settings">Settings</string>
+
<!-- Strings for BackupTestActivity -->
<string name="backup_test">Data Backup Test</string>
<string name="backup_info">This test checks that data backup and automatic restore works
@@ -62,11 +67,9 @@
\n\nPress the \"Generate Test Data\" to populate these values
and then follow the on screen instructions to finish the test.
</string>
+ <string name="bu_generate">Generate Test Data</string>
<string name="bu_preferences">Preferences</string>
<string name="bu_files">Files</string>
- <string name="bu_loading">Loading...</string>
- <string name="bu_generate">Generate Test Data</string>
- <string name="bu_generate_error">Error occurred while generating test data...</string>
<string name="bu_instructions">Random values for the preferences and files have been saved.
\n\nFollow the instructions below to check that the data backup and restore works:
\n\n1. Make sure backup and automatic restore are enabled in settings. Depending on the
@@ -79,7 +82,45 @@
\n\n3. Uninstall the program: adb uninstall com.android.cts.verifier
\n\n4. Reinstall the CTS Verifier and verify that the values are still the same.
</string>
- <string name="bu_settings">Settings</string>
+
+ <!-- Strings for BackupAccessibilityTestActivity -->
+ <string name="backup_accessibility_test">Backup Accessibility Settings Test</string>
+ <string name="backup_accessibility_info">This test checks that data backup and automatic restore
+ of Accessibility-related settings works properly. If backup and restore is working properly,
+ these values should be restored after running the backup manager, removing your Google
+ account, changing the accessibility settings values, and re-adding your Google account.
+ \n\nPress \"Generate Test Data\" to generate test values for accessibility settings and then
+ follow the on screen instructions to finish the test.
+ </string>
+ <string name="bua_settings">General Accessibility Settings</string>
+ <string name="bua_settings_color_correction">Color Correction Settings</string>
+ <string name="bua_settings_accessibility_services">Accessibility Service Settings</string>
+ <string name="bua_settings_captions">Captions Settings</string>
+ <string name="bua_settings_tts">TTS Settings</string>
+ <string name="bua_settings_system">Other System Settings</string>
+ <string name="bua_instructions">You will need two devices for this test.
+ \n\nFollow the instructions below to check that the data backup and restore of
+ accessibility-related settings works properly:
+ \n\n1. Make sure backup and automatic restore are enabled in settings. If you cannot find
+ the corresponding setting options on your device, run \"adb shell bmgr enable true\" to
+ enable the backup manager. You can check its status by executing \"adb shell bmgr enabled\".
+ You will also need to set a Google account as the backup account for the device.
+ \n\n2. Press \"Read Current Values\" and note the default values for the listed settings.
+ Values that are either \"0\" or \"null\" will appear in green. Note: Some default values are
+ neither \"0\", nor \"null\", so you still need to pay attention to the default setting
+ values that are not highlighted.
+ \n\n3. Change the values of the listed settings to something other than their default value.
+ \n\n4. Return to the CtsVerifier and press \"Read Current Values\". Make sure that you have
+ changed all of the settings.
+ \n\n5. Run the backup manager: adb shell bmgr run
+ \n\n6. Factory reset data on the second device. While going through the Setup Wizard,
+ restore all data from the account on your first device. When prompted, choose to restore all
+ settings from your first device.
+ \n\n7. Install CtsVerifier on your new device and make sure that the values read on the
+ second device match the values on your first device.
+ </string>
+ <string name="bua_show_instructions">Show Instructions</string>
+ <string name="bua_read_settings">Read Current Values</string>
<!-- Strings for Device Administration tests -->
<string name="da_policy_serialization_test">Policy Serialization Test</string>
@@ -1621,7 +1662,7 @@
<string name="provisioning_byod_disable_unredacted_notifications_instruction">
Please press the Go button to lock the screen. Wait a couple of seconds and look out for a
notification from CtsVerifier.\n
- Expected result is the notification is shown as \"Contents hidden\", you can not see the contents
+ Expected result is the notification is shown as \"Contents hidden by policy\", you can not see the contents
(Which would read \"This is a notification\"). You should be seeing a work badge.\n
After you log back in, please navigate back to CtsVerifier and mark the test as \"Pass\" or \"Fail\".
</string>
@@ -1645,20 +1686,17 @@
<string name="provisioning_byod_disallow_apps_control_prepare_button">Prepare test</string>
<string name="provisioning_byod_disabled_uninstall_button">Disabled uninstall button</string>
<string name="provisioning_byod_disabled_uninstall_button_instruction">
- Please press the Go button to go to Settings > Apps. Choose a managed app. Check if the button that says
- either \"Uninstall\" or \"Disable\" is greyed out and disabled, i.e. nothing happens when you tap on it.
+ Please press the Go button to go to Settings > Apps. Choose a managed app. Check that performing either \"Uninstall\" or \"Disable\" is not possible and triggers a support message when trying to do so.
Then please press Back and mark the test as \"Pass\" or \"Fail\".
</string>
<string name="provisioning_byod_disabled_force_stop_button">Disabled force stop button</string>
<string name="provisioning_byod_disabled_force_stop_button_instruction">
- Please press the Go button to go to Settings > Apps. Choose a managed app. Check if the button that says
- \"Force stop\" is greyed out and disabled, i.e. nothing happens when you tap on it.
+ Please press the Go button to go to Settings > Apps. Choose a managed app. Check that performing \"Force stop\" is not possible and triggers a support message when trying to do so.
Then please press Back and mark the test as \"Pass\" or \"Fail\".
</string>
<string name="provisioning_byod_disabled_app_storage_buttons">Disabled app storage buttons</string>
<string name="provisioning_byod_disabled_app_storage_buttons_instruction">
- Please press the Go button to go to Settings > Apps. Choose a managed (badged) app. Select \"Storage\". Check that the buttons
- \"Clear Data\" and \"Clear Cache\" are disabled, i.e. nothing happens when you tap on them.
+ Please press the Go button to go to Settings > Apps. Choose a managed (badged) app. Select \"Storage\". Check that performing \"Clear Data\" and \"Clear Cache\" is not possible and triggers a support message when trying to do so.
Note: if an app has no data then tapping the clear data button has no effect anyway. Make sure you have selected
the badged version of app with non-zero app data. Badged \"Settings\" may be a good candidate.
Then please press Back and mark the test as \"Pass\" or \"Fail\".
@@ -1994,9 +2032,9 @@
<string name="device_profile_owner_permission_lockdown_test_instructions">
Select each of the three grant states for the permission shown below in turn.\n
Now open application settings, select Permissions, and verify if the following behaviour is observed.\n
- <b>Allow:</b> Permission is granted to the app and cannot be changed through the settings UI.\n
+ <b>Allow:</b> Permission is granted to the app and cannot be changed through the settings UI. Trying to change it triggers a support message.\n
<b>Let user decide:</b> Permission state can be changed through the settings UI.\n
- <b>Deny:</b> Permission is denied to the app and cannot be changed through the settings UI.\n
+ <b>Deny:</b> Permission is denied to the app and cannot be changed through the settings UI. Trying to change it triggers a support message.\n
Please mark the test accordingly.
</string>
<string name="device_owner_permission_lockdown_test_info">
@@ -2004,11 +2042,10 @@
</string>
<string name="device_owner_disallow_usb_file_transfer_test">Disallow USB file transfer</string>
<string name="device_owner_disallow_usb_file_transfer_test_info">
- Please press below button to set the \"disallow USB file transfer\" restriction.
+ Please press below button to set the \"disallow USB file transfer\" restriction.\n
Next, connect your device to your desktop computer through USB, open the USB notification from the status bar
- and check that the \"Transfer files (MTP)\" and \"Transfer photos (PTP)\" options are not present. Also, check
- that you can download files from your phone to the desktop computer. The test is successful if the files from
- your phone are not and cannot be downloaded through USB.\n
+ and check that the \"Transfer files (MTP)\" and \"Transfer photos (PTP)\" cannot be selected and triggers a support message when trying to select them.\n
+ Also, check that if you can download files from your phone to the desktop computer. The test is successful if the files from your phone are not and cannot be downloaded through USB.\n
Please mark the test accordingly.
</string>
<string name="profile_owner_permission_lockdown_test_info">
@@ -2043,7 +2080,7 @@
Confirm that:\n
\n
- You cannot view Bluetooth devices in range.\n
- - You cannot edit, add or remove any already paired devices.\n
+ - Trying to edit, add or remove any already paired devices triggers a support message.\n
\n
Use the Back button to return to this page.
</string>
@@ -2054,7 +2091,7 @@
Confirm that:\n
\n
- You cannot view WiFi networks in range.\n
- - You cannot edit, add or remove any existing WiFi configs.\n
+ - Trying to edit, add or remove any existing WiFi configs triggers a support message.\n
\n
Use the Back button to return to this page.
</string>
@@ -2065,7 +2102,7 @@
Confirm that:\n
\n
- Data roaming is disabled.\n
- - You cannot enable data roaming.\n
+ - Enabling data roaming is not possible and triggers a support message.\n
\n
Use the Back button to return to this page.
</string>
@@ -2101,7 +2138,8 @@
1. Press Go to open the Vpn settings page.\n
Confirm that:\n
- You cannot add a new VPN network.\n
- - You cannot edit, add or remove any existing VPNs.\n\n
+ - You cannot edit, add or remove any existing VPNs.\n
+ - Trying to perform any of the above actions will trigger a support message.\n\n
2. Press Check VPN to check programmatic Vpn test.\n
- Check Vpn setup\n\n
Use the Back button to return to this page.
@@ -2151,18 +2189,48 @@
<string name="disallow_adjust_volume_action">Adjusting the volume</string>
<string name="disallow_apps_control">Disallow controlling apps</string>
<string name="disallow_apps_control_action">DISABLE/UNINSTALL/FORCE STOP-ing any app in the managed device/profile other than CtsVerifier</string>
+ <string name="disallow_config_cell_broadcasts">Disallow config cell broadcasts</string>
+ <string name="disallow_config_cell_broadcasts_action">Configuring cell broadcasts</string>
+ <string name="disallow_config_credentials">Disallow config credentials</string>
+ <string name="disallow_config_credentials_action">Configuring user credentials</string>
+ <string name="disallow_config_mobile_networks">Disallow config mobile networks</string>
+ <string name="disallow_config_mobile_networks_action">Configuring mobile networks</string>
+ <string name="disallow_config_tethering">Disallow config tethering</string>
+ <string name="disallow_config_tethering_action">Configuring tethering and portable hotspots</string>
<string name="disallow_config_wifi">Disallow config Wi-Fi</string>
<string name="disallow_config_wifi_action">Modifying Wi-Fi configuration</string>
+ <string name="disallow_debugging_features">Disallow debugging features</string>
+ <string name="disallow_debugging_features_action">Enabling developer options</string>
+ <string name="disallow_factory_reset">Disallow factory reset</string>
+ <string name="disallow_factory_reset_action">Factory resetting the device</string>
<string name="disallow_fun">Disallow fun</string>
<string name="disallow_fun_action">Opening android easter egg game by tapping repeatedly on the \'Android version\' option</string>
+ <string name="disallow_install_unknown_sources">Disallow install unknown sources</string>
+ <string name="disallow_install_unknown_sources_action">Enabling \'Unknown sources\' setting</string>
<string name="disallow_modify_accounts">Disallow modify accounts</string>
<string name="disallow_modify_accounts_action">Adding an account or removing an account (if you have already added one)</string>
+ <string name="disallow_network_reset">Disallow network reset</string>
+ <string name="disallow_network_reset_action">Resetting network settings</string>
+ <string name="disallow_outgoing_beam">Disallow outgoing beam</string>
+ <string name="disallow_outgoing_beam_action">Switching on android beam</string>
+ <string name="disallow_remove_user">Disallow remove user</string>
+ <string name="disallow_remove_user_action">Removing other users</string>
<string name="disallow_share_location">Disallow share location</string>
<string name="disallow_share_location_action">Turning on location sharing</string>
+ <string name="disallow_uninstall_apps">Disallow uninstall apps</string>
+ <string name="disallow_uninstall_apps_action">Uninstalling applications other CtsVerifier</string>
<string name="disallow_keyguard_unredacted_notifications">Disallow lockscreen unredacted notification</string>
<string name="disallow_keyguard_unredacted_notifications_set_step">Disallow unredacted notifications when device is locked by turning on the switch below</string>
<string name="disallow_keyguard_unredacted_notifications_action">Selecting show all notification content when device is locked</string>
<string name="disallow_keyguard_unredacted_notifications_widget_label">@string/disallow_keyguard_unredacted_notifications</string>
+ <string name="set_auto_time_required">Set auto (network) time required</string>
+ <string name="auto_time_required_set_step">Set auto time required policy by turning on the switch below</string>
+ <string name="set_auto_time_required_action">Modifying date and time</string>
+ <string name="set_auto_time_required_widget_label">@string/set_auto_time_required</string>
+ <string name="set_lock_screen_info">Set lock screen info</string>
+ <string name="lock_screen_info_set_step">Select a lock screen info by setting a non-empty message in the edittext below.</string>
+ <string name="set_lock_screen_info_action">Modifying lock screen message</string>
+ <string name="set_lock_screen_info_widget_label">@string/set_lock_screen_info</string>
<string name="set_maximum_time_to_lock">Set maximum time to lock</string>
<string name="maximum_time_to_lock_set_step">
Select a non-zero maximum time to lock value by setting a value in the edittext box below.
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/backup/BackupAccessibilityTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/backup/BackupAccessibilityTestActivity.java
new file mode 100644
index 0000000..157a71c
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/backup/BackupAccessibilityTestActivity.java
@@ -0,0 +1,342 @@
+/*
+ * 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 com.android.cts.verifier.backup;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.backup.BackupManager;
+import android.app.backup.FileBackupHelper;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.graphics.Color;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.widget.BaseAdapter;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+import java.util.Scanner;
+
+/**
+ * Test for checking whether Accessibility Settings are being backed up properly. It lists the
+ * values of the accessibility preferences that should get backed up and restored after running the
+ * backup manager and reinstalling the CTS verifier.
+ */
+public class BackupAccessibilityTestActivity extends PassFailButtons.ListActivity {
+
+ private static final String TAG = BackupAccessibilityTestActivity.class.getSimpleName();
+
+ private static final int INSTRUCTIONS_DIALOG_ID = 1;
+
+ private static final List<String> ACCESSIBILITY_SETTINGS = new ArrayList();
+ private static final List<String> COLOR_CORRECTION_SETTINGS = new ArrayList();
+ private static final List<String> ACCESSIBILITY_SERVICE_SETTINGS = new ArrayList();
+ private static final List<String> CAPTIONS_SETTINGS = new ArrayList();
+ private static final List<String> TTS_SETTINGS = new ArrayList();
+ private static final List<String> SYSTEM_SETTINGS = new ArrayList();
+
+ static {
+ ACCESSIBILITY_SETTINGS.add("accessibility_display_magnification_enabled");
+ ACCESSIBILITY_SETTINGS.add("accessibility_autoclick_enabled");
+ ACCESSIBILITY_SETTINGS.add("accessibility_autoclick_delay");
+ ACCESSIBILITY_SETTINGS.add("high_text_contrast_enabled");
+ ACCESSIBILITY_SETTINGS.add("incall_power_button_behavior");
+ ACCESSIBILITY_SETTINGS.add(Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD);
+ ACCESSIBILITY_SETTINGS.add("accessibility_large_pointer_icon");
+ ACCESSIBILITY_SETTINGS.add("long_press_timeout");
+ ACCESSIBILITY_SETTINGS.add(Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED);
+
+ COLOR_CORRECTION_SETTINGS.add("accessibility_display_daltonizer");
+ COLOR_CORRECTION_SETTINGS.add("accessibility_display_daltonizer_enabled");
+
+ CAPTIONS_SETTINGS.add("accessibility_captioning_preset");
+ CAPTIONS_SETTINGS.add("accessibility_captioning_enabled");
+ CAPTIONS_SETTINGS.add("accessibility_captioning_locale");
+ CAPTIONS_SETTINGS.add("accessibility_captioning_background_color");
+ CAPTIONS_SETTINGS.add("accessibility_captioning_foreground_color");
+ CAPTIONS_SETTINGS.add("accessibility_captioning_edge_type");
+ CAPTIONS_SETTINGS.add("accessibility_captioning_edge_color");
+ CAPTIONS_SETTINGS.add("accessibility_captioning_typeface");
+ CAPTIONS_SETTINGS.add("accessibility_captioning_font_scale");
+ CAPTIONS_SETTINGS.add("accessibility_captioning_window_color");
+
+ TTS_SETTINGS.add(Settings.Secure.TTS_DEFAULT_RATE);
+ TTS_SETTINGS.add("tts_default_locale");
+
+ ACCESSIBILITY_SERVICE_SETTINGS.add(Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
+ ACCESSIBILITY_SERVICE_SETTINGS.add("touch_exploration_granted_accessibility_services");
+ ACCESSIBILITY_SERVICE_SETTINGS.add(Settings.Secure.TOUCH_EXPLORATION_ENABLED);
+
+ SYSTEM_SETTINGS.add(Settings.System.FONT_SCALE);
+ SYSTEM_SETTINGS.add(Settings.System.STAY_ON_WHILE_PLUGGED_IN);
+ SYSTEM_SETTINGS.add(Settings.System.SCREEN_OFF_TIMEOUT);
+ SYSTEM_SETTINGS.add(Settings.System.SCREEN_BRIGHTNESS);
+ SYSTEM_SETTINGS.add(Settings.System.SCREEN_BRIGHTNESS_MODE);
+ SYSTEM_SETTINGS.add(Settings.System.TEXT_SHOW_PASSWORD);
+ SYSTEM_SETTINGS.add(Settings.System.HAPTIC_FEEDBACK_ENABLED);
+ SYSTEM_SETTINGS.add("power_sounds_enabled");
+ SYSTEM_SETTINGS.add("lockscreen_sounds_enabled");
+ SYSTEM_SETTINGS.add("pointer_speed");
+ SYSTEM_SETTINGS.add(Settings.System.VIBRATE_WHEN_RINGING);
+ SYSTEM_SETTINGS.add(Settings.System.ACCELEROMETER_ROTATION);
+ }
+
+ private BackupAdapter mAdapter;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
+ setContentView(R.layout.bua_main);
+ setPassFailButtonClickListeners();
+ setInfoResources(R.string.backup_accessibility_test, R.string.backup_accessibility_info, 0);
+
+ mAdapter = new BackupAdapter(this);
+ setListAdapter(mAdapter);
+
+ new ReadCurrentSettingsValuesTask().execute();
+
+ findViewById(R.id.generate_button).setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ new ReadCurrentSettingsValuesTask().execute();
+ }
+ });
+
+ findViewById(R.id.show_instructions_button).setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ showDialog(INSTRUCTIONS_DIALOG_ID);
+ }
+ });
+ }
+
+ class ReadCurrentSettingsValuesTask extends AsyncTask<Void, Void, List<BackupItem>> {
+
+ @Override
+ protected void onPreExecute() {
+ super.onPreExecute();
+ setProgressBarIndeterminateVisibility(true);
+ }
+
+ @Override
+ protected List<BackupItem> doInBackground(Void... params) {
+ List<BackupItem> items = new ArrayList<BackupItem>();
+
+ items.add(new CategoryBackupItem(R.string.bua_settings));
+ addSecureSettings(items, ACCESSIBILITY_SETTINGS);
+
+ items.add(new CategoryBackupItem(R.string.bua_settings_color_correction));
+ addSecureSettings(items, COLOR_CORRECTION_SETTINGS);
+
+ items.add(new CategoryBackupItem(R.string.bua_settings_captions));
+ addSecureSettings(items, CAPTIONS_SETTINGS);
+
+ items.add(new CategoryBackupItem(R.string.bua_settings_tts));
+ addSecureSettings(items, TTS_SETTINGS);
+
+ items.add(new CategoryBackupItem(R.string.bua_settings_accessibility_services));
+ addSecureSettings(items, ACCESSIBILITY_SERVICE_SETTINGS);
+
+ items.add(new CategoryBackupItem(R.string.bua_settings_system));
+ addSystemSettings(items, SYSTEM_SETTINGS);
+
+ return items;
+ }
+
+ private void addSecureSettings(List<BackupItem> items, List<String> settings) {
+ for (String setting : settings) {
+ String value = Settings.Secure.getString(getContentResolver(), setting);
+ items.add(new PreferenceBackupItem(setting, value));
+ }
+ }
+
+ private void addSystemSettings(List<BackupItem> items, List<String> settings) {
+ for (String setting : settings) {
+ String value = Settings.System.getString(getContentResolver(), setting);
+ items.add(new PreferenceBackupItem(setting, value));
+ }
+ }
+
+ @Override
+ protected void onPostExecute(List<BackupItem> result) {
+ super.onPostExecute(result);
+ setProgressBarIndeterminateVisibility(false);
+ mAdapter.clear();
+ mAdapter.addAll(result);
+ }
+ }
+
+ @Override
+ public Dialog onCreateDialog(int id, Bundle args) {
+ switch (id) {
+ case INSTRUCTIONS_DIALOG_ID:
+ return new AlertDialog.Builder(this)
+ .setIcon(android.R.drawable.ic_dialog_info)
+ .setTitle(R.string.backup_accessibility_test)
+ .setMessage(R.string.bua_instructions)
+ .setPositiveButton(android.R.string.ok, null)
+ .setNeutralButton(R.string.bu_settings, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ startActivity(new Intent(Settings.ACTION_PRIVACY_SETTINGS));
+ }
+ }).create();
+
+ default:
+ return super.onCreateDialog(id, args);
+ }
+ }
+
+ interface BackupItem {
+ int getViewType();
+ View getView(LayoutInflater inflater, int position, View convertView, ViewGroup parent);
+ }
+
+ static class CategoryBackupItem implements BackupItem {
+
+ private final int mTitleResId;
+
+ CategoryBackupItem(int titleResId) {
+ mTitleResId = titleResId;
+ }
+
+ @Override
+ public int getViewType() {
+ return 0;
+ }
+
+ @Override
+ public View getView(LayoutInflater inflater, int position, View convertView,
+ ViewGroup parent) {
+ TextView view = (TextView) convertView;
+ if (convertView == null) {
+ view = (TextView) inflater.inflate(R.layout.test_category_row, parent, false);
+ }
+ view.setText(mTitleResId);
+ view.setAllCaps(true);
+ view.setTextAppearance(1); // Bold
+ return view;
+ }
+ }
+
+ static class PreferenceBackupItem implements BackupItem {
+
+ private final String mName;
+ private final String mValue;
+
+ PreferenceBackupItem(String name, String value) {
+ mName = name;
+ mValue = value;
+ }
+
+ @Override
+ public int getViewType() {
+ if (mValue == null || mValue.equals("0")) {
+ return 1;
+ } else {
+ return 2;
+ }
+ }
+
+ @Override
+ public View getView(LayoutInflater inflater, int position, View convertView,
+ ViewGroup parent) {
+ TextView view = (TextView) convertView;
+ if (convertView == null) {
+ view = (TextView) inflater.inflate(R.layout.bu_preference_row, parent, false);
+ }
+ view.setText(mName + " : " + mValue);
+ if (mValue == null || mValue.equals("0")) {
+ view.setTextColor(Color.GREEN);
+ }
+ return view;
+ }
+ }
+
+ class BackupAdapter extends BaseAdapter {
+
+ private final LayoutInflater mLayoutInflater;
+
+ private final List<BackupItem> mItems = new ArrayList<BackupItem>();
+
+ public BackupAdapter(Context context) {
+ mLayoutInflater = (LayoutInflater) context.getSystemService(LAYOUT_INFLATER_SERVICE);
+ }
+
+ public void clear() {
+ mItems.clear();
+ }
+
+ public void addAll(List<BackupItem> items) {
+ mItems.addAll(items);
+ notifyDataSetChanged();
+ }
+
+ @Override
+ public int getCount() {
+ return mItems.size();
+ }
+
+ @Override
+ public BackupItem getItem(int position) {
+ return mItems.get(position);
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return position;
+ }
+
+ @Override
+ public boolean isEnabled(int position) {
+ return false;
+ }
+
+ @Override
+ public int getViewTypeCount() {
+ return 3;
+ }
+
+ @Override
+ public int getItemViewType(int position) {
+ return getItem(position).getViewType();
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ return getItem(position).getView(mLayoutInflater, position, convertView, parent);
+ }
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/CommandReceiverActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/CommandReceiverActivity.java
index c506d77..8636646 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/CommandReceiverActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/CommandReceiverActivity.java
@@ -39,11 +39,13 @@
public static final String COMMAND_SET_USER_RESTRICTION = "set-user_restriction";
public static final String COMMAND_DISALLOW_KEYGUARD_UNREDACTED_NOTIFICATIONS =
"disallow-keyguard-unredacted-notifications";
+ public static final String COMMAND_SET_AUTO_TIME_REQUIRED = "set-auto-time-required";
public static final String COMMAND_SET_GLOBAL_SETTING =
"set-global-setting";
public static final String COMMAND_SET_MAXIMUM_TO_LOCK = "set-maximum-time-to-lock";
public static final String COMMAND_SET_PASSWORD_QUALITY = "set-password-quality";
public static final String COMMAND_SET_KEYGUARD_DISABLED = "set-keyguard-disabled";
+ public static final String COMMAND_SET_LOCK_SCREEN_INFO = "set-lock-screen-info";
public static final String COMMAND_SET_STATUSBAR_DISABLED = "set-statusbar-disabled";
public static final String COMMAND_ALLOW_ONLY_SYSTEM_INPUT_METHODS =
"allow-only-system-input-methods";
@@ -92,6 +94,13 @@
mDpm.setKeyguardDisabledFeatures(mAdmin,
DevicePolicyManager.KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS);
} break;
+ case COMMAND_SET_AUTO_TIME_REQUIRED: {
+ mDpm.setAutoTimeRequired(mAdmin,
+ intent.getBooleanExtra(EXTRA_ENFORCED, false));
+ }
+ case COMMAND_SET_LOCK_SCREEN_INFO: {
+ mDpm.setDeviceOwnerLockScreenInfo(mAdmin, intent.getStringExtra(EXTRA_VALUE));
+ }
case COMMAND_SET_MAXIMUM_TO_LOCK: {
final long timeInSeconds = Long.parseLong(intent.getStringExtra(EXTRA_VALUE));
mDpm.setMaximumTimeToLock(mAdmin,
@@ -159,19 +168,32 @@
mDpm.clearUserRestriction(mAdmin, UserManager.DISALLOW_ADD_USER);
mDpm.clearUserRestriction(mAdmin, UserManager.DISALLOW_ADJUST_VOLUME);
mDpm.clearUserRestriction(mAdmin, UserManager.DISALLOW_CONFIG_BLUETOOTH);
+ mDpm.clearUserRestriction(mAdmin, UserManager.DISALLOW_CONFIG_CELL_BROADCASTS);
+ mDpm.clearUserRestriction(mAdmin, UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS);
+ mDpm.clearUserRestriction(mAdmin, UserManager.DISALLOW_CONFIG_TETHERING);
mDpm.clearUserRestriction(mAdmin, UserManager.DISALLOW_CONFIG_VPN);
mDpm.clearUserRestriction(mAdmin, UserManager.DISALLOW_CONFIG_WIFI);
mDpm.clearUserRestriction(mAdmin, UserManager.DISALLOW_DATA_ROAMING);
+ mDpm.clearUserRestriction(mAdmin, UserManager.DISALLOW_DEBUGGING_FEATURES);
+ mDpm.clearUserRestriction(mAdmin, UserManager.DISALLOW_FACTORY_RESET);
mDpm.clearUserRestriction(mAdmin, UserManager.DISALLOW_FUN);
+ mDpm.clearUserRestriction(mAdmin, UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES);
+ mDpm.clearUserRestriction(mAdmin, UserManager.DISALLOW_NETWORK_RESET);
+ mDpm.clearUserRestriction(mAdmin, UserManager.DISALLOW_OUTGOING_BEAM);
+ mDpm.clearUserRestriction(mAdmin, UserManager.DISALLOW_REMOVE_USER);
+ mDpm.setDeviceOwnerLockScreenInfo(mAdmin, null);
mDpm.setKeyguardDisabled(mAdmin, false);
+ mDpm.setAutoTimeRequired(mAdmin, false);
mDpm.setStatusBarDisabled(mAdmin, false);
}
private void clearProfileOwnerRelatedPolicies() {
mDpm.clearUserRestriction(mAdmin, UserManager.DISALLOW_APPS_CONTROL);
+ mDpm.clearUserRestriction(mAdmin, UserManager.DISALLOW_CONFIG_CREDENTIALS);
mDpm.clearUserRestriction(mAdmin, UserManager.DISALLOW_MODIFY_ACCOUNTS);
mDpm.clearUserRestriction(mAdmin, UserManager.DISALLOW_SHARE_LOCATION);
+ mDpm.clearUserRestriction(mAdmin, UserManager.DISALLOW_UNINSTALL_APPS);
mDpm.setKeyguardDisabledFeatures(mAdmin, 0);
mDpm.setPasswordQuality(mAdmin, 0);
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/IntentFiltersTestHelper.java b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/IntentFiltersTestHelper.java
index 58a1fef..0cf58f7 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/IntentFiltersTestHelper.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/IntentFiltersTestHelper.java
@@ -283,15 +283,9 @@
}
// Check for intents which can be forwarded to the managed profile.
- Intent intent = checkForIntentsNotHandled(forwardedIntentsFromPrimary,
- forwarderActivityInfo, true);
- if (intent != null) {
- Log.d(TAG, intent + " from primary profile should be forwarded to the " +
- "managed profile but is not.");
- return false;
- }
-
- return true;
+ return checkForIntentsNotHandled(forwardedIntentsFromPrimary,
+ forwarderActivityInfo, "from primary profile should be forwarded to the " +
+ "managed profile but is not.", true);
}
/**
@@ -307,25 +301,17 @@
return false;
}
+ boolean success = true;
// Check for intents which can be forwarded to the primary profile.
- Intent intent = checkForIntentsNotHandled(forwardedIntentsFromManaged,
- forwarderActivityInfo, true);
- if (intent != null) {
- Log.d(TAG, intent + " from managed profile should be forwarded to the " +
- "primary profile but is not.");
- return false;
- }
+ success &= checkForIntentsNotHandled(forwardedIntentsFromManaged,
+ forwarderActivityInfo, " from managed profile should be forwarded to the " +
+ "primary profile but is not.", true);
// Check for intents which cannot be forwarded to the primary profile.
- intent = checkForIntentsNotHandled(notForwardedIntentsFromManaged,
- forwarderActivityInfo, false);
- if (intent != null) {
- Log.d(TAG, intent + " from managed profile should not be forwarded to the " +
- "primary profile but it is.");
- return false;
- }
-
- return true;
+ success &= checkForIntentsNotHandled(notForwardedIntentsFromManaged,
+ forwarderActivityInfo, "from managed profile should not be forwarded to the " +
+ "primary profile but it is.", false);
+ return success;
}
/**
@@ -365,17 +351,18 @@
/**
* Checks if the intents passed are correctly handled.
- * @return {@code null} if all the intents are correctly handled
- * otherwise, the first intent in the list which is not handled correctly.
+ * @return {@code false} if at least one intent is not handled correctly.
*/
- private Intent checkForIntentsNotHandled(ArrayList<Intent> intentList,
- ActivityInfo expectedForwarderActivityInfo, boolean canResolve) {
+ private boolean checkForIntentsNotHandled(ArrayList<Intent> intentList,
+ ActivityInfo expectedForwarderActivityInfo, String errorMessage, boolean canResolve) {
+ boolean success = true;
for (Intent intent : intentList) {
if (canForwarderActivityHandleIntent(intent,
expectedForwarderActivityInfo) != canResolve) {
- return intent;
+ Log.e(TAG, intent + " " + errorMessage);
+ success = false;
}
}
- return null;
+ return success;
}
}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/PolicyTransparencyTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/PolicyTransparencyTestActivity.java
index f190a2d..9261284 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/PolicyTransparencyTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/PolicyTransparencyTestActivity.java
@@ -49,8 +49,10 @@
"com.android.cts.verifier.managedprovisioning.extra.TEST";
public static final String TEST_CHECK_USER_RESTRICTION = "check-user-restriction";
+ public static final String TEST_CHECK_AUTO_TIME_REQUIRED = "check-auto-time-required";
public static final String TEST_CHECK_KEYGURAD_UNREDACTED_NOTIFICATION =
"check-keyguard-unredacted-notification";
+ public static final String TEST_CHECK_LOCK_SCREEN_INFO = "check-lock-screen-info";
public static final String TEST_CHECK_MAXIMUM_TIME_TO_LOCK = "check-maximum-time-to-lock";
public static final String TEST_CHECK_PASSWORD_QUALITY = "check-password-quality";
public static final String TEST_CHECK_PERMITTED_ACCESSIBILITY_SERVICE =
@@ -66,12 +68,24 @@
private static final Map<String, PolicyTestItem> POLICY_TEST_ITEMS = new ArrayMap<>();
static {
+ POLICY_TEST_ITEMS.put(TEST_CHECK_AUTO_TIME_REQUIRED, new PolicyTestItem(
+ R.string.auto_time_required_set_step,
+ R.string.set_auto_time_required_action,
+ R.string.set_auto_time_required_widget_label,
+ R.id.switch_widget,
+ CommandReceiverActivity.COMMAND_SET_AUTO_TIME_REQUIRED));
POLICY_TEST_ITEMS.put(TEST_CHECK_KEYGURAD_UNREDACTED_NOTIFICATION, new PolicyTestItem(
R.string.disallow_keyguard_unredacted_notifications_set_step,
R.string.disallow_keyguard_unredacted_notifications_action,
R.string.disallow_keyguard_unredacted_notifications_widget_label,
R.id.switch_widget,
CommandReceiverActivity.COMMAND_DISALLOW_KEYGUARD_UNREDACTED_NOTIFICATIONS));
+ POLICY_TEST_ITEMS.put(TEST_CHECK_LOCK_SCREEN_INFO, new PolicyTestItem(
+ R.string.lock_screen_info_set_step,
+ R.string.set_lock_screen_info_action,
+ R.string.set_lock_screen_info_widget_label,
+ R.id.edit_text_widget,
+ CommandReceiverActivity.COMMAND_SET_LOCK_SCREEN_INFO));
POLICY_TEST_ITEMS.put(TEST_CHECK_MAXIMUM_TIME_TO_LOCK, new PolicyTestItem(
R.string.maximum_time_to_lock_set_step,
R.string.set_maximum_time_to_lock_action,
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/PolicyTransparencyTestListActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/PolicyTransparencyTestListActivity.java
index e613bf3..88f4f18 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/PolicyTransparencyTestListActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/PolicyTransparencyTestListActivity.java
@@ -44,21 +44,27 @@
private static final Pair<Intent, Integer>[] POLICIES;
static {
final String[] policyTests = new String[] {
+ PolicyTransparencyTestActivity.TEST_CHECK_AUTO_TIME_REQUIRED,
PolicyTransparencyTestActivity.TEST_CHECK_KEYGURAD_UNREDACTED_NOTIFICATION,
+ PolicyTransparencyTestActivity.TEST_CHECK_LOCK_SCREEN_INFO,
PolicyTransparencyTestActivity.TEST_CHECK_MAXIMUM_TIME_TO_LOCK,
PolicyTransparencyTestActivity.TEST_CHECK_PASSWORD_QUALITY,
PolicyTransparencyTestActivity.TEST_CHECK_PERMITTED_ACCESSIBILITY_SERVICE,
PolicyTransparencyTestActivity.TEST_CHECK_PERMITTED_INPUT_METHOD
};
final String[] settingsIntentActions = new String[] {
+ Settings.ACTION_DATE_SETTINGS,
Settings.ACTION_SETTINGS,
+ Settings.ACTION_SECURITY_SETTINGS,
Settings.ACTION_DISPLAY_SETTINGS,
DevicePolicyManager.ACTION_SET_NEW_PASSWORD,
Settings.ACTION_ACCESSIBILITY_SETTINGS,
Settings.ACTION_INPUT_METHOD_SETTINGS
};
final int[] policyLabels = new int[] {
+ R.string.set_auto_time_required,
R.string.disallow_keyguard_unredacted_notifications,
+ R.string.set_lock_screen_info,
R.string.set_maximum_time_to_lock,
R.string.set_password_quality,
R.string.set_permitted_accessibility_services,
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/UserRestrictions.java b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/UserRestrictions.java
index 7db1cd9..06d0381 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/UserRestrictions.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/UserRestrictions.java
@@ -31,10 +31,21 @@
UserManager.DISALLOW_ADD_USER,
UserManager.DISALLOW_ADJUST_VOLUME,
UserManager.DISALLOW_APPS_CONTROL,
+ UserManager.DISALLOW_CONFIG_CELL_BROADCASTS,
+ UserManager.DISALLOW_CONFIG_CREDENTIALS,
+ UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS,
+ UserManager.DISALLOW_CONFIG_TETHERING,
UserManager.DISALLOW_CONFIG_WIFI,
+ UserManager.DISALLOW_DEBUGGING_FEATURES,
+ UserManager.DISALLOW_FACTORY_RESET,
UserManager.DISALLOW_FUN,
+ UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES,
UserManager.DISALLOW_MODIFY_ACCOUNTS,
- UserManager.DISALLOW_SHARE_LOCATION
+ UserManager.DISALLOW_NETWORK_RESET,
+ UserManager.DISALLOW_OUTGOING_BEAM,
+ UserManager.DISALLOW_REMOVE_USER,
+ UserManager.DISALLOW_SHARE_LOCATION,
+ UserManager.DISALLOW_UNINSTALL_APPS
};
private static final ArrayMap<String, UserRestrictionItem> USER_RESTRICTION_ITEMS;
@@ -43,30 +54,63 @@
R.string.disallow_add_user,
R.string.disallow_adjust_volume,
R.string.disallow_apps_control,
+ R.string.disallow_config_cell_broadcasts,
+ R.string.disallow_config_credentials,
+ R.string.disallow_config_mobile_networks,
+ R.string.disallow_config_tethering,
R.string.disallow_config_wifi,
+ R.string.disallow_debugging_features,
+ R.string.disallow_factory_reset,
R.string.disallow_fun,
+ R.string.disallow_install_unknown_sources,
R.string.disallow_modify_accounts,
+ R.string.disallow_network_reset,
+ R.string.disallow_outgoing_beam,
+ R.string.disallow_remove_user,
R.string.disallow_share_location,
+ R.string.disallow_uninstall_apps
};
final int[] restrictionActions = new int[] {
R.string.disallow_add_user_action,
R.string.disallow_adjust_volume_action,
R.string.disallow_apps_control_action,
+ R.string.disallow_config_cell_broadcasts_action,
+ R.string.disallow_config_credentials_action,
+ R.string.disallow_config_mobile_networks_action,
+ R.string.disallow_config_tethering_action,
R.string.disallow_config_wifi_action,
+ R.string.disallow_debugging_features_action,
+ R.string.disallow_factory_reset_action,
R.string.disallow_fun_action,
+ R.string.disallow_install_unknown_sources_action,
R.string.disallow_modify_accounts_action,
- R.string.disallow_share_location_action
+ R.string.disallow_network_reset_action,
+ R.string.disallow_outgoing_beam_action,
+ R.string.disallow_remove_user_action,
+ R.string.disallow_share_location_action,
+ R.string.disallow_uninstall_apps_action
};
final String[] settingsIntentActions = new String[] {
Settings.ACTION_SETTINGS,
Settings.ACTION_SOUND_SETTINGS,
Settings.ACTION_APPLICATION_SETTINGS,
+ Settings.ACTION_SOUND_SETTINGS,
+ Settings.ACTION_SECURITY_SETTINGS,
+ Settings.ACTION_WIRELESS_SETTINGS,
+ Settings.ACTION_WIRELESS_SETTINGS,
Settings.ACTION_WIFI_SETTINGS,
Settings.ACTION_DEVICE_INFO_SETTINGS,
+ Settings.ACTION_PRIVACY_SETTINGS,
+ Settings.ACTION_DEVICE_INFO_SETTINGS,
+ Settings.ACTION_SECURITY_SETTINGS,
Settings.ACTION_SYNC_SETTINGS,
- Settings.ACTION_LOCATION_SOURCE_SETTINGS
+ Settings.ACTION_PRIVACY_SETTINGS,
+ Settings.ACTION_WIRELESS_SETTINGS,
+ Settings.ACTION_SETTINGS,
+ Settings.ACTION_LOCATION_SOURCE_SETTINGS,
+ Settings.ACTION_APPLICATION_SETTINGS,
};
if (RESTRICTION_IDS.length != restrictionLabels.length
@@ -88,6 +132,7 @@
new ArrayList<String>();
static {
ALSO_VALID_FOR_PO.add(UserManager.DISALLOW_APPS_CONTROL);
+ ALSO_VALID_FOR_PO.add(UserManager.DISALLOW_UNINSTALL_APPS);
ALSO_VALID_FOR_PO.add(UserManager.DISALLOW_MODIFY_ACCOUNTS);
ALSO_VALID_FOR_PO.add(UserManager.DISALLOW_SHARE_LOCATION);
}
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 2dfc7c8..e1cba262 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SignificantMotionTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SignificantMotionTestActivity.java
@@ -296,7 +296,9 @@
@Override
protected void onDestroy() {
super.onDestroy();
- mScreenManipulator.close();
+ if (mScreenManipulator != null){
+ mScreenManipulator.close();
+ }
}
/**
diff --git a/common/device-side/test-app/run_tests.sh b/common/device-side/test-app/run_tests.sh
index fa5f553..5640260 100755
--- a/common/device-side/test-app/run_tests.sh
+++ b/common/device-side/test-app/run_tests.sh
@@ -17,7 +17,7 @@
CTS_DIR=$(dirname ${0})/../../..
source ${CTS_DIR}/test_defs.sh
-if [ `adb devices | wc -l` -lt 2 ]; then
+if [ `adb devices | wc -l` -lt 3 ]; then
echo "NO DEVICES/EMULATORS AVAILABLE. CONNECT ONE."
exit 1
fi
diff --git a/common/host-side/tradefed/res/config/common-compatibility-config.xml b/common/host-side/tradefed/res/config/common-compatibility-config.xml
index 5bac748..7f3f76a 100644
--- a/common/host-side/tradefed/res/config/common-compatibility-config.xml
+++ b/common/host-side/tradefed/res/config/common-compatibility-config.xml
@@ -14,11 +14,9 @@
limitations under the License.
-->
<configuration description="Common config for Compatibility suites">
-
<device_recovery class="com.android.tradefed.device.WaitDeviceRecovery" />
<build_provider class="com.android.compatibility.common.tradefed.build.CompatibilityBuildProvider" />
<test class="com.android.compatibility.common.tradefed.testtype.CompatibilityTest" />
<logger class="com.android.tradefed.log.FileLogger" />
<result_reporter class="com.android.compatibility.common.tradefed.result.ResultReporter" />
-
</configuration>
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/build/CompatibilityBuildProvider.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/build/CompatibilityBuildProvider.java
index 65f60bd..7f84a3a 100644
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/build/CompatibilityBuildProvider.java
+++ b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/build/CompatibilityBuildProvider.java
@@ -18,21 +18,29 @@
import com.android.tradefed.build.BuildInfo;
import com.android.tradefed.build.IBuildInfo;
import com.android.tradefed.build.IBuildProvider;
+import com.android.tradefed.config.Option;
import com.android.tradefed.config.OptionClass;
-
/**
* A simple {@link IBuildProvider} that uses a pre-existing Compatibility install.
*/
@OptionClass(alias="compatibility-build-provider")
public class CompatibilityBuildProvider implements IBuildProvider {
+ @Option(name="branch", description="build branch name to supply.")
+ private String mBranch = null;
+
/**
* {@inheritDoc}
*/
@Override
public IBuildInfo getBuild() {
// Create a blank BuildInfo which will get populated later.
- return new BuildInfo();
+ IBuildInfo ctsBuild = new BuildInfo();
+ if (mBranch != null) {
+ ctsBuild.setBuildBranch(mBranch);
+ }
+
+ return ctsBuild;
}
/**
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/ResultReporter.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/ResultReporter.java
index 8e48cdb..d63e09c 100644
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/ResultReporter.java
+++ b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/ResultReporter.java
@@ -69,7 +69,7 @@
ITestSummaryListener {
private static final String RESULT_KEY = "COMPATIBILITY_TEST_RESULT";
- private static final String DEVICE_INFO = "DEVICE_INFO_";
+ private static final String BUILD_INFO = "build_";
private static final String[] RESULT_RESOURCES = {
"compatibility_result.css",
"compatibility_result.xsd",
@@ -196,6 +196,7 @@
public void testStarted(TestIdentifier test) {
mCurrentCaseResult = mCurrentModuleResult.getOrCreateResult(test.getClassName());
mCurrentResult = mCurrentCaseResult.getOrCreateResult(test.getTestName());
+ mCurrentResult.reset();
}
/**
@@ -204,6 +205,7 @@
@Override
public void testEnded(TestIdentifier test, Map<String, String> metrics) {
if (mCurrentResult.getResultStatus() == TestStatus.FAIL) {
+ logResult("%s has already failed", test);
// Test has already failed.
return;
}
@@ -230,8 +232,8 @@
*/
@Override
public void testIgnored(TestIdentifier test) {
+ mCurrentResult.notExecuted();
logResult("%s ignored", test);
- // ignore
}
/**
@@ -248,7 +250,7 @@
*/
@Override
public void testAssumptionFailure(TestIdentifier test, String trace) {
- mCurrentResult.failed(trace);
+ mCurrentResult.notExecuted();
logResult("%s failed assumption: %s", test, trace);
}
@@ -270,8 +272,8 @@
// Get device info from build attributes
for (Entry<String, String> entry : mBuild.getBuildAttributes().entrySet()) {
String key = entry.getKey();
- if (key.startsWith(DEVICE_INFO)) {
- mResult.addBuildInfo(key.substring(DEVICE_INFO.length()), entry.getValue());
+ if (key.startsWith(BUILD_INFO)) {
+ mResult.addBuildInfo(key, entry.getValue());
}
}
mCurrentModuleResult.addRuntime(elapsedTime);
@@ -342,7 +344,12 @@
}
}
if (mResultServer != null && !mResultServer.trim().isEmpty()) {
- mUploader.uploadResult(resultFile, mReferenceUrl);
+ try {
+ logResult("Result Server Response: %d",
+ mUploader.uploadResult(resultFile, mReferenceUrl));
+ } catch (IOException ioe) {
+ Log.e(mDeviceSerial, ioe);
+ }
}
} catch (IOException | XmlPullParserException e) {
CLog.e(e);
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/DeviceInfoCollector.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/DeviceInfoCollector.java
index 6cf1ff7..0178bab 100644
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/DeviceInfoCollector.java
+++ b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/DeviceInfoCollector.java
@@ -39,8 +39,6 @@
*/
public class DeviceInfoCollector extends ApkInstrumentationPreparer {
- private static final String LOG_TAG = "DeviceInfoCollector";
- private static final String DEVICE_INFO = "DEVICE_INFO_%s";
private static final Map<String, String> BUILD_KEYS = new HashMap<>();
static {
BUILD_KEYS.put("build_id", "ro.build.id");
@@ -86,7 +84,7 @@
return;
}
for (Entry<String, String> entry : BUILD_KEYS.entrySet()) {
- buildInfo.addBuildAttribute(String.format(DEVICE_INFO, entry.getKey()),
+ buildInfo.addBuildAttribute(entry.getKey(),
ArrayUtil.join(",", device.getProperty(entry.getValue())));
}
run(device, buildInfo);
@@ -106,7 +104,7 @@
}
resultDir.mkdirs();
if (!resultDir.isDirectory()) {
- CLog.e(LOG_TAG, String.format("% is not a directory", resultDir.getAbsolutePath()));
+ CLog.e("%s is not a directory", resultDir.getAbsolutePath());
return;
}
String resultPath = resultDir.getAbsolutePath();
@@ -121,10 +119,11 @@
try {
Process p = Runtime.getRuntime().exec(new String[] {"/bin/bash", "-c", command});
if (p.waitFor() != 0) {
- CLog.e(LOG_TAG, String.format("Failed to run %s", command));
+ CLog.e("Failed to run %s", command);
}
} catch (Exception e) {
- CLog.e(LOG_TAG, e);
+ CLog.e("Caught exception during pull.");
+ CLog.e(e);
}
}
-}
\ No newline at end of file
+}
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/DynamicConfigPusher.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/DynamicConfigPusher.java
index fabc4e1..1a4be53 100644
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/DynamicConfigPusher.java
+++ b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/DynamicConfigPusher.java
@@ -51,16 +51,19 @@
private static final String LOG_TAG = DynamicConfigPusher.class.getSimpleName();
- @Option(name = "cleanup", description = "Whether to clean up config files after test is done.")
+ @Option(name = "cleanup", description = "Whether to remove config files from the test " +
+ "target after test completion.")
private boolean mCleanup = true;
- @Option(name="module-name", description = "Specify the module name")
+ @Option(name="config-filename", description = "The module name for module-level " +
+ "configurations, or the suite name for suite-level configurations")
private String mModuleName;
- @Option(name = "target", description = "Specify the target, 'device' or 'host'")
+ @Option(name = "target", description = "The test target, \"device\" or \"host\"")
private TestTarget mTarget;
- @Option(name = "version-name", description = "Specify the version for override config")
+ @Option(name = "version", description = "The version of the configuration to retrieve " +
+ "from the server, e.g. \"1\"")
private static String mVersion;
@@ -93,16 +96,16 @@
if (originUrl != null) {
try {
String requestUrl = originUrl
- .replace("{module-name}", mModuleName).replace("{version-name}", mVersion);
+ .replace("{module}", mModuleName).replace("{version}", mVersion);
java.net.URL request = new URL(requestUrl);
apfeConfigInJson = StreamUtil.getStringFromStream(request.openStream());
} catch (IOException e) {
LogUtil.printLog(Log.LogLevel.WARN, LOG_TAG,
- "Cannot download and parse json config from Url");
+ "Cannot download and parse json config from URL");
}
} else {
LogUtil.printLog(Log.LogLevel.INFO, LOG_TAG,
- "Dynamic config override Url is not set");
+ "Dynamic config override URL is not set, using local configuration values");
}
File src = null;
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/ResultFilePuller.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/ResultFilePuller.java
index 7b20997d..432f223 100644
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/ResultFilePuller.java
+++ b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/ResultFilePuller.java
@@ -37,8 +37,6 @@
@OptionClass(alias="result-file-puller")
public class ResultFilePuller implements ITargetCleaner {
- private static final String LOG_TAG = ResultFilePuller.class.getSimpleName();
-
@Option(name="clear", description = "Whether to clear the src files and dirs before running the test")
private boolean mClearSrc = true;
@@ -85,7 +83,7 @@
}
resultDir.mkdirs();
if (!resultDir.isDirectory()) {
- CLog.e(LOG_TAG, String.format("% is not a directory", resultDir.getAbsolutePath()));
+ CLog.e("%s is not a directory", resultDir.getAbsolutePath());
return;
}
String resultPath = resultDir.getAbsolutePath();
@@ -105,10 +103,11 @@
try {
Process p = Runtime.getRuntime().exec(new String[] {"/bin/bash", "-c", command});
if (p.waitFor() != 0) {
- CLog.e(LOG_TAG, String.format("Failed to run %s", command));
+ CLog.e("Failed to run %s", command);
}
} catch (Exception e) {
- CLog.e(LOG_TAG, e);
+ CLog.e("Caught exception during pull.");
+ CLog.e(e);
}
}
}
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/CompatibilityTest.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/CompatibilityTest.java
index 17ce7e8..26d9cb2d 100644
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/CompatibilityTest.java
+++ b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/CompatibilityTest.java
@@ -166,7 +166,12 @@
description = "Take a screenshot on every test failure.")
private boolean mScreenshotOnFailure = false;
+ @Option(name = "reboot-on-failure",
+ description = "Reboot the device after every test failure.")
+ private boolean mRebootOnFailure = false;
+
private int mTotalShards;
+ private IModuleRepo mModuleRepo;
private ITestDevice mDevice;
private IBuildInfo mBuild;
private CompatibilityBuildHelper mBuildHelper;
@@ -176,19 +181,20 @@
* modules.
*/
public CompatibilityTest() {
- this(1 /* totalShards */);
+ this(1 /* totalShards */, new ModuleRepo());
}
/**
* Create a new {@link CompatibilityTest} that will run a sublist of
* modules.
*/
- public CompatibilityTest(int totalShards) {
+ public CompatibilityTest(int totalShards, IModuleRepo moduleRepo) {
if (totalShards < 1) {
throw new IllegalArgumentException(
"Must be at least 1 shard. Given:" + totalShards);
}
mTotalShards = totalShards;
+ mModuleRepo = moduleRepo;
}
/**
@@ -222,27 +228,24 @@
*/
@Override
public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
- boolean isInitializer = false;
try {
- IModuleRepo moduleRepo = ModuleRepo.getInstance();
// Synchronized so only one shard enters and sets up the moduleRepo. When the other
// shards enter after this, moduleRepo is already initialized so they dont do anything
- synchronized (moduleRepo) {
- if (!moduleRepo.isInitialized()) {
- isInitializer = true;
+ synchronized (mModuleRepo) {
+ if (!mModuleRepo.isInitialized()) {
setupFilters();
// Initialize the repository, {@link CompatibilityBuildHelper#getTestsDir} can
// throw a {@link FileNotFoundException}
- moduleRepo.initialize(mTotalShards, mBuildHelper.getTestsDir(), getAbis(),
+ mModuleRepo.initialize(mTotalShards, mBuildHelper.getTestsDir(), getAbis(),
mDeviceTokens, mTestArgs, mModuleArgs, mIncludeFilters,
mExcludeFilters, mBuild);
}
}
// Get the tests to run in this shard
- List<IModuleDef> modules = moduleRepo.getModules(getDevice().getSerialNumber());
+ List<IModuleDef> modules = mModuleRepo.getModules(getDevice().getSerialNumber());
listener = new FailureListener(listener, getDevice(), mBugReportOnFailure,
- mLogcatOnFailure, mScreenshotOnFailure);
+ mLogcatOnFailure, mScreenshotOnFailure, mRebootOnFailure);
int moduleCount = modules.size();
CLog.logAndDisplay(LogLevel.INFO, "Starting %d module%s on %s", moduleCount,
(moduleCount > 1) ? "s" : "", mDevice.getSerialNumber());
@@ -273,10 +276,6 @@
}
} catch (FileNotFoundException fnfe) {
throw new RuntimeException("Failed to initialize modules", fnfe);
- } finally {
- if (isInitializer) {
- ModuleRepo.tearDown();
- }
}
}
@@ -346,6 +345,10 @@
}
}
}
+ if (mIncludeFilters.isEmpty()) {
+ throw new IllegalArgumentException(String.format(
+ "No tests to retry in session %d", mRetrySessionId));
+ }
} else if (mModuleName != null) {
mIncludeFilters.clear();
try {
@@ -401,7 +404,7 @@
List<IRemoteTest> shardQueue = new LinkedList<>();
for (int i = 0; i < mShards; i++) {
- CompatibilityTest test = new CompatibilityTest(mShards);
+ CompatibilityTest test = new CompatibilityTest(mShards, mModuleRepo);
OptionCopier.copyOptionsNoThrow(this, test);
// Set the shard count because the copy option on the previous line
// copies over the mShard value
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/FailureListener.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/FailureListener.java
index c3509d1..5d2cd38 100644
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/FailureListener.java
+++ b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/FailureListener.java
@@ -33,14 +33,17 @@
private boolean mBugReportOnFailure;
private boolean mLogcatOnFailure;
private boolean mScreenshotOnFailure;
+ private boolean mRebootOnFailure;
public FailureListener(ITestInvocationListener listener, ITestDevice device,
- boolean bugReportOnFailure, boolean logcatOnFailure, boolean screenshotOnFailure) {
+ boolean bugReportOnFailure, boolean logcatOnFailure, boolean screenshotOnFailure,
+ boolean rebootOnFailure) {
super(listener);
mDevice = device;
mBugReportOnFailure = bugReportOnFailure;
mLogcatOnFailure = logcatOnFailure;
mScreenshotOnFailure = screenshotOnFailure;
+ mRebootOnFailure = rebootOnFailure;
}
/**
@@ -76,6 +79,22 @@
mDevice.getSerialNumber());
}
}
+ if (mRebootOnFailure) {
+ try {
+ // Rebooting on all failures can hide legitimate issues and platform instabilities,
+ // therefore only allowed on "user-debug" and "eng" builds.
+ if ("user".equals(mDevice.getProperty("ro.build.type"))) {
+ CLog.e("Reboot-on-failure should only be used during development," +
+ " this is a\" user\" build device");
+ } else {
+ mDevice.reboot();
+ }
+ } catch (DeviceNotAvailableException e) {
+ CLog.e(e);
+ CLog.e("Device %s became unavailable while rebooting",
+ mDevice.getSerialNumber());
+ }
+ }
}
}
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/ModuleRepo.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/ModuleRepo.java
index b438dff..9d57b8d 100644
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/ModuleRepo.java
+++ b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/ModuleRepo.java
@@ -57,8 +57,6 @@
private static final long SMALL_TEST = TimeUnit.MINUTES.toMillis(2); // Small tests < 2mins
private static final long MEDIUM_TEST = TimeUnit.MINUTES.toMillis(10); // Medium tests < 10mins
- static IModuleRepo sInstance;
-
private int mShards;
private int mModulesPerShard;
private int mSmallModulesPerShard;
@@ -85,17 +83,6 @@
// Holds all the tests with tokens waiting to be run. Meaning the DUT must have a specific token.
private List<IModuleDef> mTokenModules = new ArrayList<>();
- public static IModuleRepo getInstance() {
- if (sInstance == null) {
- sInstance = new ModuleRepo();
- }
- return sInstance;
- }
-
- public static void tearDown() {
- sInstance = null;
- }
-
/**
* {@inheritDoc}
*/
@@ -195,6 +182,10 @@
public void initialize(int shards, File testsDir, Set<IAbi> abis, List<String> deviceTokens,
List<String> testArgs, List<String> moduleArgs, List<String> includeFilters,
List<String> excludeFilters, IBuildInfo buildInfo) {
+ CLog.d("Initializing ModuleRepo\nShards:%d\nTests Dir:%s\nABIs:%s\nDevice Tokens:%s\n" +
+ "Test Args:%s\nModule Args:%s\nIncludes:%s\nExcludes:%s",
+ shards, testsDir.getAbsolutePath(), abis, deviceTokens, testArgs, moduleArgs,
+ includeFilters, excludeFilters);
mInitialized = true;
mShards = shards;
for (String line : deviceTokens) {
@@ -222,6 +213,10 @@
addFilters(excludeFilters, mExcludeFilters, abis);
File[] configFiles = testsDir.listFiles(new ConfigFilter());
+ if (configFiles.length == 0) {
+ throw new IllegalArgumentException(
+ String.format("No config files found in %s", testsDir.getAbsolutePath()));
+ }
for (File configFile : configFiles) {
final String name = configFile.getName().replace(CONFIG_EXT, "");
final String[] pathArg = new String[] { configFile.getAbsolutePath() };
@@ -382,6 +377,7 @@
*/
@Override
public boolean accept(File dir, String name) {
+ CLog.d("%s/%s", dir.getAbsolutePath(), name);
return name.endsWith(CONFIG_EXT);
}
}
@@ -519,7 +515,7 @@
if (value1 == 0 && value2 == 0) {
return (int) Math.signum(def2.getRuntimeHint() - def1.getRuntimeHint());
}
- return (int) Math.signum(value2 - value1);
+ return (int) Math.signum(value1 - value2);
}
}
}
diff --git a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/ModuleRepoTest.java b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/ModuleRepoTest.java
index 4944f3a..c691abd 100644
--- a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/ModuleRepoTest.java
+++ b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/ModuleRepoTest.java
@@ -99,8 +99,7 @@
@Override
public void setUp() throws Exception {
mTestsDir = setUpConfigs();
- ModuleRepo.sInstance = null;// Clear the instance so it gets recreated.
- mRepo = ModuleRepo.getInstance();
+ mRepo = new ModuleRepo();
mBuild = new CompatibilityBuildProvider().getBuild();
}
diff --git a/common/util/src/com/android/compatibility/common/util/DynamicConfig.java b/common/util/src/com/android/compatibility/common/util/DynamicConfig.java
index 18c5d26..8317203 100644
--- a/common/util/src/com/android/compatibility/common/util/DynamicConfig.java
+++ b/common/util/src/com/android/compatibility/common/util/DynamicConfig.java
@@ -35,8 +35,6 @@
*/
public class DynamicConfig {
- public final static String MODULE_NAME = "module-name";
-
//XML constant
public static final String NS = null;
public static final String CONFIG_TAG = "dynamicConfig";
@@ -57,7 +55,12 @@
}
public String getValue(String key) {
- return mDynamicConfigMap.get(key).get(0);
+ List<String> singleValue = mDynamicConfigMap.get(key);
+ if (singleValue == null || singleValue.size() == 0 || singleValue.size() > 1) {
+ // key must exist in the map, and map to a list containing exactly one string
+ return null;
+ }
+ return singleValue.get(0);
}
public List<String> getValues(String key) {
diff --git a/common/util/src/com/android/compatibility/common/util/ITestResult.java b/common/util/src/com/android/compatibility/common/util/ITestResult.java
index f27cf48..701a629 100644
--- a/common/util/src/com/android/compatibility/common/util/ITestResult.java
+++ b/common/util/src/com/android/compatibility/common/util/ITestResult.java
@@ -118,6 +118,11 @@
void passed(ReportLog report);
/**
+ * Report that the test was not executed.
+ */
+ void notExecuted();
+
+ /**
* Resets the result.
*/
void reset();
diff --git a/common/util/src/com/android/compatibility/common/util/MultipartForm.java b/common/util/src/com/android/compatibility/common/util/MultipartForm.java
index 4ae7860..c311492 100644
--- a/common/util/src/com/android/compatibility/common/util/MultipartForm.java
+++ b/common/util/src/com/android/compatibility/common/util/MultipartForm.java
@@ -77,21 +77,19 @@
*
* This will handle a redirection from the server.
*
+ * @return response code
* @throws IOException
*/
- public void submit() throws IOException {
- String redirectUrl = submitForm(mServerUrl);
- if (redirectUrl != null) {
- submitForm(redirectUrl);
- }
+ public int submit() throws IOException {
+ return submitForm(mServerUrl);
}
/**
* @param serverUrl to post the data to
- * @return a url if the server redirected to another url
+ * @return response code
* @throws IOException
*/
- private String submitForm(String serverUrl) throws IOException {
+ private int submitForm(String serverUrl) throws IOException {
HttpURLConnection connection = null;
try {
URL url = new URL(serverUrl);
@@ -116,16 +114,16 @@
InputStream input = connection.getInputStream();
input.close();
- if (connection.getResponseCode() == 302) {
- return connection.getHeaderField("Location");
+ int response = connection.getResponseCode();
+ if (response == 302) {
+ return submitForm(connection.getHeaderField("Location"));
}
+ return response;
} finally {
if (connection != null) {
connection.disconnect();
}
}
-
- return null;
}
/* package */ byte[] getContentBody() throws IOException {
diff --git a/common/util/src/com/android/compatibility/common/util/ResultUploader.java b/common/util/src/com/android/compatibility/common/util/ResultUploader.java
index ff8d156..e279333 100644
--- a/common/util/src/com/android/compatibility/common/util/ResultUploader.java
+++ b/common/util/src/com/android/compatibility/common/util/ResultUploader.java
@@ -44,15 +44,15 @@
* @param referenceUrl A reference url to use.
* @throws IOException
*/
- public void uploadResult(File reportFile, String referenceUrl) throws IOException {
+ public int uploadResult(File reportFile, String referenceUrl) throws IOException {
InputStream input = new FileInputStream(reportFile);
try {
byte[] data = getBytes(input);
- mMultipartForm.addFormFile("result-xml", "test-result.xml.gz", data);
+ mMultipartForm.addFormFile("resultXml", "test-result.xml.gz", data);
if (referenceUrl == null || referenceUrl.trim().isEmpty()) {
mMultipartForm.addFormValue("reference-url", referenceUrl);
}
- mMultipartForm.submit();
+ return mMultipartForm.submit();
} finally {
input.close();
}
diff --git a/common/util/src/com/android/compatibility/common/util/TestResult.java b/common/util/src/com/android/compatibility/common/util/TestResult.java
index 03aaca29..1bda3af 100644
--- a/common/util/src/com/android/compatibility/common/util/TestResult.java
+++ b/common/util/src/com/android/compatibility/common/util/TestResult.java
@@ -200,6 +200,14 @@
* {@inheritDoc}
*/
@Override
+ public void notExecuted() {
+ setResultStatus(TestStatus.NOT_EXECUTED);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
public void reset() {
mResult = TestStatus.NOT_EXECUTED;
mMessage = null;
diff --git a/hostsidetests/aadb/src/android/aadb/cts/TestDeviceFuncTest.java b/hostsidetests/aadb/src/android/aadb/cts/TestDeviceFuncTest.java
index ddc3e82..6a77674 100644
--- a/hostsidetests/aadb/src/android/aadb/cts/TestDeviceFuncTest.java
+++ b/hostsidetests/aadb/src/android/aadb/cts/TestDeviceFuncTest.java
@@ -16,7 +16,6 @@
package android.aadb.cts;
import com.android.ddmlib.IDevice;
-import com.android.ddmlib.Log;
import com.android.ddmlib.testrunner.RemoteAndroidTestRunner;
import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.device.IFileEntry;
@@ -49,7 +48,6 @@
*/
public class TestDeviceFuncTest extends DeviceTestCase {
- private static final String LOG_TAG = "TestDeviceFuncTest";
private ITestDevice mTestDevice;
/** Expect bugreports to be at least a meg. */
private static final int mMinBugreportBytes = 1024 * 1024;
@@ -78,7 +76,7 @@
* Do a 'shell ls' command, and verify /data and /system are listed in result.
*/
public void testExecuteShellCommand() throws IOException, DeviceNotAvailableException {
- Log.i(LOG_TAG, "testExecuteShellCommand");
+ CLog.i("testExecuteShellCommand");
assertSimpleShellCommand();
}
@@ -97,7 +95,7 @@
* Push and then pull a file from device, and verify contents are as expected.
*/
public void testPushPull_normal() throws IOException, DeviceNotAvailableException {
- Log.i(LOG_TAG, "testPushPull");
+ CLog.i("testPushPull");
File tmpFile = null;
File tmpDestFile = null;
String deviceFilePath = null;
@@ -133,7 +131,7 @@
* This variant of the test uses "${EXTERNAL_STORAGE}" in the pathname.
*/
public void testPushPull_extStorageVariable() throws IOException, DeviceNotAvailableException {
- Log.i(LOG_TAG, "testPushPull");
+ CLog.i("testPushPull");
File tmpFile = null;
File tmpDestFile = null;
File tmpDestFile2 = null;
@@ -178,7 +176,7 @@
* Expect {@link TestDevice#pullFile(String)} to return <code>false</code>
*/
public void testPull_noexist() throws IOException, DeviceNotAvailableException {
- Log.i(LOG_TAG, "testPull_noexist");
+ CLog.i("testPull_noexist");
// make sure the root path is valid
String externalStorePath = mTestDevice.getMountPoint(IDevice.MNT_EXTERNAL_STORAGE);
@@ -354,7 +352,7 @@
InputStream inputStream = source.createInputStream();
try {
BufferedImage screenshotImage = ImageIO.read(inputStream);
- CLog.i(LOG_TAG, "testGetScreenshot w=%d, h=%d",
+ CLog.i("testGetScreenshot w=%d, h=%d",
screenshotImage.getWidth(), screenshotImage.getHeight());
assertTrue(screenshotImage.getWidth() > 0);
assertTrue(screenshotImage.getHeight() > 0);
@@ -371,7 +369,7 @@
* equal to provided data.
*/
public void testGetLogcat_size() throws DeviceNotAvailableException, IOException {
- CLog.i(LOG_TAG, "testGetLogcat_size");
+ CLog.i("testGetLogcat_size");
for (int i = 0; i < 100; i++) {
getDevice().executeShellCommand(String.format("log testGetLogcat_size log dump %d", i));
}
diff --git a/hostsidetests/abioverride/Android.mk b/hostsidetests/abioverride/Android.mk
new file mode 100644
index 0000000..56fcc44
--- /dev/null
+++ b/hostsidetests/abioverride/Android.mk
@@ -0,0 +1,36 @@
+# Copyright (C) 2016 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT 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)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_MODULE := CtsAbiOverrideHostTestCases
+
+LOCAL_MODULE_TAGS := tests
+
+# tag this module as a cts_v2 test artifact
+LOCAL_COMPATIBILITY_SUITE := cts_v2
+
+LOCAL_CTS_TEST_PACKAGE := android.host.abioverride
+
+LOCAL_STATIC_JAVA_LIBRARIES := cts-migration-lib
+
+LOCAL_JAVA_LIBRARIES := compatibility-host-util cts-tradefed_v2 tradefed-prebuilt
+
+include $(BUILD_CTS_HOST_JAVA_LIBRARY)
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/abioverride/AndroidTest.xml b/hostsidetests/abioverride/AndroidTest.xml
similarity index 74%
rename from tests/abioverride/AndroidTest.xml
rename to hostsidetests/abioverride/AndroidTest.xml
index cbe4d6a..7819f9b 100644
--- a/tests/abioverride/AndroidTest.xml
+++ b/hostsidetests/abioverride/AndroidTest.xml
@@ -13,12 +13,12 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<configuration description="Config for CTS AbiOverride test cases">
+<configuration description="Config for CTS AbiOverride host test cases">
<target_preparer class="com.android.compatibility.common.tradefed.targetprep.ApkInstaller">
<option name="cleanup-apks" value="true" />
- <option name="test-file-name" value="CtsAbiOverrideTestCases.apk" />
+ <option name="test-file-name" value="CtsAbiOverrideTestApp.apk" />
</target_preparer>
- <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
- <option name="package" value="android.abioverride.cts" />
+ <test class="com.android.compatibility.common.tradefed.testtype.JarHostTest" >
+ <option name="jar" value="CtsAbiOverrideHostTestCases.jar" />
</test>
</configuration>
diff --git a/tests/abioverride/Android.mk b/hostsidetests/abioverride/app/Android.mk
similarity index 96%
rename from tests/abioverride/Android.mk
rename to hostsidetests/abioverride/app/Android.mk
index 14f0f49..4eb3292 100755
--- a/tests/abioverride/Android.mk
+++ b/hostsidetests/abioverride/app/Android.mk
@@ -36,7 +36,7 @@
# Tag this module as a cts_v2 test artifact
LOCAL_COMPATIBILITY_SUITE := cts_v2
-LOCAL_PACKAGE_NAME := CtsAbiOverrideTestCases
+LOCAL_PACKAGE_NAME := CtsAbiOverrideTestApp
LOCAL_SDK_VERSION := current
diff --git a/tests/abioverride/AndroidManifest.xml b/hostsidetests/abioverride/app/AndroidManifest.xml
similarity index 70%
rename from tests/abioverride/AndroidManifest.xml
rename to hostsidetests/abioverride/app/AndroidManifest.xml
index 47b1642..c42d3a8 100755
--- a/tests/abioverride/AndroidManifest.xml
+++ b/hostsidetests/abioverride/app/AndroidManifest.xml
@@ -16,22 +16,14 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="android.abioverride.cts">
+ package="android.abioverride.app">
<application android:use32bitAbi="true" android:multiArch="true">
- <uses-library android:name="android.test.runner" />
- <activity android:name="android.abioverride.AbiOverrideActivity" >
+ <activity android:name=".AbiOverrideActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
-
- <!-- self-instrumenting test package. -->
- <instrumentation
- android:name="android.support.test.runner.AndroidJUnitRunner"
- android:label="AbiOverride tests"
- android:targetPackage="android.abioverride.cts" >
- </instrumentation>
</manifest>
diff --git a/tests/abioverride/jni/Android.mk b/hostsidetests/abioverride/app/jni/Android.mk
similarity index 93%
rename from tests/abioverride/jni/Android.mk
rename to hostsidetests/abioverride/app/jni/Android.mk
index a9dac42..c500100 100644
--- a/tests/abioverride/jni/Android.mk
+++ b/hostsidetests/abioverride/app/jni/Android.mk
@@ -25,6 +25,9 @@
LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
+# Ignore unused parameters.
+LOCAL_CFLAGS += -Wno-unused-parameter
+
LOCAL_SHARED_LIBRARIES := libnativehelper_compat_libc++ liblog libdl
LOCAL_CXX_STL := none
diff --git a/tests/abioverride/jni/CtsAbiOverrideJniOnLoad.cpp b/hostsidetests/abioverride/app/jni/CtsAbiOverrideJniOnLoad.cpp
similarity index 100%
rename from tests/abioverride/jni/CtsAbiOverrideJniOnLoad.cpp
rename to hostsidetests/abioverride/app/jni/CtsAbiOverrideJniOnLoad.cpp
diff --git a/tests/abioverride/src/android/abioverride/AbiOverrideActivity.java b/hostsidetests/abioverride/app/src/android/abioverride/app/AbiOverrideActivity.java
similarity index 78%
rename from tests/abioverride/src/android/abioverride/AbiOverrideActivity.java
rename to hostsidetests/abioverride/app/src/android/abioverride/app/AbiOverrideActivity.java
index ddf0b59..814dcf7 100644
--- a/tests/abioverride/src/android/abioverride/AbiOverrideActivity.java
+++ b/hostsidetests/abioverride/app/src/android/abioverride/app/AbiOverrideActivity.java
@@ -14,24 +14,25 @@
* limitations under the License.
*/
-package android.abioverride;
+package android.abioverride.app;
import android.app.Activity;
import android.os.Bundle;
import android.os.Process;
-
-import java.lang.Override;
+import android.util.Log;
/**
* A simple activity for testing abioverride manifest flag.
*/
public class AbiOverrideActivity extends Activity {
+
+ public static final String TEST_STRING = "Is64bit ";
+
+ private static final String TAG = AbiOverrideActivity.class.getSimpleName();
+
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
- }
-
- public boolean is64Bit() {
- return Process.is64Bit();
+ Log.i(TAG, TEST_STRING + Process.is64Bit());
}
}
diff --git a/hostsidetests/abioverride/src/android/abioverride/cts/AbiOverrideTest.java b/hostsidetests/abioverride/src/android/abioverride/cts/AbiOverrideTest.java
new file mode 100644
index 0000000..65bfdf8
--- /dev/null
+++ b/hostsidetests/abioverride/src/android/abioverride/cts/AbiOverrideTest.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.abioverride.cts;
+
+import com.android.cts.migration.MigrationHelper;
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IBuildReceiver;
+
+import java.io.File;
+import java.util.Scanner;
+
+/**
+ * Test to check the APK runs in 32bit ABI.
+ *
+ * When this test builds, it also builds {@link android.abioverride.app.AbiOverrideActivity}
+ * into an APK which it then installed at runtime and started. The activity simply prints
+ * a message to Logcat and then gets uninstalled. The test verifies that logcat has the right
+ * string.
+ */
+public class AbiOverrideTest extends DeviceTestCase implements IBuildReceiver {
+
+ /**
+ * The package name of the APK.
+ */
+ private static final String PACKAGE = "android.abioverride.app";
+
+ /**
+ * The class name of the main activity in the APK.
+ */
+ private static final String CLASS = "AbiOverrideActivity";
+
+ /**
+ * The class name of the main activity in the APK.
+ */
+ private static final String APK_NAME="CtsAbiOverrideHostApp.apk";
+
+ /**
+ * The command to launch the main activity.
+ */
+ private static final String START_COMMAND = String.format(
+ "am start -W -a android.intent.action.MAIN -n %s/%s.%s", PACKAGE, PACKAGE, CLASS);
+
+
+ private static final String TEST_STRING = "Is64bit ";
+ // android.abioverride.app.AbiOverrideActivity.TEST_STRING;
+
+ private IBuildInfo mBuild;
+
+ @Override
+ public void setBuild(IBuildInfo buildInfo) {
+ mBuild = buildInfo;
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ ITestDevice device = getDevice();
+ device.uninstallPackage(PACKAGE);
+ File app = MigrationHelper.getTestFile(mBuild, APK_NAME);
+ String[] options = {};
+ device.installPackage(app, false, options);
+ }
+
+ /**
+ * Tests the abi is correctly set to 32bit when use32BitAbi is set to true.
+ *
+ * @throws Exception
+ */
+ public void testAbiIs32bit() throws Exception {
+ ITestDevice device = getDevice();
+ // Clear logcat.
+ device.executeAdbCommand("logcat", "-c");
+ // Start the APK and wait for it to complete.
+ device.executeShellCommand(START_COMMAND);
+ // Dump logcat
+ String logs = device.executeAdbCommand("logcat", "-v", "brief", "-d", CLASS + ":I", "*:S");
+ // Search for string.
+ String testString = "";
+ Scanner in = new Scanner(logs);
+ while (in.hasNextLine()) {
+ String line = in.nextLine();
+ if(line.startsWith("I/"+CLASS)) {
+ testString = line.split(":")[1].trim();
+ }
+ }
+ in.close();
+ // Verify that TEST_STRING is actually found in logs.
+ assertTrue("No result found in logs", testString.startsWith(TEST_STRING));
+ // Assert that the result is false
+ assertEquals("Incorrect abi", TEST_STRING + "false", testString);
+ }
+}
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/DocumentsTest.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/DocumentsTest.java
index 97e0041..25ee645 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/DocumentsTest.java
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/DocumentsTest.java
@@ -104,6 +104,11 @@
runDeviceTests(CLIENT_PKG, ".DocumentsClientTest", "testOpenExternalDirectory_userAccepts");
}
+ public void testOpenExternalDirectory_notAskedAgain() throws Exception {
+ runDeviceTests(CLIENT_PKG, ".DocumentsClientTest",
+ "testOpenExternalDirectory_notAskedAgain");
+ }
+
public void testOpenExternalDirectory_userAcceptsNewDirectory() throws Exception {
// TODO: figure out a better way to remove the directory.
final String command = "rm -rf /sdcard/Pictures";
diff --git a/hostsidetests/appsecurity/test-apps/DocumentClient/src/com/android/cts/documentclient/DocumentsClientTest.java b/hostsidetests/appsecurity/test-apps/DocumentClient/src/com/android/cts/documentclient/DocumentsClientTest.java
index 30b32e1..69583a7 100644
--- a/hostsidetests/appsecurity/test-apps/DocumentClient/src/com/android/cts/documentclient/DocumentsClientTest.java
+++ b/hostsidetests/appsecurity/test-apps/DocumentClient/src/com/android/cts/documentclient/DocumentsClientTest.java
@@ -28,6 +28,7 @@
import static android.os.Environment.DIRECTORY_RINGTONES;
import static android.os.Environment.getExternalStorageDirectory;
import static android.test.MoreAsserts.assertContainsRegex;
+import static android.test.MoreAsserts.assertNotEqual;
import java.io.ByteArrayOutputStream;
import java.io.File;
@@ -37,6 +38,8 @@
import java.io.OutputStream;
import android.app.Activity;
+import android.app.ActivityManager;
+import android.app.Instrumentation;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
@@ -47,6 +50,8 @@
import android.net.Uri;
import android.os.Environment;
import android.os.SystemClock;
+import android.os.storage.StorageManager;
+import android.os.storage.StorageVolume;
import android.provider.DocumentsContract;
import android.provider.DocumentsContract.Document;
import android.provider.DocumentsProvider;
@@ -365,21 +370,15 @@
}
}
- // Not called by hostside tests, but useful during development...
- public void testOpenExternalDirectory() throws Exception {
- testOpenExternalDirectory_invalidPath();
- testOpenExternalDirectory_userRejects();
- testOpenExternalDirectory_userAccepts();
- }
-
public void testOpenExternalDirectory_invalidPath() throws Exception {
if (!supportedHardware()) return;
- final String externalRoot = getExternalStorageDirectory().getPath();
- openExternalDirectoryInvalidPath("");
- openExternalDirectoryInvalidPath("/dev/null");
- openExternalDirectoryInvalidPath(externalRoot + "/../");
- openExternalDirectoryInvalidPath(externalRoot + "/HiddenStuff");
+ for (StorageVolume volume : getVolumes()) {
+ openExternalDirectoryInvalidPath(volume, "");
+ openExternalDirectoryInvalidPath(volume, "/dev/null");
+ openExternalDirectoryInvalidPath(volume, "/../");
+ openExternalDirectoryInvalidPath(volume, "/HiddenStuff");
+ }
}
public void testOpenExternalDirectory_userRejects() throws Exception {
@@ -387,17 +386,19 @@
final String externalRoot = getExternalStorageDirectory().getPath();
+ final StorageVolume primaryVolume = getPrimaryVolume();
+
// Tests user clicking DENY button, for all valid directories.
for (String directory : STANDARD_DIRECTORIES) {
final Uri uri = Uri.fromFile(new File(externalRoot, directory));
- final UiAlertDialog dialog = openExternalDirectoryValidPath(uri);
+ final UiAlertDialog dialog = openExternalDirectoryValidPath(primaryVolume, directory);
dialog.noButton.click();
assertActivityFailed();
}
// Also test user clicking back button - one directory is enough.
- openExternalDirectoryValidPath(Uri.fromFile(new File(externalRoot, DIRECTORY_PICTURES)));
+ openExternalDirectoryValidPath(primaryVolume, DIRECTORY_PICTURES);
mDevice.pressBack();
assertActivityFailed();
}
@@ -406,26 +407,41 @@
if (!supportedHardware())
return;
- // TODO: once there is an API to get all volumes, use a for loop to call method below
- // to all of them (rather than hard-coding).
- userAcceptsOpenExternalDirectoryTest(getExternalStorageDirectory().getPath(),
- "Internal storage");
+ for (StorageVolume volume : getVolumes()) {
+ userAcceptsOpenExternalDirectoryTest(volume, DIRECTORY_PICTURES);
+ }
}
- private void userAcceptsOpenExternalDirectoryTest(String rootPath, String rootDescription)
- throws Exception {
- final Uri requestedUri = Uri.fromFile(new File(rootPath, DIRECTORY_PICTURES));
+ public void testOpenExternalDirectory_notAskedAgain() throws Exception {
+ if (!supportedHardware())
+ return;
+ final StorageVolume volume = getPrimaryVolume();
+ final Uri grantedUri = userAcceptsOpenExternalDirectoryTest(volume, DIRECTORY_PICTURES);
+
+ // Calls it again - since the permission has been granted, it should return right away,
+ // without popping up the permissions dialog.
+ sendOpenExternalDirectoryIntent(volume, DIRECTORY_PICTURES);
+ final Intent newData = assertActivitySucceeded();
+ assertEquals(grantedUri, newData.getData());
+
+ // Make sure other directories still require user permission.
+ final Uri grantedUri2 = userAcceptsOpenExternalDirectoryTest(volume, DIRECTORY_ALARMS);
+ assertNotEqual(grantedUri, grantedUri2);
+ }
+
+ private Uri userAcceptsOpenExternalDirectoryTest(StorageVolume volume, String directoryName)
+ throws Exception {
// Asserts dialog contain the proper message.
- final UiAlertDialog dialog = openExternalDirectoryValidPath(requestedUri);
+ final UiAlertDialog dialog = openExternalDirectoryValidPath(volume, directoryName);
final String message = dialog.messageText.getText();
Log.v(TAG, "request permission message: " + message);
final Context context = getInstrumentation().getTargetContext();
final String appLabel = context.getPackageManager().getApplicationLabel(
context.getApplicationInfo()).toString();
assertContainsRegex("missing app label", appLabel, message);
- assertContainsRegex("missing folder", DIRECTORY_PICTURES, message);
- assertContainsRegex("missing root", rootDescription, message);
+ assertContainsRegex("missing folder", directoryName, message);
+ assertContainsRegex("missing root", volume.getDescription(context), message);
// Call API...
dialog.yesButton.click();
@@ -444,7 +460,7 @@
// ...and indirectly by creating some documents
final Uri doc = DocumentsContract.buildDocumentUriUsingTree(grantedUri,
DocumentsContract.getTreeDocumentId(grantedUri));
- assertNotNull("could not get tree UURI", doc);
+ assertNotNull("could not get tree URI", doc);
final Uri pic = DocumentsContract.createDocument(resolver, doc, "image/png", "pic.png");
assertNotNull("could not create file (pic.png) on tree root", pic);
final Uri dir = DocumentsContract.createDocument(resolver, doc, Document.MIME_TYPE_DIR,
@@ -460,6 +476,8 @@
assertTrue("delete", DocumentsContract.deleteDocument(resolver, pic));
assertTrue("delete", DocumentsContract.deleteDocument(resolver, dirPic));
assertTrue("delete", DocumentsContract.deleteDocument(resolver, dir));
+
+ return grantedUri;
}
public void testGetContent() throws Exception {
@@ -671,23 +689,37 @@
return result.data;
}
- private void openExternalDirectoryInvalidPath(String path) {
- sendOpenExternalDirectoryIntent(Uri.fromFile(new File(path)));
+ private void openExternalDirectoryInvalidPath(StorageVolume volume, String path) {
+ sendOpenExternalDirectoryIntent(volume, path);
assertActivityFailed();
}
- private UiAlertDialog openExternalDirectoryValidPath(Uri uri) throws UiObjectNotFoundException {
- sendOpenExternalDirectoryIntent(uri);
+ private UiAlertDialog openExternalDirectoryValidPath(StorageVolume volume, String path)
+ throws UiObjectNotFoundException {
+ sendOpenExternalDirectoryIntent(volume, path);
return new UiAlertDialog();
}
- private void sendOpenExternalDirectoryIntent(Uri uri) {
- final Intent intent = new Intent(Intent.ACTION_OPEN_EXTERNAL_DIRECTORY);
- intent.setData(uri);
+ private void sendOpenExternalDirectoryIntent(StorageVolume volume, String directoryName) {
+ final Intent intent = volume.createAccessIntent(directoryName);
mActivity.startActivityForResult(intent, REQUEST_CODE);
mDevice.waitForIdle();
}
+ private StorageVolume[] getVolumes() {
+ final StorageManager sm = (StorageManager)
+ getInstrumentation().getTargetContext().getSystemService(Context.STORAGE_SERVICE);
+ final StorageVolume[] volumes = sm.getVolumeList();
+ assertTrue("empty volumes", volumes.length > 0);
+ return volumes;
+ }
+
+ private StorageVolume getPrimaryVolume() {
+ final StorageManager sm = (StorageManager)
+ getInstrumentation().getTargetContext().getSystemService(Context.STORAGE_SERVICE);
+ return sm.getPrimaryVolume();
+ }
+
private final class UiAlertDialog {
final UiObject messageText;
final UiObject yesButton;
diff --git a/hostsidetests/cpptools/Android.mk b/hostsidetests/cpptools/Android.mk
new file mode 100644
index 0000000..a4144a6
--- /dev/null
+++ b/hostsidetests/cpptools/Android.mk
@@ -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.
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_MODULE_TAGS := optional
+
+# Must match the package name in CtsTestCaseList.mk
+LOCAL_MODULE := CtsCppToolsTestCases
+
+LOCAL_JAVA_LIBRARIES := cts-tradefed ddmlib-prebuilt tradefed-prebuilt
+
+LOCAL_CTS_TEST_PACKAGE := android.tests.cpptools
+
+include $(BUILD_CTS_HOST_JAVA_LIBRARY)
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/abioverride/jni/Android.mk b/hostsidetests/cpptools/app/Android.mk
similarity index 63%
copy from tests/abioverride/jni/Android.mk
copy to hostsidetests/cpptools/app/Android.mk
index a9dac42..238425a 100644
--- a/tests/abioverride/jni/Android.mk
+++ b/hostsidetests/cpptools/app/Android.mk
@@ -1,4 +1,4 @@
-# Copyright (C) 2016 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,16 +16,16 @@
include $(CLEAR_VARS)
-LOCAL_MODULE := libctsabioverride
-
-# Don't include this package in any configuration by default.
+# Don't include this package in any target.
LOCAL_MODULE_TAGS := optional
-LOCAL_SRC_FILES := CtsAbiOverrideJniOnLoad.cpp
+# When built, explicitly put it in the data partition.
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
-LOCAL_SHARED_LIBRARIES := libnativehelper_compat_libc++ liblog libdl
-LOCAL_CXX_STL := none
+LOCAL_PACKAGE_NAME := CtsCppToolsApp
-include $(BUILD_SHARED_LIBRARY)
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/abioverride/AndroidManifest.xml b/hostsidetests/cpptools/app/AndroidManifest.xml
similarity index 62%
copy from tests/abioverride/AndroidManifest.xml
copy to hostsidetests/cpptools/app/AndroidManifest.xml
index 47b1642..1748a38 100755
--- a/tests/abioverride/AndroidManifest.xml
+++ b/hostsidetests/cpptools/app/AndroidManifest.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- * Copyright (C) 2016 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,11 +16,11 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="android.abioverride.cts">
+ package="android.sample.app">
- <application android:use32bitAbi="true" android:multiArch="true">
- <uses-library android:name="android.test.runner" />
- <activity android:name="android.abioverride.AbiOverrideActivity" >
+ <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+ <application android:debuggable="true">
+ <activity android:name=".SampleDeviceActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
@@ -28,10 +28,5 @@
</activity>
</application>
- <!-- self-instrumenting test package. -->
- <instrumentation
- android:name="android.support.test.runner.AndroidJUnitRunner"
- android:label="AbiOverride tests"
- android:targetPackage="android.abioverride.cts" >
- </instrumentation>
</manifest>
+
diff --git a/tests/abioverride/src/android/abioverride/AbiOverrideActivity.java b/hostsidetests/cpptools/app/src/android/sample/app/SampleDeviceActivity.java
similarity index 61%
copy from tests/abioverride/src/android/abioverride/AbiOverrideActivity.java
copy to hostsidetests/cpptools/app/src/android/sample/app/SampleDeviceActivity.java
index ddf0b59..d7efc0c 100644
--- a/tests/abioverride/src/android/abioverride/AbiOverrideActivity.java
+++ b/hostsidetests/cpptools/app/src/android/sample/app/SampleDeviceActivity.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2016 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.
@@ -14,24 +14,31 @@
* limitations under the License.
*/
-package android.abioverride;
+package android.sample.app;
import android.app.Activity;
import android.os.Bundle;
-import android.os.Process;
+import android.util.Log;
import java.lang.Override;
/**
- * A simple activity for testing abioverride manifest flag.
+ * A simple activity which logs to Logcat.
*/
-public class AbiOverrideActivity extends Activity {
+public class SampleDeviceActivity extends Activity {
+
+ private static final String TAG = SampleDeviceActivity.class.getSimpleName();
+
+ /**
+ * The test string to log.
+ */
+ private static final String TEST_STRING = "SampleTestString";
+
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
+ // Log the test string to Logcat.
+ Log.i(TAG, TEST_STRING);
}
- public boolean is64Bit() {
- return Process.is64Bit();
- }
}
diff --git a/hostsidetests/cpptools/src/com/android/cts/cpptools/RunAsHostTest.java b/hostsidetests/cpptools/src/com/android/cts/cpptools/RunAsHostTest.java
new file mode 100644
index 0000000..24a3b0c
--- /dev/null
+++ b/hostsidetests/cpptools/src/com/android/cts/cpptools/RunAsHostTest.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.cpptools;
+
+import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IBuildReceiver;
+
+import java.io.File;
+import java.lang.String;
+import java.util.Scanner;
+import java.util.regex.Pattern;
+import java.util.regex.Matcher;
+
+/**
+ * Test to check the host can execute commands via "adb shell run-as".
+ */
+public class RunAsHostTest extends DeviceTestCase implements IBuildReceiver {
+
+ /**
+ * The package name of the APK.
+ */
+ private static final String PACKAGE = "android.sample.app";
+
+ /**
+ * The file name of the APK.
+ */
+ private static final String APK = "CtsCppToolsApp.apk";
+
+
+ /**
+ * A reference to the build.
+ */
+ private CtsBuildHelper mBuild;
+
+ /**
+ * A reference to the device under test.
+ */
+ private ITestDevice mDevice;
+
+ @Override
+ public void setBuild(IBuildInfo buildInfo) {
+ // Get the build, this is used to access the APK.
+ mBuild = CtsBuildHelper.createBuildHelper(buildInfo);
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ // Get the device, this gives a handle to run commands and install APKs.
+ mDevice = getDevice();
+ // Remove any previously installed versions of this APK.
+ mDevice.uninstallPackage(PACKAGE);
+ // Get the APK from the build.
+ File app = mBuild.getTestApp(APK);
+ // Install the APK on the device.
+ mDevice.installPackage(app, false);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ // Remove the package once complete.
+ mDevice.uninstallPackage(PACKAGE);
+ super.tearDown();
+ }
+
+ /**
+ * Tests that host can execute shell commands as a debuggable app via adb.
+ *
+ * @throws Exception
+ */
+ public void testRunAs() throws Exception {
+ String runAsResult = mDevice.executeShellCommand("run-as android.sample.app id -u");
+ assertNotNull("adb shell command failed", runAsResult);
+ runAsResult = runAsResult.trim();
+ Matcher appIdMatcher = Pattern.compile("^uid=([0-9]+).*$").matcher(runAsResult);
+ assertTrue("unexpected result returned by adb shell command: \"" + runAsResult + "\"",
+ appIdMatcher.matches());
+ String appIdString = appIdMatcher.group(1);
+ assertTrue("invalid app id " + appIdString, Integer.parseInt(appIdString) > 10000);
+ }
+}
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/AndroidManifest.xml b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/AndroidManifest.xml
index 647ba81..6bd8536 100644
--- a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/AndroidManifest.xml
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/AndroidManifest.xml
@@ -18,7 +18,9 @@
package="com.android.cts.deviceandprofileowner">
<uses-sdk android:minSdkVersion="23"/>
+ <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
+ <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<application>
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/AlwaysOnVpnTest.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/AlwaysOnVpnTest.java
new file mode 100644
index 0000000..8f561a6
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/AlwaysOnVpnTest.java
@@ -0,0 +1,165 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.deviceandprofileowner;
+
+import android.net.ConnectivityManager.NetworkCallback;
+import android.net.ConnectivityManager;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.NetworkRequest;
+import android.system.ErrnoException;
+import android.system.Os;
+import android.system.StructPollfd;
+
+import java.io.ByteArrayOutputStream;
+import java.io.DataOutputStream;
+import java.io.FileDescriptor;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.Socket;
+import java.util.Arrays;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import static android.system.OsConstants.AF_INET;
+import static android.system.OsConstants.IPPROTO_ICMP;
+import static android.system.OsConstants.POLLIN;
+import static android.system.OsConstants.SOCK_DGRAM;
+
+/**
+ * Validates that a device owner or profile owner can set an always-on VPN without user action.
+ *
+ * A trivial VPN app is installed which reflects ping packets back to the sender. One ping packet is
+ * sent, received after its round-trip, and compared to the original packet to make sure nothing
+ * strange happened on the way through the VPN.
+ *
+ * All of the addresses in this test are fictional and any resemblance to real addresses is the
+ * result of a misconfigured network.
+ */
+public class AlwaysOnVpnTest extends BaseDeviceAdminTest {
+
+ private static final String VPN_PACKAGE = "com.android.cts.vpnfirewall";
+ private static final int NETWORK_TIMEOUT_MS = 5000;
+ private static final int NETWORK_SETTLE_GRACE_MS = 100;
+ private static final int SOCKET_TIMEOUT_MS = 5000;
+
+ private static final int ICMP_ECHO_REQUEST = 0x08;
+ private static final int ICMP_ECHO_REPLY = 0x00;
+
+ @Override
+ public void tearDown() throws Exception {
+ mDevicePolicyManager.setAlwaysOnVpnPackage(ADMIN_RECEIVER_COMPONENT, null);
+ super.tearDown();
+ }
+
+ public void testAlwaysOnVpn() throws Exception {
+ final CountDownLatch vpnLatch = new CountDownLatch(1);
+
+ final ConnectivityManager cm =
+ (ConnectivityManager) mContext.getSystemService(mContext.CONNECTIVITY_SERVICE);
+
+ final NetworkRequest request = new NetworkRequest.Builder()
+ .addTransportType(NetworkCapabilities.TRANSPORT_VPN)
+ .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
+ .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
+ .build();
+ final ConnectivityManager.NetworkCallback callback
+ = new ConnectivityManager.NetworkCallback() {
+ @Override
+ public void onAvailable(Network net) {
+ vpnLatch.countDown();
+ }
+ };
+
+ cm.registerNetworkCallback(request, callback);
+ try {
+ mDevicePolicyManager.setAlwaysOnVpnPackage(ADMIN_RECEIVER_COMPONENT, VPN_PACKAGE);
+ assertTrue("Took too long waiting to establish a VPN-backed connection",
+ vpnLatch.await(NETWORK_TIMEOUT_MS, TimeUnit.MILLISECONDS));
+
+ // Give the VPN a moment to start transmitting data.
+ Thread.sleep(NETWORK_SETTLE_GRACE_MS);
+ } catch (InterruptedException e) {
+ fail("Interrupted while waiting to send ping: " + e);
+ } finally {
+ cm.unregisterNetworkCallback(callback);
+ }
+
+ // IP address reserved for documentation by rfc5737
+ checkPing("192.0.2.4");
+ }
+
+ private static void checkPing(String host) throws ErrnoException, IOException {
+ FileDescriptor socket = Os.socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP);
+
+ // Create an ICMP message
+ final int identifier = 0x7E57;
+ final String message = "test packet";
+ byte[] echo = createIcmpMessage(ICMP_ECHO_REQUEST, 0x00, identifier, 0, message.getBytes());
+
+ // Send the echo packet.
+ int port = new InetSocketAddress(0).getPort();
+ Os.connect(socket, InetAddress.getByName(host), port);
+ Os.write(socket, echo, 0, echo.length);
+
+ // Expect a reply.
+ StructPollfd pollfd = new StructPollfd();
+ pollfd.events = (short) POLLIN;
+ pollfd.fd = socket;
+ int ret = Os.poll(new StructPollfd[] { pollfd }, SOCKET_TIMEOUT_MS);
+ assertEquals("Expected reply after sending ping", 1, ret);
+
+ byte[] reply = new byte[echo.length];
+ int read = Os.read(socket, reply, 0, echo.length);
+ assertEquals(echo.length, read);
+
+ // Ignore control type differences since echo=8, reply=0.
+ assertEquals(echo[0], ICMP_ECHO_REQUEST);
+ assertEquals(reply[0], ICMP_ECHO_REPLY);
+ echo[0] = 0;
+ reply[0] = 0;
+
+ // Fix ICMP ID which kernel will have changed on the way out.
+ InetSocketAddress local = (InetSocketAddress) Os.getsockname(socket);
+ port = local.getPort();
+ echo[4] = (byte) ((port >> 8) & 0xFF);
+ echo[5] = (byte) (port & 0xFF);
+
+ // Ignore checksum differences since the types are not supposed to match.
+ echo[2] = echo[3] = 0;
+ reply[2] = reply[3] = 0;
+
+ assertTrue("Packet contents do not match."
+ + "\nEcho packet: " + Arrays.toString(echo)
+ + "\nReply packet: " + Arrays.toString(reply), Arrays.equals(echo, reply));
+ }
+
+ private static byte[] createIcmpMessage(int type, int code, int extra1, int extra2,
+ byte[] data) throws IOException {
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+ DataOutputStream stream = new DataOutputStream(output);
+ stream.writeByte(type);
+ stream.writeByte(code);
+ stream.writeShort(/* checksum */ 0);
+ stream.writeShort((short) extra1);
+ stream.writeShort((short) extra2);
+ stream.write(data, 0, data.length);
+ return output.toByteArray();
+ }
+}
+
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/BaseDeviceOwnerTest.java b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/BaseDeviceOwnerTest.java
index b6815fd..b49f923c 100644
--- a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/BaseDeviceOwnerTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/BaseDeviceOwnerTest.java
@@ -32,7 +32,7 @@
* assume these are done. The admin component can be accessed through
* {@link #getWho()}.
*/
-public class BaseDeviceOwnerTest extends AndroidTestCase {
+public abstract class BaseDeviceOwnerTest extends AndroidTestCase {
public static class BasicAdminReceiver extends DeviceAdminReceiver {
@Override
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/CreateAndManageUserTest.java b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/CreateAndManageUserTest.java
index 3246401..cf28e7d 100644
--- a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/CreateAndManageUserTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/CreateAndManageUserTest.java
@@ -50,4 +50,31 @@
makeEphemeralFlag);
}
+ /**
+ * Test creating an ephemeral user using the {@link DevicePolicyManager#createAndManageUser}
+ * method fails on systems without the split system user.
+ *
+ * <p>To be used by host-side test on systems without the split system user.
+ */
+ public void testCreateAndManageEphemeralUserFails() throws Exception {
+ String testUserName = "TestUser_" + System.currentTimeMillis();
+
+ // Use reflection to get the value of the hidden flag to make the new user ephemeral.
+ Field field = DevicePolicyManager.class.getField("MAKE_USER_EPHEMERAL");
+ int makeEphemeralFlag = field.getInt(null);
+
+ try {
+ mDevicePolicyManager.createAndManageUser(
+ getWho(),
+ testUserName,
+ getWho(),
+ null,
+ makeEphemeralFlag);
+ } catch (IllegalArgumentException e) {
+ // Success, the expected exception was thrown.
+ return;
+ }
+ fail("createAndManageUser should have thrown IllegalArgumentException");
+ }
+
}
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/ForceEphemeralUsersTest.java b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/ForceEphemeralUsersTest.java
index a5f59d4..c5fa4b2 100644
--- a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/ForceEphemeralUsersTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/ForceEphemeralUsersTest.java
@@ -19,6 +19,7 @@
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
+import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
@@ -43,4 +44,23 @@
assertTrue((boolean) getForceEphemeralUsersMethod.invoke(mDevicePolicyManager, getWho()));
}
+ /**
+ * Setting force-ephemeral-user policy should fail if not on system with split system user.
+ *
+ * <p>To be run on systems without split system user.
+ */
+ public void testSetForceEphemeralUsersFails() throws Exception {
+ Method setForceEphemeralUsersMethod = DevicePolicyManager.class.getDeclaredMethod(
+ "setForceEphemeralUsers", ComponentName.class, boolean.class);
+ try {
+ setForceEphemeralUsersMethod.invoke(mDevicePolicyManager, getWho(), true);
+ } catch (InvocationTargetException e) {
+ if (e.getCause() instanceof UnsupportedOperationException) {
+ // Test passed, the exception was thrown as expected.
+ return;
+ }
+ }
+ fail("UnsupportedOperationException should have been thrown by setForceEphemeralUsers");
+ }
+
}
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/WifiTest.java b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/WifiTest.java
new file mode 100644
index 0000000..a585da4
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/WifiTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.deviceowner;
+
+import android.content.pm.PackageManager;
+import android.text.TextUtils;
+
+/**
+ * Tests that require the WiFi feature.
+ */
+public class WifiTest extends BaseDeviceOwnerTest {
+ public void testGetWifiMacAddress() {
+ if (!mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI)) {
+ // wifi not supported.
+ return;
+ }
+ final String macAddress = mDevicePolicyManager.getWifiMacAddress();
+
+ assertFalse("Device owner should be able to get the real MAC address",
+ "02:00:00:00:00:00".equals(macAddress));
+ assertFalse("getWifiMacAddress() returned an empty string. WiFi not enabled?",
+ TextUtils.isEmpty(macAddress));
+ }
+}
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/ContactsTest.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/ContactsTest.java
index 3d64d47..0c4e74c 100644
--- a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/ContactsTest.java
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/ContactsTest.java
@@ -259,9 +259,7 @@
assertManagedLocalContact(contactInfo);
contactInfo.assertPhotoUrisReadable();
assertFalse(contactInfo.hasPhotoId());
-
- // Quirk: the _id column from the SIP lookup is actually of the data id, not the contact id.
- // assertTrue(isEnterpriseContactId(contactInfo.contactId));
+ assertTrue(isEnterpriseContactId(contactInfo.contactId));
}
public void testPrimaryProfileEnterpriseEmailLookup_canAccessEnterpriseContact()
@@ -1093,12 +1091,32 @@
contactInfo.assertPhotoUri(R.raw.managed_photo);
}
+ private void assertContactInfoEquals(ContactInfo lhs, ContactInfo rhs) {
+ if (lhs == null) {
+ assertNull(rhs);
+ } else {
+ assertNotNull(rhs);
+ assertEquals(lhs.contactId, rhs.contactId);
+ assertEquals(lhs.displayName, rhs.displayName);
+ assertEquals(lhs.photoId, rhs.photoId);
+ assertEquals(lhs.photoThumbnailUri, rhs.photoThumbnailUri);
+ assertEquals(lhs.photoUri, rhs.photoUri);
+ }
+ }
+
private ContactInfo getContactInfoFromPhoneLookupUri(boolean isEnterprise, String phoneNumber) {
Uri baseUri = (isEnterprise) ? PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI
: PhoneLookup.CONTENT_FILTER_URI;
Uri uri = baseUri.buildUpon().appendPath(phoneNumber).build();
- return getContactInfoFromUri(uri, PhoneLookup._ID, PhoneLookup.DISPLAY_NAME,
+ ContactInfo contactInfo = getContactInfoFromUri(uri, PhoneLookup._ID,
+ PhoneLookup.DISPLAY_NAME,
PhoneLookup.PHOTO_URI, PhoneLookup.PHOTO_THUMBNAIL_URI, PhoneLookup.PHOTO_ID);
+
+ ContactInfo contactInfo2 = getContactInfoFromUri(uri, PhoneLookup.CONTACT_ID,
+ PhoneLookup.DISPLAY_NAME,
+ PhoneLookup.PHOTO_URI, PhoneLookup.PHOTO_THUMBNAIL_URI, PhoneLookup.PHOTO_ID);
+ assertContactInfoEquals(contactInfo, contactInfo2);
+ return contactInfo;
}
private ContactInfo getContactInfoFromEnterprisePhoneLookupUriWithSipAddress(
@@ -1107,7 +1125,7 @@
: PhoneLookup.CONTENT_FILTER_URI;
Uri uri = baseUri.buildUpon().appendPath(sipAddress)
.appendQueryParameter(PhoneLookup.QUERY_PARAMETER_SIP_ADDRESS, "1").build();
- return getContactInfoFromUri(uri, PhoneLookup._ID, PhoneLookup.DISPLAY_NAME,
+ return getContactInfoFromUri(uri, PhoneLookup.CONTACT_ID, PhoneLookup.DISPLAY_NAME,
PhoneLookup.PHOTO_URI, PhoneLookup.PHOTO_THUMBNAIL_URI, PhoneLookup.PHOTO_ID);
}
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/OrganizationInfoTest.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/OrganizationInfoTest.java
index d426ba4..aa319e3 100644
--- a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/OrganizationInfoTest.java
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/OrganizationInfoTest.java
@@ -53,13 +53,44 @@
try {
mDevicePolicyManager.setOrganizationColor(null, Color.GRAY);
fail("Exception should have been thrown for null admin ComponentName");
- } catch (NullPointerException expected) {
+ } catch (Exception expected) {
}
try {
int color = mDevicePolicyManager.getOrganizationColor(null);
fail("Exception should have been thrown for null admin ComponentName");
- } catch (NullPointerException expected) {
+ } catch (Exception expected) {
+ }
+ }
+
+ public void testDefaultOrganizationNameIsNull() {
+ final String name = mDevicePolicyManager.getOrganizationName(ADMIN_RECEIVER_COMPONENT);
+ assertNull(name);
+ }
+
+ public void testSetOrganizationName() {
+ String previousName = mDevicePolicyManager.getOrganizationName(ADMIN_RECEIVER_COMPONENT);
+
+ try {
+ final String name = "test-set-name";
+ mDevicePolicyManager.setOrganizationName(ADMIN_RECEIVER_COMPONENT, name);
+ assertEquals(name, mDevicePolicyManager.getOrganizationName(ADMIN_RECEIVER_COMPONENT));
+ } finally {
+ mDevicePolicyManager.setOrganizationName(ADMIN_RECEIVER_COMPONENT, previousName);
+ }
+ }
+
+ public void testSetOrGetOrganizationNameWithNullAdminFails() {
+ try {
+ mDevicePolicyManager.setOrganizationName(null, "null-admin-fails");
+ fail("Exception should have been thrown for null admin ComponentName");
+ } catch (Exception expected) {
+ }
+
+ try {
+ String name = mDevicePolicyManager.getOrganizationName(null);
+ fail("Exception should have been thrown for null admin ComponentName");
+ } catch (Exception expected) {
}
}
}
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/PhoneAccountTest.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/PhoneAccountTest.java
index 667afcb..63f2309 100644
--- a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/PhoneAccountTest.java
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/PhoneAccountTest.java
@@ -20,6 +20,7 @@
import android.app.Instrumentation;
import android.content.ComponentName;
import android.content.Context;
+import android.content.Intent;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
@@ -81,11 +82,19 @@
super.tearDown();
}
+ public void testOutgoingCallUsingTelecomManager() throws Exception {
+ internalTestOutgoingCall(true /* usingTelecomManager */);
+ }
+
+ public void testOutgoingCallUsingActionCall() throws Exception {
+ internalTestOutgoingCall(false /* usingTelecomManager */);
+ }
+
/**
* Placing an outgoing call through our phone account and verify the call is inserted
* properly.
*/
- public void testOutgoingCall() throws Exception {
+ private void internalTestOutgoingCall(boolean usingTelecomManager) throws Exception {
// Make sure no lingering values from previous runs.
cleanupCall(false);
final Context context = getInstrumentation().getContext();
@@ -102,10 +111,11 @@
countDownLatch));
// Place the call.
- Uri phoneUri = Uri.fromParts(PhoneAccount.SCHEME_TEL, PHONE_NUMBER, null);
- Bundle extras = new Bundle();
- extras.putParcelable(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, phoneAccountHandle);
- mTelecomManager.placeCall(phoneUri, extras);
+ if (usingTelecomManager) {
+ placeCallUsingTelecomManager(phoneAccountHandle);
+ } else {
+ placeCallUsingActionCall(phoneAccountHandle);
+ }
// Make sure the call inserted is correct.
boolean calllogProviderChanged = countDownLatch.await(1, TimeUnit.MINUTES);
@@ -118,6 +128,21 @@
}
}
+ private void placeCallUsingTelecomManager(PhoneAccountHandle phoneAccountHandle) {
+ Uri phoneUri = Uri.fromParts(PhoneAccount.SCHEME_TEL, PHONE_NUMBER, null);
+ Bundle extras = new Bundle();
+ extras.putParcelable(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, phoneAccountHandle);
+ mTelecomManager.placeCall(phoneUri, extras);
+ }
+
+ private void placeCallUsingActionCall(PhoneAccountHandle phoneAccountHandle) {
+ Intent intent = new Intent(Intent.ACTION_CALL);
+ intent.setData(Uri.parse("tel:" + PHONE_NUMBER));
+ intent.putExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, phoneAccountHandle);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ mContext.startActivity(intent);
+ }
+
/**
* Add an incoming call with our phone account and verify the call is inserted properly.
*/
diff --git a/tests/abioverride/Android.mk b/hostsidetests/devicepolicy/app/ProfileOwner/Android.mk
old mode 100755
new mode 100644
similarity index 63%
copy from tests/abioverride/Android.mk
copy to hostsidetests/devicepolicy/app/ProfileOwner/Android.mk
index 14f0f49..0a876f9
--- a/tests/abioverride/Android.mk
+++ b/hostsidetests/devicepolicy/app/ProfileOwner/Android.mk
@@ -16,30 +16,21 @@
include $(CLEAR_VARS)
-# Don't include this package in any target
-LOCAL_MODULE_TAGS := tests
-# When built, explicitly put it in the data partition.
+LOCAL_PACKAGE_NAME := CtsProfileOwnerApp
+
+LOCAL_MODULE_TAGS := optional
+
LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-LOCAL_DEX_PREOPT := false
-
-LOCAL_PROGUARD_ENABLED := disabled
-
-LOCAL_MULTILIB := both
-
-LOCAL_STATIC_JAVA_LIBRARIES := compatibility-device-util ctsdeviceutil ctstestrunner
-
-LOCAL_JNI_SHARED_LIBRARIES := libctsabioverride
-
LOCAL_SRC_FILES := $(call all-java-files-under, src)
-# Tag this module as a cts_v2 test artifact
-LOCAL_COMPATIBILITY_SUITE := cts_v2
+LOCAL_JAVA_LIBRARIES := android.test.runner cts-junit
-LOCAL_PACKAGE_NAME := CtsAbiOverrideTestCases
+LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner compatibility-device-util ub-uiautomator
LOCAL_SDK_VERSION := current
-include $(BUILD_CTS_PACKAGE)
+# tag this module as a cts_v2 test artifact
+LOCAL_COMPATIBILITY_SUITE := cts_v2
-include $(call all-makefiles-under,$(LOCAL_PATH))
+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..7d71942
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/ProfileOwner/AndroidManifest.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT 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="24"/>
+
+ <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.support.test.runner.AndroidJUnitRunner"
+ android:targetPackage="com.android.cts.profileowner"
+ android:label="Profile Owner CTS tests"/>
+</manifest>
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..ff086d6
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/ProfileOwner/res/xml/device_admin.xml
@@ -0,0 +1,4 @@
+<device-admin xmlns:android="http://schemas.android.com/apk/res/android" android:visible="false">
+ <uses-policies>
+ </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..f47f5a2
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/ProfileOwner/src/com/android/cts/profileowner/BaseProfileOwnerTest.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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;
+
+public abstract class BaseProfileOwnerTest extends AndroidTestCase {
+
+ public static class BasicAdminReceiver extends DeviceAdminReceiver {
+ }
+
+ public static final String PACKAGE_NAME = BaseProfileOwnerTest.class.getPackage().getName();
+
+ protected DevicePolicyManager mDevicePolicyManager;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ mDevicePolicyManager = (DevicePolicyManager)
+ mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
+ assertProfileOwner(mDevicePolicyManager);
+ }
+
+ static void assertProfileOwner(DevicePolicyManager dpm) {
+ assertNotNull(dpm);
+ assertTrue(dpm.isAdminActive(getWho()));
+ assertTrue(dpm.isProfileOwnerApp(PACKAGE_NAME));
+ }
+
+ protected static ComponentName getWho() {
+ return new ComponentName(PACKAGE_NAME, BasicAdminReceiver.class.getName());
+ }
+}
diff --git a/hostsidetests/devicepolicy/app/ProfileOwner/src/com/android/cts/profileowner/ClearProfileOwnerTest.java b/hostsidetests/devicepolicy/app/ProfileOwner/src/com/android/cts/profileowner/ClearProfileOwnerTest.java
new file mode 100644
index 0000000..2c7b240
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/ProfileOwner/src/com/android/cts/profileowner/ClearProfileOwnerTest.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.DevicePolicyManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.test.AndroidTestCase;
+
+public class ClearProfileOwnerTest extends AndroidTestCase {
+
+ private DevicePolicyManager mDevicePolicyManager;
+
+ @Override
+ protected void tearDown() throws Exception {
+ mDevicePolicyManager = (DevicePolicyManager)
+ mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
+ if (mDevicePolicyManager != null) {
+ if (mDevicePolicyManager.isProfileOwnerApp(BaseProfileOwnerTest.PACKAGE_NAME)) {
+ mDevicePolicyManager.clearProfileOwner(BaseProfileOwnerTest.getWho());
+ }
+ assertFalse(mDevicePolicyManager.isProfileOwnerApp(BaseProfileOwnerTest.PACKAGE_NAME));
+
+ waitForActiveAdminRemoved(BaseProfileOwnerTest.getWho());
+ }
+
+ super.tearDown();
+ }
+
+ // This test clears the profile owner and active admin on tearDown(). To be called from the host
+ // side test once a test case is finished.
+ public void testClearProfileOwner() {
+ }
+
+ private void waitForActiveAdminRemoved(ComponentName cn) throws InterruptedException {
+ for (int i = 0; i < 1000 && mDevicePolicyManager.isAdminActive(cn); i++) {
+ Thread.sleep(100);
+ }
+ assertFalse(mDevicePolicyManager.isAdminActive(cn));
+ }
+}
diff --git a/hostsidetests/devicepolicy/app/ProfileOwner/src/com/android/cts/profileowner/WifiTest.java b/hostsidetests/devicepolicy/app/ProfileOwner/src/com/android/cts/profileowner/WifiTest.java
new file mode 100644
index 0000000..bbff4c5
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/ProfileOwner/src/com/android/cts/profileowner/WifiTest.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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;
+
+public class WifiTest extends BaseProfileOwnerTest {
+ public void testGetWifiMacAddress() {
+ try {
+ mDevicePolicyManager.getWifiMacAddress();
+ fail("Profile owner shouldn't be able to get the MAC address");
+ } catch (SecurityException e) {
+ if (!e.getMessage().contains("for policy #-2")) {
+ fail("Unexpected exception message: " + e.getMessage());
+ }
+ }
+ }
+}
diff --git a/tests/abioverride/jni/Android.mk b/hostsidetests/devicepolicy/app/VpnApp/Android.mk
similarity index 67%
copy from tests/abioverride/jni/Android.mk
copy to hostsidetests/devicepolicy/app/VpnApp/Android.mk
index a9dac42..f15bfe0 100644
--- a/tests/abioverride/jni/Android.mk
+++ b/hostsidetests/devicepolicy/app/VpnApp/Android.mk
@@ -16,16 +16,19 @@
include $(CLEAR_VARS)
-LOCAL_MODULE := libctsabioverride
+LOCAL_PACKAGE_NAME := CtsVpnFirewallApp
-# Don't include this package in any configuration by default.
LOCAL_MODULE_TAGS := optional
-LOCAL_SRC_FILES := CtsAbiOverrideJniOnLoad.cpp
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
-LOCAL_SHARED_LIBRARIES := libnativehelper_compat_libc++ liblog libdl
-LOCAL_CXX_STL := none
+LOCAL_JAVA_LIBRARIES := android.test.runner
-include $(BUILD_SHARED_LIBRARY)
+LOCAL_SDK_VERSION := current
+
+# tag this module as a cts_v2 test artifact
+LOCAL_COMPATIBILITY_SUITE := cts_v2
+
+include $(BUILD_CTS_PACKAGE)
diff --git a/hostsidetests/devicepolicy/app/VpnApp/AndroidManifest.xml b/hostsidetests/devicepolicy/app/VpnApp/AndroidManifest.xml
new file mode 100644
index 0000000..ea1a001
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/VpnApp/AndroidManifest.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT 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.vpnfirewall">
+
+ <uses-sdk android:minSdkVersion="22"/>
+
+ <application>
+ <service android:name=".ReflectorVpnService"
+ android:permission="android.permission.BIND_VPN_SERVICE">
+ <intent-filter>
+ <action android:name="android.net.VpnService"/>
+ </intent-filter>
+ </service>
+ </application>
+
+</manifest>
diff --git a/hostsidetests/devicepolicy/app/VpnApp/src/com/android/cts/vpnfirewall/IcmpMessage.java b/hostsidetests/devicepolicy/app/VpnApp/src/com/android/cts/vpnfirewall/IcmpMessage.java
new file mode 100644
index 0000000..6304236
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/VpnApp/src/com/android/cts/vpnfirewall/IcmpMessage.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.vpnfirewall;
+
+import java.io.ByteArrayOutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.util.Arrays;
+
+public class IcmpMessage {
+ int type;
+ int code;
+ long quench;
+ byte[] data;
+
+ IcmpMessage(DataInputStream stream, int length) throws IOException {
+ type = stream.readUnsignedByte();
+ code = stream.readUnsignedByte();
+ int checksum = stream.readUnsignedShort();
+ quench = stream.readInt() & 0xFFFFFFFFL;
+
+ int dataLength = length - 8;
+ data = new byte[dataLength];
+ int len = stream.read(data, 0, dataLength);
+ if (len != dataLength) {
+ throw new IOException("Expected " + dataLength + " data bytes, received " + len);
+ }
+
+ byte[] original = new byte[length];
+ stream.reset();
+ stream.readFully(original);
+ if (!Arrays.equals(original, getEncoded())) {
+ throw new IOException("Corrupted message. Checksum: " + checksum);
+ }
+ }
+
+ public byte[] getEncoded() throws IOException {
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+ DataOutputStream stream = new DataOutputStream(output);
+
+ stream.writeByte(type);
+ stream.writeByte(code);
+ int checksumPosition = stream.size();
+ stream.writeShort(/* checksum */ 0);
+ stream.writeInt((int) quench);
+ stream.write(data, 0, data.length);
+
+ byte[] result = output.toByteArray();
+ int checksum = Rfc1071.checksum(result, result.length);
+ result[checksumPosition + 0] = (byte) ((checksum & 0xFF00) >> 8);
+ result[checksumPosition + 1] = (byte) ((checksum & 0x00FF));
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder out = new StringBuilder(64);
+ out.append("ICMP payload {");
+ out.append("\n Type: "); out.append(type);
+ out.append("\n Code: "); out.append(code);
+ out.append("\n Quench: "); out.append(quench);
+ out.append("\n Data: [");
+ for (int i = 0 ; i < data.length; i++) {
+ if (i % 16 == 0) {
+ out.append(String.format("\n%4s", ""));
+ }
+ if (Character.isLetter((char) data[i])) {
+ out.append(String.format(" %2c", (char) data[i]));
+ } else {
+ out.append(String.format(" %02X", data[i] & 0xFF));
+ }
+ }
+ out.append("\n ]");
+ out.append("\n}");
+ return out.toString();
+ }
+}
+
diff --git a/hostsidetests/devicepolicy/app/VpnApp/src/com/android/cts/vpnfirewall/Ipv4Packet.java b/hostsidetests/devicepolicy/app/VpnApp/src/com/android/cts/vpnfirewall/Ipv4Packet.java
new file mode 100644
index 0000000..461da1a
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/VpnApp/src/com/android/cts/vpnfirewall/Ipv4Packet.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.vpnfirewall;
+
+import java.io.ByteArrayOutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.net.Inet4Address;
+import java.util.Arrays;
+
+public class Ipv4Packet {
+ private static final int HEADER_MIN_LENGTH = 20;
+
+ int version;
+ int headerLength;
+ int type;
+ int totalLength;
+ int identification;
+ int flagsAndOffset;
+ int timeToLive;
+ int protocol;
+ Inet4Address sourceAddress;
+ Inet4Address destinationAddress;
+ byte[] options;
+ byte[] data;
+
+ public Ipv4Packet(DataInputStream stream) throws IOException {
+ int versionIhl = stream.readUnsignedByte();
+ version = (versionIhl & 0xF0) >> 4;
+ headerLength = (versionIhl & 0x0F) * 4;
+
+ type = stream.readUnsignedByte();
+ totalLength = stream.readUnsignedShort();
+ identification = stream.readUnsignedShort();
+ flagsAndOffset = stream.readUnsignedShort();
+ timeToLive = stream.readUnsignedByte();
+ protocol = stream.readUnsignedByte();
+ int checksum = stream.readUnsignedShort();
+
+ byte[] address = new byte[4];
+
+ stream.read(address, 0, address.length);
+ sourceAddress = (Inet4Address) Inet4Address.getByAddress(address);
+
+ stream.read(address, 0, address.length);
+ destinationAddress = (Inet4Address) Inet4Address.getByAddress(address);
+
+ if (headerLength < HEADER_MIN_LENGTH) {
+ throw new IllegalArgumentException("Header length = " + headerLength
+ + " is less than HEADER_MIN_LENGTH = " + HEADER_MIN_LENGTH);
+ }
+ options = new byte[headerLength - HEADER_MIN_LENGTH];
+ stream.read(options, 0, options.length);
+
+ if (totalLength < headerLength) {
+ throw new IllegalArgumentException("Total length = " + totalLength
+ + " is less than header length = " + headerLength);
+ }
+ data = new byte[totalLength - headerLength];
+ stream.read(data, 0, data.length);
+
+ byte[] original = new byte[totalLength];
+ stream.reset();
+ stream.readFully(original);
+ if (!Arrays.equals(original, getEncoded())) {
+ throw new IOException("Corrupted message. Checksum: " + checksum);
+ }
+ }
+
+ public void setOptions(byte[] newOptions) {
+ options = newOptions;
+ headerLength = HEADER_MIN_LENGTH + options.length;
+ }
+
+ public void setData(byte[] newData) {
+ data = newData;
+ totalLength = headerLength + data.length;
+ }
+
+ public byte[] getEncoded() throws IOException {
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+ DataOutputStream stream = new DataOutputStream(output);
+
+ stream.writeByte((version << 4) | (headerLength / 4));
+ stream.writeByte(type);
+ stream.writeShort(totalLength);
+ stream.writeShort(identification);
+ stream.writeShort(flagsAndOffset);
+ stream.writeByte(timeToLive);
+ stream.writeByte(protocol);
+
+ int checksumPosition = stream.size();
+ stream.writeShort(/* checksum */ 0);
+ stream.write(sourceAddress.getAddress(), 0, 4);
+ stream.write(destinationAddress.getAddress(), 0, 4);
+ stream.write(options, 0, options.length);
+ stream.write(data, 0, data.length);
+ stream.close();
+
+ byte[] result = output.toByteArray();
+ int checksum = Rfc1071.checksum(result, headerLength);
+ result[checksumPosition + 0] = (byte) ((checksum & 0xFF00) >> 8);
+ result[checksumPosition + 1] = (byte) ((checksum & 0x00FF));
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder out = new StringBuilder(256);
+
+ out.append("IPv4 Packet {");
+ out.append("\n Version: ").append(version);
+ out.append("\n Header length: ").append(headerLength);
+ out.append("\n Type: ").append(type);
+ out.append("\n Total length: ").append(totalLength);
+ out.append("\n Identification: ").append(identification);
+ out.append("\n Flags + offset: ").append(flagsAndOffset);
+ out.append("\n Time to live: ").append(timeToLive);
+ out.append("\n Protocol: ").append(protocol);
+ out.append("\n Source: ").append(sourceAddress.getHostAddress());
+ out.append("\n Destination: ").append(destinationAddress.getHostAddress());
+ out.append("\n Options: [");
+ for (int i = 0 ; i < options.length; i++) {
+ if (i % 16 == 0) {
+ out.append(String.format("\n%4s", ""));
+ }
+ out.append(String.format(" %02X", options[i] & 0xFF));
+ }
+ out.append("\n ]");
+ out.append("\n Data: [");
+ for (int i = 0 ; i < data.length; i++) {
+ if (i % 16 == 0) {
+ out.append(String.format("\n%4s", ""));
+ }
+ out.append(String.format(" %02X", data[i] & 0xFF));
+ }
+ out.append("\n ]");
+ out.append("\n}");
+ return out.toString();
+ }
+}
diff --git a/hostsidetests/devicepolicy/app/VpnApp/src/com/android/cts/vpnfirewall/PingReflector.java b/hostsidetests/devicepolicy/app/VpnApp/src/com/android/cts/vpnfirewall/PingReflector.java
new file mode 100644
index 0000000..9ee1838
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/VpnApp/src/com/android/cts/vpnfirewall/PingReflector.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.vpnfirewall;
+
+import android.system.ErrnoException;
+import android.system.Os;
+import android.util.Log;
+
+import java.io.ByteArrayInputStream;
+import java.io.DataInputStream;
+import java.io.FileDescriptor;
+import java.io.IOException;
+import java.net.Inet4Address;
+
+public class PingReflector extends Thread {
+ private static final String TAG = "PingReflector";
+
+ private static final int PROTOCOL_ICMP = 0x01;
+
+ private FileDescriptor mFd;
+ private byte[] mBuf;
+
+ public PingReflector(FileDescriptor fd, int mtu) {
+ super("PingReflector");
+ mFd = fd;
+ mBuf = new byte[mtu];
+ }
+
+ public void run() {
+ Log.i(TAG, "PingReflector starting fd=" + mFd + " valid=" + mFd.valid());
+ while (!interrupted() && mFd.valid()) {
+ int len = readPacket(mBuf);
+ if (len > 0) {
+ int version = mBuf[0] >> 4;
+ if (version != 4) {
+ Log.e(TAG, "Received packet version: " + version + ". Ignoring.");
+ continue;
+ }
+ try {
+ processPacket(mBuf, version, len, 0);
+ } catch (IOException e) {
+ Log.w(TAG, "Failed processing packet", e);
+ }
+ }
+ }
+ Log.i(TAG, "PingReflector exiting fd=" + mFd + " valid=" + mFd.valid());
+ }
+
+ private void processPacket(byte[] buf, int version, int len, int hdrLen) throws IOException {
+ IcmpMessage echo = null;
+ IcmpMessage response = null;
+
+ DataInputStream stream = new DataInputStream(new ByteArrayInputStream(buf));
+ Ipv4Packet packet = new Ipv4Packet(stream);
+ Log.i(TAG, "Packet contents:\n" + packet);
+
+ if (packet.protocol != PROTOCOL_ICMP) {
+ Log.i(TAG, "Protocol is " + packet.protocol + " not ICMP. Ignoring.");
+ return;
+ }
+
+ echo = new IcmpMessage(
+ new DataInputStream(new ByteArrayInputStream(packet.data)), packet.data.length);
+ Log.i(TAG, "Ping packet:\n" + echo);
+
+ // Swap src and dst IP addresses to route the packet back into the device.
+ Inet4Address tmp = packet.sourceAddress;
+ packet.sourceAddress = packet.destinationAddress;
+ packet.destinationAddress = tmp;
+
+ packet.setData(echo.getEncoded());
+ writePacket(packet.getEncoded());
+ Log.i(TAG, "Wrote packet back");
+ }
+
+ private void writePacket(byte[] buf) {
+ try {
+ Os.write(mFd, buf, 0, buf.length);
+ } catch (ErrnoException | IOException e) {
+ Log.e(TAG, "Error writing packet: " + e.getMessage(), e);
+ }
+ }
+
+ private int readPacket(byte[] buf) {
+ try {
+ return Os.read(mFd, buf, 0, buf.length);
+ } catch (ErrnoException | IOException e) {
+ Log.e(TAG, "Error reading packet: " + e.getMessage(), e);
+ return -1;
+ }
+ }
+}
diff --git a/hostsidetests/devicepolicy/app/VpnApp/src/com/android/cts/vpnfirewall/ReflectorVpnService.java b/hostsidetests/devicepolicy/app/VpnApp/src/com/android/cts/vpnfirewall/ReflectorVpnService.java
new file mode 100644
index 0000000..3d2c2ff
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/VpnApp/src/com/android/cts/vpnfirewall/ReflectorVpnService.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.vpnfirewall;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.net.VpnService;
+import android.os.Bundle;
+import android.os.ParcelFileDescriptor;
+import android.os.UserManager;
+import android.text.TextUtils;
+import android.util.Log;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+public class ReflectorVpnService extends VpnService {
+
+ private static String TAG = "ReflectorVpnService";
+ private static int MTU = 1799;
+
+ private ParcelFileDescriptor mFd = null;
+ private PingReflector mPingReflector = null;
+
+ public static final String RESTRICTION_ADDRESSES = "vpn.addresses";
+ public static final String RESTRICTION_ROUTES = "vpn.routes";
+ public static final String RESTRICTION_ALLOWED = "vpn.allowed";
+ public static final String RESTRICTION_DISALLOWED = "vpn.disallowed";
+
+ @Override
+ public int onStartCommand(Intent intent, int flags, int startId) {
+ start();
+ return START_NOT_STICKY;
+ }
+
+ @Override
+ public void onDestroy() {
+ stop();
+ super.onDestroy();
+ }
+
+ private void start() {
+ VpnService.prepare(this);
+ Builder builder = new Builder();
+
+ final UserManager um = (UserManager) getSystemService(Context.USER_SERVICE);
+ final Bundle restrictions = um.getApplicationRestrictions(getPackageName());
+
+ String[] addressArray = restrictions.getStringArray(RESTRICTION_ADDRESSES);
+ if (addressArray == null) {
+ // Addresses for IPv4/IPv6 documentation purposes according to rfc5737/rfc3849.
+ addressArray = new String[] {"192.0.2.3/32", "2001:db8:1:2::/128"};
+ };
+ for (int i = 0; i < addressArray.length; i++) {
+ String[] prefixAndMask = addressArray[i].split("/");
+ try {
+ InetAddress address = InetAddress.getByName(prefixAndMask[0]);
+ int prefixLength = Integer.parseInt(prefixAndMask[1]);
+ builder.addAddress(address, prefixLength);
+ } catch (NumberFormatException | UnknownHostException e) {
+ Log.w(TAG, "Ill-formed address: " + addressArray[i]);
+ continue;
+ }
+ }
+
+ String[] routeArray = restrictions.getStringArray(RESTRICTION_ROUTES);
+ if (routeArray == null) {
+ routeArray = new String[] {"0.0.0.0/0", "::/0"};
+ }
+ for (int i = 0; i < routeArray.length; i++) {
+ String[] prefixAndMask = routeArray[i].split("/");
+ try {
+ InetAddress address = InetAddress.getByName(prefixAndMask[0]);
+ int prefixLength = Integer.parseInt(prefixAndMask[1]);
+ builder.addRoute(address, prefixLength);
+ } catch (NumberFormatException | UnknownHostException e) {
+ Log.w(TAG, "Ill-formed route: " + routeArray[i]);
+ continue;
+ }
+ }
+
+ String[] allowedArray = restrictions.getStringArray(RESTRICTION_ALLOWED);
+ if (allowedArray != null) {
+ for (int i = 0; i < allowedArray.length; i++) {
+ String allowedPackage = allowedArray[i];
+ if (!TextUtils.isEmpty(allowedPackage)) {
+ try {
+ builder.addAllowedApplication(allowedPackage);
+ } catch(NameNotFoundException e) {
+ Log.w(TAG, "Allowed package not found: " + allowedPackage);
+ continue;
+ }
+ }
+ }
+ }
+
+ String[] disallowedArray = restrictions.getStringArray(RESTRICTION_DISALLOWED);
+ if (disallowedArray != null) {
+ for (int i = 0; i < disallowedArray.length; i++) {
+ String disallowedPackage = disallowedArray[i];
+ if (!TextUtils.isEmpty(disallowedPackage)) {
+ try {
+ builder.addDisallowedApplication(disallowedPackage);
+ } catch(NameNotFoundException e) {
+ Log.w(TAG, "Disallowed package not found: " + disallowedPackage);
+ continue;
+ }
+ }
+ }
+ }
+
+ builder.setMtu(MTU);
+ builder.setBlocking(true);
+ builder.setSession(TAG);
+
+ mFd = builder.establish();
+ if (mFd == null) {
+ Log.e(TAG, "Unable to establish file descriptor for VPN connection");
+ return;
+ }
+ Log.i(TAG, "Established, fd=" + mFd.getFd());
+
+ mPingReflector = new PingReflector(mFd.getFileDescriptor(), MTU);
+ mPingReflector.start();
+ }
+
+ private void stop() {
+ if (mPingReflector != null) {
+ mPingReflector.interrupt();
+ mPingReflector = null;
+ }
+ try {
+ if (mFd != null) {
+ Log.i(TAG, "Closing filedescriptor");
+ mFd.close();
+ }
+ } catch(IOException e) {
+ Log.w(TAG, "Closing filedescriptor failed", e);
+ } finally {
+ mFd = null;
+ }
+ }
+}
diff --git a/hostsidetests/devicepolicy/app/VpnApp/src/com/android/cts/vpnfirewall/Rfc1071.java b/hostsidetests/devicepolicy/app/VpnApp/src/com/android/cts/vpnfirewall/Rfc1071.java
new file mode 100644
index 0000000..dbdf9f2
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/VpnApp/src/com/android/cts/vpnfirewall/Rfc1071.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.vpnfirewall;
+
+public final class Rfc1071 {
+ static int checksum(byte[] data, int length) {
+ int sum = 0;
+
+ // High bytes (even indices)
+ for (int i = 0; i < length; i += 2) {
+ sum += (data[i] & 0xFF) << 8;
+ sum = (sum & 0xFFFF) + (sum >> 16);
+ }
+
+ // Low bytes (odd indices)
+ for (int i = 1; i < length; i += 2) {
+ sum += (data[i] & 0xFF);
+ sum = (sum & 0xFFFF) + (sum >> 16);
+ }
+
+ // Fix any one's-complement errors- sometimes it is necessary to rotate twice.
+ sum = (sum & 0xFFFF) + (sum >> 16);
+ return sum ^ 0xFFFF;
+ }
+}
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceAndProfileOwnerTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceAndProfileOwnerTest.java
index c2c5cba..2f14d39 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceAndProfileOwnerTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceAndProfileOwnerTest.java
@@ -66,6 +66,9 @@
= "com.android.cts.devicepolicy.accountmanagement";
private static final String ACCOUNT_MANAGEMENT_APK = "CtsAccountManagementDevicePolicyApp.apk";
+ private static final String VPN_APP_PKG = "com.android.cts.vpnfirewall";
+ private static final String VPN_APP_APK = "CtsVpnFirewallApp.apk";
+
private static final String COMMAND_ADD_USER_RESTRICTION = "add-restriction";
private static final String COMMAND_CLEAR_USER_RESTRICTION = "clear-restriction";
private static final String COMMAND_BLOCK_ACCOUNT_TYPE = "block-accounttype";
@@ -89,6 +92,7 @@
getDevice().uninstallPackage(APP_RESTRICTIONS_TARGET_APP_PKG);
getDevice().uninstallPackage(CERT_INSTALLER_PKG);
getDevice().uninstallPackage(ACCOUNT_MANAGEMENT_PKG);
+ getDevice().uninstallPackage(VPN_APP_PKG);
}
super.tearDown();
}
@@ -150,6 +154,14 @@
executeDeviceTestMethod(".PermissionsTest", "testPermissionGrantState");
}
+ public void testAlwaysOnVpn() throws Exception {
+ if (!mHasFeature) {
+ return;
+ }
+ installAppAsUser(VPN_APP_APK, mUserId);
+ executeDeviceTestClass(".AlwaysOnVpnTest");
+ }
+
public void testPermissionPolicy() throws Exception {
if (!mHasFeature) {
return;
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceOwnerTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceOwnerTest.java
index 2d235f5..0b32a19 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceOwnerTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceOwnerTest.java
@@ -43,6 +43,15 @@
private static final String CLEAR_DEVICE_OWNER_TEST_CLASS =
DEVICE_OWNER_PKG + ".ClearDeviceOwnerTest";
+ /** The ephemeral users are implemented and supported on the device. */
+ private boolean mHasEphemeralUserFeature;
+
+ /**
+ * Ephemeral users are implemented, but unsupported on the device (because of missing split
+ * system user).
+ */
+ private boolean mHasDisabledEphemeralUserFeature;
+
@Override
protected void setUp() throws Exception {
super.setUp();
@@ -51,6 +60,9 @@
assertTrue("Failed to set device owner",
setDeviceOwner(DEVICE_OWNER_PKG + "/" + ADMIN_RECEIVER_TEST_CLASS));
}
+ mHasEphemeralUserFeature = mHasFeature && canCreateAdditionalUsers(1) && hasUserSplit();
+ mHasDisabledEphemeralUserFeature =
+ mHasFeature && canCreateAdditionalUsers(1) && !hasUserSplit();
}
@Override
@@ -82,6 +94,13 @@
executeDeviceOwnerTest("LockScreenInfoTest");
}
+ public void testWifi() throws Exception {
+ if (hasDeviceFeature("android.hardware.wifi")) {
+ return;
+ }
+ executeDeviceOwnerTest("WifiTest");
+ }
+
public void testRemoteBugreportWithTwoUsers() throws Exception {
if (!mHasFeature || getMaxNumberOfUsersSupported() < 2) {
return;
@@ -102,12 +121,20 @@
/** Tries to toggle the force-ephemeral-users on and checks it was really set. */
public void testSetForceEphemeralUsers() throws Exception {
- if (!mHasFeature || getDevice().getApiLevel() < 24 /* Build.VERSION_CODES.N */
- || !canCreateAdditionalUsers(1)) {
+ if (!mHasEphemeralUserFeature) {
return;
}
// Set force-ephemeral-users policy and verify it was set.
- executeDeviceOwnerTest("ForceEphemeralUsersTest");
+ executeDeviceTestMethod(".ForceEphemeralUsersTest", "testSetForceEphemeralUsers");
+ }
+
+ /**
+ * Setting force-ephemeral-users policy to true without a split system user should fail.
+ */
+ public void testSetForceEphemeralUsersFailsWithoutSplitSystemUser() throws Exception {
+ if (mHasDisabledEphemeralUserFeature) {
+ executeDeviceTestMethod(".ForceEphemeralUsersTest", "testSetForceEphemeralUsersFails");
+ }
}
/**
@@ -117,8 +144,7 @@
* <p>If the current user is the system user, the other users are removed straight away.
*/
public void testRemoveUsersOnSetForceEphemeralUsers() throws Exception {
- if (!mHasFeature || getDevice().getApiLevel() < 24 /* Build.VERSION_CODES.N */
- || !canCreateAdditionalUsers(1)) {
+ if (!mHasEphemeralUserFeature) {
return;
}
@@ -127,7 +153,7 @@
assertTrue("User must have been created", listUsers().contains(userId));
// Set force-ephemeral-users policy and verify it was set.
- executeDeviceOwnerTest("ForceEphemeralUsersTest");
+ executeDeviceTestMethod(".ForceEphemeralUsersTest", "testSetForceEphemeralUsers");
// Users have to be removed when force-ephemeral-users is toggled on.
assertFalse("User must have been removed", listUsers().contains(userId));
@@ -141,8 +167,7 @@
* before all other users are removed.
*/
public void testRemoveUsersOnSetForceEphemeralUsersWithUserSwitch() throws Exception {
- if (!mHasFeature || getDevice().getApiLevel() < 24 /* Build.VERSION_CODES.N */
- || !canCreateAdditionalUsers(1)) {
+ if (!mHasEphemeralUserFeature) {
return;
}
@@ -154,7 +179,7 @@
switchUser(userId);
// Set force-ephemeral-users policy and verify it was set.
- executeDeviceOwnerTestAsUser("ForceEphemeralUsersTest", 0);
+ executeDeviceTestMethod(".ForceEphemeralUsersTest", "testSetForceEphemeralUsers");
// Make sure the user has been removed. As it is not a synchronous operation - switching to
// the system user must happen first - give the system a little bit of time for finishing
@@ -177,13 +202,12 @@
/** The users created after setting force-ephemeral-users policy to true must be ephemeral. */
public void testCreateUserAfterSetForceEphemeralUsers() throws Exception {
- if (!mHasFeature || getDevice().getApiLevel() < 24 /* Build.VERSION_CODES.N */
- || !canCreateAdditionalUsers(1)) {
+ if (!mHasEphemeralUserFeature) {
return;
}
// Set force-ephemeral-users policy and verify it was set.
- executeDeviceOwnerTest("ForceEphemeralUsersTest");
+ executeDeviceTestMethod(".ForceEphemeralUsersTest", "testSetForceEphemeralUsers");
int userId = createUser();
assertTrue("User must be ephemeral", 0 != (getUserFlags(userId) & FLAG_EPHEMERAL));
@@ -193,14 +217,12 @@
* Test creating an epehemeral user using the DevicePolicyManager's createAndManageUser method.
*/
public void testCreateAndManageEphemeralUser() throws Exception {
- if (!mHasFeature || getDevice().getApiLevel() < 24 /* Build.VERSION_CODES.N */
- || !canCreateAdditionalUsers(1)) {
+ if (!mHasEphemeralUserFeature) {
return;
}
ArrayList<Integer> originalUsers = listUsers();
- assertTrue(runDeviceTests(DEVICE_OWNER_PKG, ".CreateAndManageUserTest",
- "testCreateAndManageEphemeralUser", 0));
+ executeDeviceTestMethod(".CreateAndManageUserTest", "testCreateAndManageEphemeralUser");
ArrayList<Integer> newUsers = listUsers();
@@ -222,6 +244,17 @@
assertEquals("Ephemeral flag must be set", FLAG_EPHEMERAL, flags & FLAG_EPHEMERAL);
}
+ /**
+ * Test that creating an epehemeral user using the DevicePolicyManager's createAndManageUser
+ * method fails on systems without the split system user.
+ */
+ public void testCreateAndManageEphemeralUserFailsWithoutSplitSystemUser() throws Exception {
+ if (mHasDisabledEphemeralUserFeature) {
+ executeDeviceTestMethod(
+ ".CreateAndManageUserTest", "testCreateAndManageEphemeralUserFails");
+ }
+ }
+
public void testDeviceLoggingWithTwoUsers() throws Exception {
if (!mHasFeature || getMaxNumberOfUsersSupported() < 2) {
return;
@@ -298,12 +331,4 @@
assertTrue(runDeviceTestsAsUser(DEVICE_OWNER_PKG, className, testName,
/* deviceOwnerUserId */ 0));
}
-
- private void executeDeviceOwnerTestAsUser(String testClassName, int userId) throws Exception {
- if (!mHasFeature) {
- return;
- }
- String testClass = DEVICE_OWNER_PKG + "." + testClassName;
- assertTrue(testClass + " failed.", runDeviceTestsAsUser(DEVICE_OWNER_PKG, testClass, userId));
- }
}
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/EphemeralUserTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/EphemeralUserTest.java
index 2133431..df4a47c 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/EphemeralUserTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/EphemeralUserTest.java
@@ -24,8 +24,7 @@
@Override
protected void setUp() throws Exception {
super.setUp();
- mHasFeature = getDevice().getApiLevel() >= 24 /* Build.VERSION_CODES.N */
- && canCreateAdditionalUsers(1);
+ mHasFeature = canCreateAdditionalUsers(1);
}
@Override
@@ -36,7 +35,7 @@
/** The user should have the ephemeral flag set if it was created as ephemeral. */
public void testCreateEphemeralUser() throws Exception {
- if (!mHasFeature) {
+ if (!mHasFeature || !hasUserSplit()) {
return;
}
int userId = createUser(FLAG_EPHEMERAL);
@@ -73,7 +72,7 @@
* Ephemeral user should be automatically removed after it is stopped.
*/
public void testRemoveEphemeralOnStop() throws Exception {
- if (!mHasFeature) {
+ if (!mHasFeature || !hasUserSplit()) {
return;
}
int userId = createUser(FLAG_EPHEMERAL);
@@ -88,7 +87,7 @@
* and not ephemeral when the feature is not set.
*/
public void testEphemeralGuestFeature() throws Exception {
- if (!mHasFeature) {
+ if (!mHasFeature || !hasUserSplit()) {
return;
}
// Create a guest user.
@@ -104,6 +103,20 @@
}
}
+ /**
+ * Test that creating an ephemeral user fails on systems without the split system user.
+ */
+ public void testCreateEphemeralWithoutUserSplitFails() throws Exception {
+ if (!mHasFeature || hasUserSplit()) {
+ return;
+ }
+ String command ="pm create-user --ephemeral " + "TestUser_" + System.currentTimeMillis();
+ String commandOutput = getDevice().executeShellCommand(command);
+
+ assertEquals("Creating the epehemeral user should fail.",
+ "Error: couldn't create User.", commandOutput.trim());
+ }
+
private boolean getGuestUsersEphemeral() throws Exception {
String commandOutput = getDevice().executeShellCommand("dumpsys user");
String[] outputLines = commandOutput.split("\n");
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ManagedProfileTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ManagedProfileTest.java
index 5d1198c..dca463e 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ManagedProfileTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ManagedProfileTest.java
@@ -465,6 +465,10 @@
if (!mHasFeature) {
return;
}
+ assertTrue(runDeviceTests(MANAGED_PROFILE_PKG, ".OrganizationInfoTest",
+ "testDefaultOrganizationColorIsGray", mProfileUserId));
+ assertTrue(runDeviceTests(MANAGED_PROFILE_PKG, ".OrganizationInfoTest",
+ "testDefaultOrganizationNameIsNull", mProfileUserId));
assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".OrganizationInfoTest",
mProfileUserId));
}
@@ -629,10 +633,20 @@
if (!mHasFeature) {
return;
}
- // Place a outgoing call through work phone account and verify the call is inserted
- // properly.
+ // Place a outgoing call through work phone account using TelecomManager and verify the
+ // call is inserted properly.
assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".PhoneAccountTest",
- "testOutgoingCall",
+ "testOutgoingCallUsingTelecomManager",
+ mProfileUserId));
+ // Make sure the call is not inserted into parent user.
+ assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".PhoneAccountTest",
+ "testEnsureCallNotInserted",
+ mParentUserId));
+
+ // Place a outgoing call through work phone account using ACTION_CALL and verify the call
+ // is inserted properly.
+ assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".PhoneAccountTest",
+ "testOutgoingCallUsingActionCall",
mProfileUserId));
// Make sure the call is not inserted into parent user.
assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".PhoneAccountTest",
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/MixedProfileOwnerTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/MixedProfileOwnerTest.java
index a527598..940faf6 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/MixedProfileOwnerTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/MixedProfileOwnerTest.java
@@ -45,92 +45,4 @@
}
super.tearDown();
}
-
- @Override
- public void testPermissionAppUpdate() {
- // TODO Should it be failing?
- /*
-01-27 14:11:14 I/BaseDevicePolicyTest: Test com.android.cts.deviceandprofileowner.PermissionsTest#testPermissionUpdate_setAutoDeniedPolicy: FAILURE
-01-27 14:11:14 W/BaseDevicePolicyTest: junit.framework.AssertionFailedError
-at junit.framework.Assert.fail(Assert.java:48)
-at junit.framework.Assert.assertTrue(Assert.java:20)
-at junit.framework.Assert.assertNotNull(Assert.java:218)
-at junit.framework.Assert.assertNotNull(Assert.java:211)
-at com.android.cts.deviceandprofileowner.PermissionsTest$PermissionBroadcastReceiver.waitForBroadcast(PermissionsTest.java:315)
-at com.android.cts.deviceandprofileowner.PermissionsTest.assertPermissionRequest(PermissionsTest.java:241)
-at com.android.cts.deviceandprofileowner.PermissionsTest.assertPermissionRequest(PermissionsTest.java:229)
-at com.android.cts.deviceandprofileowner.PermissionsTest.testPermissionUpdate_setAutoDeniedPolicy(PermissionsTest.java:193)
-at java.lang.reflect.Method.invoke(Native Method)
-at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:214)
-at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:199)
-at junit.framework.TestCase.runBare(TestCase.java:134)
-at junit.framework.TestResult$1.protect(TestResult.java:115)
-at android.support.test.internal.runner.junit3.AndroidTestResult.runProtected(AndroidTestResult.java:77)
-at junit.framework.TestResult.run(TestResult.java:118)
-at android.support.test.internal.runner.junit3.AndroidTestResult.run(AndroidTestResult.java:55)
-at junit.framework.TestCase.run(TestCase.java:124)
-at android.support.test.internal.runner.junit3.NonLeakyTestSuite$NonLeakyTest.run(NonLeakyTestSuite.java:63)
-at junit.framework.TestSuite.runTest(TestSuite.java:243)
-at junit.framework.TestSuite.run(TestSuite.java:238)
-at android.support.test.internal.runner.junit3.DelegatingTestSuite.run(DelegatingTestSuite.java:103)
-at android.support.test.internal.runner.junit3.AndroidTestSuite.run(AndroidTestSuite.java:69)
-at android.support.test.internal.runner.junit3.JUnit38ClassRunner.run(JUnit38ClassRunner.java:90)
-at org.junit.runners.Suite.runChild(Suite.java:128)
-at org.junit.runners.Suite.runChild(Suite.java:27)
-at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
-at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
-at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
-at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
-at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
-at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
-at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
-at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
-at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:54)
-at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:240)
-at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1870)
- */
- }
-
- @Override
- public void testPermissionPrompts() {
- // TODO Should it be failing?
- /*
-01-27 14:15:54 I/BaseDevicePolicyTest: Test com.android.cts.deviceandprofileowner.PermissionsTest#testPermissionPrompts: FAILURE
-01-27 14:15:54 W/BaseDevicePolicyTest: junit.framework.AssertionFailedError: Couldn't find button with resource id: permission_deny_button
-at junit.framework.Assert.fail(Assert.java:50)
-at junit.framework.Assert.assertTrue(Assert.java:20)
-at junit.framework.Assert.assertNotNull(Assert.java:218)
-at com.android.cts.deviceandprofileowner.PermissionsTest.pressPermissionPromptButton(PermissionsTest.java:298)
-at com.android.cts.deviceandprofileowner.PermissionsTest.assertPermissionRequest(PermissionsTest.java:240)
-at com.android.cts.deviceandprofileowner.PermissionsTest.testPermissionPrompts(PermissionsTest.java:177)
-at java.lang.reflect.Method.invoke(Native Method)
-at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:214)
-at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:199)
-at junit.framework.TestCase.runBare(TestCase.java:134)
-at junit.framework.TestResult$1.protect(TestResult.java:115)
-at android.support.test.internal.runner.junit3.AndroidTestResult.runProtected(AndroidTestResult.java:77)
-at junit.framework.TestResult.run(TestResult.java:118)
-at android.support.test.internal.runner.junit3.AndroidTestResult.run(AndroidTestResult.java:55)
-at junit.framework.TestCase.run(TestCase.java:124)
-at android.support.test.internal.runner.junit3.NonLeakyTestSuite$NonLeakyTest.run(NonLeakyTestSuite.java:63)
-at junit.framework.TestSuite.runTest(TestSuite.java:243)
-at junit.framework.TestSuite.run(TestSuite.java:238)
-at android.support.test.internal.runner.junit3.DelegatingTestSuite.run(DelegatingTestSuite.java:103)
-at android.support.test.internal.runner.junit3.AndroidTestSuite.run(AndroidTestSuite.java:69)
-at android.support.test.internal.runner.junit3.JUnit38ClassRunner.run(JUnit38ClassRunner.java:90)
-at org.junit.runners.Suite.runChild(Suite.java:128)
-at org.junit.runners.Suite.runChild(Suite.java:27)
-at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
-at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
-at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
-at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
-at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
-at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
-at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
-at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
-at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:54)
-at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:240)
-at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1870)
- */
- }
}
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..e81316c
--- /dev/null
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ProfileOwnerTest.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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;
+
+/**
+ * Host side tests for profile owner. Run the CtsProfileOwnerApp device side test.
+ */
+public class ProfileOwnerTest extends BaseDevicePolicyTest {
+ 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 CLEAR_PROFILE_OWNER_TEST_CLASS =
+ PROFILE_OWNER_PKG + ".ClearProfileOwnerTest";
+
+ private int mUserId = 0;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ mUserId = getPrimaryUser();
+
+
+ if (mHasFeature) {
+ installApp(PROFILE_OWNER_APK);
+ assertTrue("Failed to set profile owner",
+ setProfileOwner(PROFILE_OWNER_PKG + "/" + ADMIN_RECEIVER_TEST_CLASS, mUserId));
+ }
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ if (mHasFeature) {
+ assertTrue("Failed to remove profile owner.",
+ runDeviceTests(PROFILE_OWNER_PKG, CLEAR_PROFILE_OWNER_TEST_CLASS));
+ getDevice().uninstallPackage(PROFILE_OWNER_PKG);
+ }
+
+ super.tearDown();
+ }
+
+ public void testWifi() throws Exception {
+ if (hasDeviceFeature("android.hardware.wifi")) {
+ return;
+ }
+ executeProfileOwnerTest("WifiTest");
+ }
+
+ private void executeProfileOwnerTest(String testClassName) throws Exception {
+ if (!mHasFeature) {
+ return;
+ }
+ String testClass = PROFILE_OWNER_PKG + "." + testClassName;
+ assertTrue(testClass + " failed.", runDeviceTests(PROFILE_OWNER_PKG, testClass));
+ }
+}
diff --git a/hostsidetests/net/app/AndroidManifest.xml b/hostsidetests/net/app/AndroidManifest.xml
index f44fdd1..c7978f8 100644
--- a/hostsidetests/net/app/AndroidManifest.xml
+++ b/hostsidetests/net/app/AndroidManifest.xml
@@ -15,11 +15,12 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.cts.net.hostside"
- android:sharedUserId="com.android.cts.net.hostside.apps">
+ package="com.android.cts.net.hostside">
- <uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
+ <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
+ <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
+ <uses-permission android:name="android.permission.INTERNET"/>
<application>
<uses-library android:name="android.test.runner" />
diff --git a/hostsidetests/net/app/src/com/android/cts/net/hostside/AbstractRestrictBackgroundNetworkTestCase.java b/hostsidetests/net/app/src/com/android/cts/net/hostside/AbstractRestrictBackgroundNetworkTestCase.java
new file mode 100644
index 0000000..3f80b5a
--- /dev/null
+++ b/hostsidetests/net/app/src/com/android/cts/net/hostside/AbstractRestrictBackgroundNetworkTestCase.java
@@ -0,0 +1,354 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.net.hostside;
+
+import static android.cts.util.SystemUtil.runShellCommand;
+import static android.net.ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED;
+import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_DISABLED;
+import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_ENABLED;
+import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_WHITELISTED;
+
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+
+import android.app.Instrumentation;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+import android.net.wifi.WifiManager;
+import android.test.InstrumentationTestCase;
+import android.util.Log;
+
+/**
+ * Superclass for tests related to background network restrictions.
+ */
+abstract class AbstractRestrictBackgroundNetworkTestCase extends InstrumentationTestCase {
+ protected static final String TAG = "RestrictBackgroundNetworkTests";
+
+ protected static final String TEST_PKG = "com.android.cts.net.hostside";
+ protected static final String TEST_APP2_PKG = "com.android.cts.net.hostside.app2";
+
+ private static final int SLEEP_TIME_SEC = 1;
+ private static final boolean DEBUG = true;
+
+ // Constants below must match values defined on app2's Common.java
+ private static final String MANIFEST_RECEIVER = "ManifestReceiver";
+ private static final String DYNAMIC_RECEIVER = "DynamicReceiver";
+ private static final String ACTION_GET_COUNTERS =
+ "com.android.cts.net.hostside.app2.action.GET_COUNTERS";
+ private static final String ACTION_CHECK_NETWORK =
+ "com.android.cts.net.hostside.app2.action.CHECK_NETWORK";
+ private static final String EXTRA_ACTION = "com.android.cts.net.hostside.app2.extra.ACTION";
+ private static final String EXTRA_RECEIVER_NAME =
+ "com.android.cts.net.hostside.app2.extra.RECEIVER_NAME";
+ private static final String RESULT_SEPARATOR = ";";
+ private static final String STATUS_NETWORK_UNAVAILABLE_PREFIX = "NetworkUnavailable:";
+ private static final String STATUS_NETWORK_AVAILABLE_PREFIX = "NetworkAvailable:";
+ private static final int NETWORK_TIMEOUT_MS = 15 * 1000;
+
+ // Must be higher than NETWORK_TIMEOUT_MS
+ private static final int ORDERED_BROADCAST_TIMEOUT_MS = NETWORK_TIMEOUT_MS * 4;
+
+ protected Context mContext;
+ protected Instrumentation mInstrumentation;
+ protected ConnectivityManager mCm;
+ protected WifiManager mWfm;
+ protected int mUid;
+ private boolean mResetMeteredWifi = false;
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ mInstrumentation = getInstrumentation();
+ mContext = mInstrumentation.getContext();
+ mCm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
+ mWfm = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
+ mUid = mContext.getPackageManager().getPackageInfo(TEST_APP2_PKG, 0).applicationInfo.uid;
+ final int myUid = mContext.getPackageManager()
+ .getPackageInfo(mContext.getPackageName(), 0).applicationInfo.uid;
+
+ Log.d(TAG, "UIDS: test app=" + myUid + ", app2=" + mUid);
+
+ setMeteredNetwork();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+
+ if (mResetMeteredWifi) {
+ setWifiMeteredStatus(false);
+ }
+ }
+
+ protected void assertRestrictBackgroundChangedReceived(int expectedCount) throws Exception {
+ assertRestrictBackgroundChangedReceived(DYNAMIC_RECEIVER, expectedCount);
+ assertRestrictBackgroundChangedReceived(MANIFEST_RECEIVER, 0);
+ }
+
+ protected void assertRestrictBackgroundChangedReceived(String receiverName, int expectedCount)
+ throws Exception {
+ int attempts = 0;
+ int count = 0;
+ final int maxAttempts = 5;
+ do {
+ attempts++;
+ count = getNumberBroadcastsReceived(receiverName, ACTION_RESTRICT_BACKGROUND_CHANGED);
+ if (count == expectedCount) {
+ break;
+ }
+ Log.d(TAG, "Expecting count " + expectedCount + " but actual is " + count + " after "
+ + attempts + " attempts; sleeping "
+ + SLEEP_TIME_SEC + " seconds before trying again");
+ Thread.sleep(SLEEP_TIME_SEC * 1000);
+ } while (attempts <= maxAttempts);
+ assertEquals("Number of expected broadcasts for " + receiverName + " not reached after "
+ + maxAttempts * SLEEP_TIME_SEC + " seconds", expectedCount, count);
+ }
+
+ protected String sendOrderedBroadcast(Intent intent) throws Exception {
+ final LinkedBlockingQueue<String> result = new LinkedBlockingQueue<>(1);
+ Log.d(TAG, "Sending ordered broadcast: " + intent);
+ mContext.sendOrderedBroadcast(intent, null, new BroadcastReceiver() {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ final String resultData = getResultData();
+ if (resultData == null) {
+ Log.e(TAG, "Received null data from ordered intent");
+ return;
+ }
+ result.offer(resultData);
+ }
+ }, null, 0, null, null);
+
+ final String resultData = result.poll(ORDERED_BROADCAST_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+ Log.d(TAG, "Ordered broadcast response: " + resultData);
+ return resultData;
+ }
+
+ protected int getNumberBroadcastsReceived(String receiverName, String action) throws Exception {
+ final Intent intent = new Intent(ACTION_GET_COUNTERS);
+ intent.putExtra(EXTRA_ACTION, ACTION_RESTRICT_BACKGROUND_CHANGED);
+ intent.putExtra(EXTRA_RECEIVER_NAME, receiverName);
+ final String resultData = sendOrderedBroadcast(intent);
+ assertNotNull("timeout waiting for ordered broadcast result", resultData);
+ return Integer.valueOf(resultData);
+ }
+
+ protected void assertRestrictBackgroundStatus(int expectedApiStatus) throws Exception {
+ final Intent intent = new Intent(ACTION_CHECK_NETWORK);
+ final String resultData = sendOrderedBroadcast(intent);
+ final String[] resultItems = resultData.split(RESULT_SEPARATOR);
+ final String actualApiStatus = toString(Integer.parseInt(resultItems[0]));
+ // First asserts the API returns the proper value...
+ assertEquals("wrong status", toString(expectedApiStatus), actualApiStatus);
+
+ //...then the actual network status in the background thread.
+ final String networkStatus = getNetworkStatus(resultItems);
+ assertNetworkStatus(expectedApiStatus != RESTRICT_BACKGROUND_STATUS_ENABLED, networkStatus);
+ }
+
+ protected void assertBackgroundNetworkAccess(boolean expectAllowed) throws Exception {
+ final Intent intent = new Intent(ACTION_CHECK_NETWORK);
+ final String resultData = sendOrderedBroadcast(intent);
+ final String[] resultItems = resultData.split(RESULT_SEPARATOR);
+ final String networkStatus = getNetworkStatus(resultItems);
+ assertNetworkStatus(expectAllowed, networkStatus);
+ }
+
+ private String getNetworkStatus(String[] resultItems) {
+ return resultItems.length < 2 ? null : resultItems[1];
+ }
+
+ private void assertNetworkStatus(boolean expectAvailable, String status) throws Exception {
+ if (status == null) {
+ Log.d(TAG, "timeout waiting for ordered broadcast");
+ if (expectAvailable) {
+ fail("did not get network status when access was allowed");
+ }
+ return;
+ }
+ final String expectedPrefix = expectAvailable ?
+ STATUS_NETWORK_AVAILABLE_PREFIX : STATUS_NETWORK_UNAVAILABLE_PREFIX;
+ assertTrue("Wrong network status (" + status + ") when expectedAvailable is "
+ + expectAvailable, status.startsWith(expectedPrefix));
+ }
+
+ protected String executeShellCommand(String command) throws Exception {
+ final String result = runShellCommand(mInstrumentation, command).trim();
+ if (DEBUG) Log.d(TAG, "Command '" + command + "' returned '" + result + "'");
+ return result;
+ }
+
+ /**
+ * Runs a Shell command which is not expected to generate output.
+ */
+ protected void executeSilentShellCommand(String command) throws Exception {
+ final String result = executeShellCommand(command);
+ assertTrue("Command '" + command + "' failed: " + result, result.trim().isEmpty());
+ }
+
+ /**
+ * Asserts the result of a command, wait and re-running it a couple times if necessary.
+ */
+ protected void assertDelayedShellCommand(String command, String expectedResult)
+ throws Exception {
+ final int maxTries = 5;
+ for (int i = 1; i <= maxTries; i++) {
+ final String result = executeShellCommand(command).trim();
+ if (result.equals(expectedResult))
+ return;
+ Log.v(TAG, "Command '" + command + "' returned '" + result + " instead of '"
+ + expectedResult + "' on attempt #; sleeping 1s before polling again");
+ Thread.sleep(1000);
+ }
+ fail("Command '" + command + "' did not return '" + expectedResult + "' after " + maxTries
+ + " attempts");
+ }
+
+ protected void setMeteredNetwork() throws Exception {
+ final NetworkInfo info = mCm.getActiveNetworkInfo();
+ final boolean metered = mCm.isActiveNetworkMetered();
+ if (metered) {
+ Log.d(TAG, "Active network already metered: " + info);
+ return;
+ }
+ final String netId = setWifiMeteredStatus(true);
+ assertTrue("Could not set wifi '" + netId + "' as metered ("
+ + mCm.getActiveNetworkInfo() +")", mCm.isActiveNetworkMetered());
+ // Set flag so status is reverted on teardown.
+ mResetMeteredWifi = true;
+ }
+
+ protected String setWifiMeteredStatus(boolean metered) throws Exception {
+ mWfm.setWifiEnabled(true);
+ // TODO: if it's not guaranteed the device has wi-fi, we need to change the tests
+ // to make the actual verification of restrictions optional.
+ final String ssid = mWfm.getConnectionInfo().getSSID();
+ assertNotNull("null SSID", ssid);
+ final String netId = ssid.trim().replaceAll("\"", ""); // remove quotes, if any.
+ assertFalse("empty SSID", ssid.isEmpty());
+
+ Log.i(TAG, "Setting wi-fi network " + netId + " metered status to " + metered);
+ final String setCommand = "cmd netpolicy set metered-network " + netId + " " + metered;
+ final String result = executeShellCommand(setCommand);
+ assertTrue("Command '" + setCommand + "' failed: " + result, result.isEmpty());
+
+ // Sanity check.
+ final String newStatus = executeShellCommand("cmd netpolicy get metered-network " + netId);
+ assertEquals("Metered status of wi-fi network " + netId + " not set properly",
+ newStatus.trim(), Boolean.toString(metered));
+ return netId;
+ }
+
+ protected void setRestrictBackground(boolean enabled) throws Exception {
+ executeShellCommand("cmd netpolicy set restrict-background " + enabled);
+ final String output = executeShellCommand("cmd netpolicy get restrict-background ");
+ final String expectedSuffix = enabled ? "enabled" : "disabled";
+ // TODO: use MoreAsserts?
+ assertTrue("output '" + output + "' should end with '" + expectedSuffix + "'",
+ output.endsWith(expectedSuffix));
+ }
+
+ protected void addRestrictBackgroundWhitelist(int uid) throws Exception {
+ executeShellCommand("cmd netpolicy add restrict-background-whitelist " + uid);
+ assertRestrictBackgroundWhitelist(uid, true);
+ }
+
+ protected void removeRestrictBackgroundWhitelist(int uid) throws Exception {
+ executeShellCommand("cmd netpolicy remove restrict-background-whitelist " + uid);
+ assertRestrictBackgroundWhitelist(uid, false);
+ }
+
+ protected void assertRestrictBackgroundWhitelist(int uid, boolean expected) throws Exception {
+ final int maxTries = 5;
+ boolean actual = false;
+ for (int i = 1; i <= maxTries; i++) {
+ final String output =
+ executeShellCommand("cmd netpolicy list restrict-background-whitelist ");
+ actual = output.contains(Integer.toString(uid));
+ if (expected == actual) {
+ return;
+ }
+ Log.v(TAG, "whitelist check for uid " + uid + " doesn't match yet (expected "
+ + expected + ", got " + actual + "); sleeping 1s before polling again");
+ Thread.sleep(1000);
+ }
+ fail("whitelist check for uid " + uid + " failed: expected " + expected + ", got " + actual);
+ }
+
+ protected void assertPowerSaveModeWhitelist(String packageName, boolean expected)
+ throws Exception {
+ // TODO: currently the power-save mode is behaving like idle, but once it changes, we'll
+ // need to use netpolicy for whitelisting
+ assertDelayedShellCommand("dumpsys deviceidle whitelist =" + packageName,
+ Boolean.toString(expected));
+ }
+
+ protected void addPowerSaveModeWhitelist(String packageName) throws Exception {
+ Log.i(TAG, "Adding package " + packageName + " to power-save-mode whitelist");
+ // TODO: currently the power-save mode is behaving like idle, but once it changes, we'll
+ // need to use netpolicy for whitelisting
+ executeShellCommand("dumpsys deviceidle whitelist +" + packageName);
+ assertPowerSaveModeWhitelist(packageName, true); // Sanity check
+ }
+
+ protected void removePowerSaveModeWhitelist(String packageName) throws Exception {
+ Log.i(TAG, "Removing package " + packageName + " from power-save-mode whitelist");
+ // TODO: currently the power-save mode is behaving like idle, but once it changes, we'll
+ // need to use netpolicy for whitelisting
+ executeShellCommand("dumpsys deviceidle whitelist -" + packageName);
+ assertPowerSaveModeWhitelist(packageName, false); // Sanity check
+ }
+
+ protected void setPowerSaveMode(boolean enabled) throws Exception {
+ Log.i(TAG, "Setting power mode to " + enabled);
+ if (enabled) {
+ executeSilentShellCommand("cmd battery unplug");
+ executeSilentShellCommand("settings put global low_power 1");
+ } else {
+ executeSilentShellCommand("cmd battery reset");
+ }
+ }
+
+ /**
+ * Starts a service that will register a broadcast receiver to receive
+ * {@code RESTRICT_BACKGROUND_CHANGE} intents.
+ * <p>
+ * The service must run in a separate app because otherwise it would be killed every time
+ * {@link #runDeviceTests(String, String)} is executed.
+ */
+ protected void registerApp2BroadcastReceiver() throws Exception {
+ executeShellCommand("am startservice com.android.cts.net.hostside.app2/.MyService");
+ }
+
+ private String toString(int status) {
+ switch (status) {
+ case RESTRICT_BACKGROUND_STATUS_DISABLED:
+ return "DISABLED";
+ case RESTRICT_BACKGROUND_STATUS_WHITELISTED:
+ return "WHITELISTED";
+ case RESTRICT_BACKGROUND_STATUS_ENABLED:
+ return "ENABLED";
+ default:
+ return "UNKNOWN_STATUS_" + status;
+ }
+ }
+}
diff --git a/hostsidetests/net/app/src/com/android/cts/net/hostside/BatterySaverModeTest.java b/hostsidetests/net/app/src/com/android/cts/net/hostside/BatterySaverModeTest.java
new file mode 100644
index 0000000..29a0309
--- /dev/null
+++ b/hostsidetests/net/app/src/com/android/cts/net/hostside/BatterySaverModeTest.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.net.hostside;
+
+public class BatterySaverModeTest extends AbstractRestrictBackgroundNetworkTestCase {
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+
+ setPowerSaveMode(false);
+ assertPowerSaveModeWhitelist(TEST_APP2_PKG, false); // Sanity check
+ registerApp2BroadcastReceiver();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+
+ setPowerSaveMode(false);
+ }
+
+ public void testBackgroundNetworkAccess_enabled() throws Exception {
+ setPowerSaveMode(true);
+ assertBackgroundNetworkAccess(false);
+ }
+
+ public void testBackgroundNetworkAccess_whitelisted() throws Exception {
+ setPowerSaveMode(true);
+ assertBackgroundNetworkAccess(false);
+ addPowerSaveModeWhitelist(TEST_APP2_PKG);
+ assertBackgroundNetworkAccess(true);
+ removePowerSaveModeWhitelist(TEST_APP2_PKG);
+ assertBackgroundNetworkAccess(false);
+ }
+
+ public void testBackgroundNetworkAccess_disabled() throws Exception {
+ setPowerSaveMode(false);
+ assertBackgroundNetworkAccess(true);
+ }
+}
diff --git a/hostsidetests/net/app/src/com/android/cts/net/hostside/ConnectivityManagerTest.java b/hostsidetests/net/app/src/com/android/cts/net/hostside/ConnectivityManagerTest.java
deleted file mode 100644
index 8975dab..0000000
--- a/hostsidetests/net/app/src/com/android/cts/net/hostside/ConnectivityManagerTest.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.net.hostside;
-
-import static android.net.ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED;
-import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_DISABLED;
-import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_ENABLED;
-import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_WHITELISTED;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.net.ConnectivityManager;
-import android.net.NetworkInfo;
-import android.test.InstrumentationTestCase;
-import android.util.Log;
-
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Tests for the {@link ConnectivityManager} API.
- *
- * <p>These tests rely on a host-side test to use {@code adb shell cmd netpolicy} to put the device
- * in the proper state. In fact, they're more like "assertions" than tests per se - the real test
- * logic is done on {@code HostsideNetworkTests}.
- */
-public class ConnectivityManagerTest extends InstrumentationTestCase {
- private static final String TAG = "ConnectivityManagerTest";
-
- private static final String MANIFEST_RECEIVER = "ManifestReceiver";
- private static final String DYNAMIC_RECEIVER = "DynamicReceiver";
-
- private static final String STATUS_NETWORK_UNAVAILABLE_PREFIX = "NetworkUnavailable:";
- private static final String STATUS_NETWORK_AVAILABLE_PREFIX = "NetworkAvailable:";
-
- private static final int NETWORK_TIMEOUT_MS = 15000;
- private static final int SLEEP_TIME_SEC = 1;
-
- private ConnectivityManager mCm;
- private int mUid;
-
- @Override
- public void setUp() throws Exception {
- super.setUp();
- final Context context = getInstrumentation().getContext();
- mCm = (ConnectivityManager) context.getSystemService(Activity.CONNECTIVITY_SERVICE);
- mUid = context.getPackageManager()
- .getPackageInfo(context.getPackageName(), 0).applicationInfo.uid;
- final boolean metered = mCm.isActiveNetworkMetered();
- Log.i(TAG, getName() + ": uid=" + mUid + ", metered=" + metered);
- assertTrue("Active network is not metered", metered);
- }
-
- public void testGetRestrictBackgroundStatus_disabled() throws Exception {
- assertRestrictBackgroundStatus(RESTRICT_BACKGROUND_STATUS_DISABLED);
- }
-
- public void testGetRestrictBackgroundStatus_whitelisted() throws Exception {
- assertRestrictBackgroundStatus(RESTRICT_BACKGROUND_STATUS_WHITELISTED);
- }
-
- public void testGetRestrictBackgroundStatus_enabled() throws Exception {
- assertRestrictBackgroundStatus(RESTRICT_BACKGROUND_STATUS_ENABLED);
- }
-
- public void testRestrictBackgroundChangedNotReceived() throws Exception {
- assertRestrictBackgroundChangedReceived(DYNAMIC_RECEIVER, 0);
- assertRestrictBackgroundChangedReceived(MANIFEST_RECEIVER, 0);
- }
-
- public void testRestrictBackgroundChangedReceivedOnce() throws Exception {
- assertRestrictBackgroundChangedReceived(DYNAMIC_RECEIVER, 1);
- assertRestrictBackgroundChangedReceived(MANIFEST_RECEIVER, 0);
- }
-
- public void testRestrictBackgroundChangedReceivedTwice() throws Exception {
- assertRestrictBackgroundChangedReceived(DYNAMIC_RECEIVER, 2);
- assertRestrictBackgroundChangedReceived(MANIFEST_RECEIVER, 0);
- }
-
- private void assertRestrictBackgroundChangedReceived(String receiverName, int expectedCount)
- throws Exception {
- int attempts = 0;
- int count = 0;
- final int maxAttempts = 5;
- do {
- attempts++;
- count = getNumberBroadcastsReceived(getInstrumentation().getContext(), receiverName,
- ACTION_RESTRICT_BACKGROUND_CHANGED);
- if (count == expectedCount) {
- break;
- }
- Log.d(TAG, "Count is " + count + " after " + attempts + " attempts; sleeping "
- + SLEEP_TIME_SEC + " seconds before trying again");
- Thread.sleep(SLEEP_TIME_SEC * 1000);
- } while (attempts <= maxAttempts);
- assertEquals("Number of expected broadcasts for " + receiverName + " not reached after "
- + maxAttempts * SLEEP_TIME_SEC + " seconds", expectedCount, count);
- }
-
-
- static int getNumberBroadcastsReceived(Context context, String receiverName, String action)
- throws Exception {
- final Context sharedContext = context.createPackageContext(
- "com.android.cts.net.hostside.app2", Context.CONTEXT_IGNORE_SECURITY);
- final SharedPreferences prefs = sharedContext.getSharedPreferences(receiverName,
- Context.MODE_PRIVATE);
- return prefs.getInt(action, 0);
- }
-
- private void assertRestrictBackgroundStatus(int expectedApiStatus) throws InterruptedException {
- // First asserts the API returns the proper value...
- final String expected = toString(expectedApiStatus);
- Log.d(TAG, getName() + " (expecting " + expected + ")");
- final int apiStatus = mCm.getRestrictBackgroundStatus();
- String actualApiStatus = toString(apiStatus);
- assertEquals("wrong status", expected, actualApiStatus);
-
- //...then use a background thread to verify the actual network status.
- final LinkedBlockingQueue<String> result = new LinkedBlockingQueue<>(1);
- new Thread(new Runnable() {
- @Override
- public void run() {
- result.offer(checkNetworkStatus());
- }
- }, "CheckNetworkThread").start();
- final String actualNetworkStatus = result.poll(10, TimeUnit.SECONDS);
- assertNotNull("timeout waiting for background thread", actualNetworkStatus);
- final String expectedPrefix = apiStatus == RESTRICT_BACKGROUND_STATUS_ENABLED ?
- STATUS_NETWORK_UNAVAILABLE_PREFIX : STATUS_NETWORK_AVAILABLE_PREFIX;
- assertTrue("Wrong network status for API status " + actualApiStatus + ": "
- + actualNetworkStatus, actualNetworkStatus.startsWith(expectedPrefix));
- }
-
- protected String checkNetworkStatus() {
- // TODO: connect to a hostside server instead
- final String address = "http://example.com";
- final NetworkInfo networkInfo = mCm.getActiveNetworkInfo();
- Log.d(TAG, "Running checkNetworkStatus() on thread " + Thread.currentThread().getName()
- + "\n\tactiveNetworkInfo: " + networkInfo + "\n\tURL: " + address);
- String prefix = STATUS_NETWORK_AVAILABLE_PREFIX;
- try {
- final URL url = new URL(address);
- final HttpURLConnection conn = (HttpURLConnection) url.openConnection();
- conn.setReadTimeout(NETWORK_TIMEOUT_MS);
- conn.setConnectTimeout(NETWORK_TIMEOUT_MS);
- conn.setRequestMethod("GET");
- conn.setDoInput(true);
- conn.connect();
- final int response = conn.getResponseCode();
- Log.d(TAG, "HTTP response for " + address + ": " + response);
- } catch (Exception e) {
- Log.d(TAG, "Exception getting " + address + ": " + e);
- prefix = STATUS_NETWORK_UNAVAILABLE_PREFIX;
- }
- return prefix + networkInfo;
- }
-
- private String toString(int status) {
- switch (status) {
- case RESTRICT_BACKGROUND_STATUS_DISABLED:
- return "DISABLED";
- case RESTRICT_BACKGROUND_STATUS_WHITELISTED:
- return "WHITELISTED";
- case RESTRICT_BACKGROUND_STATUS_ENABLED:
- return "ENABLED";
- default:
- return "UNKNOWN_STATUS_" + status;
- }
- }
-}
diff --git a/hostsidetests/net/app/src/com/android/cts/net/hostside/DataSaverModeTest.java b/hostsidetests/net/app/src/com/android/cts/net/hostside/DataSaverModeTest.java
new file mode 100644
index 0000000..ccb1fe9
--- /dev/null
+++ b/hostsidetests/net/app/src/com/android/cts/net/hostside/DataSaverModeTest.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.net.hostside;
+
+import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_DISABLED;
+import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_ENABLED;
+import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_WHITELISTED;
+
+public class DataSaverModeTest extends AbstractRestrictBackgroundNetworkTestCase {
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+
+ setRestrictBackground(false);
+ registerApp2BroadcastReceiver();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+
+ setRestrictBackground(false);
+ }
+
+ public void testGetRestrictBackgroundStatus_disabled() throws Exception {
+ removeRestrictBackgroundWhitelist(mUid);
+ assertRestrictBackgroundStatus(RESTRICT_BACKGROUND_STATUS_DISABLED);
+ assertRestrictBackgroundChangedReceived(0);
+
+ // Sanity check: make sure status is always disabled, never whitelisted
+ addRestrictBackgroundWhitelist(mUid);
+ assertRestrictBackgroundStatus(RESTRICT_BACKGROUND_STATUS_DISABLED);
+ assertRestrictBackgroundChangedReceived(0);
+ }
+
+ public void testGetRestrictBackgroundStatus_whitelisted() throws Exception {
+ setRestrictBackground(true);
+ assertRestrictBackgroundChangedReceived(1);
+
+ addRestrictBackgroundWhitelist(mUid);
+ assertRestrictBackgroundStatus(RESTRICT_BACKGROUND_STATUS_WHITELISTED);
+ assertRestrictBackgroundChangedReceived(2);
+ }
+
+ public void testGetRestrictBackgroundStatus_enabled() throws Exception {
+ setRestrictBackground(true);
+ assertRestrictBackgroundChangedReceived(1);
+
+ removeRestrictBackgroundWhitelist(mUid);
+ assertRestrictBackgroundStatus(RESTRICT_BACKGROUND_STATUS_ENABLED);
+ assertRestrictBackgroundChangedReceived(1);
+ }
+}
diff --git a/hostsidetests/net/app2/AndroidManifest.xml b/hostsidetests/net/app2/AndroidManifest.xml
index d69bf56..fa4cb43 100644
--- a/hostsidetests/net/app2/AndroidManifest.xml
+++ b/hostsidetests/net/app2/AndroidManifest.xml
@@ -16,20 +16,28 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.cts.net.hostside.app2"
- android:sharedUserId="com.android.cts.net.hostside.apps" >
+ package="com.android.cts.net.hostside.app2" >
- <!-- This application is used to listen to RESTRICT_BACKGROUND_CHANGED intents and store
- them in a shared preferences which is then read by the test app.
- It defines 2 listeners, one in the manifest and another dynamically registered by
+ <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+ <uses-permission android:name="android.permission.INTERNET" />
+
+ <!--
+ This application is used to listen to RESTRICT_BACKGROUND_CHANGED intents and store
+ them in a shared preferences which is then read by the test app. These broadcasts are
+ handled by 2 listeners, one defined the manifest and another dynamically registered by
a service.
+
+ The manifest-defined listener also handles ordered broadcasts used to share data with the
+ test app.
-->
<application>
- <service android:name=".MyService" />
+ <service android:name=".MyService" android:exported="true"/>
<receiver android:name=".MyBroadcastReceiver" >
<intent-filter>
<action android:name="android.net.conn.RESTRICT_BACKGROUND_CHANGED" />
+ <action android:name="com.android.cts.net.hostside.app2.action.GET_COUNTERS" />
+ <action android:name="com.android.cts.net.hostside.app2.action.CHECK_NETWORK" />
</intent-filter>
</receiver>
</application>
diff --git a/hostsidetests/net/app2/src/com/android/cts/net/hostside/app2/Common.java b/hostsidetests/net/app2/src/com/android/cts/net/hostside/app2/Common.java
index 91caeda..3be4261 100644
--- a/hostsidetests/net/app2/src/com/android/cts/net/hostside/app2/Common.java
+++ b/hostsidetests/net/app2/src/com/android/cts/net/hostside/app2/Common.java
@@ -18,6 +18,18 @@
public final class Common {
static final String TAG = "CtsNetApp2";
+
+ // Constants below must match values defined on app's ConnectivityManagerTest.java
static final String MANIFEST_RECEIVER = "ManifestReceiver";
static final String DYNAMIC_RECEIVER = "DynamicReceiver";
+ static final String ACTION_GET_COUNTERS =
+ "com.android.cts.net.hostside.app2.action.GET_COUNTERS";
+ static final String ACTION_CHECK_NETWORK =
+ "com.android.cts.net.hostside.app2.action.CHECK_NETWORK";
+ static final String EXTRA_ACTION = "com.android.cts.net.hostside.app2.extra.ACTION";
+ static final String EXTRA_RECEIVER_NAME =
+ "com.android.cts.net.hostside.app2.extra.RECEIVER_NAME";
+ static final char RESULT_SEPARATOR = ';';
+ static final String STATUS_NETWORK_UNAVAILABLE_PREFIX = "NetworkUnavailable:";
+ static final String STATUS_NETWORK_AVAILABLE_PREFIX = "NetworkAvailable:";
}
diff --git a/hostsidetests/net/app2/src/com/android/cts/net/hostside/app2/MyBroadcastReceiver.java b/hostsidetests/net/app2/src/com/android/cts/net/hostside/app2/MyBroadcastReceiver.java
index 0cbf360..f32bd44 100644
--- a/hostsidetests/net/app2/src/com/android/cts/net/hostside/app2/MyBroadcastReceiver.java
+++ b/hostsidetests/net/app2/src/com/android/cts/net/hostside/app2/MyBroadcastReceiver.java
@@ -13,21 +13,44 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package com.android.cts.net.hostside.app2;
+import static android.net.ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED;
+import static com.android.cts.net.hostside.app2.Common.ACTION_CHECK_NETWORK;
+import static com.android.cts.net.hostside.app2.Common.ACTION_GET_COUNTERS;
+import static com.android.cts.net.hostside.app2.Common.EXTRA_ACTION;
+import static com.android.cts.net.hostside.app2.Common.EXTRA_RECEIVER_NAME;
import static com.android.cts.net.hostside.app2.Common.MANIFEST_RECEIVER;
+import static com.android.cts.net.hostside.app2.Common.RESULT_SEPARATOR;
+import static com.android.cts.net.hostside.app2.Common.STATUS_NETWORK_AVAILABLE_PREFIX;
+import static com.android.cts.net.hostside.app2.Common.STATUS_NETWORK_UNAVAILABLE_PREFIX;
import static com.android.cts.net.hostside.app2.Common.TAG;
+
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
import android.util.Log;
/**
- * Receiver that stores received broadcasts in a shared preference.
+ * Receiver used to:
+ * <ol>
+ * <li>Stored received RESTRICT_BACKGROUND_CHANGED broadcasts in a shared preference.
+ * <li>Returned the number of RESTRICT_BACKGROUND_CHANGED broadcasts in an ordered broadcast.
+ * </ol>
*/
public class MyBroadcastReceiver extends BroadcastReceiver {
+ private static final int NETWORK_TIMEOUT_MS = 15 * 1000;
+
private final String mName;
public MyBroadcastReceiver() {
@@ -37,15 +60,109 @@
MyBroadcastReceiver(String name) {
Log.d(TAG, "Constructing MyBroadcastReceiver named " + name);
mName = name;
- }
+ }
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "onReceive() for " + mName + ": " + intent);
+ final String action = intent.getAction();
+ switch (action) {
+ case ACTION_RESTRICT_BACKGROUND_CHANGED:
+ increaseCounter(context, action);
+ break;
+ case ACTION_GET_COUNTERS:
+ setResultDataFromCounter(context, intent);
+ break;
+ case ACTION_CHECK_NETWORK:
+ checkNetwork(context, intent);
+ break;
+ default:
+ Log.e(TAG, "received unexpected action: " + action);
+ }
+ }
+
+ private void increaseCounter(Context context, String action) {
final SharedPreferences prefs = context.getSharedPreferences(mName, Context.MODE_PRIVATE);
- final String pref = intent.getAction();
- final int value = prefs.getInt(pref, 0) + 1;
- Log.d(TAG, "Setting " + pref + " = " + value);
- prefs.edit().putInt(pref, value).apply();
+ final int value = prefs.getInt(action, 0) + 1;
+ Log.d(TAG, "increaseCounter('" + action + "'): setting '" + mName + "' to " + value);
+ prefs.edit().putInt(action, value).apply();
+ }
+
+ private int getCounter(Context context, String action, String receiverName) {
+ final SharedPreferences prefs = context.getSharedPreferences(receiverName,
+ Context.MODE_PRIVATE);
+ final int value = prefs.getInt(action, 0);
+ Log.d(TAG, "getCounter('" + action + "', '" + receiverName + "'): " + value);
+ return value;
+ }
+
+ private void checkNetwork(final Context context, Intent intent) {
+ final ConnectivityManager cm = (ConnectivityManager) context
+ .getSystemService(Context.CONNECTIVITY_SERVICE);
+
+ final StringBuilder data = new StringBuilder();
+ final int apiStatus = cm.getRestrictBackgroundStatus();
+ String netStatus;
+ try {
+ netStatus = checkNetworkStatus(cm);
+ } catch (InterruptedException e) {
+ Log.e(TAG, "Timeout checking network status");
+ setResultData(null);
+ return;
+ }
+ data.append(apiStatus).append(RESULT_SEPARATOR);
+ if (netStatus != null) {
+ data.append(netStatus);
+ }
+ Log.d(TAG, "checkNetwork: returning " + data);
+ setResultData(data.toString());
+ }
+
+ private String checkNetworkStatus(final ConnectivityManager cm) throws InterruptedException {
+ final LinkedBlockingQueue<String> result = new LinkedBlockingQueue<>(1);
+ new Thread(new Runnable() {
+
+ @Override
+ public void run() {
+ // TODO: connect to a hostside server instead
+ final String address = "http://example.com";
+ final NetworkInfo networkInfo = cm.getActiveNetworkInfo();
+ Log.d(TAG, "Running checkNetworkStatus() on thread "
+ + Thread.currentThread().getName()
+ + "\n\tactiveNetworkInfo: " + networkInfo + "\n\tURL: " + address);
+ String prefix = STATUS_NETWORK_AVAILABLE_PREFIX;
+ try {
+ final URL url = new URL(address);
+ final HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+ conn.setReadTimeout(NETWORK_TIMEOUT_MS);
+ conn.setConnectTimeout(NETWORK_TIMEOUT_MS);
+ conn.setRequestMethod("GET");
+ conn.setDoInput(true);
+ conn.connect();
+ final int response = conn.getResponseCode();
+ Log.d(TAG, "HTTP response for " + address + ": " + response);
+ } catch (Exception e) {
+ Log.d(TAG, "Exception getting " + address + ": " + e);
+ prefix = STATUS_NETWORK_UNAVAILABLE_PREFIX + "Exception " + e + ":";
+ }
+ result.offer(prefix + networkInfo);
+ }
+ }, mName).start();
+ return result.poll(NETWORK_TIMEOUT_MS * 2, TimeUnit.MILLISECONDS);
+ }
+
+ private void setResultDataFromCounter(Context context, Intent intent) {
+ final String action = intent.getStringExtra(EXTRA_ACTION);
+ if (action == null) {
+ Log.e(TAG, "Missing extra '" + EXTRA_ACTION + "' on " + intent);
+ return;
+ }
+ final String receiverName = intent.getStringExtra(EXTRA_RECEIVER_NAME);
+ if (receiverName == null) {
+ Log.e(TAG, "Missing extra '" + EXTRA_RECEIVER_NAME + "' on " + intent);
+ return;
+ }
+ final int counter = getCounter(context, action, receiverName);
+ setResultData(String.valueOf(counter));
}
}
diff --git a/hostsidetests/net/src/com/android/cts/net/HostsideRestrictBackgroundNetworkTests.java b/hostsidetests/net/src/com/android/cts/net/HostsideRestrictBackgroundNetworkTests.java
index 1804740..4786450 100644
--- a/hostsidetests/net/src/com/android/cts/net/HostsideRestrictBackgroundNetworkTests.java
+++ b/hostsidetests/net/src/com/android/cts/net/HostsideRestrictBackgroundNetworkTests.java
@@ -18,29 +18,19 @@
import com.android.ddmlib.Log;
import com.android.tradefed.device.DeviceNotAvailableException;
-import com.android.tradefed.device.WifiHelper;
public class HostsideRestrictBackgroundNetworkTests extends HostsideNetworkTestCase {
+
private static final String TEST_APP2_PKG = "com.android.cts.net.hostside.app2";
private static final String TEST_APP2_APK = "CtsHostsideNetworkTestsApp2.apk";
- private int mUid;
- private WifiHelper mWifiHelper;
-
@Override
protected void setUp() throws Exception {
super.setUp();
- mUid = getUid(TEST_PKG);
- mWifiHelper = new WifiHelper(getDevice());
-
- setWifiMeteredStatus(true);
- setRestrictBackground(false);
-
uninstallPackage(TEST_APP2_PKG, false);
installPackage(TEST_APP2_APK);
- startBroadcastReceiverService();
}
@Override
@@ -48,103 +38,61 @@
super.tearDown();
uninstallPackage(TEST_APP2_PKG, true);
- setRestrictBackground(false);
- setWifiMeteredStatus(false);
}
- public void testGetRestrictBackgroundStatus_disabled() throws Exception {
- removeRestrictBackgroundWhitelist(mUid);
- assertRestrictBackgroundStatusDisabled();
- // From the app's point of view, nothing changed, it still have access
- assertRestrictBackgroundChangedNotReceived();
-
- // Sanity check: make sure status is always disabled, never whitelisted
- addRestrictBackgroundWhitelist(mUid);
- assertRestrictBackgroundStatusDisabled();
- assertRestrictBackgroundChangedNotReceived();
- }
-
- public void testGetRestrictBackgroundStatus_whitelisted() throws Exception {
- setRestrictBackground(true);
- assertRestrictBackgroundChangedReceivedOnce();
-
- addRestrictBackgroundWhitelist(mUid);
- assertRestrictBackgroundStatusWhitelisted();
- assertRestrictBackgroundChangedReceivedTwice();
- }
-
- public void testGetRestrictBackgroundStatus_enabled() throws Exception {
- setRestrictBackground(true);
- assertRestrictBackgroundChangedReceivedOnce();
-
- removeRestrictBackgroundWhitelist(mUid);
- assertRestrictBackgroundStatusEnabled();
- assertRestrictBackgroundChangedReceivedOnce();
- }
-
- public void testGetRestrictBackgroundStatus_uninstall() throws Exception {
- addRestrictBackgroundWhitelist(mUid);
- assertRestrictBackgroundWhitelist(mUid, true);
-
- uninstallPackage(TEST_PKG, true);
- assertPackageUninstalled(TEST_PKG);
- assertRestrictBackgroundWhitelist(mUid, false);
-
- installPackage(TEST_APK);
- final int newUid = getUid(TEST_PKG);
- assertRestrictBackgroundWhitelist(mUid, false);
- assertRestrictBackgroundWhitelist(newUid, false);
- }
-
- /**
- * Starts a service that will register a broadcast receiver to receive
- * {@code RESTRICT_BACKGROUND_CHANGE} intents.
- * <p>
- * The service must run in a separate app because otherwise it would be killed every time
- * {@link #runDeviceTests(String, String)} is executed.
- */
- private void startBroadcastReceiverService() throws DeviceNotAvailableException {
- runCommand("am startservice " + TEST_APP2_PKG + "/.MyService");
- }
-
- private void assertRestrictBackgroundStatusDisabled() throws DeviceNotAvailableException {
- runDeviceTests(TEST_PKG, TEST_PKG + ".ConnectivityManagerTest",
+ public void testDataSaverMode_disabled() throws Exception {
+ runDeviceTests(TEST_PKG, TEST_PKG + ".DataSaverModeTest",
"testGetRestrictBackgroundStatus_disabled");
}
- private void assertRestrictBackgroundStatusWhitelisted() throws DeviceNotAvailableException {
- runDeviceTests(TEST_PKG, TEST_PKG + ".ConnectivityManagerTest",
+ public void testDataSaverMode_whitelisted() throws Exception {
+ runDeviceTests(TEST_PKG, TEST_PKG + ".DataSaverModeTest",
"testGetRestrictBackgroundStatus_whitelisted");
}
- private void assertRestrictBackgroundStatusEnabled() throws DeviceNotAvailableException {
- runDeviceTests(TEST_PKG, TEST_PKG + ".ConnectivityManagerTest",
+ public void testDataSaverMode_enabled() throws Exception {
+ runDeviceTests(TEST_PKG, TEST_PKG + ".DataSaverModeTest",
"testGetRestrictBackgroundStatus_enabled");
}
- private void assertRestrictBackgroundChangedNotReceived() throws DeviceNotAvailableException {
- runDeviceTests(TEST_PKG, TEST_PKG + ".ConnectivityManagerTest",
- "testRestrictBackgroundChangedNotReceived");
+ public void testDataSaverMode_reinstall() throws Exception {
+ final int oldUid = getUid(TEST_PKG);
+ testDataSaverMode_whitelisted();
+
+ uninstallPackage(TEST_PKG, true);
+ assertPackageUninstalled(TEST_PKG);
+ assertRestrictBackgroundWhitelist(oldUid, false);
+
+ installPackage(TEST_APK);
+ final int newUid = getUid(TEST_PKG);
+ assertRestrictBackgroundWhitelist(oldUid, false);
+ assertRestrictBackgroundWhitelist(newUid, false);
}
- private void assertRestrictBackgroundChangedReceivedOnce() throws DeviceNotAvailableException {
- runDeviceTests(TEST_PKG, TEST_PKG + ".ConnectivityManagerTest",
- "testRestrictBackgroundChangedReceivedOnce");
+ public void testBatterySaverMode_disabled() throws Exception {
+ runDeviceTests(TEST_PKG, TEST_PKG + ".BatterySaverModeTest",
+ "testBackgroundNetworkAccess_disabled");
}
- private void assertRestrictBackgroundChangedReceivedTwice() throws DeviceNotAvailableException {
- runDeviceTests(TEST_PKG, TEST_PKG + ".ConnectivityManagerTest",
- "testRestrictBackgroundChangedReceivedTwice");
+ public void testBatterySaverMode_whitelisted() throws Exception {
+ runDeviceTests(TEST_PKG, TEST_PKG + ".BatterySaverModeTest",
+ "testBackgroundNetworkAccess_whitelisted");
}
- private void addRestrictBackgroundWhitelist(int uid) throws Exception {
- runCommand("cmd netpolicy add restrict-background-whitelist " + uid);
- assertRestrictBackgroundWhitelist(uid, true);
+ public void testBatterySaverMode_enabled() throws Exception {
+ runDeviceTests(TEST_PKG, TEST_PKG + ".BatterySaverModeTest",
+ "testBackgroundNetworkAccess_enabled");
}
- private void removeRestrictBackgroundWhitelist(int uid) throws Exception {
- runCommand("cmd netpolicy remove restrict-background-whitelist " + uid);
- assertRestrictBackgroundWhitelist(uid, false);
+ public void testBatterySaverMode_reinstall() throws Exception {
+ testBatterySaverMode_whitelisted();
+
+ uninstallPackage(TEST_PKG, true);
+ assertPackageUninstalled(TEST_PKG);
+ assertPowerSaveModeWhitelist(TEST_PKG, false);
+
+ installPackage(TEST_APK);
+ assertPowerSaveModeWhitelist(TEST_PKG, false);
}
private void assertRestrictBackgroundWhitelist(int uid, boolean expected) throws Exception {
@@ -164,31 +112,28 @@
+ expected + ", got " + actual);
}
- private void setWifiMeteredStatus(boolean metered) throws DeviceNotAvailableException {
- mWifiHelper.enableWifi();
- // TODO: if it's not guaranteed the device has wi-fi, we need to change the tests
- // to make the actual verification of restrictions optional.
- final String netId = mWifiHelper.getSSID();
- assertNotNull("null SSID", netId);
- assertFalse("empty SSID", netId.trim().isEmpty());
-
- Log.i(TAG, "Setting wi-fi network " + netId + " metered status to " + metered);
- final String setCommand = "cmd netpolicy set metered-network " + netId + " "+ metered;
- final String result = runCommand(setCommand);
- assertTrue("Command '" + setCommand + "' failed: " + result, result.trim().isEmpty());
-
- // Sanity check.
- final String newStatus = runCommand("cmd netpolicy get metered-network " + netId);
- assertEquals("Metered status of wi-fi network " + netId + " not set properly",
- newStatus.trim(), Boolean.toString(metered));
+ private void assertPowerSaveModeWhitelist(String packageName, boolean expected)
+ throws Exception {
+ // TODO: currently the power-save mode is behaving like idle, but once it changes, we'll
+ // need to use netpolicy for whitelisting
+ assertDelayedCommand("dumpsys deviceidle whitelist =" + packageName,
+ Boolean.toString(expected));
}
- private void setRestrictBackground(boolean enabled) throws DeviceNotAvailableException {
- runCommand("cmd netpolicy set restrict-background " + enabled);
- final String output = runCommand("cmd netpolicy get restrict-background ").trim();
- final String expectedSuffix = enabled ? "enabled" : "disabled";
- // TODO: use MoreAsserts?
- assertTrue("output '" + output + "' should end with '" + expectedSuffix + "'",
- output.endsWith(expectedSuffix));
+ /**
+ * Asserts the result of a command, wait and re-running it a couple times if necessary.
+ */
+ private void assertDelayedCommand(String command, String expectedResult)
+ throws InterruptedException, DeviceNotAvailableException {
+ final int maxTries = 5;
+ for (int i = 1; i <= maxTries; i++) {
+ final String result = runCommand(command).trim();
+ if (result.equals(expectedResult)) return;
+ Log.v(TAG, "Command '" + command + "' returned '" + result + " instead of '"
+ + expectedResult + "' on attempt #; sleeping 1s before polling again");
+ Thread.sleep(1000);
+ }
+ fail("Command '" + command + "' did not return '" + expectedResult + "' after " + maxTries
+ + " attempts");
}
}
diff --git a/hostsidetests/services/activitymanager/app/AndroidManifest.xml b/hostsidetests/services/activitymanager/app/AndroidManifest.xml
index 6b52188..8a2a448 100755
--- a/hostsidetests/services/activitymanager/app/AndroidManifest.xml
+++ b/hostsidetests/services/activitymanager/app/AndroidManifest.xml
@@ -21,68 +21,114 @@
<application>
<activity android:name=".TestActivity"
- android:resizeable="true"
+ android:resizeableActivity="true"
android:exported="true"
/>
<activity android:name=".DockedActivity"
- android:resizeable="true"
+ android:resizeableActivity="true"
android:exported="true"
android:taskAffinity="nobody.but.DockedActivity"
/>
<activity android:name=".NoRelaunchActivity"
- android:resizeable="true"
+ android:resizeableActivity="true"
android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout"
android:exported="true"
+ android:taskAffinity="nobody.but.NoRelaunchActivity"
/>
<activity android:name=".SlowCreateActivity"
- android:resizeable="true"
+ android:resizeableActivity="true"
android:exported="true"
/>
<activity android:name=".LaunchToSideActivity"
- android:resizeable="true"
+ android:resizeableActivity="true"
android:exported="true"
android:taskAffinity="nobody.but.LaunchToSideActivity"
/>
<activity android:name=".PipActivity"
- android:resizeable="true"
+ android:resizeableActivity="true"
android:supportsPictureInPicture="true"
android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout"
android:exported="true"
/>
<activity android:name=".AutoEnterPipActivity"
- android:resizeable="true"
+ android:resizeableActivity="true"
android:supportsPictureInPicture="true"
android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout"
android:exported="true"
/>
<activity android:name=".AlwaysFocusablePipActivity"
android:theme="@style/Theme.Transparent"
- android:resizeable="true"
+ android:resizeableActivity="true"
android:supportsPictureInPicture="true"
androidprv:alwaysFocusable="true"
android:exported="true"
android:taskAffinity="nobody.but.AlwaysFocusablePipActivity"
/>
<activity android:name=".LaunchIntoPinnedStackPipActivity"
- android:resizeable="true"
+ android:resizeableActivity="true"
android:supportsPictureInPicture="true"
androidprv:alwaysFocusable="true"
android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout"
android:exported="true"
/>
<activity android:name=".VisibleBehindActivity"
- android:resizeable="true"
+ android:resizeableActivity="true"
android:supportsPictureInPicture="true"
android:exported="true"
android:taskAffinity="nobody.but.VisibleBehindActivity"
/>
<activity android:name=".LaunchPipOnPipActivity"
- android:resizeable="true"
+ android:resizeableActivity="true"
android:supportsPictureInPicture="true"
android:taskAffinity="nobody.but.LaunchPipOnPipActivity"
android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout"
android:exported="true"
/>
+ <activity android:name=".FreeformActivity"
+ android:resizeableActivity="true"
+ android:taskAffinity="nobody.but.FreeformActivity"
+ android:exported="true"
+ />
+ <activity android:name=".TopLeftLayoutActivity"
+ android:resizeableActivity="true"
+ android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout"
+ android:exported="true">
+ <layout android:defaultWidth="160dp"
+ android:defaultHeight="160dp"
+ android:gravity="top|left"
+ android:minimalSize="80dp"
+ />
+ </activity>
+ <activity android:name=".TopRightLayoutActivity"
+ android:resizeableActivity="true"
+ android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout"
+ android:exported="true">
+ <layout android:defaultWidth="25%"
+ android:defaultHeight="25%"
+ android:gravity="top|right"
+ android:minimalSize="80dp"
+ />
+ </activity>
+ <activity android:name=".BottomLeftLayoutActivity"
+ android:resizeableActivity="true"
+ android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout"
+ android:exported="true">
+ <layout android:defaultWidth="25%"
+ android:defaultHeight="25%"
+ android:gravity="bottom|left"
+ android:minimalSize="80dp"
+ />
+ </activity>
+ <activity android:name=".BottomRightLayoutActivity"
+ android:resizeableActivity="true"
+ android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout"
+ android:exported="true">
+ <layout android:defaultWidth="160dp"
+ android:defaultHeight="160dp"
+ android:gravity="bottom|right"
+ android:minimalSize="80dp"
+ />
+ </activity>
</application>
</manifest>
diff --git a/hostsidetests/services/activitymanager/app/src/android/server/app/AbstractLifecycleLogActivity.java b/hostsidetests/services/activitymanager/app/src/android/server/app/AbstractLifecycleLogActivity.java
new file mode 100644
index 0000000..e3026c9
--- /dev/null
+++ b/hostsidetests/services/activitymanager/app/src/android/server/app/AbstractLifecycleLogActivity.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.server.app;
+
+import android.app.Activity;
+import android.content.res.Configuration;
+import android.os.Bundle;
+import android.util.Log;
+
+public abstract class AbstractLifecycleLogActivity extends Activity {
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ Log.i(getTag(), "onCreate");
+ }
+
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ Log.i(getTag(), "onConfigurationChanged");
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ Log.i(getTag(), "onDestroy");
+ }
+
+ protected abstract String getTag();
+}
diff --git a/tests/abioverride/src/android/abioverride/AbiOverrideActivity.java b/hostsidetests/services/activitymanager/app/src/android/server/app/BottomLeftLayoutActivity.java
similarity index 61%
copy from tests/abioverride/src/android/abioverride/AbiOverrideActivity.java
copy to hostsidetests/services/activitymanager/app/src/android/server/app/BottomLeftLayoutActivity.java
index ddf0b59..27a6fe2 100644
--- a/tests/abioverride/src/android/abioverride/AbiOverrideActivity.java
+++ b/hostsidetests/services/activitymanager/app/src/android/server/app/BottomLeftLayoutActivity.java
@@ -14,24 +14,9 @@
* limitations under the License.
*/
-package android.abioverride;
+package android.server.app;
import android.app.Activity;
-import android.os.Bundle;
-import android.os.Process;
-import java.lang.Override;
-
-/**
- * A simple activity for testing abioverride manifest flag.
- */
-public class AbiOverrideActivity extends Activity {
- @Override
- public void onCreate(Bundle icicle) {
- super.onCreate(icicle);
- }
-
- public boolean is64Bit() {
- return Process.is64Bit();
- }
+public class BottomLeftLayoutActivity extends Activity {
}
diff --git a/tests/abioverride/src/android/abioverride/AbiOverrideActivity.java b/hostsidetests/services/activitymanager/app/src/android/server/app/BottomRightLayoutActivity.java
similarity index 61%
copy from tests/abioverride/src/android/abioverride/AbiOverrideActivity.java
copy to hostsidetests/services/activitymanager/app/src/android/server/app/BottomRightLayoutActivity.java
index ddf0b59..7a91510 100644
--- a/tests/abioverride/src/android/abioverride/AbiOverrideActivity.java
+++ b/hostsidetests/services/activitymanager/app/src/android/server/app/BottomRightLayoutActivity.java
@@ -14,24 +14,9 @@
* limitations under the License.
*/
-package android.abioverride;
+package android.server.app;
import android.app.Activity;
-import android.os.Bundle;
-import android.os.Process;
-import java.lang.Override;
-
-/**
- * A simple activity for testing abioverride manifest flag.
- */
-public class AbiOverrideActivity extends Activity {
- @Override
- public void onCreate(Bundle icicle) {
- super.onCreate(icicle);
- }
-
- public boolean is64Bit() {
- return Process.is64Bit();
- }
+public class BottomRightLayoutActivity extends Activity {
}
diff --git a/hostsidetests/services/activitymanager/app/src/android/server/app/FreeformActivity.java b/hostsidetests/services/activitymanager/app/src/android/server/app/FreeformActivity.java
new file mode 100644
index 0000000..a1cb54c
--- /dev/null
+++ b/hostsidetests/services/activitymanager/app/src/android/server/app/FreeformActivity.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.server.app;
+
+import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK;
+import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
+
+import android.app.Activity;
+import android.app.ActivityOptions;
+import android.content.Intent;
+import android.graphics.Rect;
+
+public class FreeformActivity extends Activity {
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ final Intent intent = new Intent(this, TestActivity.class);
+ intent.setFlags(FLAG_ACTIVITY_CLEAR_TASK | FLAG_ACTIVITY_NEW_TASK);
+
+ final ActivityOptions options = ActivityOptions.makeBasic();
+ options.setLaunchBounds(new Rect(0, 0, 500, 500));
+ this.startActivity(intent, options.toBundle());
+ }
+}
diff --git a/hostsidetests/services/activitymanager/app/src/android/server/app/NoRelaunchActivity.java b/hostsidetests/services/activitymanager/app/src/android/server/app/NoRelaunchActivity.java
index 37963de..0058c13 100644
--- a/hostsidetests/services/activitymanager/app/src/android/server/app/NoRelaunchActivity.java
+++ b/hostsidetests/services/activitymanager/app/src/android/server/app/NoRelaunchActivity.java
@@ -16,7 +16,12 @@
package android.server.app;
-import android.app.Activity;
+public class NoRelaunchActivity extends AbstractLifecycleLogActivity {
-public class NoRelaunchActivity extends Activity {
+ private static final String TAG = NoRelaunchActivity.class.getSimpleName();
+
+ @Override
+ protected String getTag() {
+ return TAG;
+ }
}
diff --git a/hostsidetests/services/activitymanager/app/src/android/server/app/TestActivity.java b/hostsidetests/services/activitymanager/app/src/android/server/app/TestActivity.java
index 222cdde..a8e51d5 100644
--- a/hostsidetests/services/activitymanager/app/src/android/server/app/TestActivity.java
+++ b/hostsidetests/services/activitymanager/app/src/android/server/app/TestActivity.java
@@ -16,7 +16,12 @@
package android.server.app;
-import android.app.Activity;
+public class TestActivity extends AbstractLifecycleLogActivity {
-public class TestActivity extends Activity {
+ private static final String TAG = TestActivity.class.getSimpleName();
+
+ @Override
+ protected String getTag() {
+ return TAG;
+ }
}
diff --git a/tests/abioverride/src/android/abioverride/AbiOverrideActivity.java b/hostsidetests/services/activitymanager/app/src/android/server/app/TopLeftLayoutActivity.java
similarity index 61%
copy from tests/abioverride/src/android/abioverride/AbiOverrideActivity.java
copy to hostsidetests/services/activitymanager/app/src/android/server/app/TopLeftLayoutActivity.java
index ddf0b59..3a0267b 100644
--- a/tests/abioverride/src/android/abioverride/AbiOverrideActivity.java
+++ b/hostsidetests/services/activitymanager/app/src/android/server/app/TopLeftLayoutActivity.java
@@ -14,24 +14,9 @@
* limitations under the License.
*/
-package android.abioverride;
+package android.server.app;
import android.app.Activity;
-import android.os.Bundle;
-import android.os.Process;
-import java.lang.Override;
-
-/**
- * A simple activity for testing abioverride manifest flag.
- */
-public class AbiOverrideActivity extends Activity {
- @Override
- public void onCreate(Bundle icicle) {
- super.onCreate(icicle);
- }
-
- public boolean is64Bit() {
- return Process.is64Bit();
- }
+public class TopLeftLayoutActivity extends Activity {
}
diff --git a/tests/abioverride/src/android/abioverride/AbiOverrideActivity.java b/hostsidetests/services/activitymanager/app/src/android/server/app/TopRightLayoutActivity.java
similarity index 61%
copy from tests/abioverride/src/android/abioverride/AbiOverrideActivity.java
copy to hostsidetests/services/activitymanager/app/src/android/server/app/TopRightLayoutActivity.java
index ddf0b59..eb3b1b0 100644
--- a/tests/abioverride/src/android/abioverride/AbiOverrideActivity.java
+++ b/hostsidetests/services/activitymanager/app/src/android/server/app/TopRightLayoutActivity.java
@@ -14,24 +14,9 @@
* limitations under the License.
*/
-package android.abioverride;
+package android.server.app;
import android.app.Activity;
-import android.os.Bundle;
-import android.os.Process;
-import java.lang.Override;
-
-/**
- * A simple activity for testing abioverride manifest flag.
- */
-public class AbiOverrideActivity extends Activity {
- @Override
- public void onCreate(Bundle icicle) {
- super.onCreate(icicle);
- }
-
- public boolean is64Bit() {
- return Process.is64Bit();
- }
+public class TopRightLayoutActivity extends Activity {
}
diff --git a/hostsidetests/services/activitymanager/src/android/server/cts/ActivityManagerDockedStackTests.java b/hostsidetests/services/activitymanager/src/android/server/cts/ActivityManagerDockedStackTests.java
index 1abfd90..f9ac070d 100644
--- a/hostsidetests/services/activitymanager/src/android/server/cts/ActivityManagerDockedStackTests.java
+++ b/hostsidetests/services/activitymanager/src/android/server/cts/ActivityManagerDockedStackTests.java
@@ -16,8 +16,6 @@
package android.server.cts;
-import com.android.tradefed.log.LogUtil.CLog;
-
import java.awt.Rectangle;
import static com.android.ddmlib.Log.LogLevel.*;
@@ -27,6 +25,7 @@
private static final String TEST_ACTIVITY_NAME = "TestActivity";
private static final String DOCKED_ACTIVITY_NAME = "DockedActivity";
private static final String LAUNCH_TO_SIDE_ACTIVITY_NAME = "LaunchToSideActivity";
+ private static final String NO_RELAUNCH_ACTIVITY_NAME = "NoRelaunchActivity";
private static final String AM_MOVE_TASK = "am stack movetask ";
private static final String AM_RESIZE_DOCKED_STACK = "am stack resize-docked-stack ";
@@ -141,18 +140,9 @@
mAmWmState.assertValidBounds();
}
- private void launchActivityInDockStack(String activityName) throws Exception {
- mDevice.executeShellCommand(getAmStartCmd(activityName));
- final int taskId = getActivityTaskId(activityName);
- final String cmd = AM_MOVE_TASK + taskId + " " + DOCKED_STACK_ID + " true";
- mDevice.executeShellCommand(cmd);
- }
-
public void testResizeDockedStack() throws Exception {
mDevice.executeShellCommand(getAmStartCmd(TEST_ACTIVITY_NAME));
- mDevice.executeShellCommand(getAmStartCmd(DOCKED_ACTIVITY_NAME));
- mDevice.executeShellCommand(AM_MOVE_TASK + getActivityTaskId(DOCKED_ACTIVITY_NAME) + " "
- + DOCKED_STACK_ID + " true");
+ launchActivityInDockStack(DOCKED_ACTIVITY_NAME);
mDevice.executeShellCommand(AM_RESIZE_DOCKED_STACK
+ "0 0 " + STACK_SIZE + " " + STACK_SIZE
+ " 0 0 " + TASK_SIZE + " " + TASK_SIZE);
@@ -169,6 +159,34 @@
mAmWmState.assertVisibility(TEST_ACTIVITY_NAME, true);
}
+ public void testActivityLifeCycleOnResizeDockedStack() throws Exception {
+ mDevice.executeShellCommand(getAmStartCmd(TEST_ACTIVITY_NAME));
+ launchActivityInDockStack(NO_RELAUNCH_ACTIVITY_NAME);
+
+ mAmWmState.computeState(mDevice,
+ new String[]{TEST_ACTIVITY_NAME, NO_RELAUNCH_ACTIVITY_NAME});
+ mAmWmState.assertSanity();
+
+ clearLogcat();
+ mDevice.executeShellCommand(AM_RESIZE_DOCKED_STACK
+ + "0 0 " + STACK_SIZE + " " + STACK_SIZE
+ + " 0 0 " + TASK_SIZE + " " + TASK_SIZE);
+
+ mAmWmState.computeState(mDevice,
+ new String[]{TEST_ACTIVITY_NAME, NO_RELAUNCH_ACTIVITY_NAME});
+ mAmWmState.assertSanity();
+
+ assertActivityLifecycle(TEST_ACTIVITY_NAME, true);
+ assertActivityLifecycle(NO_RELAUNCH_ACTIVITY_NAME, false);
+ }
+
+ private void launchActivityInDockStack(String activityName) throws Exception {
+ mDevice.executeShellCommand(getAmStartCmd(activityName));
+ final int taskId = getActivityTaskId(activityName);
+ final String cmd = AM_MOVE_TASK + taskId + " " + DOCKED_STACK_ID + " true";
+ mDevice.executeShellCommand(cmd);
+ }
+
private void launchActivityToSide(String activityName) throws Exception {
mDevice.executeShellCommand(
getAmStartCmd(activityName) + " -f 0x20000000 --ez launch_to_the_side true");
diff --git a/hostsidetests/services/activitymanager/src/android/server/cts/ActivityManagerFreeformStackTests.java b/hostsidetests/services/activitymanager/src/android/server/cts/ActivityManagerFreeformStackTests.java
new file mode 100644
index 0000000..bc48964
--- /dev/null
+++ b/hostsidetests/services/activitymanager/src/android/server/cts/ActivityManagerFreeformStackTests.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.server.cts;
+
+import java.awt.Rectangle;
+
+public class ActivityManagerFreeformStackTests extends ActivityManagerTestBase {
+
+ private static final String TEST_ACTIVITY = "TestActivity";
+ private static final int TEST_TASK_SIZE_1 = 500;
+ private static final int TEST_TASK_SIZE_2 = TEST_TASK_SIZE_1 * 2;
+ // NOTE: Launching the FreeformActivity will automatically launch the TestActivity
+ // with bounds (0, 0, 500, 500)
+ private static final String FREEFORM_ACTIVITY = "FreeformActivity";
+ private static final String NO_RELAUNCH_ACTIVITY = "NoRelaunchActivity";
+
+ public void testFreeformWindowManagementSupport() throws Exception {
+
+ launchActivityInStack(FREEFORM_ACTIVITY, FREEFORM_WORKSPACE_STACK_ID);
+
+ mAmWmState.computeState(mDevice, new String[] {FREEFORM_ACTIVITY});
+ mAmWmState.assertSanity();
+ mAmWmState.assertValidBounds();
+
+ if (supportsFreeform()) {
+ mAmWmState.assertFrontStack(
+ "Freeform stack must be the front stack.", FREEFORM_WORKSPACE_STACK_ID);
+ mAmWmState.assertVisibility(FREEFORM_ACTIVITY, true);
+ mAmWmState.assertVisibility(TEST_ACTIVITY, true);
+ mAmWmState.assertFocusedActivity(
+ TEST_ACTIVITY + " must be focused Activity", TEST_ACTIVITY);
+ assertEquals(new Rectangle(0, 0, TEST_TASK_SIZE_1, TEST_TASK_SIZE_1),
+ mAmWmState.getAmState().getTaskByActivityName(TEST_ACTIVITY).getBounds());
+ } else {
+ mAmWmState.assertDoesNotContainsStack(
+ "Must not contain freeform stack.", FREEFORM_WORKSPACE_STACK_ID);
+ }
+ }
+
+ public void testActivityLifeCycleOnResizeFreeformTask() throws Exception {
+ launchActivityInStack(TEST_ACTIVITY, FREEFORM_WORKSPACE_STACK_ID);
+ launchActivityInStack(NO_RELAUNCH_ACTIVITY, FREEFORM_WORKSPACE_STACK_ID);
+
+ mAmWmState.computeState(mDevice, new String[]{TEST_ACTIVITY, NO_RELAUNCH_ACTIVITY});
+ mAmWmState.assertSanity();
+
+ resizeActivityTask(TEST_ACTIVITY, 0, 0, TEST_TASK_SIZE_1, TEST_TASK_SIZE_2);
+ resizeActivityTask(NO_RELAUNCH_ACTIVITY,
+ TEST_TASK_SIZE_1, TEST_TASK_SIZE_1, TEST_TASK_SIZE_1, TEST_TASK_SIZE_2);
+
+ mAmWmState.computeState(mDevice, new String[]{TEST_ACTIVITY, NO_RELAUNCH_ACTIVITY});
+ mAmWmState.assertSanity();
+
+ clearLogcat();
+ resizeActivityTask(TEST_ACTIVITY, 0, 0, TEST_TASK_SIZE_2, TEST_TASK_SIZE_1);
+ resizeActivityTask(NO_RELAUNCH_ACTIVITY,
+ TEST_TASK_SIZE_1, TEST_TASK_SIZE_1, TEST_TASK_SIZE_2, TEST_TASK_SIZE_1);
+ mAmWmState.computeState(mDevice, new String[]{TEST_ACTIVITY, NO_RELAUNCH_ACTIVITY});
+ mAmWmState.assertSanity();
+
+ assertActivityLifecycle(TEST_ACTIVITY, true);
+ assertActivityLifecycle(NO_RELAUNCH_ACTIVITY, false);
+ }
+}
diff --git a/hostsidetests/services/activitymanager/src/android/server/cts/ActivityManagerManifestLayoutTests.java b/hostsidetests/services/activitymanager/src/android/server/cts/ActivityManagerManifestLayoutTests.java
new file mode 100644
index 0000000..78cc4b9
--- /dev/null
+++ b/hostsidetests/services/activitymanager/src/android/server/cts/ActivityManagerManifestLayoutTests.java
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.server.cts;
+
+import java.lang.Exception;
+import java.lang.String;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import junit.framework.Assert;
+
+import java.awt.Rectangle;
+import android.server.cts.WindowManagerState.WindowState;
+import android.server.cts.WindowManagerState.Display;
+
+import static com.android.ddmlib.Log.LogLevel.INFO;
+
+import com.android.tradefed.device.DeviceNotAvailableException;
+import com.android.tradefed.log.LogUtil.CLog;
+
+public class ActivityManagerManifestLayoutTests extends ActivityManagerTestBase {
+
+ // Clone of android DisplayMetrics.DENSITY_DEFAULT (DENSITY_MEDIUM)
+ // (Needed in host-side test to convert dp to px.)
+ private static final int DISPLAY_DENSITY_DEFAULT = 160;
+
+ // Test parameters
+ private static final int DEFAULT_WIDTH_DP = 160;
+ private static final int DEFAULT_HEIGHT_DP = 160;
+ private static final float DEFAULT_WIDTH_FRACTION = 0.25f;
+ private static final float DEFAULT_HEIGHT_FRACTION = 0.25f;
+ private static final int MINIMAL_SIZE_DP = 80;
+
+ private static final int GRAVITY_VER_CENTER = 0x01;
+ private static final int GRAVITY_VER_TOP = 0x02;
+ private static final int GRAVITY_VER_BOTTOM = 0x04;
+ private static final int GRAVITY_HOR_CENTER = 0x10;
+ private static final int GRAVITY_HOR_LEFT = 0x20;
+ private static final int GRAVITY_HOR_RIGHT = 0x40;
+
+ private List<WindowState> mTempWindowList = new ArrayList();
+
+ public void testGravityAndDefaultSizeTopLeft() throws Exception {
+ testLayout(GRAVITY_VER_TOP, GRAVITY_HOR_LEFT, false /*fraction*/, false /*minimize*/);
+ }
+
+ public void testGravityAndDefaultSizeTopRight() throws Exception {
+ testLayout(GRAVITY_VER_TOP, GRAVITY_HOR_RIGHT, true /*fraction*/, false /*minimize*/);
+ }
+
+ public void testGravityAndDefaultSizeBottomLeft() throws Exception {
+ testLayout(GRAVITY_VER_BOTTOM, GRAVITY_HOR_LEFT, true /*fraction*/, false /*minimize*/);
+ }
+
+ public void testGravityAndDefaultSizeBottomRight() throws Exception {
+ testLayout(GRAVITY_VER_BOTTOM, GRAVITY_HOR_RIGHT, false /*fraction*/, false /*minimize*/);
+ }
+
+ public void testMinimalSize() throws Exception {
+ testLayout(GRAVITY_VER_TOP, GRAVITY_HOR_LEFT, false /*fraction*/, true /*minimize*/);
+ }
+
+ private void testLayout(
+ int vGravity, int hGravity, boolean fraction, boolean minimize) throws Exception {
+ if (!supportsFreeform()) {
+ CLog.logAndDisplay(INFO, "Skipping test: no freeform support");
+ return;
+ }
+
+ final String activityName = (vGravity == GRAVITY_VER_TOP ? "Top" : "Bottom")
+ + (hGravity == GRAVITY_HOR_LEFT ? "Left" : "Right") + "LayoutActivity";
+
+ // Launch in freeform stack
+ launchActivityInStack(activityName, FREEFORM_WORKSPACE_STACK_ID);
+
+ int expectedWidthDp = DEFAULT_WIDTH_DP;
+ int expectedHeightDp = DEFAULT_HEIGHT_DP;
+
+ // If we're testing fraction dimensions, set the expected to -1. The expected value
+ // depends on the display size, and will be evaluated when we have display info.
+ if (fraction) {
+ expectedWidthDp = expectedHeightDp = -1;
+ }
+
+ // If we're testing minimal size, issue command to resize to <0,0,1,1>. We expect
+ // the size to be floored at MINIMAL_SIZE_DPxMINIMAL_SIZE_DP.
+ if (minimize) {
+ resizeActivityTask(activityName, 0, 0, 1, 1);
+ expectedWidthDp = expectedHeightDp = MINIMAL_SIZE_DP;
+ }
+
+ verifyWindowState(activityName, vGravity, hGravity, expectedWidthDp, expectedHeightDp);
+ }
+
+ private void verifyWindowState(String activityName, int vGravity, int hGravity,
+ int expectedWidthDp, int expectedHeightDp) throws Exception {
+ final String windowName = getWindowName(activityName);
+
+ mAmWmState.computeState(mDevice, true /* visibleOnly */, new String[] {activityName});
+
+ mAmWmState.assertSanity();
+
+ mAmWmState.assertFocusedWindow("Test window must be the front window.", windowName);
+
+ mAmWmState.getWmState().getMatchingWindowState(windowName, mTempWindowList);
+
+ Assert.assertEquals("Should have exactly one window state for the activity.",
+ 1, mTempWindowList.size());
+
+ WindowState ws = mTempWindowList.get(0);
+
+ Display display = mAmWmState.getWmState().getDisplay(ws.getDisplayId());
+ Assert.assertNotNull("Should be on a display", display);
+
+ final Rectangle containingRect = ws.getContainingFrame();
+ final Rectangle appRect = display.getAppRect();
+ final int expectedWidthPx, expectedHeightPx;
+ // Evaluate the expected window size in px. If we're using fraction dimensions,
+ // calculate the size based on the app rect size. Otherwise, convert the expected
+ // size in dp to px.
+ if (expectedWidthDp < 0 || expectedHeightDp < 0) {
+ expectedWidthPx = (int) (appRect.width * DEFAULT_WIDTH_FRACTION);
+ expectedHeightPx = (int) (appRect.height * DEFAULT_HEIGHT_FRACTION);
+ } else {
+ final int densityDpi = display.getDpi();
+ expectedWidthPx = dpToPx(expectedWidthDp, densityDpi);
+ expectedHeightPx = dpToPx(expectedHeightDp, densityDpi);
+ }
+ verifyFrameSizeAndPosition(
+ vGravity, hGravity, expectedWidthPx, expectedHeightPx, containingRect, appRect);
+ }
+
+ private void verifyFrameSizeAndPosition(
+ int vGravity, int hGravity, int expectedWidthPx, int expectedHeightPx,
+ Rectangle containingFrame, Rectangle parentFrame) {
+ Assert.assertEquals("Width is incorrect", expectedWidthPx, containingFrame.width);
+ Assert.assertEquals("Height is incorrect", expectedHeightPx, containingFrame.height);
+
+ if (vGravity == GRAVITY_VER_TOP) {
+ Assert.assertEquals("Should be on the top", parentFrame.y, containingFrame.y);
+ } else {
+ Assert.assertEquals("Should be on the bottom",
+ parentFrame.y + parentFrame.height, containingFrame.y + containingFrame.height);
+ }
+
+ if (hGravity == GRAVITY_HOR_LEFT) {
+ Assert.assertEquals("Should be on the left", parentFrame.x, containingFrame.x);
+ } else {
+ Assert.assertEquals("Should be on the right",
+ parentFrame.x + parentFrame.width, containingFrame.x + containingFrame.width);
+ }
+ }
+
+ private static int dpToPx(float dp, int densityDpi){
+ return (int) (dp * densityDpi / DISPLAY_DENSITY_DEFAULT + 0.5f);
+ }
+}
diff --git a/hostsidetests/services/activitymanager/src/android/server/cts/ActivityManagerState.java b/hostsidetests/services/activitymanager/src/android/server/cts/ActivityManagerState.java
index 1db6829..1a6a3b8 100644
--- a/hostsidetests/services/activitymanager/src/android/server/cts/ActivityManagerState.java
+++ b/hostsidetests/services/activitymanager/src/android/server/cts/ActivityManagerState.java
@@ -60,6 +60,10 @@
boolean retry = false;
String dump = null;
+ CLog.logAndDisplay(INFO, "==============================");
+ CLog.logAndDisplay(INFO, " ActivityManagerState ");
+ CLog.logAndDisplay(INFO, "==============================");
+
do {
if (retry) {
CLog.logAndDisplay(INFO, "***Incomplete AM state. Retrying...");
diff --git a/hostsidetests/services/activitymanager/src/android/server/cts/ActivityManagerTestBase.java b/hostsidetests/services/activitymanager/src/android/server/cts/ActivityManagerTestBase.java
index ef41644..fcc2bd0 100644
--- a/hostsidetests/services/activitymanager/src/android/server/cts/ActivityManagerTestBase.java
+++ b/hostsidetests/services/activitymanager/src/android/server/cts/ActivityManagerTestBase.java
@@ -26,10 +26,15 @@
import java.lang.Exception;
import java.lang.Integer;
import java.lang.String;
+import java.util.Collections;
import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
public abstract class ActivityManagerTestBase extends DeviceTestCase {
private static final boolean PRETEND_DEVICE_SUPPORTS_PIP = false;
+ private static final boolean PRETEND_DEVICE_SUPPORTS_FREEFORM = false;
// Constants copied from ActivityManager.StackId. If they are changed there, these must be
// updated.
@@ -113,6 +118,18 @@
}
}
+ protected void launchActivityInStack(String activityName, int stackId) throws Exception {
+ mDevice.executeShellCommand(getAmStartCmd(activityName) + " --stack " + stackId);
+ }
+
+ protected void resizeActivityTask(String activityName, int left, int top, int right, int bottom)
+ throws Exception {
+ final int taskId = getActivityTaskId(activityName);
+ final String cmd = "am task resize "
+ + taskId + " " + left + " " + top + " " + right + " " + bottom;
+ mDevice.executeShellCommand(cmd);
+ }
+
// Utility method for debugging, not used directly here, but useful, so kept around.
protected void printStacksAndTasks() throws DeviceNotAvailableException {
CollectingOutputReceiver outputReceiver = new CollectingOutputReceiver();
@@ -145,6 +162,11 @@
|| PRETEND_DEVICE_SUPPORTS_PIP;
}
+ protected boolean supportsFreeform() throws DeviceNotAvailableException {
+ return hasDeviceFeature("android.software.freeform_window_management")
+ || PRETEND_DEVICE_SUPPORTS_FREEFORM;
+ }
+
protected boolean hasDeviceFeature(String requiredFeature) throws DeviceNotAvailableException {
if (mAvailableFeatures == null) {
// TODO: Move this logic to ITestDevice.
@@ -199,4 +221,80 @@
CLog.logAndDisplay(LogLevel.INFO, output);
return output;
}
+
+ protected void clearLogcat() throws DeviceNotAvailableException {
+ mDevice.executeAdbCommand("logcat", "-c");
+ }
+
+ protected void assertActivityLifecycle(String activityName, boolean relaunched)
+ throws DeviceNotAvailableException {
+ final ActivityLifecycleCounts lifecycleCounts = new ActivityLifecycleCounts(activityName);
+
+ if (relaunched) {
+ if (lifecycleCounts.mDestroyCount < 1) {
+ fail(activityName + " must have been destroyed. mDestroyCount="
+ + lifecycleCounts.mDestroyCount);
+ }
+ if (lifecycleCounts.mCreateCount < 1) {
+ fail(activityName + " must have been (re)created. mCreateCount="
+ + lifecycleCounts.mCreateCount);
+ }
+ } else {
+ if (lifecycleCounts.mDestroyCount > 0) {
+ fail(activityName + " must *NOT* have been destroyed. mDestroyCount="
+ + lifecycleCounts.mDestroyCount);
+ }
+ if (lifecycleCounts.mCreateCount > 0) {
+ fail(activityName + " must *NOT* have been (re)created. mCreateCount="
+ + lifecycleCounts.mCreateCount);
+ }
+ if (lifecycleCounts.mConfigurationChangedCount < 1) {
+ fail(activityName + " must have received configuration changed. "
+ + "mConfigurationChangedCount="
+ + lifecycleCounts.mConfigurationChangedCount);
+ }
+ }
+ }
+
+ private class ActivityLifecycleCounts {
+
+ private final Pattern mCreatePattern = Pattern.compile("(.+): onCreate");
+ private final Pattern mConfigurationChangedPattern =
+ Pattern.compile("(.+): onConfigurationChanged");
+ private final Pattern mDestroyPattern = Pattern.compile("(.+): onDestroy");
+
+ private final LinkedList<String> mLogs = new LinkedList();
+ int mCreateCount;
+ int mConfigurationChangedCount;
+ int mDestroyCount;
+
+ public ActivityLifecycleCounts(String activityName) throws DeviceNotAvailableException {
+
+ final String logs = mDevice.executeAdbCommand(
+ "logcat", "-v", "brief", "-d", activityName + ":I", "*:S");
+ Collections.addAll(mLogs, logs.split("\\n"));
+
+ while (!mLogs.isEmpty()) {
+ final String line = mLogs.pop().trim();
+
+ Matcher matcher = mCreatePattern.matcher(line);
+ if (matcher.matches()) {
+ mCreateCount++;
+ continue;
+ }
+
+ matcher = mConfigurationChangedPattern.matcher(line);
+ if (matcher.matches()) {
+ mConfigurationChangedCount++;
+ continue;
+ }
+
+ matcher = mDestroyPattern.matcher(line);
+ if (matcher.matches()) {
+ mDestroyCount++;
+ continue;
+ }
+ }
+ }
+ }
}
diff --git a/hostsidetests/services/activitymanager/src/android/server/cts/WindowManagerState.java b/hostsidetests/services/activitymanager/src/android/server/cts/WindowManagerState.java
index a30a2a7..e8b0f59 100644
--- a/hostsidetests/services/activitymanager/src/android/server/cts/WindowManagerState.java
+++ b/hostsidetests/services/activitymanager/src/android/server/cts/WindowManagerState.java
@@ -37,32 +37,33 @@
private static final String DUMPSYS_WINDOWS_APPS = "dumpsys window apps";
private static final String DUMPSYS_WINDOWS_VISIBLE_APPS = "dumpsys window visible-apps";
- private final Pattern mWindowPattern =
+ private static final Pattern sWindowPattern =
Pattern.compile("Window #(\\d+) Window\\{([0-9a-fA-F]+) u(\\d+) (.+)\\}\\:");
- private final Pattern mStartingWindowPattern =
+ private static final Pattern sStartingWindowPattern =
Pattern.compile("Window #(\\d+) Window\\{([0-9a-fA-F]+) u(\\d+) Starting (.+)\\}\\:");
- private final Pattern mExitingWindowPattern =
+ private static final Pattern sExitingWindowPattern =
Pattern.compile("Window #(\\d+) Window\\{([0-9a-fA-F]+) u(\\d+) (.+) EXITING\\}\\:");
- private final Pattern mFocusedWindowPattern = Pattern.compile(
+ private static final Pattern sFocusedWindowPattern = Pattern.compile(
"mCurrentFocus=Window\\{([0-9a-fA-F]+) u(\\d+) (\\S+)\\}");
- private final Pattern mAppErrorFocusedWindowPattern = Pattern.compile(
+ private static final Pattern sAppErrorFocusedWindowPattern = Pattern.compile(
"mCurrentFocus=Window\\{([0-9a-fA-F]+) u(\\d+) Application Error\\: (\\S+)\\}");
- private final Pattern mFocusedAppPattern =
+ private static final Pattern sFocusedAppPattern =
Pattern.compile("mFocusedApp=AppWindowToken\\{(.+) token=Token\\{(.+) "
+ "ActivityRecord\\{(.+) u(\\d+) (\\S+) (\\S+)");
- private final Pattern mStackIdPattern = Pattern.compile("mStackId=(\\d+)");
+ private static final Pattern sStackIdPattern = Pattern.compile("mStackId=(\\d+)");
- private final Pattern[] mExtractStackExitPatterns = { mStackIdPattern, mWindowPattern,
- mStartingWindowPattern, mExitingWindowPattern, mFocusedWindowPattern,
- mAppErrorFocusedWindowPattern, mFocusedAppPattern };
+ private static final Pattern[] sExtractStackExitPatterns = {
+ sStackIdPattern, sWindowPattern, sStartingWindowPattern, sExitingWindowPattern,
+ sFocusedWindowPattern, sAppErrorFocusedWindowPattern, sFocusedAppPattern };
// Windows in z-order with the top most at the front of the list.
private List<String> mWindows = new ArrayList();
- private List<String> mRawWindows = new ArrayList();
+ private List<WindowState> mWindowStates = new ArrayList();
private List<WindowStack> mStacks = new ArrayList();
+ private List<Display> mDisplays = new ArrayList();
private String mFocusedWindow = null;
private String mFocusedApp = null;
private final LinkedList<String> mSysDump = new LinkedList();
@@ -74,6 +75,9 @@
boolean retry = false;
String dump = null;
+ CLog.logAndDisplay(INFO, "==============================");
+ CLog.logAndDisplay(INFO, " WindowManagerState ");
+ CLog.logAndDisplay(INFO, "==============================");
do {
if (retry) {
CLog.logAndDisplay(INFO, "***Incomplete WM state. Retrying...");
@@ -117,47 +121,52 @@
Collections.addAll(mSysDump, sysDump.split("\\n"));
while (!mSysDump.isEmpty()) {
+ final Display display =
+ Display.create(mSysDump, sExtractStackExitPatterns);
+ if (display != null) {
+ CLog.logAndDisplay(INFO, display.toString());
+ mDisplays.add(display);
+ continue;
+ }
+
final WindowStack stack =
- WindowStack.create(mSysDump, mStackIdPattern, mExtractStackExitPatterns);
+ WindowStack.create(mSysDump, sStackIdPattern, sExtractStackExitPatterns);
if (stack != null) {
mStacks.add(stack);
continue;
}
- final String line = mSysDump.pop().trim();
- Matcher matcher = mWindowPattern.matcher(line);
- if (matcher.matches()) {
- CLog.logAndDisplay(INFO, line);
- final String window = matcher.group(4);
+ final WindowState ws = WindowState.create(mSysDump, sExtractStackExitPatterns);
+ if (ws != null) {
+ CLog.logAndDisplay(INFO, ws.toString());
if (visibleOnly && mWindows.isEmpty()) {
// This is the front window. Check to see if we are in the middle of
// transitioning. If we are, we want to skip dumping until window manager is
// done transitioning the top window.
- matcher = mStartingWindowPattern.matcher(line);
- if (matcher.matches()) {
+ if (ws.isStartingWindow()) {
CLog.logAndDisplay(INFO,
"Skipping dump due to starting window transition...");
return;
}
- matcher = mExitingWindowPattern.matcher(line);
- if (matcher.matches()) {
+ if (ws.isExitingWindow()) {
CLog.logAndDisplay(INFO,
"Skipping dump due to exiting window transition...");
return;
}
}
- CLog.logAndDisplay(INFO, window);
- mWindows.add(window);
- mRawWindows.add(line);
+ mWindows.add(ws.getName());
+ mWindowStates.add(ws);
continue;
}
- matcher = mFocusedWindowPattern.matcher(line);
+ final String line = mSysDump.pop().trim();
+
+ Matcher matcher = sFocusedWindowPattern.matcher(line);
if (matcher.matches()) {
CLog.logAndDisplay(INFO, line);
final String focusedWindow = matcher.group(3);
@@ -166,7 +175,7 @@
continue;
}
- matcher = mAppErrorFocusedWindowPattern.matcher(line);
+ matcher = sAppErrorFocusedWindowPattern.matcher(line);
if (matcher.matches()) {
CLog.logAndDisplay(INFO, line);
final String focusedWindow = matcher.group(3);
@@ -175,7 +184,7 @@
continue;
}
- matcher = mFocusedAppPattern.matcher(line);
+ matcher = sFocusedAppPattern.matcher(line);
if (matcher.matches()) {
CLog.logAndDisplay(INFO, line);
final String focusedApp = matcher.group(5);
@@ -189,17 +198,31 @@
void getMatchingWindowTokens(final String windowName, List<String> tokenList) {
tokenList.clear();
- for (String line : mRawWindows) {
- if (line.contains(windowName)) {
- Matcher matcher = mWindowPattern.matcher(line);
- if (matcher.matches()) {
- CLog.logAndDisplay(INFO, "Found activity window: " + line);
- tokenList.add(matcher.group(2));
- }
+ for (WindowState ws : mWindowStates) {
+ if (windowName.equals(ws.getName())) {
+ tokenList.add(ws.getToken());
}
}
}
+ void getMatchingWindowState(final String windowName, List<WindowState> windowList) {
+ windowList.clear();
+ for (WindowState ws : mWindowStates) {
+ if (windowName.equals(ws.getName())) {
+ windowList.add(ws);
+ }
+ }
+ }
+
+ Display getDisplay(int displayId) {
+ for (Display display : mDisplays) {
+ if (displayId == display.getDisplayId()) {
+ return display;
+ }
+ }
+ return null;
+ }
+
String getFrontWindow() {
return mWindows.get(0);
}
@@ -246,15 +269,16 @@
private void reset() {
mSysDump.clear();
mStacks.clear();
+ mDisplays.clear();
mWindows.clear();
- mRawWindows.clear();
+ mWindowStates.clear();
mFocusedWindow = null;
mFocusedApp = null;
}
static class WindowStack extends WindowContainer {
- private static final Pattern TASK_ID_PATTERN = Pattern.compile("taskId=(\\d+)");
+ private static final Pattern sTaskIdPattern = Pattern.compile("taskId=(\\d+)");
int mStackId;
ArrayList<WindowTask> mTasks = new ArrayList();
@@ -288,13 +312,13 @@
final List<Pattern> taskExitPatterns = new ArrayList();
Collections.addAll(taskExitPatterns, exitPatterns);
- taskExitPatterns.add(TASK_ID_PATTERN);
+ taskExitPatterns.add(sTaskIdPattern);
final Pattern[] taskExitPatternsArray =
taskExitPatterns.toArray(new Pattern[taskExitPatterns.size()]);
while (!doneExtracting(dump, exitPatterns)) {
final WindowTask task =
- WindowTask.create(dump, TASK_ID_PATTERN, taskExitPatternsArray);
+ WindowTask.create(dump, sTaskIdPattern, taskExitPatternsArray);
if (task != null) {
mTasks.add(task);
@@ -324,10 +348,10 @@
}
static class WindowTask extends WindowContainer {
- private static final Pattern TEMP_INSET_BOUNDS_PATTERN =
+ private static final Pattern sTempInsetBoundsPattern =
Pattern.compile("mTempInsetBounds=\\[(\\d+),(\\d+)\\]\\[(\\d+),(\\d+)\\]");
- private static final Pattern APP_TOKEN_PATTERN = Pattern.compile(
+ private static final Pattern sAppTokenPattern = Pattern.compile(
"Activity #(\\d+) AppWindowToken\\{(\\S+) token=Token\\{(\\S+) "
+ "ActivityRecord\\{(\\S+) u(\\d+) (\\S+) t(\\d+)\\}\\}\\}");
@@ -373,13 +397,13 @@
continue;
}
- Matcher matcher = TEMP_INSET_BOUNDS_PATTERN.matcher(line);
+ Matcher matcher = sTempInsetBoundsPattern.matcher(line);
if (matcher.matches()) {
CLog.logAndDisplay(INFO, line);
mTempInsetBounds = extractBounds(matcher);
}
- matcher = APP_TOKEN_PATTERN.matcher(line);
+ matcher = sAppTokenPattern.matcher(line);
if (matcher.matches()) {
CLog.logAndDisplay(INFO, line);
final String appToken = matcher.group(6);
@@ -392,8 +416,8 @@
}
static abstract class WindowContainer {
- protected static final Pattern FULLSCREEN_PATTERN = Pattern.compile("mFullscreen=(\\S+)");
- protected static final Pattern BOUNDS_PATTERN =
+ protected static final Pattern sFullscreenPattern = Pattern.compile("mFullscreen=(\\S+)");
+ protected static final Pattern sBoundsPattern =
Pattern.compile("mBounds=\\[(\\d+),(\\d+)\\]\\[(\\d+),(\\d+)\\]");
protected boolean mFullscreen;
@@ -414,7 +438,7 @@
}
boolean extractFullscreen(String line) {
- final Matcher matcher = FULLSCREEN_PATTERN.matcher(line);
+ final Matcher matcher = sFullscreenPattern.matcher(line);
if (!matcher.matches()) {
return false;
}
@@ -426,7 +450,7 @@
}
boolean extractBounds(String line) {
- final Matcher matcher = BOUNDS_PATTERN.matcher(line);
+ final Matcher matcher = sBoundsPattern.matcher(line);
if (!matcher.matches()) {
return false;
}
@@ -446,6 +470,19 @@
return rect;
}
+ static void extractMultipleBounds(Matcher matcher, int groupIndex, Rectangle... rectList) {
+ for (Rectangle rect : rectList) {
+ if (rect == null) {
+ return;
+ }
+ final int left = Integer.valueOf(matcher.group(groupIndex++));
+ final int top = Integer.valueOf(matcher.group(groupIndex++));
+ final int right = Integer.valueOf(matcher.group(groupIndex++));
+ final int bottom = Integer.valueOf(matcher.group(groupIndex++));
+ rect.setBounds(left, top, right - left, bottom - top);
+ }
+ }
+
Rectangle getBounds() {
return mBounds;
}
@@ -454,4 +491,198 @@
return mFullscreen;
}
}
+
+ static class Display extends WindowContainer {
+ private static final String TAG = "[Display] ";
+
+ private static final Pattern sDisplayIdPattern =
+ Pattern.compile("Display: mDisplayId=(\\d+)");
+ private static final Pattern sDisplayInfoPattern =
+ Pattern.compile("(.+) (\\d+)dpi cur=(\\d+)x(\\d+) app=(\\d+)x(\\d+) (.+)");
+
+ private final int mDisplayId;
+ private Rectangle mDisplayRect = new Rectangle();
+ private Rectangle mAppRect = new Rectangle();
+ private int mDpi;
+
+ private Display(int displayId) {
+ mDisplayId = displayId;
+ }
+
+ int getDisplayId() {
+ return mDisplayId;
+ }
+
+ int getDpi() {
+ return mDpi;
+ }
+
+ Rectangle getDisplayRect() {
+ return mDisplayRect;
+ }
+
+ Rectangle getAppRect() {
+ return mAppRect;
+ }
+
+ static Display create(LinkedList<String> dump, Pattern[] exitPatterns) {
+ // TODO: exit pattern for displays?
+ final String line = dump.peek().trim();
+
+ Matcher matcher = sDisplayIdPattern.matcher(line);
+ if (!matcher.matches()) {
+ return null;
+ }
+
+ CLog.logAndDisplay(INFO, TAG + "DISPLAY_ID: " + line);
+ dump.pop();
+
+ final int displayId = Integer.valueOf(matcher.group(1));
+ final Display display = new Display(displayId);
+ display.extract(dump, exitPatterns);
+ return display;
+ }
+
+ private void extract(LinkedList<String> dump, Pattern[] exitPatterns) {
+ while (!doneExtracting(dump, exitPatterns)) {
+ final String line = dump.pop().trim();
+
+ final Matcher matcher = sDisplayInfoPattern.matcher(line);
+ if (matcher.matches()) {
+ CLog.logAndDisplay(INFO, TAG + "DISPLAY_INFO: " + line);
+ mDpi = Integer.valueOf(matcher.group(2));
+
+ final int displayWidth = Integer.valueOf(matcher.group(3));
+ final int displayHeight = Integer.valueOf(matcher.group(4));
+ mDisplayRect.setBounds(0, 0, displayWidth, displayHeight);
+
+ final int appWidth = Integer.valueOf(matcher.group(5));
+ final int appHeight = Integer.valueOf(matcher.group(6));
+ mAppRect.setBounds(0, 0, appWidth, appHeight);
+
+ // break as we don't need other info for now
+ break;
+ }
+ // Extract other info here if needed
+ }
+ }
+
+ @Override
+ public String toString() {
+ return "Display #" + mDisplayId + ": mDisplayRect=" + mDisplayRect
+ + " mAppRect=" + mAppRect;
+ }
+ }
+
+ static class WindowState extends WindowContainer {
+ private static final String TAG = "[WindowState] ";
+
+ private static final String RECT_STR = "\\[(\\d+),(\\d+)\\]\\[(\\d+),(\\d+)\\]";
+ private static final Pattern sFramePattern =
+ Pattern.compile("Frames: containing=" + RECT_STR + " parent=" + RECT_STR);
+ private static final Pattern sWindowAssociationPattern =
+ Pattern.compile("mDisplayId=(\\d+) stackId=(\\d+) (.+)");
+
+ private final String mName;
+ private final String mAppToken;
+ private final boolean mStarting;
+ private final boolean mExiting;
+ private int mDisplayId = 0;
+ private Rectangle mContainingFrame = new Rectangle();
+ private Rectangle mParentFrame = new Rectangle();
+
+ private WindowState(Matcher matcher, boolean starting, boolean exiting) {
+ mName = matcher.group(4);
+ mAppToken = matcher.group(2);
+ mStarting = starting;
+ mExiting = exiting;
+ }
+
+ String getName() {
+ return mName;
+ }
+
+ String getToken() {
+ return mAppToken;
+ }
+
+ boolean isStartingWindow() {
+ return mStarting;
+ }
+
+ boolean isExitingWindow() {
+ return mExiting;
+ }
+
+ int getDisplayId() {
+ return mDisplayId;
+ }
+
+ Rectangle getContainingFrame() {
+ return mContainingFrame;
+ }
+
+ Rectangle getParentFrame() {
+ return mParentFrame;
+ }
+
+ static WindowState create(LinkedList<String> dump, Pattern[] exitPatterns) {
+ final String line = dump.peek().trim();
+
+ Matcher matcher = sWindowPattern.matcher(line);
+ if (!matcher.matches()) {
+ return null;
+ }
+
+ CLog.logAndDisplay(INFO, TAG + "WINDOW: " + line);
+ dump.pop();
+
+ final WindowState window;
+ Matcher specialMatcher = sStartingWindowPattern.matcher(line);
+ if (specialMatcher.matches()) {
+ CLog.logAndDisplay(INFO, TAG + "STARTING: " + line);
+ window = new WindowState(specialMatcher, true, false);
+ } else {
+ specialMatcher = sExitingWindowPattern.matcher(line);
+ if (specialMatcher.matches()) {
+ CLog.logAndDisplay(INFO, TAG + "EXITING: " + line);
+ window = new WindowState(specialMatcher, false, true);
+ } else {
+ window = new WindowState(matcher, false, false);
+ }
+ }
+
+ window.extract(dump, exitPatterns);
+ return window;
+ }
+
+ private void extract(LinkedList<String> dump, Pattern[] exitPatterns) {
+ while (!doneExtracting(dump, exitPatterns)) {
+ final String line = dump.pop().trim();
+
+ Matcher matcher = sWindowAssociationPattern.matcher(line);
+ if (matcher.matches()) {
+ CLog.logAndDisplay(INFO, TAG + "WINDOW_ASSOCIATION: " + line);
+ mDisplayId = Integer.valueOf(matcher.group(1));
+ continue;
+ }
+
+ matcher = sFramePattern.matcher(line);
+ if (matcher.matches()) {
+ CLog.logAndDisplay(INFO, TAG + "FRAME: " + line);
+ extractMultipleBounds(matcher, 1, mContainingFrame, mParentFrame);
+ continue;
+ }
+
+ // Extract other info here if needed
+ }
+ }
+
+ @Override
+ public String toString() {
+ return "WindowState: {" + mAppToken + " " + mName
+ + (mStarting ? " STARTING" : "") + (mExiting ? " EXITING" : "") + "}"
+ + " cf=" + mContainingFrame + " pf=" + mParentFrame;
+ }
+ }
}
diff --git a/libs/json/Android.mk b/libs/json/Android.mk
index 7ec9e79..231f635 100644
--- a/libs/json/Android.mk
+++ b/libs/json/Android.mk
@@ -15,6 +15,9 @@
#
LOCAL_PATH:= $(call my-dir)
+
+# Build the host library
+# ======================
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(call all-java-files-under, src)
@@ -23,3 +26,13 @@
include $(BUILD_HOST_JAVA_LIBRARY)
+# Build the target library
+# =======================
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_MODULE := json
+LOCAL_MODULE_TAGS := optional
+
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
diff --git a/libs/vogar-expect/Android.mk b/libs/vogar-expect/Android.mk
index 075bb43..2b5e074 100644
--- a/libs/vogar-expect/Android.mk
+++ b/libs/vogar-expect/Android.mk
@@ -15,6 +15,9 @@
#
LOCAL_PATH:= $(call my-dir)
+
+# Build the host library
+# ======================
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_MODULE := vogarexpectlib
@@ -23,3 +26,13 @@
LOCAL_STATIC_JAVA_LIBRARIES := guavalib jsonlib
include $(BUILD_HOST_JAVA_LIBRARY)
+# Build the target library
+# =======================
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_MODULE := vogarexpect
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_STATIC_JAVA_LIBRARIES := guava json
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
diff --git a/libs/vogar-expect/src/vogar/ExpectationStore.java b/libs/vogar-expect/src/vogar/ExpectationStore.java
index b7b8d5a..bf87b46 100644
--- a/libs/vogar-expect/src/vogar/ExpectationStore.java
+++ b/libs/vogar-expect/src/vogar/ExpectationStore.java
@@ -16,25 +16,24 @@
package vogar;
-//import com.google.caliper.internal.gson.stream.JsonReader;
-
import com.android.json.stream.JsonReader;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import com.google.common.collect.Iterables;
-
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.net.URL;
import java.util.Collections;
-import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
-
import vogar.commands.Command;
import vogar.util.Log;
@@ -129,26 +128,61 @@
return result;
}
+ /**
+ * Create an {@link ExpectationStore} that is populated from expectation resources.
+ * @param owningClass the class from which the resources are loaded.
+ * @param expectationResources the set of paths to the expectation resources; the paths are
+ * either relative to the owning class, or absolute (starting with a /).
+ * @param mode the mode within which the tests are to be run.
+ * @return the populated {@link ExpectationStore}.
+ * @throws IOException if there was a problem loading
+ */
+ public static ExpectationStore parseResources(
+ Class<?> owningClass, Set<String> expectationResources, ModeId mode)
+ throws IOException {
+ ExpectationStore result = new ExpectationStore();
+ for (String expectationsPath : expectationResources) {
+ URL url = owningClass.getResource(expectationsPath);
+ if (url == null) {
+ Log.warn("Could not find resource '" + expectationsPath
+ + "' relative to " + owningClass);
+ } else {
+ result.parse(url, mode);
+ }
+ }
+ return result;
+ }
+
+ private void parse(URL url, ModeId mode) throws IOException {
+ Log.verbose("loading expectations from " + url);
+
+ try (InputStream is = url.openStream();
+ Reader reader = new InputStreamReader(is)) {
+ parse(reader, url.toString(), mode);
+ }
+ }
+
public void parse(File expectationsFile, ModeId mode) throws IOException {
Log.verbose("loading expectations file " + expectationsFile);
+ try (Reader fileReader = new FileReader(expectationsFile)) {
+ String source = expectationsFile.toString();
+ parse(fileReader, source, mode);
+ }
+ }
+
+ private void parse(Reader reader, String source, ModeId mode) throws IOException {
int count = 0;
- JsonReader reader = null;
- try {
- reader = new JsonReader(new FileReader(expectationsFile));
- reader.setLenient(true);
- reader.beginArray();
- while (reader.hasNext()) {
- readExpectation(reader, mode);
+ try (JsonReader jsonReader = new JsonReader(reader)) {
+ jsonReader.setLenient(true);
+ jsonReader.beginArray();
+ while (jsonReader.hasNext()) {
+ readExpectation(jsonReader, mode);
count++;
}
- reader.endArray();
+ jsonReader.endArray();
- Log.verbose("loaded " + count + " expectations from " + expectationsFile);
- } finally {
- if (reader != null) {
- reader.close();
- }
+ Log.verbose("loaded " + count + " expectations from " + source);
}
}
diff --git a/tests/abioverride/src/android/abioverride/cts/AbiOverrideTest.java b/tests/abioverride/src/android/abioverride/cts/AbiOverrideTest.java
deleted file mode 100644
index c73a0932..0000000
--- a/tests/abioverride/src/android/abioverride/cts/AbiOverrideTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.abioverride.cts;
-
-import android.abioverride.AbiOverrideActivity;
-import android.test.ActivityInstrumentationTestCase2;
-
-public class AbiOverrideTest extends ActivityInstrumentationTestCase2<AbiOverrideActivity> {
- /**
- * A reference to the activity whose shared preferences are being tested.
- */
- private AbiOverrideActivity mActivity;
-
- public AbiOverrideTest() {
- super(AbiOverrideActivity.class);
- }
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- // Start the activity and get a reference to it.
- mActivity = getActivity();
- // Wait for the UI Thread to become idle.
- getInstrumentation().waitForIdleSync();
- }
-
- @Override
- protected void tearDown() throws Exception {
- // Scrub the activity so it can be freed. The next time the setUp will create a new activity
- // rather than reusing the old one.
- mActivity = null;
- super.tearDown();
- }
-
- /**
- * Test if the activity is run in a 32 bit process. In a 32 bit process,
- * the flag is a No-op (it is not meaningful to have multiple ABIs).
- *
- * @throws Exception
- */
- public void testRunIn32BitProcess() throws Exception {
- assertFalse("Process isn't 32 bit", mActivity.is64Bit());
- }
-}
diff --git a/tests/accessibilityservice/AndroidManifest.xml b/tests/accessibilityservice/AndroidManifest.xml
index 41e13ee..43a7baf 100644
--- a/tests/accessibilityservice/AndroidManifest.xml
+++ b/tests/accessibilityservice/AndroidManifest.xml
@@ -44,23 +44,38 @@
<activity android:label="Full screen activity for gesture dispatch testing"
android:name=".AccessibilityGestureDispatchTest$GestureDispatchActivity"/>
- <service
- android:name="android.accessibilityservice.cts.StubGestureAccessibilityService"
- android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" >
- <intent-filter>
- <action android:name="android.accessibilityservice.AccessibilityService" />
+ <service
+ android:name="android.accessibilityservice.cts.StubGestureAccessibilityService"
+ android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" >
+ <intent-filter>
+ <action android:name="android.accessibilityservice.AccessibilityService" />
- <category android:name="android.accessibilityservice.category.FEEDBACK_GENERIC" />
- </intent-filter>
+ <category android:name="android.accessibilityservice.category.FEEDBACK_GENERIC" />
+ </intent-filter>
- <meta-data
- android:name="android.accessibilityservice"
- android:resource="@xml/stub_gesture_a11y_service" />
- </service>
+ <meta-data
+ android:name="android.accessibilityservice"
+ android:resource="@xml/stub_gesture_a11y_service" />
+ </service>
+
+ <activity android:label="@string/accessibility_soft_keyboard_modes_activity"
+ android:name=".AccessibilitySoftKeyboardModesTest$SoftKeyboardModesActivity"
+ android:windowSoftInputMode="stateAlwaysVisible" />
+
+ <service android:name=".StubSoftKeyboardModesAccessibilityService"
+ android:label="@string/title_soft_keyboard_modes_accessibility_service"
+ android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
+ <intent-filter>
+ <action android:name="android.accessibilityservice.AccessibilityService"/>
+ <category android:name="android.accessibilityservice.category.FEEDBACK_GENERIC" />
+ </intent-filter>
+ <meta-data android:name="android.accessibilityservice"
+ android:resource="@xml/stub_soft_keyboard_modes_accessibility_service" />
+ </service>
</application>
- <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
android:targetPackage="android.accessibilityservice.cts"
android:label="Tests for the accessibility APIs.">
<meta-data android:name="listener"
diff --git a/tests/accessibilityservice/AndroidTest.xml b/tests/accessibilityservice/AndroidTest.xml
index db2707d..1287524 100644
--- a/tests/accessibilityservice/AndroidTest.xml
+++ b/tests/accessibilityservice/AndroidTest.xml
@@ -21,4 +21,4 @@
<test class="com.android.tradefed.testtype.AndroidJUnitTest" >
<option name="package" value="android.accessibilityservice.cts" />
</test>
-</configuration>
\ No newline at end of file
+</configuration>
diff --git a/tests/accessibilityservice/res/layout/accessibility_soft_keyboard_modes_test.xml b/tests/accessibilityservice/res/layout/accessibility_soft_keyboard_modes_test.xml
new file mode 100644
index 0000000..577a204
--- /dev/null
+++ b/tests/accessibilityservice/res/layout/accessibility_soft_keyboard_modes_test.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<EditText xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/edit_text"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent" />
diff --git a/tests/accessibilityservice/res/values/strings.xml b/tests/accessibilityservice/res/values/strings.xml
index 89ce1df..1c34c2c 100644
--- a/tests/accessibilityservice/res/values/strings.xml
+++ b/tests/accessibilityservice/res/values/strings.xml
@@ -145,5 +145,16 @@
unveiling\n\n</string>
<string name="full_screen_text_view">Full Screen Text View</string>
+ <!-- Soft Keyboard Modes tests -->
+
+ <!-- String title for the accessibility service -->
+ <string name="accessibility_soft_keyboard_modes_activity">
+ Soft Keyboard Modes Activity</string>
+
+ <string name="title_soft_keyboard_modes_accessibility_service">
+ Stub Soft Keyboard Modes Accessibility Service</string>
+
+ <!-- Description of the accessibility service -->
+ <string name="soft_keyboard_modes_accessibility_service_description">This Accessibility Service was installed for testing purposes. It can be uninstalled by going to Settings > Apps > android.view.accessibilityservice.services and selecting \"Uninstall\".</string>
</resources>
diff --git a/tests/accessibilityservice/res/xml/stub_soft_keyboard_modes_accessibility_service.xml b/tests/accessibilityservice/res/xml/stub_soft_keyboard_modes_accessibility_service.xml
new file mode 100644
index 0000000..b5f9ede
--- /dev/null
+++ b/tests/accessibilityservice/res/xml/stub_soft_keyboard_modes_accessibility_service.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- Copyright (C) 2016 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
+ android:accessibilityEventTypes="typeAllMask"
+ android:accessibilityFeedbackType="feedbackGeneric"
+ android:accessibilityFlags="flagDefault|flagRetrieveInteractiveWindows"
+ android:canRetrieveWindowContent="true"
+ android:description="@string/soft_keyboard_modes_accessibility_service_description" />
diff --git a/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityEndToEndTest.java b/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityEndToEndTest.java
index 1bd4e0a..d8a1be1 100644
--- a/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityEndToEndTest.java
+++ b/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityEndToEndTest.java
@@ -332,6 +332,7 @@
.setTicker(message)
.setContentTitle("")
.setContentText("")
+ .setPriority(Notification.PRIORITY_MAX)
// Mark the notification as "interruptive" by specifying a vibration pattern. This
// ensures it's announced properly on watch-type devices.
.setVibrate(new long[] {})
diff --git a/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilitySoftKeyboardModesTest.java b/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilitySoftKeyboardModesTest.java
new file mode 100644
index 0000000..4eb625c
--- /dev/null
+++ b/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilitySoftKeyboardModesTest.java
@@ -0,0 +1,369 @@
+/**
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT 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.accessibilityservice.cts;
+
+import android.accessibilityservice.AccessibilityServiceInfo;
+import android.accessibilityservice.AccessibilityService.SoftKeyboardController;
+import android.app.UiAutomation;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.os.Bundle;
+import android.os.ParcelFileDescriptor;
+import android.os.SystemClock;
+import android.provider.Settings;
+import android.test.ActivityInstrumentationTestCase2;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityManager;
+
+import android.accessibilityservice.cts.R;
+
+import java.io.BufferedReader;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+import java.util.concurrent.TimeoutException;
+
+/**
+ * Test cases for testing the accessibility APIs for interacting with the soft keyboard show mode.
+ */
+public class AccessibilitySoftKeyboardModesTest extends ActivityInstrumentationTestCase2
+ <AccessibilitySoftKeyboardModesTest.SoftKeyboardModesActivity> {
+
+ /**
+ * Timeout in which we are waiting for the system to start the mock
+ * accessibility services.
+ */
+ private static final long TIMEOUT_SERVICE_TOGGLE_MS = 10000;
+
+ private static final long TIMEOUT_PROPAGATE_SETTING = 5000;
+
+ /**
+ * Timeout required for pending Binder calls or event processing to
+ * complete.
+ */
+ private static final long TIMEOUT_ASYNC_PROCESSING = 5000;
+
+ /**
+ * The timeout since the last accessibility event to consider the device idle.
+ */
+ private static final long TIMEOUT_ACCESSIBILITY_STATE_IDLE = 500;
+
+ private static final int SHOW_MODE_AUTO = 0;
+ private static final int SHOW_MODE_HIDDEN = 1;
+
+ private int mLastCallbackValue;
+
+ private Context mContext;
+ private StubSoftKeyboardModesAccessibilityService mService;
+ private SoftKeyboardController mKeyboardController;
+
+ private Object mLock = new Object();
+
+ public AccessibilitySoftKeyboardModesTest() {
+ super(SoftKeyboardModesActivity.class);
+ }
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+
+ // If we don't call getActivity(), we get an empty list when requesting the number of
+ // windows on screen.
+ getActivity();
+
+ mContext = getInstrumentation().getContext();
+ UiAutomation uiAutomation;
+ try {
+ uiAutomation = getUiAutomation();
+ } catch (RuntimeException e) {
+ // Clean up UI Automation after other tests as we cannot request UI Automation with
+ // different flags if one already exists.
+ uiAutomation = getInstrumentation().getUiAutomation();
+ uiAutomation.destroy();
+
+ // Try to get UI Automation again.
+ uiAutomation = getUiAutomation();
+ }
+ String command = "pm grant " + mContext.getPackageName()
+ + "android.permission.WRITE_SECURE_SETTINGS";
+ executeShellCommand(uiAutomation, command);
+ uiAutomation.destroy();
+
+ disableAllServices();
+ enableTestService();
+
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ disableAllServices();
+ }
+
+ public void testApiReturnValues_shouldChangeValueOnRequestAndSendCallback() throws Exception {
+ mLastCallbackValue = -1;
+
+ final SoftKeyboardController.OnShowModeChangedListener listener =
+ new SoftKeyboardController.OnShowModeChangedListener() {
+ @Override
+ public void onShowModeChanged(SoftKeyboardController controller, int showMode) {
+ synchronized (mLock) {
+ mLastCallbackValue = showMode;
+ mLock.notifyAll();
+ }
+ }
+ };
+ mKeyboardController.addOnShowModeChangedListener(listener);
+
+ // The soft keyboard should be in its' default mode.
+ assertEquals(SHOW_MODE_AUTO, mKeyboardController.getShowMode());
+
+ // Set the show mode to SHOW_MODE_HIDDEN.
+ assertTrue(mKeyboardController.setShowMode(SHOW_MODE_HIDDEN));
+
+ // Make sure the mode was changed.
+ assertEquals(SHOW_MODE_HIDDEN, mKeyboardController.getShowMode());
+
+ // Make sure we're getting the callback with the proper value.
+ waitForCallbackValueWithLock(SHOW_MODE_HIDDEN);
+
+ // Make sure we can set the value back to the default.
+ assertTrue(mKeyboardController.setShowMode(SHOW_MODE_AUTO));
+ assertEquals(SHOW_MODE_AUTO, mKeyboardController.getShowMode());
+ waitForCallbackValueWithLock(SHOW_MODE_AUTO);
+
+ // Make sure we can remove our listener.
+ assertTrue(mKeyboardController.removeOnShowModeChangedListener(listener));
+ }
+
+ public void testHideSoftKeyboard_shouldHideAndShowKeyboardOnRequest() throws Exception {
+ // The soft keyboard should be in its' default mode.
+ assertEquals(SHOW_MODE_AUTO, mKeyboardController.getShowMode());
+
+ // Note: This Activity always has a visible keyboard (due to windowSoftInputMode being set
+ // to stateAlwaysVisible).
+ int numWindowsWithIme = mService.getTestWindowsListSize();
+
+ // Request the keyboard be hidden.
+ assertTrue(mKeyboardController.setShowMode(SHOW_MODE_HIDDEN));
+ waitForWindowStateChanged();
+ waitForIdle();
+
+ // Make sure the keyboard is hidden.
+ assertEquals(numWindowsWithIme - 1, mService.getTestWindowsListSize());
+
+ // Request the default keyboard mode.
+ assertTrue(mKeyboardController.setShowMode(SHOW_MODE_AUTO));
+ waitForWindowStateChanged();
+ waitForIdle();
+
+ // Make sure the keyboard is visible.
+ assertEquals(numWindowsWithIme, mService.getTestWindowsListSize());
+ }
+
+
+ public void testHideSoftKeyboard_shouldHideKeyboardUntilAllServicesDisabled() throws Exception {
+ // The soft keyboard should be in its' default mode.
+ assertEquals(SHOW_MODE_AUTO, mKeyboardController.getShowMode());
+
+ // Note: This Activity always has a visible keyboard (due to windowSoftInputMode being set
+ // to stateAlwaysVisible).
+ int numWindowsWithIme = mService.getTestWindowsListSize();
+
+ // Set the show mode to SHOW_MODE_HIDDEN.
+ assertTrue(mKeyboardController.setShowMode(SHOW_MODE_HIDDEN));
+ waitForWindowStateChanged();
+ waitForIdle();
+
+ // Make sure the keyboard is hidden.
+ assertEquals(numWindowsWithIme - 1, mService.getTestWindowsListSize());
+
+ // Make sure we can see the soft keyboard once all Accessibility Services are disabled.
+ disableAllServices();
+ waitForWindowStateChanged();
+ waitForIdle();
+
+ // Enable our test service,.
+ enableTestService();
+
+ // See how many windows are present.
+ assertEquals(numWindowsWithIme, mService.getTestWindowsListSize());
+ }
+
+ private synchronized UiAutomation getUiAutomation() {
+ return getInstrumentation()
+ .getUiAutomation(UiAutomation.FLAG_DONT_SUPPRESS_ACCESSIBILITY_SERVICES);
+ }
+
+ private void executeShellCommand(UiAutomation uiAutomation, String command) throws Exception {
+ ParcelFileDescriptor fd = uiAutomation.executeShellCommand(command);
+ BufferedReader reader = null;
+ try (InputStream inputStream = new FileInputStream(fd.getFileDescriptor())) {
+ reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
+ while (reader.readLine() != null) {
+ // Keep reading.
+ }
+ } finally {
+ if (reader != null) {
+ reader.close();
+ }
+ fd.close();
+ }
+ }
+
+ private void waitForCallbackValueWithLock(int expectedValue) throws Exception {
+ long timeoutTimeMillis = SystemClock.uptimeMillis() + TIMEOUT_PROPAGATE_SETTING;
+
+ while (SystemClock.uptimeMillis() < timeoutTimeMillis) {
+ synchronized(mLock) {
+ if (mLastCallbackValue == expectedValue) {
+ return;
+ }
+ try {
+ mLock.wait(timeoutTimeMillis - SystemClock.uptimeMillis());
+ } catch (InterruptedException e) {
+ // Wait until timeout.
+ }
+ }
+ }
+
+ throw new IllegalStateException("last callback value <" + mLastCallbackValue
+ + "> does not match expected value < " + expectedValue + ">");
+ }
+
+ private void waitForWindowStateChanged() throws Exception {
+ UiAutomation uiAutomation = getUiAutomation();
+ try {
+ uiAutomation.executeAndWaitForEvent(new Runnable() {
+ @Override
+ public void run() {
+ // Do nothing.
+ }
+ },
+ new UiAutomation.AccessibilityEventFilter() {
+ @Override
+ public boolean accept (AccessibilityEvent event) {
+ return event.getEventType() == AccessibilityEvent.TYPE_WINDOWS_CHANGED;
+ }
+ },
+ TIMEOUT_PROPAGATE_SETTING);
+ } catch (TimeoutException ignored) {
+ // Ignore since the event could have occured before this method was called. There should
+ // be a check after this method returns to catch incorrect values.
+ } finally {
+ uiAutomation.destroy();
+ }
+ }
+
+ private void disableAllServices() throws Exception {
+ final Object waitLockForA11yOff = new Object();
+ AccessibilityManager manager =
+ (AccessibilityManager) mContext.getSystemService(Context.ACCESSIBILITY_SERVICE);
+ manager.addAccessibilityStateChangeListener(
+ new AccessibilityManager.AccessibilityStateChangeListener() {
+ @Override
+ public void onAccessibilityStateChanged(boolean b) {
+ synchronized (waitLockForA11yOff) {
+ waitLockForA11yOff.notifyAll();
+ }
+ }
+ });
+ ContentResolver cr = mContext.getContentResolver();
+ UiAutomation uiAutomation = getUiAutomation();
+ executeShellCommand(uiAutomation, "settings put secure "
+ + Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES + " null");
+ uiAutomation.destroy();
+ StubSoftKeyboardModesAccessibilityService.sInstance = null;
+ long timeoutTimeMillis = SystemClock.uptimeMillis() + TIMEOUT_SERVICE_TOGGLE_MS;
+ while (SystemClock.uptimeMillis() < timeoutTimeMillis) {
+ synchronized (waitLockForA11yOff) {
+ if (!manager.isEnabled()) {
+ return;
+ }
+ try {
+ waitLockForA11yOff.wait(timeoutTimeMillis - SystemClock.uptimeMillis());
+ } catch (InterruptedException e) {
+ // Ignored; loop again
+ }
+ }
+ }
+ throw new RuntimeException("Unable to turn accessibility off");
+ }
+
+ private void enableTestService() throws Exception {
+ Context context = getInstrumentation().getContext();
+ AccessibilityManager manager =
+ (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE);
+ List<AccessibilityServiceInfo> serviceInfos =
+ manager.getInstalledAccessibilityServiceList();
+ for (int i = 0; i < serviceInfos.size(); i++) {
+ AccessibilityServiceInfo serviceInfo = serviceInfos.get(i);
+ if (context.getString(R.string.soft_keyboard_modes_accessibility_service_description)
+ .equals(serviceInfo.getDescription())) {
+ ContentResolver cr = context.getContentResolver();
+ UiAutomation uiAutomation = getUiAutomation();
+ String command = "settings put secure "
+ + Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES + " "
+ + serviceInfo.getId();
+ executeShellCommand(uiAutomation, command);
+ executeShellCommand(uiAutomation, "settings put secure "
+ + Settings.Secure.ACCESSIBILITY_ENABLED + " 1");
+ uiAutomation.destroy();
+
+ // We have enabled the services of interest and need to wait until they
+ // are instantiated and started (if needed) and the system binds to them.
+ long timeoutTimeMillis = SystemClock.uptimeMillis() + TIMEOUT_SERVICE_TOGGLE_MS;
+ while (SystemClock.uptimeMillis() < timeoutTimeMillis) {
+ synchronized(
+ StubSoftKeyboardModesAccessibilityService.sWaitObjectForConnecting) {
+ if (StubSoftKeyboardModesAccessibilityService.sInstance != null) {
+ mService = StubSoftKeyboardModesAccessibilityService.sInstance;
+ mKeyboardController = mService.getTestSoftKeyboardController();
+ return;
+ }
+ try {
+ StubSoftKeyboardModesAccessibilityService.sWaitObjectForConnecting.wait(
+ timeoutTimeMillis - SystemClock.uptimeMillis());
+ } catch (InterruptedException e) {
+ // Ignored; loop again
+ }
+ }
+ }
+ throw new IllegalStateException("Stub accessibility service not started");
+ }
+ }
+ throw new IllegalStateException("Stub accessiblity service not found");
+ }
+
+ private void waitForIdle() throws TimeoutException {
+ getUiAutomation().waitForIdle(TIMEOUT_ACCESSIBILITY_STATE_IDLE, TIMEOUT_ASYNC_PROCESSING);
+ }
+
+ /**
+ * Activity for testing the AccessibilityService API for hiding and showring the soft keyboard.
+ */
+ public static class SoftKeyboardModesActivity extends AccessibilityTestActivity {
+ public SoftKeyboardModesActivity() {
+ super();
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.accessibility_soft_keyboard_modes_test);
+ }
+ }
+}
diff --git a/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityWindowQueryTest.java b/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityWindowQueryTest.java
index 984dc8c..d328916 100755
--- a/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityWindowQueryTest.java
+++ b/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityWindowQueryTest.java
@@ -91,7 +91,7 @@
// Find a button to click on.
final AccessibilityNodeInfo button1 = uiAutomation.getRootInActiveWindow()
.findAccessibilityNodeInfosByViewId(
- "com.android.cts.accessibilityservice:id/button1").get(0);
+ "android.accessibilityservice.cts:id/button1").get(0);
// Argh...
final List<AccessibilityEvent> events = new ArrayList<AccessibilityEvent>();
@@ -163,7 +163,7 @@
// Find a button to click on.
final AccessibilityNodeInfo button1 = uiAutomation.getRootInActiveWindow()
.findAccessibilityNodeInfosByViewId(
- "com.android.cts.accessibilityservice:id/button1").get(0);
+ "android.accessibilityservice.cts:id/button1").get(0);
// Argh...
final List<AccessibilityEvent> events = new ArrayList<AccessibilityEvent>();
@@ -218,7 +218,7 @@
// Find a button to click on.
final AccessibilityNodeInfo button1 = uiAutomation.getRootInActiveWindow()
.findAccessibilityNodeInfosByViewId(
- "com.android.cts.accessibilityservice:id/button1").get(0);
+ "android.accessibilityservice.cts:id/button1").get(0);
// Argh...
final List<AccessibilityEvent> events = new ArrayList<AccessibilityEvent>();
@@ -249,7 +249,7 @@
// Find a another button from the event's window.
final AccessibilityNodeInfo button2 = window.getRoot()
.findAccessibilityNodeInfosByViewId(
- "com.android.cts.accessibilityservice:id/button2").get(0);
+ "android.accessibilityservice.cts:id/button2").get(0);
// Click the second button.
uiAutomation.executeAndWaitForEvent(new Runnable() {
@@ -902,7 +902,7 @@
classNameAndTextList.add("android.widget.ButtonB8");
classNameAndTextList.add("android.widget.ButtonB9");
- String contentViewIdResName = "com.android.cts.accessibilityservice:id/added_content";
+ String contentViewIdResName = "android.accessibilityservice.cts:id/added_content";
boolean verifyContent = false;
Queue<AccessibilityNodeInfo> fringe = new LinkedList<AccessibilityNodeInfo>();
diff --git a/tests/accessibilityservice/src/android/accessibilityservice/cts/StubSoftKeyboardModesAccessibilityService.java b/tests/accessibilityservice/src/android/accessibilityservice/cts/StubSoftKeyboardModesAccessibilityService.java
new file mode 100644
index 0000000..27d51d9
--- /dev/null
+++ b/tests/accessibilityservice/src/android/accessibilityservice/cts/StubSoftKeyboardModesAccessibilityService.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.accessibilityservice.cts;
+
+import android.accessibilityservice.AccessibilityService;
+import android.content.Intent;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityWindowInfo;
+
+/**
+ * Stub accessibility service for testing APIs to show/hide Soft Keyboard.
+ */
+public class StubSoftKeyboardModesAccessibilityService extends AccessibilityService {
+
+ public static Object sWaitObjectForConnecting = new Object();
+
+ public static StubSoftKeyboardModesAccessibilityService sInstance = null;
+
+ @Override
+ protected void onServiceConnected() {
+ synchronized (sWaitObjectForConnecting) {
+ sInstance = this;
+ sWaitObjectForConnecting.notifyAll();
+ }
+ }
+
+ @Override
+ public void onDestroy() {
+ sInstance = null;
+ super.onDestroy();
+ }
+
+ @Override
+ public void onAccessibilityEvent(AccessibilityEvent event) {
+ /* do nothing */
+ }
+
+ @Override
+ public void onInterrupt() {
+ /* do nothing */
+ }
+
+ public SoftKeyboardController getTestSoftKeyboardController() {
+ return sInstance.getSoftKeyboardController();
+ }
+
+ public int getTestWindowsListSize() {
+ return sInstance.getWindows().size();
+ }
+}
diff --git a/tests/admin/src/android/admin/cts/DevicePolicyManagerTest.java b/tests/admin/src/android/admin/cts/DevicePolicyManagerTest.java
index ae697a6..57d22dd 100644
--- a/tests/admin/src/android/admin/cts/DevicePolicyManagerTest.java
+++ b/tests/admin/src/android/admin/cts/DevicePolicyManagerTest.java
@@ -174,19 +174,6 @@
}
}
- public void testCreateUser_failIfNotDeviceOwner() {
- if (!mDeviceAdmin) {
- Log.w(TAG, "Skipping testCreateUser_failIfNotDeviceOwner");
- return;
- }
- try {
- mDevicePolicyManager.createUser(mComponent, "user name");
- fail("did not throw expected SecurityException");
- } catch (SecurityException e) {
- assertDeviceOwnerMessage(e.getMessage());
- }
- }
-
public void testRemoveUser_failIfNotDeviceOwner() {
if (!mDeviceAdmin) {
Log.w(TAG, "Skipping testRemoveUser_failIfNotDeviceOwner");
@@ -334,20 +321,6 @@
}
}
- public void testCreateAndInitializeUser_failIfNotDeviceOwner() {
- if (!mDeviceAdmin) {
- Log.w(TAG, "Skipping testCreateAndInitializeUser_failIfNotDeviceOwner");
- return;
- }
- try {
- mDevicePolicyManager.createAndInitializeUser(mComponent, "name", "admin name",
- mComponent, null);
- fail("did not throw expected SecurityException");
- } catch (SecurityException e) {
- assertDeviceOwnerMessage(e.getMessage());
- }
- }
-
public void testCreateAndManageUser_failIfNotDeviceOwner() {
if (!mDeviceAdmin) {
Log.w(TAG, "Skipping testCreateAndManageUser_failIfNotDeviceOwner");
diff --git a/tests/app/app/AndroidManifest.xml b/tests/app/app/AndroidManifest.xml
index c64e977..c163aac 100644
--- a/tests/app/app/AndroidManifest.xml
+++ b/tests/app/app/AndroidManifest.xml
@@ -289,9 +289,9 @@
<activity android:name="android.app.stubs.PipActivity"
android:label="PipActivity"
- android:resizeable="true"
+ android:resizeableActivity="true"
android:supportsPictureInPicture="true"
- android:configChanges="smallestScreenSize|orientation|screenSize">
+ android:configChanges="smallestScreenSize|orientation|screenSize|screenLayout">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
@@ -300,9 +300,9 @@
<activity android:name="android.app.stubs.PipNotResizeableActivity"
android:label="PipNotResizeableActivity"
- android:resizeable="false"
+ android:resizeableActivity="false"
android:supportsPictureInPicture="true"
- android:configChanges="smallestScreenSize|orientation|screenSize">
+ android:configChanges="smallestScreenSize|orientation|screenSize|screenLayout">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
@@ -311,9 +311,9 @@
<activity android:name="android.app.stubs.PipNotSupportedActivity"
android:label="PipNotSupportedActivity"
- android:resizeable="true"
+ android:resizeableActivity="true"
android:supportsPictureInPicture="false"
- android:configChanges="smallestScreenSize|orientation|screenSize">
+ android:configChanges="smallestScreenSize|orientation|screenSize|screenLayout">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
diff --git a/tests/app/src/android/app/cts/NotificationTest.java b/tests/app/src/android/app/cts/NotificationTest.java
index 9da1b25..42a158e 100644
--- a/tests/app/src/android/app/cts/NotificationTest.java
+++ b/tests/app/src/android/app/cts/NotificationTest.java
@@ -17,7 +17,6 @@
package android.app.cts;
import android.app.Notification;
-import android.app.Notification.Topic;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
@@ -26,9 +25,6 @@
import android.test.AndroidTestCase;
import android.widget.RemoteViews;
-import java.util.Arrays;
-import java.util.List;
-
public class NotificationTest extends AndroidTestCase {
private Notification mNotification;
@@ -162,33 +158,11 @@
.setContentTitle(CONTENT_TITLE)
.setContentText(CONTENT_TEXT)
.setContentIntent(contentIntent)
- .setTopic(new Topic("id1", "label1"))
.build();
assertEquals(CONTENT_TEXT, mNotification.extras.getString(Notification.EXTRA_TEXT));
assertEquals(CONTENT_TITLE, mNotification.extras.getString(Notification.EXTRA_TITLE));
assertEquals(1, mNotification.icon);
assertEquals(contentIntent, mNotification.contentIntent);
- assertEquals(new Topic("id1", "label1"), mNotification.getTopic());
- }
-
- public void testWriteTopicToParcel() {
- mNotification = new Notification.Builder(mContext)
- .setTopic(new Topic("id2", "label2"))
- .build();
- Parcel parcel = Parcel.obtain();
- mNotification.writeToParcel(parcel, 0);
- parcel.setDataPosition(0);
- // Test Notification(Parcel)
- Notification result = new Notification(parcel);
- assertEquals(new Topic("id2", "label2"), result.getTopic());
-
- mNotification = new Notification();
- parcel = Parcel.obtain();
- mNotification.writeToParcel(parcel, 0);
- parcel.setDataPosition(0);
- // Test Notification(Parcel)
- result = new Notification(parcel);
- assertNull(result.getTopic());
}
public void testToString() {
diff --git a/tests/camera/src/android/hardware/camera2/cts/CameraTestUtils.java b/tests/camera/src/android/hardware/camera2/cts/CameraTestUtils.java
index 0da92a6..1391eee 100644
--- a/tests/camera/src/android/hardware/camera2/cts/CameraTestUtils.java
+++ b/tests/camera/src/android/hardware/camera2/cts/CameraTestUtils.java
@@ -310,7 +310,11 @@
@Override
public void onImageAvailable(ImageReader reader) {
try {
- mQueue.put(reader.acquireNextImage());
+ Image imge = reader.acquireNextImage();
+ if (imge == null) {
+ return;
+ }
+ mQueue.put(imge);
if (mAsyncMode && mQueue.size() >= mMaxImages) {
Image img = mQueue.poll();
img.close();
diff --git a/tests/camera/src/android/hardware/camera2/cts/CaptureRequestTest.java b/tests/camera/src/android/hardware/camera2/cts/CaptureRequestTest.java
index 81af410..4272f59 100644
--- a/tests/camera/src/android/hardware/camera2/cts/CaptureRequestTest.java
+++ b/tests/camera/src/android/hardware/camera2/cts/CaptureRequestTest.java
@@ -79,6 +79,7 @@
private static final int NUM_RESULTS_WAIT_TIMEOUT = 100;
private static final int NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY = 8;
private static final int NUM_TEST_FOCUS_DISTANCES = 10;
+ private static final int NUM_FOCUS_DISTANCES_REPEAT = 3;
// 5 percent error margin for calibrated device
private static final float FOCUS_DISTANCE_ERROR_PERCENT_CALIBRATED = 0.05f;
// 25 percent error margin for uncalibrated device
@@ -851,36 +852,66 @@
}
private void focusDistanceTestByCamera() throws Exception {
- Size maxPrevSize = mOrderedPreviewSizes.get(0);
- float[] testDistances = getFocusDistanceTestValuesInOrder();
CaptureRequest.Builder requestBuilder =
mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
requestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF);
+ int calibrationStatus = mStaticInfo.getFocusDistanceCalibrationChecked();
+ float errorMargin = FOCUS_DISTANCE_ERROR_PERCENT_UNCALIBRATED;
+ if (calibrationStatus ==
+ CameraMetadata.LENS_INFO_FOCUS_DISTANCE_CALIBRATION_CALIBRATED) {
+ errorMargin = FOCUS_DISTANCE_ERROR_PERCENT_CALIBRATED;
+ } else if (calibrationStatus ==
+ CameraMetadata.LENS_INFO_FOCUS_DISTANCE_CALIBRATION_APPROXIMATE) {
+ errorMargin = FOCUS_DISTANCE_ERROR_PERCENT_APPROXIMATE;
+ }
+
+ // Test changing focus distance with repeating request
+ focusDistanceTestRepeating(requestBuilder, errorMargin);
+
+ if (calibrationStatus ==
+ CameraMetadata.LENS_INFO_FOCUS_DISTANCE_CALIBRATION_CALIBRATED) {
+ // Test changing focus distance with burst request
+ focusDistanceTestBurst(requestBuilder, errorMargin);
+ }
+ }
+
+ private void focusDistanceTestRepeating(CaptureRequest.Builder requestBuilder,
+ float errorMargin) throws Exception {
+ CaptureRequest request;
+ float[] testDistances = getFocusDistanceTestValuesInOrder(0, 0);
+ Size maxPrevSize = mOrderedPreviewSizes.get(0);
SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
startPreview(requestBuilder, maxPrevSize, resultListener);
- CaptureRequest request;
float[] resultDistances = new float[testDistances.length];
+ int[] resultLensStates = new int[testDistances.length];
+
+ // Collect results
for (int i = 0; i < testDistances.length; i++) {
requestBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, testDistances[i]);
request = requestBuilder.build();
resultListener = new SimpleCaptureCallback();
mSession.setRepeatingRequest(request, resultListener, mHandler);
waitForSettingsApplied(resultListener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
- resultDistances[i] = verifyFocusDistanceControl(testDistances[i], request,
- resultListener);
+ waitForResultValue(resultListener, CaptureResult.LENS_STATE,
+ CaptureResult.LENS_STATE_STATIONARY, NUM_RESULTS_WAIT_TIMEOUT);
+ CaptureResult result = resultListener.getCaptureResultForRequest(request,
+ NUM_RESULTS_WAIT_TIMEOUT);
+
+ resultDistances[i] = getValueNotNull(result, CaptureResult.LENS_FOCUS_DISTANCE);
+ resultLensStates[i] = getValueNotNull(result, CaptureResult.LENS_STATE);
+
if (VERBOSE) {
- Log.v(TAG, "Capture request focus distance: " + testDistances[i] + " result: "
- + resultDistances[i]);
+ Log.v(TAG, "Capture repeating request focus distance: " + testDistances[i]
+ + " result: " + resultDistances[i] + " lens state " + resultLensStates[i]);
}
}
- // Verify the monotonicity
- mCollector.checkArrayMonotonicityAndNotAllEqual(CameraTestUtils.toObject(resultDistances),
- /*ascendingOrder*/true);
+ verifyFocusDistance(testDistances, resultDistances, resultLensStates,
+ /*ascendingOrder*/true, /*noOvershoot*/false, /*repeatStart*/0, /*repeatEnd*/0,
+ errorMargin);
- if (mStaticInfo.getCharacteristics().getKeys().
- contains(CameraCharacteristics.LENS_INFO_HYPERFOCAL_DISTANCE)) {
+ if (mStaticInfo.areKeysAvailable(CameraCharacteristics.LENS_INFO_HYPERFOCAL_DISTANCE)) {
// Test hyperfocal distance optionally
float hyperFocalDistance = mStaticInfo.getHyperfocalDistanceChecked();
@@ -894,57 +925,157 @@
// Then wait for the lens.state to be stationary.
waitForResultValue(resultListener, CaptureResult.LENS_STATE,
CaptureResult.LENS_STATE_STATIONARY, NUM_RESULTS_WAIT_TIMEOUT);
- // Need get reasonably accurate value.
CaptureResult result = resultListener.getCaptureResult(WAIT_FOR_RESULT_TIMEOUT_MS);
Float focusDistance = getValueNotNull(result, CaptureResult.LENS_FOCUS_DISTANCE);
- float errorMargin = FOCUS_DISTANCE_ERROR_PERCENT_UNCALIBRATED;
- int calibrationStatus = mStaticInfo.getFocusDistanceCalibrationChecked();
- if (calibrationStatus ==
- CameraMetadata.LENS_INFO_FOCUS_DISTANCE_CALIBRATION_CALIBRATED) {
- errorMargin = FOCUS_DISTANCE_ERROR_PERCENT_CALIBRATED;
- } else if (calibrationStatus ==
- CameraMetadata.LENS_INFO_FOCUS_DISTANCE_CALIBRATION_APPROXIMATE) {
- errorMargin = FOCUS_DISTANCE_ERROR_PERCENT_APPROXIMATE;
- }
mCollector.expectInRange("Focus distance for hyper focal should be close enough to" +
- "requested value", focusDistance,
+ " requested value", focusDistance,
hyperFocalDistance * (1.0f - errorMargin),
- hyperFocalDistance * (1.0f + errorMargin)
- );
+ hyperFocalDistance * (1.0f + errorMargin));
}
}
}
+ private void focusDistanceTestBurst(CaptureRequest.Builder requestBuilder,
+ float errorMargin) throws Exception {
+
+ Size maxPrevSize = mOrderedPreviewSizes.get(0);
+ float[] testDistances = getFocusDistanceTestValuesInOrder(NUM_FOCUS_DISTANCES_REPEAT,
+ NUM_FOCUS_DISTANCES_REPEAT);
+ SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
+ startPreview(requestBuilder, maxPrevSize, resultListener);
+
+ float[] resultDistances = new float[testDistances.length];
+ int[] resultLensStates = new int[testDistances.length];
+
+ final int maxPipelineDepth = mStaticInfo.getCharacteristics().get(
+ CameraCharacteristics.REQUEST_PIPELINE_MAX_DEPTH);
+
+ // Move lens to starting position, and wait for the lens.state to be stationary.
+ CaptureRequest request;
+ requestBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, testDistances[0]);
+ request = requestBuilder.build();
+ mSession.setRepeatingRequest(request, resultListener, mHandler);
+ waitForResultValue(resultListener, CaptureResult.LENS_STATE,
+ CaptureResult.LENS_STATE_STATIONARY, NUM_RESULTS_WAIT_TIMEOUT);
+
+ // Submit burst of requests with different focus distances
+ List<CaptureRequest> burst = new ArrayList<>();
+ for (int i = 0; i < testDistances.length; i ++) {
+ requestBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, testDistances[i]);
+ burst.add(requestBuilder.build());
+ }
+ mSession.captureBurst(burst, resultListener, mHandler);
+
+ for (int i = 0; i < testDistances.length; i++) {
+ CaptureResult result = resultListener.getCaptureResultForRequest(
+ burst.get(i), maxPipelineDepth+1);
+
+ resultDistances[i] = getValueNotNull(result, CaptureResult.LENS_FOCUS_DISTANCE);
+ resultLensStates[i] = getValueNotNull(result, CaptureResult.LENS_STATE);
+
+ if (VERBOSE) {
+ Log.v(TAG, "Capture burst request focus distance: " + testDistances[i]
+ + " result: " + resultDistances[i] + " lens state " + resultLensStates[i]);
+ }
+ }
+
+ verifyFocusDistance(testDistances, resultDistances, resultLensStates,
+ /*ascendingOrder*/true, /*noOvershoot*/true,
+ /*repeatStart*/NUM_FOCUS_DISTANCES_REPEAT, /*repeatEnd*/NUM_FOCUS_DISTANCES_REPEAT,
+ errorMargin);
+
+ }
+
/**
* Verify focus distance control.
*
- * @param distance The focus distance requested
- * @param request The capture request to control the manual focus distance
- * @param resultListener The capture listener to recieve capture result callbacks
- * @return the result focus distance
+ * Assumption:
+ * - First repeatStart+1 elements of requestedDistances share the same value
+ * - Last repeatEnd+1 elements of requestedDistances share the same value
+ * - All elements in between are monotonically increasing/decreasing depending on ascendingOrder.
+ * - Focuser is at requestedDistances[0] at the beginning of the test.
+ *
+ * @param requestedDistances The requested focus distances
+ * @param resultDistances The result focus distances
+ * @param lensStates The result lens states
+ * @param ascendingOrder The order of the expected focus distance request/output
+ * @param noOvershoot Assert that focus control doesn't overshoot the requested value
+ * @param repeatStart The number of times the starting focus distance is repeated
+ * @param repeatEnd The number of times the ending focus distance is repeated
+ * @param errorMargin The error margin between request and result
*/
- private float verifyFocusDistanceControl(float distance, CaptureRequest request,
- SimpleCaptureCallback resultListener) {
- // Need make sure the result corresponding to the request is back, then check.
- CaptureResult result =
- resultListener.getCaptureResultForRequest(request, NUM_RESULTS_WAIT_TIMEOUT);
- // Then wait for the lens.state to be stationary.
- waitForResultValue(resultListener, CaptureResult.LENS_STATE,
- CaptureResult.LENS_STATE_STATIONARY, NUM_RESULTS_WAIT_TIMEOUT);
- // Then check the focus distance.
- result = resultListener.getCaptureResultForRequest(request, NUM_RESULTS_WAIT_TIMEOUT);
- Float resultDistance = getValueNotNull(result, CaptureResult.LENS_FOCUS_DISTANCE);
- if (mStaticInfo.getFocusDistanceCalibrationChecked() ==
- CameraCharacteristics.LENS_INFO_FOCUS_DISTANCE_CALIBRATION_CALIBRATED) {
- // TODO: what's more to test for CALIBRATED devices?
- }
+ private void verifyFocusDistance(float[] requestedDistances, float[] resultDistances,
+ int[] lensStates, boolean ascendingOrder, boolean noOvershoot, int repeatStart,
+ int repeatEnd, float errorMargin) {
float minValue = 0;
float maxValue = mStaticInfo.getMinimumFocusDistanceChecked();
- mCollector.expectInRange("Result focus distance is out of range",
- resultDistance, minValue, maxValue);
+ float hyperfocalDistance = 0;
+ if (mStaticInfo.areKeysAvailable(CameraCharacteristics.LENS_INFO_HYPERFOCAL_DISTANCE)) {
+ hyperfocalDistance = mStaticInfo.getHyperfocalDistanceChecked();
+ }
- return resultDistance;
+ // Verify lens and focus distance do not change for first repeatStart
+ // results.
+ for (int i = 0; i < repeatStart; i ++) {
+ float marginMin = requestedDistances[i] * (1.0f - errorMargin);
+ // HAL may choose to use hyperfocal distance for all distances between [0, hyperfocal].
+ float marginMax =
+ Math.max(requestedDistances[i], hyperfocalDistance) * (1.0f + errorMargin);
+
+ mCollector.expectEquals("Lens moves even though focus_distance didn't change",
+ lensStates[i], CaptureResult.LENS_STATE_STATIONARY);
+ if (noOvershoot) {
+ mCollector.expectInRange("Focus distance in result should be close enough to " +
+ "requested value", resultDistances[i], marginMin, marginMax);
+ }
+ mCollector.expectInRange("Result focus distance is out of range",
+ resultDistances[i], minValue, maxValue);
+ }
+
+ for (int i = repeatStart; i < resultDistances.length-1; i ++) {
+ float marginMin = requestedDistances[i] * (1.0f - errorMargin);
+ // HAL may choose to use hyperfocal distance for all distances between [0, hyperfocal].
+ float marginMax =
+ Math.max(requestedDistances[i], hyperfocalDistance) * (1.0f + errorMargin);
+ if (noOvershoot) {
+ // Result focus distance shouldn't overshoot the request
+ boolean condition;
+ if (ascendingOrder) {
+ condition = resultDistances[i] <= marginMax;
+ } else {
+ condition = resultDistances[i] >= marginMin;
+ }
+ mCollector.expectTrue(String.format(
+ "Lens shouldn't move past request focus distance. result " +
+ resultDistances[i] + " vs target of " +
+ (ascendingOrder ? marginMax : marginMin)), condition);
+ }
+
+ // Verify monotonically increased focus distance setting
+ boolean condition;
+ float compareDistance = resultDistances[i+1] - resultDistances[i];
+ if (i < resultDistances.length-1-repeatEnd) {
+ condition = (ascendingOrder ? compareDistance > 0 : compareDistance < 0);
+ } else {
+ condition = (ascendingOrder ? compareDistance >= 0 : compareDistance <= 0);
+ }
+ mCollector.expectTrue(String.format("Adjacent [resultDistances, lens_state] results ["
+ + resultDistances[i] + "," + lensStates[i] + "], [" + resultDistances[i+1] + ","
+ + lensStates[i+1] + "] monotonicity is broken"), condition);
+ }
+
+ mCollector.expectTrue(String.format("All values of this array are equal: " +
+ resultDistances[0] + " " + resultDistances[resultDistances.length-1]),
+ resultDistances[0] != resultDistances[resultDistances.length-1]);
+
+ // Verify lens moved to destination location.
+ mCollector.expectInRange("Focus distance " + resultDistances[resultDistances.length-1] +
+ " for minFocusDistance should be closed enough to requested value " +
+ requestedDistances[requestedDistances.length-1],
+ resultDistances[resultDistances.length-1],
+ requestedDistances[requestedDistances.length-1] * (1.0f - errorMargin),
+ requestedDistances[requestedDistances.length-1] * (1.0f + errorMargin));
}
/**
@@ -2232,16 +2363,28 @@
/**
* Generate test focus distances in range of [0, minFocusDistance] in increasing order.
+ *
+ * @param repeatMin number of times minValue will be repeated.
+ * @param repeatMax number of times maxValue will be repeated.
*/
- private float[] getFocusDistanceTestValuesInOrder() {
- float[] testValues = new float[NUM_TEST_FOCUS_DISTANCES + 1];
+ private float[] getFocusDistanceTestValuesInOrder(int repeatMin, int repeatMax) {
+ int totalCount = NUM_TEST_FOCUS_DISTANCES + 1 + repeatMin + repeatMax;
+ float[] testValues = new float[totalCount];
float minValue = 0;
float maxValue = mStaticInfo.getMinimumFocusDistanceChecked();
float range = maxValue - minValue;
float stepSize = range / NUM_TEST_FOCUS_DISTANCES;
- for (int i = 0; i < testValues.length; i++) {
- testValues[i] = minValue + stepSize * i;
+
+ for (int i = 0; i < repeatMin; i++) {
+ testValues[i] = minValue;
+ }
+ for (int i = 0; i <= NUM_TEST_FOCUS_DISTANCES; i++) {
+ testValues[repeatMin+i] = minValue + stepSize * i;
+ }
+ for (int i = 0; i < repeatMax; i++) {
+ testValues[repeatMin+NUM_TEST_FOCUS_DISTANCES+1+i] =
+ maxValue;
}
return testValues;
diff --git a/tests/camera/src/android/hardware/camera2/cts/DngCreatorTest.java b/tests/camera/src/android/hardware/camera2/cts/DngCreatorTest.java
index 4259882..6488cc6 100644
--- a/tests/camera/src/android/hardware/camera2/cts/DngCreatorTest.java
+++ b/tests/camera/src/android/hardware/camera2/cts/DngCreatorTest.java
@@ -66,6 +66,7 @@
private static final String TAG = "DngCreatorTest";
private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE);
private static final String DEBUG_DNG_FILE = "raw16.dng";
+ private static final String TEST_DNG_FILE = "test.dng";
private static final double IMAGE_DIFFERENCE_TOLERANCE = 65;
private static final int DEFAULT_PATCH_DIMEN = 512;
@@ -84,6 +85,11 @@
GPS_CALENDAR.set(2015, 0, 27, 2, 12, 01);
}
+ class CapturedData {
+ public Pair<List<Image>, CaptureResult> imagePair;
+ public CameraCharacteristics characteristics;
+ }
+
@Override
protected void setUp() throws Exception {
super.setUp();
@@ -320,62 +326,22 @@
* </p>
*/
public void testRaw16JpegConsistency() throws Exception {
- for (int i = 0; i < mCameraIds.length; i++) {
- String deviceId = mCameraIds[i];
- List<ImageReader> captureReaders = new ArrayList<ImageReader>();
- List<CameraTestUtils.SimpleImageReaderListener> captureListeners =
- new ArrayList<CameraTestUtils.SimpleImageReaderListener>();
+ for (String deviceId : mCameraIds) {
+ List<ImageReader> captureReaders = new ArrayList<>();
FileOutputStream fileStream = null;
ByteArrayOutputStream outputStream = null;
FileChannel fileChannel = null;
try {
- openDevice(deviceId);
-
- if (!mStaticInfo.isCapabilitySupported(
- CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_RAW)) {
- Log.i(TAG, "RAW capability is not supported in camera " + mCameraIds[i] +
- ". Skip the test.");
+ CapturedData data = captureRawJpegImagePair(deviceId, captureReaders);
+ if (data == null) {
continue;
}
-
- Size activeArraySize = mStaticInfo.getRawDimensChecked();
-
- // Get largest jpeg size
- Size[] targetJpegSizes =
- mStaticInfo.getAvailableSizesForFormatChecked(ImageFormat.JPEG,
- StaticMetadata.StreamDirection.Output);
-
- Size largestJpegSize = Collections.max(Arrays.asList(targetJpegSizes),
- new CameraTestUtils.SizeComparator());
-
- // Create raw image reader and capture listener
- CameraTestUtils.SimpleImageReaderListener rawListener
- = new CameraTestUtils.SimpleImageReaderListener();
- captureReaders.add(createImageReader(activeArraySize, ImageFormat.RAW_SENSOR, 2,
- rawListener));
- captureListeners.add(rawListener);
-
-
- // Create jpeg image reader and capture listener
- CameraTestUtils.SimpleImageReaderListener jpegListener
- = new CameraTestUtils.SimpleImageReaderListener();
- captureReaders.add(createImageReader(largestJpegSize, ImageFormat.JPEG, 2,
- jpegListener));
- captureListeners.add(jpegListener);
-
- Pair<List<Image>, CaptureResult> resultPair = captureSingleRawShot(activeArraySize,
- captureReaders, /*waitForAe*/true, captureListeners);
- CameraCharacteristics characteristics = mStaticInfo.getCharacteristics();
- Image raw = resultPair.first.get(0);
- Image jpeg = resultPair.first.get(1);
+ Image raw = data.imagePair.first.get(0);
+ Image jpeg = data.imagePair.first.get(1);
Bitmap rawBitmap = Bitmap.createBitmap(raw.getWidth(), raw.getHeight(),
Bitmap.Config.ARGB_8888);
- Size rawBitmapSize = new Size(rawBitmap.getWidth(), rawBitmap.getHeight());
- assertTrue("Raw bitmap size must be equal to either pre-correction active array" +
- " size or pixel array size.", rawBitmapSize.equals(activeArraySize));
-
byte[] rawPlane = new byte[raw.getPlanes()[0].getRowStride() * raw.getHeight()];
// Render RAW image to a bitmap
@@ -384,15 +350,16 @@
RawConverter.convertToSRGB(RenderScriptSingleton.getRS(), raw.getWidth(),
raw.getHeight(), raw.getPlanes()[0].getRowStride(), rawPlane,
- characteristics, resultPair.second, /*offsetX*/0, /*offsetY*/0,
- /*out*/rawBitmap);
+ data.characteristics, data.imagePair.second, /*offsetX*/ 0, /*offsetY*/ 0,
+ /*out*/ rawBitmap);
rawPlane = null;
System.gc(); // Hint to VM
if (VERBOSE) {
// Generate DNG file
- DngCreator dngCreator = new DngCreator(characteristics, resultPair.second);
+ DngCreator dngCreator =
+ new DngCreator(data.characteristics, data.imagePair.second);
// Write DNG to file
String dngFilePath = DEBUG_FILE_NAME_BASE + "/camera_" + deviceId + "_" +
@@ -426,82 +393,8 @@
rawFilePath);
}
- raw.close();
-
- // Decompress JPEG image to a bitmap
- byte[] compressedJpegData = CameraTestUtils.getDataFromImage(jpeg);
-
- jpeg.close();
-
- // Get JPEG dimensions without decoding
- BitmapFactory.Options opt0 = new BitmapFactory.Options();
- opt0.inJustDecodeBounds = true;
- BitmapFactory.decodeByteArray(compressedJpegData, /*offset*/0,
- compressedJpegData.length, /*inout*/opt0);
- Rect jpegDimens = new Rect(0, 0, opt0.outWidth, opt0.outHeight);
-
- // Find square center patch from JPEG and RAW bitmaps
- RectF jpegRect = new RectF(jpegDimens);
- RectF rawRect = new RectF(0, 0, rawBitmap.getWidth(), rawBitmap.getHeight());
- int sideDimen = Math.min(Math.min(Math.min(Math.min(DEFAULT_PATCH_DIMEN,
- jpegDimens.width()), jpegDimens.height()), rawBitmap.getWidth()),
- rawBitmap.getHeight());
-
- RectF jpegIntermediate = new RectF(0, 0, sideDimen, sideDimen);
- jpegIntermediate.offset(jpegRect.centerX() - jpegIntermediate.centerX(),
- jpegRect.centerY() - jpegIntermediate.centerY());
-
- RectF rawIntermediate = new RectF(0, 0, sideDimen, sideDimen);
- rawIntermediate.offset(rawRect.centerX() - rawIntermediate.centerX(),
- rawRect.centerY() - rawIntermediate.centerY());
- Rect jpegFinal = new Rect();
- jpegIntermediate.roundOut(jpegFinal);
- Rect rawFinal = new Rect();
- rawIntermediate.roundOut(rawFinal);
-
- // Get RAW center patch, and free up rest of RAW image
- Bitmap rawPatch = Bitmap.createBitmap(rawBitmap, rawFinal.left, rawFinal.top,
- rawFinal.width(), rawFinal.height());
- rawBitmap.recycle();
- rawBitmap = null;
- System.gc(); // Hint to VM
-
- BitmapFactory.Options opt = new BitmapFactory.Options();
- opt.inPreferredConfig = Bitmap.Config.ARGB_8888;
- Bitmap jpegPatch = BitmapRegionDecoder.newInstance(compressedJpegData,
- /*offset*/0, compressedJpegData.length, /*isShareable*/true).
- decodeRegion(jpegFinal, opt);
-
- // Compare center patch from JPEG and rendered RAW bitmap
- double difference = BitmapUtils.calcDifferenceMetric(jpegPatch, rawPatch);
- if (difference > IMAGE_DIFFERENCE_TOLERANCE) {
- // Write JPEG patch to file
- String jpegFilePath = DEBUG_FILE_NAME_BASE + "/camera_" + deviceId +
- "_jpeg_patch.jpg";
- fileStream = new FileOutputStream(jpegFilePath);
- jpegPatch.compress(Bitmap.CompressFormat.JPEG, 90, fileStream);
- fileStream.flush();
- fileStream.close();
- Log.e(TAG, "Failed JPEG patch file for camera " + deviceId + " saved to " +
- jpegFilePath);
-
- // Write RAW patch to file
- String rawFilePath = DEBUG_FILE_NAME_BASE + "/camera_" + deviceId +
- "_raw_patch.jpg";
- fileStream = new FileOutputStream(rawFilePath);
- rawPatch.compress(Bitmap.CompressFormat.JPEG, 90, fileStream);
- fileStream.flush();
- fileStream.close();
- Log.e(TAG, "Failed RAW patch file for camera " + deviceId + " saved to " +
- rawFilePath);
-
- fail("Camera " + mCamera.getId() + ": RAW and JPEG image at for the same " +
- "frame are not similar, center patches have difference metric of " +
- difference);
- }
-
+ validateRawJpegImagePair(rawBitmap, jpeg, deviceId);
} finally {
- closeDevice(deviceId);
for (ImageReader r : captureReaders) {
closeImageReader(r);
}
@@ -521,6 +414,184 @@
}
}
+ /**
+ * Test basic DNG creation, ensure that the DNG image can be rendered by BitmapFactory.
+ */
+ public void testDngRenderingByBitmapFactor() throws Exception {
+ for (String deviceId : mCameraIds) {
+ List<ImageReader> captureReaders = new ArrayList<>();
+
+ CapturedData data = captureRawJpegImagePair(deviceId, captureReaders);
+ if (data == null) {
+ continue;
+ }
+ Image raw = data.imagePair.first.get(0);
+ Image jpeg = data.imagePair.first.get(1);
+
+ // Generate DNG file
+ DngCreator dngCreator = new DngCreator(data.characteristics, data.imagePair.second);
+
+ // Write DNG to file
+ String dngFilePath = DEBUG_FILE_NAME_BASE + "/camera_" + deviceId + "_"
+ + TEST_DNG_FILE;
+ // Write out captured DNG file for the first camera device if setprop is enabled
+ try (FileOutputStream fileStream = new FileOutputStream(dngFilePath)) {
+ dngCreator.writeImage(fileStream, raw);
+
+ // Render the DNG file using BitmapFactory.
+ Bitmap rawBitmap = BitmapFactory.decodeFile(dngFilePath);
+ assertNotNull(rawBitmap);
+
+ validateRawJpegImagePair(rawBitmap, jpeg, deviceId);
+ } finally {
+ for (ImageReader r : captureReaders) {
+ closeImageReader(r);
+ }
+
+ System.gc(); // Hint to VM
+ }
+ }
+ }
+
+ /*
+ * Create RAW + JPEG image pair with characteristics info.
+ */
+ private CapturedData captureRawJpegImagePair(String deviceId, List<ImageReader> captureReaders)
+ throws Exception {
+ CapturedData data = new CapturedData();
+ List<CameraTestUtils.SimpleImageReaderListener> captureListeners = new ArrayList<>();
+ try {
+ openDevice(deviceId);
+
+ if (!mStaticInfo.isCapabilitySupported(
+ CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_RAW)) {
+ Log.i(TAG, "RAW capability is not supported in camera " + deviceId
+ + ". Skip the test.");
+ return null;
+ }
+
+ Size activeArraySize = mStaticInfo.getRawDimensChecked();
+
+ // Get largest jpeg size
+ Size[] targetJpegSizes = mStaticInfo.getAvailableSizesForFormatChecked(
+ ImageFormat.JPEG, StaticMetadata.StreamDirection.Output);
+
+ Size largestJpegSize = Collections.max(Arrays.asList(targetJpegSizes),
+ new CameraTestUtils.SizeComparator());
+
+ // Create raw image reader and capture listener
+ CameraTestUtils.SimpleImageReaderListener rawListener =
+ new CameraTestUtils.SimpleImageReaderListener();
+ captureReaders.add(createImageReader(activeArraySize, ImageFormat.RAW_SENSOR, 2,
+ rawListener));
+ captureListeners.add(rawListener);
+
+
+ // Create jpeg image reader and capture listener
+ CameraTestUtils.SimpleImageReaderListener jpegListener =
+ new CameraTestUtils.SimpleImageReaderListener();
+ captureReaders.add(createImageReader(largestJpegSize, ImageFormat.JPEG, 2,
+ jpegListener));
+ captureListeners.add(jpegListener);
+
+ data.imagePair = captureSingleRawShot(activeArraySize,
+ captureReaders, /*waitForAe*/ true, captureListeners);
+ data.characteristics = mStaticInfo.getCharacteristics();
+
+ Image raw = data.imagePair.first.get(0);
+ Size rawBitmapSize = new Size(raw.getWidth(), raw.getHeight());
+ assertTrue("Raw bitmap size must be equal to either pre-correction active array" +
+ " size or pixel array size.", rawBitmapSize.equals(activeArraySize));
+
+ return data;
+ } finally {
+ closeDevice(deviceId);
+ }
+ }
+
+ /*
+ * Verify the image pair by comparing the center patch.
+ */
+ private void validateRawJpegImagePair(Bitmap rawBitmap, Image jpeg, String deviceId)
+ throws Exception {
+ // Decompress JPEG image to a bitmap
+ byte[] compressedJpegData = CameraTestUtils.getDataFromImage(jpeg);
+
+ // Get JPEG dimensions without decoding
+ BitmapFactory.Options opt0 = new BitmapFactory.Options();
+ opt0.inJustDecodeBounds = true;
+ BitmapFactory.decodeByteArray(compressedJpegData, /*offset*/0,
+ compressedJpegData.length, /*inout*/opt0);
+ Rect jpegDimens = new Rect(0, 0, opt0.outWidth, opt0.outHeight);
+
+ // Find square center patch from JPEG and RAW bitmaps
+ RectF jpegRect = new RectF(jpegDimens);
+ RectF rawRect = new RectF(0, 0, rawBitmap.getWidth(), rawBitmap.getHeight());
+ int sideDimen = Math.min(Math.min(Math.min(Math.min(DEFAULT_PATCH_DIMEN,
+ jpegDimens.width()), jpegDimens.height()), rawBitmap.getWidth()),
+ rawBitmap.getHeight());
+
+ RectF jpegIntermediate = new RectF(0, 0, sideDimen, sideDimen);
+ jpegIntermediate.offset(jpegRect.centerX() - jpegIntermediate.centerX(),
+ jpegRect.centerY() - jpegIntermediate.centerY());
+
+ RectF rawIntermediate = new RectF(0, 0, sideDimen, sideDimen);
+ rawIntermediate.offset(rawRect.centerX() - rawIntermediate.centerX(),
+ rawRect.centerY() - rawIntermediate.centerY());
+ Rect jpegFinal = new Rect();
+ jpegIntermediate.roundOut(jpegFinal);
+ Rect rawFinal = new Rect();
+ rawIntermediate.roundOut(rawFinal);
+
+ // Get RAW center patch, and free up rest of RAW image
+ Bitmap rawPatch = Bitmap.createBitmap(rawBitmap, rawFinal.left, rawFinal.top,
+ rawFinal.width(), rawFinal.height());
+ rawBitmap.recycle();
+ rawBitmap = null;
+ System.gc(); // Hint to VM
+
+ BitmapFactory.Options opt = new BitmapFactory.Options();
+ opt.inPreferredConfig = Bitmap.Config.ARGB_8888;
+ Bitmap jpegPatch = BitmapRegionDecoder.newInstance(compressedJpegData,
+ /*offset*/0, compressedJpegData.length, /*isShareable*/true).
+ decodeRegion(jpegFinal, opt);
+
+ // Compare center patch from JPEG and rendered RAW bitmap
+ double difference = BitmapUtils.calcDifferenceMetric(jpegPatch, rawPatch);
+ if (difference > IMAGE_DIFFERENCE_TOLERANCE) {
+ FileOutputStream fileStream = null;
+ try {
+ // Write JPEG patch to file
+ String jpegFilePath = DEBUG_FILE_NAME_BASE + "/camera_" + deviceId +
+ "_jpeg_patch.jpg";
+ fileStream = new FileOutputStream(jpegFilePath);
+ jpegPatch.compress(Bitmap.CompressFormat.JPEG, 90, fileStream);
+ fileStream.flush();
+ fileStream.close();
+ Log.e(TAG, "Failed JPEG patch file for camera " + deviceId + " saved to " +
+ jpegFilePath);
+
+ // Write RAW patch to file
+ String rawFilePath = DEBUG_FILE_NAME_BASE + "/camera_" + deviceId +
+ "_raw_patch.jpg";
+ fileStream = new FileOutputStream(rawFilePath);
+ rawPatch.compress(Bitmap.CompressFormat.JPEG, 90, fileStream);
+ fileStream.flush();
+ fileStream.close();
+ Log.e(TAG, "Failed RAW patch file for camera " + deviceId + " saved to " +
+ rawFilePath);
+
+ fail("Camera " + mCamera.getId() + ": RAW and JPEG image at for the same " +
+ "frame are not similar, center patches have difference metric of " +
+ difference);
+ } finally {
+ if (fileStream != null) {
+ fileStream.close();
+ }
+ }
+ }
+ }
+
private Pair<Image, CaptureResult> captureSingleRawShot(Size s, boolean waitForAe,
ImageReader captureReader,
CameraTestUtils.SimpleImageReaderListener captureListener) throws Exception {
diff --git a/tests/camera/src/android/hardware/camera2/cts/ExtendedCameraCharacteristicsTest.java b/tests/camera/src/android/hardware/camera2/cts/ExtendedCameraCharacteristicsTest.java
index 1c56e98..3bb573b 100644
--- a/tests/camera/src/android/hardware/camera2/cts/ExtendedCameraCharacteristicsTest.java
+++ b/tests/camera/src/android/hardware/camera2/cts/ExtendedCameraCharacteristicsTest.java
@@ -392,6 +392,18 @@
expectKeyAvailable(c, CameraCharacteristics.SENSOR_FORWARD_MATRIX2 , OPT , RAW );
}
+ // Required key if any of RAW format output is supported
+ StreamConfigurationMap config =
+ c.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
+ assertNotNull(String.format("No stream configuration map found for: ID %s",
+ mIds[counter]), config);
+ if (config.isOutputSupportedFor(ImageFormat.RAW_SENSOR) ||
+ config.isOutputSupportedFor(ImageFormat.RAW10) ||
+ config.isOutputSupportedFor(ImageFormat.RAW12) ||
+ config.isOutputSupportedFor(ImageFormat.RAW_PRIVATE)) {
+ expectKeyAvailable(c,
+ CameraCharacteristics.CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE, OPT, BC);
+ }
counter++;
}
}
diff --git a/tests/camera/src/android/hardware/camera2/cts/PerformanceTest.java b/tests/camera/src/android/hardware/camera2/cts/PerformanceTest.java
index f0f8f66..3f8e7db 100644
--- a/tests/camera/src/android/hardware/camera2/cts/PerformanceTest.java
+++ b/tests/camera/src/android/hardware/camera2/cts/PerformanceTest.java
@@ -114,16 +114,18 @@
* </p>
*/
public void testCameraLaunch() throws Exception {
- double[] cameraOpenTimes = new double[NUM_TEST_LOOPS];
- double[] configureStreamTimes = new double[NUM_TEST_LOOPS];
- double[] startPreviewTimes = new double[NUM_TEST_LOOPS];
- double[] stopPreviewTimes = new double[NUM_TEST_LOOPS];
- double[] cameraCloseTimes = new double[NUM_TEST_LOOPS];
- double[] cameraLaunchTimes = new double[NUM_TEST_LOOPS];
double[] avgCameraLaunchTimes = new double[mCameraIds.length];
int counter = 0;
for (String id : mCameraIds) {
+ // Do NOT move these variables to outer scope
+ // They will be passed to DeviceReportLog and their references will be stored
+ double[] cameraOpenTimes = new double[NUM_TEST_LOOPS];
+ double[] configureStreamTimes = new double[NUM_TEST_LOOPS];
+ double[] startPreviewTimes = new double[NUM_TEST_LOOPS];
+ double[] stopPreviewTimes = new double[NUM_TEST_LOOPS];
+ double[] cameraCloseTimes = new double[NUM_TEST_LOOPS];
+ double[] cameraLaunchTimes = new double[NUM_TEST_LOOPS];
try {
mStaticInfo = new StaticMetadata(mCameraManager.getCameraCharacteristics(id));
if (mStaticInfo.isColorOutputSupported()) {
@@ -224,13 +226,15 @@
* </p>
*/
public void testSingleCapture() throws Exception {
- double[] captureTimes = new double[NUM_TEST_LOOPS];
- double[] getPartialTimes = new double[NUM_TEST_LOOPS];
- double[] getResultTimes = new double[NUM_TEST_LOOPS];
double[] avgResultTimes = new double[mCameraIds.length];
int counter = 0;
for (String id : mCameraIds) {
+ // Do NOT move these variables to outer scope
+ // They will be passed to DeviceReportLog and their references will be stored
+ double[] captureTimes = new double[NUM_TEST_LOOPS];
+ double[] getPartialTimes = new double[NUM_TEST_LOOPS];
+ double[] getResultTimes = new double[NUM_TEST_LOOPS];
try {
openDevice(id);
diff --git a/tests/camera/src/android/hardware/cts/CameraGLTest.java b/tests/camera/src/android/hardware/cts/CameraGLTest.java
index cb83a36..1f86936 100644
--- a/tests/camera/src/android/hardware/cts/CameraGLTest.java
+++ b/tests/camera/src/android/hardware/cts/CameraGLTest.java
@@ -609,7 +609,8 @@
kTestSlopMargin;
int outOfBoundsCount = 0;
- for (int i = 1; i < kLoopCount; i++) {
+ // Ignore last frame because preview is turned off which impacts fps
+ for (int i = 1; i < kLoopCount - 1; i++) {
float frameDurationMs =
(timestamps[i] - timestamps[i-1]) / 1000000.f;
if (LOGVV) {
diff --git a/tests/expectations/knownfailures.txt b/tests/expectations/knownfailures.txt
index 5d81753..f83861d 100644
--- a/tests/expectations/knownfailures.txt
+++ b/tests/expectations/knownfailures.txt
@@ -165,14 +165,6 @@
bug: 17508787
},
{
- description: "This test should be outside of official CTS suite until it is verified for all Nexus devices",
- names: [
- "com.android.cts.devicepolicy.MixedDeviceOwnerTest#testPackageInstallUserRestrictions",
- "com.android.cts.devicepolicy.MixedProfileOwnerTest#testPackageInstallUserRestrictions"
- ],
- bug: 18928535
-},
-{
description: "Test is not yet properly implemented",
names: [
"android.voicesettings.cts.ZenModeTest#testAll"
diff --git a/tests/libcore/Android.mk b/tests/libcore/Android.mk
index c424cab..6596dd6 100644
--- a/tests/libcore/Android.mk
+++ b/tests/libcore/Android.mk
@@ -43,11 +43,11 @@
# Copy the expectation files to CTS
LOCAL_COMPATIBILITY_SUPPORT_FILES += \
- ../../../art/tools/libcore_failures.txt:$(LOCAL_PACKAGE_NAME).failures.expectations \
- ../../../libcore/expectations/brokentests.txt:$(LOCAL_PACKAGE_NAME).brokentests.expectations \
- ../../../libcore/expectations/icebox.txt:$(LOCAL_PACKAGE_NAME).icebox.expectations \
- ../../../libcore/expectations/knownfailures.txt:$(LOCAL_PACKAGE_NAME).knownfailures.expectations \
- ../../../libcore/expectations/taggedtests.txt:$(LOCAL_PACKAGE_NAME).taggedtests.expectations
+ art/tools/libcore_failures.txt:$(LOCAL_PACKAGE_NAME).failures.expectations \
+ libcore/expectations/brokentests.txt:$(LOCAL_PACKAGE_NAME).brokentests.expectations \
+ libcore/expectations/icebox.txt:$(LOCAL_PACKAGE_NAME).icebox.expectations \
+ libcore/expectations/knownfailures.txt:$(LOCAL_PACKAGE_NAME).knownfailures.expectations \
+ libcore/expectations/taggedtests.txt:$(LOCAL_PACKAGE_NAME).taggedtests.expectations
LOCAL_JAVA_LANGUAGE_VERSION := 1.8
diff --git a/tests/libcore/AndroidTest.xml b/tests/libcore/AndroidTest.xml
index e71669a..db4044d 100644
--- a/tests/libcore/AndroidTest.xml
+++ b/tests/libcore/AndroidTest.xml
@@ -27,11 +27,6 @@
<test class="com.android.compatibility.testtype.DalvikTest" >
<option name="run-name" value="CtsLibcoreTestCases" />
<option name="classpath" value="/data/local/tmp/ctslibcore/cts-dalvik-device-test-runner.jar" />
- <option name="expectations" value="CtsLibcoreTestCases.brokentests.expectations" />
- <option name="expectations" value="CtsLibcoreTestCases.icebox.expectations" />
- <option name="expectations" value="CtsLibcoreTestCases.knownfailures.expectations" />
- <option name="expectations" value="CtsLibcoreTestCases.taggedtests.expectations" />
- <option name="expectations" value="CtsLibcoreTestCases.failures.expectations" />
<option name="dalvik-arg" value="-Djava.io.tmpdir=/data/local/tmp/ctslibcore/java.io.tmpdir" />
<option name="dalvik-arg" value="-Duser.home=/data/local/tmp/ctslibcore/user.home" />
<option name="dalvik-arg" value="-Duser.name=shell" />
@@ -40,5 +35,6 @@
<option name="dalvik-arg" value="-Xcheck:jni" />
<option name="dalvik-arg" value="-Xjnigreflimit:2000" />
<option name="runner-arg" value="--apk=/data/local/tmp/ctslibcore/CtsLibcoreTestCases.apk" />
+ <option name="runtime-hint" value="12m" />
</test>
</configuration>
diff --git a/tests/libcore/runner/host-side/src/com/android/compatibility/testtype/DalvikTest.java b/tests/libcore/runner/host-side/src/com/android/compatibility/testtype/DalvikTest.java
index 4fc711c..c855e1a 100644
--- a/tests/libcore/runner/host-side/src/com/android/compatibility/testtype/DalvikTest.java
+++ b/tests/libcore/runner/host-side/src/com/android/compatibility/testtype/DalvikTest.java
@@ -25,6 +25,7 @@
import com.android.ddmlib.testrunner.TestIdentifier;
import com.android.tradefed.build.IBuildInfo;
import com.android.tradefed.config.Option;
+import com.android.tradefed.config.OptionCopier;
import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.device.ITestDevice;
import com.android.tradefed.result.ITestInvocationListener;
@@ -33,15 +34,21 @@
import com.android.tradefed.testtype.IBuildReceiver;
import com.android.tradefed.testtype.IDeviceTest;
import com.android.tradefed.testtype.IRemoteTest;
+import com.android.tradefed.testtype.IRuntimeHintProvider;
+import com.android.tradefed.testtype.IShardableTest;
import com.android.tradefed.testtype.ITestFilterReceiver;
import com.android.tradefed.util.ArrayUtil;
+import com.android.tradefed.util.TimeVal;
import vogar.ExpectationStore;
import vogar.ModeId;
import java.io.File;
+import java.io.FilenameFilter;
import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -52,10 +59,47 @@
* A wrapper to run tests against Dalvik.
*/
public class DalvikTest implements IAbiReceiver, IBuildReceiver, IDeviceTest, IRemoteTest,
- ITestFilterReceiver {
+ IRuntimeHintProvider, IShardableTest, ITestFilterReceiver {
private static final String TAG = DalvikTest.class.getSimpleName();
+ private static final String LIBCORE_PACKAGE = "android.core.tests.libcore.package.%s";
+ private static final Set<String> PACKAGES = new HashSet<>();
+ static {
+ PACKAGES.add(String.format(LIBCORE_PACKAGE, "com"));// Has 0 tests
+ PACKAGES.add(String.format(LIBCORE_PACKAGE, "conscrypt"));// Has 0 tests
+ PACKAGES.add(String.format(LIBCORE_PACKAGE, "dalvik"));// Has 0 tests
+ PACKAGES.add(String.format(LIBCORE_PACKAGE, "jsr166"));// Has 0 tests
+ PACKAGES.add(String.format(LIBCORE_PACKAGE, "libcore"));// Has 0 tests
+ PACKAGES.add(String.format(LIBCORE_PACKAGE, "okhttp"));// Has 0 tests
+ PACKAGES.add(String.format(LIBCORE_PACKAGE, "org"));// Has 0 tests
+ PACKAGES.add(String.format(LIBCORE_PACKAGE, "sun"));// Has 0 tests
+ PACKAGES.add(String.format(LIBCORE_PACKAGE, "tests"));
+ PACKAGES.add(String.format(LIBCORE_PACKAGE, "tzdata"));// Has 0 tests
+ PACKAGES.add("com.android.org.apache.harmony.beans");// Has 0 tests
+ PACKAGES.add("com.android.org.apache.harmony.logging");// Has 0 tests
+ PACKAGES.add("com.android.org.apache.harmony.prefs");// Has 0 tests
+ PACKAGES.add("com.android.org.apache.harmony.sql");// Has 0 tests
+ PACKAGES.add("org.apache.harmony.annotation.tests");// Has 0 tests
+ PACKAGES.add("org.apache.harmony.crypto.tests");// Has 0 tests
+ PACKAGES.add("org.apache.harmony.luni.tests");// Has 0 tests
+ PACKAGES.add("org.apache.harmony.nio.tests");// Has 0 tests
+ PACKAGES.add("org.apache.harmony.regex.tests");// Has 0 tests
+ PACKAGES.add("org.apache.harmony.security.tests");// Has 0 tests
+ PACKAGES.add("org.apache.harmony.tests.internal.net.www.protocol");// Has 0 tests
+ PACKAGES.add("org.apache.harmony.tests.java.io");
+ PACKAGES.add("org.apache.harmony.tests.java.lang");
+ PACKAGES.add("org.apache.harmony.tests.java.math");
+ PACKAGES.add("org.apache.harmony.tests.java.net");
+ PACKAGES.add("org.apache.harmony.tests.java.nio");
+ PACKAGES.add("org.apache.harmony.tests.java.text");
+ PACKAGES.add("org.apache.harmony.tests.java.util");
+ PACKAGES.add("org.apache.harmony.tests.javax.net");
+ PACKAGES.add("org.apache.harmony.tests.javax.security");
+ PACKAGES.add("org.json");
+ PACKAGES.add("org.w3c.domts");
+ }
+ private static final String EXPECTATIONS_EXT = ".expectations";
// Command to run the VM, args are bitness, classpath, dalvik-args, abi, runner-args,
// include and exclude filters, and exclude filters file.
private static final String COMMAND = "dalvikvm%s -classpath %s %s "
@@ -71,9 +115,6 @@
@Option(name = "run-name", description = "The name to use when reporting results")
private String mRunName;
- @Option(name = "expectations", description = "The names of the expectation files")
- private Set<String> mExpectations = new HashSet<>();
-
@Option(name = "classpath", description = "Holds the paths to search when loading tests")
private List<String> mClasspath = new ArrayList<>();
@@ -92,6 +133,11 @@
description = "The exclude filters of the test name to run.")
private List<String> mExcludeFilters = new ArrayList<>();
+ @Option(name = "runtime-hint",
+ isTimeVal = true,
+ description="The hint about the test's runtime.")
+ private long mRuntimeHint = 60000;// 1 minute
+
private IAbi mAbi;
private CompatibilityBuildHelper mBuildHelper;
private ITestDevice mDevice;
@@ -164,6 +210,14 @@
* {@inheritDoc}
*/
@Override
+ public long getRuntimeHint() {
+ return mRuntimeHint;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
public void run(final ITestInvocationListener listener) throws DeviceNotAvailableException {
String abiName = mAbi.getName();
String bitness = AbiUtils.getBitness(abiName);
@@ -172,8 +226,9 @@
PrintWriter out = null;
try {
Set<File> expectationFiles = new HashSet<>();
- for (String file : mExpectations) {
- expectationFiles.add(new File(mBuildHelper.getTestsDir(), file));
+ for (File f : mBuildHelper.getTestsDir().listFiles(
+ new ExpectationFileFilter(mRunName))) {
+ expectationFiles.add(f);
}
ExpectationStore store = ExpectationStore.parse(expectationFiles, ModeId.DEVICE);
@@ -200,7 +255,13 @@
}
// Create command
+ mDalvikArgs.add("-Duser.name=shell");
+ mDalvikArgs.add("-Duser.language=en");
+ mDalvikArgs.add("-Duser.region=US");
+ mDalvikArgs.add("-Xcheck:jni");
+ mDalvikArgs.add("-Xjnigreflimit:2000");
String dalvikArgs = ArrayUtil.join(" ", mDalvikArgs);
+
String runnerArgs = ArrayUtil.join(" ", mRunnerArgs);
// Filters
StringBuilder includeFilters = new StringBuilder();
@@ -216,7 +277,7 @@
// Filter files
String includeFile = ""; // String.format("--include-filter-file=%s", INCLUDE);
String excludeFile = String.format("--exclude-filter-file=%s", EXCLUDE_FILE);
- String command = String.format(COMMAND, bitness,
+ final String command = String.format(COMMAND, bitness,
ArrayUtil.join(File.pathSeparator, mClasspath),
dalvikArgs, abiName, runnerArgs,
includeFilters, excludeFilters, includeFile, excludeFile);
@@ -235,9 +296,12 @@
String tag = parts[0];
if (tag.equals(START_RUN)) {
listener.testRunStarted(mRunName, Integer.parseInt(parts[1]));
+ Log.logAndDisplay(LogLevel.INFO, TAG, command);
+ Log.logAndDisplay(LogLevel.INFO, TAG, line);
} else if (tag.equals(END_RUN)) {
listener.testRunEnded(Integer.parseInt(parts[1]),
new HashMap<String, String>());
+ Log.logAndDisplay(LogLevel.INFO, TAG, line);
} else if (tag.equals(START_TEST)) {
test = getTestIdentifier(parts[1]);
listener.testStarted(test);
@@ -266,4 +330,45 @@
mDevice.executeShellCommand(command, receiver, 1, TimeUnit.HOURS, 1);
}
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Collection<IRemoteTest> split() {
+ List<IRemoteTest> shards = new ArrayList<>();
+ // Test to catch all packages that aren't in PACKAGES
+ DalvikTest catchAll = new DalvikTest();
+ OptionCopier.copyOptionsNoThrow(this, catchAll);
+ shards.add(catchAll);
+ long runtimeHint = mRuntimeHint / PACKAGES.size();
+ catchAll.mRuntimeHint = runtimeHint;
+ for (String entry: PACKAGES) {
+ catchAll.addExcludeFilter(entry);
+ DalvikTest test = new DalvikTest();
+ OptionCopier.copyOptionsNoThrow(this, test);
+ test.addIncludeFilter(entry);
+ test.mRuntimeHint = runtimeHint;
+ shards.add(test);
+ }
+ return shards;
+ }
+
+ /**
+ * A {@link FilenameFilter} to find all the expectation files in a directory.
+ */
+ public static class ExpectationFileFilter implements FilenameFilter {
+
+ private String mName;
+
+ public ExpectationFileFilter(String name) {
+ mName = name;
+ }
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean accept(File dir, String name) {
+ return name.startsWith(mName) && name.endsWith(EXPECTATIONS_EXT);
+ }
+ }
}
diff --git a/tests/openglperf2/jni/Android.mk b/tests/openglperf2/jni/Android.mk
index a312e59..c2bb7a8 100644
--- a/tests/openglperf2/jni/Android.mk
+++ b/tests/openglperf2/jni/Android.mk
@@ -30,4 +30,8 @@
LOCAL_CXX_STL := libc++_static
+# TODO (dimitry): replace LOCAL_CXX_STL with LOCAL_SDK_VERSION+LOCAL_NDK_STL_VARIANT
+# LOCAL_SDK_VERSION := 23
+# LOCAL_NDK_STL_VARIANT := c++_static
+
include $(BUILD_SHARED_LIBRARY)
diff --git a/tests/openglperf2/jni/graphics/GLUtils.cpp b/tests/openglperf2/jni/graphics/GLUtils.cpp
index 7786447..e6beecc 100644
--- a/tests/openglperf2/jni/graphics/GLUtils.cpp
+++ b/tests/openglperf2/jni/graphics/GLUtils.cpp
@@ -20,7 +20,7 @@
#define LOG_TAG "CTS_OPENGL"
#define LOG_NDEBUG 0
-#include <utils/Log.h>
+#include <android/log.h>
static JNIEnv* sEnv = NULL;
static jobject sAssetManager = NULL;
@@ -41,7 +41,7 @@
char* GLUtils::openTextFile(const char* path) {
AAsset* asset = loadAsset(path);
if (asset == NULL) {
- ALOGE("Couldn't load %s", path);
+ __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, "Couldn't load %s", path);
return NULL;
}
off_t length = AAsset_getLength(asset);
@@ -49,7 +49,7 @@
int num = AAsset_read(asset, buffer, length);
AAsset_close(asset);
if (num != length) {
- ALOGE("Couldn't read %s", path);
+ __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, "Couldn't read %s", path);
delete[] buffer;
return NULL;
}
@@ -61,13 +61,13 @@
GLuint textureId = 0;
jclass activityClass = sEnv->FindClass("android/opengl2/cts/reference/GLGameActivity");
if (activityClass == NULL) {
- ALOGE("Couldn't find activity class");
+ __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, "Couldn't find activity class");
return -1;
}
jmethodID loadTexture = sEnv->GetStaticMethodID(activityClass, "loadTexture",
"(Landroid/content/res/AssetManager;Ljava/lang/String;)I");
if (loadTexture == NULL) {
- ALOGE("Couldn't find loadTexture method");
+ __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, "Couldn't find loadTexture method");
return -1;
}
jstring pathStr = sEnv->NewStringUTF(path);
@@ -141,7 +141,8 @@
if (infoLen > 0) {
char* infoLog = (char*) malloc(sizeof(char) * infoLen);
glGetShaderInfoLog(shader, infoLen, NULL, infoLog);
- ALOGE("Error compiling shader:\n%s\n", infoLog);
+ __android_log_print(ANDROID_LOG_ERROR, LOG_TAG,
+ "Error compiling shader:\n%s\n", infoLog);
free(infoLog);
}
glDeleteShader(shader);
@@ -177,7 +178,8 @@
if (infoLen > 0) {
char* infoLog = (char*) malloc(sizeof(char) * infoLen);
glGetProgramInfoLog(program, infoLen, NULL, infoLog);
- ALOGE("Error linking program:\n%s\n", infoLog);
+ __android_log_print(ANDROID_LOG_ERROR, LOG_TAG,
+ "Error linking program:\n%s\n", infoLog);
free(infoLog);
}
glDeleteProgram(program);
diff --git a/tests/openglperf2/jni/graphics/Matrix.cpp b/tests/openglperf2/jni/graphics/Matrix.cpp
index 0097a5d..463338a 100644
--- a/tests/openglperf2/jni/graphics/Matrix.cpp
+++ b/tests/openglperf2/jni/graphics/Matrix.cpp
@@ -18,7 +18,7 @@
#define LOG_TAG "CTS_OPENGL"
#define LOG_NDEBUG 0
-#include "utils/Log.h"
+#include "android/log.h"
Matrix::Matrix() {
identity();
@@ -29,10 +29,10 @@
}
void Matrix::print(const char* label) {
- ALOGI("%c", *label);
+ __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "%c", *label);
for (int i = 0; i < 4; i++) {
const float* d = &(mData[i * 4]);
- ALOGI("%f %f %f %f\n", d[0], d[1], d[2], d[3]);
+ __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "%f %f %f %f\n", d[0], d[1], d[2], d[3]);
}
}
diff --git a/tests/openglperf2/jni/graphics/Renderer.cpp b/tests/openglperf2/jni/graphics/Renderer.cpp
index 16504fd..effd5aca 100644
--- a/tests/openglperf2/jni/graphics/Renderer.cpp
+++ b/tests/openglperf2/jni/graphics/Renderer.cpp
@@ -16,7 +16,7 @@
#define LOG_TAG "CTS_OPENGL"
#define LOG_NDEBUG 0
-#include <utils/Log.h>
+#include <android/log.h>
#include <Trace.h>
@@ -26,7 +26,8 @@
#define EGL_RESULT_CHECK(X) do { \
EGLint error = eglGetError(); \
if (!(X) || error != EGL_SUCCESS) { \
- ALOGE("EGL error '%d' at %s:%d", error, __FILE__, __LINE__);\
+ __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, \
+ "EGL error '%d' at %s:%d", error, __FILE__, __LINE__);\
return false; \
} \
} while (0)
@@ -160,13 +161,13 @@
GLuint err = glGetError();
if (err != GL_NO_ERROR) {
- ALOGE("GLError %d", err);
+ __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, "GLError %d", err);
return false;
}
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE) {
- ALOGE("Framebuffer not complete: %d", status);
+ __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, "Framebuffer not complete: %d", status);
return false;
}
// Create fbo program.
@@ -190,7 +191,7 @@
GLuint err = glGetError();
if (err != GL_NO_ERROR) {
- ALOGE("GLError %d in setUp", err);
+ __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, "GLError %d in setUp", err);
return false;
}
@@ -215,7 +216,7 @@
}
GLuint err = glGetError();
if (err != GL_NO_ERROR) {
- ALOGE("GLError %d in tearDown", err);
+ __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, "GLError %d in tearDown", err);
return false;
}
@@ -284,7 +285,7 @@
GLuint err = glGetError();
if (err != GL_NO_ERROR) {
- ALOGE("GLError %d in draw", err);
+ __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, "GLError %d in draw", err);
return false;
}
diff --git a/tests/openglperf2/jni/primitive/contextswitch/ContextSwitchRenderer.cpp b/tests/openglperf2/jni/primitive/contextswitch/ContextSwitchRenderer.cpp
index 1127d88..5e9b414 100644
--- a/tests/openglperf2/jni/primitive/contextswitch/ContextSwitchRenderer.cpp
+++ b/tests/openglperf2/jni/primitive/contextswitch/ContextSwitchRenderer.cpp
@@ -26,7 +26,7 @@
#define LOG_TAG "CTS_OPENGL"
#define LOG_NDEBUG 0
-#include <utils/Log.h>
+#include <android/log.h>
#include <Trace.h>
static const EGLint contextAttribs[] = {
@@ -127,7 +127,7 @@
GL_TEXTURE_2D, mFboTexId, 0);
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE) {
- ALOGE("Framebuffer not complete: %d", status);
+ __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, "Framebuffer not complete: %d", status);
return false;
}
}
@@ -218,7 +218,7 @@
}
GLuint err = glGetError();
if (err != GL_NO_ERROR) {
- ALOGE("GLError %d in drawWorkload", err);
+ __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, "GLError %d in drawWorkload", err);
break;
}
}
diff --git a/tests/openglperf2/jni/reference/scene/flocking/Boid.h b/tests/openglperf2/jni/reference/scene/flocking/Boid.h
index 3e4367a..994126e 100644
--- a/tests/openglperf2/jni/reference/scene/flocking/Boid.h
+++ b/tests/openglperf2/jni/reference/scene/flocking/Boid.h
@@ -16,7 +16,6 @@
#define BOID_H
#include <graphics/Vector2D.h>
-#include <utils/Compat.h>
class Boid {
public:
@@ -25,14 +24,14 @@
void flock(const Boid* boids[], int numBoids, int index, float limitX, float limitY);
// The following floats are the parameters for the flocking algorithm, changing these
// modifies the boid's behaviour.
- static const CONSTEXPR float MAX_SPEED = 2.0f;// Upper limit of boid velocity.
- static const CONSTEXPR float MAX_FORCE = 0.05f;// Upper limit of the force used to push a boid.
- static const CONSTEXPR float NEIGHBOUR_RADIUS = 70.0f;// Radius used to find neighbours, was 50.
- static const CONSTEXPR float DESIRED_BOID_DIST = 35.0f;// Distance boids want to be from others, was 25.
+ static const constexpr float MAX_SPEED = 2.0f;// Upper limit of boid velocity.
+ static const constexpr float MAX_FORCE = 0.05f;// Upper limit of the force used to push a boid.
+ static const constexpr float NEIGHBOUR_RADIUS = 70.0f;// Radius used to find neighbours, was 50.
+ static const constexpr float DESIRED_BOID_DIST = 35.0f;// Distance boids want to be from others, was 25.
// The weightings of the components.
- static const CONSTEXPR float SEPARATION_WEIGHT = 2.0f;
- static const CONSTEXPR float ALIGNMENT_WEIGHT = 1.0f;
- static const CONSTEXPR float COHESION_WEIGHT = 1.0f;
+ static const constexpr float SEPARATION_WEIGHT = 2.0f;
+ static const constexpr float ALIGNMENT_WEIGHT = 1.0f;
+ static const constexpr float COHESION_WEIGHT = 1.0f;
Vector2D mPosition;
Vector2D mVelocity;
Vector2D mAcceleration;
diff --git a/tests/tests/accounts/src/android/accounts/cts/MockAccountAuthenticator.java b/tests/tests/accounts/src/android/accounts/cts/MockAccountAuthenticator.java
index 194fbfc..470b629 100644
--- a/tests/tests/accounts/src/android/accounts/cts/MockAccountAuthenticator.java
+++ b/tests/tests/accounts/src/android/accounts/cts/MockAccountAuthenticator.java
@@ -147,7 +147,6 @@
public Bundle addAccount(AccountAuthenticatorResponse response, String accountType,
String authTokenType, String[] requiredFeatures, Bundle options)
throws NetworkErrorException {
- super.addAccountFromCredentials(null, null, null);
this.mResponse = response;
this.mAccountType = accountType;
this.mAuthTokenType = authTokenType;
diff --git a/tests/tests/automotive/Android.mk b/tests/tests/automotive/Android.mk
index f4cef01..b21867d 100644
--- a/tests/tests/automotive/Android.mk
+++ b/tests/tests/automotive/Android.mk
@@ -24,7 +24,9 @@
# When built, explicitly put it in the data partition.
LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner car
+LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
+
+LOCAL_JAVA_LIBRARIES := android.car
LOCAL_SRC_FILES := $(call all-java-files-under, src)
diff --git a/tests/tests/automotive/AndroidManifest.xml b/tests/tests/automotive/AndroidManifest.xml
index e0ee3e0..984d896 100644
--- a/tests/tests/automotive/AndroidManifest.xml
+++ b/tests/tests/automotive/AndroidManifest.xml
@@ -15,14 +15,14 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="android.support.car.cts">
+ package="android.car.cts">
<uses-feature android:name="android.hardware.type.automotive" />
<application>
<uses-library android:name="android.test.runner" />
</application>
<instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
- android:targetPackage="android.support.car.cts"
+ android:targetPackage="android.car.cts"
android:label="CTS tests for Automotive">
<meta-data android:name="listener"
android:value="com.android.cts.runner.CtsTestRunListener" />
diff --git a/tests/tests/automotive/src/android/support/car/cts/CarApiTestBase.java b/tests/tests/automotive/src/android/car/cts/CarApiTestBase.java
similarity index 83%
rename from tests/tests/automotive/src/android/support/car/cts/CarApiTestBase.java
rename to tests/tests/automotive/src/android/car/cts/CarApiTestBase.java
index 17482ea3..948604c 100644
--- a/tests/tests/automotive/src/android/support/car/cts/CarApiTestBase.java
+++ b/tests/tests/automotive/src/android/car/cts/CarApiTestBase.java
@@ -14,13 +14,13 @@
* limitations under the License.
*/
-package android.support.car.cts;
+package android.car.cts;
+import android.car.Car;
import android.content.ComponentName;
+import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.Looper;
-import android.support.car.Car;
-import android.support.car.ServiceConnectionListener;
import android.test.AndroidTestCase;
import java.util.concurrent.Semaphore;
@@ -50,13 +50,11 @@
protected void tearDown() throws Exception {
super.tearDown();
mCar.disconnect();
- }
-
- protected synchronized Car getCar() {
+ } protected synchronized Car getCar() {
return mCar;
}
- protected class DefaultServiceConnectionListener implements ServiceConnectionListener {
+ protected class DefaultServiceConnectionListener implements ServiceConnection {
private final Semaphore mConnectionWait = new Semaphore(0);
public void waitForConnection(long timeoutMs) throws InterruptedException {
@@ -64,21 +62,11 @@
}
@Override
- public void onServiceSuspended(int cause) {
- assertMainThread();
- }
-
- @Override
public void onServiceDisconnected(ComponentName name) {
assertMainThread();
}
@Override
- public void onServiceConnectionFailed(int cause) {
- assertMainThread();
- }
-
- @Override
public void onServiceConnected(ComponentName name, IBinder service) {
assertMainThread();
mConnectionWait.release();
diff --git a/tests/tests/automotive/src/android/support/car/cts/CarAppContextManagerTest.java b/tests/tests/automotive/src/android/car/cts/CarAppContextManagerTest.java
similarity index 98%
rename from tests/tests/automotive/src/android/support/car/cts/CarAppContextManagerTest.java
rename to tests/tests/automotive/src/android/car/cts/CarAppContextManagerTest.java
index 9f031d8..3b0b835 100644
--- a/tests/tests/automotive/src/android/support/car/cts/CarAppContextManagerTest.java
+++ b/tests/tests/automotive/src/android/car/cts/CarAppContextManagerTest.java
@@ -13,10 +13,10 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package android.support.car.cts;
+package android.car.cts;
-import android.support.car.Car;
-import android.support.car.CarAppContextManager;
+import android.car.Car;
+import android.car.CarAppContextManager;
import android.util.Log;
import java.util.concurrent.Semaphore;
diff --git a/tests/tests/automotive/src/android/support/car/cts/CarConnectionListenerTest.java b/tests/tests/automotive/src/android/car/cts/CarConnectionListenerTest.java
similarity index 96%
rename from tests/tests/automotive/src/android/support/car/cts/CarConnectionListenerTest.java
rename to tests/tests/automotive/src/android/car/cts/CarConnectionListenerTest.java
index 25c74f8..f7ab9ad 100644
--- a/tests/tests/automotive/src/android/support/car/cts/CarConnectionListenerTest.java
+++ b/tests/tests/automotive/src/android/car/cts/CarConnectionListenerTest.java
@@ -14,10 +14,10 @@
* limitations under the License.
*/
-package android.support.car.cts;
+package android.car.cts;
-import android.support.car.Car;
-import android.support.car.CarConnectionListener;
+import android.car.Car;
+import android.car.CarConnectionListener;
import android.util.Log;
import java.util.concurrent.Semaphore;
diff --git a/tests/tests/automotive/src/android/support/car/cts/CarInfoManagerTest.java b/tests/tests/automotive/src/android/car/cts/CarInfoManagerTest.java
similarity index 95%
rename from tests/tests/automotive/src/android/support/car/cts/CarInfoManagerTest.java
rename to tests/tests/automotive/src/android/car/cts/CarInfoManagerTest.java
index c13f9bf..1cde840 100644
--- a/tests/tests/automotive/src/android/support/car/cts/CarInfoManagerTest.java
+++ b/tests/tests/automotive/src/android/car/cts/CarInfoManagerTest.java
@@ -13,10 +13,10 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package android.support.car.cts;
+package android.car.cts;
-import android.support.car.Car;
-import android.support.car.CarInfoManager;
+import android.car.Car;
+import android.car.CarInfoManager;
public class CarInfoManagerTest extends CarApiTestBase {
diff --git a/tests/tests/automotive/src/android/support/car/cts/CarPackageManagerTest.java b/tests/tests/automotive/src/android/car/cts/CarPackageManagerTest.java
similarity index 89%
rename from tests/tests/automotive/src/android/support/car/cts/CarPackageManagerTest.java
rename to tests/tests/automotive/src/android/car/cts/CarPackageManagerTest.java
index 8abcae9..2865710 100644
--- a/tests/tests/automotive/src/android/support/car/cts/CarPackageManagerTest.java
+++ b/tests/tests/automotive/src/android/car/cts/CarPackageManagerTest.java
@@ -13,13 +13,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package android.support.car.cts;
+package android.car.cts;
-import android.support.car.Car;
-import android.support.car.CarNotConnectedException;
-import android.support.car.content.pm.AppBlockingPackageInfo;
-import android.support.car.content.pm.CarAppBlockingPolicy;
-import android.support.car.content.pm.CarPackageManager;
+import android.car.Car;
+import android.car.CarNotConnectedException;
+import android.car.content.pm.CarPackageManager;
import android.telecom.TelecomManager;
import android.util.Log;
diff --git a/tests/tests/automotive/src/android/support/car/cts/CarSensorManagerTest.java b/tests/tests/automotive/src/android/car/cts/CarSensorManagerTest.java
similarity index 90%
rename from tests/tests/automotive/src/android/support/car/cts/CarSensorManagerTest.java
rename to tests/tests/automotive/src/android/car/cts/CarSensorManagerTest.java
index c10000e..ddcc52e 100644
--- a/tests/tests/automotive/src/android/support/car/cts/CarSensorManagerTest.java
+++ b/tests/tests/automotive/src/android/car/cts/CarSensorManagerTest.java
@@ -14,11 +14,11 @@
* limitations under the License.
*/
-package android.support.car.cts;
+package android.car.cts;
-import android.support.car.Car;
-import android.support.car.hardware.CarSensorEvent;
-import android.support.car.hardware.CarSensorManager;
+import android.car.Car;
+import android.car.hardware.CarSensorEvent;
+import android.car.hardware.CarSensorManager;
public class CarSensorManagerTest extends CarApiTestBase {
diff --git a/tests/tests/automotive/src/android/support/car/cts/CarUiProviderTest.java b/tests/tests/automotive/src/android/car/cts/CarUiProviderTest.java
similarity index 99%
rename from tests/tests/automotive/src/android/support/car/cts/CarUiProviderTest.java
rename to tests/tests/automotive/src/android/car/cts/CarUiProviderTest.java
index 07e10cb..64f13a6 100644
--- a/tests/tests/automotive/src/android/support/car/cts/CarUiProviderTest.java
+++ b/tests/tests/automotive/src/android/car/cts/CarUiProviderTest.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package android.support.car.cts;
+package android.car.cts;
import android.content.Context;
import android.content.pm.ApplicationInfo;
diff --git a/tests/tests/automotive/src/android/support/car/cts/ExceptionsTest.java b/tests/tests/automotive/src/android/car/cts/ExceptionsTest.java
similarity index 93%
rename from tests/tests/automotive/src/android/support/car/cts/ExceptionsTest.java
rename to tests/tests/automotive/src/android/car/cts/ExceptionsTest.java
index 3391883..496867b 100644
--- a/tests/tests/automotive/src/android/support/car/cts/ExceptionsTest.java
+++ b/tests/tests/automotive/src/android/car/cts/ExceptionsTest.java
@@ -13,10 +13,10 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package android.support.car.cts;
+package android.car.cts;
-import android.support.car.CarNotConnectedException;
-import android.support.car.CarNotSupportedException;
+import android.car.CarNotConnectedException;
+import android.car.CarNotSupportedException;
import android.test.AndroidTestCase;
public class ExceptionsTest extends AndroidTestCase {
diff --git a/tests/tests/graphics/res/drawable-nodpi/bitmap_density_golden_160.png b/tests/tests/graphics/res/drawable-nodpi/bitmap_density_golden_160.png
new file mode 100644
index 0000000..de48ed9
--- /dev/null
+++ b/tests/tests/graphics/res/drawable-nodpi/bitmap_density_golden_160.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/bitmap_density_golden_320.png b/tests/tests/graphics/res/drawable-nodpi/bitmap_density_golden_320.png
new file mode 100644
index 0000000..0682813
--- /dev/null
+++ b/tests/tests/graphics/res/drawable-nodpi/bitmap_density_golden_320.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/bitmap_density_golden_80.png b/tests/tests/graphics/res/drawable-nodpi/bitmap_density_golden_80.png
new file mode 100644
index 0000000..5588a5a
--- /dev/null
+++ b/tests/tests/graphics/res/drawable-nodpi/bitmap_density_golden_80.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/nine_patch_density_golden_160.png b/tests/tests/graphics/res/drawable-nodpi/nine_patch_density_golden_160.png
new file mode 100644
index 0000000..8110d8f
--- /dev/null
+++ b/tests/tests/graphics/res/drawable-nodpi/nine_patch_density_golden_160.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/nine_patch_density_golden_320.png b/tests/tests/graphics/res/drawable-nodpi/nine_patch_density_golden_320.png
new file mode 100644
index 0000000..c48c78e
--- /dev/null
+++ b/tests/tests/graphics/res/drawable-nodpi/nine_patch_density_golden_320.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/nine_patch_density_golden_80.png b/tests/tests/graphics/res/drawable-nodpi/nine_patch_density_golden_80.png
new file mode 100644
index 0000000..173150f
--- /dev/null
+++ b/tests/tests/graphics/res/drawable-nodpi/nine_patch_density_golden_80.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/bitmap_density.png b/tests/tests/graphics/res/drawable/bitmap_density.png
deleted file mode 100644
index 5230051..0000000
--- a/tests/tests/graphics/res/drawable/bitmap_density.png
+++ /dev/null
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/bitmap_density.xml b/tests/tests/graphics/res/drawable/bitmap_density.xml
new file mode 100644
index 0000000..5fb3611
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/bitmap_density.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2016 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+ android:src="@drawable/bitmap_density_internal" />
diff --git a/tests/tests/graphics/res/drawable/bitmap_density_internal.png b/tests/tests/graphics/res/drawable/bitmap_density_internal.png
new file mode 100644
index 0000000..a4add51
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/bitmap_density_internal.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/nine_patch_density.9.png b/tests/tests/graphics/res/drawable/nine_patch_density.9.png
deleted file mode 100644
index 24019d8..0000000
--- a/tests/tests/graphics/res/drawable/nine_patch_density.9.png
+++ /dev/null
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/nine_patch_density.xml b/tests/tests/graphics/res/drawable/nine_patch_density.xml
new file mode 100644
index 0000000..918c76e
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/nine_patch_density.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2016 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<nine-patch xmlns:android="http://schemas.android.com/apk/res/android"
+ android:src="@drawable/nine_patch_density_internal" />
diff --git a/tests/tests/graphics/res/drawable/nine_patch_density_internal.9.png b/tests/tests/graphics/res/drawable/nine_patch_density_internal.9.png
new file mode 100644
index 0000000..1a3181b
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/nine_patch_density_internal.9.png
Binary files differ
diff --git a/tests/tests/graphics/src/android/graphics/cts/RegionTest.java b/tests/tests/graphics/src/android/graphics/cts/RegionTest.java
index 803f3e9..10e277b 100644
--- a/tests/tests/graphics/src/android/graphics/cts/RegionTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/RegionTest.java
@@ -1497,21 +1497,42 @@
Rect oriRect = new Rect(0, 0, 10, 10);
mRegion = new Region();
+ // test reading/writing an empty parcel
Parcel p = Parcel.obtain();
mRegion.writeToParcel(p, flags);
- assertEquals(8, p.dataSize());
-
- p = Parcel.obtain();
- mRegion.set(oriRect);
- mRegion.writeToParcel(p, flags);
- assertEquals(24, p.dataSize());
p.setDataPosition(0);
Region dst = Region.CREATOR.createFromParcel(p);
+ assertTrue(dst.isEmpty());
+
+ // test reading/writing a single rect parcel
+ p = Parcel.obtain();
+ mRegion.set(oriRect);
+ mRegion.writeToParcel(p, flags);
+
+ p.setDataPosition(0);
+ dst = Region.CREATOR.createFromParcel(p);
assertEquals(oriRect.top, dst.getBounds().top);
assertEquals(oriRect.left, dst.getBounds().left);
assertEquals(oriRect.bottom, dst.getBounds().bottom);
assertEquals(oriRect.right, dst.getBounds().right);
+
+ // test reading/writing a multiple rect parcel
+ p = Parcel.obtain();
+ mRegion.op(5, 5, 15, 15, Region.Op.UNION);
+ mRegion.writeToParcel(p, flags);
+
+ p.setDataPosition(0);
+ dst = Region.CREATOR.createFromParcel(p);
+ assertTrue(dst.contains(2,2));
+ assertTrue(dst.contains(7,7));
+ assertTrue(dst.contains(12,12));
+ assertFalse(dst.contains(2,12));
+ assertFalse(dst.contains(12,2));
+ assertEquals(0, dst.getBounds().top);
+ assertEquals(0, dst.getBounds().left);
+ assertEquals(15, dst.getBounds().bottom);
+ assertEquals(15, dst.getBounds().right);
}
public void testDescribeContents() {
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/AnimatedStateListDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/AnimatedStateListDrawableTest.java
index 2ffd072..12f9828 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/AnimatedStateListDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/AnimatedStateListDrawableTest.java
@@ -188,7 +188,7 @@
(StateListDrawable) cs.newDrawable(res);
for (int i = 0; i < count; i++) {
halfDrawable.selectDrawable(i);
- assertEquals(origWidth[i] / 2, halfDrawable.getIntrinsicWidth());
+ assertEquals(Math.round(origWidth[i] / 2f), halfDrawable.getIntrinsicWidth());
}
// Set density to double original.
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/BitmapDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/BitmapDrawableTest.java
index 7262094..ef546eb 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/BitmapDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/BitmapDrawableTest.java
@@ -17,6 +17,8 @@
package android.graphics.drawable.cts;
import android.content.res.Resources.Theme;
+import android.graphics.BitmapFactory;
+import android.graphics.Rect;
import android.graphics.cts.R;
import org.xmlpull.v1.XmlPullParserException;
@@ -35,18 +37,30 @@
import android.graphics.PorterDuff.Mode;
import android.graphics.Shader.TileMode;
import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
import android.graphics.drawable.Drawable.ConstantState;
import android.test.InstrumentationTestCase;
import android.util.AttributeSet;
-import android.util.DisplayMetrics;
import android.util.Xml;
import android.view.Gravity;
import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
public class BitmapDrawableTest extends InstrumentationTestCase {
+ // A small value is actually making sure that the values are matching
+ // exactly with the golden image.
+ // We can increase the threshold if the Skia is drawing with some variance
+ // on different devices. So far, the tests show they are matching correctly.
+ private static final float PIXEL_ERROR_THRESHOLD = 0.03f;
+ private static final float PIXEL_ERROR_COUNT_THRESHOLD = 0.005f;
+
+ // Set true to generate golden images, false for normal tests.
+ private static final boolean DBG_DUMP_PNG = false;
+
// The target context.
private Context mContext;
@@ -462,40 +476,134 @@
assertEquals(50, d3.getPaint().getAlpha());
}
- private void testPreloadDensityInner(Resources res, int densityDpi)
- throws XmlPullParserException, IOException {
- // Capture initial state at default density.
- final XmlResourceParser parser = DrawableTestUtils.getResourceParser(
- res, R.drawable.bitmap_density);
+ private static final int[] DENSITY_VALUES = new int[] {
+ 160, 80, 320
+ };
+
+ private static final int[] DENSITY_IMAGES = new int[] {
+ R.drawable.bitmap_density
+ };
+
+ private static final int[][] DENSITY_GOLDEN_IMAGES = new int[][] {
+ {
+ R.drawable.bitmap_density_golden_160,
+ R.drawable.bitmap_density_golden_80,
+ R.drawable.bitmap_density_golden_320,
+ }
+ };
+
+ public void testPreloadDensity() throws XmlPullParserException, IOException {
+ final Resources res = mContext.getResources();
+ final int densityDpi = res.getConfiguration().densityDpi;
+ try {
+ testPreloadDensityInner(res, DENSITY_IMAGES[0], DENSITY_VALUES, DENSITY_GOLDEN_IMAGES[0]);
+ } finally {
+ DrawableTestUtils.setResourcesDensity(res, densityDpi);
+ }
+ }
+
+ private void testPreloadDensityInner(Resources res, int sourceResId, int[] densities,
+ int[] goldenResIds) throws XmlPullParserException, IOException {
+ final Rect tempPadding = new Rect();
+
+ // Capture initial state at preload density.
+ final int preloadDensityDpi = densities[0];
+ DrawableTestUtils.setResourcesDensity(res, preloadDensityDpi);
+
+ final XmlResourceParser parser = DrawableTestUtils.getResourceParser(res, sourceResId);
final BitmapDrawable preloadedDrawable = new BitmapDrawable();
preloadedDrawable.inflate(res, parser, Xml.asAttributeSet(parser));
+
final ConstantState preloadedConstantState = preloadedDrawable.getConstantState();
final int origWidth = preloadedDrawable.getIntrinsicWidth();
+ final int origHeight = preloadedDrawable.getIntrinsicHeight();
+ assertFalse(preloadedDrawable.getPadding(tempPadding));
- // Set density to half of original. Unlike offsets, which are
- // truncated, dimensions are rounded to the nearest pixel.
- DrawableTestUtils.setResourcesDensity(res, densityDpi / 2);
- final BitmapDrawable halfDrawable =
- (BitmapDrawable) preloadedConstantState.newDrawable(res);
- assertEquals(Math.round(origWidth / 2f), halfDrawable.getIntrinsicWidth());
+ compareOrSave(preloadedDrawable, preloadDensityDpi, sourceResId, goldenResIds[0]);
- // Set density to double original.
- DrawableTestUtils.setResourcesDensity(res, densityDpi * 2);
- final BitmapDrawable doubleDrawable =
- (BitmapDrawable) preloadedConstantState.newDrawable(res);
- assertEquals(origWidth * 2, doubleDrawable.getIntrinsicWidth());
+ for (int i = 1; i < densities.length; i++) {
+ final int scaledDensityDpi = densities[i];
+ final float scale = scaledDensityDpi / (float) preloadDensityDpi;
+ DrawableTestUtils.setResourcesDensity(res, scaledDensityDpi);
- // Restore original density.
- DrawableTestUtils.setResourcesDensity(res, densityDpi);
- final BitmapDrawable origDrawable =
- (BitmapDrawable) preloadedConstantState.newDrawable();
- assertEquals(origWidth, origDrawable.getIntrinsicWidth());
+ final BitmapDrawable scaledDrawable =
+ (BitmapDrawable) preloadedConstantState.newDrawable(res);
- // Ensure theme density is applied correctly.
- final Theme t = res.newTheme();
- halfDrawable.applyTheme(t);
- assertEquals(origWidth, halfDrawable.getIntrinsicWidth());
- doubleDrawable.applyTheme(t);
- assertEquals(origWidth, doubleDrawable.getIntrinsicWidth());
+ // Sizes are rounded.
+ assertEquals(Math.round(origWidth * scale), scaledDrawable.getIntrinsicWidth());
+ assertEquals(Math.round(origHeight * scale), scaledDrawable.getIntrinsicHeight());
+
+ // Bitmaps have no padding.
+ assertFalse(scaledDrawable.getPadding(tempPadding));
+
+ compareOrSave(scaledDrawable, scaledDensityDpi, sourceResId, goldenResIds[i]);
+
+ // Ensure theme density is applied correctly. Unlike most
+ // drawables, we don't have any loss of accuracy because density
+ // changes are re-computed from the source every time.
+ DrawableTestUtils.setResourcesDensity(res, preloadDensityDpi);
+
+ final Theme t = res.newTheme();
+ scaledDrawable.applyTheme(t);
+ assertEquals(origWidth, scaledDrawable.getIntrinsicWidth());
+ assertEquals(origHeight, scaledDrawable.getIntrinsicHeight());
+ assertFalse(scaledDrawable.getPadding(tempPadding));
+ }
+ }
+
+ private void compareOrSave(Drawable dr, int densityDpi, int sourceResId, int goldenResId) {
+ final int width = dr.getIntrinsicWidth();
+ final int height = dr.getIntrinsicHeight();
+ final Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+ bitmap.setDensity(0);
+
+ final Canvas canvas = new Canvas(bitmap);
+ dr.setBounds(0, 0, width, height);
+ dr.draw(canvas);
+
+ if (DBG_DUMP_PNG) {
+ saveGoldenImage(bitmap, sourceResId, densityDpi);
+ } else {
+ final Bitmap golden = BitmapFactory.decodeResource(
+ mContext.getResources(), goldenResId);
+ DrawableTestUtils.compareImages(densityDpi + " dpi", golden, bitmap,
+ PIXEL_ERROR_THRESHOLD, PIXEL_ERROR_COUNT_THRESHOLD);
+ }
+ }
+
+ private void saveGoldenImage(Bitmap bitmap, int sourceResId, int densityDpi) {
+ // Save the image to the disk.
+ FileOutputStream out = null;
+
+ try {
+ final String outputFolder = "/sdcard/temp/";
+ final File folder = new File(outputFolder);
+ if (!folder.exists()) {
+ folder.mkdir();
+ }
+
+ final String sourceFilename = new File(
+ mContext.getResources().getString(sourceResId)).getName();
+ final String sourceTitle = sourceFilename.substring(0, sourceFilename.lastIndexOf("."));
+ final String outputTitle = sourceTitle + "_golden_" + densityDpi;
+ final String outputFilename = outputFolder + outputTitle + ".png";
+ final File outputFile = new File(outputFilename);
+ if (!outputFile.exists()) {
+ outputFile.createNewFile();
+ }
+
+ out = new FileOutputStream(outputFile, false);
+ bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ if (out != null) {
+ try {
+ out.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
}
}
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableTestUtils.java b/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableTestUtils.java
index ae28eca..0c08f79 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableTestUtils.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableTestUtils.java
@@ -16,12 +16,16 @@
package android.graphics.drawable.cts;
+import junit.framework.Assert;
+
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
+import android.graphics.Bitmap;
+import android.graphics.Color;
import android.util.AttributeSet;
import android.util.Xml;
@@ -124,4 +128,48 @@
// Scale by tdensity / sdensity, rounding up.
return ((size * tdensity) + (sdensity >> 1)) / sdensity;
}
+
+ /**
+ * Asserts that two images are similar within the given thresholds.
+ *
+ * @param message
+ * @param expected
+ * @param actual
+ * @param pixelThreshold
+ * @param pixelCountThreshold
+ */
+ public static void compareImages(String message, Bitmap expected, Bitmap actual,
+ float pixelThreshold, float pixelCountThreshold) {
+ int idealWidth = expected.getWidth();
+ int idealHeight = expected.getHeight();
+
+ Assert.assertTrue(idealWidth == actual.getWidth());
+ Assert.assertTrue(idealHeight == actual.getHeight());
+
+ int totalDiffPixelCount = 0;
+ float totalPixelCount = idealWidth * idealHeight;
+ for (int x = 0; x < idealWidth; x++) {
+ for (int y = 0; y < idealHeight; y++) {
+ int idealColor = expected.getPixel(x, y);
+ int givenColor = actual.getPixel(x, y);
+ if (idealColor == givenColor)
+ continue;
+
+ float totalError = 0;
+ totalError += Math.abs(Color.red(idealColor) - Color.red(givenColor));
+ totalError += Math.abs(Color.green(idealColor) - Color.green(givenColor));
+ totalError += Math.abs(Color.blue(idealColor) - Color.blue(givenColor));
+ totalError += Math.abs(Color.alpha(idealColor) - Color.alpha(givenColor));
+
+ if ((totalError / 1024.0f) >= pixelThreshold) {
+ Assert.fail((message + ": totalError is " + totalError));
+ }
+
+ totalDiffPixelCount++;
+ }
+ }
+ if ((totalDiffPixelCount / totalPixelCount) >= pixelCountThreshold) {
+ Assert.fail((message +": totalDiffPixelCount is " + totalDiffPixelCount));
+ }
+ }
}
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/GradientDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/GradientDrawableTest.java
index b8661d2..e118a66 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/GradientDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/GradientDrawableTest.java
@@ -377,12 +377,13 @@
assertEquals(origPadding, tempPadding);
// Some precision is lost when scaling the half-density
- // drawable back up to the original density.
+ // drawable back up to the original density. Padding is
+ // always truncated, rather than rounded.
final Rect sloppyOrigPadding = new Rect();
- sloppyOrigPadding.left = 2 * Math.round(origPadding.left / 2f);
- sloppyOrigPadding.top = 2 * Math.round(origPadding.top / 2f);
- sloppyOrigPadding.right = 2 * Math.round(origPadding.right / 2f);
- sloppyOrigPadding.bottom = 2 * Math.round(origPadding.bottom / 2f);
+ sloppyOrigPadding.left = 2 * (origPadding.left / 2);
+ sloppyOrigPadding.top = 2 * (origPadding.top / 2);
+ sloppyOrigPadding.right = 2 * (origPadding.right / 2);
+ sloppyOrigPadding.bottom = 2 * (origPadding.bottom / 2);
// Ensure theme density is applied correctly.
final Theme t = res.newTheme();
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/LayerDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/LayerDrawableTest.java
index d8e63fa..37654dc 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/LayerDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/LayerDrawableTest.java
@@ -1691,20 +1691,20 @@
final int initialLayerWidth = preloadedDrawable.getLayerWidth(0);
final int initialLayerHeight = preloadedDrawable.getLayerHeight(0);
- // Set density to half of original. Unlike offsets, which are
+ // Set density to half of original. Padding and insets are
// truncated, dimensions are rounded to the nearest pixel.
DrawableTestUtils.setResourcesDensity(res, densityDpi / 2);
final LayerDrawable halfDrawable =
(LayerDrawable) preloadedConstantState.newDrawable(res);
assertEquals(Math.round(initialWidth / 2f), halfDrawable.getIntrinsicWidth());
- assertEquals(Math.round(initialLeftPadding / 2f), halfDrawable.getLeftPadding());
- assertEquals(Math.round(initialRightPadding / 2f), halfDrawable.getRightPadding());
- assertEquals(Math.round(initialBottomPadding / 2f), halfDrawable.getBottomPadding());
- assertEquals(Math.round(initialTopPadding / 2f), halfDrawable.getTopPadding());
- assertEquals(Math.round(initialLayerInsetLeft / 2f),halfDrawable.getLayerInsetLeft(0));
- assertEquals(Math.round(initialLayerInsetRight / 2f), halfDrawable.getLayerInsetRight(0));
- assertEquals(Math.round(initialLayerInsetTop / 2f), halfDrawable.getLayerInsetTop(0));
- assertEquals(Math.round(initialLayerInsetBottom / 2f), halfDrawable.getLayerInsetBottom(0));
+ assertEquals(initialLeftPadding / 2, halfDrawable.getLeftPadding());
+ assertEquals(initialRightPadding / 2, halfDrawable.getRightPadding());
+ assertEquals(initialBottomPadding / 2, halfDrawable.getBottomPadding());
+ assertEquals(initialTopPadding / 2, halfDrawable.getTopPadding());
+ assertEquals(initialLayerInsetLeft / 2,halfDrawable.getLayerInsetLeft(0));
+ assertEquals(initialLayerInsetRight / 2, halfDrawable.getLayerInsetRight(0));
+ assertEquals(initialLayerInsetTop / 2, halfDrawable.getLayerInsetTop(0));
+ assertEquals(initialLayerInsetBottom / 2, halfDrawable.getLayerInsetBottom(0));
assertEquals(Math.round(initialLayerWidth / 2f), halfDrawable.getLayerWidth(0));
assertEquals(Math.round(initialLayerHeight / 2f), halfDrawable.getLayerHeight(0));
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/NinePatchDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/NinePatchDrawableTest.java
index 686c443..27b17ca 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/NinePatchDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/NinePatchDrawableTest.java
@@ -17,6 +17,7 @@
package android.graphics.drawable.cts;
import android.content.res.Resources.Theme;
+import android.graphics.Outline;
import android.graphics.cts.R;
import org.xmlpull.v1.XmlPullParser;
@@ -36,17 +37,30 @@
import android.graphics.Region;
import android.graphics.Bitmap.Config;
import android.graphics.PorterDuff.Mode;
+import android.graphics.drawable.Drawable;
import android.graphics.drawable.NinePatchDrawable;
import android.graphics.drawable.Drawable.ConstantState;
import android.test.InstrumentationTestCase;
import android.util.AttributeSet;
import android.util.Xml;
+import java.io.File;
+import java.io.FileOutputStream;
import java.io.IOException;
public class NinePatchDrawableTest extends InstrumentationTestCase {
+ // A small value is actually making sure that the values are matching
+ // exactly with the golden image.
+ // We can increase the threshold if the Skia is drawing with some variance
+ // on different devices. So far, the tests show they are matching correctly.
+ private static final float PIXEL_ERROR_THRESHOLD = 0.03f;
+ private static final float PIXEL_ERROR_COUNT_THRESHOLD = 0.005f;
+
private static final int MIN_CHUNK_SIZE = 32;
+ // Set true to generate golden images, false for normal tests.
+ private static final boolean DBG_DUMP_PNG = false;
+
private NinePatchDrawable mNinePatchDrawable;
private Resources mResources;
@@ -360,51 +374,104 @@
d1.mutate();
}
+ private static final int[] DENSITY_VALUES = new int[] {
+ 160, 80, 320
+ };
+
+ private static final int[] DENSITY_IMAGES = new int[] {
+ R.drawable.nine_patch_density
+ };
+
+ private static final int[][] DENSITY_GOLDEN_IMAGES = new int[][] {
+ {
+ R.drawable.nine_patch_density_golden_160,
+ R.drawable.nine_patch_density_golden_80,
+ R.drawable.nine_patch_density_golden_320,
+ }
+ };
+
public void testPreloadDensity() throws XmlPullParserException, IOException {
final Resources res = mResources;
final int densityDpi = res.getConfiguration().densityDpi;
try {
- testPreloadDensityInner(res, densityDpi);
+ testPreloadDensityInner(res, DENSITY_IMAGES[0], DENSITY_VALUES, DENSITY_GOLDEN_IMAGES[0]);
} finally {
DrawableTestUtils.setResourcesDensity(res, densityDpi);
}
}
- private void testPreloadDensityInner(Resources res, int densityDpi)
- throws XmlPullParserException, IOException {
- // Capture initial state at default density.
- final XmlResourceParser parser = DrawableTestUtils.getResourceParser(
- res, R.drawable.nine_patch_density);
+ private void testPreloadDensityInner(Resources res, int sourceResId, int[] densities,
+ int[] goldenResIds) throws XmlPullParserException, IOException {
+ final Rect tempOutlineRect = new Rect();
+ final Rect tempPadding = new Rect();
+ final Outline tempOutline = new Outline();
+
+ // Capture initial state at preload density.
+ final int preloadDensityDpi = densities[0];
+ DrawableTestUtils.setResourcesDensity(res, preloadDensityDpi);
+
+ final XmlResourceParser parser = DrawableTestUtils.getResourceParser(res, sourceResId);
final NinePatchDrawable preloadedDrawable = new NinePatchDrawable(null);
preloadedDrawable.inflate(res, parser, Xml.asAttributeSet(parser));
+
final ConstantState preloadedConstantState = preloadedDrawable.getConstantState();
final int origWidth = preloadedDrawable.getIntrinsicWidth();
+ final int origHeight = preloadedDrawable.getIntrinsicHeight();
+ final Rect origPadding = new Rect();
+ preloadedDrawable.getPadding(origPadding);
+ final Outline origOutline = new Outline();
+ preloadedDrawable.getOutline(origOutline);
+ final Rect origOutlineRect = new Rect();
+ origOutline.getRect(origOutlineRect);
+ final float origOutlineRadius = origOutline.getRadius();
- // Set density to half of original. Unlike offsets, which are
- // truncated, dimensions are rounded to the nearest pixel.
- DrawableTestUtils.setResourcesDensity(res, densityDpi / 2);
- final NinePatchDrawable halfDrawable =
- (NinePatchDrawable) preloadedConstantState.newDrawable(res);
- assertEquals(Math.round(origWidth / 2f), halfDrawable.getIntrinsicWidth());
+ compareOrSave(preloadedDrawable, preloadDensityDpi, sourceResId, goldenResIds[0]);
- // Set density to double original.
- DrawableTestUtils.setResourcesDensity(res, densityDpi * 2);
- final NinePatchDrawable doubleDrawable =
- (NinePatchDrawable) preloadedConstantState.newDrawable(res);
- assertEquals(origWidth * 2, doubleDrawable.getIntrinsicWidth());
+ for (int i = 1; i < densities.length; i++) {
+ final int scaledDensityDpi = densities[i];
+ final float scale = scaledDensityDpi / (float) preloadDensityDpi;
+ DrawableTestUtils.setResourcesDensity(res, scaledDensityDpi);
- // Restore original density.
- DrawableTestUtils.setResourcesDensity(res, densityDpi);
- final NinePatchDrawable origDrawable =
- (NinePatchDrawable) preloadedConstantState.newDrawable();
- assertEquals(origWidth, origDrawable.getIntrinsicWidth());
+ final NinePatchDrawable scaledDrawable =
+ (NinePatchDrawable) preloadedConstantState.newDrawable(res);
- // Ensure theme density is applied correctly.
- final Theme t = res.newTheme();
- halfDrawable.applyTheme(t);
- assertEquals(origWidth, halfDrawable.getIntrinsicWidth());
- doubleDrawable.applyTheme(t);
- assertEquals(origWidth, doubleDrawable.getIntrinsicWidth());
+ // Sizes are rounded.
+ assertEquals(Math.round(origWidth * scale), scaledDrawable.getIntrinsicWidth());
+ assertEquals(Math.round(origHeight * scale), scaledDrawable.getIntrinsicHeight());
+
+ // Outlines are truncated, but radius is precise.
+ // TODO: Uncomment this once outlines are working.
+ /*
+ scaledDrawable.getOutline(tempOutline);
+ assertTrue(tempOutline.getRect(tempOutlineRect));
+ assertEquals((int) (origOutlineRect.left * scale), tempOutlineRect.left);
+ assertEquals((int) (origOutlineRect.top * scale), tempOutlineRect.top);
+ assertEquals((int) (origOutlineRect.right * scale), tempOutlineRect.right);
+ assertEquals((int) (origOutlineRect.bottom * scale), tempOutlineRect.bottom);
+ assertEquals(origOutlineRadius * scale, tempOutline.getRadius());
+ */
+
+ // Padding is truncated.
+ assertTrue(scaledDrawable.getPadding(tempPadding));
+ assertEquals((int) (origPadding.left * scale), tempPadding.left);
+ assertEquals((int) (origPadding.top * scale), tempPadding.top);
+ assertEquals((int) (origPadding.right * scale), tempPadding.right);
+ assertEquals((int) (origPadding.bottom * scale), tempPadding.bottom);
+
+ compareOrSave(scaledDrawable, scaledDensityDpi, sourceResId, goldenResIds[i]);
+
+ // Ensure theme density is applied correctly. Unlike most
+ // drawables, we don't have any loss of accuracy because density
+ // changes are re-computed from the source every time.
+ DrawableTestUtils.setResourcesDensity(res, preloadDensityDpi);
+
+ final Theme t = res.newTheme();
+ scaledDrawable.applyTheme(t);
+ assertEquals(origWidth, scaledDrawable.getIntrinsicWidth());
+ assertEquals(origHeight, scaledDrawable.getIntrinsicHeight());
+ assertTrue(scaledDrawable.getPadding(tempPadding));
+ assertEquals(origPadding, tempPadding);
+ }
}
private void assertColorFillRect(Bitmap bmp, int x, int y, int w, int h, int color) {
@@ -430,6 +497,60 @@
return bitmap;
}
+ private void compareOrSave(Drawable dr, int densityDpi, int sourceResId, int goldenResId) {
+ final int width = dr.getIntrinsicWidth();
+ final int height = dr.getIntrinsicHeight();
+ final Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+ bitmap.setDensity(0);
+
+ final Canvas canvas = new Canvas(bitmap);
+ dr.setBounds(0, 0, width, height);
+ dr.draw(canvas);
+
+ if (DBG_DUMP_PNG) {
+ saveGoldenImage(bitmap, sourceResId, densityDpi);
+ } else {
+ final Bitmap golden = BitmapFactory.decodeResource(mResources, goldenResId);
+ DrawableTestUtils.compareImages(densityDpi + " dpi", golden, bitmap,
+ PIXEL_ERROR_THRESHOLD, PIXEL_ERROR_COUNT_THRESHOLD);
+ }
+ }
+
+ private void saveGoldenImage(Bitmap bitmap, int sourceResId, int densityDpi) {
+ // Save the image to the disk.
+ FileOutputStream out = null;
+
+ try {
+ final String outputFolder = "/sdcard/temp/";
+ final File folder = new File(outputFolder);
+ if (!folder.exists()) {
+ folder.mkdir();
+ }
+
+ final String sourceFilename = new File(mResources.getString(sourceResId)).getName();
+ final String sourceTitle = sourceFilename.substring(0, sourceFilename.lastIndexOf("."));
+ final String outputTitle = sourceTitle + "_golden_" + densityDpi;
+ final String outputFilename = outputFolder + outputTitle + ".png";
+ final File outputFile = new File(outputFilename);
+ if (!outputFile.exists()) {
+ outputFile.createNewFile();
+ }
+
+ out = new FileOutputStream(outputFile, false);
+ bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ if (out != null) {
+ try {
+ out.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
private class MockColorFilter extends ColorFilter {
}
}
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/RotateDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/RotateDrawableTest.java
index b6912a0..e51edc12 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/RotateDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/RotateDrawableTest.java
@@ -100,13 +100,15 @@
public void testSetDegrees() {
RotateDrawable d = new RotateDrawable();
assertEquals(0.0f, d.getFromDegrees(), 0.01f);
- assertEquals(0.0f, d.getFromDegrees(), 0.01f);
+ assertEquals(360.0f, d.getToDegrees(), 0.01f);
d.setFromDegrees(-10.0f);
assertEquals(-10.0f, d.getFromDegrees(), 0.01f);
+ assertEquals(360.0f, d.getToDegrees(), 0.01f);
d.setToDegrees(10.0f);
- assertEquals(10.0f, d.getFromDegrees(), 0.01f);
+ assertEquals(10.0f, d.getToDegrees(), 0.01f);
+ assertEquals(-10.0f, d.getFromDegrees(), 0.01f);
}
public void testGetChangingConfigurations() {
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/StateListDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/StateListDrawableTest.java
index 28d2235..2194a00 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/StateListDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/StateListDrawableTest.java
@@ -206,9 +206,9 @@
final StateListDrawable halfDrawable =
(StateListDrawable) preloadedConstantState.newDrawable(res);
halfDrawable.selectDrawable(0);
- assertEquals(origWidth0 / 2, halfDrawable.getIntrinsicWidth());
+ assertEquals(Math.round(origWidth0 / 2f), halfDrawable.getIntrinsicWidth());
halfDrawable.selectDrawable(1);
- assertEquals(origWidth1 / 2, halfDrawable.getIntrinsicWidth());
+ assertEquals(Math.round(origWidth1 / 2f), halfDrawable.getIntrinsicWidth());
// Set density to double original.
DrawableTestUtils.setResourcesDensity(res, densityDpi * 2);
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 03148cf..4da4180 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/VectorDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/VectorDrawableTest.java
@@ -205,7 +205,9 @@
} else {
// Start to compare
Bitmap golden = BitmapFactory.decodeResource(mResources, goldenImages[i]);
- compareImages(mBitmap, golden, mResources.getString(resIds[i]));
+ DrawableTestUtils.compareImages(mResources.getString(resIds[i]), mBitmap, golden,
+ VectorDrawableTest.PIXEL_ERROR_THRESHOLD,
+ VectorDrawableTest.PIXEL_ERROR_COUNT_THRESHOLD);
}
}
}
@@ -276,41 +278,6 @@
return builder.toString();
}
- private void compareImages(Bitmap ideal, Bitmap given, String filename) {
- int idealWidth = ideal.getWidth();
- int idealHeight = ideal.getHeight();
-
- assertTrue(idealWidth == given.getWidth());
- assertTrue(idealHeight == given.getHeight());
-
- int totalDiffPixelCount = 0;
- float totalPixelCount = idealWidth * idealHeight;
- for (int x = 0; x < idealWidth; x++) {
- for (int y = 0; y < idealHeight; y++) {
- int idealColor = ideal.getPixel(x, y);
- int givenColor = given.getPixel(x, y);
- if (idealColor == givenColor)
- continue;
-
- float totalError = 0;
- totalError += Math.abs(Color.red(idealColor) - Color.red(givenColor));
- totalError += Math.abs(Color.green(idealColor) - Color.green(givenColor));
- totalError += Math.abs(Color.blue(idealColor) - Color.blue(givenColor));
- totalError += Math.abs(Color.alpha(idealColor) - Color.alpha(givenColor));
-
- if ((totalError / 1024.0f) >= PIXEL_ERROR_THRESHOLD) {
- fail((filename + ": totalError is " + totalError));
- }
-
- totalDiffPixelCount++;
- }
- }
- if ((totalDiffPixelCount / totalPixelCount) >= PIXEL_ERROR_COUNT_THRESHOLD) {
- fail((filename +": totalDiffPixelCount is " + totalDiffPixelCount));
- }
-
- }
-
public void testGetChangingConfigurations() {
VectorDrawable vectorDrawable = new VectorDrawable();
ConstantState constantState = vectorDrawable.getConstantState();
diff --git a/tests/tests/icu/Android.mk b/tests/tests/icu/Android.mk
index 12cd7b0..3d67ee7 100644
--- a/tests/tests/icu/Android.mk
+++ b/tests/tests/icu/Android.mk
@@ -26,14 +26,22 @@
LOCAL_PROGUARD_ENABLED := disabled
LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_JAVA_RESOURCE_DIRS := resources
# The aim of this package is to run tests against the default packaging of ICU as a standalone
# java library, and not as the implementation in use by the current android system. For this
# reason, all the required ICU resources are included into the APK by the following rules.
# icu4j contains ICU's implementation classes, icu4j-tests contains the test classes,
# and icudata/icutzdata contain data files and timezone data files respectively.
-LOCAL_STATIC_JAVA_LIBRARIES := compatibility-device-util android-support-test icu4j icu4j-tests \
- icu4j-icudata icu4j-icutzdata icu4j-testdata
+LOCAL_STATIC_JAVA_LIBRARIES := \
+ compatibility-device-util \
+ android-support-test \
+ vogarexpect \
+ icu4j \
+ icu4j-tests \
+ icu4j-icudata \
+ icu4j-icutzdata \
+ icu4j-testdata
# Tag this module as a cts_v2 test artifact
LOCAL_COMPATIBILITY_SUITE := cts_v2
@@ -44,23 +52,38 @@
include $(BUILD_CTS_SUPPORT_PACKAGE)
-# The CTS framework has it's own logic for generating XML files based on scanning the source
-# for test methods and classes. Since the classes that we are testing are not actually in this
-# package we must provide an alternative. Here we define a specially crafted XML file which
-# conforms to what CTS and particularly, the cts-tradefed tool understands. This file contains
-# lists of classes in ICU4J that we know are used in libcore and should be tested as part of CTS.
-# The following rule uses the Android CoPy (ACP) tool to copy this file to where it is expected.
+# Version 1 of the CTS framework has it's own logic for generating XML files based on scanning the
+# source for test methods and classes written using JUnit 3 (doesn't work for JUnit 4 @RunWith
+# tests). Since the ICU tests are not written using JUnit (although they are run with a custom JUnit
+# RunnerBuilder) this provides an alternative. This generates an XML representation based off a
+# list of the tests that are run by version 2 of the CTS framework (which doesn't require the list
+# in advance). The tools/update-test-list.sh script will take a host_log_[0-9]+.zip created by
+# CTSv1 and extract the list of tests run and update the test-list.txt file.
-ifeq ($(TARGET_ARCH),arm64)
- LOCAL_ARCH := arm
-else ifeq ($(TARGET_ARCH),mips64)
- LOCAL_ARCH := mips
-else ifeq ($(TARGET_ARCH),x86_64)
- LOCAL_ARCH := x86
-else
- LOCAL_ARCH := $(TARGET_ARCH)
-endif
-
+CTS_ICU_TEST_LIST_PATH := $(LOCAL_PATH)/test-list.txt
cts_package_xml := $(CTS_TESTCASES_OUT)/CtsIcuTestCases.xml
-$(cts_package_xml): $(call intermediates-dir-for,APPS,$(LOCAL_PACKAGE_NAME))/package.apk | $(ACP)
- $(ACP) -fp cts/tests/tests/icu/CtsIcuTestCases_$(LOCAL_ARCH).xml $@
+$(cts_package_xml): $(HOST_OUT_JAVA_LIBRARIES)/cts-icu-tools.jar $(CTS_ICU_TEST_LIST_PATH) \
+ $(call intermediates-dir-for,APPS,$(LOCAL_PACKAGE_NAME))/package.apk
+ java -Xmx256M -classpath $(HOST_OUT_JAVA_LIBRARIES)/cts-icu-tools.jar \
+ android.icu.cts.tools.GenerateTestCaseXML \
+ $(CTS_ICU_TEST_LIST_PATH) \
+ $(TARGET_ARCH) \
+ $@
+
+# build cts-icu-tools tool
+# ============================================================
+include $(CLEAR_VARS)
+
+# Don't include this package in any target
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := $(call all-java-files-under, tools)
+LOCAL_JAVA_RESOURCE_DIRS := resources
+
+LOCAL_STATIC_JAVA_LIBRARIES := \
+ descGen \
+ jsr305lib
+
+LOCAL_MODULE := cts-icu-tools
+
+include $(BUILD_HOST_JAVA_LIBRARY)
diff --git a/tests/tests/icu/CtsIcuTestCases_arm.xml b/tests/tests/icu/CtsIcuTestCases_arm.xml
deleted file mode 100644
index 96f0701..0000000
--- a/tests/tests/icu/CtsIcuTestCases_arm.xml
+++ /dev/null
@@ -1,563 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
-<TestPackage AndroidFramework="Android 1.0"
- appNameSpace="android.icu.cts"
- appPackageName="com.ibm.icu.dev.test"
- name="CtsIcuTestCases"
- runner=".IcuTestRunner"
- version="1.0">
-
- <!--
- ICU tests are run against ICU as a standalone library so the package names are com.ibm.icu.*.
- Each test class has one dummy method called "run-everything". This is because CTS will not try
- to run a class if there is no known test method on it. The IcuTestRunner is aware of this and
- pretends to run the method "run-everything", but actually dispatches the run to ICU's own test
- runner. If the test is successful, a return code of 0 from ICU's test runner will be detected
- and we report that the "run-everything" method passed. If there is any failure in the class,
- we report that "run-everything" failed and print out the detailed method by method listing
- from ICU about what actually failed, as the stack trace for the failure in "run-everything".
- -->
-
- <TestSuite name="com">
- <TestSuite name="ibm">
- <TestSuite name="icu">
- <TestSuite name="dev">
- <TestSuite name="test">
- <TestSuite name="translit">
- <TestCase abis="armeabi-v7a arm64-v8a" name="PrettyPrinterTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="TransliteratorTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="RegexUtilitiesTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="ReplaceableTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="RoundTripTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="AnyScriptTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="ErrorTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="UnicodeMapTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a"
- name="CompoundTransliteratorTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="TestUnicodeProperty">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="util">
- <TestCase abis="armeabi-v7a arm64-v8a"
- name="ICUResourceBundleCollationTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="ULocaleCollationTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="GenderInfoTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="BytesTrieTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="LocaleDataTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="CurrencyTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="RegionTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="ULocaleTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="StringTokenizerTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="CharsTrieTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="CompactArrayTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="LocaleBuilderTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="TrieMapTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="ICUServiceThreadTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="ICUBinaryTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="ICUResourceBundleTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="DebugUtilitiesTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a"
- name="SimplePatternFormatterTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="LocaleMatcherTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="UtilityTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="Trie2Test">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="ICUServiceTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="VersionInfoTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="LocalePriorityListTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="TrieTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="TextTrieMapTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="search">
- <TestCase abis="armeabi-v7a arm64-v8a" name="SearchTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="collator">
- <TestCase abis="armeabi-v7a arm64-v8a" name="LotusCollationKoreanTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="CollationTurkishTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="CollationMiscTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="CollationAPITest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="CollationServiceTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="AlphabeticIndexTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="CollationFinnishTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="CollationDummyTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="CollationRegressionTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="CollationChineseTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="CollationGermanTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="G7CollationTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="CollationSpanishTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a"
- name="CollationCreationMethodTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="UCAConformanceTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="CollationKanaTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="CollationFrenchTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="CollationIteratorTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="CollationTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="CollationThaiTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="CollationFrozenMonkeyTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="CollationThreadTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="CollationEnglishTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="CollationMonkeyTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="CollationCurrencyTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="format">
- <TestCase abis="armeabi-v7a arm64-v8a"
- name="GlobalizationPreferencesTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="RbnfLenientScannerTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="PluralRangesTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="SelectFormatUnitTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="PluralRulesTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a"
- name="RelativeDateTimeFormatterTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="RBNFParseTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="TimeUnitTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="CompactDecimalFormatTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="RbnfRoundTripTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="RbnfTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="SelectFormatAPITest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="PluralFormatTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="BigNumberFormatTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="ListFormatterTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="DateTimeGeneratorTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a"
- name="NumberFormatSpecificationTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="MeasureUnitTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a"
- name="ScientificNumberFormatterTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="PluralFormatUnitTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="compression">
- <TestCase abis="armeabi-v7a arm64-v8a" name="ExhaustiveTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="DecompressionTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="text">
- <TestCase abis="armeabi-v7a arm64-v8a" name="SpoofCheckerTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="iterator">
- <TestCase abis="armeabi-v7a arm64-v8a" name="TestUCharacterIterator">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="duration">
- <TestSuite name="languages">
- <TestCase abis="armeabi-v7a arm64-v8a"
- name="Test_en">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a"
- name="Test_es">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a"
- name="Test_fr">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a"
- name="Test_he_IL">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a"
- name="Test_hi">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a"
- name="Test_it">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a"
- name="Test_ja">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a"
- name="Test_ko">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a"
- name="Test_zh_Hans">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a"
- name="Test_zh_Hans_SG">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a"
- name="Test_zh_Hant">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a"
- name="Test_zh_Hant_HK">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestCase abis="armeabi-v7a arm64-v8a"
- name="ResourceBasedPeriodFormatterDataServiceTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="ICUDurationTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="PeriodBuilderFactoryTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="PeriodBuilderTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="PeriodTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="DataReadWriteTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="RegressionTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="rbbi">
- <TestCase abis="armeabi-v7a arm64-v8a" name="RBBITestExtended">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="SimpleBITest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="BreakIteratorTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="RBBITestMonkey">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="RBBITest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="BreakIteratorRegTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="lang">
- <TestCase abis="armeabi-v7a arm64-v8a" name="TestUScript">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="UPropertyAliasesTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="UTF16Test">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="UCharacterCategoryTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="UnicodeSetStringSpanTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="UnicodeSetTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="UCharacterCaseTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="UCharacterTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="UCharacterThreadTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="UCharacterSurrogateTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="TestUScriptRun">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="UCharacterDirectionTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="charsetdet">
- <TestCase abis="armeabi-v7a arm64-v8a" name="TestCharsetDetector">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="normalizer">
- <TestCase abis="armeabi-v7a arm64-v8a"
- name="TestDeprecatedNormalizerAPI">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="NormalizationMonkeyTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="TestCanonicalIterator">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="BasicTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="ConformanceTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="NormalizerRegressionTests">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="UTS46Test">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a"
- name="UnicodeNormalizerConformanceTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="bidi">
- <TestCase abis="armeabi-v7a arm64-v8a" name="BidiTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="BiDiConformanceTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="shaping">
- <TestCase abis="armeabi-v7a arm64-v8a" name="ArabicShapingRegTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="stringprep">
- <TestCase abis="armeabi-v7a arm64-v8a" name="TestStringPrep">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="IDNAConformanceTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="TestIDNA">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="TestStringPrepProfiles">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="TestIDNARef">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="timezone">
- <TestCase abis="armeabi-v7a arm64-v8a" name="TimeZoneTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="TimeZoneRuleTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="TimeZoneRegression">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="TimeZoneBoundaryTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="TimeZoneOffsetLocalTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="bigdec">
- <TestCase abis="armeabi-v7a arm64-v8a" name="DiagBigDecimal">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="calendar">
- <TestCase abis="armeabi-v7a arm64-v8a" name="CalendarTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="AstroTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="HolidayTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="timescale">
- <TestCase abis="armeabi-v7a arm64-v8a" name="TimeScaleMonkeyTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="TimeScaleAPITest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="TimeScaleDataTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="charset">
- <TestCase abis="armeabi-v7a arm64-v8a" name="TestSelection">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="armeabi-v7a arm64-v8a" name="TestCharset">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestCase abis="armeabi-v7a arm64-v8a" name="TestLocaleNamePackaging">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- </TestSuite>
- </TestSuite>
- </TestSuite>
- </TestSuite>
-</TestPackage>
diff --git a/tests/tests/icu/CtsIcuTestCases_mips.xml b/tests/tests/icu/CtsIcuTestCases_mips.xml
deleted file mode 100644
index beeae32..0000000
--- a/tests/tests/icu/CtsIcuTestCases_mips.xml
+++ /dev/null
@@ -1,563 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
-<TestPackage AndroidFramework="Android 1.0"
- appNameSpace="android.icu.cts"
- appPackageName="com.ibm.icu.dev.test"
- name="CtsIcuTestCases"
- runner=".IcuTestRunner"
- version="1.0">
-
- <!--
- ICU tests are run against ICU as a standalone library so the package names are com.ibm.icu.*.
- Each test class has one dummy method called "run-everything". This is because CTS will not try
- to run a class if there is no known test method on it. The IcuTestRunner is aware of this and
- pretends to run the method "run-everything", but actually dispatches the run to ICU's own test
- runner. If the test is successful, a return code of 0 from ICU's test runner will be detected
- and we report that the "run-everything" method passed. If there is any failure in the class,
- we report that "run-everything" failed and print out the detailed method by method listing
- from ICU about what actually failed, as the stack trace for the failure in "run-everything".
- -->
-
- <TestSuite name="com">
- <TestSuite name="ibm">
- <TestSuite name="icu">
- <TestSuite name="dev">
- <TestSuite name="test">
- <TestSuite name="translit">
- <TestCase abis="mips mips64" name="PrettyPrinterTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="TransliteratorTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="RegexUtilitiesTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="ReplaceableTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="RoundTripTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="AnyScriptTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="ErrorTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="UnicodeMapTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64"
- name="CompoundTransliteratorTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="TestUnicodeProperty">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="util">
- <TestCase abis="mips mips64"
- name="ICUResourceBundleCollationTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="ULocaleCollationTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="GenderInfoTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="BytesTrieTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="LocaleDataTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="CurrencyTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="RegionTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="ULocaleTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="StringTokenizerTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="CharsTrieTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="CompactArrayTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="LocaleBuilderTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="TrieMapTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="ICUServiceThreadTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="ICUBinaryTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="ICUResourceBundleTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="DebugUtilitiesTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64"
- name="SimplePatternFormatterTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="LocaleMatcherTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="UtilityTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="Trie2Test">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="ICUServiceTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="VersionInfoTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="LocalePriorityListTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="TrieTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="TextTrieMapTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="search">
- <TestCase abis="mips mips64" name="SearchTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="collator">
- <TestCase abis="mips mips64" name="LotusCollationKoreanTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="CollationTurkishTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="CollationMiscTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="CollationAPITest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="CollationServiceTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="AlphabeticIndexTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="CollationFinnishTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="CollationDummyTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="CollationRegressionTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="CollationChineseTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="CollationGermanTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="G7CollationTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="CollationSpanishTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64"
- name="CollationCreationMethodTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="UCAConformanceTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="CollationKanaTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="CollationFrenchTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="CollationIteratorTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="CollationTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="CollationThaiTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="CollationFrozenMonkeyTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="CollationThreadTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="CollationEnglishTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="CollationMonkeyTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="CollationCurrencyTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="format">
- <TestCase abis="mips mips64"
- name="GlobalizationPreferencesTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="RbnfLenientScannerTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="PluralRangesTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="SelectFormatUnitTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="PluralRulesTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64"
- name="RelativeDateTimeFormatterTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="RBNFParseTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="TimeUnitTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="CompactDecimalFormatTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="RbnfRoundTripTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="RbnfTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="SelectFormatAPITest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="PluralFormatTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="BigNumberFormatTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="ListFormatterTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="DateTimeGeneratorTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64"
- name="NumberFormatSpecificationTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="MeasureUnitTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64"
- name="ScientificNumberFormatterTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="PluralFormatUnitTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="compression">
- <TestCase abis="mips mips64" name="ExhaustiveTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="DecompressionTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="text">
- <TestCase abis="mips mips64" name="SpoofCheckerTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="iterator">
- <TestCase abis="mips mips64" name="TestUCharacterIterator">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="duration">
- <TestSuite name="languages">
- <TestCase abis="mips mips64"
- name="Test_en">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64"
- name="Test_es">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64"
- name="Test_fr">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64"
- name="Test_he_IL">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64"
- name="Test_hi">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64"
- name="Test_it">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64"
- name="Test_ja">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64"
- name="Test_ko">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64"
- name="Test_zh_Hans">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64"
- name="Test_zh_Hans_SG">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64"
- name="Test_zh_Hant">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64"
- name="Test_zh_Hant_HK">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestCase abis="mips mips64"
- name="ResourceBasedPeriodFormatterDataServiceTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="ICUDurationTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="PeriodBuilderFactoryTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="PeriodBuilderTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="PeriodTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="DataReadWriteTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="RegressionTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="rbbi">
- <TestCase abis="mips mips64" name="RBBITestExtended">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="SimpleBITest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="BreakIteratorTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="RBBITestMonkey">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="RBBITest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="BreakIteratorRegTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="lang">
- <TestCase abis="mips mips64" name="TestUScript">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="UPropertyAliasesTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="UTF16Test">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="UCharacterCategoryTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="UnicodeSetStringSpanTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="UnicodeSetTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="UCharacterCaseTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="UCharacterTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="UCharacterThreadTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="UCharacterSurrogateTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="TestUScriptRun">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="UCharacterDirectionTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="charsetdet">
- <TestCase abis="mips mips64" name="TestCharsetDetector">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="normalizer">
- <TestCase abis="mips mips64"
- name="TestDeprecatedNormalizerAPI">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="NormalizationMonkeyTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="TestCanonicalIterator">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="BasicTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="ConformanceTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="NormalizerRegressionTests">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="UTS46Test">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64"
- name="UnicodeNormalizerConformanceTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="bidi">
- <TestCase abis="mips mips64" name="BidiTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="BiDiConformanceTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="shaping">
- <TestCase abis="mips mips64" name="ArabicShapingRegTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="stringprep">
- <TestCase abis="mips mips64" name="TestStringPrep">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="IDNAConformanceTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="TestIDNA">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="TestStringPrepProfiles">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="TestIDNARef">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="timezone">
- <TestCase abis="mips mips64" name="TimeZoneTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="TimeZoneRuleTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="TimeZoneRegression">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="TimeZoneBoundaryTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="TimeZoneOffsetLocalTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="bigdec">
- <TestCase abis="mips mips64" name="DiagBigDecimal">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="calendar">
- <TestCase abis="mips mips64" name="CalendarTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="AstroTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="HolidayTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="timescale">
- <TestCase abis="mips mips64" name="TimeScaleMonkeyTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="TimeScaleAPITest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="TimeScaleDataTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="charset">
- <TestCase abis="mips mips64" name="TestSelection">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="mips mips64" name="TestCharset">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestCase abis="mips mips64" name="TestLocaleNamePackaging">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- </TestSuite>
- </TestSuite>
- </TestSuite>
- </TestSuite>
-</TestPackage>
diff --git a/tests/tests/icu/CtsIcuTestCases_x86.xml b/tests/tests/icu/CtsIcuTestCases_x86.xml
deleted file mode 100644
index 31140f2..0000000
--- a/tests/tests/icu/CtsIcuTestCases_x86.xml
+++ /dev/null
@@ -1,563 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
-<TestPackage AndroidFramework="Android 1.0"
- appNameSpace="android.icu.cts"
- appPackageName="com.ibm.icu.dev.test"
- name="CtsIcuTestCases"
- runner=".IcuTestRunner"
- version="1.0">
-
- <!--
- ICU tests are run against ICU as a standalone library so the package names are com.ibm.icu.*.
- Each test class has one dummy method called "run-everything". This is because CTS will not try
- to run a class if there is no known test method on it. The IcuTestRunner is aware of this and
- pretends to run the method "run-everything", but actually dispatches the run to ICU's own test
- runner. If the test is successful, a return code of 0 from ICU's test runner will be detected
- and we report that the "run-everything" method passed. If there is any failure in the class,
- we report that "run-everything" failed and print out the detailed method by method listing
- from ICU about what actually failed, as the stack trace for the failure in "run-everything".
- -->
-
- <TestSuite name="com">
- <TestSuite name="ibm">
- <TestSuite name="icu">
- <TestSuite name="dev">
- <TestSuite name="test">
- <TestSuite name="translit">
- <TestCase abis="x86 x86_64" name="PrettyPrinterTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="TransliteratorTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="RegexUtilitiesTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="ReplaceableTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="RoundTripTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="AnyScriptTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="ErrorTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="UnicodeMapTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64"
- name="CompoundTransliteratorTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="TestUnicodeProperty">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="util">
- <TestCase abis="x86 x86_64"
- name="ICUResourceBundleCollationTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="ULocaleCollationTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="GenderInfoTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="BytesTrieTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="LocaleDataTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="CurrencyTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="RegionTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="ULocaleTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="StringTokenizerTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="CharsTrieTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="CompactArrayTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="LocaleBuilderTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="TrieMapTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="ICUServiceThreadTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="ICUBinaryTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="ICUResourceBundleTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="DebugUtilitiesTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64"
- name="SimplePatternFormatterTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="LocaleMatcherTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="UtilityTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="Trie2Test">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="ICUServiceTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="VersionInfoTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="LocalePriorityListTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="TrieTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="TextTrieMapTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="search">
- <TestCase abis="x86 x86_64" name="SearchTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="collator">
- <TestCase abis="x86 x86_64" name="LotusCollationKoreanTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="CollationTurkishTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="CollationMiscTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="CollationAPITest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="CollationServiceTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="AlphabeticIndexTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="CollationFinnishTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="CollationDummyTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="CollationRegressionTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="CollationChineseTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="CollationGermanTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="G7CollationTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="CollationSpanishTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64"
- name="CollationCreationMethodTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="UCAConformanceTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="CollationKanaTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="CollationFrenchTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="CollationIteratorTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="CollationTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="CollationThaiTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="CollationFrozenMonkeyTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="CollationThreadTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="CollationEnglishTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="CollationMonkeyTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="CollationCurrencyTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="format">
- <TestCase abis="x86 x86_64"
- name="GlobalizationPreferencesTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="RbnfLenientScannerTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="PluralRangesTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="SelectFormatUnitTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="PluralRulesTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64"
- name="RelativeDateTimeFormatterTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="RBNFParseTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="TimeUnitTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="CompactDecimalFormatTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="RbnfRoundTripTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="RbnfTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="SelectFormatAPITest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="PluralFormatTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="BigNumberFormatTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="ListFormatterTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="DateTimeGeneratorTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64"
- name="NumberFormatSpecificationTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="MeasureUnitTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64"
- name="ScientificNumberFormatterTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="PluralFormatUnitTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="compression">
- <TestCase abis="x86 x86_64" name="ExhaustiveTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="DecompressionTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="text">
- <TestCase abis="x86 x86_64" name="SpoofCheckerTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="iterator">
- <TestCase abis="x86 x86_64" name="TestUCharacterIterator">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="duration">
- <TestSuite name="languages">
- <TestCase abis="x86 x86_64"
- name="Test_en">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64"
- name="Test_es">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64"
- name="Test_fr">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64"
- name="Test_he_IL">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64"
- name="Test_hi">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64"
- name="Test_it">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64"
- name="Test_ja">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64"
- name="Test_ko">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64"
- name="Test_zh_Hans">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64"
- name="Test_zh_Hans_SG">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64"
- name="Test_zh_Hant">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64"
- name="Test_zh_Hant_HK">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestCase abis="x86 x86_64"
- name="ResourceBasedPeriodFormatterDataServiceTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="ICUDurationTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="PeriodBuilderFactoryTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="PeriodBuilderTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="PeriodTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="DataReadWriteTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="RegressionTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="rbbi">
- <TestCase abis="x86 x86_64" name="RBBITestExtended">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="SimpleBITest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="BreakIteratorTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="RBBITestMonkey">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="RBBITest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="BreakIteratorRegTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="lang">
- <TestCase abis="x86 x86_64" name="TestUScript">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="UPropertyAliasesTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="UTF16Test">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="UCharacterCategoryTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="UnicodeSetStringSpanTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="UnicodeSetTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="UCharacterCaseTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="UCharacterTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="UCharacterThreadTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="UCharacterSurrogateTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="TestUScriptRun">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="UCharacterDirectionTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="charsetdet">
- <TestCase abis="x86 x86_64" name="TestCharsetDetector">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="normalizer">
- <TestCase abis="x86 x86_64"
- name="TestDeprecatedNormalizerAPI">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="NormalizationMonkeyTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="TestCanonicalIterator">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="BasicTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="ConformanceTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="NormalizerRegressionTests">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="UTS46Test">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64"
- name="UnicodeNormalizerConformanceTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="bidi">
- <TestCase abis="x86 x86_64" name="BidiTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="BiDiConformanceTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="shaping">
- <TestCase abis="x86 x86_64" name="ArabicShapingRegTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="stringprep">
- <TestCase abis="x86 x86_64" name="TestStringPrep">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="IDNAConformanceTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="TestIDNA">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="TestStringPrepProfiles">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="TestIDNARef">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="timezone">
- <TestCase abis="x86 x86_64" name="TimeZoneTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="TimeZoneRuleTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="TimeZoneRegression">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="TimeZoneBoundaryTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="TimeZoneOffsetLocalTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="bigdec">
- <TestCase abis="x86 x86_64" name="DiagBigDecimal">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="calendar">
- <TestCase abis="x86 x86_64" name="CalendarTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="AstroTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="HolidayTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="timescale">
- <TestCase abis="x86 x86_64" name="TimeScaleMonkeyTest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="TimeScaleAPITest">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="TimeScaleDataTest">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestSuite name="charset">
- <TestCase abis="x86 x86_64" name="TestSelection">
- <Test name="run-everything"/>
- </TestCase>
- <TestCase abis="x86 x86_64" name="TestCharset">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- <TestCase abis="x86 x86_64" name="TestLocaleNamePackaging">
- <Test name="run-everything"/>
- </TestCase>
- </TestSuite>
- </TestSuite>
- </TestSuite>
- </TestSuite>
- </TestSuite>
-</TestPackage>
diff --git a/tests/tests/icu/resources/android/icu/cts/expectations/icu-known-failures.txt b/tests/tests/icu/resources/android/icu/cts/expectations/icu-known-failures.txt
new file mode 100644
index 0000000..dfc6144
--- /dev/null
+++ b/tests/tests/icu/resources/android/icu/cts/expectations/icu-known-failures.txt
@@ -0,0 +1,59 @@
+/*
+ * This file contains expectations for tests that are known to fail.
+ */
+[
+{
+ description: "Fails when running the tests from ant in external/icu/icu4j",
+ name: "com.ibm.icu.dev.test.format.NumberFormatTest#TestDataDrivenICU",
+ bug: "27310195"
+},
+{
+ description: "Class cannot be instantiated, cannot find resources com/ibm/icu/dev/test/serializable/data",
+ name: "com.ibm.icu.dev.test.serializable.CompatibilityTest",
+ bug: "27310873"
+},
+{
+ description: "Broken and not yet triaged",
+ names: [
+ "com.ibm.icu.dev.test.bidi.TestCompatibility#testCompatibility",
+ "com.ibm.icu.dev.test.calendar.ChineseTest#TestCoverage",
+ "com.ibm.icu.dev.test.calendar.ChineseTest#TestInitWithCurrentTime",
+ "com.ibm.icu.dev.test.calendar.IBMCalendarTest#TestAddRollEra0AndEraBounds",
+ "com.ibm.icu.dev.test.duration.ICUDurationTest#TestBasics",
+ "com.ibm.icu.dev.test.format.DataDrivenFormatTest#run-everything",
+ "com.ibm.icu.dev.test.format.DateFormatRegressionTest#Test4073003",
+ "com.ibm.icu.dev.test.format.DateFormatRegressionTest#Test4151706",
+ "com.ibm.icu.dev.test.format.DateFormatRegressionTest#Test4182066",
+ "com.ibm.icu.dev.test.format.DateFormatTest#TestBadInput135",
+ "com.ibm.icu.dev.test.format.DateFormatTest#TestDotAndAtLeniency",
+ "com.ibm.icu.dev.test.format.DateFormatTest#TestGenericTime",
+ "com.ibm.icu.dev.test.format.DateFormatTest#TestPartialParse994",
+ "com.ibm.icu.dev.test.format.DateFormatTest#TestQuarters",
+ "com.ibm.icu.dev.test.format.DateFormatTest#TestSpaceParsing",
+ "com.ibm.icu.dev.test.format.DateFormatTest#TestTwoDigitYear",
+ "com.ibm.icu.dev.test.format.DateFormatTest#TestWhiteSpaceParsing",
+ "com.ibm.icu.dev.test.format.NumberFormatTest#TestDataDrivenJDK",
+ "com.ibm.icu.dev.test.format.NumberFormatTest#TestNonpositiveMultiplier",
+ "com.ibm.icu.dev.test.format.PluralRulesTest#testOverUnderflow",
+ "com.ibm.icu.dev.test.timezone.TimeZoneBoundaryTest#TestStepwise",
+ "com.ibm.icu.dev.test.timezone.TimeZoneTest#TestObservesDaylightTime",
+ "com.ibm.icu.dev.test.translit.TransliteratorTest#TestSourceTargetSet2",
+ "com.ibm.icu.dev.test.translit.TransliteratorTest#TestSourceTargetSetFilter",
+ "com.ibm.icu.dev.test.util.CurrencyTest#TestGetKeywordValues"
+ ]
+},
+{
+ description: "Broken due to warnings, not yet triaged",
+ names: [
+ "com.ibm.icu.dev.test.collator.CollationCreationMethodTest#TestRuleVsLocaleCreationMonkey",
+ "com.ibm.icu.dev.test.collator.CollationMiscTest#TestImport",
+ "com.ibm.icu.dev.test.collator.CollationMiscTest#TestImportWithType",
+ "com.ibm.icu.dev.test.collator.CollationMiscTest#TestUCARules",
+ "com.ibm.icu.dev.test.collator.CollationTest#TestDataDriven",
+ "com.ibm.icu.dev.test.collator.G7CollationTest#TestG7Data",
+ "com.ibm.icu.dev.test.charset.TestCharset#TestHZ",
+ "com.ibm.icu.dev.test.charset.TestCharset#TestMBCS",
+ "com.ibm.icu.dev.test.charset.TestCharset#TestSurrogateBehavior"
+ ]
+}
+]
diff --git a/tests/tests/icu/src/android/icu/cts/AndroidJUnitRunnerConstants.java b/tests/tests/icu/src/android/icu/cts/AndroidJUnitRunnerConstants.java
new file mode 100644
index 0000000..24d8819
--- /dev/null
+++ b/tests/tests/icu/src/android/icu/cts/AndroidJUnitRunnerConstants.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.icu.cts;
+
+import android.support.test.runner.AndroidJUnitRunner;
+
+/**
+ * Constants used to communicate to and from {@link AndroidJUnitRunner}.
+ */
+interface AndroidJUnitRunnerConstants {
+
+ /**
+ * The names of the file containing the names of the tests to run.
+ *
+ * <p>This is an internal constant used within
+ * {@code android.support.test.internal.runner.RunnerArgs}, which is used on both the server
+ * and
+ * client side. The constant is used when there are too many test names to pass on the command
+ * line, in which case they are stored in a file that is pushed to the device and then the
+ * location of that file is passed in this argument. The {@code RunnerArgs} on the client will
+ * read the contents of that file in order to retrieve the list of names and then return that
+ * to
+ * its client without the client being aware of how that was done.
+ */
+ String ARGUMENT_TEST_FILE = "testFile";
+
+ /**
+ * A comma separated list of the names of test classes to run.
+ *
+ * <p>The equivalent constant in {@code InstrumentationTestRunner} is hidden and so not
+ * available
+ * through the public API.
+ */
+ String ARGUMENT_TEST_CLASS = "class";
+
+ /**
+ * Log the results as if the tests were executed but don't actually run the tests.
+ *
+ * <p>The equivalent constant in {@code InstrumentationTestRunner} is private.
+ */
+ String ARGUMENT_LOG_ONLY = "log";
+
+ /**
+ * Wait for the debugger before starting.
+ *
+ * <p>There is no equivalent constant in {@code InstrumentationTestRunner} but the string is
+ * used
+ * within that class.
+ */
+ String ARGUMENT_DEBUG = "debug";
+
+ /**
+ * Only count the number of tests to run.
+ *
+ * <p>There is no equivalent constant in {@code InstrumentationTestRunner} but the string is
+ * used
+ * within that class.
+ */
+ String ARGUMENT_COUNT = "count";
+
+ /**
+ * Token representing how long (in seconds) the current test took to execute.
+ *
+ * <p>The equivalent constant in {@code InstrumentationTestRunner} is private.
+ */
+ String REPORT_KEY_RUNTIME = "runtime";
+
+ /**
+ * An identifier for tests run using this class.
+ */
+ String REPORT_VALUE_ID = "IcuTestRunner";
+}
diff --git a/tests/tests/icu/src/android/icu/cts/IcuRunListener.java b/tests/tests/icu/src/android/icu/cts/IcuRunListener.java
new file mode 100644
index 0000000..5e1e003
--- /dev/null
+++ b/tests/tests/icu/src/android/icu/cts/IcuRunListener.java
@@ -0,0 +1,212 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.icu.cts;
+
+import android.app.Instrumentation;
+import android.icu.cts.junit.ICUTestFailedException;
+import android.icu.cts.junit.IcuRunnerParams;
+import android.os.Bundle;
+import android.util.Log;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.runner.Description;
+import org.junit.runner.Result;
+import org.junit.runner.notification.Failure;
+import org.junit.runner.notification.RunListener;
+
+import static android.app.Instrumentation.REPORT_KEY_IDENTIFIER;
+import static android.app.Instrumentation.REPORT_KEY_STREAMRESULT;
+import static android.icu.cts.AndroidJUnitRunnerConstants.REPORT_KEY_RUNTIME;
+import static android.icu.cts.AndroidJUnitRunnerConstants.REPORT_VALUE_ID;
+import static android.test.InstrumentationTestRunner.REPORT_KEY_NAME_CLASS;
+import static android.test.InstrumentationTestRunner.REPORT_KEY_NAME_TEST;
+import static android.test.InstrumentationTestRunner.REPORT_KEY_NUM_CURRENT;
+import static android.test.InstrumentationTestRunner.REPORT_KEY_NUM_TOTAL;
+import static android.test.InstrumentationTestRunner.REPORT_KEY_STACK;
+import static android.test.InstrumentationTestRunner.REPORT_VALUE_RESULT_ERROR;
+import static android.test.InstrumentationTestRunner.REPORT_VALUE_RESULT_FAILURE;
+import static android.test.InstrumentationTestRunner.REPORT_VALUE_RESULT_OK;
+import static android.test.InstrumentationTestRunner.REPORT_VALUE_RESULT_START;
+
+
+/**
+ * Listens to result of running tests, collates details and sends intermediate status information
+ * back to the host.
+ */
+class IcuRunListener extends RunListener {
+
+ /**
+ * The {@link Instrumentation} for which this will report information.
+ */
+ private final Instrumentation instrumentation;
+
+ private final IcuRunnerParams icuRunnerParams;
+
+ private final int totalTestCount;
+
+ /**
+ * The list of failed tests.
+ */
+ private final List<String> failedTests;
+
+ private Bundle currentTestResult;
+
+ private int resultStatus;
+
+ private int totalSuccess = 0;
+
+ private int totalFailures = 0;
+
+ private long runStartTime;
+
+ private long runElapsedTime;
+
+ private long testStartTime;
+
+ public IcuRunListener(Instrumentation instrumentation, IcuRunnerParams icuRunnerParams,
+ int totalTestCount) {
+ this.instrumentation = instrumentation;
+ this.icuRunnerParams = icuRunnerParams;
+ this.totalTestCount = totalTestCount;
+ failedTests = new ArrayList<>();
+ }
+
+ /**
+ * Send an update to the test runner informing it we are starting a test. If this is not run
+ * then
+ * the test runner will think the test was never run, and mark it as failed.
+ *
+ * @param className
+ * The name of the class being tested.
+ * @param methodName
+ * The name of the test method being tested.
+ * @return A bundle containing test class, method, and report name. This bundle has been sent
+ * back
+ * to the host.
+ */
+ private Bundle sendStartTestInfo(String className, int testNum, String methodName) {
+ Bundle data = new Bundle();
+ data.putString(Instrumentation.REPORT_KEY_IDENTIFIER, REPORT_VALUE_ID);
+ data.putInt(REPORT_KEY_NUM_TOTAL, totalTestCount);
+ data.putInt(REPORT_KEY_NUM_CURRENT, testNum);
+ data.putString(REPORT_KEY_NAME_CLASS, className);
+ data.putString(REPORT_KEY_NAME_TEST, methodName);
+ instrumentation.sendStatus(REPORT_VALUE_RESULT_START, data);
+ return data;
+ }
+
+ @Override
+ public void testRunStarted(Description description) throws Exception {
+ runStartTime = System.currentTimeMillis();
+ }
+
+ @Override
+ public void testStarted(Description description) throws Exception {
+ String className = description.getClassName();
+ int count = totalSuccess + totalFailures;
+ String methodName = description.getMethodName();
+ currentTestResult = sendStartTestInfo(className, count, methodName);
+ resultStatus = REPORT_VALUE_RESULT_OK;
+ testStartTime = System.currentTimeMillis();
+ }
+
+ @Override
+ public void testFailure(Failure failure) throws Exception {
+ Description description = failure.getDescription();
+
+ @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
+ Throwable exception = failure.getException();
+ if (exception instanceof ICUTestFailedException) {
+ ICUTestFailedException icuTestFailedException =
+ (ICUTestFailedException) exception;
+
+ String information = icuTestFailedException.getInformation();
+ int errorCount = icuTestFailedException.getErrorCount();
+
+ // Include the detailed logs from ICU as the stack trace.
+ currentTestResult.putString(REPORT_KEY_STACK, information);
+
+ // Also append the logs to the console output.
+ String output = "Failure: " + description + ", due to " + errorCount + " error(s)\n"
+ + information;
+ currentTestResult.putString(Instrumentation.REPORT_KEY_STREAMRESULT, output);
+ resultStatus = REPORT_VALUE_RESULT_FAILURE;
+ } else {
+ String information = failure.getTrace();
+ currentTestResult.putString(REPORT_KEY_STACK, information);
+ String output = "Error: " + description + "\n" + information;
+ currentTestResult.putString(Instrumentation.REPORT_KEY_STREAMRESULT, output);
+ resultStatus = REPORT_VALUE_RESULT_ERROR;
+ }
+ }
+
+ @Override
+ public void testFinished(Description description) throws Exception {
+ long timeTaken = System.currentTimeMillis() - testStartTime;
+ currentTestResult.putFloat(REPORT_KEY_RUNTIME, timeTaken / 1000);
+
+ if (resultStatus == REPORT_VALUE_RESULT_OK) {
+ totalSuccess++;
+ String output = "Success: " + description;
+ currentTestResult.putString(Instrumentation.REPORT_KEY_STREAMRESULT, output);
+ } else {
+ totalFailures++;
+ failedTests.add(description.toString());
+ }
+
+ instrumentation.sendStatus(resultStatus, currentTestResult);
+ }
+
+ @Override
+ public void testRunFinished(Result result) throws Exception {
+ runElapsedTime = System.currentTimeMillis() - runStartTime;
+ }
+
+ public Bundle getFinalResults() {
+ int totalTests = totalFailures + totalSuccess;
+ Log.d(IcuTestRunner.TAG, (icuRunnerParams.getSkipExecution() ? "Skipped " : "Ran ")
+ + totalTests + " tests, " + totalSuccess + " passed, " + totalFailures + " failed");
+ Bundle results = new Bundle();
+ results.putString(REPORT_KEY_IDENTIFIER, REPORT_VALUE_ID);
+ results.putInt(REPORT_KEY_NUM_TOTAL, totalTests);
+ String report;
+ if (totalFailures == 0) {
+ report = "All " + totalSuccess + " tests passed.\n";
+ } else {
+ report = "Failures " + totalFailures + '\n';
+ for (String classname : failedTests) {
+ report += classname + '\n';
+ }
+ }
+
+ // Report the elapsed time (in seconds).
+ report += "Time: " + (runElapsedTime / 1000.0);
+
+ results.putString(REPORT_KEY_STREAMRESULT, report);
+
+ return results;
+ }
+
+ public Bundle getCountResults() {
+ Log.d(IcuTestRunner.TAG, "Counted " + (totalFailures + totalSuccess) + " tests, "
+ + totalSuccess + " passed, " + totalFailures + " failed");
+ Bundle results = new Bundle();
+ results.putString(REPORT_KEY_IDENTIFIER, REPORT_VALUE_ID);
+ results.putInt(REPORT_KEY_NUM_TOTAL, totalSuccess);
+ return results;
+ }
+}
diff --git a/tests/tests/icu/src/android/icu/cts/IcuTestFilter.java b/tests/tests/icu/src/android/icu/cts/IcuTestFilter.java
new file mode 100644
index 0000000..2ee1fcd
--- /dev/null
+++ b/tests/tests/icu/src/android/icu/cts/IcuTestFilter.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.icu.cts;
+
+import android.icu.cts.junit.IcuTestFmwkRunner;
+import android.icu.cts.junit.IcuTestGroupRunner;
+import android.util.Log;
+import javax.annotation.Nullable;
+import org.junit.runner.Description;
+import org.junit.runner.manipulation.Filter;
+import vogar.Expectation;
+import vogar.ExpectationStore;
+import vogar.Result;
+
+/**
+ * Filter out tests/classes that are not requested or which are expected to fail.
+ *
+ * <p>This filter has to handle a hierarchy of {@code Description descriptions} that looks
+ * something like this (in CTSv2):
+ * <pre>
+ * IcuTestGroupRunner
+ * IcuTestGroupRunner
+ * IcuTestGroupRunner
+ * IcuTestFmwkRunner
+ * IcuFrameworkTest
+ * ...
+ * ...
+ * IcuTestFmwkRunner
+ * IcuFrameworkTest
+ * ...
+ * ...
+ * IcuTestGroupRunner
+ * IcuTestFmwkRunner
+ * IcuFrameworkTest
+ * ...
+ * ...
+ * ...
+ * </pre>
+ *
+ * <p>And also a flatter hierarchy that looks like this (in CTSv1):
+ * IcuTestFmwkRunner
+ * IcuFrameworkTest
+ * ...
+ * ...
+ *
+ * <p>It cannot filter out the non-leaf nodes in the hierarchy, i.e. {@link IcuTestGroupRunner} and
+ * {@link IcuTestFmwkRunner}, as that would prevent it from traversing the hierarchy and finding
+ * the leaf nodes.
+ */
+class IcuTestFilter extends Filter {
+
+ private final ExpectationStore expectationStore;
+
+ private final IcuTestList icuTestList;
+
+ public IcuTestFilter(IcuTestList icuTestList, @Nullable ExpectationStore expectationStore) {
+ this.expectationStore = expectationStore;
+ this.icuTestList = icuTestList;
+ }
+
+ @Override
+ public boolean shouldRun(Description description) {
+ // The description will only have a method name if it is a leaf node in the hierarchy, see
+ // class JavaDoc, otherwise it will be a non-leaf node. Non-leaf nodes must not be filtered
+ // out as that would prevent leaf nodes from being visited.
+ String methodName = description.getMethodName();
+ if (methodName != null) {
+ String className = description.getClassName();
+ String testName = className + "#" + methodName;
+
+ // If the test isn't in the list of tests to run then do not run it.
+ if (!icuTestList.shouldRunTest(testName)) {
+ return false;
+ }
+
+ if (expectationStore != null) {
+ Expectation expectation = expectationStore.get(testName);
+ if (expectation.getResult() != Result.SUCCESS) {
+ Log.d(IcuTestRunner.TAG, "Excluding test " + description
+ + " as it matches expectation: " + expectation);
+ return false;
+ }
+ }
+ }
+
+ return true;
+ }
+
+ @Override
+ public String describe() {
+ return "IcuTestFilter";
+ }
+}
diff --git a/tests/tests/icu/src/android/icu/cts/IcuTestList.java b/tests/tests/icu/src/android/icu/cts/IcuTestList.java
new file mode 100644
index 0000000..4c6a568
--- /dev/null
+++ b/tests/tests/icu/src/android/icu/cts/IcuTestList.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.icu.cts;
+
+import android.util.Log;
+import java.util.ArrayList;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+import javax.annotation.Nullable;
+
+/**
+ * A list of the tests to run.
+ */
+class IcuTestList {
+
+ private static final String ROOT_TEST_GROUP_NAME = "com.ibm.icu.dev.test.TestAll";
+
+ /**
+ * The names of the set of tests to run, if null then all tests should be run.
+ */
+ @Nullable
+ private final Set<String> testsToRun;
+
+ private final List<Class> classesToRun;
+
+ /**
+ * @param testNameList
+ * The list of test names (i.e. {@code <class>#<method>}). If null then all
+ * tests should be run.
+ */
+ public IcuTestList(@Nullable List<String> testNameList) {
+
+ // Populate a set with the unique class names of all the tests.
+ Set<String> classNamesToRun = new LinkedHashSet<>();
+ if (testNameList == null) {
+ // Run from the root test class.
+ String rootTestClassName = ROOT_TEST_GROUP_NAME;
+ Log.d(IcuTestRunner.TAG, "Running all tests rooted at " + rootTestClassName);
+ classNamesToRun.add(rootTestClassName);
+ testsToRun = null;
+ } else {
+ testsToRun = new LinkedHashSet<>(testNameList);
+
+ for (String testName : testNameList) {
+ int index = testName.indexOf('#');
+ String className;
+ if (index == -1) {
+ className = testName;
+ } else {
+ className = testName.substring(0, index);
+ }
+ classNamesToRun.add(className);
+ }
+
+ Log.d(IcuTestRunner.TAG, "Running only the following tests: " + testsToRun);
+ }
+
+ // Populate the list of classes to run.
+ classesToRun = new ArrayList<>();
+ for (String className : classNamesToRun) {
+ try {
+ classesToRun.add(Class.forName(className));
+ } catch (ClassNotFoundException e) {
+ throw new IllegalStateException("Could not load class '" + className, e);
+ }
+ }
+ }
+
+ /**
+ * Return all the classes to run.
+ */
+ public Class[] getClassesToRun() {
+ return classesToRun.toArray(new Class[classesToRun.size()]);
+ }
+
+ /**
+ * Return true if the test with the specified name should be run, false otherwise.
+ */
+ public boolean shouldRunTest(String testName) {
+ // If the tests aren't explicitly provided then run all tests by
+ // default, otherwise run only those tests explicitly listed by name.
+ return testsToRun == null || testsToRun.contains(testName);
+ }
+}
diff --git a/tests/tests/icu/src/android/icu/cts/IcuTestRunner.java b/tests/tests/icu/src/android/icu/cts/IcuTestRunner.java
index ef94235..48a4cc1 100644
--- a/tests/tests/icu/src/android/icu/cts/IcuTestRunner.java
+++ b/tests/tests/icu/src/android/icu/cts/IcuTestRunner.java
@@ -18,28 +18,38 @@
import android.app.Activity;
import android.app.Instrumentation;
+import android.icu.cts.junit.IcuRunnerParams;
+import android.icu.cts.junit.IcuTestRunnerBuilder;
import android.os.Bundle;
import android.os.Debug;
import android.util.Log;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.LinkedList;
+import java.util.Collections;
+import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
+import javax.annotation.Nullable;
+import org.junit.runner.Computer;
+import org.junit.runner.JUnitCore;
+import org.junit.runner.Request;
+import org.junit.runner.Runner;
+import org.junit.runner.manipulation.Filter;
+import org.junit.runner.manipulation.Filterable;
+import org.junit.runner.manipulation.NoTestsRemainException;
+import org.junit.runners.model.InitializationError;
+import org.junit.runners.model.RunnerBuilder;
+import vogar.ExpectationStore;
+import vogar.ModeId;
-import static android.test.InstrumentationTestRunner.REPORT_KEY_NAME_CLASS;
-import static android.test.InstrumentationTestRunner.REPORT_KEY_NAME_TEST;
-import static android.test.InstrumentationTestRunner.REPORT_KEY_NUM_CURRENT;
-import static android.test.InstrumentationTestRunner.REPORT_KEY_NUM_TOTAL;
-import static android.test.InstrumentationTestRunner.REPORT_KEY_STACK;
-import static android.test.InstrumentationTestRunner.REPORT_VALUE_RESULT_ERROR;
-import static android.test.InstrumentationTestRunner.REPORT_VALUE_RESULT_OK;
-import static android.test.InstrumentationTestRunner.REPORT_VALUE_RESULT_START;
+import static android.icu.cts.AndroidJUnitRunnerConstants.ARGUMENT_COUNT;
+import static android.icu.cts.AndroidJUnitRunnerConstants.ARGUMENT_DEBUG;
+import static android.icu.cts.AndroidJUnitRunnerConstants.ARGUMENT_LOG_ONLY;
+import static android.icu.cts.AndroidJUnitRunnerConstants.ARGUMENT_TEST_CLASS;
+import static android.icu.cts.AndroidJUnitRunnerConstants.ARGUMENT_TEST_FILE;
/**
* A drop-in replacement for AndroidJUnitTestRunner, which understands the same arguments, and has
@@ -47,229 +57,142 @@
*/
public final class IcuTestRunner extends Instrumentation {
- private static final String TAG = "IcuTestRunner";
+ public static final String TAG = "IcuTestRunner";
- /**
- * The names of the file containing the names of the tests to run.
- *
- * <p>This is an internal constant used within
- * {@code android.support.test.internal.runner.RunnerArgs}, which is used on both the server
- * and client side. The constant is used when there are too many test names to pass on the
- * command line, in which case they are stored in a file that is pushed to the device and then
- * the location of that file is passed in this argument. The {@code RunnerArgs} on the client
- * will read the contents of that file in order to retrieve the list of names and then return
- * that to its client without the client being aware of how that was done.
- */
- private static final String ARGUMENT_TEST_FILE = "testFile";
-
- /**
- * A comma separated list of the names of test classes to run.
- *
- * <p>The equivalent constant in {@code InstrumentationTestRunner} is hidden and so not
- * available through the public API.
- */
- private static final String ARGUMENT_TEST_CLASS = "class";
-
- /**
- * Log the results as if the tests were executed but don't actually run the tests.
- *
- * <p>The equivalent constant in {@code InstrumentationTestRunner} is private.
- */
- private static final String ARGUMENT_LOG_ONLY = "log";
-
- /**
- * Wait for the debugger before starting.
- *
- * <p>There is no equivalent constant in {@code InstrumentationTestRunner} but the string is
- * used within that class.
- */
- private static final String ARGUMENT_DEBUG = "debug";
-
- /**
- * Only count the number of tests to run.
- *
- * <p>There is no equivalent constant in {@code InstrumentationTestRunner} but the string is
- * used within that class.
- */
- private static final String ARGUMENT_COUNT = "count";
-
- /**
- * Token representing how long (in seconds) the current test took to execute.
- *
- * <p>The equivalent constant in {@code InstrumentationTestRunner} is private.
- */
- private static final String REPORT_KEY_RUNTIME = "runtime";
-
- /**
- * An identifier for tests run using this class.
- */
- private static final String REPORT_VALUE_ID = "IcuTestRunner";
-
- /**
- * The name of a non-existent method for the sake of having a method name. This is required
- * because cts-tradefed needs to know which method on the test framework to run, but we don't
- * have that information, so we use this placeholder instead.
- */
- private static final String DUMMY_METHOD_NAME = "run-everything";
-
- /** Wait for the debugger before starting the tests. */
- private boolean debug;
+ private static final List<String> EXPECTATIONS_PATHS =
+ Collections.singletonList("expectations/icu-known-failures.txt");
/** Only count the number of tests, and not run them. */
private boolean testCountOnly;
- /** Only logOnly the number of tests, and not run them. */
+ /** Only log the number of tests, and not run them. */
private boolean logOnly;
- /** Contains all the wrapped ICU tests to be run in this invocation. */
- private Set<IcuTestUtils.IcuTestWrapper> tests;
+ /**
+ * The container for any test expectations.
+ */
+ @Nullable
+ private ExpectationStore expectationStore;
+
+ /**
+ * The list of tests to run.
+ */
+ private IcuTestList icuTestList;
@Override
public void onCreate(Bundle args) {
super.onCreate(args);
- Log.d(TAG, "In OnCreate");
- this.debug = args.getBoolean(ARGUMENT_DEBUG);
- this.testCountOnly = args.getBoolean(ARGUMENT_COUNT);
+ boolean debug = args.getBoolean(ARGUMENT_DEBUG);
+ if (debug) {
+ Log.i(TAG, "Waiting for debugger to connect...");
+ Debug.waitForDebugger();
+ Log.i(TAG, "Debugger connected.");
+ }
+
+ // Log the message only after getting a value from the args so that the args are
+ // unparceled.
+ Log.d(TAG, "In OnCreate: " + args);
+
this.logOnly = "true".equalsIgnoreCase(args.getString(ARGUMENT_LOG_ONLY));
+ this.testCountOnly = args.getBoolean(ARGUMENT_COUNT);
- // The test can be run specifying a list of classes to run, or as cts-tradefed does it,
+ try {
+ Set<String> expectationResources = new LinkedHashSet<>(EXPECTATIONS_PATHS);
+ expectationStore = ExpectationStore.parseResources(
+ getClass(), expectationResources, ModeId.DEVICE);
+ } catch (IOException e) {
+ Log.e(TAG, "Could not initialize ExpectationStore: ", e);
+ }
+
+ // The test can be run specifying a list of tests to run, or as cts-tradefed does it,
// by passing a fileName with a test to run on each line.
- List<String> classList;
+ List<String> testNameList;
String arg;
if ((arg = args.getString(ARGUMENT_TEST_FILE)) != null) {
// The tests are specified in a file.
try {
- classList = readTestsFromFile(arg);
+ testNameList = readTestsFromFile(arg);
} catch (IOException err) {
finish(Activity.RESULT_CANCELED, new Bundle());
return;
}
} else if ((arg = args.getString(ARGUMENT_TEST_CLASS)) != null) {
// The tests are specified in a String passed in the bundle.
- String[] classes = args.getString(arg).split(",");
- classList = new ArrayList<>(Arrays.asList(classes));
+ String[] tests = arg.split(",");
+ testNameList = Arrays.asList(tests);
} else {
// null means the runner should run all tests.
- classList = null;
+ testNameList = null;
}
- // Use all classes if a set isn't provided
- if (classList == null) {
- tests = IcuTestUtils.createTestAllWrappers();
- Log.d(TAG, "Running all tests");
- } else {
- tests = IcuTestUtils.createTestWrappers(classList);
- Log.d(TAG, "Running the following tests:" + classList);
- }
+ icuTestList = new IcuTestList(testNameList);
+
start();
}
@Override
public void onStart() {
- if (debug) {
- Debug.waitForDebugger();
- }
- int testCount = tests.size();
- if (testCountOnly) {
- Log.d(TAG, "test count only: " + testCount);
- Bundle testCountResult = new Bundle();
- testCountResult.putString(REPORT_KEY_IDENTIFIER, REPORT_VALUE_ID);
- testCountResult.putInt(REPORT_KEY_NUM_TOTAL, testCount);
- finish(Activity.RESULT_OK, testCountResult);
- return;
- }
-
- Log.d(TAG, "Running " + testCount + " tests");
-
- int totalSuccess = 0;
- int totalFailures = 0;
- List<String> failedClasses = new LinkedList<>();
-
- for (IcuTestUtils.IcuTestWrapper testWrapper : tests) {
- String className = testWrapper.getTestClassName() + '\n';
-
- Bundle currentTestResult = sendStartTestInfo(className, totalSuccess + totalFailures);
-
- StringBuilder result = new StringBuilder();
- try {
- StringWriter logs = new StringWriter();
- Log.d(TAG, "Executing test: " + className);
- long startTime = System.currentTimeMillis();
- int resultCode;
- if (logOnly) {
- resultCode = 0;
- } else {
- resultCode = testWrapper.call(new PrintWriter(logs));
- }
- long timeTaken = System.currentTimeMillis() - startTime;
- currentTestResult.putFloat(REPORT_KEY_RUNTIME, timeTaken / 1000);
- String logString = logs.toString();
- if (resultCode != 0) {
- totalFailures++;
- failedClasses.add(className);
- // Include the detailed logs from ICU as the stack trace.
- currentTestResult.putString(REPORT_KEY_STACK, logString);
- // Also append the logs to the console output.
- result.append("Failure: ").append(className).append(logString);
- currentTestResult.putString(REPORT_KEY_STREAMRESULT, result.toString());
- sendStatus(REPORT_VALUE_RESULT_ERROR, currentTestResult);
- } else {
- totalSuccess++;
- result.append("Success: ").append(className).append(logString);
- currentTestResult.putString(REPORT_KEY_STREAMRESULT, result.toString());
- sendStatus(REPORT_VALUE_RESULT_OK, currentTestResult);
- }
- result.append("Total time taken: ").append(timeTaken).append("ms\n");
- } catch (Exception e) {
- StringWriter stackTraceWriter = new StringWriter();
- e.printStackTrace(new PrintWriter(stackTraceWriter));
- String stackTrace = stackTraceWriter.toString();
- String message = "Test code threw exception: " + stackTrace + '\n';
- currentTestResult.putString(REPORT_KEY_STACK, message);
- result.append(message);
- sendStatus(REPORT_VALUE_RESULT_ERROR, currentTestResult);
- }
- }
- Bundle results = new Bundle();
- if (totalFailures == 0) {
- results.putString(REPORT_KEY_STREAMRESULT, "All " + totalSuccess + " tests passed.");
+ if (logOnly || testCountOnly) {
+ Log.d(TAG, "Counting/logging tests only");
} else {
- String report = "Failures " + totalFailures + '\n';
- for (String classname : failedClasses) {
- report += classname + '\n';
+ Log.d(TAG, "Running tests");
+ }
+
+ IcuRunnerParams icuRunnerParams = new IcuRunnerParams(logOnly || testCountOnly);
+
+ JUnitCore core = new JUnitCore();
+
+ Request request;
+ int totalTestCount;
+ try {
+ RunnerBuilder runnerBuilder = new IcuTestRunnerBuilder(icuRunnerParams);
+ Class[] classes = icuTestList.getClassesToRun();
+ Runner suite = new Computer().getSuite(runnerBuilder, classes);
+
+ if (suite instanceof Filterable) {
+ Filterable filterable = (Filterable) suite;
+
+ // Filter out all the tests that are expected to fail.
+ Filter filter = new IcuTestFilter(icuTestList, expectationStore);
+
+ try {
+ filterable.filter(filter);
+ } catch (NoTestsRemainException e) {
+ // Sometimes filtering will remove all tests but we do not care about that.
+ }
}
- results.putString(REPORT_KEY_STREAMRESULT, report);
+
+ request = Request.runner(suite);
+
+ // Get the total number of tests.
+ totalTestCount = suite.testCount();
+
+ } catch (InitializationError e) {
+ throw new RuntimeException("Could not create a suite", e);
+ }
+
+ IcuRunListener icuRunListener = new IcuRunListener(this, icuRunnerParams, totalTestCount);
+ core.addListener(icuRunListener);
+ core.run(request);
+
+ Bundle results;
+ if (testCountOnly) {
+ results = icuRunListener.getCountResults();
+ Log.d(TAG, "test count only: " + results);
+ } else {
+ // Get the final results to send back.
+ results = icuRunListener.getFinalResults();
}
Log.d(TAG, "Finished");
finish(Activity.RESULT_OK, results);
}
-
- /**
- * Send an update to the test runner informing it we are starting a test. If this is not run
- * then the test runner will think the test was never run, and mark it as failed.
- * @param className The name of the class being tested. Note in this CTS-ICU interoperability
- * layer, there is no method names, as we only support running whole classes.
- * @return A bundle containing test class, method (dummy), and report name. This bundle has
- * been sent back to the host.
- */
- private Bundle sendStartTestInfo(String className, int testNum) {
- Bundle data = new Bundle();
- data.putString(REPORT_KEY_IDENTIFIER, REPORT_VALUE_ID);
- data.putInt(REPORT_KEY_NUM_TOTAL, 1);
- data.putInt(REPORT_KEY_NUM_CURRENT, testNum);
- data.putString(REPORT_KEY_NAME_CLASS, className);
- // Dummy method to work with cts.
- data.putString(REPORT_KEY_NAME_TEST, DUMMY_METHOD_NAME);
- sendStatus(REPORT_VALUE_RESULT_START, data);
- return data;
- }
-
/**
* Read tests from a specified file.
+ *
* @return class names of tests. If there was an error reading the file, null is returned.
*/
private static List<String> readTestsFromFile(String fileName) throws IOException {
diff --git a/tests/tests/icu/src/android/icu/cts/IcuTestUtils.java b/tests/tests/icu/src/android/icu/cts/IcuTestUtils.java
deleted file mode 100644
index 116a94b..0000000
--- a/tests/tests/icu/src/android/icu/cts/IcuTestUtils.java
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.icu.cts;
-
-import com.ibm.icu.dev.test.TestFmwk;
-
-import java.io.PrintWriter;
-import java.lang.reflect.Field;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * A thin wrapper around ICU's tests, and utilities to resolve them.
- */
-final class IcuTestUtils {
-
- /**
- * The field on TestGroup which has the list of classes in it.
- */
- private static final Field classesToTestField = getField("names");
-
- /**
- * The field on TestGroup which has the default package in it.
- */
- private static final Field defaultPackageField = getField("defaultPackage");
-
- private static Field getField(String name) {
- // Find the field, and complain if it is not where it's expected to be.
- try {
- Field field = TestFmwk.TestGroup.class.getDeclaredField(name);
- field.setAccessible(true); // It's private by default.
- return field;
- } catch (NoSuchFieldException nsfe) {
- throw new RuntimeException("Class structure of ICU tests have changed.", nsfe);
- }
- }
-
- // Instances of this class shouldn't be made.
- private IcuTestUtils() {}
-
- /**
- * Resolve the individual ICU tests from a base test class which must implement TestFmwk.
- * A TestGroup class in ICU has a private String[] containing all the class names which
- * are run when the TestGroup is run.
- *
- * @param parent the base class to start looking at.
- */
- public static Set<IcuTestWrapper> getBaseTests(Class<?> parent)
- throws InstantiationException, IllegalAccessException {
-
- Set<IcuTestWrapper> tests = new HashSet<>();
-
- // If the parent class is an instance of TestGroup, then it will have a String[] classes
- // field which tells us where we need to go looking for the base test classes. We can then
- // recursively call this method which will resolve the base classes from the classes we
- // have discovered in that field.
- if (TestFmwk.TestGroup.class.isAssignableFrom(parent)) {
- TestFmwk.TestGroup testGroup = (TestFmwk.TestGroup) parent.newInstance();
- String[] classNames = (String[]) classesToTestField.get(testGroup);
- String defaultPackage = (String) defaultPackageField.get(testGroup);
-
- for (String className : classNames) {
- // Handle relative class names.
- if (!className.contains(".")) {
- className = defaultPackage + className;
- }
- try {
- /* Get the children through a recursive call, and add to sets. */
- tests.addAll(getBaseTests(Class.forName(className)));
- } catch (ClassNotFoundException cnfe) {
- // We make sure to add any failures to find a test, in a way that will cause
- // that test to fail. This is to make sure that the user is properly
- // informed that the test was not run.
- tests.add(new FailTest(className, cnfe));
- }
- }
-
- } else if (TestFmwk.class.isAssignableFrom(parent)) {
- // Otherwise, if the parent class is instead an instance of TestFmwk instead, this
- // will be a base test. We can simply add parent to the set of classes and return.
- tests.add(new IcuTestAdapter(parent));
- }
-
- return tests;
- }
-
- /**
- * Resolve all the ICU tests and return a set of IcuTestWrappers which will run them.
- * See {@link IcuTestUtils#createTestWrappers(Iterable<String>)}.
- */
- public static Set<IcuTestWrapper> createTestAllWrappers() {
- return createTestWrappers(Collections.singleton("com.ibm.icu.dev.test.TestAll"));
- }
-
- /**
- * Resolves a set of tests in ICU from a list of class names. These class names should reference
- * classes under the classpath com.ibm.icu.dev.test.* and extend TestFmwk (the ICU base test
- * class). This will return a set of individual tests, any TestGroup's found will be recursively
- * processed to extract base classes out of them, and those tests wrapped for running.
- * @return A set of test wrappers which can be run to determine the test outcome.
- */
- public static Set<IcuTestWrapper> createTestWrappers(Iterable<String> classNames) {
- Set<IcuTestWrapper> wrappedSet = new HashSet<>();
-
- for (String className : classNames) {
- // Work around the limitation of CTS where a test method must be provided. We only
- // support running classes in ICU, so discard the mock test method.
- if (className.contains("#")) {
- className = className.substring(0, className.indexOf("#"));
- }
- try {
- wrappedSet.addAll(getBaseTests(Class.forName(className)));
- } catch (ClassNotFoundException cnfe) {
- /* Failure to resolve the base class */
- wrappedSet.add(new FailTest(className, cnfe));
- } catch (InstantiationException | IllegalAccessException e) {
- /* An error while finding the classes */
- wrappedSet.add(new FailTest(className,
- new RuntimeException("Error finding test classes: " + e)));
- }
- }
- return wrappedSet;
- }
-
-
- /**
- * A common interface for wrapping tests to be run with IcuTestRunner.
- */
- public interface IcuTestWrapper {
- /**
- * Returns true if there was an error fetching or resolving this test.
- * Otherwise, the test is ready to be run and this returns false.
- */
- boolean isError();
-
- /**
- * Returns the ICU class that this test will call through to.
- */
- String getTestClassName();
-
- /**
- * Execute the test and provide the return code.
- * 0 means that the test was successfully run.
- */
- int call(PrintWriter pw) throws Exception;
- }
-
- /**
- * Wrapper around failure to resolve a specified ICU test class.
- * This could be due to a class not being resolved, which was
- * specified in the ICU test suite, a user provided class which
- * could not be found, or an error in instantiating the class.
- */
- private static class FailTest implements IcuTestWrapper {
-
- public FailTest(String attemptedClassName, Exception error) {
- this.error = error;
- this.className = attemptedClassName;
- }
-
- private String className;
- private Exception error;
-
- public String getTestClassName() {
- return className;
- }
-
- public boolean isError() {
- return true;
- }
-
- public int call(PrintWriter unused) throws Exception {
- throw error;
- }
- }
-
- /**
- * Wrap an ICU test class and override the run method so we can handle executing the test and
- * extracting the return code, output stream, and any exceptions.
- */
- private static class IcuTestAdapter implements IcuTestWrapper {
-
- /**
- * Fully qualified name of the test class.
- */
- private final String name;
-
- /**
- * Class object from which the test will be instantiated and run.
- */
- private final Class<?> icuTestClass;
-
- public IcuTestAdapter(Class<?> testClass) {
- if (!TestFmwk.class.isAssignableFrom(testClass)) {
- throw new IllegalArgumentException("There was an error in the testing framework."
- + "A test class was found which is not an instance of TestFmwk: "
- + testClass);
- }
-
- this.name = testClass.getCanonicalName();
- this.icuTestClass = testClass;
- }
-
- @Override
- public boolean isError() {
- return false;
- }
-
- @Override
- public String getTestClassName() {
- return this.name;
- }
-
- @Override
- public int call(PrintWriter pw) {
- try {
- TestFmwk instance = (TestFmwk) icuTestClass.newInstance();
- return instance.run(new String[]{}, pw);
-
- } catch (IllegalAccessException | InstantiationException iae) {
- throw new RuntimeException("Failed to create test class: " + icuTestClass);
- }
- }
- }
-
-}
diff --git a/tests/tests/icu/src/android/icu/cts/junit/ErrorReportingRunner.java b/tests/tests/icu/src/android/icu/cts/junit/ErrorReportingRunner.java
new file mode 100644
index 0000000..cfa5962
--- /dev/null
+++ b/tests/tests/icu/src/android/icu/cts/junit/ErrorReportingRunner.java
@@ -0,0 +1,74 @@
+package android.icu.cts.junit;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Collections;
+import java.util.List;
+import org.junit.runner.Description;
+import org.junit.runner.Runner;
+import org.junit.runner.notification.Failure;
+import org.junit.runner.notification.RunNotifier;
+import org.junit.runners.model.InitializationError;
+
+/**
+ * A copy of the JUnit 4.10 {@link org.junit.internal.runners.ErrorReportingRunner} class that
+ * allows the class in error to be specified by name rather than {@link Class} object so that it
+ * can be used for when the class could not be found.
+ */
+class ErrorReportingRunner extends Runner {
+
+ private final List<Throwable> fCauses;
+
+ private final String fTestClassName;
+
+ public ErrorReportingRunner(String testClassName, Throwable cause) {
+ fTestClassName = testClassName;
+ fCauses = getCauses(cause);
+ }
+
+ @Override
+ public Description getDescription() {
+ // Describe this as <class>#initializationError so that it can be filtered by
+ // expectations.
+ Description description = Description.createSuiteDescription(
+ String.format("%s(%s)", "initializationError", fTestClassName));
+ int count = fCauses.size();
+ for (int i = 0; i < count; i++) {
+ description.addChild(describeCause(i));
+ }
+ return description;
+ }
+
+ @Override
+ public void run(RunNotifier notifier) {
+ for (int i = 0; i < fCauses.size(); i++) {
+ Throwable each = fCauses.get(i);
+ runCause(each, i, notifier);
+ }
+ }
+
+ @SuppressWarnings("deprecation")
+ private List<Throwable> getCauses(Throwable cause) {
+ if (cause instanceof InvocationTargetException) {
+ return getCauses(cause.getCause());
+ }
+ if (cause instanceof InitializationError) {
+ return ((InitializationError) cause).getCauses();
+ }
+ if (cause instanceof org.junit.internal.runners.InitializationError) {
+ return ((org.junit.internal.runners.InitializationError) cause).getCauses();
+ }
+ return Collections.singletonList(cause);
+ }
+
+ private Description describeCause(int i) {
+ return Description.createSuiteDescription(
+ String.format("%s(%s)", "cause" + (i == 0 ? "" : "-" + i), fTestClassName));
+ }
+
+ private void runCause(Throwable child, int i, RunNotifier notifier) {
+ Description description = describeCause(i);
+ notifier.fireTestStarted(description);
+ notifier.fireTestFailure(new Failure(description, child));
+ notifier.fireTestFinished(description);
+ }
+}
diff --git a/tests/tests/icu/src/android/icu/cts/junit/ICUTestFailedException.java b/tests/tests/icu/src/android/icu/cts/junit/ICUTestFailedException.java
new file mode 100644
index 0000000..0e9f045
--- /dev/null
+++ b/tests/tests/icu/src/android/icu/cts/junit/ICUTestFailedException.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.icu.cts.junit;
+
+/**
+ * An exception used to tunnel extra failure information from a failing test to
+ * {@link android.icu.cts.IcuRunListener}
+ */
+public class ICUTestFailedException extends Exception {
+
+ /**
+ * The number of errors found within the test.
+ *
+ * <p>The ICU test framework differs from JUnit as an individual test can continue after an
+ * error is encountered, this field keeps track of the number of errors encountered.
+ */
+ private final int errorCount;
+
+ /**
+ * The output from the test itself.
+ */
+ private final String information;
+
+ public ICUTestFailedException(String message, int errorCount, String information) {
+ super(message);
+ this.errorCount = errorCount;
+ this.information = information;
+ }
+
+ public int getErrorCount() {
+ return errorCount;
+ }
+
+ public String getInformation() {
+ return information;
+ }
+}
diff --git a/tests/tests/icu/src/android/icu/cts/junit/IcuFrameworkTest.java b/tests/tests/icu/src/android/icu/cts/junit/IcuFrameworkTest.java
new file mode 100644
index 0000000..e0c18b2
--- /dev/null
+++ b/tests/tests/icu/src/android/icu/cts/junit/IcuFrameworkTest.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.icu.cts.junit;
+
+import com.ibm.icu.dev.test.TestFmwk;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import javax.annotation.Nullable;
+import org.junit.runner.Description;
+
+/**
+ * Represents a test within a {@link TestFmwk} class.
+ */
+class IcuFrameworkTest {
+
+ private static final String[] EMPTY_ARGS = new String[0];
+
+ private static final Pattern EXTRACT_ERROR_INFO = Pattern.compile(
+ "^[A-Za-z0-9_]+ \\{\n [A-Za-z0-9_]+ \\{\n (.*)\n \\}.*", Pattern.DOTALL);
+
+ private static final Pattern CONTAINS_WARNING = Pattern.compile(
+ "^ *Warning: ", Pattern.MULTILINE);
+
+ /**
+ * The {@link TestFmwk} instance on which the tests will be run.
+ */
+ private final TestFmwk testFmwk;
+
+ /**
+ * The name of the individual test to run, if null then all tests in the class will be run.
+ */
+ @Nullable
+ private final String methodName;
+
+ IcuFrameworkTest(TestFmwk testFmwk, @Nullable String methodName) {
+ this.testFmwk = testFmwk;
+ this.methodName = methodName;
+ }
+
+ @Nullable
+ public String getMethodName() {
+ return methodName;
+ }
+
+ /**
+ * Runs the target.
+ */
+ public void run() throws ICUTestFailedException {
+ test_for_TestFmwk_Run();
+ }
+
+ /**
+ * A special method to avoid the TestFmwk from throwing an InternalError when an error occurs
+ * during execution of the test but outside the actual test method, e.g. in a
+ * {@link TestFmwk#validate()} method. See http://bugs.icu-project.org/trac/ticket/12183
+ *
+ * <p>DO NOT CHANGE THE NAME
+ */
+ private void test_for_TestFmwk_Run() throws ICUTestFailedException {
+ String[] args;
+ if (methodName != null) {
+ args = new String[] {methodName};
+ } else {
+ args = EMPTY_ARGS;
+ }
+
+ StringWriter stringWriter = new StringWriter();
+ PrintWriter log = new PrintWriter(stringWriter);
+ int errorCount = testFmwk.run(args, log);
+
+ // Ensure that all data is written to the StringWriter.
+ log.flush();
+
+ // Treat warnings as errors.
+ String information = stringWriter.toString();
+ if (errorCount != 0 || CONTAINS_WARNING.matcher(information).find()) {
+ if (methodName != null) {
+ Matcher matcher = EXTRACT_ERROR_INFO.matcher(information);
+ if (matcher.matches()) {
+ information = matcher.group(1).replace("\n ", "\n");
+ }
+ }
+ throw new ICUTestFailedException("ICU test failed: " + getDescription(),
+ Math.min(1, errorCount), information);
+ }
+ }
+
+ /**
+ * Get the JUnit {@link Description}
+ */
+ public Description getDescription() {
+ if (methodName == null) {
+ // Get a description for all the targets. Use a fake method name to differentiate the
+ // description from one for the whole class and allow the tests to be matched by
+ // expectations.
+ return Description.createTestDescription(testFmwk.getClass(), "run-everything");
+ } else {
+ // Get a description for the specific method within the class.
+ return Description.createTestDescription(testFmwk.getClass(), methodName);
+ }
+ }
+}
diff --git a/tests/tests/icu/src/android/icu/cts/junit/IcuRunnerParams.java b/tests/tests/icu/src/android/icu/cts/junit/IcuRunnerParams.java
new file mode 100644
index 0000000..369b672
--- /dev/null
+++ b/tests/tests/icu/src/android/icu/cts/junit/IcuRunnerParams.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.icu.cts.junit;
+
+/**
+ * Encapsulates options passed to {@link IcuTestFmwkRunner}.
+ */
+public class IcuRunnerParams {
+
+ /**
+ * True if the tests should not actually be executed, false otherwise.
+ */
+ private final boolean skipExecution;
+
+ public static IcuRunnerParams getDefaultParams() {
+ return new IcuRunnerParams(false);
+ }
+
+ public IcuRunnerParams(boolean skipExecution) {
+ this.skipExecution = skipExecution;
+ }
+
+ public boolean getSkipExecution() {
+ return skipExecution;
+ }
+}
diff --git a/tests/tests/icu/src/android/icu/cts/junit/IcuTestFmwkRunner.java b/tests/tests/icu/src/android/icu/cts/junit/IcuTestFmwkRunner.java
new file mode 100644
index 0000000..9b33094
--- /dev/null
+++ b/tests/tests/icu/src/android/icu/cts/junit/IcuTestFmwkRunner.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.icu.cts.junit;
+
+import com.ibm.icu.dev.test.TestFmwk;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import org.junit.runner.Description;
+import org.junit.runner.notification.RunNotifier;
+import org.junit.runners.model.Statement;
+
+/**
+ * A {@link org.junit.runner.Runner} that can be used to run a class that is a {@link TestFmwk}
+ * but not a {@link com.ibm.icu.dev.test.TestFmwk.TestGroup}
+ */
+public class IcuTestFmwkRunner extends IcuTestParentRunner<IcuFrameworkTest> {
+
+ /**
+ * A {@link Statement} that does nothing, used when skipping execution.
+ */
+ private static final Statement EMPTY_STATEMENT = new Statement() {
+ @Override
+ public void evaluate() throws Throwable {
+ }
+ };
+
+ private final IcuRunnerParams icuRunnerParams;
+
+ private final List<IcuFrameworkTest> tests;
+
+ /**
+ * The constructor used when this class is used with {@code @RunWith(...)}.
+ */
+ public IcuTestFmwkRunner(Class<?> testClass)
+ throws Exception {
+ this(checkClass(testClass), IcuRunnerParams.getDefaultParams());
+ }
+
+ /**
+ * Make sure that the supplied test class is supported by this.
+ */
+ private static Class<? extends TestFmwk> checkClass(Class<?> testClass) {
+ if (!TestFmwk.class.isAssignableFrom(testClass)) {
+ throw new IllegalStateException(
+ "Cannot use " + IcuTestFmwkRunner.class + " for running "
+ + testClass + " as it is not a " + TestFmwk.class);
+ }
+ if (TestFmwk.TestGroup.class.isAssignableFrom(testClass)) {
+ throw new IllegalStateException(
+ "Cannot use " + IcuTestFmwkRunner.class + " for running "
+ + testClass + " as it is a " + TestFmwk.TestGroup.class
+ + ": Use @RunWith(" + IcuTestGroupRunner.class.getSimpleName()
+ + ".class) instead");
+ }
+
+ return testClass.asSubclass(TestFmwk.class);
+ }
+
+ IcuTestFmwkRunner(Class<? extends TestFmwk> testFmwkClass, IcuRunnerParams icuRunnerParams)
+ throws Exception {
+ super(testFmwkClass);
+
+ this.icuRunnerParams = icuRunnerParams;
+
+ // Create a TestFmwk and make sure that it's initialized properly.
+ TestFmwk testFmwk = TestFmwkUtils.newTestFmwkInstance(testFmwkClass);
+
+ tests = new ArrayList<>();
+
+ if (TestFmwkUtils.overridesGetTargetsMethod(testFmwkClass)) {
+ // A test that overrides the getTargets method cannot be trusted to run a single target
+ // at once so treat the whole class as a single test.
+ tests.add(new IcuFrameworkTest(testFmwk, null));
+ } else {
+ TestFmwk.Target target = TestFmwkUtils.getTargets(testFmwk);
+ while (target != null) {
+ String name = target.name;
+ // Just ignore targets that do not have a name, they are do nothing place holders.
+ if (name != null) {
+ tests.add(new IcuFrameworkTest(testFmwk, name));
+ }
+
+ target = target.getNext();
+ }
+ }
+
+ // Sort the methods to ensure consistent ordering.
+ Collections.sort(tests, new Comparator<IcuFrameworkTest>() {
+ @Override
+ public int compare(IcuFrameworkTest ft1, IcuFrameworkTest ft2) {
+ String m1 = ft1.getMethodName();
+ String m2 = ft2.getMethodName();
+ if (m1 == null || m2 == null) {
+ // This should never happen as there will only be one entry in the list if it is
+ // not a method target.
+ throw new IllegalStateException("Cannot compare two non method targets");
+ }
+ return m1.compareTo(m2);
+ }
+ });
+ }
+
+ @Override
+ protected List<IcuFrameworkTest> getChildren() {
+ return tests;
+ }
+
+ @Override
+ protected Description describeChild(IcuFrameworkTest child) {
+ return child.getDescription();
+ }
+
+ @Override
+ protected void runChild(final IcuFrameworkTest child, RunNotifier notifier) {
+ Description description = describeChild(child);
+ Statement statement;
+ if (icuRunnerParams.getSkipExecution()) {
+ statement = EMPTY_STATEMENT;
+ } else {
+ statement = new Statement() {
+ @Override
+ public void evaluate() throws Throwable {
+ child.run();
+ }
+ };
+ }
+ runLeaf(statement, description, notifier);
+ }
+}
diff --git a/tests/tests/icu/src/android/icu/cts/junit/IcuTestGroupRunner.java b/tests/tests/icu/src/android/icu/cts/junit/IcuTestGroupRunner.java
new file mode 100644
index 0000000..695b47d
--- /dev/null
+++ b/tests/tests/icu/src/android/icu/cts/junit/IcuTestGroupRunner.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.icu.cts.junit;
+
+import com.ibm.icu.dev.test.TestFmwk;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.runner.Description;
+import org.junit.runner.Runner;
+import org.junit.runner.notification.RunNotifier;
+import org.junit.runners.model.RunnerBuilder;
+
+/**
+ * A {@link org.junit.runner.Runner} that can be used to run a class that is a
+ * {@link TestFmwk.TestGroup} but not a {@link TestFmwk}
+ */
+public class IcuTestGroupRunner extends IcuTestParentRunner<Runner> {
+
+ private final List<Runner> runners;
+
+ /**
+ * The constructor used when this class is used with {@code @RunWith(...)}.
+ */
+ public IcuTestGroupRunner(Class<?> testClass, RunnerBuilder runnerBuilder)
+ throws Exception {
+ super(testClass);
+
+ Class<? extends TestFmwk.TestGroup> testGroupClass = checkClass(testClass);
+
+ // Create a TestGroup and make sure that it's initialized properly.
+ TestFmwk.TestGroup testGroup = TestFmwkUtils.newTestFmwkInstance(testGroupClass);
+
+ runners = new ArrayList<>();
+ List<String> classNames = TestFmwkUtils.getClassNames(testGroup);
+ ClassLoader classLoader = testGroupClass.getClassLoader();
+ for (String className : classNames) {
+ Runner runner;
+
+ try {
+ Class<?> childTestClass = Class.forName(className, false, classLoader);
+ runner = runnerBuilder.safeRunnerForClass(childTestClass);
+ } catch (ClassNotFoundException e) {
+ runner = new ErrorReportingRunner(className, e);
+ }
+
+ runners.add(runner);
+ }
+ }
+
+ /**
+ * Make sure that the supplied test class is supported by this.
+ */
+ private static Class<? extends TestFmwk.TestGroup> checkClass(Class<?> testClass) {
+ if (!TestFmwk.TestGroup.class.isAssignableFrom(testClass)) {
+ if (TestFmwk.class.isAssignableFrom(testClass)) {
+ throw new IllegalStateException(
+ "Cannot use " + IcuTestGroupRunner.class + " for running "
+ + testClass + " as it is a " + TestFmwk.class
+ + ": Use @RunWith(" + IcuTestFmwkRunner.class.getSimpleName()
+ + ".class) instead");
+ }
+ throw new IllegalStateException(
+ "Cannot use " + IcuTestGroupRunner.class + " for running "
+ + testClass + " as it is not a " + TestFmwk.TestGroup.class);
+ }
+
+ return testClass.asSubclass(TestFmwk.TestGroup.class);
+ }
+
+ @Override
+ protected List<Runner> getChildren() {
+ return runners;
+ }
+
+ @Override
+ protected Description describeChild(Runner child) {
+ return child.getDescription();
+ }
+
+ @Override
+ protected void runChild(Runner child, RunNotifier notifier) {
+ child.run(notifier);
+ }
+}
diff --git a/tests/tests/icu/src/android/icu/cts/junit/IcuTestParentRunner.java b/tests/tests/icu/src/android/icu/cts/junit/IcuTestParentRunner.java
new file mode 100644
index 0000000..28f511c
--- /dev/null
+++ b/tests/tests/icu/src/android/icu/cts/junit/IcuTestParentRunner.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.icu.cts.junit;
+
+import org.junit.runners.ParentRunner;
+import org.junit.runners.model.InitializationError;
+
+/**
+ * Extends {@link ParentRunner} to prevent it from trying to create an instance of
+ * {@link org.junit.runners.model.TestClass} for the supplied {@code testClass} because that
+ * requires that the {@code testClass} has only a single constructor and at least one ICU test
+ * ({@code com.ibm.icu.dev.test.serializable.CoverageTest}) has more than one constructor.
+ *
+ * <p>This provides a dummy class and overrides the {@link #getName()} method to return the
+ * correct name. The consequence of this is that it is not possible to use JUnit 4 annotations
+ * related to the class, like {@link org.junit.BeforeClass}, {@link org.junit.ClassRule}, etc.
+ */
+abstract class IcuTestParentRunner<T> extends ParentRunner<T> {
+
+ private final Class<?> testClass;
+
+ IcuTestParentRunner(Class<?> testClass) throws InitializationError {
+ super(DummyTestClass.class);
+ this.testClass = testClass;
+ }
+
+ @Override
+ protected String getName() {
+ return testClass.getName();
+ }
+
+ /**
+ * A dummy test class to pass to {@link ParentRunner} for it to validate and check for
+ * annotations.
+ *
+ * <p>Must be public.
+ */
+ public static class DummyTestClass {
+
+ }
+}
diff --git a/tests/tests/icu/src/android/icu/cts/junit/IcuTestRunnerBuilder.java b/tests/tests/icu/src/android/icu/cts/junit/IcuTestRunnerBuilder.java
new file mode 100644
index 0000000..d04ed23
--- /dev/null
+++ b/tests/tests/icu/src/android/icu/cts/junit/IcuTestRunnerBuilder.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.icu.cts.junit;
+
+import com.ibm.icu.dev.test.TestFmwk;
+import org.junit.runner.Runner;
+import org.junit.runners.model.RunnerBuilder;
+
+/**
+ * A {@link RunnerBuilder} used for running ICU test classes derived from {@link TestFmwk}.
+ */
+public class IcuTestRunnerBuilder extends RunnerBuilder {
+
+ private final IcuRunnerParams icuRunnerParams;
+
+ public IcuTestRunnerBuilder(IcuRunnerParams icuRunnerParams) {
+ this.icuRunnerParams = icuRunnerParams;
+ }
+
+ @Override
+ public Runner runnerForClass(Class<?> testClass) throws Throwable {
+ // Check for a TestGroup before a TestFmwk class as TestGroup is a subclass of TestFmwk
+ if (TestFmwk.TestGroup.class.isAssignableFrom(testClass)) {
+ return new IcuTestGroupRunner(testClass.asSubclass(TestFmwk.TestGroup.class), this);
+ }
+
+ if (TestFmwk.class.isAssignableFrom(testClass)) {
+ return new IcuTestFmwkRunner(testClass.asSubclass(TestFmwk.class), icuRunnerParams);
+ }
+
+ return null;
+ }
+}
diff --git a/tests/tests/icu/src/android/icu/cts/junit/TestFmwkUtils.java b/tests/tests/icu/src/android/icu/cts/junit/TestFmwkUtils.java
new file mode 100644
index 0000000..f3c1a8b
--- /dev/null
+++ b/tests/tests/icu/src/android/icu/cts/junit/TestFmwkUtils.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.icu.cts.junit;
+
+import com.ibm.icu.dev.test.TestFmwk;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Abstracts away reflection code that accesses various hidden fields and methods in the ICU test
+ * framework.
+ *
+ * <p>Assuming that this is integrated into ICU test framework itself then ideally the test
+ * framework will itself be modified to remove the need for this reflection at which point this
+ * class can be removed.
+ */
+class TestFmwkUtils {
+
+ /**
+ * The field on TestGroup which has the list of classes in it.
+ */
+ private static final Field classesToTestField = getField(TestFmwk.TestGroup.class, "names");
+
+ /**
+ * The field on TestGroup which has the default package in it.
+ */
+ private static final Field defaultPackageField =
+ getField(TestFmwk.TestGroup.class, "defaultPackage");
+
+ /**
+ * The field on TestFmwk which has the {@link com.ibm.icu.dev.test.TestFmwk.TestParams} in it.
+ */
+ private static final Field paramsField = getField(TestFmwk.class, "params");
+
+ private static final Method getTargetsMethod = getTargetsMethod();
+
+ private static Field getField(Class<?> theClass, String name) {
+ // Find the field, and complain if it is not where it's expected to be.
+ try {
+ Field field = theClass.getDeclaredField(name);
+ field.setAccessible(true); // It's private by default.
+ return field;
+ } catch (NoSuchFieldException e) {
+ throw new RuntimeException("Class structure of ICU tests have changed.", e);
+ }
+ }
+
+ private static Method getTargetsMethod() {
+ try {
+ Method method = TestFmwk.class.getDeclaredMethod("getTargets", String.class);
+ method.setAccessible(true);
+ return method;
+ } catch (NoSuchMethodException e) {
+ throw new RuntimeException("Class structure of ICU tests have changed.", e);
+ }
+ }
+
+ public static TestFmwk.Target getTargets(TestFmwk testFmwk) {
+ return test_for_TestFmwk_GetTargets(testFmwk);
+ }
+
+ /**
+ * A special method to avoid the TestFmwk from throwing an InternalError when an error occurs
+ * during execution of the test but outside the actual test method, e.g. in a
+ * {@link TestFmwk#validate()} method. See http://bugs.icu-project.org/trac/ticket/12183
+ *
+ * <p>DO NOT CHANGE THE NAME
+ */
+ private static TestFmwk.Target test_for_TestFmwk_GetTargets(TestFmwk testFmwk) {
+ try {
+ return (TestFmwk.Target) getTargetsMethod.invoke(testFmwk, new Object[] {null});
+ } catch (InvocationTargetException | IllegalAccessException e) {
+ throw new IllegalStateException(
+ "Problem calling getTargets(null) on " + testFmwk, e);
+ }
+ }
+
+ public static <T extends TestFmwk> T newTestFmwkInstance(Class<? extends T> testFmwkClass)
+ throws IllegalAccessException, InstantiationException {
+ // Create a TestFmwk and make sure that it's params field is initialized.
+ T testFmwk = testFmwkClass.newInstance();
+ TestFmwk.TestParams testParams = TestFmwk.TestParams.create(new String[0], null);
+ paramsField.set(testFmwk, testParams);
+ return testFmwk;
+ }
+
+ private static boolean hasGetTargetsMethod(Class<?> clazz) {
+ try {
+ clazz.getDeclaredMethod("getTargets", String.class);
+ return true;
+ } catch (NoSuchMethodException e) {
+ return false;
+ }
+ }
+
+ public static boolean overridesGetTargetsMethod(Class<?> testFmwkClass) {
+ while (testFmwkClass != TestFmwk.class && testFmwkClass != Object.class) {
+ if (hasGetTargetsMethod(testFmwkClass)) {
+ return true;
+ }
+
+ testFmwkClass = testFmwkClass.getSuperclass();
+ }
+
+ return false;
+ }
+
+ public static List<String> getClassNames(TestFmwk.TestGroup testGroup) {
+ try {
+ String[] classNames = (String[]) classesToTestField.get(testGroup);
+ String defaultPackage = (String) defaultPackageField.get(testGroup);
+
+ List<String> list = new ArrayList<>(classNames.length);
+ for (String basicName : classNames) {
+ // Handle relative class names.
+ String fullyQualifiedName;
+ if (basicName.contains(".")) {
+ fullyQualifiedName = basicName;
+ } else {
+ fullyQualifiedName = defaultPackage + basicName;
+ }
+
+ list.add(fullyQualifiedName);
+ }
+
+ // Sort to ensure consistent ordering.
+ Collections.sort(list);
+
+ return list;
+ } catch (IllegalAccessException e) {
+ throw new IllegalStateException("Problem getting class names from " + testGroup, e);
+ }
+ }
+}
diff --git a/tests/tests/icu/src/android/icu/cts/junit/package-info.java b/tests/tests/icu/src/android/icu/cts/junit/package-info.java
new file mode 100644
index 0000000..f85be7c
--- /dev/null
+++ b/tests/tests/icu/src/android/icu/cts/junit/package-info.java
@@ -0,0 +1,10 @@
+/**
+ * Contains classes used to make ICU tests runnable by JUnit.
+ *
+ * <p>Ideally, this will be integrated into ICU itself and cleaned up so that ICU tests can be
+ * simply run using standard JUnit. e.g. ICU test classes will be annotated with
+ * {@code RunWith(IcuTestGroupRunner.class)} or {@code RunWith(IcuTestFmwkRunner.class)} depending
+ * on whether they extend {@link com.ibm.icu.dev.test.TestFmwk.TestGroup} or
+ * {@link com.ibm.icu.dev.test.TestFmwk}.
+ */
+package android.icu.cts.junit;
diff --git a/tests/tests/icu/test-list.txt b/tests/tests/icu/test-list.txt
new file mode 100644
index 0000000..163f780
--- /dev/null
+++ b/tests/tests/icu/test-list.txt
@@ -0,0 +1,2240 @@
+com.ibm.icu.dev.test.bidi.BiDiConformanceTest#TestBidiCharacterTest
+com.ibm.icu.dev.test.bidi.BiDiConformanceTest#TestBidiTest
+com.ibm.icu.dev.test.bidi.TestBidi#testBidi
+com.ibm.icu.dev.test.bidi.TestCharFromDirProp#testCharFromDirProp
+com.ibm.icu.dev.test.bidi.TestClassOverride#testClassOverride
+com.ibm.icu.dev.test.bidi.TestContext#testContext
+com.ibm.icu.dev.test.bidi.TestFailureRecovery#testFailureRecovery
+com.ibm.icu.dev.test.bidi.TestInverse#testInverse
+com.ibm.icu.dev.test.bidi.TestMultipleParagraphs#testMultipleParagraphs
+com.ibm.icu.dev.test.bidi.TestReorderArabicMathSymbols#testReorderArabicMathSymbols
+com.ibm.icu.dev.test.bidi.TestReorderingMode#testReorderingMode
+com.ibm.icu.dev.test.bidi.TestReorderRunsOnly#testReorderRunsOnly
+com.ibm.icu.dev.test.bidi.TestReorder#testReorder
+com.ibm.icu.dev.test.bidi.TestStreaming#testStreaming
+com.ibm.icu.dev.test.bigdec.DiagBigDecimal#TestBigDecimal
+com.ibm.icu.dev.test.calendar.AstroTest#TestBasics
+com.ibm.icu.dev.test.calendar.AstroTest#TestCoordinates
+com.ibm.icu.dev.test.calendar.AstroTest#TestCoverage
+com.ibm.icu.dev.test.calendar.AstroTest#TestLunarPosition
+com.ibm.icu.dev.test.calendar.AstroTest#TestMoonAge
+com.ibm.icu.dev.test.calendar.AstroTest#TestSolarLongitude
+com.ibm.icu.dev.test.calendar.AstroTest#TestSunriseTimes
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4031502
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4035301
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4040996
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4051765
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4059654
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4061476
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4070502
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4071197
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4071385
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4073929
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4083167
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4086724
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4092362
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4095407
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4096231
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4096539
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4100311
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4103271
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4106136
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4108764
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4114578
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4118384
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4125881
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4125892
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4136399
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4141665
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4142933
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4145158
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4145983
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4147269
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4149677
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4162587
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4165343
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4166109
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4167060
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4173516
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4174361
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4177484
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4197699
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4209071
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test4288792
+com.ibm.icu.dev.test.calendar.CalendarRegression#Test9019
+com.ibm.icu.dev.test.calendar.CalendarRegression#TestCalendarType6816
+com.ibm.icu.dev.test.calendar.CalendarRegression#TestDateFormatFactoryJ26
+com.ibm.icu.dev.test.calendar.CalendarRegression#TestGetKeywordValuesForLocale
+com.ibm.icu.dev.test.calendar.CalendarRegression#TestJ438
+com.ibm.icu.dev.test.calendar.CalendarRegression#TestJ9
+com.ibm.icu.dev.test.calendar.CalendarRegression#TestRegistration
+com.ibm.icu.dev.test.calendar.CalendarRegression#TestSerialization3474
+com.ibm.icu.dev.test.calendar.CalendarRegression#TestT5555
+com.ibm.icu.dev.test.calendar.CalendarRegression#TestT8057
+com.ibm.icu.dev.test.calendar.CalendarRegression#TestT8596
+com.ibm.icu.dev.test.calendar.CalendarRegression#TestT9403
+com.ibm.icu.dev.test.calendar.CalendarRegression#TestT9452
+com.ibm.icu.dev.test.calendar.CalendarRegression#TestT9968
+com.ibm.icu.dev.test.calendar.CalendarRegression#TestTimeStamp
+com.ibm.icu.dev.test.calendar.CalendarRegression#TestWeekendData_10560
+com.ibm.icu.dev.test.calendar.CalendarRegression#TestYearJump3279
+com.ibm.icu.dev.test.calendar.ChineseTest#Test6510
+com.ibm.icu.dev.test.calendar.ChineseTest#TestAdd
+com.ibm.icu.dev.test.calendar.ChineseTest#TestFormat
+com.ibm.icu.dev.test.calendar.ChineseTest#TestJulianDayMapping
+com.ibm.icu.dev.test.calendar.ChineseTest#TestLimits
+com.ibm.icu.dev.test.calendar.ChineseTest#TestMapping
+com.ibm.icu.dev.test.calendar.ChineseTest#TestOutOfRange
+com.ibm.icu.dev.test.calendar.ChineseTest#TestResolution
+com.ibm.icu.dev.test.calendar.ChineseTest#TestRoll
+com.ibm.icu.dev.test.calendar.ChineseTest#TestScratch
+com.ibm.icu.dev.test.calendar.ChineseTest#TestZeroDOM
+com.ibm.icu.dev.test.calendar.CompatibilityTest#TestActualMinMax
+com.ibm.icu.dev.test.calendar.CompatibilityTest#TestAdd520
+com.ibm.icu.dev.test.calendar.CompatibilityTest#TestAddAcrossOffsetTransitions
+com.ibm.icu.dev.test.calendar.CompatibilityTest#TestAddSetGet0610
+com.ibm.icu.dev.test.calendar.CompatibilityTest#TestAddSetOrder621
+com.ibm.icu.dev.test.calendar.CompatibilityTest#TestClonesUnique908
+com.ibm.icu.dev.test.calendar.CompatibilityTest#TestComputeJulianDay4406
+com.ibm.icu.dev.test.calendar.CompatibilityTest#TestDisambiguation765
+com.ibm.icu.dev.test.calendar.CompatibilityTest#TestDOW943
+com.ibm.icu.dev.test.calendar.CompatibilityTest#TestDOWProgression
+com.ibm.icu.dev.test.calendar.CompatibilityTest#TestEpochStartFields
+com.ibm.icu.dev.test.calendar.CompatibilityTest#TestFields060
+com.ibm.icu.dev.test.calendar.CompatibilityTest#TestFieldSet4781
+com.ibm.icu.dev.test.calendar.CompatibilityTest#TestGenericAPI
+com.ibm.icu.dev.test.calendar.CompatibilityTest#TestGMTvsLocal4064654
+com.ibm.icu.dev.test.calendar.CompatibilityTest#TestGregorianChange768
+com.ibm.icu.dev.test.calendar.CompatibilityTest#TestGregorianChangeover
+com.ibm.icu.dev.test.calendar.CompatibilityTest#TestMapping
+com.ibm.icu.dev.test.calendar.CompatibilityTest#TestRog
+com.ibm.icu.dev.test.calendar.CompatibilityTest#TestRoll
+com.ibm.icu.dev.test.calendar.CompatibilityTest#TestSecondsZero121
+com.ibm.icu.dev.test.calendar.CompatibilityTest#TestSerialize337
+com.ibm.icu.dev.test.calendar.CopticTest#Test6379
+com.ibm.icu.dev.test.calendar.CopticTest#TestAddSet
+com.ibm.icu.dev.test.calendar.CopticTest#TestBasic
+com.ibm.icu.dev.test.calendar.CopticTest#TestCases
+com.ibm.icu.dev.test.calendar.CopticTest#TestCopticToJD
+com.ibm.icu.dev.test.calendar.CopticTest#TestCoverage
+com.ibm.icu.dev.test.calendar.CopticTest#TestEraStart
+com.ibm.icu.dev.test.calendar.CopticTest#TestLimits
+com.ibm.icu.dev.test.calendar.CopticTest#TestYear
+com.ibm.icu.dev.test.calendar.DataDrivenCalendarTest#run-everything
+com.ibm.icu.dev.test.calendar.EthiopicTest#TestAddSet
+com.ibm.icu.dev.test.calendar.EthiopicTest#TestBasic
+com.ibm.icu.dev.test.calendar.EthiopicTest#TestCases
+com.ibm.icu.dev.test.calendar.EthiopicTest#TestCoverage
+com.ibm.icu.dev.test.calendar.EthiopicTest#TestEraStart
+com.ibm.icu.dev.test.calendar.EthiopicTest#TestJD
+com.ibm.icu.dev.test.calendar.EthiopicTest#TestLimits
+com.ibm.icu.dev.test.calendar.HebrewTest#Test1624
+com.ibm.icu.dev.test.calendar.HebrewTest#TestAdd
+com.ibm.icu.dev.test.calendar.HebrewTest#TestCases
+com.ibm.icu.dev.test.calendar.HebrewTest#TestCoverage
+com.ibm.icu.dev.test.calendar.HebrewTest#TestDefaultFieldValues
+com.ibm.icu.dev.test.calendar.HebrewTest#TestElulMonth
+com.ibm.icu.dev.test.calendar.HebrewTest#TestLimits
+com.ibm.icu.dev.test.calendar.HebrewTest#TestMonthMovement
+com.ibm.icu.dev.test.calendar.HebrewTest#TestMonthValidation
+com.ibm.icu.dev.test.calendar.HebrewTest#TestRoll
+com.ibm.icu.dev.test.calendar.HebrewTest#TestTimeFields
+com.ibm.icu.dev.test.calendar.HolidayTest#TestAPI
+com.ibm.icu.dev.test.calendar.HolidayTest#TestCoverage
+com.ibm.icu.dev.test.calendar.HolidayTest#TestDisplayName
+com.ibm.icu.dev.test.calendar.HolidayTest#TestEaster
+com.ibm.icu.dev.test.calendar.HolidayTest#TestIsOn
+com.ibm.icu.dev.test.calendar.IBMCalendarTest#TestAddAcrossZoneTransition
+com.ibm.icu.dev.test.calendar.IBMCalendarTest#TestAmbiguousWallTimeAPIs
+com.ibm.icu.dev.test.calendar.IBMCalendarTest#TestBuddhist
+com.ibm.icu.dev.test.calendar.IBMCalendarTest#TestBuddhistCoverage
+com.ibm.icu.dev.test.calendar.IBMCalendarTest#TestBuddhistLimits
+com.ibm.icu.dev.test.calendar.IBMCalendarTest#TestComparable
+com.ibm.icu.dev.test.calendar.IBMCalendarTest#TestCoverage
+com.ibm.icu.dev.test.calendar.IBMCalendarTest#TestFieldDifference
+com.ibm.icu.dev.test.calendar.IBMCalendarTest#TestGregorianLimits
+com.ibm.icu.dev.test.calendar.IBMCalendarTest#TestISO8601
+com.ibm.icu.dev.test.calendar.IBMCalendarTest#TestJapanese
+com.ibm.icu.dev.test.calendar.IBMCalendarTest#TestJB1684
+com.ibm.icu.dev.test.calendar.IBMCalendarTest#TestJB4541
+com.ibm.icu.dev.test.calendar.IBMCalendarTest#TestLeapFieldDifference
+com.ibm.icu.dev.test.calendar.IBMCalendarTest#TestMalaysianInstance
+com.ibm.icu.dev.test.calendar.IBMCalendarTest#TestRepeatedWallTime
+com.ibm.icu.dev.test.calendar.IBMCalendarTest#TestSkippedWallTime
+com.ibm.icu.dev.test.calendar.IBMCalendarTest#TestTaiwan
+com.ibm.icu.dev.test.calendar.IBMCalendarTest#TestTaiwanCoverage
+com.ibm.icu.dev.test.calendar.IBMCalendarTest#TestTaiwanLimits
+com.ibm.icu.dev.test.calendar.IBMCalendarTest#TestThaiDefault
+com.ibm.icu.dev.test.calendar.IBMCalendarTest#TestTimeZoneTransitionAdd
+com.ibm.icu.dev.test.calendar.IBMCalendarTest#TestTypes
+com.ibm.icu.dev.test.calendar.IBMCalendarTest#TestWeekData
+com.ibm.icu.dev.test.calendar.IBMCalendarTest#TestWeekend
+com.ibm.icu.dev.test.calendar.IBMCalendarTest#TestWeekShift
+com.ibm.icu.dev.test.calendar.IBMCalendarTest#TestZoneMeta
+com.ibm.icu.dev.test.calendar.IndianTest#TestBasic
+com.ibm.icu.dev.test.calendar.IndianTest#TestCases
+com.ibm.icu.dev.test.calendar.IndianTest#TestCoverage
+com.ibm.icu.dev.test.calendar.IndianTest#TestLimits
+com.ibm.icu.dev.test.calendar.IndianTest#TestYear
+com.ibm.icu.dev.test.calendar.IndianTest#TestYearEdge
+com.ibm.icu.dev.test.calendar.IslamicTest#Test7427
+com.ibm.icu.dev.test.calendar.IslamicTest#Test8822
+com.ibm.icu.dev.test.calendar.IslamicTest#TestBasic
+com.ibm.icu.dev.test.calendar.IslamicTest#TestCivilCases
+com.ibm.icu.dev.test.calendar.IslamicTest#TestCoverage
+com.ibm.icu.dev.test.calendar.IslamicTest#TestCreationByLocale
+com.ibm.icu.dev.test.calendar.IslamicTest#TestIslamicTabularDates
+com.ibm.icu.dev.test.calendar.IslamicTest#TestIslamicUmAlQura
+com.ibm.icu.dev.test.calendar.IslamicTest#TestLimits
+com.ibm.icu.dev.test.calendar.IslamicTest#TestRoll
+com.ibm.icu.dev.test.calendar.IslamicTest#TestSerialization8449
+com.ibm.icu.dev.test.calendar.JapaneseTest#Test3860
+com.ibm.icu.dev.test.calendar.JapaneseTest#Test5345calendar
+com.ibm.icu.dev.test.calendar.JapaneseTest#Test5345parse
+com.ibm.icu.dev.test.calendar.JapaneseTest#TestCoverage
+com.ibm.icu.dev.test.calendar.JapaneseTest#TestJapaneseYear3282
+com.ibm.icu.dev.test.calendar.JapaneseTest#TestLimits
+com.ibm.icu.dev.test.calendar.PersianTest#TestMapping
+com.ibm.icu.dev.test.charsetdet.TestCharsetDetector#TestArabic
+com.ibm.icu.dev.test.charsetdet.TestCharsetDetector#TestBufferOverflow
+com.ibm.icu.dev.test.charsetdet.TestCharsetDetector#TestBug6889
+com.ibm.icu.dev.test.charsetdet.TestCharsetDetector#TestBug6954
+com.ibm.icu.dev.test.charsetdet.TestCharsetDetector#TestBug9267
+com.ibm.icu.dev.test.charsetdet.TestCharsetDetector#TestC1Bytes
+com.ibm.icu.dev.test.charsetdet.TestCharsetDetector#TestCharsetRecog_UTF_16_LE_Match
+com.ibm.icu.dev.test.charsetdet.TestCharsetDetector#TestConstruction
+com.ibm.icu.dev.test.charsetdet.TestCharsetDetector#TestDetection
+com.ibm.icu.dev.test.charsetdet.TestCharsetDetector#TestFreshDetectorEachTime
+com.ibm.icu.dev.test.charsetdet.TestCharsetDetector#TestHebrew
+com.ibm.icu.dev.test.charsetdet.TestCharsetDetector#TestInputFilter
+com.ibm.icu.dev.test.charsetdet.TestCharsetDetector#TestJapanese
+com.ibm.icu.dev.test.charsetdet.TestCharsetDetector#TestMultithreaded
+com.ibm.icu.dev.test.charsetdet.TestCharsetDetector#TestReusingDetector
+com.ibm.icu.dev.test.charsetdet.TestCharsetDetector#TestShortInput
+com.ibm.icu.dev.test.charsetdet.TestCharsetDetector#TestUTF16
+com.ibm.icu.dev.test.charsetdet.TestCharsetDetector#TestUTF8
+com.ibm.icu.dev.test.charset.TestCharset#Test88591Converter
+com.ibm.icu.dev.test.charset.TestCharset#TestAllNames
+com.ibm.icu.dev.test.charset.TestCharset#TestAmbiguousConverter
+com.ibm.icu.dev.test.charset.TestCharset#TestAPISemantics
+com.ibm.icu.dev.test.charset.TestCharset#TestASCIIConverter
+com.ibm.icu.dev.test.charset.TestCharset#TestAvailableCharsets
+com.ibm.icu.dev.test.charset.TestCharset#TestBOCU1Converter
+com.ibm.icu.dev.test.charset.TestCharset#TestBufferOverflowErrorUsingJavagetBytes
+com.ibm.icu.dev.test.charset.TestCharset#TestBytesLengthForString
+com.ibm.icu.dev.test.charset.TestCharset#TestCanConvert
+com.ibm.icu.dev.test.charset.TestCharset#TestCharsetASCII
+com.ibm.icu.dev.test.charset.TestCharset#TestCharsetASCII8859BufferHandling
+com.ibm.icu.dev.test.charset.TestCharset#TestCharsetASCIIOverFlow
+com.ibm.icu.dev.test.charset.TestCharset#TestCharsetCallbacks
+com.ibm.icu.dev.test.charset.TestCharset#TestCharsetContains
+com.ibm.icu.dev.test.charset.TestCharset#TestCharsetICUCodeCoverage
+com.ibm.icu.dev.test.charset.TestCharset#TestCharsetICUNullCharsetName
+com.ibm.icu.dev.test.charset.TestCharset#TestCharsetIMAP
+com.ibm.icu.dev.test.charset.TestCharset#TestCharsetISCII
+com.ibm.icu.dev.test.charset.TestCharset#TestCharsetISO2022JP
+com.ibm.icu.dev.test.charset.TestCharset#TestCharsetISO2022KR
+com.ibm.icu.dev.test.charset.TestCharset#TestCharsetLMBCS
+com.ibm.icu.dev.test.charset.TestCharset#TestCharsetTestData
+com.ibm.icu.dev.test.charset.TestCharset#TestCharsetUTF16
+com.ibm.icu.dev.test.charset.TestCharset#TestCharsetUTF16LE
+com.ibm.icu.dev.test.charset.TestCharset#TestCharsetUTF32
+com.ibm.icu.dev.test.charset.TestCharset#TestCharsetUTF32LE
+com.ibm.icu.dev.test.charset.TestCharset#TestCharsetUTF7
+com.ibm.icu.dev.test.charset.TestCharset#TestCharsetUTF8
+com.ibm.icu.dev.test.charset.TestCharset#TestDecodeMalformed
+com.ibm.icu.dev.test.charset.TestCharset#TestDecoderImplFlush
+com.ibm.icu.dev.test.charset.TestCharset#TestDecodeUTF32LEBE
+com.ibm.icu.dev.test.charset.TestCharset#TestDefaultIgnorableCallback
+com.ibm.icu.dev.test.charset.TestCharset#TestEncoderCreation
+com.ibm.icu.dev.test.charset.TestCharset#TestEncoderImplFlush
+com.ibm.icu.dev.test.charset.TestCharset#TestGetAllNames
+com.ibm.icu.dev.test.charset.TestCharset#TestGetICUJavaCanonicalNames
+com.ibm.icu.dev.test.charset.TestCharset#TestHZ
+com.ibm.icu.dev.test.charset.TestCharset#TestICUAvailableCharsets
+com.ibm.icu.dev.test.charset.TestCharset#TestICUCanonicalNameConsistency
+com.ibm.icu.dev.test.charset.TestCharset#TestInvalidInput
+com.ibm.icu.dev.test.charset.TestCharset#TestIsFixedWidth
+com.ibm.icu.dev.test.charset.TestCharset#TestISO88591
+com.ibm.icu.dev.test.charset.TestCharset#TestJavaUTF16Decoder
+com.ibm.icu.dev.test.charset.TestCharset#TestJB4897
+com.ibm.icu.dev.test.charset.TestCharset#TestJB5027
+com.ibm.icu.dev.test.charset.TestCharset#TestMBCS
+com.ibm.icu.dev.test.charset.TestCharset#TestNullCanonicalName
+com.ibm.icu.dev.test.charset.TestCharset#TestSCSUConverter
+com.ibm.icu.dev.test.charset.TestCharset#TestSubBytes
+com.ibm.icu.dev.test.charset.TestCharset#TestSurrogateBehavior
+com.ibm.icu.dev.test.charset.TestCharset#TestUnsupportedCharset
+com.ibm.icu.dev.test.charset.TestCharset#TestUTF16Bom
+com.ibm.icu.dev.test.charset.TestCharset#TestUTF16Converter
+com.ibm.icu.dev.test.charset.TestCharset#TestUTF32BOM
+com.ibm.icu.dev.test.charset.TestCharset#TestUTF32Converter
+com.ibm.icu.dev.test.charset.TestCharset#TestUTF8
+com.ibm.icu.dev.test.charset.TestCharset#TestUTF8Converter
+com.ibm.icu.dev.test.charset.TestCharset#TestUTF8Encode
+com.ibm.icu.dev.test.charset.TestCharset#TestUTF8Surrogates
+com.ibm.icu.dev.test.charset.TestCharset#TestWindows936
+com.ibm.icu.dev.test.charset.TestConversion#run-everything
+com.ibm.icu.dev.test.charset.TestSelection#TestCharsetSelectorCodeCoverage
+com.ibm.icu.dev.test.charset.TestSelection#TestConversionUTF16
+com.ibm.icu.dev.test.collator.AlphabeticIndexTest#TestA
+com.ibm.icu.dev.test.collator.AlphabeticIndexTest#TestBasics
+com.ibm.icu.dev.test.collator.AlphabeticIndexTest#TestBuckets
+com.ibm.icu.dev.test.collator.AlphabeticIndexTest#TestChineseUnihan
+com.ibm.icu.dev.test.collator.AlphabeticIndexTest#TestChineseZhuyin
+com.ibm.icu.dev.test.collator.AlphabeticIndexTest#TestClientSupport
+com.ibm.icu.dev.test.collator.AlphabeticIndexTest#TestEmpty
+com.ibm.icu.dev.test.collator.AlphabeticIndexTest#TestFirstCharacters
+com.ibm.icu.dev.test.collator.AlphabeticIndexTest#TestFirstScriptCharacters
+com.ibm.icu.dev.test.collator.AlphabeticIndexTest#TestFrozenCollator
+com.ibm.icu.dev.test.collator.AlphabeticIndexTest#TestHaniFirst
+com.ibm.icu.dev.test.collator.AlphabeticIndexTest#TestIndexCharactersList
+com.ibm.icu.dev.test.collator.AlphabeticIndexTest#TestInflow
+com.ibm.icu.dev.test.collator.AlphabeticIndexTest#TestJapaneseKanji
+com.ibm.icu.dev.test.collator.AlphabeticIndexTest#TestNoLabels
+com.ibm.icu.dev.test.collator.AlphabeticIndexTest#TestPinyinFirst
+com.ibm.icu.dev.test.collator.AlphabeticIndexTest#TestSchSt
+com.ibm.icu.dev.test.collator.AlphabeticIndexTest#TestSimplified
+com.ibm.icu.dev.test.collator.AlphabeticIndexTest#TestTraditional
+com.ibm.icu.dev.test.collator.AlphabeticIndexTest#TestZZZ
+com.ibm.icu.dev.test.collator.CollationAPITest#TestBadKeywords
+com.ibm.icu.dev.test.collator.CollationAPITest#TestBounds
+com.ibm.icu.dev.test.collator.CollationAPITest#TestClone
+com.ibm.icu.dev.test.collator.CollationAPITest#TestCollationKey
+com.ibm.icu.dev.test.collator.CollationAPITest#TestCompare
+com.ibm.icu.dev.test.collator.CollationAPITest#TestCreateCollator
+com.ibm.icu.dev.test.collator.CollationAPITest#TestDecomposition
+com.ibm.icu.dev.test.collator.CollationAPITest#TestDuplicate
+com.ibm.icu.dev.test.collator.CollationAPITest#TestElemIter
+com.ibm.icu.dev.test.collator.CollationAPITest#TestGetAll
+com.ibm.icu.dev.test.collator.CollationAPITest#TestGetContractions
+com.ibm.icu.dev.test.collator.CollationAPITest#TestGetKeywordValues
+com.ibm.icu.dev.test.collator.CollationAPITest#TestGetLocale
+com.ibm.icu.dev.test.collator.CollationAPITest#TestGetTailoredSet
+com.ibm.icu.dev.test.collator.CollationAPITest#TestHashCode
+com.ibm.icu.dev.test.collator.CollationAPITest#TestIterNumeric
+com.ibm.icu.dev.test.collator.CollationAPITest#TestJunkCollator
+com.ibm.icu.dev.test.collator.CollationAPITest#TestMaxVariable
+com.ibm.icu.dev.test.collator.CollationAPITest#TestProperty
+com.ibm.icu.dev.test.collator.CollationAPITest#TestRawCollationKey
+com.ibm.icu.dev.test.collator.CollationAPITest#TestRuleBasedColl
+com.ibm.icu.dev.test.collator.CollationAPITest#TestRules
+com.ibm.icu.dev.test.collator.CollationAPITest#TestSafeClone
+com.ibm.icu.dev.test.collator.CollationAPITest#TestSetDecomposition
+com.ibm.icu.dev.test.collator.CollationAPITest#TestSetGet
+com.ibm.icu.dev.test.collator.CollationAPITest#TestSetStrength
+com.ibm.icu.dev.test.collator.CollationAPITest#TestSubClass
+com.ibm.icu.dev.test.collator.CollationAPITest#TestVariableTopSetting
+com.ibm.icu.dev.test.collator.CollationChineseTest#TestPinYin
+com.ibm.icu.dev.test.collator.CollationCreationMethodTest#TestRuleVsLocaleCreationMonkey
+com.ibm.icu.dev.test.collator.CollationCurrencyTest#TestCurrency
+com.ibm.icu.dev.test.collator.CollationDummyTest#TestExtra
+com.ibm.icu.dev.test.collator.CollationDummyTest#TestIdentical
+com.ibm.icu.dev.test.collator.CollationDummyTest#TestJB1401
+com.ibm.icu.dev.test.collator.CollationDummyTest#TestJB581
+com.ibm.icu.dev.test.collator.CollationDummyTest#TestPrimary
+com.ibm.icu.dev.test.collator.CollationDummyTest#TestSecondary
+com.ibm.icu.dev.test.collator.CollationDummyTest#TestSurrogates
+com.ibm.icu.dev.test.collator.CollationDummyTest#TestTertiary
+com.ibm.icu.dev.test.collator.CollationDummyTest#TestVariableTop
+com.ibm.icu.dev.test.collator.CollationEnglishTest#TestPrimary
+com.ibm.icu.dev.test.collator.CollationEnglishTest#TestSecondary
+com.ibm.icu.dev.test.collator.CollationEnglishTest#TestTertiary
+com.ibm.icu.dev.test.collator.CollationFinnishTest#TestPrimary
+com.ibm.icu.dev.test.collator.CollationFinnishTest#TestTertiary
+com.ibm.icu.dev.test.collator.CollationFrenchTest#TestContinuationReordering
+com.ibm.icu.dev.test.collator.CollationFrenchTest#TestExtra
+com.ibm.icu.dev.test.collator.CollationFrenchTest#TestSecondary
+com.ibm.icu.dev.test.collator.CollationFrenchTest#TestTertiary
+com.ibm.icu.dev.test.collator.CollationGermanTest#TestPrimary
+com.ibm.icu.dev.test.collator.CollationGermanTest#TestSecondary
+com.ibm.icu.dev.test.collator.CollationGermanTest#TestTertiary
+com.ibm.icu.dev.test.collator.CollationIteratorTest#TestClearBuffers
+com.ibm.icu.dev.test.collator.CollationIteratorTest#TestDiscontiguous
+com.ibm.icu.dev.test.collator.CollationIteratorTest#TestMaxExpansion
+com.ibm.icu.dev.test.collator.CollationIteratorTest#TestNormalization
+com.ibm.icu.dev.test.collator.CollationIteratorTest#TestNormalizedUnicodeChar
+com.ibm.icu.dev.test.collator.CollationIteratorTest#TestOffset
+com.ibm.icu.dev.test.collator.CollationIteratorTest#TestPrevious
+com.ibm.icu.dev.test.collator.CollationIteratorTest#TestSearchCollatorElements
+com.ibm.icu.dev.test.collator.CollationIteratorTest#TestSetText
+com.ibm.icu.dev.test.collator.CollationIteratorTest#TestUnicodeChar
+com.ibm.icu.dev.test.collator.CollationKanaTest#TestBase
+com.ibm.icu.dev.test.collator.CollationKanaTest#TestChooonKigoo
+com.ibm.icu.dev.test.collator.CollationKanaTest#TestCommonCharacters
+com.ibm.icu.dev.test.collator.CollationKanaTest#TestKatakanaHiragana
+com.ibm.icu.dev.test.collator.CollationKanaTest#TestPlainDakutenHandakuten
+com.ibm.icu.dev.test.collator.CollationKanaTest#TestSmallLarge
+com.ibm.icu.dev.test.collator.CollationKanaTest#TestTertiary
+com.ibm.icu.dev.test.collator.CollationMiscTest#Test3249
+com.ibm.icu.dev.test.collator.CollationMiscTest#Test6179
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestBefore
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestBeforePinyin
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestBeforePrefixFailure
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestBeforeRuleWithScriptReordering
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestBlackBird
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestBocsuCoverage
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestCase
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestChMove
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestCollationKeyEquals
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestCollationKeyHashCode
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestComposeDecompose
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestContraction
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestContractionClosure
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestContractionEndCompare
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestCyrillicTailoring
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestEmptyRule
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestEquivalentReorderingScripts
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestExpansion
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestExtremeCompression
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestFCDProblem
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestFrozeness
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestFunkyA
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestGetBound
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestGreekFirstReorder
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestGreekFirstReorderCloning
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestGreekLastReorder
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestHangulTailoring
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestHaniReorder
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestHaniReorderWithOtherRules
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestHungarianTailoring
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestIdenticalCompare
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestImplicitTailoring
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestImport
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestImportWithType
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestIncompleteCnt
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestIncrementalNormalize
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestInvalidListsAndRanges
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestJ3087
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestJ3347
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestJ4960
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestJ5367
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestJ815
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestJB5298
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestLocaleRuleBasedCollators
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestMaxVariable
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestMerge
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestMergeSortKeys
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestMultipleReorder
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestNewJapanese
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestNonChars
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestNonLeadBytesDuringCollationReordering
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestNonScriptReorder
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestNumericCollation
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestOptimize
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestPinyinProblem
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestPrefix
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestPrefixCompose
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestQuoteAndSpace
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestRawCollationKeyCompareTo
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestReorderingAPI
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestReorderingAPIWithRuleCreatedCollator
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestRuleOptions
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestSameStrengthList
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestSameStrengthListQuoted
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestSameStrengthListQwerty
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestSameStrengthListRanges
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestSameStrengthListRangesWithSupplementalCharacters
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestSameStrengthListWithSupplementalCharacters
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestShifted
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestSpecialCharacters
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestStrCollIdenticalPrefix
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestSuppressContractions
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestSurrogates
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestTibetanConformance
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestUCAPrecontext
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestUCARules
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestUnknownCollationKeyword
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestUpperFirstQuaternary
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestVariableTop
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestVariableTopSetting
+com.ibm.icu.dev.test.collator.CollationMiscTest#TestVI5913
+com.ibm.icu.dev.test.collator.CollationMonkeyTest#TestCollationKey
+com.ibm.icu.dev.test.collator.CollationMonkeyTest#TestCompare
+com.ibm.icu.dev.test.collator.CollationMonkeyTest#TestRules
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test4048446
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test4051866
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test4053636
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test4054238
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test4054734
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test4054736
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test4058613
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test4059820
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test4060154
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test4062418
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test4065540
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test4066189
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test4066696
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test4076676
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test4078588
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test4079231
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test4081866
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test4087241
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test4087243
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test4092260
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test4095316
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test4101940
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test4103436
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test4114076
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test4114077
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test4124632
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test4132736
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test4133509
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test4139572
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test4141640
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test4171974
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test4179216
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test4179686
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test4216006
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test4244884
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test4663220
+com.ibm.icu.dev.test.collator.CollationRegressionTest#Test8484
+com.ibm.icu.dev.test.collator.CollationRegressionTest#TestBeforeWithTooStrongAfter
+com.ibm.icu.dev.test.collator.CollationRegressionTest#TestBengaliSortKey
+com.ibm.icu.dev.test.collator.CollationRegressionTest#TestCaseFirstCompression
+com.ibm.icu.dev.test.collator.CollationRegressionTest#TestTrailingComment
+com.ibm.icu.dev.test.collator.CollationServiceTest#TestGetFunctionalEquivalent
+com.ibm.icu.dev.test.collator.CollationServiceTest#TestGetKeywordValues
+com.ibm.icu.dev.test.collator.CollationServiceTest#TestRegister
+com.ibm.icu.dev.test.collator.CollationServiceTest#TestRegisterFactory
+com.ibm.icu.dev.test.collator.CollationServiceTest#TestSeparateTrees
+com.ibm.icu.dev.test.collator.CollationSpanishTest#TestPrimary
+com.ibm.icu.dev.test.collator.CollationSpanishTest#TestTertiary
+com.ibm.icu.dev.test.collator.CollationTest#TestCollationWeights
+com.ibm.icu.dev.test.collator.CollationTest#TestDataDriven
+com.ibm.icu.dev.test.collator.CollationTest#TestFCD
+com.ibm.icu.dev.test.collator.CollationTest#TestImplicits
+com.ibm.icu.dev.test.collator.CollationTest#TestMinMax
+com.ibm.icu.dev.test.collator.CollationTest#TestRootElements
+com.ibm.icu.dev.test.collator.CollationTest#TestShortFCDData
+com.ibm.icu.dev.test.collator.CollationTest#TestSubSequence
+com.ibm.icu.dev.test.collator.CollationTest#TestTailoredElements
+com.ibm.icu.dev.test.collator.CollationThaiTest#TestCornerCases
+com.ibm.icu.dev.test.collator.CollationThaiTest#TestDictionary
+com.ibm.icu.dev.test.collator.CollationThaiTest#TestInvalidThai
+com.ibm.icu.dev.test.collator.CollationThaiTest#TestReordering
+com.ibm.icu.dev.test.collator.CollationThreadTest#testFrozen
+com.ibm.icu.dev.test.collator.CollationThreadTest#testThreads
+com.ibm.icu.dev.test.collator.CollationTurkishTest#TestPrimary
+com.ibm.icu.dev.test.collator.CollationTurkishTest#TestTertiary
+com.ibm.icu.dev.test.collator.G7CollationTest#TestDemo1
+com.ibm.icu.dev.test.collator.G7CollationTest#TestDemo2
+com.ibm.icu.dev.test.collator.G7CollationTest#TestDemo3
+com.ibm.icu.dev.test.collator.G7CollationTest#TestDemo4
+com.ibm.icu.dev.test.collator.G7CollationTest#TestG7Data
+com.ibm.icu.dev.test.collator.LotusCollationKoreanTest#TestTertiary
+com.ibm.icu.dev.test.collator.UCAConformanceTest#TestRulesNonIgnorable
+com.ibm.icu.dev.test.collator.UCAConformanceTest#TestRulesShifted
+com.ibm.icu.dev.test.collator.UCAConformanceTest#TestTableNonIgnorable
+com.ibm.icu.dev.test.collator.UCAConformanceTest#TestTableShifted
+com.ibm.icu.dev.test.compression.DecompressionTest#TestDecompress
+com.ibm.icu.dev.test.compression.DecompressionTest#TestDecompression
+com.ibm.icu.dev.test.compression.ExhaustiveTest#testIterative
+com.ibm.icu.dev.test.compression.ExhaustiveTest#testMultipass
+com.ibm.icu.dev.test.compression.ExhaustiveTest#testSimple
+com.ibm.icu.dev.test.duration.DataReadWriteTest#testBool
+com.ibm.icu.dev.test.duration.DataReadWriteTest#testBoolArray
+com.ibm.icu.dev.test.duration.DataReadWriteTest#testCharacter
+com.ibm.icu.dev.test.duration.DataReadWriteTest#testCharacterArray
+com.ibm.icu.dev.test.duration.DataReadWriteTest#testNamedIndex
+com.ibm.icu.dev.test.duration.DataReadWriteTest#testNamedIndexArray
+com.ibm.icu.dev.test.duration.DataReadWriteTest#testOmittedFields
+com.ibm.icu.dev.test.duration.DataReadWriteTest#testOpenClose
+com.ibm.icu.dev.test.duration.DataReadWriteTest#testString
+com.ibm.icu.dev.test.duration.DataReadWriteTest#testStringArray
+com.ibm.icu.dev.test.duration.DataReadWriteTest#testStringTable
+com.ibm.icu.dev.test.duration.ICUDurationTest#TestBadLocaleError
+com.ibm.icu.dev.test.duration.ICUDurationTest#TestBadObjectError
+com.ibm.icu.dev.test.duration.ICUDurationTest#TestDurationFormat
+com.ibm.icu.dev.test.duration.ICUDurationTest#TestFromNowTo
+com.ibm.icu.dev.test.duration.ICUDurationTest#TestResourceWithCalendar
+com.ibm.icu.dev.test.duration.ICUDurationTest#TestSimpleXMLDuration
+com.ibm.icu.dev.test.duration.ICUDurationTest#TestXMLDuration
+com.ibm.icu.dev.test.duration.languages.Test_en#testCustomMinutes
+com.ibm.icu.dev.test.duration.languages.Test_en#testFractionalUnits
+com.ibm.icu.dev.test.duration.languages.Test_en#testFullPluralizedForms
+com.ibm.icu.dev.test.duration.languages.Test_en#testHalfUnits
+com.ibm.icu.dev.test.duration.languages.Test_en#testLimitedUnits
+com.ibm.icu.dev.test.duration.languages.Test_en#testMediumForms
+com.ibm.icu.dev.test.duration.languages.Test_en#testMultipleUnits
+com.ibm.icu.dev.test.duration.languages.Test_en#testShortForms
+com.ibm.icu.dev.test.duration.languages.Test_es#testCustomMinutes
+com.ibm.icu.dev.test.duration.languages.Test_es#testFractionalUnits
+com.ibm.icu.dev.test.duration.languages.Test_es#testFullPluralizedForms
+com.ibm.icu.dev.test.duration.languages.Test_es#testHalfUnits
+com.ibm.icu.dev.test.duration.languages.Test_es#testLimitedUnits
+com.ibm.icu.dev.test.duration.languages.Test_es#testMediumForms
+com.ibm.icu.dev.test.duration.languages.Test_es#testMultipleUnits
+com.ibm.icu.dev.test.duration.languages.Test_es#testShortForms
+com.ibm.icu.dev.test.duration.languages.Test_fr#testCustomMinutes
+com.ibm.icu.dev.test.duration.languages.Test_fr#testFractionalUnits
+com.ibm.icu.dev.test.duration.languages.Test_fr#testFullPluralizedForms
+com.ibm.icu.dev.test.duration.languages.Test_fr#testHalfUnits
+com.ibm.icu.dev.test.duration.languages.Test_fr#testLimitedUnits
+com.ibm.icu.dev.test.duration.languages.Test_fr#testMediumForms
+com.ibm.icu.dev.test.duration.languages.Test_fr#testMultipleUnits
+com.ibm.icu.dev.test.duration.languages.Test_fr#testShortForms
+com.ibm.icu.dev.test.duration.languages.Test_he_IL#testCustomMinutes
+com.ibm.icu.dev.test.duration.languages.Test_he_IL#testFractionalUnits
+com.ibm.icu.dev.test.duration.languages.Test_he_IL#testFullPluralizedForms
+com.ibm.icu.dev.test.duration.languages.Test_he_IL#testHalfUnits
+com.ibm.icu.dev.test.duration.languages.Test_he_IL#testLimitedUnits
+com.ibm.icu.dev.test.duration.languages.Test_he_IL#testMediumForms
+com.ibm.icu.dev.test.duration.languages.Test_he_IL#testMultipleUnits
+com.ibm.icu.dev.test.duration.languages.Test_he_IL#testShortForms
+com.ibm.icu.dev.test.duration.languages.Test_hi#testCustomMinutes
+com.ibm.icu.dev.test.duration.languages.Test_hi#testFractionalUnits
+com.ibm.icu.dev.test.duration.languages.Test_hi#testFullPluralizedForms
+com.ibm.icu.dev.test.duration.languages.Test_hi#testHalfUnits
+com.ibm.icu.dev.test.duration.languages.Test_hi#testLimitedUnits
+com.ibm.icu.dev.test.duration.languages.Test_hi#testMediumForms
+com.ibm.icu.dev.test.duration.languages.Test_hi#testMonthNames
+com.ibm.icu.dev.test.duration.languages.Test_hi#testMultipleUnits
+com.ibm.icu.dev.test.duration.languages.Test_hi#testShortForms
+com.ibm.icu.dev.test.duration.languages.Test_it#testCustomMinutes
+com.ibm.icu.dev.test.duration.languages.Test_it#testFractionalUnits
+com.ibm.icu.dev.test.duration.languages.Test_it#testFullPluralizedForms
+com.ibm.icu.dev.test.duration.languages.Test_it#testHalfUnits
+com.ibm.icu.dev.test.duration.languages.Test_it#testLimitedUnits
+com.ibm.icu.dev.test.duration.languages.Test_it#testMediumForms
+com.ibm.icu.dev.test.duration.languages.Test_it#testMultipleUnits
+com.ibm.icu.dev.test.duration.languages.Test_it#testShortForms
+com.ibm.icu.dev.test.duration.languages.Test_ja#testCustomMinutes
+com.ibm.icu.dev.test.duration.languages.Test_ja#testFractionalUnits
+com.ibm.icu.dev.test.duration.languages.Test_ja#testFullPluralizedForms
+com.ibm.icu.dev.test.duration.languages.Test_ja#testHalfUnits
+com.ibm.icu.dev.test.duration.languages.Test_ja#testLimitedUnits
+com.ibm.icu.dev.test.duration.languages.Test_ja#testMediumForms
+com.ibm.icu.dev.test.duration.languages.Test_ja#testMultipleUnits
+com.ibm.icu.dev.test.duration.languages.Test_ja#testNoMillis
+com.ibm.icu.dev.test.duration.languages.Test_ja#testOmitZeros
+com.ibm.icu.dev.test.duration.languages.Test_ja#testShortForms
+com.ibm.icu.dev.test.duration.languages.Test_ko#testCustomMinutes
+com.ibm.icu.dev.test.duration.languages.Test_ko#testFractionalUnits
+com.ibm.icu.dev.test.duration.languages.Test_ko#testFullPluralizedForms
+com.ibm.icu.dev.test.duration.languages.Test_ko#testHalfUnits
+com.ibm.icu.dev.test.duration.languages.Test_ko#testLimitedUnits
+com.ibm.icu.dev.test.duration.languages.Test_ko#testMediumForms
+com.ibm.icu.dev.test.duration.languages.Test_ko#testMultipleUnits
+com.ibm.icu.dev.test.duration.languages.Test_ko#testShortForms
+com.ibm.icu.dev.test.duration.languages.Test_zh_Hans_SG#testCustomMinutes
+com.ibm.icu.dev.test.duration.languages.Test_zh_Hans_SG#testFractionalUnits
+com.ibm.icu.dev.test.duration.languages.Test_zh_Hans_SG#testFullPluralizedForms
+com.ibm.icu.dev.test.duration.languages.Test_zh_Hans_SG#testHalfUnits
+com.ibm.icu.dev.test.duration.languages.Test_zh_Hans_SG#testLimitedUnits
+com.ibm.icu.dev.test.duration.languages.Test_zh_Hans_SG#testMediumForms
+com.ibm.icu.dev.test.duration.languages.Test_zh_Hans_SG#testMultipleUnits
+com.ibm.icu.dev.test.duration.languages.Test_zh_Hans_SG#testShortForms
+com.ibm.icu.dev.test.duration.languages.Test_zh_Hans#testCustomMinutes
+com.ibm.icu.dev.test.duration.languages.Test_zh_Hans#testFractionalUnits
+com.ibm.icu.dev.test.duration.languages.Test_zh_Hans#testFullPluralizedForms
+com.ibm.icu.dev.test.duration.languages.Test_zh_Hans#testHalfUnits
+com.ibm.icu.dev.test.duration.languages.Test_zh_Hans#testLimitedUnits
+com.ibm.icu.dev.test.duration.languages.Test_zh_Hans#testMediumForms
+com.ibm.icu.dev.test.duration.languages.Test_zh_Hans#testMultipleUnits
+com.ibm.icu.dev.test.duration.languages.Test_zh_Hans#testShortForms
+com.ibm.icu.dev.test.duration.languages.Test_zh_Hant_HK#testCustomMinutes
+com.ibm.icu.dev.test.duration.languages.Test_zh_Hant_HK#testFractionalUnits
+com.ibm.icu.dev.test.duration.languages.Test_zh_Hant_HK#testFullPluralizedForms
+com.ibm.icu.dev.test.duration.languages.Test_zh_Hant_HK#testHalfUnits
+com.ibm.icu.dev.test.duration.languages.Test_zh_Hant_HK#testLimitedUnits
+com.ibm.icu.dev.test.duration.languages.Test_zh_Hant_HK#testMediumForms
+com.ibm.icu.dev.test.duration.languages.Test_zh_Hant_HK#testMultipleUnits
+com.ibm.icu.dev.test.duration.languages.Test_zh_Hant_HK#testShortForms
+com.ibm.icu.dev.test.duration.languages.Test_zh_Hant#testCustomMinutes
+com.ibm.icu.dev.test.duration.languages.Test_zh_Hant#testFractionalUnits
+com.ibm.icu.dev.test.duration.languages.Test_zh_Hant#testFullPluralizedForms
+com.ibm.icu.dev.test.duration.languages.Test_zh_Hant#testHalfUnits
+com.ibm.icu.dev.test.duration.languages.Test_zh_Hant#testLimitedUnits
+com.ibm.icu.dev.test.duration.languages.Test_zh_Hant#testMediumForms
+com.ibm.icu.dev.test.duration.languages.Test_zh_Hant#testMultipleUnits
+com.ibm.icu.dev.test.duration.languages.Test_zh_Hant#testShortForms
+com.ibm.icu.dev.test.duration.PeriodBuilderFactoryTest#testBuilderFactoryPeriodConstruction
+com.ibm.icu.dev.test.duration.PeriodBuilderFactoryTest#testSetAvailableUnitRange
+com.ibm.icu.dev.test.duration.PeriodBuilderFactoryTest#testSetUnitIsAvailable
+com.ibm.icu.dev.test.duration.PeriodTest#testAnd
+com.ibm.icu.dev.test.duration.PeriodTest#testFuturePast
+com.ibm.icu.dev.test.duration.PeriodTest#testInvalidCount
+com.ibm.icu.dev.test.duration.PeriodTest#testIsSet
+com.ibm.icu.dev.test.duration.PeriodTest#testMoreLessThan
+com.ibm.icu.dev.test.duration.ResourceBasedPeriodFormatterDataServiceTest#testAvailable
+com.ibm.icu.dev.test.format.BigNumberFormatTest#Test4161100
+com.ibm.icu.dev.test.format.BigNumberFormatTest#TestAlphaBigDecimal
+com.ibm.icu.dev.test.format.BigNumberFormatTest#TestBigDecimalJ28
+com.ibm.icu.dev.test.format.BigNumberFormatTest#TestBigDecimalRounding
+com.ibm.icu.dev.test.format.BigNumberFormatTest#TestExponent
+com.ibm.icu.dev.test.format.BigNumberFormatTest#TestPad
+com.ibm.icu.dev.test.format.BigNumberFormatTest#TestPatterns
+com.ibm.icu.dev.test.format.BigNumberFormatTest#TestScientific
+com.ibm.icu.dev.test.format.BigNumberFormatTest#TestSecondaryGrouping
+com.ibm.icu.dev.test.format.CompactDecimalFormatTest#TestACoreCompactFormat
+com.ibm.icu.dev.test.format.CompactDecimalFormatTest#TestArabicLongStyle
+com.ibm.icu.dev.test.format.CompactDecimalFormatTest#TestCharacterIterator
+com.ibm.icu.dev.test.format.CompactDecimalFormatTest#TestCsShort
+com.ibm.icu.dev.test.format.CompactDecimalFormatTest#TestDefaultSignificantDigits
+com.ibm.icu.dev.test.format.CompactDecimalFormatTest#TestEnglishShort
+com.ibm.icu.dev.test.format.CompactDecimalFormatTest#TestEquals
+com.ibm.icu.dev.test.format.CompactDecimalFormatTest#TestFieldPosition
+com.ibm.icu.dev.test.format.CompactDecimalFormatTest#TestJapaneseShort
+com.ibm.icu.dev.test.format.CompactDecimalFormatTest#TestSerbianLong
+com.ibm.icu.dev.test.format.CompactDecimalFormatTest#TestSerbianLongNegative
+com.ibm.icu.dev.test.format.CompactDecimalFormatTest#TestSerbianShort
+com.ibm.icu.dev.test.format.CompactDecimalFormatTest#TestSkLong
+com.ibm.icu.dev.test.format.CompactDecimalFormatTest#TestSwahiliShort
+com.ibm.icu.dev.test.format.CompactDecimalFormatTest#TestSwahiliShortNegative
+com.ibm.icu.dev.test.format.DateFormatMiscTests#Test4097450
+com.ibm.icu.dev.test.format.DateFormatMiscTests#Test4099975new
+com.ibm.icu.dev.test.format.DateFormatMiscTests#Test4117335
+com.ibm.icu.dev.test.format.DateFormatRegressionTestJ#Test4103926
+com.ibm.icu.dev.test.format.DateFormatRegressionTestJ#Test4148168
+com.ibm.icu.dev.test.format.DateFormatRegressionTestJ#Test4213086
+com.ibm.icu.dev.test.format.DateFormatRegressionTestJ#Test4250359
+com.ibm.icu.dev.test.format.DateFormatRegressionTestJ#Test4253490
+com.ibm.icu.dev.test.format.DateFormatRegressionTestJ#Test4266432
+com.ibm.icu.dev.test.format.DateFormatRegressionTestJ#Test4358730
+com.ibm.icu.dev.test.format.DateFormatRegressionTestJ#Test4375399
+com.ibm.icu.dev.test.format.DateFormatRegressionTestJ#Test4468663
+com.ibm.icu.dev.test.format.DateFormatRegressionTest#Test4029195
+com.ibm.icu.dev.test.format.DateFormatRegressionTest#Test4052408
+com.ibm.icu.dev.test.format.DateFormatRegressionTest#Test4056591
+com.ibm.icu.dev.test.format.DateFormatRegressionTest#Test4059917
+com.ibm.icu.dev.test.format.DateFormatRegressionTest#Test4060212
+com.ibm.icu.dev.test.format.DateFormatRegressionTest#Test4061287
+com.ibm.icu.dev.test.format.DateFormatRegressionTest#Test4065240
+com.ibm.icu.dev.test.format.DateFormatRegressionTest#Test4071441
+com.ibm.icu.dev.test.format.DateFormatRegressionTest#Test4089106
+com.ibm.icu.dev.test.format.DateFormatRegressionTest#Test4100302
+com.ibm.icu.dev.test.format.DateFormatRegressionTest#Test4101483
+com.ibm.icu.dev.test.format.DateFormatRegressionTest#Test4103340
+com.ibm.icu.dev.test.format.DateFormatRegressionTest#Test4103341
+com.ibm.icu.dev.test.format.DateFormatRegressionTest#Test4104136
+com.ibm.icu.dev.test.format.DateFormatRegressionTest#Test4104522
+com.ibm.icu.dev.test.format.DateFormatRegressionTest#Test4106807
+com.ibm.icu.dev.test.format.DateFormatRegressionTest#Test4108407
+com.ibm.icu.dev.test.format.DateFormatRegressionTest#Test4134203
+com.ibm.icu.dev.test.format.DateFormatRegressionTest#Test4151631
+com.ibm.icu.dev.test.format.DateFormatRegressionTest#Test4162071
+com.ibm.icu.dev.test.format.DateFormatRegressionTest#Test4210209
+com.ibm.icu.dev.test.format.DateFormatRegressionTest#Test5006GetShortMonths
+com.ibm.icu.dev.test.format.DateFormatRegressionTest#Test714
+com.ibm.icu.dev.test.format.DateFormatRegressionTest#TestDangiFormat
+com.ibm.icu.dev.test.format.DateFormatRegressionTest#Test_GEec
+com.ibm.icu.dev.test.format.DateFormatRegressionTest#TestHindiArabicDigits
+com.ibm.icu.dev.test.format.DateFormatRegressionTest#TestParsing
+com.ibm.icu.dev.test.format.DateFormatRegressionTest#TestT10110
+com.ibm.icu.dev.test.format.DateFormatRegressionTest#TestT10239
+com.ibm.icu.dev.test.format.DateFormatRegressionTest#TestT10334
+com.ibm.icu.dev.test.format.DateFormatRegressionTest#TestT10619
+com.ibm.icu.dev.test.format.DateFormatRegressionTest#TestT10906
+com.ibm.icu.dev.test.format.DateFormatRegressionTest#TestT11363
+com.ibm.icu.dev.test.format.DateFormatRegressionTest#TestT5683
+com.ibm.icu.dev.test.format.DateFormatRoundTripTest#TestDateFormatRoundTrip
+com.ibm.icu.dev.test.format.DateFormatTest#Test10632
+com.ibm.icu.dev.test.format.DateFormatTest#Test6880
+com.ibm.icu.dev.test.format.DateFormatTest#TestBadInput135a
+com.ibm.icu.dev.test.format.DateFormatTest#TestCalendarType
+com.ibm.icu.dev.test.format.DateFormatTest#TestChineseDateFormatLocalizedPatternChars
+com.ibm.icu.dev.test.format.DateFormatTest#TestChineseDateFormatSymbols
+com.ibm.icu.dev.test.format.DateFormatTest#TestContext
+com.ibm.icu.dev.test.format.DateFormatTest#TestCoverage
+com.ibm.icu.dev.test.format.DateFormatTest#TestCzechMonths459
+com.ibm.icu.dev.test.format.DateFormatTest#TestDateFormatCalendar
+com.ibm.icu.dev.test.format.DateFormatTest#TestDateFormatLeniency
+com.ibm.icu.dev.test.format.DateFormatTest#TestDateFormatNone
+com.ibm.icu.dev.test.format.DateFormatTest#TestDateFormatZone061
+com.ibm.icu.dev.test.format.DateFormatTest#TestDateFormatZone146
+com.ibm.icu.dev.test.format.DateFormatTest#TestDayOfYearPattern195
+com.ibm.icu.dev.test.format.DateFormatTest#TestEquals
+com.ibm.icu.dev.test.format.DateFormatTest#TestEras
+com.ibm.icu.dev.test.format.DateFormatTest#TestErrorChecking
+com.ibm.icu.dev.test.format.DateFormatTest#TestExactCountFormat
+com.ibm.icu.dev.test.format.DateFormatTest#TestFieldPosition
+com.ibm.icu.dev.test.format.DateFormatTest#TestFormalChineseDate
+com.ibm.icu.dev.test.format.DateFormatTest#TestFormattingLocaleTimeSeparator
+com.ibm.icu.dev.test.format.DateFormatTest#TestFormatToCharacterIterator
+com.ibm.icu.dev.test.format.DateFormatTest#TestFormatToCharacterIteratorCoverage
+com.ibm.icu.dev.test.format.DateFormatTest#TestGeneral
+com.ibm.icu.dev.test.format.DateFormatTest#TestGenericTimeZoneOrder
+com.ibm.icu.dev.test.format.DateFormatTest#TestGetPatternInstance
+com.ibm.icu.dev.test.format.DateFormatTest#TestGMTParsing
+com.ibm.icu.dev.test.format.DateFormatTest#TestGreekMay
+com.ibm.icu.dev.test.format.DateFormatTest#TestInvalidPattern
+com.ibm.icu.dev.test.format.DateFormatTest#TestISOEra
+com.ibm.icu.dev.test.format.DateFormatTest#TestLetterDPattern212
+com.ibm.icu.dev.test.format.DateFormatTest#TestLocaleDateFormat
+com.ibm.icu.dev.test.format.DateFormatTest#TestLongContiguousNumericPattern
+com.ibm.icu.dev.test.format.DateFormatTest#TestLongNumericPattern
+com.ibm.icu.dev.test.format.DateFormatTest#TestMonthPatterns
+com.ibm.icu.dev.test.format.DateFormatTest#TestNarrowNames
+com.ibm.icu.dev.test.format.DateFormatTest#TestNonGregoFmtParse
+com.ibm.icu.dev.test.format.DateFormatTest#TestOfCalendarField
+com.ibm.icu.dev.test.format.DateFormatTest#TestOverrideNumberForamt
+com.ibm.icu.dev.test.format.DateFormatTest#TestParseLeniencyAPIs
+com.ibm.icu.dev.test.format.DateFormatTest#TestParseMultiPatternMatch
+com.ibm.icu.dev.test.format.DateFormatTest#TestParsePosition
+com.ibm.icu.dev.test.format.DateFormatTest#TestPatterns
+com.ibm.icu.dev.test.format.DateFormatTest#TestQuotePattern161
+com.ibm.icu.dev.test.format.DateFormatTest#TestRelativeDateFormat
+com.ibm.icu.dev.test.format.DateFormatTest#TestRoundtripWithCalendar
+com.ibm.icu.dev.test.format.DateFormatTest#TestRunTogetherPattern917
+com.ibm.icu.dev.test.format.DateFormatTest#TestRunTogetherPattern985
+com.ibm.icu.dev.test.format.DateFormatTest#TestShortDays
+com.ibm.icu.dev.test.format.DateFormatTest#TestSimpleDateFormatConstructor_String_String_ULocale
+com.ibm.icu.dev.test.format.DateFormatTest#TestStandAloneDays
+com.ibm.icu.dev.test.format.DateFormatTest#TestStandAloneMonths
+com.ibm.icu.dev.test.format.DateFormatTest#TestTimeZoneDisplayName
+com.ibm.icu.dev.test.format.DateFormatTest#TestTwoDigitWOY
+com.ibm.icu.dev.test.format.DateFormatTest#TestTwoDigitYearDSTParse
+com.ibm.icu.dev.test.format.DateFormatTest#TestWallyWedel
+com.ibm.icu.dev.test.format.DateIntervalFormatTest#TestClone
+com.ibm.icu.dev.test.format.DateIntervalFormatTest#TestCloseAsThawed
+com.ibm.icu.dev.test.format.DateIntervalFormatTest#TestConstructor
+com.ibm.icu.dev.test.format.DateIntervalFormatTest#TestDateIntervalCoverage
+com.ibm.icu.dev.test.format.DateIntervalFormatTest#TestDateIntervalInfoEquals
+com.ibm.icu.dev.test.format.DateIntervalFormatTest#TestFormat
+com.ibm.icu.dev.test.format.DateIntervalFormatTest#TestFormatCLDR
+com.ibm.icu.dev.test.format.DateIntervalFormatTest#TestFormatUserDII
+com.ibm.icu.dev.test.format.DateIntervalFormatTest#TestFPos_SkelWithSeconds
+com.ibm.icu.dev.test.format.DateIntervalFormatTest#TestGetIntervalPattern
+com.ibm.icu.dev.test.format.DateIntervalFormatTest#TestGetSetTimeZone
+com.ibm.icu.dev.test.format.DateIntervalFormatTest#TestHashCode
+com.ibm.icu.dev.test.format.DateIntervalFormatTest#TestIsFrozen
+com.ibm.icu.dev.test.format.DateIntervalFormatTest#TestPattternInfoEquals
+com.ibm.icu.dev.test.format.DateIntervalFormatTest#TestSetFallbackIntervalPattern
+com.ibm.icu.dev.test.format.DateIntervalFormatTest#TestSetIntervalPattern
+com.ibm.icu.dev.test.format.DateIntervalFormatTest#TestSetIntervalPatternNoSideEffect
+com.ibm.icu.dev.test.format.DateIntervalFormatTest#TestStress
+com.ibm.icu.dev.test.format.DateIntervalFormatTest#TestT6396
+com.ibm.icu.dev.test.format.DateIntervalFormatTest#TestTicket11583
+com.ibm.icu.dev.test.format.DateIntervalFormatTest#TestTicket9914
+com.ibm.icu.dev.test.format.DateIntervalFormatTest#TestTicket9919GetInstance
+com.ibm.icu.dev.test.format.DateIntervalFormatTest#TestTicket9919Setter
+com.ibm.icu.dev.test.format.DateTimeGeneratorTest#TestAllFieldPatterns
+com.ibm.icu.dev.test.format.DateTimeGeneratorTest#TestBasic
+com.ibm.icu.dev.test.format.DateTimeGeneratorTest#TestCheckFrozen
+com.ibm.icu.dev.test.format.DateTimeGeneratorTest#TestClone
+com.ibm.icu.dev.test.format.DateTimeGeneratorTest#TestEmpty
+com.ibm.icu.dev.test.format.DateTimeGeneratorTest#TestFreezeAndCloneAsThawed
+com.ibm.icu.dev.test.format.DateTimeGeneratorTest#TestGetAppendItemFormat
+com.ibm.icu.dev.test.format.DateTimeGeneratorTest#TestGetAppendItemName
+com.ibm.icu.dev.test.format.DateTimeGeneratorTest#TestGetBaseSkeleton
+com.ibm.icu.dev.test.format.DateTimeGeneratorTest#TestGetBaseSkeletons
+com.ibm.icu.dev.test.format.DateTimeGeneratorTest#TestGetDecimal
+com.ibm.icu.dev.test.format.DateTimeGeneratorTest#TestGetFields
+com.ibm.icu.dev.test.format.DateTimeGeneratorTest#TestGetInstance
+com.ibm.icu.dev.test.format.DateTimeGeneratorTest#TestGetRedundants
+com.ibm.icu.dev.test.format.DateTimeGeneratorTest#TestGetSkeleton
+com.ibm.icu.dev.test.format.DateTimeGeneratorTest#TestGetSkeletons
+com.ibm.icu.dev.test.format.DateTimeGeneratorTest#TestHasDateAndTimeFields
+com.ibm.icu.dev.test.format.DateTimeGeneratorTest#TestIsSingleField
+com.ibm.icu.dev.test.format.DateTimeGeneratorTest#TestJavaLocale
+com.ibm.icu.dev.test.format.DateTimeGeneratorTest#TestOptions
+com.ibm.icu.dev.test.format.DateTimeGeneratorTest#TestOrdering
+com.ibm.icu.dev.test.format.DateTimeGeneratorTest#TestPatternParser
+com.ibm.icu.dev.test.format.DateTimeGeneratorTest#TestReplacingZoneString
+com.ibm.icu.dev.test.format.DateTimeGeneratorTest#TestRoot
+com.ibm.icu.dev.test.format.DateTimeGeneratorTest#TestSet
+com.ibm.icu.dev.test.format.DateTimeGeneratorTest#TestSimple
+com.ibm.icu.dev.test.format.DateTimeGeneratorTest#TestT7169
+com.ibm.icu.dev.test.format.DateTimeGeneratorTest#TestToString
+com.ibm.icu.dev.test.format.DateTimeGeneratorTest#TestVariableCharacters
+com.ibm.icu.dev.test.format.DateTimeGeneratorTest#TestVariableField_String
+com.ibm.icu.dev.test.format.GlobalizationPreferencesTest#TestBreakIterator
+com.ibm.icu.dev.test.format.GlobalizationPreferencesTest#TestCalendar
+com.ibm.icu.dev.test.format.GlobalizationPreferencesTest#TestCollator
+com.ibm.icu.dev.test.format.GlobalizationPreferencesTest#TestCurrency
+com.ibm.icu.dev.test.format.GlobalizationPreferencesTest#TestDateFormat
+com.ibm.icu.dev.test.format.GlobalizationPreferencesTest#TestDefault
+com.ibm.icu.dev.test.format.GlobalizationPreferencesTest#TestDisplayName
+com.ibm.icu.dev.test.format.GlobalizationPreferencesTest#TestFreezable
+com.ibm.icu.dev.test.format.GlobalizationPreferencesTest#TestJB5380
+com.ibm.icu.dev.test.format.GlobalizationPreferencesTest#TestNumberFormat
+com.ibm.icu.dev.test.format.GlobalizationPreferencesTest#TestResourceBundle
+com.ibm.icu.dev.test.format.GlobalizationPreferencesTest#TestSetLocales
+com.ibm.icu.dev.test.format.GlobalizationPreferencesTest#TestTerritory
+com.ibm.icu.dev.test.format.GlobalizationPreferencesTest#TestTimeZone
+com.ibm.icu.dev.test.format.IntlTestDateFormatAPIC#TestNameHiding
+com.ibm.icu.dev.test.format.IntlTestDateFormatAPI#TestAPI
+com.ibm.icu.dev.test.format.IntlTestDateFormatAPI#TestEquals
+com.ibm.icu.dev.test.format.IntlTestDateFormatSymbols#TestConstructorWithCalendar
+com.ibm.icu.dev.test.format.IntlTestDateFormatSymbols#TestGetEraNames
+com.ibm.icu.dev.test.format.IntlTestDateFormatSymbols#TestGetMonths
+com.ibm.icu.dev.test.format.IntlTestDateFormatSymbols#TestGetMonths2
+com.ibm.icu.dev.test.format.IntlTestDateFormatSymbols#TestGetWeekdays2
+com.ibm.icu.dev.test.format.IntlTestDateFormatSymbols#TestSymbols
+com.ibm.icu.dev.test.format.IntlTestDateFormat#TestAvailableLocales
+com.ibm.icu.dev.test.format.IntlTestDateFormat#TestFormat
+com.ibm.icu.dev.test.format.IntlTestDateFormat#TestRoundtrip
+com.ibm.icu.dev.test.format.IntlTestDateFormat#TestULocale
+com.ibm.icu.dev.test.format.IntlTestDecimalFormatAPIC#TestAPI
+com.ibm.icu.dev.test.format.IntlTestDecimalFormatAPIC#testFormatToCharacterIterator
+com.ibm.icu.dev.test.format.IntlTestDecimalFormatAPIC#TestRounding
+com.ibm.icu.dev.test.format.IntlTestDecimalFormatAPI#TestAPI
+com.ibm.icu.dev.test.format.IntlTestDecimalFormatAPI#testJB1871
+com.ibm.icu.dev.test.format.IntlTestDecimalFormatAPI#testJB4971
+com.ibm.icu.dev.test.format.IntlTestDecimalFormatAPI#testJB6134
+com.ibm.icu.dev.test.format.IntlTestDecimalFormatAPI#testJB6354
+com.ibm.icu.dev.test.format.IntlTestDecimalFormatAPI#testJB6648
+com.ibm.icu.dev.test.format.IntlTestDecimalFormatSymbolsC#TestSymbols
+com.ibm.icu.dev.test.format.IntlTestDecimalFormatSymbols#testCoverage
+com.ibm.icu.dev.test.format.IntlTestDecimalFormatSymbols#TestSymbols
+com.ibm.icu.dev.test.format.IntlTestNumberFormatAPI#TestAPI
+com.ibm.icu.dev.test.format.IntlTestNumberFormatAPI#TestCoverage
+com.ibm.icu.dev.test.format.IntlTestNumberFormat#TestAvailableLocales
+com.ibm.icu.dev.test.format.IntlTestNumberFormat#TestLocale
+com.ibm.icu.dev.test.format.IntlTestNumberFormat#TestMonster
+com.ibm.icu.dev.test.format.IntlTestSimpleDateFormatAPI#TestAPI
+com.ibm.icu.dev.test.format.IntlTestSimpleDateFormatAPI#TestCoverage
+com.ibm.icu.dev.test.format.ListFormatterTest#Test9946
+com.ibm.icu.dev.test.format.ListFormatterTest#TestBasic
+com.ibm.icu.dev.test.format.ListFormatterTest#TestCreatePatternForNumItems
+com.ibm.icu.dev.test.format.ListFormatterTest#TestEnglish
+com.ibm.icu.dev.test.format.ListFormatterTest#TestFromList
+com.ibm.icu.dev.test.format.ListFormatterTest#TestGetLocale
+com.ibm.icu.dev.test.format.ListFormatterTest#TestGetPatternForNumItemsException
+com.ibm.icu.dev.test.format.ListFormatterTest#TestJapanese
+com.ibm.icu.dev.test.format.ListFormatterTest#TestPatternOutOfOrder
+com.ibm.icu.dev.test.format.ListFormatterTest#TestSpecial
+com.ibm.icu.dev.test.format.MeasureUnitTest#Test10219FractionalPlurals
+com.ibm.icu.dev.test.format.MeasureUnitTest#testAUnit
+com.ibm.icu.dev.test.format.MeasureUnitTest#TestCompatible53_1
+com.ibm.icu.dev.test.format.MeasureUnitTest#TestCompatible54_1
+com.ibm.icu.dev.test.format.MeasureUnitTest#TestCompatible55_1
+com.ibm.icu.dev.test.format.MeasureUnitTest#TestCompatible56_1
+com.ibm.icu.dev.test.format.MeasureUnitTest#testCurrencies
+com.ibm.icu.dev.test.format.MeasureUnitTest#testCurrencyFormatLocale
+com.ibm.icu.dev.test.format.MeasureUnitTest#testCurrencyFormatStandInForMeasureFormat
+com.ibm.icu.dev.test.format.MeasureUnitTest#testDoubleZero
+com.ibm.icu.dev.test.format.MeasureUnitTest#testEqHashCode
+com.ibm.icu.dev.test.format.MeasureUnitTest#testEqHashCodeOfMeasure
+com.ibm.icu.dev.test.format.MeasureUnitTest#TestExamplesInDocs
+com.ibm.icu.dev.test.format.MeasureUnitTest#testFieldPosition
+com.ibm.icu.dev.test.format.MeasureUnitTest#testFieldPositionMultiple
+com.ibm.icu.dev.test.format.MeasureUnitTest#testFormatMeasuresOneArg
+com.ibm.icu.dev.test.format.MeasureUnitTest#testFormatMeasuresZeroArg
+com.ibm.icu.dev.test.format.MeasureUnitTest#TestFormatPeriodEn
+com.ibm.icu.dev.test.format.MeasureUnitTest#testFormatSingleArg
+com.ibm.icu.dev.test.format.MeasureUnitTest#testGetLocale
+com.ibm.icu.dev.test.format.MeasureUnitTest#testGram
+com.ibm.icu.dev.test.format.MeasureUnitTest#TestGreek
+com.ibm.icu.dev.test.format.MeasureUnitTest#testIndividualPluralFallback
+com.ibm.icu.dev.test.format.MeasureUnitTest#testMultiples
+com.ibm.icu.dev.test.format.MeasureUnitTest#testNumeratorPlurals
+com.ibm.icu.dev.test.format.MeasureUnitTest#testOldFormatBadArg
+com.ibm.icu.dev.test.format.MeasureUnitTest#testOldFormatWithArray
+com.ibm.icu.dev.test.format.MeasureUnitTest#testOldFormatWithList
+com.ibm.icu.dev.test.format.MeasureUnitTest#TestSerial
+com.ibm.icu.dev.test.format.MeasureUnitTest#TestSerialFormatWidthEnum
+com.ibm.icu.dev.test.format.MeasureUnitTest#testSimplePer
+com.ibm.icu.dev.test.format.MeasureUnitTest#testUnitPerUnitResolution
+com.ibm.icu.dev.test.format.MessagePatternUtilTest#TestChoiceArg
+com.ibm.icu.dev.test.format.MessagePatternUtilTest#TestComplexArgs
+com.ibm.icu.dev.test.format.MessagePatternUtilTest#TestHello
+com.ibm.icu.dev.test.format.MessagePatternUtilTest#TestHelloWithApos
+com.ibm.icu.dev.test.format.MessagePatternUtilTest#TestHelloWithQuote
+com.ibm.icu.dev.test.format.MessagePatternUtilTest#TestNoneArg
+com.ibm.icu.dev.test.format.MessagePatternUtilTest#TestPluralArg
+com.ibm.icu.dev.test.format.MessagePatternUtilTest#TestPluralVariantsByType
+com.ibm.icu.dev.test.format.MessagePatternUtilTest#TestSelectArg
+com.ibm.icu.dev.test.format.MessagePatternUtilTest#TestSelectOrdinalArg
+com.ibm.icu.dev.test.format.MessagePatternUtilTest#TestSelectVariantsByType
+com.ibm.icu.dev.test.format.MessagePatternUtilTest#TestSimpleArg
+com.ibm.icu.dev.test.format.MessageRegression#Test4031438
+com.ibm.icu.dev.test.format.MessageRegression#Test4052223
+com.ibm.icu.dev.test.format.MessageRegression#Test4074764
+com.ibm.icu.dev.test.format.MessageRegression#Test4094906
+com.ibm.icu.dev.test.format.MessageRegression#Test4104976
+com.ibm.icu.dev.test.format.MessageRegression#Test4105380
+com.ibm.icu.dev.test.format.MessageRegression#Test4106659
+com.ibm.icu.dev.test.format.MessageRegression#Test4106660
+com.ibm.icu.dev.test.format.MessageRegression#Test4106661
+com.ibm.icu.dev.test.format.MessageRegression#Test4111739
+com.ibm.icu.dev.test.format.MessageRegression#Test4112104
+com.ibm.icu.dev.test.format.MessageRegression#Test4113018
+com.ibm.icu.dev.test.format.MessageRegression#Test4114739
+com.ibm.icu.dev.test.format.MessageRegression#Test4114743
+com.ibm.icu.dev.test.format.MessageRegression#Test4116444
+com.ibm.icu.dev.test.format.MessageRegression#Test4118592
+com.ibm.icu.dev.test.format.MessageRegression#Test4118594
+com.ibm.icu.dev.test.format.MessageRegression#Test4120552
+com.ibm.icu.dev.test.format.MessageRegression#Test4142938
+com.ibm.icu.dev.test.format.MessageRegression#Test4169959
+com.ibm.icu.dev.test.format.MessageRegression#test4232154
+com.ibm.icu.dev.test.format.MessageRegression#test4293229
+com.ibm.icu.dev.test.format.MessageRegression#testBugTestsWithNamesArguments
+com.ibm.icu.dev.test.format.MessageRegression#TestChoicePatternQuote
+com.ibm.icu.dev.test.format.MessageRegression#TestSerialization
+com.ibm.icu.dev.test.format.NumberFormatRegistrationTest#TestRegistration
+com.ibm.icu.dev.test.format.NumberFormatRegressionTest#Test4161100
+com.ibm.icu.dev.test.format.NumberFormatRegressionTest#Test4408066
+com.ibm.icu.dev.test.format.NumberFormatRegressionTest#TestJ691
+com.ibm.icu.dev.test.format.NumberFormatRegressionTest#TestJB5509
+com.ibm.icu.dev.test.format.NumberFormatRegressionTest#TestNBSPInPattern
+com.ibm.icu.dev.test.format.NumberFormatRegressionTest#TestSerialization
+com.ibm.icu.dev.test.format.NumberFormatRegressionTest#TestSurrogatesParsing
+com.ibm.icu.dev.test.format.NumberFormatRegressionTest#TestT5698
+com.ibm.icu.dev.test.format.NumberFormatRegressionTest#TestT9293
+com.ibm.icu.dev.test.format.NumberFormatRoundTripTest#TestNumberFormatRoundTrip
+com.ibm.icu.dev.test.format.NumberFormatSpecificationTest#TestBasicPatterns
+com.ibm.icu.dev.test.format.NumberFormatSpecificationTest#TestNfSetters
+com.ibm.icu.dev.test.format.NumberFormatSpecificationTest#TestPadding
+com.ibm.icu.dev.test.format.NumberFormatSpecificationTest#TestPercent
+com.ibm.icu.dev.test.format.NumberFormatSpecificationTest#TestPerMilli
+com.ibm.icu.dev.test.format.NumberFormatSpecificationTest#TestRounding
+com.ibm.icu.dev.test.format.NumberFormatSpecificationTest#TestScientificNotation
+com.ibm.icu.dev.test.format.NumberFormatSpecificationTest#TestSignificantDigits
+com.ibm.icu.dev.test.format.NumberFormatTest#Test10419RoundingWith0FractionDigits
+com.ibm.icu.dev.test.format.NumberFormatTest#Test6816
+com.ibm.icu.dev.test.format.NumberFormatTest#TestAccountingCurrency
+com.ibm.icu.dev.test.format.NumberFormatTest#TestBigDecimalRounding
+com.ibm.icu.dev.test.format.NumberFormatTest#TestBug9936
+com.ibm.icu.dev.test.format.NumberFormatTest#TestCases
+com.ibm.icu.dev.test.format.NumberFormatTest#TestCompatibleCurrencies
+com.ibm.icu.dev.test.format.NumberFormatTest#TestComplexCurrency
+com.ibm.icu.dev.test.format.NumberFormatTest#TestContext
+com.ibm.icu.dev.test.format.NumberFormatTest#TestCoverage
+com.ibm.icu.dev.test.format.NumberFormatTest#TestCurrency
+com.ibm.icu.dev.test.format.NumberFormatTest#TestCurrencyAmountCoverage
+com.ibm.icu.dev.test.format.NumberFormatTest#TestCurrencyFormatForMixParsing
+com.ibm.icu.dev.test.format.NumberFormatTest#TestCurrencyFractionDigits
+com.ibm.icu.dev.test.format.NumberFormatTest#TestCurrencyIsoPluralFormat
+com.ibm.icu.dev.test.format.NumberFormatTest#TestCurrencyKeyword
+com.ibm.icu.dev.test.format.NumberFormatTest#TestCurrencyObject
+com.ibm.icu.dev.test.format.NumberFormatTest#TestCurrencyPatterns
+com.ibm.icu.dev.test.format.NumberFormatTest#TestCurrencyPlurals
+com.ibm.icu.dev.test.format.NumberFormatTest#TestCurrencySign
+com.ibm.icu.dev.test.format.NumberFormatTest#TestCurrencyUsage
+com.ibm.icu.dev.test.format.NumberFormatTest#TestCurrFmtNegSameAsPositive
+com.ibm.icu.dev.test.format.NumberFormatTest#TestCustomCurrencySignAndSeparator
+com.ibm.icu.dev.test.format.NumberFormatTest#TestDecimalFormatCurrencyParse
+com.ibm.icu.dev.test.format.NumberFormatTest#TestExplicitParents
+com.ibm.icu.dev.test.format.NumberFormatTest#TestExponent
+com.ibm.icu.dev.test.format.NumberFormatTest#TestExponential
+com.ibm.icu.dev.test.format.NumberFormatTest#TestExponentParse
+com.ibm.icu.dev.test.format.NumberFormatTest#TestFieldPositionCurrency
+com.ibm.icu.dev.test.format.NumberFormatTest#TestFieldPositionDecimal
+com.ibm.icu.dev.test.format.NumberFormatTest#TestFieldPositionFraction
+com.ibm.icu.dev.test.format.NumberFormatTest#TestFieldPositionFractionButInteger
+com.ibm.icu.dev.test.format.NumberFormatTest#TestFieldPositionInteger
+com.ibm.icu.dev.test.format.NumberFormatTest#TestFormat
+com.ibm.icu.dev.test.format.NumberFormatTest#TestFormatToCharacterIteratorIssue11805
+com.ibm.icu.dev.test.format.NumberFormatTest#TestFormatToCharacterIteratorThread
+com.ibm.icu.dev.test.format.NumberFormatTest#TestGetAvailableLocales
+com.ibm.icu.dev.test.format.NumberFormatTest#TestGetInstance
+com.ibm.icu.dev.test.format.NumberFormatTest#TestIllegalPatterns
+com.ibm.icu.dev.test.format.NumberFormatTest#TestJB3832
+com.ibm.icu.dev.test.format.NumberFormatTest#TestJB5251
+com.ibm.icu.dev.test.format.NumberFormatTest#TestJB5358
+com.ibm.icu.dev.test.format.NumberFormatTest#TestLenientSymbolParsing
+com.ibm.icu.dev.test.format.NumberFormatTest#TestMiscCurrencyParsing
+com.ibm.icu.dev.test.format.NumberFormatTest#TestMultiCurrencySign
+com.ibm.icu.dev.test.format.NumberFormatTest#TestNegZeroRounding
+com.ibm.icu.dev.test.format.NumberFormatTest#TestNumberFormatFactory
+com.ibm.icu.dev.test.format.NumberFormatTest#TestNumberFormatTestTupleToString
+com.ibm.icu.dev.test.format.NumberFormatTest#TestNumberingSystems
+com.ibm.icu.dev.test.format.NumberFormatTest#TestPad
+com.ibm.icu.dev.test.format.NumberFormatTest#TestParse
+com.ibm.icu.dev.test.format.NumberFormatTest#TestParseCurrency
+com.ibm.icu.dev.test.format.NumberFormatTest#TestParseCurrencyTrailingSymbol
+com.ibm.icu.dev.test.format.NumberFormatTest#TestParseMaxDigits
+com.ibm.icu.dev.test.format.NumberFormatTest#TestParseNegativeWithAlternativeMinusSign
+com.ibm.icu.dev.test.format.NumberFormatTest#TestParseNegativeWithFaLocale
+com.ibm.icu.dev.test.format.NumberFormatTest#TestParseRequiredDecimalPoint
+com.ibm.icu.dev.test.format.NumberFormatTest#TestParseReturnType
+com.ibm.icu.dev.test.format.NumberFormatTest#TestParseSignsAndMarks
+com.ibm.icu.dev.test.format.NumberFormatTest#TestPatterns
+com.ibm.icu.dev.test.format.NumberFormatTest#TestPatterns2
+com.ibm.icu.dev.test.format.NumberFormatTest#TestPerMill
+com.ibm.icu.dev.test.format.NumberFormatTest#TestQuotes
+com.ibm.icu.dev.test.format.NumberFormatTest#TestRegistration
+com.ibm.icu.dev.test.format.NumberFormatTest#TestRounding
+com.ibm.icu.dev.test.format.NumberFormatTest#TestRounding487
+com.ibm.icu.dev.test.format.NumberFormatTest#TestRoundingBehavior
+com.ibm.icu.dev.test.format.NumberFormatTest#TestRoundingMode
+com.ibm.icu.dev.test.format.NumberFormatTest#TestRoundingPattern
+com.ibm.icu.dev.test.format.NumberFormatTest#TestRoundingScientific10542
+com.ibm.icu.dev.test.format.NumberFormatTest#TestRoundUnnecessarytIssue11808
+com.ibm.icu.dev.test.format.NumberFormatTest#TestScientific
+com.ibm.icu.dev.test.format.NumberFormatTest#TestScientific2
+com.ibm.icu.dev.test.format.NumberFormatTest#TestScientificGrouping
+com.ibm.icu.dev.test.format.NumberFormatTest#TestSecondaryGrouping
+com.ibm.icu.dev.test.format.NumberFormatTest#TestSetCurrency
+com.ibm.icu.dev.test.format.NumberFormatTest#TestSetMinimumIntegerDigits
+com.ibm.icu.dev.test.format.NumberFormatTest#TestShowZero
+com.ibm.icu.dev.test.format.NumberFormatTest#TestSignificantDigits
+com.ibm.icu.dev.test.format.NumberFormatTest#TestSimpleNumberFormatFactory
+com.ibm.icu.dev.test.format.NumberFormatTest#TestSpaceParsing
+com.ibm.icu.dev.test.format.NumberFormatTest#TestStrictParse
+com.ibm.icu.dev.test.format.NumberFormatTest#TestThreadedFormat
+com.ibm.icu.dev.test.format.NumberFormatTest#TestWhiteSpaceParsing
+com.ibm.icu.dev.test.format.NumberRegression#Test4052223
+com.ibm.icu.dev.test.format.NumberRegression#Test4059870
+com.ibm.icu.dev.test.format.NumberRegression#Test4061302
+com.ibm.icu.dev.test.format.NumberRegression#Test4062486
+com.ibm.icu.dev.test.format.NumberRegression#Test4066646
+com.ibm.icu.dev.test.format.NumberRegression#Test4068693
+com.ibm.icu.dev.test.format.NumberRegression#Test4069754
+com.ibm.icu.dev.test.format.NumberRegression#Test4070798
+com.ibm.icu.dev.test.format.NumberRegression#Test4071005
+com.ibm.icu.dev.test.format.NumberRegression#Test4071014
+com.ibm.icu.dev.test.format.NumberRegression#Test4071492
+com.ibm.icu.dev.test.format.NumberRegression#Test4071859
+com.ibm.icu.dev.test.format.NumberRegression#Test4074454
+com.ibm.icu.dev.test.format.NumberRegression#Test4074620
+com.ibm.icu.dev.test.format.NumberRegression#Test4075713
+com.ibm.icu.dev.test.format.NumberRegression#Test4083018
+com.ibm.icu.dev.test.format.NumberRegression#Test4086575
+com.ibm.icu.dev.test.format.NumberRegression#Test4087244
+com.ibm.icu.dev.test.format.NumberRegression#Test4087245
+com.ibm.icu.dev.test.format.NumberRegression#Test4087251
+com.ibm.icu.dev.test.format.NumberRegression#Test4087535
+com.ibm.icu.dev.test.format.NumberRegression#Test4088161
+com.ibm.icu.dev.test.format.NumberRegression#Test4088503
+com.ibm.icu.dev.test.format.NumberRegression#Test4090489
+com.ibm.icu.dev.test.format.NumberRegression#Test4090504
+com.ibm.icu.dev.test.format.NumberRegression#Test4092480
+com.ibm.icu.dev.test.format.NumberRegression#Test4092561
+com.ibm.icu.dev.test.format.NumberRegression#Test4093610
+com.ibm.icu.dev.test.format.NumberRegression#Test4095713
+com.ibm.icu.dev.test.format.NumberRegression#Test4098741
+com.ibm.icu.dev.test.format.NumberRegression#Test4099404
+com.ibm.icu.dev.test.format.NumberRegression#Test4101481
+com.ibm.icu.dev.test.format.NumberRegression#Test4106658
+com.ibm.icu.dev.test.format.NumberRegression#Test4106662
+com.ibm.icu.dev.test.format.NumberRegression#Test4106664
+com.ibm.icu.dev.test.format.NumberRegression#Test4106667
+com.ibm.icu.dev.test.format.NumberRegression#Test4108738
+com.ibm.icu.dev.test.format.NumberRegression#Test4110936
+com.ibm.icu.dev.test.format.NumberRegression#Test4114639
+com.ibm.icu.dev.test.format.NumberRegression#Test4122840
+com.ibm.icu.dev.test.format.NumberRegression#Test4125885
+com.ibm.icu.dev.test.format.NumberRegression#Test4134034
+com.ibm.icu.dev.test.format.NumberRegression#Test4134300
+com.ibm.icu.dev.test.format.NumberRegression#Test4140009
+com.ibm.icu.dev.test.format.NumberRegression#Test4141750
+com.ibm.icu.dev.test.format.NumberRegression#Test4145457
+com.ibm.icu.dev.test.format.NumberRegression#Test4147295
+com.ibm.icu.dev.test.format.NumberRegression#Test4147706
+com.ibm.icu.dev.test.format.NumberRegression#Test4162198
+com.ibm.icu.dev.test.format.NumberRegression#Test4162852
+com.ibm.icu.dev.test.format.NumberRegression#Test4167494
+com.ibm.icu.dev.test.format.NumberRegression#Test4170798
+com.ibm.icu.dev.test.format.NumberRegression#Test4176114
+com.ibm.icu.dev.test.format.NumberRegression#Test4179818
+com.ibm.icu.dev.test.format.NumberRegression#Test4185761
+com.ibm.icu.dev.test.format.NumberRegression#Test4212072
+com.ibm.icu.dev.test.format.NumberRegression#Test4216742
+com.ibm.icu.dev.test.format.NumberRegression#Test4217661
+com.ibm.icu.dev.test.format.NumberRegression#test4233840
+com.ibm.icu.dev.test.format.NumberRegression#test4241880
+com.ibm.icu.dev.test.format.NumberRegression#Test4243011
+com.ibm.icu.dev.test.format.NumberRegression#Test4243108
+com.ibm.icu.dev.test.format.NumberRegression#test4330377
+com.ibm.icu.dev.test.format.PluralFormatTest#TestEquals
+com.ibm.icu.dev.test.format.PluralFormatTest#TestGetLocale
+com.ibm.icu.dev.test.format.PluralFormatTest#TestGetPluralRules
+com.ibm.icu.dev.test.format.PluralFormatTest#TestOneFormLocales
+com.ibm.icu.dev.test.format.PluralFormatTest#TestPaucal1_234
+com.ibm.icu.dev.test.format.PluralFormatTest#TestPaucal1_2_34
+com.ibm.icu.dev.test.format.PluralFormatTest#TestPaucalExcept11_14
+com.ibm.icu.dev.test.format.PluralFormatTest#TestPaucalRu
+com.ibm.icu.dev.test.format.PluralFormatTest#TestSetLocale
+com.ibm.icu.dev.test.format.PluralFormatTest#TestSingular01Locales
+com.ibm.icu.dev.test.format.PluralFormatTest#TestSingular1Locales
+com.ibm.icu.dev.test.format.PluralFormatTest#TestSingularDual
+com.ibm.icu.dev.test.format.PluralFormatTest#TestSingularPaucal
+com.ibm.icu.dev.test.format.PluralFormatTest#TestSingularZeroSome
+com.ibm.icu.dev.test.format.PluralFormatTest#TestSpecial12_19
+com.ibm.icu.dev.test.format.PluralFormatTest#TestZeroSingularLocales
+com.ibm.icu.dev.test.format.PluralFormatUnitTest#TestApplyPatternAndFormat
+com.ibm.icu.dev.test.format.PluralFormatUnitTest#TestConstructor
+com.ibm.icu.dev.test.format.PluralFormatUnitTest#TestDecimals
+com.ibm.icu.dev.test.format.PluralFormatUnitTest#TestExtendedPluralFormat
+com.ibm.icu.dev.test.format.PluralFormatUnitTest#TestExtendedPluralFormatParsing
+com.ibm.icu.dev.test.format.PluralFormatUnitTest#TestNegative
+com.ibm.icu.dev.test.format.PluralFormatUnitTest#TestOrdinalFormat
+com.ibm.icu.dev.test.format.PluralFormatUnitTest#TestParse
+com.ibm.icu.dev.test.format.PluralFormatUnitTest#TestPattern
+com.ibm.icu.dev.test.format.PluralFormatUnitTest#TestSamples
+com.ibm.icu.dev.test.format.PluralFormatUnitTest#TestSetLocale
+com.ibm.icu.dev.test.format.PluralRangesTest#TestBasic
+com.ibm.icu.dev.test.format.PluralRangesTest#TestFormatting
+com.ibm.icu.dev.test.format.PluralRangesTest#TestLocaleData
+com.ibm.icu.dev.test.format.PluralRangesTest#TestRangePattern
+com.ibm.icu.dev.test.format.PluralRulesTest#testAvailableULocales
+com.ibm.icu.dev.test.format.PluralRulesTest#TestBasicFraction
+com.ibm.icu.dev.test.format.PluralRulesTest#testBuiltInRules
+com.ibm.icu.dev.test.format.PluralRulesTest#TestCreateRules
+com.ibm.icu.dev.test.format.PluralRulesTest#testEquality
+com.ibm.icu.dev.test.format.PluralRulesTest#TestEquals
+com.ibm.icu.dev.test.format.PluralRulesTest#testFunctionalEquivalent
+com.ibm.icu.dev.test.format.PluralRulesTest#TestGetAllKeywordValues
+com.ibm.icu.dev.test.format.PluralRulesTest#TestGetSamples
+com.ibm.icu.dev.test.format.PluralRulesTest#TestGetUniqueKeywordValue
+com.ibm.icu.dev.test.format.PluralRulesTest#TestHashCode
+com.ibm.icu.dev.test.format.PluralRulesTest#testInequality
+com.ibm.icu.dev.test.format.PluralRulesTest#testJavaLocaleFactory
+com.ibm.icu.dev.test.format.PluralRulesTest#TestKeywords
+com.ibm.icu.dev.test.format.PluralRulesTest#TestLimitedAndSamplesConsistency
+com.ibm.icu.dev.test.format.PluralRulesTest#TestLocales
+com.ibm.icu.dev.test.format.PluralRulesTest#testOperands
+com.ibm.icu.dev.test.format.PluralRulesTest#TestOrdinal
+com.ibm.icu.dev.test.format.PluralRulesTest#TestParseDescription
+com.ibm.icu.dev.test.format.PluralRulesTest#testParseEmpty
+com.ibm.icu.dev.test.format.PluralRulesTest#testParsing
+com.ibm.icu.dev.test.format.PluralRulesTest#testSamples
+com.ibm.icu.dev.test.format.PluralRulesTest#TestSerial
+com.ibm.icu.dev.test.format.PluralRulesTest#TestSerialization
+com.ibm.icu.dev.test.format.PluralRulesTest#testSyntaxRestrictions
+com.ibm.icu.dev.test.format.PluralRulesTest#testUniqueRules
+com.ibm.icu.dev.test.format.RbnfLenientScannerTest#TestAllLocales
+com.ibm.icu.dev.test.format.RbnfLenientScannerTest#TestDefaultProvider
+com.ibm.icu.dev.test.format.RbnfLenientScannerTest#TestDurations
+com.ibm.icu.dev.test.format.RbnfLenientScannerTest#TestEnglishSpellout
+com.ibm.icu.dev.test.format.RbnfLenientScannerTest#TestFrenchSpellout
+com.ibm.icu.dev.test.format.RbnfLenientScannerTest#TestGermanSpellout
+com.ibm.icu.dev.test.format.RBNFParseTest#TestLenientParse
+com.ibm.icu.dev.test.format.RBNFParseTest#TestParse
+com.ibm.icu.dev.test.format.RbnfRoundTripTest#TestDurationsRT
+com.ibm.icu.dev.test.format.RbnfRoundTripTest#TestDutchSpelloutRT
+com.ibm.icu.dev.test.format.RbnfRoundTripTest#TestEnglishSpelloutRT
+com.ibm.icu.dev.test.format.RbnfRoundTripTest#TestFrenchSpelloutRT
+com.ibm.icu.dev.test.format.RbnfRoundTripTest#TestGermanSpelloutRT
+com.ibm.icu.dev.test.format.RbnfRoundTripTest#TestGreekSpelloutRT
+com.ibm.icu.dev.test.format.RbnfRoundTripTest#TestHebrewNumberingRT
+com.ibm.icu.dev.test.format.RbnfRoundTripTest#TestItalianSpelloutRT
+com.ibm.icu.dev.test.format.RbnfRoundTripTest#TestJapaneseSpelloutRT
+com.ibm.icu.dev.test.format.RbnfRoundTripTest#TestRussianSpelloutRT
+com.ibm.icu.dev.test.format.RbnfRoundTripTest#TestSpanishSpelloutRT
+com.ibm.icu.dev.test.format.RbnfRoundTripTest#TestSwedishSpelloutRT
+com.ibm.icu.dev.test.format.RbnfRoundTripTest#TestSwissFrenchSpelloutRT
+com.ibm.icu.dev.test.format.RbnfTest#TestAllLocales
+com.ibm.icu.dev.test.format.RbnfTest#TestBigNumbers
+com.ibm.icu.dev.test.format.RbnfTest#TestChineseProcess
+com.ibm.icu.dev.test.format.RbnfTest#TestContext
+com.ibm.icu.dev.test.format.RbnfTest#TestCoverage
+com.ibm.icu.dev.test.format.RbnfTest#TestDurations
+com.ibm.icu.dev.test.format.RbnfTest#TestEnglishSpellout
+com.ibm.icu.dev.test.format.RbnfTest#TestEquals
+com.ibm.icu.dev.test.format.RbnfTest#TestFractionalRuleSet
+com.ibm.icu.dev.test.format.RbnfTest#TestFrenchSpellout
+com.ibm.icu.dev.test.format.RbnfTest#TestGermanSpellout
+com.ibm.icu.dev.test.format.RbnfTest#TestGetNameListForLocale
+com.ibm.icu.dev.test.format.RbnfTest#TestGetRuleDisplayNameLocales
+com.ibm.icu.dev.test.format.RbnfTest#TestGetRulesSetDisplayName
+com.ibm.icu.dev.test.format.RbnfTest#TestInfinityNaN
+com.ibm.icu.dev.test.format.RbnfTest#TestItalianSpellout
+com.ibm.icu.dev.test.format.RbnfTest#TestMultiplePluralRules
+com.ibm.icu.dev.test.format.RbnfTest#TestOrdinalAbbreviations
+com.ibm.icu.dev.test.format.RbnfTest#TestPluralRules
+com.ibm.icu.dev.test.format.RbnfTest#TestRounding
+com.ibm.icu.dev.test.format.RbnfTest#TestRuleSetDisplayName
+com.ibm.icu.dev.test.format.RbnfTest#TestSetDecimalFormatSymbols
+com.ibm.icu.dev.test.format.RbnfTest#TestSmallValues
+com.ibm.icu.dev.test.format.RbnfTest#TestSpanishSpellout
+com.ibm.icu.dev.test.format.RbnfTest#TestSwedishSpellout
+com.ibm.icu.dev.test.format.RbnfTest#TestSwissFrenchSpellout
+com.ibm.icu.dev.test.format.RbnfTest#TestThaiSpellout
+com.ibm.icu.dev.test.format.RbnfTest#TestTrailingSemicolon
+com.ibm.icu.dev.test.format.RbnfTest#TestUndefinedSpellout
+com.ibm.icu.dev.test.format.RbnfTest#TestVariableDecimalPoint
+com.ibm.icu.dev.test.format.RelativeDateTimeFormatterTest#TestBadDisplayContext
+com.ibm.icu.dev.test.format.RelativeDateTimeFormatterTest#TestCombineDateAndTime
+com.ibm.icu.dev.test.format.RelativeDateTimeFormatterTest#TestCustomNumberFormat
+com.ibm.icu.dev.test.format.RelativeDateTimeFormatterTest#TestFormatWithoutQuantityIllegalArgument
+com.ibm.icu.dev.test.format.RelativeDateTimeFormatterTest#TestFormatWithQuantityIllegalArgument
+com.ibm.icu.dev.test.format.RelativeDateTimeFormatterTest#TestGetters
+com.ibm.icu.dev.test.format.RelativeDateTimeFormatterTest#TestJavaLocale
+com.ibm.icu.dev.test.format.RelativeDateTimeFormatterTest#TestRelativeDateWithoutQuantity
+com.ibm.icu.dev.test.format.RelativeDateTimeFormatterTest#TestRelativeDateWithoutQuantityCaps
+com.ibm.icu.dev.test.format.RelativeDateTimeFormatterTest#TestRelativeDateWithoutQuantityNarrow
+com.ibm.icu.dev.test.format.RelativeDateTimeFormatterTest#TestRelativeDateWithoutQuantityShort
+com.ibm.icu.dev.test.format.RelativeDateTimeFormatterTest#TestRelativeDateWithQuantity
+com.ibm.icu.dev.test.format.RelativeDateTimeFormatterTest#TestRelativeDateWithQuantityCaps
+com.ibm.icu.dev.test.format.RelativeDateTimeFormatterTest#TestRelativeDateWithQuantityNarrow
+com.ibm.icu.dev.test.format.RelativeDateTimeFormatterTest#TestRelativeDateWithQuantityShort
+com.ibm.icu.dev.test.format.RelativeDateTimeFormatterTest#TestRelativeDateWithQuantitySr
+com.ibm.icu.dev.test.format.RelativeDateTimeFormatterTest#TestRelativeDateWithQuantitySrFallback
+com.ibm.icu.dev.test.format.RelativeDateTimeFormatterTest#TestSidewaysDataLoading
+com.ibm.icu.dev.test.format.RelativeDateTimeFormatterTest#TestTwoBeforeTwoAfter
+com.ibm.icu.dev.test.format.ScientificNumberFormatterTest#TestBasic
+com.ibm.icu.dev.test.format.ScientificNumberFormatterTest#TestFarsi
+com.ibm.icu.dev.test.format.ScientificNumberFormatterTest#TestFixedDecimalMarkup
+com.ibm.icu.dev.test.format.ScientificNumberFormatterTest#TestFixedDecimalSuperscript
+com.ibm.icu.dev.test.format.ScientificNumberFormatterTest#TestPlusSignInExponentMarkup
+com.ibm.icu.dev.test.format.ScientificNumberFormatterTest#TestPlusSignInExponentSuperscript
+com.ibm.icu.dev.test.format.SelectFormatAPITest#TestApplyPatternToPattern
+com.ibm.icu.dev.test.format.SelectFormatAPITest#TestConstructors
+com.ibm.icu.dev.test.format.SelectFormatAPITest#TestEquals
+com.ibm.icu.dev.test.format.SelectFormatAPITest#TestFormat
+com.ibm.icu.dev.test.format.SelectFormatAPITest#TestHashCode
+com.ibm.icu.dev.test.format.SelectFormatAPITest#TestParseObject
+com.ibm.icu.dev.test.format.SelectFormatAPITest#TestToPattern
+com.ibm.icu.dev.test.format.SelectFormatAPITest#TestToString
+com.ibm.icu.dev.test.format.SelectFormatUnitTest#TestApplyFormat
+com.ibm.icu.dev.test.format.SelectFormatUnitTest#TestInvalidKeyword
+com.ibm.icu.dev.test.format.SelectFormatUnitTest#TestPatternSyntax
+com.ibm.icu.dev.test.format.TestMessageFormat#TestAdopt
+com.ibm.icu.dev.test.format.TestMessageFormat#testApostropheInPluralAndSelect
+com.ibm.icu.dev.test.format.TestMessageFormat#TestApostropheMode
+com.ibm.icu.dev.test.format.TestMessageFormat#TestAutoQuoteApostrophe
+com.ibm.icu.dev.test.format.TestMessageFormat#TestBug1
+com.ibm.icu.dev.test.format.TestMessageFormat#TestBug2
+com.ibm.icu.dev.test.format.TestMessageFormat#TestBug3
+com.ibm.icu.dev.test.format.TestMessageFormat#TestClone
+com.ibm.icu.dev.test.format.TestMessageFormat#TestCompatibleApostrophe
+com.ibm.icu.dev.test.format.TestMessageFormat#TestDecimals
+com.ibm.icu.dev.test.format.TestMessageFormat#TestEquals
+com.ibm.icu.dev.test.format.TestMessageFormat#TestFormat
+com.ibm.icu.dev.test.format.TestMessageFormat#testFormatNamedArguments
+com.ibm.icu.dev.test.format.TestMessageFormat#TestFormatToCharacterIterator
+com.ibm.icu.dev.test.format.TestMessageFormat#TestGetFormatByArgumentName
+com.ibm.icu.dev.test.format.TestMessageFormat#TestHashCode
+com.ibm.icu.dev.test.format.TestMessageFormat#TestMsgFormatChoice
+com.ibm.icu.dev.test.format.TestMessageFormat#testNamedArguments
+com.ibm.icu.dev.test.format.TestMessageFormat#testNestedFormatsInPluralFormat
+com.ibm.icu.dev.test.format.TestMessageFormat#TestNotEquals
+com.ibm.icu.dev.test.format.TestMessageFormat#TestNullArgs
+com.ibm.icu.dev.test.format.TestMessageFormat#testNumericFormatWithMap
+com.ibm.icu.dev.test.format.TestMessageFormat#testNumericOnlyMethods
+com.ibm.icu.dev.test.format.TestMessageFormat#TestParse
+com.ibm.icu.dev.test.format.TestMessageFormat#testParseNamedArguments
+com.ibm.icu.dev.test.format.TestMessageFormat#TestPattern
+com.ibm.icu.dev.test.format.TestMessageFormat#testPluralFormat
+com.ibm.icu.dev.test.format.TestMessageFormat#testPluralFormatToPattern
+com.ibm.icu.dev.test.format.TestMessageFormat#TestRBNF
+com.ibm.icu.dev.test.format.TestMessageFormat#TestSample
+com.ibm.icu.dev.test.format.TestMessageFormat#testSelectFormat
+com.ibm.icu.dev.test.format.TestMessageFormat#testSelectFormatToPattern
+com.ibm.icu.dev.test.format.TestMessageFormat#TestSelectOrdinal
+com.ibm.icu.dev.test.format.TestMessageFormat#TestSetFormat
+com.ibm.icu.dev.test.format.TestMessageFormat#TestSetGetFormats
+com.ibm.icu.dev.test.format.TestMessageFormat#TestSetLocale
+com.ibm.icu.dev.test.format.TestMessageFormat#TestSimpleFormat
+com.ibm.icu.dev.test.format.TestMessageFormat#TestStaticFormat
+com.ibm.icu.dev.test.format.TestMessageFormat#TestTrimArgumentName
+com.ibm.icu.dev.test.format.TestMessageFormat#TestUnlimitedArgsAndSubformats
+com.ibm.icu.dev.test.format.TimeUnitTest#Test10219FactionalPluralsParse
+com.ibm.icu.dev.test.format.TimeUnitTest#Test10219FractionalPlurals
+com.ibm.icu.dev.test.format.TimeUnitTest#TestAPI
+com.ibm.icu.dev.test.format.TimeUnitTest#TestBasic
+com.ibm.icu.dev.test.format.TimeUnitTest#TestBritishShortHourFallback
+com.ibm.icu.dev.test.format.TimeUnitTest#TestClone
+com.ibm.icu.dev.test.format.TimeUnitTest#TestEqHashCode
+com.ibm.icu.dev.test.format.TimeUnitTest#TestFormat
+com.ibm.icu.dev.test.format.TimeUnitTest#TestGetLocale
+com.ibm.icu.dev.test.format.TimeUnitTest#TestGreek
+com.ibm.icu.dev.test.format.TimeUnitTest#TestGreekWithSanitization
+com.ibm.icu.dev.test.format.TimeUnitTest#TestSetLocale
+com.ibm.icu.dev.test.format.TimeUnitTest#TestSetNumberFormat
+com.ibm.icu.dev.test.format.TimeUnitTest#TestSetup
+com.ibm.icu.dev.test.format.TimeUnitTest#TestStandInForMeasureFormat
+com.ibm.icu.dev.test.format.TimeUnitTest#TestTimeUnitFormat
+com.ibm.icu.dev.test.format.TimeZoneFormatTest#TestFormat
+com.ibm.icu.dev.test.format.TimeZoneFormatTest#TestFormatTZDBNames
+com.ibm.icu.dev.test.format.TimeZoneFormatTest#TestISOFormat
+com.ibm.icu.dev.test.format.TimeZoneFormatTest#TestParse
+com.ibm.icu.dev.test.format.TimeZoneFormatTest#TestTimeRoundTrip
+com.ibm.icu.dev.test.format.TimeZoneFormatTest#TestTimeZoneRoundTrip
+com.ibm.icu.dev.test.format.TimeZoneFormatTest#TestTZDBNamesThreading
+com.ibm.icu.dev.test.iterator.TestUCharacterIterator#TestClone
+com.ibm.icu.dev.test.iterator.TestUCharacterIterator#TestIteration
+com.ibm.icu.dev.test.iterator.TestUCharacterIterator#TestIterationUChar32
+com.ibm.icu.dev.test.iterator.TestUCharacterIterator#TestJitterbug1952
+com.ibm.icu.dev.test.iterator.TestUCharacterIterator#TestPreviousNext
+com.ibm.icu.dev.test.iterator.TestUCharacterIterator#TestUCharacterIteratorWrapper
+com.ibm.icu.dev.test.lang.TestUScriptRun#TestContstruction
+com.ibm.icu.dev.test.lang.TestUScriptRun#TestReset
+com.ibm.icu.dev.test.lang.TestUScriptRun#TestRuns
+com.ibm.icu.dev.test.lang.TestUScript#TestAllCodepoints
+com.ibm.icu.dev.test.lang.TestUScript#TestGetCode
+com.ibm.icu.dev.test.lang.TestUScript#TestGetName
+com.ibm.icu.dev.test.lang.TestUScript#TestGetScript
+com.ibm.icu.dev.test.lang.TestUScript#TestGetScriptExtensions
+com.ibm.icu.dev.test.lang.TestUScript#TestGetScriptOfCharsWithScriptExtensions
+com.ibm.icu.dev.test.lang.TestUScript#TestGetShortName
+com.ibm.icu.dev.test.lang.TestUScript#TestHasScript
+com.ibm.icu.dev.test.lang.TestUScript#TestLocaleGetCode
+com.ibm.icu.dev.test.lang.TestUScript#TestMultipleCode
+com.ibm.icu.dev.test.lang.TestUScript#TestNewCode
+com.ibm.icu.dev.test.lang.TestUScript#TestScriptMetadata
+com.ibm.icu.dev.test.lang.TestUScript#TestScriptMetadataAPI
+com.ibm.icu.dev.test.lang.TestUScript#TestScriptNames
+com.ibm.icu.dev.test.lang.UCharacterCaseTest#TestCharacter
+com.ibm.icu.dev.test.lang.UCharacterCaseTest#TestDutchTitle
+com.ibm.icu.dev.test.lang.UCharacterCaseTest#TestFolding
+com.ibm.icu.dev.test.lang.UCharacterCaseTest#TestLower
+com.ibm.icu.dev.test.lang.UCharacterCaseTest#TestSpecial
+com.ibm.icu.dev.test.lang.UCharacterCaseTest#TestSpecialCasingTxt
+com.ibm.icu.dev.test.lang.UCharacterCaseTest#TestTitle
+com.ibm.icu.dev.test.lang.UCharacterCaseTest#TestTitleRegression
+com.ibm.icu.dev.test.lang.UCharacterCaseTest#TestUpper
+com.ibm.icu.dev.test.lang.UCharacterCaseTest#TestUpperLower
+com.ibm.icu.dev.test.lang.UCharacterCategoryTest#TestToString
+com.ibm.icu.dev.test.lang.UCharacterDirectionTest#TestToString
+com.ibm.icu.dev.test.lang.UCharacterSurrogateTest#TestCharCount
+com.ibm.icu.dev.test.lang.UCharacterSurrogateTest#TestCodePointAtBefore
+com.ibm.icu.dev.test.lang.UCharacterSurrogateTest#TestCodePointCount
+com.ibm.icu.dev.test.lang.UCharacterSurrogateTest#TestIsHighSurrogate
+com.ibm.icu.dev.test.lang.UCharacterSurrogateTest#TestIsLowSurrogate
+com.ibm.icu.dev.test.lang.UCharacterSurrogateTest#TestIsSupplementaryCodePoint
+com.ibm.icu.dev.test.lang.UCharacterSurrogateTest#TestIsSurrogatePair
+com.ibm.icu.dev.test.lang.UCharacterSurrogateTest#TestIsValidCodePoint
+com.ibm.icu.dev.test.lang.UCharacterSurrogateTest#TestOffsetByCodePoints
+com.ibm.icu.dev.test.lang.UCharacterSurrogateTest#TestToChars
+com.ibm.icu.dev.test.lang.UCharacterSurrogateTest#TestToCodePoint
+com.ibm.icu.dev.test.lang.UCharacterSurrogateTest#TestUnicodeBlockForName
+com.ibm.icu.dev.test.lang.UCharacterTest#TestAdditionalProperties
+com.ibm.icu.dev.test.lang.UCharacterTest#TestBase
+com.ibm.icu.dev.test.lang.UCharacterTest#TestBidiPairedBracketType
+com.ibm.icu.dev.test.lang.UCharacterTest#TestBlockData
+com.ibm.icu.dev.test.lang.UCharacterTest#TestCodePoint
+com.ibm.icu.dev.test.lang.UCharacterTest#TestCodePointAt
+com.ibm.icu.dev.test.lang.UCharacterTest#TestCodePointBefore
+com.ibm.icu.dev.test.lang.UCharacterTest#TestCodePointCount
+com.ibm.icu.dev.test.lang.UCharacterTest#TestConsistency
+com.ibm.icu.dev.test.lang.UCharacterTest#TestCoverage
+com.ibm.icu.dev.test.lang.UCharacterTest#TestDefined
+com.ibm.icu.dev.test.lang.UCharacterTest#TestDigits
+com.ibm.icu.dev.test.lang.UCharacterTest#TestForName
+com.ibm.icu.dev.test.lang.UCharacterTest#TestGetAge
+com.ibm.icu.dev.test.lang.UCharacterTest#TestGetCombiningClass
+com.ibm.icu.dev.test.lang.UCharacterTest#TestGetEuropeanDigit
+com.ibm.icu.dev.test.lang.UCharacterTest#TestGetHanNumericValue
+com.ibm.icu.dev.test.lang.UCharacterTest#TestGetInstance
+com.ibm.icu.dev.test.lang.UCharacterTest#TestGetIntPropertyMaxValue
+com.ibm.icu.dev.test.lang.UCharacterTest#TestGetIntPropertyValue
+com.ibm.icu.dev.test.lang.UCharacterTest#TestGetISOComment
+com.ibm.icu.dev.test.lang.UCharacterTest#TestGetName
+com.ibm.icu.dev.test.lang.UCharacterTest#TestGetNumericValue
+com.ibm.icu.dev.test.lang.UCharacterTest#TestGetProperty
+com.ibm.icu.dev.test.lang.UCharacterTest#TestGetUnicodeNumericValue
+com.ibm.icu.dev.test.lang.UCharacterTest#TestHasBinaryProperty
+com.ibm.icu.dev.test.lang.UCharacterTest#TestIdentifier
+com.ibm.icu.dev.test.lang.UCharacterTest#TestIsBMP
+com.ibm.icu.dev.test.lang.UCharacterTest#TestIsFrozen
+com.ibm.icu.dev.test.lang.UCharacterTest#TestIsLegal
+com.ibm.icu.dev.test.lang.UCharacterTest#TestISOControl
+com.ibm.icu.dev.test.lang.UCharacterTest#TestIteration
+com.ibm.icu.dev.test.lang.UCharacterTest#TestLetterNumber
+com.ibm.icu.dev.test.lang.UCharacterTest#TestMirror
+com.ibm.icu.dev.test.lang.UCharacterTest#TestNameIteration
+com.ibm.icu.dev.test.lang.UCharacterTest#TestNames
+com.ibm.icu.dev.test.lang.UCharacterTest#TestNextCaseMapCP
+com.ibm.icu.dev.test.lang.UCharacterTest#TestNumeric
+com.ibm.icu.dev.test.lang.UCharacterTest#TestNumericProperties
+com.ibm.icu.dev.test.lang.UCharacterTest#TestOf
+com.ibm.icu.dev.test.lang.UCharacterTest#TestPatternProperties
+com.ibm.icu.dev.test.lang.UCharacterTest#TestPrint
+com.ibm.icu.dev.test.lang.UCharacterTest#TestPropertyValues
+com.ibm.icu.dev.test.lang.UCharacterTest#TestReset
+com.ibm.icu.dev.test.lang.UCharacterTest#TestSetLimit
+com.ibm.icu.dev.test.lang.UCharacterTest#TestSpaces
+com.ibm.icu.dev.test.lang.UCharacterTest#TestSupplementary
+com.ibm.icu.dev.test.lang.UCharacterTest#TestToChars
+com.ibm.icu.dev.test.lang.UCharacterTest#TestToLowerCase
+com.ibm.icu.dev.test.lang.UCharacterTest#TestToString
+com.ibm.icu.dev.test.lang.UCharacterTest#TestToTitleCaseCoverage
+com.ibm.icu.dev.test.lang.UCharacterTest#TestToUpperCase
+com.ibm.icu.dev.test.lang.UCharacterTest#TestUCharFromNameUnderflow
+com.ibm.icu.dev.test.lang.UCharacterTest#TestUnicodeData
+com.ibm.icu.dev.test.lang.UCharacterTest#TestVersion
+com.ibm.icu.dev.test.lang.UCharacterTest#TestXSymbolTable
+com.ibm.icu.dev.test.lang.UCharacterThreadTest#TestUCharactersGetName
+com.ibm.icu.dev.test.lang.UnicodeSetStringSpanTest#TestInterestingStringSpan
+com.ibm.icu.dev.test.lang.UnicodeSetStringSpanTest#TestSimpleStringSpan
+com.ibm.icu.dev.test.lang.UnicodeSetStringSpanTest#TestSimpleStringSpanAndFreeze
+com.ibm.icu.dev.test.lang.UnicodeSetStringSpanTest#TestSimpleStringSpanSlow
+com.ibm.icu.dev.test.lang.UnicodeSetStringSpanTest#TestSpan
+com.ibm.icu.dev.test.lang.UnicodeSetStringSpanTest#TestSpanAndCount
+com.ibm.icu.dev.test.lang.UnicodeSetStringSpanTest#TestStringWithUnpairedSurrogateSpan
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestAddCollection
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestAddRemove
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestAPI
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestAStringRange
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestCategories
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestCharSequenceArgs
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestClone
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestCloseOver
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestCodePoints
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestComparison
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestConstants
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestContains
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestContainsString
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestCountIn
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestEscapePattern
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestExhaustive
+com.ibm.icu.dev.test.lang.UnicodeSetTest#testForSpanGaps
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestFrozen
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestGenerics
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestGetSet
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestHangulSyllable
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestIndexOf
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestIteration
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestMinimalRep
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestPatterns
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestPosixClasses
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestPropertyAccess
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestPropertySet
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestRangeConstructor
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestReplaceAndDelete
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestScriptNames
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestScriptSet
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestSetRelation
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestSetSpeed
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestStrings
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestSurrogate
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestSymbolTable
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestToPattern
+com.ibm.icu.dev.test.lang.UnicodeSetTest#TestUnicodeSetStrings
+com.ibm.icu.dev.test.lang.UPropertyAliasesTest#TestPropertyNames
+com.ibm.icu.dev.test.lang.UPropertyAliasesTest#TestUnknownPropertyNames
+com.ibm.icu.dev.test.lang.UTF16Test#TestAppend
+com.ibm.icu.dev.test.lang.UTF16Test#TestBounds
+com.ibm.icu.dev.test.lang.UTF16Test#TestCaseCompare
+com.ibm.icu.dev.test.lang.UTF16Test#TestCharAt
+com.ibm.icu.dev.test.lang.UTF16Test#TestCodePointCompare
+com.ibm.icu.dev.test.lang.UTF16Test#TestCountCodePoint
+com.ibm.icu.dev.test.lang.UTF16Test#TestDelete
+com.ibm.icu.dev.test.lang.UTF16Test#TestfindOffset
+com.ibm.icu.dev.test.lang.UTF16Test#TestGetCharCountSurrogate
+com.ibm.icu.dev.test.lang.UTF16Test#TestHasMoreCodePointsThan
+com.ibm.icu.dev.test.lang.UTF16Test#TestIndexOf
+com.ibm.icu.dev.test.lang.UTF16Test#TestInsert
+com.ibm.icu.dev.test.lang.UTF16Test#TestMoveCodePointOffset
+com.ibm.icu.dev.test.lang.UTF16Test#TestNewString
+com.ibm.icu.dev.test.lang.UTF16Test#TestReplace
+com.ibm.icu.dev.test.lang.UTF16Test#TestReverse
+com.ibm.icu.dev.test.lang.UTF16Test#TestSetCharAt
+com.ibm.icu.dev.test.lang.UTF16Test#TestStringComparator
+com.ibm.icu.dev.test.lang.UTF16Test#TestUtilities
+com.ibm.icu.dev.test.lang.UTF16Test#TestValueOf
+com.ibm.icu.dev.test.normalizer.BasicTest#TestBengali
+com.ibm.icu.dev.test.normalizer.BasicTest#TestBugJ2068
+com.ibm.icu.dev.test.normalizer.BasicTest#TestBugJ2324
+com.ibm.icu.dev.test.normalizer.BasicTest#TestCanonCompose
+com.ibm.icu.dev.test.normalizer.BasicTest#TestCanonIterData
+com.ibm.icu.dev.test.normalizer.BasicTest#TestCheckFCD
+com.ibm.icu.dev.test.normalizer.BasicTest#TestCombiningMarks
+com.ibm.icu.dev.test.normalizer.BasicTest#TestCompare
+com.ibm.icu.dev.test.normalizer.BasicTest#TestCompareDebug
+com.ibm.icu.dev.test.normalizer.BasicTest#TestCompatCompose
+com.ibm.icu.dev.test.normalizer.BasicTest#TestCompatDecomp
+com.ibm.icu.dev.test.normalizer.BasicTest#TestComposition
+com.ibm.icu.dev.test.normalizer.BasicTest#TestCompositionExclusion
+com.ibm.icu.dev.test.normalizer.BasicTest#TestConcatenate
+com.ibm.icu.dev.test.normalizer.BasicTest#TestCustomComp
+com.ibm.icu.dev.test.normalizer.BasicTest#TestCustomFCC
+com.ibm.icu.dev.test.normalizer.BasicTest#TestDebugIter
+com.ibm.icu.dev.test.normalizer.BasicTest#TestDebugIterOld
+com.ibm.icu.dev.test.normalizer.BasicTest#TestDebugStatic
+com.ibm.icu.dev.test.normalizer.BasicTest#TestDecomp
+com.ibm.icu.dev.test.normalizer.BasicTest#TestExplodingBase
+com.ibm.icu.dev.test.normalizer.BasicTest#TestFCNFKCClosure
+com.ibm.icu.dev.test.normalizer.BasicTest#TestFilteredAppend
+com.ibm.icu.dev.test.normalizer.BasicTest#TestFilteredNormalizer2
+com.ibm.icu.dev.test.normalizer.BasicTest#TestFindFoldFCDExceptions
+com.ibm.icu.dev.test.normalizer.BasicTest#TestGetCombiningClass
+com.ibm.icu.dev.test.normalizer.BasicTest#TestGetDecomposition
+com.ibm.icu.dev.test.normalizer.BasicTest#TestGetEasyToUseInstance
+com.ibm.icu.dev.test.normalizer.BasicTest#TestGetRawDecomposition
+com.ibm.icu.dev.test.normalizer.BasicTest#TestHangulCompose
+com.ibm.icu.dev.test.normalizer.BasicTest#TestHangulDecomp
+com.ibm.icu.dev.test.normalizer.BasicTest#TestNone
+com.ibm.icu.dev.test.normalizer.BasicTest#TestNormalizerAPI
+com.ibm.icu.dev.test.normalizer.BasicTest#TestPreviousNext
+com.ibm.icu.dev.test.normalizer.BasicTest#TestPreviousNextJCI
+com.ibm.icu.dev.test.normalizer.BasicTest#TestQuickCheckPerCP
+com.ibm.icu.dev.test.normalizer.BasicTest#TestQuickCheckResultMAYBE
+com.ibm.icu.dev.test.normalizer.BasicTest#TestQuickCheckResultNO
+com.ibm.icu.dev.test.normalizer.BasicTest#TestQuickCheckResultYES
+com.ibm.icu.dev.test.normalizer.BasicTest#TestQuickCheckStringResult
+com.ibm.icu.dev.test.normalizer.BasicTest#TestReturnFailure
+com.ibm.icu.dev.test.normalizer.BasicTest#TestSerializedSet
+com.ibm.icu.dev.test.normalizer.BasicTest#TestSkippable
+com.ibm.icu.dev.test.normalizer.BasicTest#TestTibetan
+com.ibm.icu.dev.test.normalizer.BasicTest#TestVerisign
+com.ibm.icu.dev.test.normalizer.BasicTest#TestZeroIndex
+com.ibm.icu.dev.test.normalizer.ConformanceTest#TestConformance
+com.ibm.icu.dev.test.normalizer.ConformanceTest#TestConformance_3_2
+com.ibm.icu.dev.test.normalizer.NormalizationMonkeyTest#TestNormalize
+com.ibm.icu.dev.test.normalizer.NormalizerRegressionTests#TestJB4472
+com.ibm.icu.dev.test.normalizer.TestCanonicalIterator#TestBasic
+com.ibm.icu.dev.test.normalizer.TestCanonicalIterator#TestExhaustive
+com.ibm.icu.dev.test.normalizer.TestCanonicalIterator#TestSpeed
+com.ibm.icu.dev.test.normalizer.TestDeprecatedNormalizerAPI#TestComposedCharIter
+com.ibm.icu.dev.test.normalizer.TestDeprecatedNormalizerAPI#TestNormalizerAPI
+com.ibm.icu.dev.test.normalizer.TestDeprecatedNormalizerAPI#TestRoundTrip
+com.ibm.icu.dev.test.normalizer.UTS46Test#TestAPI
+com.ibm.icu.dev.test.normalizer.UTS46Test#TestNotSTD3
+com.ibm.icu.dev.test.normalizer.UTS46Test#TestSomeCases
+com.ibm.icu.dev.test.rbbi.BreakIteratorRegTest#TestRegUnreg
+com.ibm.icu.dev.test.rbbi.BreakIteratorTest#TestBug4068133
+com.ibm.icu.dev.test.rbbi.BreakIteratorTest#TestBug4086052
+com.ibm.icu.dev.test.rbbi.BreakIteratorTest#TestBug4097779
+com.ibm.icu.dev.test.rbbi.BreakIteratorTest#TestBug4097920
+com.ibm.icu.dev.test.rbbi.BreakIteratorTest#TestBug4098467Characters
+com.ibm.icu.dev.test.rbbi.BreakIteratorTest#TestBug4098467Words
+com.ibm.icu.dev.test.rbbi.BreakIteratorTest#TestBug4111338
+com.ibm.icu.dev.test.rbbi.BreakIteratorTest#TestBug4117554Lines
+com.ibm.icu.dev.test.rbbi.BreakIteratorTest#TestBug4143071
+com.ibm.icu.dev.test.rbbi.BreakIteratorTest#TestBug4146175Lines
+com.ibm.icu.dev.test.rbbi.BreakIteratorTest#TestBug4152117
+com.ibm.icu.dev.test.rbbi.BreakIteratorTest#TestBug4152416
+com.ibm.icu.dev.test.rbbi.BreakIteratorTest#TestBug4153072
+com.ibm.icu.dev.test.rbbi.BreakIteratorTest#TestCharacterBreak
+com.ibm.icu.dev.test.rbbi.BreakIteratorTest#TestEmptyString
+com.ibm.icu.dev.test.rbbi.BreakIteratorTest#TestEndBehavior
+com.ibm.icu.dev.test.rbbi.BreakIteratorTest#TestFilteredBreakIteratorBuilder
+com.ibm.icu.dev.test.rbbi.BreakIteratorTest#TestGetAvailableLocales
+com.ibm.icu.dev.test.rbbi.BreakIteratorTest#TestLettersAndDigits
+com.ibm.icu.dev.test.rbbi.BreakIteratorTest#TestLineBreak
+com.ibm.icu.dev.test.rbbi.BreakIteratorTest#TestLineBreakContractions
+com.ibm.icu.dev.test.rbbi.BreakIteratorTest#TestNullLocale
+com.ibm.icu.dev.test.rbbi.BreakIteratorTest#TestPreceding
+com.ibm.icu.dev.test.rbbi.BreakIteratorTest#TestSentenceInvariants
+com.ibm.icu.dev.test.rbbi.BreakIteratorTest#TestT5615
+com.ibm.icu.dev.test.rbbi.BreakIteratorTest#TestTitleBreak
+com.ibm.icu.dev.test.rbbi.RBBIAPITest#TestCloneEquals
+com.ibm.icu.dev.test.rbbi.RBBIAPITest#TestFirstNextFollowing
+com.ibm.icu.dev.test.rbbi.RBBIAPITest#TestGetSetText
+com.ibm.icu.dev.test.rbbi.RBBIAPITest#TestHashCode
+com.ibm.icu.dev.test.rbbi.RBBIAPITest#TestIsBoundary
+com.ibm.icu.dev.test.rbbi.RBBIAPITest#TestLastPreviousPreceding
+com.ibm.icu.dev.test.rbbi.RBBIAPITest#TestRuleStatus
+com.ibm.icu.dev.test.rbbi.RBBIAPITest#TestToString
+com.ibm.icu.dev.test.rbbi.RBBITestExtended#TestExtended
+com.ibm.icu.dev.test.rbbi.RBBITestMonkey#TestCharMonkey
+com.ibm.icu.dev.test.rbbi.RBBITestMonkey#TestLineMonkey
+com.ibm.icu.dev.test.rbbi.RBBITestMonkey#TestRTCharMonkey
+com.ibm.icu.dev.test.rbbi.RBBITestMonkey#TestRTLineMonkey
+com.ibm.icu.dev.test.rbbi.RBBITestMonkey#TestRTSentMonkey
+com.ibm.icu.dev.test.rbbi.RBBITestMonkey#TestRTWordMonkey
+com.ibm.icu.dev.test.rbbi.RBBITestMonkey#TestSentMonkey
+com.ibm.icu.dev.test.rbbi.RBBITestMonkey#TestWordMonkey
+com.ibm.icu.dev.test.rbbi.RBBITest#TestClone
+com.ibm.icu.dev.test.rbbi.RBBITest#TestCurrent
+com.ibm.icu.dev.test.rbbi.RBBITest#TestDefaultRuleBasedCharacterIteration
+com.ibm.icu.dev.test.rbbi.RBBITest#TestDefaultRuleBasedLineIteration
+com.ibm.icu.dev.test.rbbi.RBBITest#TestDefaultRuleBasedSentenceIteration
+com.ibm.icu.dev.test.rbbi.RBBITest#TestDefaultRuleBasedWordIteration
+com.ibm.icu.dev.test.rbbi.RBBITest#TestDump
+com.ibm.icu.dev.test.rbbi.RBBITest#TestEquals
+com.ibm.icu.dev.test.rbbi.RBBITest#TestFirst
+com.ibm.icu.dev.test.rbbi.RBBITest#TestFollowing
+com.ibm.icu.dev.test.rbbi.RBBITest#TestLast
+com.ibm.icu.dev.test.rbbi.RBBITest#TestPreceding
+com.ibm.icu.dev.test.rbbi.RBBITest#TestTailoredBreaks
+com.ibm.icu.dev.test.rbbi.RBBITest#TestThaiDictionaryBreakIterator
+com.ibm.icu.dev.test.search.SearchTest#TestBasic
+com.ibm.icu.dev.test.search.SearchTest#TestBreakIterator
+com.ibm.icu.dev.test.search.SearchTest#TestBreakIteratorCanonical
+com.ibm.icu.dev.test.search.SearchTest#TestCanonical
+com.ibm.icu.dev.test.search.SearchTest#TestCollator
+com.ibm.icu.dev.test.search.SearchTest#TestCollatorCanonical
+com.ibm.icu.dev.test.search.SearchTest#TestCompositeBoundaries
+com.ibm.icu.dev.test.search.SearchTest#TestCompositeBoundariesCanonical
+com.ibm.icu.dev.test.search.SearchTest#TestConstructor
+com.ibm.icu.dev.test.search.SearchTest#TestContraction
+com.ibm.icu.dev.test.search.SearchTest#TestContractionCanonical
+com.ibm.icu.dev.test.search.SearchTest#TestDiactricMatch
+com.ibm.icu.dev.test.search.SearchTest#TestGetMatch
+com.ibm.icu.dev.test.search.SearchTest#TestGetSetAttribute
+com.ibm.icu.dev.test.search.SearchTest#TestGetSetOffset
+com.ibm.icu.dev.test.search.SearchTest#TestGetSetOffsetCanonical
+com.ibm.icu.dev.test.search.SearchTest#TestIgnorable
+com.ibm.icu.dev.test.search.SearchTest#TestIndicPrefixMatch
+com.ibm.icu.dev.test.search.SearchTest#TestInitialization
+com.ibm.icu.dev.test.search.SearchTest#TestNormCanonical
+com.ibm.icu.dev.test.search.SearchTest#TestNormExact
+com.ibm.icu.dev.test.search.SearchTest#TestOpenClose
+com.ibm.icu.dev.test.search.SearchTest#TestOverlap
+com.ibm.icu.dev.test.search.SearchTest#TestOverlapCanonical
+com.ibm.icu.dev.test.search.SearchTest#TestPattern
+com.ibm.icu.dev.test.search.SearchTest#TestPatternCanonical
+com.ibm.icu.dev.test.search.SearchTest#TestReset
+com.ibm.icu.dev.test.search.SearchTest#TestSetMatch
+com.ibm.icu.dev.test.search.SearchTest#TestStrength
+com.ibm.icu.dev.test.search.SearchTest#TestStrengthCanonical
+com.ibm.icu.dev.test.search.SearchTest#TestSubClass
+com.ibm.icu.dev.test.search.SearchTest#TestSupplementary
+com.ibm.icu.dev.test.search.SearchTest#TestSupplementaryCanonical
+com.ibm.icu.dev.test.search.SearchTest#TestText
+com.ibm.icu.dev.test.search.SearchTest#TestTextCanonical
+com.ibm.icu.dev.test.search.SearchTest#TestUsingSearchCollator
+com.ibm.icu.dev.test.search.SearchTest#TestVariable
+com.ibm.icu.dev.test.search.SearchTest#TestVariableCanonical
+com.ibm.icu.dev.test.serializable.CoverageTest#run-everything
+com.ibm.icu.dev.test.shaping.ArabicShapingRegTest#TestEquals
+com.ibm.icu.dev.test.shaping.ArabicShapingRegTest#TestError
+com.ibm.icu.dev.test.shaping.ArabicShapingRegTest#TestPreflight
+com.ibm.icu.dev.test.shaping.ArabicShapingRegTest#TestShape
+com.ibm.icu.dev.test.shaping.ArabicShapingRegTest#TestStandard
+com.ibm.icu.dev.test.stringprep.IDNAConformanceTest#TestConformance
+com.ibm.icu.dev.test.stringprep.TestIDNARef#TestChaining
+com.ibm.icu.dev.test.stringprep.TestIDNARef#TestCompare
+com.ibm.icu.dev.test.stringprep.TestIDNARef#TestConformance
+com.ibm.icu.dev.test.stringprep.TestIDNARef#TestErrorCases
+com.ibm.icu.dev.test.stringprep.TestIDNARef#TestIDNToASCII
+com.ibm.icu.dev.test.stringprep.TestIDNARef#TestIDNToUnicode
+com.ibm.icu.dev.test.stringprep.TestIDNARef#TestNamePrepConformance
+com.ibm.icu.dev.test.stringprep.TestIDNARef#TestRootLabelSeparator
+com.ibm.icu.dev.test.stringprep.TestIDNARef#TestToASCII
+com.ibm.icu.dev.test.stringprep.TestIDNARef#TestToUnicode
+com.ibm.icu.dev.test.stringprep.TestIDNA#TestChaining
+com.ibm.icu.dev.test.stringprep.TestIDNA#TestCompare
+com.ibm.icu.dev.test.stringprep.TestIDNA#TestCompareRefImpl
+com.ibm.icu.dev.test.stringprep.TestIDNA#TestConformance
+com.ibm.icu.dev.test.stringprep.TestIDNA#TestConvertIDNToASCII
+com.ibm.icu.dev.test.stringprep.TestIDNA#TestConvertIDNToUnicode
+com.ibm.icu.dev.test.stringprep.TestIDNA#TestConvertToASCII
+com.ibm.icu.dev.test.stringprep.TestIDNA#TestConvertToUnicode
+com.ibm.icu.dev.test.stringprep.TestIDNA#TestDebug
+com.ibm.icu.dev.test.stringprep.TestIDNA#TestErrorCases
+com.ibm.icu.dev.test.stringprep.TestIDNA#TestIDNACompare
+com.ibm.icu.dev.test.stringprep.TestIDNA#TestIDNToASCII
+com.ibm.icu.dev.test.stringprep.TestIDNA#TestIDNToUnicode
+com.ibm.icu.dev.test.stringprep.TestIDNA#TestJB4475
+com.ibm.icu.dev.test.stringprep.TestIDNA#TestJB4490
+com.ibm.icu.dev.test.stringprep.TestIDNA#TestJB5273
+com.ibm.icu.dev.test.stringprep.TestIDNA#TestLength
+com.ibm.icu.dev.test.stringprep.TestIDNA#TestNamePrepConformance
+com.ibm.icu.dev.test.stringprep.TestIDNA#TestRootLabelSeparator
+com.ibm.icu.dev.test.stringprep.TestIDNA#TestToASCII
+com.ibm.icu.dev.test.stringprep.TestIDNA#TestToUnicode
+com.ibm.icu.dev.test.stringprep.TestStringPrepProfiles#TestProfiles
+com.ibm.icu.dev.test.stringprep.TestStringPrep#TestCISPrep
+com.ibm.icu.dev.test.stringprep.TestStringPrep#TestCoverage
+com.ibm.icu.dev.test.stringprep.TestStringPrep#TestCSPrep
+com.ibm.icu.dev.test.stringprep.TestStringPrep#TestGetError
+com.ibm.icu.dev.test.stringprep.TestStringPrep#TestGetInstance
+com.ibm.icu.dev.test.stringprep.TestStringPrep#TestNFS4MixedPrep
+com.ibm.icu.dev.test.stringprep.TestStringPrep#TestPrepare
+com.ibm.icu.dev.test.stringprep.TestStringPrep#TestSetPreContext
+com.ibm.icu.dev.test.stringprep.TestStringPrep#TestStringPrepParseException
+com.ibm.icu.dev.test.stringprep.TestStringPrep#TestStringPrepParseExceptionEquals
+com.ibm.icu.dev.test.text.SpoofCheckerTest#TestAllowedChars
+com.ibm.icu.dev.test.text.SpoofCheckerTest#TestAllowedLocales
+com.ibm.icu.dev.test.text.SpoofCheckerTest#TestAreConfusable
+com.ibm.icu.dev.test.text.SpoofCheckerTest#TestAreConfusable1
+com.ibm.icu.dev.test.text.SpoofCheckerTest#TestBug11635
+com.ibm.icu.dev.test.text.SpoofCheckerTest#TestCheck
+com.ibm.icu.dev.test.text.SpoofCheckerTest#TestCheckResultToString11447
+com.ibm.icu.dev.test.text.SpoofCheckerTest#TestComparator
+com.ibm.icu.dev.test.text.SpoofCheckerTest#testConfData
+com.ibm.icu.dev.test.text.SpoofCheckerTest#TestGetSetAllowedChars
+com.ibm.icu.dev.test.text.SpoofCheckerTest#TestGetSetChecks
+com.ibm.icu.dev.test.text.SpoofCheckerTest#TestGetSetChecks1
+com.ibm.icu.dev.test.text.SpoofCheckerTest#TestGetSkeleton
+com.ibm.icu.dev.test.text.SpoofCheckerTest#TestIdentifierInfo
+com.ibm.icu.dev.test.text.SpoofCheckerTest#TestInvisible
+com.ibm.icu.dev.test.text.SpoofCheckerTest#TestMixedNumbers
+com.ibm.icu.dev.test.text.SpoofCheckerTest#TestOpenFromSourceRules
+com.ibm.icu.dev.test.text.SpoofCheckerTest#TestRestrictionLevel
+com.ibm.icu.dev.test.text.SpoofCheckerTest#TestSkeleton
+com.ibm.icu.dev.test.text.SpoofCheckerTest#TestSpoofAPI
+com.ibm.icu.dev.test.text.SpoofCheckerTest#TestUSpoof
+com.ibm.icu.dev.test.timescale.TimeScaleAPITest#TestBigDecimalFromBigDecimal
+com.ibm.icu.dev.test.timescale.TimeScaleAPITest#TestBigDecimalFromDouble
+com.ibm.icu.dev.test.timescale.TimeScaleAPITest#TestBigDecimalFromLong
+com.ibm.icu.dev.test.timescale.TimeScaleAPITest#TestFromLong
+com.ibm.icu.dev.test.timescale.TimeScaleAPITest#TestGetTimeScale
+com.ibm.icu.dev.test.timescale.TimeScaleAPITest#TestToBigDecimalFromBigDecimal
+com.ibm.icu.dev.test.timescale.TimeScaleAPITest#TestToBigDecimalFromLong
+com.ibm.icu.dev.test.timescale.TimeScaleAPITest#TestToBigDecimalTrunc
+com.ibm.icu.dev.test.timescale.TimeScaleAPITest#TestToLong
+com.ibm.icu.dev.test.timescale.TimeScaleDataTest#TestDotNet
+com.ibm.icu.dev.test.timescale.TimeScaleDataTest#TestEpochOffsets
+com.ibm.icu.dev.test.timescale.TimeScaleDataTest#TestFromLimits
+com.ibm.icu.dev.test.timescale.TimeScaleDataTest#TestToLimits
+com.ibm.icu.dev.test.timescale.TimeScaleMonkeyTest#TestRoundTrip
+com.ibm.icu.dev.test.timezone.TimeZoneBoundaryTest#TestBoundaries
+com.ibm.icu.dev.test.timezone.TimeZoneBoundaryTest#TestNewRules
+com.ibm.icu.dev.test.timezone.TimeZoneOffsetLocalTest#TestGetOffsetAroundTransition
+com.ibm.icu.dev.test.timezone.TimeZoneRegression#Test4052967
+com.ibm.icu.dev.test.timezone.TimeZoneRegression#Test4073209
+com.ibm.icu.dev.test.timezone.TimeZoneRegression#Test4073215
+com.ibm.icu.dev.test.timezone.TimeZoneRegression#Test4084933
+com.ibm.icu.dev.test.timezone.TimeZoneRegression#Test4096952
+com.ibm.icu.dev.test.timezone.TimeZoneRegression#Test4109314
+com.ibm.icu.dev.test.timezone.TimeZoneRegression#Test4126678
+com.ibm.icu.dev.test.timezone.TimeZoneRegression#Test4151406
+com.ibm.icu.dev.test.timezone.TimeZoneRegression#Test4151429
+com.ibm.icu.dev.test.timezone.TimeZoneRegression#Test4154525
+com.ibm.icu.dev.test.timezone.TimeZoneRegression#Test4154537
+com.ibm.icu.dev.test.timezone.TimeZoneRegression#Test4154542
+com.ibm.icu.dev.test.timezone.TimeZoneRegression#Test4154650
+com.ibm.icu.dev.test.timezone.TimeZoneRegression#Test4159922
+com.ibm.icu.dev.test.timezone.TimeZoneRegression#Test4162593
+com.ibm.icu.dev.test.timezone.TimeZoneRegression#Test4173604
+com.ibm.icu.dev.test.timezone.TimeZoneRegression#Test4176686
+com.ibm.icu.dev.test.timezone.TimeZoneRegression#Test4184229
+com.ibm.icu.dev.test.timezone.TimeZoneRegression#Test4208960
+com.ibm.icu.dev.test.timezone.TimeZoneRegression#TestJ449
+com.ibm.icu.dev.test.timezone.TimeZoneRegression#TestJ5134
+com.ibm.icu.dev.test.timezone.TimeZoneRegression#TestJohannesburg
+com.ibm.icu.dev.test.timezone.TimeZoneRegression#TestT5280
+com.ibm.icu.dev.test.timezone.TimeZoneRegression#TestT5432
+com.ibm.icu.dev.test.timezone.TimeZoneRegression#TestT7107
+com.ibm.icu.dev.test.timezone.TimeZoneRuleTest#TestBasicTimeZoneCoverage
+com.ibm.icu.dev.test.timezone.TimeZoneRuleTest#TestGetSimpleRules
+com.ibm.icu.dev.test.timezone.TimeZoneRuleTest#TestHasEquivalentTransitions
+com.ibm.icu.dev.test.timezone.TimeZoneRuleTest#TestHistoricalRuleBasedTimeZone
+com.ibm.icu.dev.test.timezone.TimeZoneRuleTest#TestOlsonTransition
+com.ibm.icu.dev.test.timezone.TimeZoneRuleTest#TestRBTZTransition
+com.ibm.icu.dev.test.timezone.TimeZoneRuleTest#TestSimpleRuleBasedTimeZone
+com.ibm.icu.dev.test.timezone.TimeZoneRuleTest#TestSimpleTimeZoneCoverage
+com.ibm.icu.dev.test.timezone.TimeZoneRuleTest#TestT6216
+com.ibm.icu.dev.test.timezone.TimeZoneRuleTest#TestT6669
+com.ibm.icu.dev.test.timezone.TimeZoneRuleTest#TestT8943
+com.ibm.icu.dev.test.timezone.TimeZoneRuleTest#TestTimeZoneRuleCoverage
+com.ibm.icu.dev.test.timezone.TimeZoneRuleTest#TestVTimeZoneCoverage
+com.ibm.icu.dev.test.timezone.TimeZoneRuleTest#TestVTimeZoneHeaderProps
+com.ibm.icu.dev.test.timezone.TimeZoneRuleTest#TestVTimeZoneParse
+com.ibm.icu.dev.test.timezone.TimeZoneRuleTest#TestVTimeZoneRoundTrip
+com.ibm.icu.dev.test.timezone.TimeZoneRuleTest#TestVTimeZoneRoundTripPartial
+com.ibm.icu.dev.test.timezone.TimeZoneRuleTest#TestVTimeZoneSimpleWrite
+com.ibm.icu.dev.test.timezone.TimeZoneTest#TestAlternateRules
+com.ibm.icu.dev.test.timezone.TimeZoneTest#TestCanonicalID
+com.ibm.icu.dev.test.timezone.TimeZoneTest#TestCountries
+com.ibm.icu.dev.test.timezone.TimeZoneTest#TestCoverage
+com.ibm.icu.dev.test.timezone.TimeZoneTest#TestCustomParse
+com.ibm.icu.dev.test.timezone.TimeZoneTest#TestDisplayName
+com.ibm.icu.dev.test.timezone.TimeZoneTest#TestDisplayName2
+com.ibm.icu.dev.test.timezone.TimeZoneTest#TestDisplayNamesMeta
+com.ibm.icu.dev.test.timezone.TimeZoneTest#TestDSTSavings
+com.ibm.icu.dev.test.timezone.TimeZoneTest#TestEquivalencyGroups
+com.ibm.icu.dev.test.timezone.TimeZoneTest#TestFebruary
+com.ibm.icu.dev.test.timezone.TimeZoneTest#TestFractionalDST
+com.ibm.icu.dev.test.timezone.TimeZoneTest#TestFreezable
+com.ibm.icu.dev.test.timezone.TimeZoneTest#TestGenericAPI
+com.ibm.icu.dev.test.timezone.TimeZoneTest#TestGetAvailableIDs913
+com.ibm.icu.dev.test.timezone.TimeZoneTest#TestGetAvailableIDsNew
+com.ibm.icu.dev.test.timezone.TimeZoneTest#TestGetIDForWindowsID
+com.ibm.icu.dev.test.timezone.TimeZoneTest#TestGetOffsetDate
+com.ibm.icu.dev.test.timezone.TimeZoneTest#TestGetRegion
+com.ibm.icu.dev.test.timezone.TimeZoneTest#TestGetWindowsID
+com.ibm.icu.dev.test.timezone.TimeZoneTest#TestHashCode
+com.ibm.icu.dev.test.timezone.TimeZoneTest#TestMark
+com.ibm.icu.dev.test.timezone.TimeZoneTest#TestOddTimeZoneNames
+com.ibm.icu.dev.test.timezone.TimeZoneTest#TestPRTOffset
+com.ibm.icu.dev.test.timezone.TimeZoneTest#TestRuleAPI
+com.ibm.icu.dev.test.timezone.TimeZoneTest#TestSetDefault
+com.ibm.icu.dev.test.timezone.TimeZoneTest#TestShortZoneIDs
+com.ibm.icu.dev.test.timezone.TimeZoneTest#TestSimpleTimeZoneSerialization
+com.ibm.icu.dev.test.timezone.TimeZoneTest#TestVariousAPI518
+com.ibm.icu.dev.test.timezone.TimeZoneTest#TestZoneFields
+com.ibm.icu.dev.test.timezone.TimeZoneTest#TestZoneMeta
+com.ibm.icu.dev.test.translit.AnyScriptTest#TestCommonDigits
+com.ibm.icu.dev.test.translit.AnyScriptTest#TestContext
+com.ibm.icu.dev.test.translit.AnyScriptTest#TestForWidth
+com.ibm.icu.dev.test.translit.AnyScriptTest#TestScripts
+com.ibm.icu.dev.test.translit.CompoundTransliteratorTest#TestConstruction
+com.ibm.icu.dev.test.translit.CompoundTransliteratorTest#TestGetTransliterator
+com.ibm.icu.dev.test.translit.CompoundTransliteratorTest#TestTransliterate
+com.ibm.icu.dev.test.translit.ErrorTest#TestRBTErrors
+com.ibm.icu.dev.test.translit.ErrorTest#TestTransliteratorErrors
+com.ibm.icu.dev.test.translit.ErrorTest#TestUnicodeSetErrors
+com.ibm.icu.dev.test.translit.JamoTest#TestJamo
+com.ibm.icu.dev.test.translit.JamoTest#TestPiecemeal
+com.ibm.icu.dev.test.translit.JamoTest#TestRealText
+com.ibm.icu.dev.test.translit.JamoTest#TestRoundTrip
+com.ibm.icu.dev.test.translit.RegexUtilitiesTest#TestBnf
+com.ibm.icu.dev.test.translit.RegexUtilitiesTest#TestCharacters
+com.ibm.icu.dev.test.translit.RegexUtilitiesTest#TestConstruction
+com.ibm.icu.dev.test.translit.RegexUtilitiesTest#TestUnicodeProperties
+com.ibm.icu.dev.test.translit.ReplaceableTest#Test
+com.ibm.icu.dev.test.translit.ReplaceableTest#Test5789
+com.ibm.icu.dev.test.translit.RoundTripTest#TestArabic
+com.ibm.icu.dev.test.translit.RoundTripTest#TestCyrillic
+com.ibm.icu.dev.test.translit.RoundTripTest#TestDevanagariLatin
+com.ibm.icu.dev.test.translit.RoundTripTest#Testel
+com.ibm.icu.dev.test.translit.RoundTripTest#TestGreek
+com.ibm.icu.dev.test.translit.RoundTripTest#TestGreekUNGEGN
+com.ibm.icu.dev.test.translit.RoundTripTest#TestHan
+com.ibm.icu.dev.test.translit.RoundTripTest#TestHangul
+com.ibm.icu.dev.test.translit.RoundTripTest#TestHangul2
+com.ibm.icu.dev.test.translit.RoundTripTest#TestHebrew
+com.ibm.icu.dev.test.translit.RoundTripTest#TestHiragana
+com.ibm.icu.dev.test.translit.RoundTripTest#TestInterIndic
+com.ibm.icu.dev.test.translit.RoundTripTest#TestJamo
+com.ibm.icu.dev.test.translit.RoundTripTest#TestKana
+com.ibm.icu.dev.test.translit.RoundTripTest#TestKatakana
+com.ibm.icu.dev.test.translit.RoundTripTest#TestSingle
+com.ibm.icu.dev.test.translit.RoundTripTest#TestThai
+com.ibm.icu.dev.test.translit.TestUnicodeProperty#TestBasic
+com.ibm.icu.dev.test.translit.TestUnicodeProperty#TestSymbolTable
+com.ibm.icu.dev.test.translit.TestUnicodeProperty#TestSymbolTable2
+com.ibm.icu.dev.test.translit.ThreadTest#TestAnyTranslit
+com.ibm.icu.dev.test.translit.ThreadTest#TestThreads
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestAliasInverseID
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestAlternateSyntax
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestAnchorMasking
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestAnchors
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestAny
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestAnyX
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestArbitraryVariableValues
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestBeginEnd
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestBeginEndToRules
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestCaseMap
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestCasing
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestCharUtils
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestChinese
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestCompoundFilter
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestCompoundFilterID
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestCompoundHex
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestCompoundInverse
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestCompoundInverseID
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestCompoundKana
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestCompoundLatinRT
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestCompoundRBT
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestContext
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestCopyJ476
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestCoverage
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestCreateInstance
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestCursorOffset
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestDevanagariLatinRT
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestDisplayName
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestEmptyContext
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestEscape
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestFilterIDs
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestFiltering
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestFunction
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestGetAvailableTargets
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestGetAvailableVariants
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestGurmukhiDevanagari
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestHalfwidthFullwidth
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestHangul
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestHiraganaKatakana
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestIDForms
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestIncrementalProgress
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestInlineSet
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestInstantiation
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestInterIndic
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestInvalidBackRef
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestInvalidPostContext
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestJ277
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestJ329
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestKeyboard
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestKeyboard2
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestKeyboard3
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestLiberalizedID
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestLocaleInstantiation
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestLocaleResource
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestMulticharStringSet
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestNameMap
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestNewEngine
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestNextLine
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestNFDChainRBT
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestNormalizationTransliterator
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestNullInverse
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestOutputSet
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestParseError
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestPatternQuoting
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestPatternWhitespace
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestPositionAPI
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestPositionHandling
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestPropertySet
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestQuantifiedSegment
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestQuantifier
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestRegisterAlias
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestRegistry
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestRemove
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestRuleBasedInverse
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestSanskritLatinRT
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestScriptAllCodepoints
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestSegments
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestSimpleRules
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestSourceTargetSet
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestSpecialCases
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestSTV
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestSupplemental
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestSurrogateCasing
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestT5160
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestTeluguLatinRT
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestThai
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestTitleAccents
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestToRules
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestToRulesMark
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestUndefinedVariable
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestUserFunction
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestVariableNames
+com.ibm.icu.dev.test.translit.TransliteratorTest#TestVariableRange
+com.ibm.icu.dev.test.translit.UnicodeMapTest#TestAMonkey
+com.ibm.icu.dev.test.translit.UnicodeMapTest#TestCloneAsThawed11721
+com.ibm.icu.dev.test.translit.UnicodeMapTest#TestIterations
+com.ibm.icu.dev.test.translit.UnicodeMapTest#TestModify
+com.ibm.icu.dev.test.translit.UnicodeMapTest#TestRemove
+com.ibm.icu.dev.test.util.BytesTrieTest#Test00Builder
+com.ibm.icu.dev.test.util.BytesTrieTest#Test10Empty
+com.ibm.icu.dev.test.util.BytesTrieTest#Test11_a
+com.ibm.icu.dev.test.util.BytesTrieTest#Test12_a_ab
+com.ibm.icu.dev.test.util.BytesTrieTest#Test20ShortestBranch
+com.ibm.icu.dev.test.util.BytesTrieTest#Test21Branches
+com.ibm.icu.dev.test.util.BytesTrieTest#Test22LongSequence
+com.ibm.icu.dev.test.util.BytesTrieTest#Test23LongBranch
+com.ibm.icu.dev.test.util.BytesTrieTest#Test24ValuesForState
+com.ibm.icu.dev.test.util.BytesTrieTest#Test30Compact
+com.ibm.icu.dev.test.util.BytesTrieTest#Test40GetUniqueValue
+com.ibm.icu.dev.test.util.BytesTrieTest#Test41GetNextBytes
+com.ibm.icu.dev.test.util.BytesTrieTest#Test50IteratorFromBranch
+com.ibm.icu.dev.test.util.BytesTrieTest#Test51IteratorFromLinearMatch
+com.ibm.icu.dev.test.util.BytesTrieTest#Test52TruncatingIteratorFromRoot
+com.ibm.icu.dev.test.util.BytesTrieTest#Test53TruncatingIteratorFromLinearMatchShort
+com.ibm.icu.dev.test.util.BytesTrieTest#Test54TruncatingIteratorFromLinearMatchLong
+com.ibm.icu.dev.test.util.BytesTrieTest#Test59IteratorFromBytes
+com.ibm.icu.dev.test.util.CharsTrieTest#Test00Builder
+com.ibm.icu.dev.test.util.CharsTrieTest#Test10Empty
+com.ibm.icu.dev.test.util.CharsTrieTest#Test11_a
+com.ibm.icu.dev.test.util.CharsTrieTest#Test12_a_ab
+com.ibm.icu.dev.test.util.CharsTrieTest#Test20ShortestBranch
+com.ibm.icu.dev.test.util.CharsTrieTest#Test21Branches
+com.ibm.icu.dev.test.util.CharsTrieTest#Test22LongSequence
+com.ibm.icu.dev.test.util.CharsTrieTest#Test23LongBranch
+com.ibm.icu.dev.test.util.CharsTrieTest#Test24ValuesForState
+com.ibm.icu.dev.test.util.CharsTrieTest#Test30Compact
+com.ibm.icu.dev.test.util.CharsTrieTest#Test31FirstForCodePoint
+com.ibm.icu.dev.test.util.CharsTrieTest#Test32NextForCodePoint
+com.ibm.icu.dev.test.util.CharsTrieTest#Test37LargeTrie
+com.ibm.icu.dev.test.util.CharsTrieTest#Test40GetUniqueValue
+com.ibm.icu.dev.test.util.CharsTrieTest#Test41GetNextChars
+com.ibm.icu.dev.test.util.CharsTrieTest#Test50IteratorFromBranch
+com.ibm.icu.dev.test.util.CharsTrieTest#Test51IteratorFromLinearMatch
+com.ibm.icu.dev.test.util.CharsTrieTest#Test52TruncatingIteratorFromRoot
+com.ibm.icu.dev.test.util.CharsTrieTest#Test53TruncatingIteratorFromLinearMatchShort
+com.ibm.icu.dev.test.util.CharsTrieTest#Test54TruncatingIteratorFromLinearMatchLong
+com.ibm.icu.dev.test.util.CharsTrieTest#Test59IteratorFromChars
+com.ibm.icu.dev.test.util.CompactArrayTest#TestByteArrayCoverage
+com.ibm.icu.dev.test.util.CompactArrayTest#TestCharArrayCoverage
+com.ibm.icu.dev.test.util.CurrencyTest#TestAPI
+com.ibm.icu.dev.test.util.CurrencyTest#TestAvailableCurrencyCodes
+com.ibm.icu.dev.test.util.CurrencyTest#TestCoverage
+com.ibm.icu.dev.test.util.CurrencyTest#TestCurrencyData
+com.ibm.icu.dev.test.util.CurrencyTest#TestCurrencyDisplayNames
+com.ibm.icu.dev.test.util.CurrencyTest#TestCurrencyInfoCtor
+com.ibm.icu.dev.test.util.CurrencyTest#TestCurrencyKeyword
+com.ibm.icu.dev.test.util.CurrencyTest#TestCurrencyMetaInfo
+com.ibm.icu.dev.test.util.CurrencyTest#testCurrencyMetaInfoRanges
+com.ibm.icu.dev.test.util.CurrencyTest#testCurrencyMetaInfoRangesWithLongs
+com.ibm.icu.dev.test.util.CurrencyTest#TestDeprecatedCurrencyFormat
+com.ibm.icu.dev.test.util.CurrencyTest#TestGetAvailableCurrencies
+com.ibm.icu.dev.test.util.CurrencyTest#TestGetDisplayName
+com.ibm.icu.dev.test.util.CurrencyTest#TestGetNumericCode
+com.ibm.icu.dev.test.util.CurrencyTest#TestIsAvailable
+com.ibm.icu.dev.test.util.CurrencyTest#TestNames
+com.ibm.icu.dev.test.util.CurrencyTest#TestRegistration
+com.ibm.icu.dev.test.util.CurrencyTest#TestWithTender
+com.ibm.icu.dev.test.util.DebugUtilitiesTest#TestStrings
+com.ibm.icu.dev.test.util.GenderInfoTest#TestEmpty
+com.ibm.icu.dev.test.util.GenderInfoTest#TestFallback
+com.ibm.icu.dev.test.util.GenderInfoTest#TestOne
+com.ibm.icu.dev.test.util.GenderInfoTest#TestOther
+com.ibm.icu.dev.test.util.ICUBinaryTest#TestReadHeader
+com.ibm.icu.dev.test.util.ICUResourceBundleCollationTest#TestFunctionalEquivalent
+com.ibm.icu.dev.test.util.ICUResourceBundleCollationTest#TestGetWithFallback
+com.ibm.icu.dev.test.util.ICUResourceBundleCollationTest#TestKeywordValues
+com.ibm.icu.dev.test.util.ICUResourceBundleCollationTest#TestOpen
+com.ibm.icu.dev.test.util.ICUResourceBundleTest#TestAlias
+com.ibm.icu.dev.test.util.ICUResourceBundleTest#TestAliases
+com.ibm.icu.dev.test.util.ICUResourceBundleTest#TestAliasFallback
+com.ibm.icu.dev.test.util.ICUResourceBundleTest#TestBasicTypes
+com.ibm.icu.dev.test.util.ICUResourceBundleTest#TestCircularAliases
+com.ibm.icu.dev.test.util.ICUResourceBundleTest#TestCLDRStyleAliases
+com.ibm.icu.dev.test.util.ICUResourceBundleTest#TestCoverage
+com.ibm.icu.dev.test.util.ICUResourceBundleTest#TestFunctionalEquivalent
+com.ibm.icu.dev.test.util.ICUResourceBundleTest#TestGetResources
+com.ibm.icu.dev.test.util.ICUResourceBundleTest#TestGetWithFallback
+com.ibm.icu.dev.test.util.ICUResourceBundleTest#TestICUGetKeysAtTopLevel
+com.ibm.icu.dev.test.util.ICUResourceBundleTest#TestICUGetKeysForResourceItem
+com.ibm.icu.dev.test.util.ICUResourceBundleTest#TestJavaULocaleBundleLoading
+com.ibm.icu.dev.test.util.ICUResourceBundleTest#TestJB3879
+com.ibm.icu.dev.test.util.ICUResourceBundleTest#TestJB4102
+com.ibm.icu.dev.test.util.ICUResourceBundleTest#TestLoadingStatus
+com.ibm.icu.dev.test.util.ICUResourceBundleTest#TestLocaleDisplayNames
+com.ibm.icu.dev.test.util.ICUResourceBundleTest#TestNorwegian
+com.ibm.icu.dev.test.util.ICUResourceBundleTest#TestOpen
+com.ibm.icu.dev.test.util.ICUResourceBundleTest#TestPreventFallback
+com.ibm.icu.dev.test.util.ICUResourceBundleTest#TestResourceBundleWrapper
+com.ibm.icu.dev.test.util.ICUResourceBundleTest#TestT6844
+com.ibm.icu.dev.test.util.ICUResourceBundleTest#TestTable32
+com.ibm.icu.dev.test.util.ICUResourceBundleTest#TestUResourceBundleCoverage
+com.ibm.icu.dev.test.util.ICUResourceBundleTest#TestXPathAlias
+com.ibm.icu.dev.test.util.ICUServiceTest#TestAPI
+com.ibm.icu.dev.test.util.ICUServiceTest#TestCoverage
+com.ibm.icu.dev.test.util.ICUServiceTest#TestLocale
+com.ibm.icu.dev.test.util.ICUServiceTest#TestWrapFactory
+com.ibm.icu.dev.test.util.ICUServiceThreadTest#Test00_ConcurrentGet
+com.ibm.icu.dev.test.util.ICUServiceThreadTest#Test01_ConcurrentGetVisible
+com.ibm.icu.dev.test.util.ICUServiceThreadTest#Test02_ConcurrentGetDisplay
+com.ibm.icu.dev.test.util.ICUServiceThreadTest#Test03_ConcurrentRegUnreg
+com.ibm.icu.dev.test.util.ICUServiceThreadTest#Test04_WitheringService
+com.ibm.icu.dev.test.util.ICUServiceThreadTest#Test05_ConcurrentEverything
+com.ibm.icu.dev.test.util.LocaleAliasCollationTest#TestCollation
+com.ibm.icu.dev.test.util.LocaleAliasTest#TestCalendar
+com.ibm.icu.dev.test.util.LocaleAliasTest#TestDateFormat
+com.ibm.icu.dev.test.util.LocaleAliasTest#TestDisplayName
+com.ibm.icu.dev.test.util.LocaleAliasTest#TestULocale
+com.ibm.icu.dev.test.util.LocaleAliasTest#TestUResourceBundle
+com.ibm.icu.dev.test.util.LocaleBuilderTest#TestLocaleBuilder
+com.ibm.icu.dev.test.util.LocaleBuilderTest#TestSetLocale
+com.ibm.icu.dev.test.util.LocaleDataTest#TestCoverage
+com.ibm.icu.dev.test.util.LocaleDataTest#TestEnglishExemplarCharacters
+com.ibm.icu.dev.test.util.LocaleDataTest#TestExemplarSet
+com.ibm.icu.dev.test.util.LocaleDataTest#TestExemplarSet2
+com.ibm.icu.dev.test.util.LocaleDataTest#TestExemplarSetTypes
+com.ibm.icu.dev.test.util.LocaleDataTest#TestFallback
+com.ibm.icu.dev.test.util.LocaleDataTest#TestLocaleDisplayPattern
+com.ibm.icu.dev.test.util.LocaleDataTest#TestMeasurementSystem
+com.ibm.icu.dev.test.util.LocaleDataTest#TestPaperSize
+com.ibm.icu.dev.test.util.LocaleMatcherTest#Test8288
+com.ibm.icu.dev.test.util.LocaleMatcherTest#testAsymmetry
+com.ibm.icu.dev.test.util.LocaleMatcherTest#testBasics
+com.ibm.icu.dev.test.util.LocaleMatcherTest#testBestMatchForTraditionalChinese
+com.ibm.icu.dev.test.util.LocaleMatcherTest#testChinese
+com.ibm.icu.dev.test.util.LocaleMatcherTest#testEmpty
+com.ibm.icu.dev.test.util.LocaleMatcherTest#testenGB
+com.ibm.icu.dev.test.util.LocaleMatcherTest#testExactMatches
+com.ibm.icu.dev.test.util.LocaleMatcherTest#testFallback
+com.ibm.icu.dev.test.util.LocaleMatcherTest#testFallbacks
+com.ibm.icu.dev.test.util.LocaleMatcherTest#testGetBestMatchForList_closeEnoughMatchOnMaximized
+com.ibm.icu.dev.test.util.LocaleMatcherTest#testGetBestMatchForList_exactMatch
+com.ibm.icu.dev.test.util.LocaleMatcherTest#testGetBestMatchForList_matchOnMaximized
+com.ibm.icu.dev.test.util.LocaleMatcherTest#testGetBestMatchForList_matchOnMaximized2
+com.ibm.icu.dev.test.util.LocaleMatcherTest#testGetBestMatchForList_noMatchOnMaximized
+com.ibm.icu.dev.test.util.LocaleMatcherTest#testGetBestMatchForList_simpleVariantMatch
+com.ibm.icu.dev.test.util.LocaleMatcherTest#testGetBestMatchForPortuguese
+com.ibm.icu.dev.test.util.LocaleMatcherTest#testGetBestMatch_googlePseudoLocales
+com.ibm.icu.dev.test.util.LocaleMatcherTest#testGetBestMatch_regionDistance
+com.ibm.icu.dev.test.util.LocaleMatcherTest#testHK
+com.ibm.icu.dev.test.util.LocaleMatcherTest#TestLocaleMatcherCoverage
+com.ibm.icu.dev.test.util.LocaleMatcherTest#testMatch_exact
+com.ibm.icu.dev.test.util.LocaleMatcherTest#testMatchGrandfatheredCode
+com.ibm.icu.dev.test.util.LocaleMatcherTest#testMatch_matchOnMazimized
+com.ibm.icu.dev.test.util.LocaleMatcherTest#testMatch_none
+com.ibm.icu.dev.test.util.LocaleMatcherTest#testOverrideData
+com.ibm.icu.dev.test.util.LocaleMatcherTest#testParentLocales
+com.ibm.icu.dev.test.util.LocaleMatcherTest#testPerf
+com.ibm.icu.dev.test.util.LocaleMatcherTest#testRegionalSpecials
+com.ibm.icu.dev.test.util.LocaleMatcherTest#testSpecials
+com.ibm.icu.dev.test.util.LocaleMatcherTest#testUndefined
+com.ibm.icu.dev.test.util.LocaleMatcherTest#testVariantWithScriptMatch
+com.ibm.icu.dev.test.util.LocaleMatcherTest#testVariantWithScriptMatch2
+com.ibm.icu.dev.test.util.LocalePriorityListTest#testLanguagePriorityList
+com.ibm.icu.dev.test.util.RegionTest#TestAvailableTerritories
+com.ibm.icu.dev.test.util.RegionTest#TestContains
+com.ibm.icu.dev.test.util.RegionTest#TestGetContainedRegions
+com.ibm.icu.dev.test.util.RegionTest#TestGetContainedRegionsWithType
+com.ibm.icu.dev.test.util.RegionTest#TestGetContainingRegion
+com.ibm.icu.dev.test.util.RegionTest#TestGetContainingRegionWithType
+com.ibm.icu.dev.test.util.RegionTest#TestGetInstanceInt
+com.ibm.icu.dev.test.util.RegionTest#TestGetInstanceString
+com.ibm.icu.dev.test.util.RegionTest#TestGetPreferredValues
+com.ibm.icu.dev.test.util.RegionTest#TestKnownRegions
+com.ibm.icu.dev.test.util.SimplePatternFormatterTest#TestBigPlaceholder
+com.ibm.icu.dev.test.util.SimplePatternFormatterTest#TestFormatReplaceNoOptimization
+com.ibm.icu.dev.test.util.SimplePatternFormatterTest#TestFormatReplaceNoOptimizationLeadingPlaceholderUsedTwice
+com.ibm.icu.dev.test.util.SimplePatternFormatterTest#TestFormatReplaceNoOptimizationLeadingText
+com.ibm.icu.dev.test.util.SimplePatternFormatterTest#TestFormatReplaceNoOptimizationNoOffsets
+com.ibm.icu.dev.test.util.SimplePatternFormatterTest#TestFormatReplaceOptimization
+com.ibm.icu.dev.test.util.SimplePatternFormatterTest#TestFormatReplaceOptimizationNoOffsets
+com.ibm.icu.dev.test.util.SimplePatternFormatterTest#TestFormatUseAppendToAsPlaceholder
+com.ibm.icu.dev.test.util.SimplePatternFormatterTest#TestGetTextWithNoPlaceholders
+com.ibm.icu.dev.test.util.SimplePatternFormatterTest#TestOnePlaceholder
+com.ibm.icu.dev.test.util.SimplePatternFormatterTest#TestQuotingLikeMessageFormat
+com.ibm.icu.dev.test.util.SimplePatternFormatterTest#TestSyntaxErrors
+com.ibm.icu.dev.test.util.SimplePatternFormatterTest#TestTooFewPlaceholderValues
+com.ibm.icu.dev.test.util.SimplePatternFormatterTest#TestWithNoPlaceholders
+com.ibm.icu.dev.test.util.SimplePatternFormatterTest#TestWithPlaceholders
+com.ibm.icu.dev.test.util.StringTokenizerTest#TestAdd_int
+com.ibm.icu.dev.test.util.StringTokenizerTest#TestAdd_int_int
+com.ibm.icu.dev.test.util.StringTokenizerTest#TestBug4423
+com.ibm.icu.dev.test.util.StringTokenizerTest#TestCharAt
+com.ibm.icu.dev.test.util.StringTokenizerTest#TestComplement_int_int
+com.ibm.icu.dev.test.util.StringTokenizerTest#TestComplement_String
+com.ibm.icu.dev.test.util.StringTokenizerTest#TestConstructors
+com.ibm.icu.dev.test.util.StringTokenizerTest#TestContains_int
+com.ibm.icu.dev.test.util.StringTokenizerTest#TestContains_int_int
+com.ibm.icu.dev.test.util.StringTokenizerTest#TestContainsNone
+com.ibm.icu.dev.test.util.StringTokenizerTest#TestCountTokens
+com.ibm.icu.dev.test.util.StringTokenizerTest#TestCountTokensNoCoalesce
+com.ibm.icu.dev.test.util.StringTokenizerTest#Test_GeneratePattern
+com.ibm.icu.dev.test.util.StringTokenizerTest#TestGetRegexEquivalent
+com.ibm.icu.dev.test.util.StringTokenizerTest#TestGetSingleCP
+com.ibm.icu.dev.test.util.StringTokenizerTest#TestIndexOf
+com.ibm.icu.dev.test.util.StringTokenizerTest#TestMatches
+com.ibm.icu.dev.test.util.StringTokenizerTest#TestMatchesAt
+com.ibm.icu.dev.test.util.StringTokenizerTest#TestMatchRest
+com.ibm.icu.dev.test.util.StringTokenizerTest#TestNextDelimiterToken
+com.ibm.icu.dev.test.util.StringTokenizerTest#TestNextNewDelimiters
+com.ibm.icu.dev.test.util.StringTokenizerTest#TestNextNonDelimiterToken
+com.ibm.icu.dev.test.util.StringTokenizerTest#TestNoCoalesce
+com.ibm.icu.dev.test.util.StringTokenizerTest#TestRemove
+com.ibm.icu.dev.test.util.StringTokenizerTest#TestRemoveAllString
+com.ibm.icu.dev.test.util.StringTokenizerTest#TestRetain_int_int
+com.ibm.icu.dev.test.util.StringTokenizerTest#TestRetain_String
+com.ibm.icu.dev.test.util.StringTokenizerTest#TestSupplementary
+com.ibm.icu.dev.test.util.TextTrieMapTest#TestCaseInsensitive
+com.ibm.icu.dev.test.util.TextTrieMapTest#TestCaseSensitive
+com.ibm.icu.dev.test.util.Trie2Test#TestCharSequenceIterator
+com.ibm.icu.dev.test.util.Trie2Test#TestRanges
+com.ibm.icu.dev.test.util.Trie2Test#TestTrie2API
+com.ibm.icu.dev.test.util.Trie2Test#TestTrie2WritableAPI
+com.ibm.icu.dev.test.util.TrieTest#TestDummyCharTrie
+com.ibm.icu.dev.test.util.TrieTest#TestDummyIntTrie
+com.ibm.icu.dev.test.util.TrieTest#TestIntTrie
+com.ibm.icu.dev.test.util.ULocaleCollationTest#TestCollator
+com.ibm.icu.dev.test.util.ULocaleCollationTest#TestIllformedLocale
+com.ibm.icu.dev.test.util.ULocaleCollationTest#TestNameList
+com.ibm.icu.dev.test.util.ULocaleTest#Test4735
+com.ibm.icu.dev.test.util.ULocaleTest#TestAcceptLanguage
+com.ibm.icu.dev.test.util.ULocaleTest#TestAcceptLanguage2
+com.ibm.icu.dev.test.util.ULocaleTest#TestAddLikelySubtags
+com.ibm.icu.dev.test.util.ULocaleTest#TestBamBm
+com.ibm.icu.dev.test.util.ULocaleTest#TestBasicGetters
+com.ibm.icu.dev.test.util.ULocaleTest#TestCalendar
+com.ibm.icu.dev.test.util.ULocaleTest#TestCanonicalization
+com.ibm.icu.dev.test.util.ULocaleTest#TestCategoryDefault
+com.ibm.icu.dev.test.util.ULocaleTest#TestChineseToLocale
+com.ibm.icu.dev.test.util.ULocaleTest#TestCLDRVersion
+com.ibm.icu.dev.test.util.ULocaleTest#TestComparable
+com.ibm.icu.dev.test.util.ULocaleTest#TestCoverage
+com.ibm.icu.dev.test.util.ULocaleTest#TestDateFormat
+com.ibm.icu.dev.test.util.ULocaleTest#TestDisplayKeyword
+com.ibm.icu.dev.test.util.ULocaleTest#TestDisplayNames
+com.ibm.icu.dev.test.util.ULocaleTest#TestDisplayWithKeyword
+com.ibm.icu.dev.test.util.ULocaleTest#TestExtension
+com.ibm.icu.dev.test.util.ULocaleTest#TestForLanguageTag
+com.ibm.icu.dev.test.util.ULocaleTest#TestForLocale
+com.ibm.icu.dev.test.util.ULocaleTest#TestGetAvailable
+com.ibm.icu.dev.test.util.ULocaleTest#TestGetFallback
+com.ibm.icu.dev.test.util.ULocaleTest#TestIsRightToLeft
+com.ibm.icu.dev.test.util.ULocaleTest#TestJavaLocaleCompatibility
+com.ibm.icu.dev.test.util.ULocaleTest#TestJB3962
+com.ibm.icu.dev.test.util.ULocaleTest#TestMinimize
+com.ibm.icu.dev.test.util.ULocaleTest#TestNumberFormat
+com.ibm.icu.dev.test.util.ULocaleTest#TestObsoleteNames
+com.ibm.icu.dev.test.util.ULocaleTest#TestOrientation
+com.ibm.icu.dev.test.util.ULocaleTest#TestPrefixes
+com.ibm.icu.dev.test.util.ULocaleTest#TestSetULocaleKeywords
+com.ibm.icu.dev.test.util.ULocaleTest#TestToLanguageTag
+com.ibm.icu.dev.test.util.ULocaleTest#TestToLegacyKey
+com.ibm.icu.dev.test.util.ULocaleTest#TestToLegacyType
+com.ibm.icu.dev.test.util.ULocaleTest#TestToLocale
+com.ibm.icu.dev.test.util.ULocaleTest#TestToUnicodeLocaleKey
+com.ibm.icu.dev.test.util.ULocaleTest#TestToUnicodeLocaleType
+com.ibm.icu.dev.test.util.ULocaleTest#TestUnicodeLocaleExtension
+com.ibm.icu.dev.test.util.UtilityTest#TestAssert
+com.ibm.icu.dev.test.util.UtilityTest#TestByteArrayWrapper
+com.ibm.icu.dev.test.util.UtilityTest#TestCaseInsensitiveString
+com.ibm.icu.dev.test.util.UtilityTest#TestCompareUnsigned
+com.ibm.icu.dev.test.util.UtilityTest#TestFormat
+com.ibm.icu.dev.test.util.UtilityTest#TestHighBit
+com.ibm.icu.dev.test.util.UtilityTest#TestSourceLocation
+com.ibm.icu.dev.test.util.UtilityTest#TestUnescape
+com.ibm.icu.dev.test.util.UtilityTest#TestUnicodeSet
+com.ibm.icu.dev.test.util.VersionInfoTest#TestComparable
+com.ibm.icu.dev.test.util.VersionInfoTest#TestCompare
+com.ibm.icu.dev.test.util.VersionInfoTest#TestGetter
+com.ibm.icu.dev.test.util.VersionInfoTest#TestInstance
+com.ibm.icu.dev.test.util.VersionInfoTest#TestMultiThread
+com.ibm.icu.dev.test.util.VersionInfoTest#TesttoString
diff --git a/tests/tests/icu/tools/android/icu/cts/tools/GenerateTestCaseXML.java b/tests/tests/icu/tools/android/icu/cts/tools/GenerateTestCaseXML.java
new file mode 100644
index 0000000..f9dc6e0
--- /dev/null
+++ b/tests/tests/icu/tools/android/icu/cts/tools/GenerateTestCaseXML.java
@@ -0,0 +1,245 @@
+package android.icu.cts.tools;
+
+import com.google.common.base.Joiner;
+import com.android.compatibility.common.util.AbiUtils;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.TreeSet;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+/**
+ * Generates an XML file suitable for CTS version 1.
+ *
+ * <p>A lot of this code is copied from {@code tools/utils/DescriptionGenerator.java} and
+ * {@code tools/utils/CollectAllTests.java}. Ideally, that code should have been refactored to make
+ * it usable in this case but that would have taken quite a lot of time and given that CTS version 1
+ * is going away anyway and CTS version 2 doesn't need an XML file this seemed like the best
+ * approach.
+ */
+public class GenerateTestCaseXML {
+
+ private static final String ATTRIBUTE_RUNNER = "runner";
+
+ private static final String ATTRIBUTE_PACKAGE = "appPackageName";
+
+ private static final String ATTRIBUTE_NS = "appNameSpace";
+
+ static final String TAG_PACKAGE = "TestPackage";
+
+ static final String TAG_SUITE = "TestSuite";
+
+ static final String TAG_CASE = "TestCase";
+
+ static final String TAG_TEST = "Test";
+
+ static final String ATTRIBUTE_NAME_VERSION = "version";
+
+ static final String ATTRIBUTE_VALUE_VERSION = "1.0";
+
+ static final String ATTRIBUTE_NAME_FRAMEWORK = "AndroidFramework";
+
+ static final String ATTRIBUTE_VALUE_FRAMEWORK = "Android 1.0";
+
+ static final String ATTRIBUTE_NAME = "name";
+
+ static final String ATTRIBUTE_ABIS = "abis";
+
+ public static void main(String[] args) throws Exception {
+ if (args.length != 3) {
+ throw new IllegalStateException(
+ "... <test-list-path> <architecture> <output-file-path");
+ }
+
+ String testListPath = args[0];
+ String architecture = args[1];
+ String outputFilePath = args[2];
+
+ File testListFile = new File(testListPath);
+ String abis = Joiner.on(" ").join(AbiUtils.getAbisForArch(architecture));
+ File testCaseXML = new File(outputFilePath);
+
+ TestSuite root = new TestSuite("");
+ try (FileReader fileReader = new FileReader(testListFile);
+ BufferedReader reader = new BufferedReader(fileReader)) {
+
+ String line;
+ while ((line = reader.readLine()) != null) {
+ int index = line.indexOf('#');
+ String className = line.substring(0, index);
+ String methodName = line.substring(index + 1);
+
+ root.addTest(className, methodName);
+ }
+ }
+
+ Document mDoc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
+
+ Element testPackageElem = mDoc.createElement(TAG_PACKAGE);
+ mDoc.appendChild(testPackageElem);
+
+ setAttribute(testPackageElem, ATTRIBUTE_NAME_VERSION, ATTRIBUTE_VALUE_VERSION);
+ setAttribute(testPackageElem, ATTRIBUTE_NAME_FRAMEWORK, ATTRIBUTE_VALUE_FRAMEWORK);
+ setAttribute(testPackageElem, ATTRIBUTE_NAME, "CtsIcuTestCases");
+ setAttribute(testPackageElem, ATTRIBUTE_RUNNER, ".IcuTestRunner");
+ setAttribute(testPackageElem, ATTRIBUTE_PACKAGE, "com.ibm.icu.dev.test");
+ setAttribute(testPackageElem, ATTRIBUTE_NS, "android.icu.cts");
+
+ root.addChildInformation(testPackageElem, abis);
+
+ Transformer t = TransformerFactory.newInstance().newTransformer();
+
+ // enable indent in result file
+ t.setOutputProperty("indent", "yes");
+ t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
+
+ File directory = testCaseXML.getParentFile();
+ if (!directory.exists() && !directory.mkdirs()) {
+ throw new IOException("Could not create directory: " + directory);
+ }
+
+ t.transform(new DOMSource(mDoc), new StreamResult(new FileOutputStream(testCaseXML)));
+ }
+
+ /**
+ * Set the attribute of element.
+ *
+ * @param elem The element to be set attribute.
+ * @param name The attribute name.
+ * @param value The attribute value.
+ */
+ protected static void setAttribute(Node elem, String name, String value) {
+ Attr attr = elem.getOwnerDocument().createAttribute(name);
+ attr.setNodeValue(value);
+
+ elem.getAttributes().setNamedItem(attr);
+ }
+
+
+ /**
+ * The contents of a {@link TestSuite}, may be a {@link TestSuite} or a {@link TestCase}.
+ */
+ private static abstract class SuiteContent {
+
+ private final String name;
+
+ private SuiteContent(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public abstract void addInformation(Element parent, String abis);
+ }
+
+ public static class TestSuite extends SuiteContent {
+
+ private Map<String, SuiteContent> name2Content = new TreeMap<>();
+
+ public TestSuite(String name) {
+ super(name);
+ }
+
+ public TestSuite getSuite(String name) {
+ return getSuiteContent(TestSuite.class, name);
+ }
+
+ public TestCase getTestCase(String name) {
+ return getSuiteContent(TestCase.class, name);
+ }
+
+ private <S extends SuiteContent> S getSuiteContent(Class<? extends S> contentClass,
+ String name) {
+ SuiteContent content = name2Content.get(name);
+ S s;
+ if (content == null) {
+ try {
+ s = contentClass.getConstructor(String.class).newInstance(name);
+ } catch (Exception e) {
+ throw new RuntimeException("Could not create instance of " + contentClass, e);
+ }
+ name2Content.put(name, s);
+ } else if (contentClass.isInstance(content)) {
+ s = contentClass.cast(content);
+ } else {
+ throw new IllegalStateException("Expected " + this
+ + " to have a TestSuite called '" + name + "' but has "
+ + content + " instead");
+ }
+ return s;
+ }
+
+ public void addTest(String className, String methodName) {
+ int index = className.indexOf('.');
+ if (index == -1) {
+ TestCase testCase = getTestCase(className);
+ testCase.addMethod(methodName);
+ } else {
+ String suiteName = className.substring(0, index);
+ TestSuite childSuite = getSuite(suiteName);
+ childSuite.addTest(className.substring(index + 1), methodName);
+ }
+ }
+
+ @Override
+ public void addInformation(Element parent, String abis) {
+ Element suiteElement = appendElement(parent, TAG_SUITE);
+
+ setAttribute(suiteElement, ATTRIBUTE_NAME, getName());
+
+ addChildInformation(suiteElement, abis);
+ }
+
+ public void addChildInformation(Element parent, String abis) {
+ for (SuiteContent suiteContent : name2Content.values()) {
+ suiteContent.addInformation(parent, abis);
+ }
+ }
+ }
+
+ public static class TestCase extends SuiteContent {
+
+ private final Set<String> methods = new TreeSet<>();
+
+ public TestCase(String name) {
+ super(name);
+ }
+
+ @Override
+ public void addInformation(Element parent, String abis) {
+ Element testCaseElement = appendElement(parent, TAG_CASE);
+ setAttribute(testCaseElement, ATTRIBUTE_NAME, getName());
+ setAttribute(testCaseElement, ATTRIBUTE_ABIS, abis);
+
+ for (String method : methods) {
+ Element testElement = appendElement(testCaseElement, TAG_TEST);
+ setAttribute(testElement, ATTRIBUTE_NAME, method);
+ }
+ }
+
+ public void addMethod(String methodName) {
+ methods.add(methodName);
+ }
+ }
+
+ private static Element appendElement(Element parent, String tagName) {
+ Element testCaseElement = parent.getOwnerDocument().createElement(tagName);
+ parent.appendChild(testCaseElement);
+ return testCaseElement;
+ }
+}
diff --git a/tests/tests/icu/tools/update-test-list.sh b/tests/tests/icu/tools/update-test-list.sh
new file mode 100755
index 0000000..e73cbfb
--- /dev/null
+++ b/tests/tests/icu/tools/update-test-list.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+# Extract a flat list of tests from a CTSv2 generated host log for use when generating the CTSv1
+# required list of tests.
+ZIP=$1
+
+TMP_DIR=/tmp/update-test-list-$$
+mkdir -p $TMP_DIR
+
+unzip $ZIP host_log.txt -d $TMP_DIR
+
+HOST_LOG=$TMP_DIR/host_log.txt
+
+ICU_DIR=$(dirname $0)/../
+
+grep "ModuleListener.testStarted" $HOST_LOG \
+ | sed 's%.*(\([^#]\+\)#\([^)]\+\))%\1#\2%' | sort > $ICU_DIR/test-list.txt
diff --git a/tests/tests/jni/libjnitest/android_jni_cts_LinkerNamespacesTest.cpp b/tests/tests/jni/libjnitest/android_jni_cts_LinkerNamespacesTest.cpp
index 5876532..acc3b98 100644
--- a/tests/tests/jni/libjnitest/android_jni_cts_LinkerNamespacesTest.cpp
+++ b/tests/tests/jni/libjnitest/android_jni_cts_LinkerNamespacesTest.cpp
@@ -44,6 +44,7 @@
static std::unordered_set<std::string> kPublicLibraries = {
"libandroid.so",
+ "libcamera2ndk.so",
"libc.so",
"libdl.so",
"libEGL.so",
@@ -60,6 +61,7 @@
"libOpenSLES.so",
"libRS.so",
"libstdc++.so",
+ "libvulkan.so",
"libwebviewchromium_plat_support.so",
"libz.so"
};
diff --git a/tests/tests/media/res/raw/testvideo_with_2_subtitle_tracks.mp4 b/tests/tests/media/res/raw/testvideo_with_2_subtitle_tracks.mp4
new file mode 100755
index 0000000..b8dce17
--- /dev/null
+++ b/tests/tests/media/res/raw/testvideo_with_2_subtitle_tracks.mp4
Binary files differ
diff --git a/tests/tests/media/res/raw/testvideo_with_2_subtitles.3gp b/tests/tests/media/res/raw/testvideo_with_2_timedtext_tracks.3gp
similarity index 100%
rename from tests/tests/media/res/raw/testvideo_with_2_subtitles.3gp
rename to tests/tests/media/res/raw/testvideo_with_2_timedtext_tracks.3gp
Binary files differ
diff --git a/tests/tests/media/res/values/exifinterface.xml b/tests/tests/media/res/values/exifinterface.xml
index 8fc6adc..eb13ff3 100644
--- a/tests/tests/media/res/values/exifinterface.xml
+++ b/tests/tests/media/res/values/exifinterface.xml
@@ -76,9 +76,9 @@
<item>0</item>
</array>
<array name="lg_g4_iso_800_dng">
- <item>false</item>
- <item>0</item>
- <item>0</item>
+ <item>true</item>
+ <item>256</item>
+ <item>144</item>
<item>true</item>
<item>53.834507</item>
<item>10.69585</item>
diff --git a/tests/tests/media/src/android/media/cts/AudioRecordNotificationTest.java b/tests/tests/media/src/android/media/cts/AudioRecordNotificationTest.java
new file mode 100644
index 0000000..05ae250
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/AudioRecordNotificationTest.java
@@ -0,0 +1,215 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.media.cts;
+
+import android.content.pm.PackageManager;
+import android.cts.util.CtsAndroidTestCase;
+import android.media.AudioFormat;
+import android.media.AudioManager;
+import android.media.AudioRecord;
+import android.media.AudioRecordConfiguration;
+import android.media.MediaRecorder;
+import android.os.Looper;
+import android.util.Log;
+
+public class AudioRecordNotificationTest extends CtsAndroidTestCase {
+ private final static String TAG = "AudioRecordNotificationTest";
+
+ private final static int TEST_SAMPLE_RATE = 16000;
+ private final static int TEST_AUDIO_SOURCE = MediaRecorder.AudioSource.VOICE_RECOGNITION;
+
+ private final static int TEST_TIMING_TOLERANCE_MS = 70;
+
+ private AudioRecord mAudioRecord;
+ private Looper mLooper;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ if (!hasMicrophone()) {
+ return;
+ }
+
+ /*
+ * InstrumentationTestRunner.onStart() calls Looper.prepare(), which creates a looper
+ * for the current thread. However, since we don't actually call loop() in the test,
+ * any messages queued with that looper will never be consumed. Therefore, we must
+ * create the instance in another thread, either without a looper, so the main looper is
+ * used, or with an active looper.
+ */
+ Thread t = new Thread() {
+ @Override
+ public void run() {
+ Looper.prepare();
+ mLooper = Looper.myLooper();
+ synchronized(this) {
+ mAudioRecord = new AudioRecord.Builder()
+ .setAudioSource(TEST_AUDIO_SOURCE)
+ .setAudioFormat(new AudioFormat.Builder()
+ .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
+ .setSampleRate(TEST_SAMPLE_RATE)
+ .setChannelMask(AudioFormat.CHANNEL_IN_MONO)
+ .build())
+ .build();
+ this.notify();
+ }
+ Looper.loop();
+ }
+ };
+ synchronized(t) {
+ t.start(); // will block until we wait
+ t.wait();
+ }
+ assertNotNull(mAudioRecord);
+ assertNotNull(mLooper);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ if (hasMicrophone()) {
+ mAudioRecord.stop();
+ mAudioRecord.release();
+ mLooper.quit();
+ }
+ super.tearDown();
+ }
+
+ // start a recording and verify it is seen as an active recording
+ public void testAudioManagerGetActiveRecordConfigurations() throws Exception {
+ if (!hasMicrophone()) {
+ return;
+ }
+ AudioManager am = new AudioManager(getContext());
+ assertNotNull("Could not create AudioManager", am);
+
+ AudioRecordConfiguration[] configs = am.getActiveRecordConfigurations();
+ assertNotNull("Invalid null array of record configurations before recording", configs);
+
+ assertEquals(AudioRecord.STATE_INITIALIZED, mAudioRecord.getState());
+ mAudioRecord.startRecording();
+ assertEquals(AudioRecord.RECORDSTATE_RECORDING, mAudioRecord.getRecordingState());
+ Thread.sleep(TEST_TIMING_TOLERANCE_MS);
+
+ // recording is active, verify there is an active record configuration
+ configs = am.getActiveRecordConfigurations();
+ assertNotNull("Invalid null array of record configurations during recording", configs);
+ assertTrue("no active record configurations (empty array) during recording",
+ configs.length > 0);
+ final int nbConfigsDuringRecording = configs.length;
+
+ // verify our recording shows as one of the recording configs
+ assertTrue("Test source/session not amongst active record configurations",
+ verifyAudioConfig(TEST_AUDIO_SOURCE, mAudioRecord.getAudioSessionId(),
+ mAudioRecord.getFormat(), configs));
+
+ // stopping recording: verify there are less active record configurations
+ mAudioRecord.stop();
+ Thread.sleep(TEST_TIMING_TOLERANCE_MS);
+ configs = am.getActiveRecordConfigurations();
+ assertTrue("end of recording not reported in record configs",
+ configs.length < nbConfigsDuringRecording);
+ }
+
+ public void testCallback() throws Exception {
+ if (!hasMicrophone()) {
+ return;
+ }
+ AudioManager am = new AudioManager(getContext());
+ assertNotNull("Could not create AudioManager", am);
+
+ MyAudioRecordingCallback callback = new MyAudioRecordingCallback(
+ mAudioRecord.getAudioSessionId(), TEST_AUDIO_SOURCE);
+ am.registerAudioRecordingCallback(callback, null /*handler*/);
+
+ assertEquals(AudioRecord.STATE_INITIALIZED, mAudioRecord.getState());
+ mAudioRecord.startRecording();
+ assertEquals(AudioRecord.RECORDSTATE_RECORDING, mAudioRecord.getRecordingState());
+ Thread.sleep(TEST_TIMING_TOLERANCE_MS);
+
+ assertTrue("AudioRecordingCallback not called", callback.mCalled);
+ assertTrue("Expected record configuration was not found", callback.mParamMatch);
+
+ // stopping recording: callback is called with no match
+ callback.reset();
+ mAudioRecord.stop();
+ Thread.sleep(TEST_TIMING_TOLERANCE_MS);
+ assertTrue("AudioRecordingCallback not called", callback.mCalled);
+ assertFalse("Should not have found test record configuration", callback.mParamMatch);
+
+ // unregister callback and start recording again
+ am.unregisterAudioRecordingCallback(callback);
+ callback.reset();
+ mAudioRecord.startRecording();
+ Thread.sleep(TEST_TIMING_TOLERANCE_MS);
+ assertFalse("Unregistered callback was called", callback.mCalled);
+ }
+
+ class MyAudioRecordingCallback extends AudioManager.AudioRecordingCallback {
+ boolean mCalled = false;
+ boolean mParamMatch = false;
+ final AudioManager mAM;
+ final int mTestSource;
+ final int mTestSession;
+
+ void reset() {
+ mCalled = false;
+ mParamMatch = false;
+ }
+
+ MyAudioRecordingCallback(int session, int source) {
+ mAM = new AudioManager(getContext());
+ mTestSource = source;
+ mTestSession = session;
+ }
+
+ @Override
+ public void onRecordConfigChanged() {
+ mCalled = true;
+ mParamMatch = verifyAudioConfig(mTestSource, mTestSession, mAudioRecord.getFormat(),
+ mAM.getActiveRecordConfigurations());
+ }
+ }
+
+ private static boolean verifyAudioConfig(int source, int session, AudioFormat format,
+ AudioRecordConfiguration[] configs) {
+ for (int i = 0 ; i < configs.length ; i++) {
+ if ((configs[i].getClientAudioSource() == source)
+ && (configs[i].getClientAudioSessionId() == session)
+ // test the client format matches that requested (same as the AudioRecord's)
+ && (configs[i].getClientFormat().getEncoding() == format.getEncoding())
+ && (configs[i].getClientFormat().getSampleRate() == format.getSampleRate())
+ && (configs[i].getClientFormat().getChannelMask() == format.getChannelMask())
+ && (configs[i].getClientFormat().getChannelIndexMask() ==
+ format.getChannelIndexMask())
+ // test the device format is configured
+ && (configs[i].getFormat().getEncoding() != AudioFormat.ENCODING_INVALID)
+ && (configs[i].getFormat().getSampleRate() > 0)
+ // for the channel mask, either the position or index-based value must be valid
+ && ((configs[i].getFormat().getChannelMask() != AudioFormat.CHANNEL_INVALID)
+ || (configs[i].getFormat().getChannelIndexMask() !=
+ AudioFormat.CHANNEL_INVALID))) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private boolean hasMicrophone() {
+ return getContext().getPackageManager().hasSystemFeature(
+ PackageManager.FEATURE_MICROPHONE);
+ }
+}
diff --git a/tests/tests/media/src/android/media/cts/DecoderTest.java b/tests/tests/media/src/android/media/cts/DecoderTest.java
index 448b417..f6c1a0c 100755
--- a/tests/tests/media/src/android/media/cts/DecoderTest.java
+++ b/tests/tests/media/src/android/media/cts/DecoderTest.java
@@ -1977,11 +1977,12 @@
break;
}
}
- assertTrue("Tunneled video playback timeout exceeded!",
- timeOut > System.currentTimeMillis());
Log.d(TAG, "playVideo player.reset()");
mMediaCodecPlayer.reset();
+
+ assertTrue("Tunneled video playback timeout exceeded!",
+ timeOut > System.currentTimeMillis());
}
/**
diff --git a/tests/tests/media/src/android/media/cts/EncoderTest.java b/tests/tests/media/src/android/media/cts/EncoderTest.java
index da81879..be6ed48 100644
--- a/tests/tests/media/src/android/media/cts/EncoderTest.java
+++ b/tests/tests/media/src/android/media/cts/EncoderTest.java
@@ -191,7 +191,7 @@
private int queueInputBuffer(
MediaCodec codec, ByteBuffer[] inputBuffers, int index,
- InputStream istream, int mode) {
+ InputStream istream, int mode, long timeUs) {
ByteBuffer buffer = inputBuffers[index];
buffer.rewind();
int size = buffer.limit();
@@ -238,7 +238,7 @@
}
}
- codec.queueInputBuffer(index, 0 /* offset */, size, 0 /* timeUs */, 0);
+ codec.queueInputBuffer(index, 0 /* offset */, size, timeUs, 0 /* flags */);
return size;
}
@@ -292,7 +292,8 @@
int muxidx = -1;
if (sSaveResults) {
try {
- String outFile = "/data/local/tmp/transcoded-" + componentName + "-" + outBitrate +
+ String outFile = "/data/local/tmp/transcoded-" + componentName +
+ "-" + sampleRate + "-" + channelCount + "-" + outBitrate +
"-" + mode + "-" + startSeed + ".mp4";
new File("outFile").delete();
muxer = new MediaMuxer(outFile, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
@@ -340,12 +341,14 @@
index = codec.dequeueInputBuffer(kTimeoutUs /* timeoutUs */);
if (index != MediaCodec.INFO_TRY_AGAIN_LATER) {
+ long timeUs =
+ (long)numBytesSubmitted * 1000000 / (2 * channelCount * sampleRate);
if (numBytesSubmitted >= kNumInputBytes) {
codec.queueInputBuffer(
index,
0 /* offset */,
0 /* size */,
- 0 /* timeUs */,
+ timeUs,
MediaCodec.BUFFER_FLAG_END_OF_STREAM);
if (VERBOSE) {
@@ -355,7 +358,7 @@
doneSubmittingInput = true;
} else {
int size = queueInputBuffer(
- codec, codecInputBuffers, index, istream, mode);
+ codec, codecInputBuffers, index, istream, mode, timeUs);
numBytesSubmitted += size;
diff --git a/tests/tests/media/src/android/media/cts/ExifInterfaceTest.java b/tests/tests/media/src/android/media/cts/ExifInterfaceTest.java
index a51dd3d..5d4e328 100644
--- a/tests/tests/media/src/android/media/cts/ExifInterfaceTest.java
+++ b/tests/tests/media/src/android/media/cts/ExifInterfaceTest.java
@@ -34,7 +34,7 @@
private static final String TAG = ExifInterface.class.getSimpleName();
private static final boolean VERBOSE = false; // lots of logging
- private static final double DIFFERENCE_TOLERANCE = .0001;
+ private static final double DIFFERENCE_TOLERANCE = .001;
private static final int BUFFER_SIZE = 32768;
// List of files.
diff --git a/tests/tests/media/src/android/media/cts/MediaControllerTest.java b/tests/tests/media/src/android/media/cts/MediaControllerTest.java
index caf2a94..b8ec617 100644
--- a/tests/tests/media/src/android/media/cts/MediaControllerTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaControllerTest.java
@@ -214,6 +214,32 @@
mWaitLock.wait(TIME_OUT_MS);
assertTrue(mCallback.mOnSkipToQueueItemCalled);
assertEquals(queueItemId, mCallback.mQueueItemId);
+
+ mCallback.reset();
+ controls.prepare();
+ mWaitLock.wait(TIME_OUT_MS);
+ assertTrue(mCallback.mOnPrepareCalled);
+
+ mCallback.reset();
+ controls.prepareFromMediaId(mediaId, extras);
+ mWaitLock.wait(TIME_OUT_MS);
+ assertTrue(mCallback.mOnPrepareFromMediaIdCalled);
+ assertEquals(mediaId, mCallback.mMediaId);
+ assertEquals(EXTRAS_VALUE, mCallback.mExtras.getString(EXTRAS_KEY));
+
+ mCallback.reset();
+ controls.prepareFromSearch(query, extras);
+ mWaitLock.wait(TIME_OUT_MS);
+ assertTrue(mCallback.mOnPrepareFromSearchCalled);
+ assertEquals(query, mCallback.mQuery);
+ assertEquals(EXTRAS_VALUE, mCallback.mExtras.getString(EXTRAS_KEY));
+
+ mCallback.reset();
+ controls.prepareFromUri(uri, extras);
+ mWaitLock.wait(TIME_OUT_MS);
+ assertTrue(mCallback.mOnPrepareFromUriCalled);
+ assertEquals(uri, mCallback.mUri);
+ assertEquals(EXTRAS_VALUE, mCallback.mExtras.getString(EXTRAS_KEY));
}
}
@@ -244,6 +270,10 @@
private boolean mOnPlayFromUriCalled;
private boolean mOnCustomActionCalled;
private boolean mOnCommandCalled;
+ private boolean mOnPrepareCalled;
+ private boolean mOnPrepareFromMediaIdCalled;
+ private boolean mOnPrepareFromSearchCalled;
+ private boolean mOnPrepareFromUriCalled;
public void reset() {
mSeekPosition = -1;
@@ -272,6 +302,10 @@
mOnPlayFromUriCalled = false;
mOnCustomActionCalled = false;
mOnCommandCalled = false;
+ mOnPrepareCalled = false;
+ mOnPrepareFromMediaIdCalled = false;
+ mOnPrepareFromSearchCalled = false;
+ mOnPrepareFromUriCalled = false;
}
@Override
@@ -407,5 +441,43 @@
mWaitLock.notify();
}
}
+
+ @Override
+ public void onPrepare() {
+ synchronized (mWaitLock) {
+ mOnPrepareCalled = true;
+ mWaitLock.notify();
+ }
+ }
+
+ @Override
+ public void onPrepareFromMediaId(String mediaId, Bundle extras) {
+ synchronized (mWaitLock) {
+ mOnPrepareFromMediaIdCalled = true;
+ mMediaId = mediaId;
+ mExtras = extras;
+ mWaitLock.notify();
+ }
+ }
+
+ @Override
+ public void onPrepareFromSearch(String query, Bundle extras) {
+ synchronized (mWaitLock) {
+ mOnPrepareFromSearchCalled = true;
+ mQuery = query;
+ mExtras = extras;
+ mWaitLock.notify();
+ }
+ }
+
+ @Override
+ public void onPrepareFromUri(Uri uri, Bundle extras) {
+ synchronized (mWaitLock) {
+ mOnPrepareFromUriCalled = true;
+ mUri = uri;
+ mExtras = extras;
+ mWaitLock.notify();
+ }
+ }
}
}
diff --git a/tests/tests/media/src/android/media/cts/MediaPlayerTest.java b/tests/tests/media/src/android/media/cts/MediaPlayerTest.java
index bcc1e8d..1d0ab26 100644
--- a/tests/tests/media/src/android/media/cts/MediaPlayerTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaPlayerTest.java
@@ -33,11 +33,11 @@
import android.media.MediaRecorder;
import android.media.MediaTimestamp;
import android.media.PlaybackParams;
+import android.media.SubtitleData;
import android.media.SyncParams;
import android.media.TimedText;
import android.media.audiofx.AudioEffect;
import android.media.audiofx.Visualizer;
-import android.media.cts.MediaPlayerTestBase.Monitor;
import android.net.Uri;
import android.os.Environment;
import android.os.IBinder;
@@ -74,9 +74,13 @@
private static final long RECORDED_DURATION_MS = 3000;
private static final float FLOAT_TOLERANCE = .0001f;
- private Vector<Integer> mTimedTextTrackIndex = new Vector<Integer>();
+ private final Vector<Integer> mTimedTextTrackIndex = new Vector<>();
+ private final Monitor mOnTimedTextCalled = new Monitor();
private int mSelectedTimedTextIndex;
- private Monitor mOnTimedTextCalled = new Monitor();
+
+ private final Vector<Integer> mSubtitleTrackIndex = new Vector<>();
+ private final Monitor mOnSubtitleDataCalled = new Monitor();
+ private int mSelectedSubtitleIndex;
private File mOutFile;
@@ -919,7 +923,7 @@
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(file);
String rotation = retriever.extractMetadata(
- MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION);
+ MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION);
retriever.release();
retriever = null;
assertNotNull(rotation);
@@ -1206,6 +1210,194 @@
R.raw.video_176x144_3gp_h263_300kbps_25fps_aac_stereo_128kbps_22050hz, 176, 144);
}
+ private void readSubtitleTracks() throws Exception {
+ mSubtitleTrackIndex.clear();
+ MediaPlayer.TrackInfo[] trackInfos = mMediaPlayer.getTrackInfo();
+ if (trackInfos == null || trackInfos.length == 0) {
+ return;
+ }
+
+ Vector<Integer> subtitleTrackIndex = new Vector<>();
+ for (int i = 0; i < trackInfos.length; ++i) {
+ assertTrue(trackInfos[i] != null);
+ if (trackInfos[i].getTrackType() == MediaPlayer.TrackInfo.MEDIA_TRACK_TYPE_SUBTITLE) {
+ subtitleTrackIndex.add(i);
+ }
+ }
+
+ mSubtitleTrackIndex.addAll(subtitleTrackIndex);
+ }
+
+ private void selectSubtitleTrack(int index) throws Exception {
+ int trackIndex = mSubtitleTrackIndex.get(index);
+ mMediaPlayer.selectTrack(trackIndex);
+ mSelectedSubtitleIndex = index;
+ }
+
+ private void deselectSubtitleTrack(int index) throws Exception {
+ int trackIndex = mSubtitleTrackIndex.get(index);
+ mMediaPlayer.deselectTrack(trackIndex);
+ if (mSelectedSubtitleIndex == index) {
+ mSelectedSubtitleIndex = -1;
+ }
+ }
+
+ public void testDeselectTrackForSubtitleTracks() throws Throwable {
+ if (!checkLoadResource(R.raw.testvideo_with_2_subtitle_tracks)) {
+ return; // skip;
+ }
+
+ getInstrumentation().waitForIdleSync();
+
+ mMediaPlayer.setOnSubtitleDataListener(new MediaPlayer.OnSubtitleDataListener() {
+ @Override
+ public void onSubtitleData(MediaPlayer mp, SubtitleData data) {
+ if (data != null && data.getData() != null) {
+ mOnSubtitleDataCalled.signal();
+ }
+ }
+ });
+ mMediaPlayer.setOnInfoListener(new MediaPlayer.OnInfoListener() {
+ @Override
+ public boolean onInfo(MediaPlayer mp, int what, int extra) {
+ if (what == MediaPlayer.MEDIA_INFO_METADATA_UPDATE) {
+ mOnInfoCalled.signal();
+ }
+ return false;
+ }
+ });
+
+ mMediaPlayer.setDisplay(getActivity().getSurfaceHolder());
+ mMediaPlayer.setScreenOnWhilePlaying(true);
+ mMediaPlayer.setWakeMode(mContext, PowerManager.PARTIAL_WAKE_LOCK);
+
+ mMediaPlayer.prepare();
+ mMediaPlayer.start();
+ assertTrue(mMediaPlayer.isPlaying());
+
+ // Closed caption tracks are in-band.
+ // So, those tracks will be found after processing a number of frames.
+ mOnInfoCalled.waitForSignal(1500);
+
+ mOnInfoCalled.reset();
+ mOnInfoCalled.waitForSignal(1500);
+
+ readSubtitleTracks();
+
+ // Run twice to check if repeated selection-deselection on the same track works well.
+ for (int i = 0; i < 2; i++) {
+ // Waits until at least one subtitle is fired. Timeout is 1.5 sec.
+ selectSubtitleTrack(i);
+ mOnSubtitleDataCalled.reset();
+ assertTrue(mOnSubtitleDataCalled.waitForSignal(1500));
+
+ // Try deselecting track.
+ deselectSubtitleTrack(i);
+ mOnSubtitleDataCalled.reset();
+ assertFalse(mOnSubtitleDataCalled.waitForSignal(1500));
+ }
+
+ try {
+ deselectSubtitleTrack(0);
+ fail("Deselecting unselected track: expected RuntimeException, " +
+ "but no exception has been triggered.");
+ } catch (RuntimeException e) {
+ // expected
+ }
+
+ mMediaPlayer.stop();
+ }
+
+ public void testChangeSubtitleTrack() throws Throwable {
+ if (!checkLoadResource(R.raw.testvideo_with_2_subtitle_tracks)) {
+ return; // skip;
+ }
+
+ mMediaPlayer.setOnSubtitleDataListener(new MediaPlayer.OnSubtitleDataListener() {
+ @Override
+ public void onSubtitleData(MediaPlayer mp, SubtitleData data) {
+ if (data != null && data.getData() != null) {
+ mOnSubtitleDataCalled.signal();
+ }
+ }
+ });
+ mMediaPlayer.setOnInfoListener(new MediaPlayer.OnInfoListener() {
+ @Override
+ public boolean onInfo(MediaPlayer mp, int what, int extra) {
+ if (what == MediaPlayer.MEDIA_INFO_METADATA_UPDATE) {
+ mOnInfoCalled.signal();
+ }
+ return false;
+ }
+ });
+
+ mMediaPlayer.setDisplay(getActivity().getSurfaceHolder());
+ mMediaPlayer.setScreenOnWhilePlaying(true);
+ mMediaPlayer.setWakeMode(mContext, PowerManager.PARTIAL_WAKE_LOCK);
+
+ mMediaPlayer.prepare();
+ mMediaPlayer.start();
+ assertTrue(mMediaPlayer.isPlaying());
+
+ // Closed caption tracks are in-band.
+ // So, those tracks will be found after processing a number of frames.
+ mOnInfoCalled.waitForSignal(1500);
+
+ mOnInfoCalled.reset();
+ mOnInfoCalled.waitForSignal(1500);
+
+ readSubtitleTracks();
+
+ // Waits until at least two captions are fired. Timeout is 2.5 sec.
+ selectSubtitleTrack(0);
+ assertTrue(mOnSubtitleDataCalled.waitForCountedSignals(2, 2500) >= 2);
+
+ mOnSubtitleDataCalled.reset();
+ selectSubtitleTrack(1);
+ assertTrue(mOnSubtitleDataCalled.waitForCountedSignals(2, 2500) >= 2);
+
+ mMediaPlayer.stop();
+ }
+
+ public void testGetTrackInfoForVideoWithSubtitleTracks() throws Throwable {
+ if (!checkLoadResource(R.raw.testvideo_with_2_subtitle_tracks)) {
+ return; // skip;
+ }
+
+ getInstrumentation().waitForIdleSync();
+
+ mMediaPlayer.setOnInfoListener(new MediaPlayer.OnInfoListener() {
+ @Override
+ public boolean onInfo(MediaPlayer mp, int what, int extra) {
+ if (what == MediaPlayer.MEDIA_INFO_METADATA_UPDATE) {
+ mOnInfoCalled.signal();
+ }
+ return false;
+ }
+ });
+
+ mMediaPlayer.setDisplay(getActivity().getSurfaceHolder());
+ mMediaPlayer.setScreenOnWhilePlaying(true);
+ mMediaPlayer.setWakeMode(mContext, PowerManager.PARTIAL_WAKE_LOCK);
+
+ mMediaPlayer.prepare();
+ mMediaPlayer.start();
+ assertTrue(mMediaPlayer.isPlaying());
+
+ // The media metadata will be changed while playing since closed caption tracks are in-band
+ // and those tracks will be found after processing a number of frames. These tracks will be
+ // found within one second.
+ mOnInfoCalled.waitForSignal(1500);
+
+ mOnInfoCalled.reset();
+ mOnInfoCalled.waitForSignal(1500);
+
+ readSubtitleTracks();
+ assertEquals(2, mSubtitleTrackIndex.size());
+
+ mMediaPlayer.stop();
+ }
+
private void readTimedTextTracks() throws Exception {
mTimedTextTrackIndex.clear();
MediaPlayer.TrackInfo[] trackInfos = mMediaPlayer.getTrackInfo();
@@ -1234,13 +1426,13 @@
return mTimedTextTrackIndex.size();
}
- private void selectSubtitleTrack(int index) throws Exception {
+ private void selectTimedTextTrack(int index) throws Exception {
int trackIndex = mTimedTextTrackIndex.get(index);
mMediaPlayer.selectTrack(trackIndex);
mSelectedTimedTextIndex = index;
}
- private void deselectSubtitleTrack(int index) throws Exception {
+ private void deselectTimedTextTrack(int index) throws Exception {
int trackIndex = mTimedTextTrackIndex.get(index);
mMediaPlayer.deselectTrack(trackIndex);
if (mSelectedTimedTextIndex == index) {
@@ -1248,8 +1440,8 @@
}
}
- public void testDeselectTrack() throws Throwable {
- if (!checkLoadResource(R.raw.testvideo_with_2_subtitles)) {
+ public void testDeselectTrackForTimedTextTrack() throws Throwable {
+ if (!checkLoadResource(R.raw.testvideo_with_2_timedtext_tracks)) {
return; // skip;
}
runTestOnUiThread(new Runnable() {
@@ -1287,31 +1479,31 @@
// Run twice to check if repeated selection-deselection on the same track works well.
for (int i = 0; i < 2; i++) {
- // Waits until at least one subtitle is fired. Timeout is 1 sec.
- selectSubtitleTrack(0);
+ // Waits until at least one subtitle is fired. Timeout is 1.5 sec.
+ selectTimedTextTrack(0);
mOnTimedTextCalled.reset();
assertTrue(mOnTimedTextCalled.waitForSignal(1500));
// Try deselecting track.
- deselectSubtitleTrack(0);
+ deselectTimedTextTrack(0);
mOnTimedTextCalled.reset();
assertFalse(mOnTimedTextCalled.waitForSignal(1500));
}
// Run the same test for external subtitle track.
for (int i = 0; i < 2; i++) {
- selectSubtitleTrack(2);
+ selectTimedTextTrack(2);
mOnTimedTextCalled.reset();
assertTrue(mOnTimedTextCalled.waitForSignal(1500));
// Try deselecting track.
- deselectSubtitleTrack(2);
+ deselectTimedTextTrack(2);
mOnTimedTextCalled.reset();
assertFalse(mOnTimedTextCalled.waitForSignal(1500));
}
try {
- deselectSubtitleTrack(0);
+ deselectTimedTextTrack(0);
fail("Deselecting unselected track: expected RuntimeException, " +
"but no exception has been triggered.");
} catch (RuntimeException e) {
@@ -1321,8 +1513,8 @@
mMediaPlayer.stop();
}
- public void testChangeSubtitleTrack() throws Throwable {
- if (!checkLoadResource(R.raw.testvideo_with_2_subtitles)) {
+ public void testChangeTimedTextTrack() throws Throwable {
+ if (!checkLoadResource(R.raw.testvideo_with_2_timedtext_tracks)) {
return; // skip;
}
@@ -1394,26 +1586,26 @@
getInstrumentation().waitForIdleSync();
assertEquals(getTimedTextTrackCount(), 4);
- selectSubtitleTrack(0);
+ selectTimedTextTrack(0);
mOnTimedTextCalled.reset();
mMediaPlayer.start();
assertTrue(mMediaPlayer.isPlaying());
- // Waits until at least two subtitles are fired. Timeout is 2 sec.
+ // Waits until at least two subtitles are fired. Timeout is 2.5 sec.
// Please refer the test srt files:
// test_subtitle1_srt.3gp and test_subtitle2_srt.3gp
assertTrue(mOnTimedTextCalled.waitForCountedSignals(2, 2500) >= 2);
- selectSubtitleTrack(1);
+ selectTimedTextTrack(1);
mOnTimedTextCalled.reset();
assertTrue(mOnTimedTextCalled.waitForCountedSignals(2, 2500) >= 2);
- selectSubtitleTrack(2);
+ selectTimedTextTrack(2);
mOnTimedTextCalled.reset();
assertTrue(mOnTimedTextCalled.waitForCountedSignals(2, 2500) >= 2);
- selectSubtitleTrack(3);
+ selectTimedTextTrack(3);
mOnTimedTextCalled.reset();
assertTrue(mOnTimedTextCalled.waitForCountedSignals(2, 2500) >= 2);
mMediaPlayer.stop();
@@ -1421,8 +1613,8 @@
assertEquals("Wrong bounds count", 2, mBoundsCount);
}
- public void testGetTrackInfo() throws Throwable {
- if (!checkLoadResource(R.raw.testvideo_with_2_subtitles)) {
+ public void testGetTrackInfoForVideoWithTimedText() throws Throwable {
+ if (!checkLoadResource(R.raw.testvideo_with_2_timedtext_tracks)) {
return; // skip;
}
runTestOnUiThread(new Runnable() {
@@ -1440,7 +1632,7 @@
mMediaPlayer.start();
readTimedTextTracks();
- selectSubtitleTrack(2);
+ selectTimedTextTrack(2);
int count = 0;
MediaPlayer.TrackInfo[] trackInfos = mMediaPlayer.getTrackInfo();
diff --git a/tests/tests/media/src/android/media/cts/VideoDecoderPerfTest.java b/tests/tests/media/src/android/media/cts/VideoDecoderPerfTest.java
index b999847..a153f78 100644
--- a/tests/tests/media/src/android/media/cts/VideoDecoderPerfTest.java
+++ b/tests/tests/media/src/android/media/cts/VideoDecoderPerfTest.java
@@ -80,7 +80,7 @@
super.tearDown();
}
- private static String[] getDecoderName(String mime, boolean isGoog) {
+ private static String[] getDecoderName(String mime, boolean isGoog, int width, int height) {
MediaCodecList mcl = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
ArrayList<String> result = new ArrayList<String>();
for (MediaCodecInfo info : mcl.getCodecInfos()) {
@@ -88,10 +88,14 @@
info.getName().toLowerCase().startsWith("omx.google.") != isGoog) {
continue;
}
- CodecCapabilities caps = null;
try {
- caps = info.getCapabilitiesForType(mime);
- } catch (IllegalArgumentException e) { // mime is not supported
+ CodecCapabilities caps = info.getCapabilitiesForType(mime);
+ if (!caps.getVideoCapabilities().isSizeSupported(width, height)) {
+ Log.i(TAG, info.getName() + " does not support size " + width + "x" + height);
+ continue;
+ }
+ } catch (IllegalArgumentException | NullPointerException e) {
+ // mime is not supported or is not a video codec
continue;
}
result.add(info.getName());
@@ -101,29 +105,37 @@
private void decode(String mime, int video, int width, int height,
boolean isGoog) throws Exception {
- String[] names = getDecoderName(mime, isGoog);
- for (String name: names) {
- if (!MediaUtils.supports(name, mime, width, height)) {
- Log.i(TAG, "Codec " + name + " with " + width + "," + height + " not supported");
- continue;
- }
+ decode(mime, video, width, height, isGoog, 600000 /* timeoutMs */);
+ }
+ private void decode(String mime, int video, int width, int height,
+ boolean isGoog, long testTimeoutMs) throws Exception {
+ String[] names = getDecoderName(mime, isGoog, width, height);
+ if (names.length == 0) {
+ MediaUtils.skipTest("no codecs support this type or size");
+ return;
+ }
+ // Ensure we can finish this test within the test timeout. Allow 25% slack (4/5).
+ // We test each decoder twice per repeat.
+ long maxTimeMs = Math.min(
+ testTimeoutMs / names.length * 2 / 5 / NUMBER_OF_REPEAT, MAX_TIME_MS);
+ for (String name : names) {
boolean pass = false;
mMeasuredFps = new double[NUMBER_OF_REPEAT];
mResultRawData = new String[NUMBER_OF_REPEAT];
- Log.d(TAG, "testing " + name);
+ Log.d(TAG, "testing " + name + " for " + maxTimeMs + " msecs");
for (int i = 0; i < NUMBER_OF_REPEAT; ++i) {
// Decode to Surface.
Log.d(TAG, "round #" + i + " decode to surface");
Surface s = getActivity().getSurfaceHolder().getSurface();
// only verify the result for decode to surface case.
- if (doDecode(name, video, width, height, s, i)) {
+ if (doDecode(name, video, width, height, s, i, maxTimeMs)) {
pass = true;
}
// Decode to buffer.
Log.d(TAG, "round #" + i + " decode to buffer");
- doDecode(name, video, width, height, null, i);
+ doDecode(name, video, width, height, null, i, maxTimeMs);
}
if (!pass) {
@@ -141,7 +153,8 @@
mSamplesInMemory.clear();
}
- private boolean doDecode(String name, int video, int w, int h, Surface surface, int round)
+ private boolean doDecode(
+ String name, int video, int w, int h, Surface surface, int round, long maxTimeMs)
throws Exception {
AssetFileDescriptor testFd = mResources.openRawResourceFd(video);
MediaExtractor extractor = new MediaExtractor();
@@ -220,7 +233,7 @@
sawInputEOS = (++inputNum == TOTAL_FRAMES);
if (!sawInputEOS &&
- ((System.currentTimeMillis() - start) > MAX_TIME_MS)) {
+ ((System.currentTimeMillis() - start) > maxTimeMs)) {
sawInputEOS = true;
}
if (sawInputEOS) {
diff --git a/tests/tests/os/src/android/os/cts/SecurityPatchTest.java b/tests/tests/os/src/android/os/cts/SecurityPatchTest.java
new file mode 100644
index 0000000..5516a19
--- /dev/null
+++ b/tests/tests/os/src/android/os/cts/SecurityPatchTest.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2016 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.Build;
+import android.os.SystemProperties;
+import android.test.InstrumentationTestCase;
+import android.util.Log;
+
+/**
+ * Tests for Security Patch String settings
+ */
+public class SecurityPatchTest extends InstrumentationTestCase {
+
+ private static final String TAG = SecurityPatchTest.class.getSimpleName();
+ private static final String SECURITY_PATCH_ERROR =
+ "ro.build.version.security_patch should be in the format \"YYYY-MM-DD\". Found \"%s\"";
+ private static final String SECURITY_PATCH_DATE_ERROR =
+ "ro.build.version.security_patch should be \"%d-%02d\" or later. Found \"%s\"";
+ private static final int SECURITY_PATCH_YEAR = 2016;
+ private static final int SECURITY_PATCH_MONTH = 04;
+
+ private boolean mSkipTests = false;
+
+ @Override
+ protected void setUp() {
+ mSkipTests = (Build.VERSION.SDK_INT < Build.VERSION_CODES.M);
+ }
+
+ /** Security patch string must exist in M or higher **/
+ public void testSecurityPatchFound() {
+ if (mSkipTests) {
+ Log.w(TAG, "Skipping M+ Test.");
+ return;
+ }
+
+ String buildSecurityPatch = SystemProperties.get("ro.build.version.security_patch", "");
+ String error = String.format(SECURITY_PATCH_ERROR, buildSecurityPatch);
+ assertTrue(error, !buildSecurityPatch.isEmpty());
+ }
+
+ /** Security patch should be of the form YYYY-MM-DD in M or higher */
+ public void testSecurityPatchFormat() {
+ if (mSkipTests) {
+ Log.w(TAG, "Skipping M+ Test.");
+ return;
+ }
+
+ String buildSecurityPatch = SystemProperties.get("ro.build.version.security_patch", "");
+ String error = String.format(SECURITY_PATCH_ERROR, buildSecurityPatch);
+
+ assertEquals(error, 10, buildSecurityPatch.length());
+ assertTrue(error, Character.isDigit(buildSecurityPatch.charAt(0)));
+ assertTrue(error, Character.isDigit(buildSecurityPatch.charAt(1)));
+ assertTrue(error, Character.isDigit(buildSecurityPatch.charAt(2)));
+ assertTrue(error, Character.isDigit(buildSecurityPatch.charAt(3)));
+ assertEquals(error, '-', buildSecurityPatch.charAt(4));
+ assertTrue(error, Character.isDigit(buildSecurityPatch.charAt(5)));
+ assertTrue(error, Character.isDigit(buildSecurityPatch.charAt(6)));
+ assertEquals(error, '-', buildSecurityPatch.charAt(7));
+ assertTrue(error, Character.isDigit(buildSecurityPatch.charAt(8)));
+ assertTrue(error, Character.isDigit(buildSecurityPatch.charAt(9)));
+ }
+
+ /** Security patch should no older than the month this test was updated in M or higher **/
+ public void testSecurityPatchDate() {
+ if (mSkipTests) {
+ Log.w(TAG, "Skipping M+ Test.");
+ return;
+ }
+
+ String buildSecurityPatch = SystemProperties.get("ro.build.version.security_patch", "");
+ String error = String.format(SECURITY_PATCH_DATE_ERROR,
+ SECURITY_PATCH_YEAR,
+ SECURITY_PATCH_MONTH,
+ buildSecurityPatch);
+
+ int declaredYear = 0;
+ int declaredMonth = 0;
+
+ try {
+ declaredYear = Integer.parseInt(buildSecurityPatch.substring(0,4));
+ declaredMonth = Integer.parseInt(buildSecurityPatch.substring(5,7));
+ } catch (Exception e) {
+ assertTrue(error, false);
+ }
+
+ assertTrue(error, declaredYear >= SECURITY_PATCH_YEAR);
+ assertTrue(error, (declaredYear > SECURITY_PATCH_YEAR) ||
+ (declaredMonth >= SECURITY_PATCH_MONTH));
+ }
+}
diff --git a/tests/tests/permission2/res/raw/android_manifest.xml b/tests/tests/permission2/res/raw/android_manifest.xml
index 08bccc1..bc7119c 100644
--- a/tests/tests/permission2/res/raw/android_manifest.xml
+++ b/tests/tests/permission2/res/raw/android_manifest.xml
@@ -18,8 +18,8 @@
*/
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="android" coreApp="true" android:sharedUserId="android.uid.system"
- android:sharedUserLabel="@string/android_system_label">
+ package="android" coreApp="true" android:sharedUserId="android.uid.system"
+ android:sharedUserLabel="@string/android_system_label">
<!-- ================================================ -->
<!-- Special broadcasts that only the system can send -->
@@ -33,6 +33,7 @@
<protected-broadcast android:name="android.intent.action.TIME_TICK" />
<protected-broadcast android:name="android.intent.action.TIMEZONE_CHANGED" />
<protected-broadcast android:name="android.intent.action.DATE_CHANGED" />
+ <protected-broadcast android:name="android.intent.action.PRE_BOOT_COMPLETED" />
<protected-broadcast android:name="android.intent.action.BOOT_COMPLETED" />
<protected-broadcast android:name="android.intent.action.PACKAGE_INSTALL" />
<protected-broadcast android:name="android.intent.action.PACKAGE_ADDED" />
@@ -46,6 +47,8 @@
<protected-broadcast android:name="android.intent.action.PACKAGE_FIRST_LAUNCH" />
<protected-broadcast android:name="android.intent.action.PACKAGE_NEEDS_VERIFICATION" />
<protected-broadcast android:name="android.intent.action.PACKAGE_VERIFIED" />
+ <protected-broadcast android:name="android.intent.action.PACKAGES_SUSPENDED" />
+ <protected-broadcast android:name="android.intent.action.PACKAGES_UNSUSPENDED" />
<protected-broadcast android:name="android.intent.action.UID_REMOVED" />
<protected-broadcast android:name="android.intent.action.QUERY_PACKAGE_RESTART" />
<protected-broadcast android:name="android.intent.action.CONFIGURATION_CHANGED" />
@@ -65,6 +68,7 @@
<protected-broadcast android:name="android.intent.action.NEW_OUTGOING_CALL" />
<protected-broadcast android:name="android.intent.action.REBOOT" />
<protected-broadcast android:name="android.intent.action.DOCK_EVENT" />
+ <protected-broadcast android:name="android.intent.action.THERMAL_EVENT" />
<protected-broadcast android:name="android.intent.action.MASTER_CLEAR_NOTIFICATION" />
<protected-broadcast android:name="android.intent.action.USER_ADDED" />
<protected-broadcast android:name="android.intent.action.USER_REMOVED" />
@@ -75,6 +79,7 @@
<protected-broadcast android:name="android.intent.action.USER_BACKGROUND" />
<protected-broadcast android:name="android.intent.action.USER_FOREGROUND" />
<protected-broadcast android:name="android.intent.action.USER_SWITCHED" />
+ <protected-broadcast android:name="android.intent.action.USER_INITIALIZE" />
<protected-broadcast android:name="android.intent.action.INTENT_FILTER_NEEDS_VERIFICATION" />
<protected-broadcast android:name="android.os.action.POWER_SAVE_MODE_CHANGED" />
@@ -91,6 +96,10 @@
<protected-broadcast android:name="android.app.action.EXIT_DESK_MODE" />
<protected-broadcast android:name="android.app.action.NEXT_ALARM_CLOCK_CHANGED" />
+ <protected-broadcast android:name="android.app.action.BUGREPORT_SHARING_DECLINED" />
+ <protected-broadcast android:name="android.app.action.BUGREPORT_FAILED" />
+ <protected-broadcast android:name="android.app.action.BUGREPORT_SHARE" />
+
<protected-broadcast android:name="android.appwidget.action.APPWIDGET_UPDATE_OPTIONS" />
<protected-broadcast android:name="android.appwidget.action.APPWIDGET_DELETED" />
<protected-broadcast android:name="android.appwidget.action.APPWIDGET_DISABLED" />
@@ -100,10 +109,11 @@
<protected-broadcast android:name="android.os.action.SETTING_RESTORED" />
- <protected-broadcast android:name="android.backup.intent.RUN" />
- <protected-broadcast android:name="android.backup.intent.CLEAR" />
- <protected-broadcast android:name="android.backup.intent.INIT" />
+ <protected-broadcast android:name="android.app.backup.intent.RUN" />
+ <protected-broadcast android:name="android.app.backup.intent.CLEAR" />
+ <protected-broadcast android:name="android.app.backup.intent.INIT" />
+ <protected-broadcast android:name="android.bluetooth.intent.DISCOVERABLE_TIMEOUT" />
<protected-broadcast android:name="android.bluetooth.adapter.action.STATE_CHANGED" />
<protected-broadcast android:name="android.bluetooth.adapter.action.SCAN_MODE_CHANGED" />
<protected-broadcast android:name="android.bluetooth.adapter.action.DISCOVERY_STARTED" />
@@ -130,43 +140,43 @@
<protected-broadcast android:name="android.bluetooth.devicepicker.action.LAUNCH" />
<protected-broadcast android:name="android.bluetooth.devicepicker.action.DEVICE_SELECTED" />
<protected-broadcast
- android:name="android.bluetooth.headset.profile.action.CONNECTION_STATE_CHANGED" />
+ android:name="android.bluetooth.headset.profile.action.CONNECTION_STATE_CHANGED" />
<protected-broadcast
- android:name="android.bluetooth.headset.profile.action.AUDIO_STATE_CHANGED" />
+ android:name="android.bluetooth.headset.profile.action.AUDIO_STATE_CHANGED" />
<protected-broadcast
- android:name="android.bluetooth.headset.action.VENDOR_SPECIFIC_HEADSET_EVENT" />
+ android:name="android.bluetooth.headset.action.VENDOR_SPECIFIC_HEADSET_EVENT" />
<protected-broadcast
- android:name="android.bluetooth.headsetclient.profile.action.CONNECTION_STATE_CHANGED" />
+ android:name="android.bluetooth.headsetclient.profile.action.CONNECTION_STATE_CHANGED" />
<protected-broadcast
- android:name="android.bluetooth.headsetclient.profile.action.AUDIO_STATE_CHANGED" />
+ android:name="android.bluetooth.headsetclient.profile.action.AUDIO_STATE_CHANGED" />
<protected-broadcast
- android:name="android.bluetooth.headsetclient.profile.action.AG_EVENT" />
+ android:name="android.bluetooth.headsetclient.profile.action.AG_EVENT" />
<protected-broadcast
- android:name="android.bluetooth.headsetclient.profile.action.AG_CALL_CHANGED" />
+ android:name="android.bluetooth.headsetclient.profile.action.AG_CALL_CHANGED" />
<protected-broadcast
- android:name="android.bluetooth.headsetclient.profile.action.RESULT" />
+ android:name="android.bluetooth.headsetclient.profile.action.RESULT" />
<protected-broadcast
- android:name="android.bluetooth.headsetclient.profile.action.LAST_VTAG" />
+ android:name="android.bluetooth.headsetclient.profile.action.LAST_VTAG" />
<protected-broadcast
- android:name="android.bluetooth.a2dp.profile.action.CONNECTION_STATE_CHANGED" />
+ android:name="android.bluetooth.a2dp.profile.action.CONNECTION_STATE_CHANGED" />
<protected-broadcast
- android:name="android.bluetooth.a2dp.profile.action.PLAYING_STATE_CHANGED" />
+ android:name="android.bluetooth.a2dp.profile.action.PLAYING_STATE_CHANGED" />
<protected-broadcast
- android:name="android.bluetooth.a2dp-sink.profile.action.CONNECTION_STATE_CHANGED" />
+ android:name="android.bluetooth.a2dp-sink.profile.action.CONNECTION_STATE_CHANGED" />
<protected-broadcast
- android:name="android.bluetooth.a2dp-sink.profile.action.PLAYING_STATE_CHANGED" />
+ android:name="android.bluetooth.a2dp-sink.profile.action.PLAYING_STATE_CHANGED" />
<protected-broadcast
- android:name="android.bluetooth.a2dp-sink.profile.action.AUDIO_CONFIG_CHANGED" />
- <protected-broadcast
- android:name="android.bluetooth.avrcp-controller.profile.action.CONNECTION_STATE_CHANGED" />
+ android:name="android.bluetooth.a2dp-sink.profile.action.AUDIO_CONFIG_CHANGED" />
<protected-broadcast
- android:name="android.bluetooth.input.profile.action.CONNECTION_STATE_CHANGED" />
+ android:name="android.bluetooth.avrcp-controller.profile.action.CONNECTION_STATE_CHANGED" />
<protected-broadcast
- android:name="android.bluetooth.input.profile.action.PROTOCOL_MODE_CHANGED" />
+ android:name="android.bluetooth.input.profile.action.CONNECTION_STATE_CHANGED" />
<protected-broadcast
- android:name="android.bluetooth.input.profile.action.VIRTUAL_UNPLUG_STATUS" />
+ android:name="android.bluetooth.input.profile.action.PROTOCOL_MODE_CHANGED" />
<protected-broadcast
- android:name="android.bluetooth.pan.profile.action.CONNECTION_STATE_CHANGED" />
+ android:name="android.bluetooth.input.profile.action.VIRTUAL_UNPLUG_STATUS" />
+ <protected-broadcast
+ android:name="android.bluetooth.pan.profile.action.CONNECTION_STATE_CHANGED" />
<protected-broadcast android:name="android.bluetooth.pbap.intent.action.PBAP_STATE_CHANGED" />
<protected-broadcast android:name="android.btopp.intent.action.INCOMING_FILE_NOTIFICATION" />
<protected-broadcast android:name="android.btopp.intent.action.USER_CONFIRMATION_TIMEOUT" />
@@ -188,7 +198,7 @@
<protected-broadcast android:name="android.hardware.usb.action.USB_STATE" />
<protected-broadcast android:name="android.hardware.usb.action.USB_PORT_CHANGED" />
<protected-broadcast android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
- <protected-broadcast android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
+ <protected-broadcast android:name="android.hardware.usb.action.USB_ACCESSORY_DETACHED" />
<protected-broadcast android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
<protected-broadcast android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />
@@ -201,6 +211,7 @@
<protected-broadcast android:name="android.media.VOLUME_CHANGED_ACTION" />
<protected-broadcast android:name="android.media.MASTER_VOLUME_CHANGED_ACTION" />
<protected-broadcast android:name="android.media.MASTER_MUTE_CHANGED_ACTION" />
+ <protected-broadcast android:name="android.media.MASTER_MONO_CHANGED_ACTION" />
<protected-broadcast android:name="android.media.SCO_AUDIO_STATE_CHANGED" />
<protected-broadcast android:name="android.media.ACTION_SCO_AUDIO_STATE_UPDATED" />
@@ -220,17 +231,27 @@
<!-- @deprecated. Only {@link android.net.ConnectivityManager.CONNECTIVITY_ACTION} is sent. -->
<protected-broadcast android:name="android.net.conn.CONNECTIVITY_CHANGE_IMMEDIATE" />
<protected-broadcast android:name="android.net.conn.DATA_ACTIVITY_CHANGE" />
+ <protected-broadcast android:name="android.net.conn.RESTRICT_BACKGROUND_CHANGED" />
<protected-broadcast android:name="android.net.conn.BACKGROUND_DATA_SETTING_CHANGED" />
<protected-broadcast android:name="android.net.conn.CAPTIVE_PORTAL_TEST_COMPLETED" />
<protected-broadcast android:name="android.net.nsd.STATE_CHANGED" />
- <protected-broadcast android:name="android.nfc.action.LLCP_LINK_STATE_CHANGED" />
+ <protected-broadcast android:name="android.nfc.action.ADAPTER_STATE_CHANGED" />
+ <protected-broadcast android:name="android.nfc.action.TRANSACTION_DETECTED" />
+ <protected-broadcast android:name="com.android.nfc.action.LLCP_UP" />
+ <protected-broadcast android:name="com.android.nfc.action.LLCP_DOWN" />
+ <protected-broadcast android:name="com.android.nfc.cardemulation.action.CLOSE_TAP_DIALOG" />
+ <protected-broadcast android:name="com.android.nfc.handover.action.ALLOW_CONNECT" />
+ <protected-broadcast android:name="com.android.nfc.handover.action.DENY_CONNECT" />
<protected-broadcast android:name="com.android.nfc_extras.action.RF_FIELD_ON_DETECTED" />
<protected-broadcast android:name="com.android.nfc_extras.action.RF_FIELD_OFF_DETECTED" />
<protected-broadcast android:name="com.android.nfc_extras.action.AID_SELECTED" />
-
- <protected-broadcast android:name="android.nfc.action.TRANSACTION_DETECTED" />
+ <!-- For NFC to BT handover -->
+ <protected-broadcast android:name="android.btopp.intent.action.WHITELIST_DEVICE" />
+ <protected-broadcast android:name="android.btopp.intent.action.STOP_HANDOVER_TRANSFER" />
+ <protected-broadcast android:name="android.nfc.handover.intent.action.HANDOVER_SEND" />
+ <protected-broadcast android:name="android.nfc.handover.intent.action.HANDOVER_SEND_MULTIPLE" />
<protected-broadcast android:name="android.intent.action.CLEAR_DNS_CACHE" />
<protected-broadcast android:name="android.intent.action.PROXY_CHANGE" />
@@ -240,11 +261,12 @@
<protected-broadcast android:name="android.intent.action.DREAMING_STARTED" />
<protected-broadcast android:name="android.intent.action.DREAMING_STOPPED" />
<protected-broadcast android:name="android.intent.action.ANY_DATA_STATE" />
- <protected-broadcast android:name="android.intent.action.DATA_CONNECTION_CONNECTED_TO_PROVISIONING_APN" />
<protected-broadcast android:name="com.android.server.WifiManager.action.START_SCAN" />
<protected-broadcast android:name="com.android.server.WifiManager.action.START_PNO" />
<protected-broadcast android:name="com.android.server.WifiManager.action.DELAYED_DRIVER_STOP" />
+ <protected-broadcast android:name="com.android.server.action.REMOTE_BUGREPORT_SHARING_ACCEPTED" />
+ <protected-broadcast android:name="com.android.server.action.REMOTE_BUGREPORT_SHARING_DECLINED" />
<protected-broadcast android:name="android.net.wifi.WIFI_STATE_CHANGED" />
<protected-broadcast android:name="android.net.wifi.WIFI_AP_STATE_CHANGED" />
<protected-broadcast android:name="android.net.wifi.WIFI_CREDENTIAL_CHANGED" />
@@ -274,11 +296,13 @@
<protected-broadcast android:name="android.intent.action.AIRPLANE_MODE" />
<protected-broadcast android:name="android.intent.action.ADVANCED_SETTINGS" />
<protected-broadcast android:name="android.intent.action.APPLICATION_RESTRICTIONS_CHANGED" />
- <protected-broadcast android:name="android.intent.action.BUGREPORT_FINISHED" />
+ <!-- Legacy -->
<protected-broadcast android:name="android.intent.action.ACTION_IDLE_MAINTENANCE_START" />
<protected-broadcast android:name="android.intent.action.ACTION_IDLE_MAINTENANCE_END" />
+ <protected-broadcast android:name="com.android.server.task.controllers.IdleController.ACTION_TRIGGER_IDLE" />
+
<protected-broadcast android:name="android.intent.action.HDMI_PLUGGED" />
<protected-broadcast android:name="android.intent.action.PHONE_STATE" />
@@ -294,11 +318,11 @@
<protected-broadcast android:name="android.telecom.action.DEFAULT_DIALER_CHANGED" />
<protected-broadcast
- android:name="com.android.server.connectivityservice.CONNECTED_TO_PROVISIONING_NETWORK_ACTION" />
+ android:name="com.android.server.connectivityservice.CONNECTED_TO_PROVISIONING_NETWORK_ACTION" />
<!-- Defined in RestrictionsManager -->
<protected-broadcast
- android:name="android.intent.action.PERMISSION_RESPONSE_RECEIVED" />
+ android:name="android.intent.action.PERMISSION_RESPONSE_RECEIVED" />
<!-- Defined in RestrictionsManager -->
<protected-broadcast android:name="android.intent.action.REQUEST_PERMISSION" />
@@ -320,6 +344,112 @@
<protected-broadcast android:name="android.internal.policy.action.BURN_IN_PROTECTION" />
<protected-broadcast android:name="android.app.action.SYSTEM_UPDATE_POLICY_CHANGED" />
<protected-broadcast android:name="android.app.action.DEVICE_OWNER_CHANGED" />
+
+ <protected-broadcast android:name="android.intent.action.MANAGED_PROFILE_AVAILABILITY_CHANGED" />
+
+ <!-- Added in N -->
+ <protected-broadcast android:name="android.intent.action.ANR" />
+ <protected-broadcast android:name="android.intent.action.CALL" />
+ <protected-broadcast android:name="android.intent.action.DROPBOX_ENTRY_ADDED" />
+ <protected-broadcast android:name="android.intent.action.INPUT_METHOD_CHANGED" />
+ <protected-broadcast android:name="android.intent.action.internal_sim_state_changed" />
+ <protected-broadcast android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
+ <protected-broadcast android:name="android.intent.action.PRECISE_CALL_STATE" />
+ <protected-broadcast android:name="android.intent.action.PRECISE_DATA_CONNECTION_STATE_CHANGED" />
+ <protected-broadcast android:name="android.intent.action.SUBSCRIPTION_PHONE_STATE" />
+ <protected-broadcast android:name="android.intent.action.USER_INFO_CHANGED" />
+ <protected-broadcast android:name="android.intent.action.USER_UNLOCKED" />
+ <protected-broadcast android:name="android.intent.action.WALLPAPER_CHANGED" />
+
+ <protected-broadcast android:name="android.app.action.DEVICE_POLICY_MANAGER_STATE_CHANGED" />
+ <protected-broadcast android:name="android.app.action.CHOOSE_PRIVATE_KEY_ALIAS" />
+ <protected-broadcast android:name="android.app.action.DEVICE_ADMIN_DISABLED" />
+ <protected-broadcast android:name="android.app.action.DEVICE_ADMIN_DISABLE_REQUESTED" />
+ <protected-broadcast android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
+ <protected-broadcast android:name="android.app.action.LOCK_TASK_ENTERING" />
+ <protected-broadcast android:name="android.app.action.LOCK_TASK_EXITING" />
+ <protected-broadcast android:name="android.app.action.NOTIFY_PENDING_SYSTEM_UPDATE" />
+ <protected-broadcast android:name="android.app.action.ACTION_PASSWORD_CHANGED" />
+ <protected-broadcast android:name="android.app.action.ACTION_PASSWORD_EXPIRING" />
+ <protected-broadcast android:name="android.app.action.ACTION_PASSWORD_FAILED" />
+ <protected-broadcast android:name="android.app.action.ACTION_PASSWORD_SUCCEEDED" />
+ <protected-broadcast android:name="com.android.server.ACTION_EXPIRED_PASSWORD_NOTIFICATION" />
+ <protected-broadcast android:name="android.intent.action.MANAGED_PROFILE_ADDED" />
+
+ <protected-broadcast android:name="android.bluetooth.adapter.action.BLE_STATE_CHANGED" />
+ <protected-broadcast android:name="android.content.jobscheduler.JOB_DELAY_EXPIRED" />
+ <protected-broadcast android:name="android.content.syncmanager.SYNC_ALARM" />
+ <protected-broadcast android:name="android.media.INTERNAL_RINGER_MODE_CHANGED_ACTION" />
+ <protected-broadcast android:name="android.media.STREAM_DEVICES_CHANGED_ACTION" />
+ <protected-broadcast android:name="android.media.STREAM_MUTE_CHANGED_ACTION" />
+ <protected-broadcast android:name="android.net.sip.SIP_SERVICE_UP" />
+ <protected-broadcast android:name="android.nfc.action.ADAPTER_STATE_CHANGED" />
+ <protected-broadcast android:name="android.os.action.CHARGING" />
+ <protected-broadcast android:name="android.os.action.DISCHARGING" />
+ <protected-broadcast android:name="android.search.action.SEARCHABLES_CHANGED" />
+ <protected-broadcast android:name="android.security.STORAGE_CHANGED" />
+ <protected-broadcast android:name="android.telecom.action.PHONE_ACCOUNT_REGISTERED" />
+ <protected-broadcast android:name="android.telecom.action.PHONE_ACCOUNT_UNREGISTERED" />
+ <protected-broadcast android:name="android.telecom.action.SHOW_MISSED_CALLS_NOTIFICATION" />
+ <protected-broadcast android:name="android.telephony.action.CARRIER_CONFIG_CHANGED" />
+
+ <protected-broadcast android:name="com.android.bluetooth.btservice.action.ALARM_WAKEUP" />
+ <protected-broadcast android:name="com.android.ims.IMS_SERVICE_UP" />
+ <protected-broadcast android:name="com.android.server.action.NETWORK_STATS_POLL" />
+ <protected-broadcast android:name="com.android.server.action.NETWORK_STATS_UPDATED" />
+ <protected-broadcast android:name="com.android.server.NetworkTimeUpdateService.action.POLL" />
+ <protected-broadcast android:name="com.android.server.telecom.intent.action.CALLS_ADD_ENTRY" />
+ <protected-broadcast android:name="com.android.settings.location.MODE_CHANGING" />
+
+ <protected-broadcast android:name="ScheduleConditionProvider.EVALUATE" />
+ <protected-broadcast android:name="EventConditionProvider.EVALUATE" />
+ <protected-broadcast android:name="wifi_scan_available" />
+
+ <protected-broadcast android:name="action.cne.started" />
+ <protected-broadcast android:name="android.content.jobscheduler.JOB_DEADLINE_EXPIRED" />
+ <protected-broadcast android:name="android.intent.action.ACTION_UNSOL_RESPONSE_OEM_HOOK_RAW" />
+ <protected-broadcast android:name="android.net.conn.CONNECTIVITY_CHANGE_SUPL" />
+ <protected-broadcast android:name="android.os.action.ACTION_EFFECTS_SUPPRESSOR_CHANGED" />
+ <protected-broadcast android:name="android.os.action.LIGHT_DEVICE_IDLE_MODE_CHANGED" />
+ <protected-broadcast android:name="android.os.storage.action.VOLUME_STATE_CHANGED" />
+ <protected-broadcast android:name="com.android.server.action.UPDATE_TWILIGHT_STATE" />
+ <protected-broadcast android:name="com.android.server.device_idle.STEP_IDLE_STATE" />
+ <protected-broadcast android:name="com.android.server.device_idle.STEP_LIGHT_IDLE_STATE" />
+ <protected-broadcast android:name="com.android.server.Wifi.action.TOGGLE_PNO" />
+ <protected-broadcast android:name="intent.action.ACTION_RF_BAND_INFO" />
+ <protected-broadcast android:name="android.intent.action.MEDIA_RESOURCE_GRANTED" />
+ <protected-broadcast android:name="android.app.action.SECURITY_LOGS_AVAILABLE" />
+
+ <protected-broadcast android:name="android.app.action.INTERRUPTION_FILTER_CHANGED" />
+ <protected-broadcast android:name="android.app.action.INTERRUPTION_FILTER_CHANGED_INTERNAL" />
+ <protected-broadcast android:name="android.app.action.NOTIFICATION_POLICY_CHANGED" />
+ <protected-broadcast android:name="android.app.action.NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED" />
+ <protected-broadcast android:name="android.os.action.ACTION_EFFECTS_SUPPRESSOR_CHANGED" />
+
+ <protected-broadcast android:name="android.permission.GET_APP_GRANTED_URI_PERMISSIONS" />
+ <protected-broadcast android:name="android.permission.CLEAR_APP_GRANTED_URI_PERMISSIONS" />
+
+ <protected-broadcast android:name="android.intent.action.DYNAMIC_SENSOR_CHANGED" />
+
+ <protected-broadcast android:name="android.intent.action.ACTION_RADIO_OFF" />
+ <protected-broadcast android:name="android.intent.action.MANAGED_PROFILE_UNLOCKED" />
+
+ <protected-broadcast android:name="android.accounts.LOGIN_ACCOUNTS_CHANGED" />
+ <protected-broadcast android:name="com.android.sync.SYNC_CONN_STATUS_CHANGED" />
+
+ <protected-broadcast android:name="com.android.phone.SIP_INCOMING_CALL" />
+ <protected-broadcast android:name="com.android.phone.SIP_ADD_PHONE" />
+ <protected-broadcast android:name="com.android.phone.SIP_REMOVE_PHONE" />
+ <protected-broadcast android:name="com.android.phone.SIP_CALL_OPTION_CHANGED" />
+
+ <protected-broadcast android:name="android.bluetooth.adapter.action.BLE_ACL_CONNECTED" />
+ <protected-broadcast android:name="android.bluetooth.adapter.action.BLE_ACL_DISCONNECTED" />
+
+ <protected-broadcast android:name="android.bluetooth.input.profile.action.HANDSHAKE" />
+ <protected-broadcast android:name="android.bluetooth.input.profile.action.REPORT" />
+
+ <protected-broadcast android:name="android.intent.action.TWILIGHT_CHANGED" />
+
<!-- ====================================================================== -->
<!-- RUNTIME PERMISSIONS -->
<!-- ====================================================================== -->
@@ -332,28 +462,28 @@
<!-- Used for runtime permissions related to user's contacts and profile. -->
<permission-group android:name="android.permission-group.CONTACTS"
- android:icon="@drawable/perm_group_contacts"
- android:label="@string/permgrouplab_contacts"
- android:description="@string/permgroupdesc_contacts"
- android:priority="100" />
+ android:icon="@drawable/perm_group_contacts"
+ android:label="@string/permgrouplab_contacts"
+ android:description="@string/permgroupdesc_contacts"
+ android:priority="100" />
<!-- Allows an application to read the user's contacts data.
<p>Protection level: dangerous
-->
<permission android:name="android.permission.READ_CONTACTS"
- android:permissionGroup="android.permission-group.CONTACTS"
- android:label="@string/permlab_readContacts"
- android:description="@string/permdesc_readContacts"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.CONTACTS"
+ android:label="@string/permlab_readContacts"
+ android:description="@string/permdesc_readContacts"
+ android:protectionLevel="dangerous" />
<!-- Allows an application to write the user's contacts data.
<p>Protection level: dangerous
-->
<permission android:name="android.permission.WRITE_CONTACTS"
- android:permissionGroup="android.permission-group.CONTACTS"
- android:label="@string/permlab_writeContacts"
- android:description="@string/permdesc_writeContacts"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.CONTACTS"
+ android:label="@string/permlab_writeContacts"
+ android:description="@string/permdesc_writeContacts"
+ android:protectionLevel="dangerous" />
<!-- ====================================================================== -->
<!-- Permissions for accessing user's calendar -->
@@ -362,28 +492,28 @@
<!-- Used for runtime permissions related to user's calendar. -->
<permission-group android:name="android.permission-group.CALENDAR"
- android:icon="@drawable/perm_group_calendar"
- android:label="@string/permgrouplab_calendar"
- android:description="@string/permgroupdesc_calendar"
- android:priority="200" />
+ android:icon="@drawable/perm_group_calendar"
+ android:label="@string/permgrouplab_calendar"
+ android:description="@string/permgroupdesc_calendar"
+ android:priority="200" />
<!-- Allows an application to read the user's calendar data.
<p>Protection level: dangerous
-->
<permission android:name="android.permission.READ_CALENDAR"
- android:permissionGroup="android.permission-group.CALENDAR"
- android:label="@string/permlab_readCalendar"
- android:description="@string/permdesc_readCalendar"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.CALENDAR"
+ android:label="@string/permlab_readCalendar"
+ android:description="@string/permdesc_readCalendar"
+ android:protectionLevel="dangerous" />
<!-- Allows an application to write the user's calendar data.
<p>Protection level: dangerous
-->
<permission android:name="android.permission.WRITE_CALENDAR"
- android:permissionGroup="android.permission-group.CALENDAR"
- android:label="@string/permlab_writeCalendar"
- android:description="@string/permdesc_writeCalendar"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.CALENDAR"
+ android:label="@string/permlab_writeCalendar"
+ android:description="@string/permdesc_writeCalendar"
+ android:protectionLevel="dangerous" />
<!-- ====================================================================== -->
<!-- Permissions for accessing and modifying user's SMS messages -->
@@ -392,56 +522,56 @@
<!-- Used for runtime permissions related to user's SMS messages. -->
<permission-group android:name="android.permission-group.SMS"
- android:icon="@drawable/perm_group_sms"
- android:label="@string/permgrouplab_sms"
- android:description="@string/permgroupdesc_sms"
- android:priority="300" />
+ android:icon="@drawable/perm_group_sms"
+ android:label="@string/permgrouplab_sms"
+ android:description="@string/permgroupdesc_sms"
+ android:priority="300" />
<!-- Allows an application to send SMS messages.
<p>Protection level: dangerous
-->
<permission android:name="android.permission.SEND_SMS"
- android:permissionGroup="android.permission-group.SMS"
- android:label="@string/permlab_sendSms"
- android:description="@string/permdesc_sendSms"
- android:permissionFlags="costsMoney"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.SMS"
+ android:label="@string/permlab_sendSms"
+ android:description="@string/permdesc_sendSms"
+ android:permissionFlags="costsMoney"
+ android:protectionLevel="dangerous" />
<!-- Allows an application to receive SMS messages.
<p>Protection level: dangerous
-->
<permission android:name="android.permission.RECEIVE_SMS"
- android:permissionGroup="android.permission-group.SMS"
- android:label="@string/permlab_receiveSms"
- android:description="@string/permdesc_receiveSms"
- android:protectionLevel="dangerous"/>
+ android:permissionGroup="android.permission-group.SMS"
+ android:label="@string/permlab_receiveSms"
+ android:description="@string/permdesc_receiveSms"
+ android:protectionLevel="dangerous"/>
<!-- Allows an application to read SMS messages.
<p>Protection level: dangerous
-->
<permission android:name="android.permission.READ_SMS"
- android:permissionGroup="android.permission-group.SMS"
- android:label="@string/permlab_readSms"
- android:description="@string/permdesc_readSms"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.SMS"
+ android:label="@string/permlab_readSms"
+ android:description="@string/permdesc_readSms"
+ android:protectionLevel="dangerous" />
<!-- Allows an application to receive WAP push messages.
<p>Protection level: dangerous
-->
<permission android:name="android.permission.RECEIVE_WAP_PUSH"
- android:permissionGroup="android.permission-group.SMS"
- android:label="@string/permlab_receiveWapPush"
- android:description="@string/permdesc_receiveWapPush"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.SMS"
+ android:label="@string/permlab_receiveWapPush"
+ android:description="@string/permdesc_receiveWapPush"
+ android:protectionLevel="dangerous" />
<!-- Allows an application to monitor incoming MMS messages.
<p>Protection level: dangerous
-->
<permission android:name="android.permission.RECEIVE_MMS"
- android:permissionGroup="android.permission-group.SMS"
- android:label="@string/permlab_receiveMms"
- android:description="@string/permdesc_receiveMms"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.SMS"
+ android:label="@string/permlab_receiveMms"
+ android:description="@string/permdesc_receiveMms"
+ android:protectionLevel="dangerous" />
<!-- Allows an application to read previously received cell broadcast
messages and to register a content observer to get notifications when
@@ -456,10 +586,10 @@
<p>Protection level: dangerous
@hide Pending API council approval -->
<permission android:name="android.permission.READ_CELL_BROADCASTS"
- android:permissionGroup="android.permission-group.SMS"
- android:label="@string/permlab_readCellBroadcasts"
- android:description="@string/permdesc_readCellBroadcasts"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.SMS"
+ android:label="@string/permlab_readCellBroadcasts"
+ android:description="@string/permdesc_readCellBroadcasts"
+ android:protectionLevel="dangerous" />
<!-- ====================================================================== -->
<!-- Permissions for accessing external storage -->
@@ -468,10 +598,10 @@
<!-- Used for runtime permissions related to the shared external storage. -->
<permission-group android:name="android.permission-group.STORAGE"
- android:icon="@drawable/perm_group_storage"
- android:label="@string/permgrouplab_storage"
- android:description="@string/permgroupdesc_storage"
- android:priority="900" />
+ android:icon="@drawable/perm_group_storage"
+ android:label="@string/permgrouplab_storage"
+ android:description="@string/permgroupdesc_storage"
+ android:priority="900" />
<!-- Allows an application to read from external storage.
<p>Any app that declares the {@link #WRITE_EXTERNAL_STORAGE} permission is implicitly
@@ -496,10 +626,10 @@
<p>Protection level: dangerous
-->
<permission android:name="android.permission.READ_EXTERNAL_STORAGE"
- android:permissionGroup="android.permission-group.STORAGE"
- android:label="@string/permlab_sdcardRead"
- android:description="@string/permdesc_sdcardRead"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.STORAGE"
+ android:label="@string/permlab_sdcardRead"
+ android:description="@string/permdesc_sdcardRead"
+ android:protectionLevel="dangerous" />
<!-- Allows an application to write to external storage.
<p class="note"><strong>Note:</strong> If <em>both</em> your <a
@@ -517,10 +647,10 @@
<p>Protection level: dangerous
-->
<permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
- android:permissionGroup="android.permission-group.STORAGE"
- android:label="@string/permlab_sdcardWrite"
- android:description="@string/permdesc_sdcardWrite"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.STORAGE"
+ android:label="@string/permlab_sdcardWrite"
+ android:description="@string/permdesc_sdcardWrite"
+ android:protectionLevel="dangerous" />
<!-- ====================================================================== -->
<!-- Permissions for accessing the device location -->
@@ -529,28 +659,28 @@
<!-- Used for permissions that allow accessing the device location. -->
<permission-group android:name="android.permission-group.LOCATION"
- android:icon="@drawable/perm_group_location"
- android:label="@string/permgrouplab_location"
- android:description="@string/permgroupdesc_location"
- android:priority="400" />
+ android:icon="@drawable/perm_group_location"
+ android:label="@string/permgrouplab_location"
+ android:description="@string/permgroupdesc_location"
+ android:priority="400" />
<!-- Allows an app to access precise location.
<p>Protection level: dangerous
-->
<permission android:name="android.permission.ACCESS_FINE_LOCATION"
- android:permissionGroup="android.permission-group.LOCATION"
- android:label="@string/permlab_accessFineLocation"
- android:description="@string/permdesc_accessFineLocation"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.LOCATION"
+ android:label="@string/permlab_accessFineLocation"
+ android:description="@string/permdesc_accessFineLocation"
+ android:protectionLevel="dangerous" />
<!-- Allows an app to access approximate location.
<p>Protection level: dangerous
-->
<permission android:name="android.permission.ACCESS_COARSE_LOCATION"
- android:permissionGroup="android.permission-group.LOCATION"
- android:label="@string/permlab_accessCoarseLocation"
- android:description="@string/permdesc_accessCoarseLocation"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.LOCATION"
+ android:label="@string/permlab_accessCoarseLocation"
+ android:description="@string/permdesc_accessCoarseLocation"
+ android:protectionLevel="dangerous" />
<!-- ====================================================================== -->
<!-- Permissions for accessing the device telephony -->
@@ -559,10 +689,10 @@
<!-- Used for permissions that are associated telephony features. -->
<permission-group android:name="android.permission-group.PHONE"
- android:icon="@drawable/perm_group_phone_calls"
- android:label="@string/permgrouplab_phone"
- android:description="@string/permgroupdesc_phone"
- android:priority="500" />
+ android:icon="@drawable/perm_group_phone_calls"
+ android:label="@string/permgrouplab_phone"
+ android:description="@string/permgroupdesc_phone"
+ android:priority="500" />
<!-- Allows read only access to phone state.
<p class="note"><strong>Note:</strong> If <em>both</em> your <a
@@ -576,32 +706,32 @@
<p>Protection level: dangerous
-->
<permission android:name="android.permission.READ_PHONE_STATE"
- android:permissionGroup="android.permission-group.PHONE"
- android:label="@string/permlab_readPhoneState"
- android:description="@string/permdesc_readPhoneState"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.PHONE"
+ android:label="@string/permlab_readPhoneState"
+ android:description="@string/permdesc_readPhoneState"
+ android:protectionLevel="dangerous" />
<!-- Allows an application to initiate a phone call without going through
the Dialer user interface for the user to confirm the call.
<p>Protection level: dangerous
-->
<permission android:name="android.permission.CALL_PHONE"
- android:permissionGroup="android.permission-group.PHONE"
- android:permissionFlags="costsMoney"
- android:label="@string/permlab_callPhone"
- android:description="@string/permdesc_callPhone"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.PHONE"
+ android:permissionFlags="costsMoney"
+ android:label="@string/permlab_callPhone"
+ android:description="@string/permdesc_callPhone"
+ android:protectionLevel="dangerous" />
<!-- Allows an application to access the IMS call service: making and
modifying a call
- <p>Protection level: signature|system
+ <p>Protection level: signature|privileged
@hide
-->
<permission android:name="android.permission.ACCESS_IMS_CALL_SERVICE"
- android:permissionGroup="android.permission-group.PHONE"
- android:label="@string/permlab_accessImsCallService"
- android:description="@string/permdesc_accessImsCallService"
- android:protectionLevel="signature|system" />
+ android:permissionGroup="android.permission-group.PHONE"
+ android:label="@string/permlab_accessImsCallService"
+ android:description="@string/permdesc_accessImsCallService"
+ android:protectionLevel="signature|privileged" />
<!-- Allows an application to read the user's call log.
<p class="note"><strong>Note:</strong> If your app uses the
@@ -616,13 +746,13 @@
<p>Protection level: dangerous
-->
<permission android:name="android.permission.READ_CALL_LOG"
- android:permissionGroup="android.permission-group.PHONE"
- android:label="@string/permlab_readCallLog"
- android:description="@string/permdesc_readCallLog"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.PHONE"
+ android:label="@string/permlab_readCallLog"
+ android:description="@string/permdesc_readCallLog"
+ android:protectionLevel="dangerous" />
<!-- Allows an application to write (but not read) the user's
- contacts data.
+ call log data.
<p class="note"><strong>Note:</strong> If your app uses the
{@link #WRITE_CONTACTS} permission and <em>both</em> your <a
href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code
@@ -635,28 +765,28 @@
<p>Protection level: dangerous
-->
<permission android:name="android.permission.WRITE_CALL_LOG"
- android:permissionGroup="android.permission-group.PHONE"
- android:label="@string/permlab_writeCallLog"
- android:description="@string/permdesc_writeCallLog"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.PHONE"
+ android:label="@string/permlab_writeCallLog"
+ android:description="@string/permdesc_writeCallLog"
+ android:protectionLevel="dangerous" />
<!-- Allows an application to add voicemails into the system.
<p>Protection level: dangerous
-->
<permission android:name="com.android.voicemail.permission.ADD_VOICEMAIL"
- android:permissionGroup="android.permission-group.PHONE"
- android:label="@string/permlab_addVoicemail"
- android:description="@string/permdesc_addVoicemail"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.PHONE"
+ android:label="@string/permlab_addVoicemail"
+ android:description="@string/permdesc_addVoicemail"
+ android:protectionLevel="dangerous" />
<!-- Allows an application to use SIP service.
<p>Protection level: dangerous
-->
<permission android:name="android.permission.USE_SIP"
- android:permissionGroup="android.permission-group.PHONE"
- android:description="@string/permdesc_use_sip"
- android:label="@string/permlab_use_sip"
- android:protectionLevel="dangerous"/>
+ android:permissionGroup="android.permission-group.PHONE"
+ android:description="@string/permdesc_use_sip"
+ android:label="@string/permlab_use_sip"
+ android:protectionLevel="dangerous"/>
<!-- Allows an application to see the number being dialed during an outgoing
call with the option to redirect the call to a different number or
@@ -664,10 +794,10 @@
<p>Protection level: dangerous
-->
<permission android:name="android.permission.PROCESS_OUTGOING_CALLS"
- android:permissionGroup="android.permission-group.PHONE"
- android:label="@string/permlab_processOutgoingCalls"
- android:description="@string/permdesc_processOutgoingCalls"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.PHONE"
+ android:label="@string/permlab_processOutgoingCalls"
+ android:description="@string/permdesc_processOutgoingCalls"
+ android:protectionLevel="dangerous" />
<!-- ====================================================================== -->
<!-- Permissions for accessing the device microphone -->
@@ -678,19 +808,19 @@
microphone audio from the device. Note that phone calls also capture audio
but are in a separate (more visible) permission group. -->
<permission-group android:name="android.permission-group.MICROPHONE"
- android:icon="@drawable/perm_group_microphone"
- android:label="@string/permgrouplab_microphone"
- android:description="@string/permgroupdesc_microphone"
- android:priority="600" />
+ android:icon="@drawable/perm_group_microphone"
+ android:label="@string/permgrouplab_microphone"
+ android:description="@string/permgroupdesc_microphone"
+ android:priority="600" />
<!-- Allows an application to record audio.
<p>Protection level: dangerous
-->
<permission android:name="android.permission.RECORD_AUDIO"
- android:permissionGroup="android.permission-group.MICROPHONE"
- android:label="@string/permlab_recordAudio"
- android:description="@string/permdesc_recordAudio"
- android:protectionLevel="dangerous"/>
+ android:permissionGroup="android.permission-group.MICROPHONE"
+ android:label="@string/permlab_recordAudio"
+ android:description="@string/permdesc_recordAudio"
+ android:protectionLevel="dangerous"/>
<!-- ====================================================================== -->
<!-- Permissions for accessing the device camera -->
@@ -700,25 +830,25 @@
<!-- Used for permissions that are associated with accessing
camera or capturing images/video from the device. -->
<permission-group android:name="android.permission-group.CAMERA"
- android:icon="@drawable/perm_group_camera"
- android:label="@string/permgrouplab_camera"
- android:description="@string/permgroupdesc_camera"
- android:priority="700" />
+ android:icon="@drawable/perm_group_camera"
+ android:label="@string/permgrouplab_camera"
+ android:description="@string/permgroupdesc_camera"
+ android:priority="700" />
<!-- Required to be able to access the camera device.
<p>This will automatically enforce the <a
- href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code
- <uses-feature>}</a> manifest element for <em>all</em> camera features.
+ href="{@docRoot}guide/topics/manifest/uses-feature-element.html">
+ <uses-feature>}</a> manifest element for <em>all</em> camera features.
If you do not require all camera features or can properly operate if a camera
is not available, then you must modify your manifest as appropriate in order to
install on devices that don't support all camera features.</p>
<p>Protection level: dangerous
-->
<permission android:name="android.permission.CAMERA"
- android:permissionGroup="android.permission-group.CAMERA"
- android:label="@string/permlab_camera"
- android:description="@string/permdesc_camera"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.CAMERA"
+ android:label="@string/permlab_camera"
+ android:description="@string/permdesc_camera"
+ android:protectionLevel="dangerous" />
<!-- ====================================================================== -->
@@ -729,28 +859,28 @@
<!-- Used for permissions that are associated with accessing
camera or capturing images/video from the device. -->
<permission-group android:name="android.permission-group.SENSORS"
- android:icon="@drawable/perm_group_sensors"
- android:label="@string/permgrouplab_sensors"
- android:description="@string/permgroupdesc_sensors"
- android:priority="800" />
+ android:icon="@drawable/perm_group_sensors"
+ android:label="@string/permgrouplab_sensors"
+ android:description="@string/permgroupdesc_sensors"
+ android:priority="800" />
<!-- Allows an application to access data from sensors that the user uses to
measure what is happening inside his/her body, such as heart rate.
<p>Protection level: dangerous -->
<permission android:name="android.permission.BODY_SENSORS"
- android:permissionGroup="android.permission-group.SENSORS"
- android:label="@string/permlab_bodySensors"
- android:description="@string/permdesc_bodySensors"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.SENSORS"
+ android:label="@string/permlab_bodySensors"
+ android:description="@string/permdesc_bodySensors"
+ android:protectionLevel="dangerous" />
<!-- Allows an app to use fingerprint hardware.
<p>Protection level: normal
-->
<permission android:name="android.permission.USE_FINGERPRINT"
- android:permissionGroup="android.permission-group.SENSORS"
- android:label="@string/permlab_useFingerprint"
- android:description="@string/permdesc_useFingerprint"
- android:protectionLevel="normal" />
+ android:permissionGroup="android.permission-group.SENSORS"
+ android:label="@string/permlab_useFingerprint"
+ android:description="@string/permdesc_useFingerprint"
+ android:protectionLevel="normal" />
<!-- ====================================================================== -->
<!-- REMOVED PERMISSIONS -->
@@ -758,78 +888,93 @@
<!-- @hide We need to keep this around for backwards compatibility -->
<permission android:name="android.permission.READ_PROFILE"
- android:protectionLevel="normal"
- android:permissionFlags="hidden"/>
+ android:protectionLevel="normal"
+ android:permissionFlags="removed"/>
<!-- @hide We need to keep this around for backwards compatibility -->
<permission android:name="android.permission.WRITE_PROFILE"
- android:protectionLevel="normal"
- android:permissionFlags="hidden"/>
+ android:protectionLevel="normal"
+ android:permissionFlags="removed"/>
<!-- @hide We need to keep this around for backwards compatibility -->
<permission android:name="android.permission.READ_SOCIAL_STREAM"
- android:protectionLevel="normal"
- android:permissionFlags="hidden"/>
+ android:protectionLevel="normal"
+ android:permissionFlags="removed"/>
<!-- @hide We need to keep this around for backwards compatibility -->
<permission android:name="android.permission.WRITE_SOCIAL_STREAM"
- android:protectionLevel="normal"
- android:permissionFlags="hidden"/>
+ android:protectionLevel="normal"
+ android:permissionFlags="removed"/>
<!-- @hide We need to keep this around for backwards compatibility -->
<permission android:name="android.permission.READ_USER_DICTIONARY"
- android:protectionLevel="normal"
- android:permissionFlags="hidden"/>
+ android:protectionLevel="normal"
+ android:permissionFlags="removed"/>
<!-- @hide We need to keep this around for backwards compatibility -->
<permission android:name="android.permission.WRITE_USER_DICTIONARY"
- android:protectionLevel="normal"
- android:permissionFlags="hidden"/>
+ android:protectionLevel="normal"
+ android:permissionFlags="removed"/>
<!-- @hide We need to keep this around for backwards compatibility -->
<permission android:name="android.permission.WRITE_SMS"
- android:protectionLevel="normal"
- android:permissionFlags="hidden"/>
+ android:protectionLevel="normal"
+ android:permissionFlags="removed"/>
<!-- @hide We need to keep this around for backwards compatibility -->
<permission android:name="com.android.browser.permission.READ_HISTORY_BOOKMARKS"
- android:protectionLevel="normal"
- android:permissionFlags="hidden"/>
+ android:protectionLevel="normal"
+ android:permissionFlags="removed"/>
<!-- @hide We need to keep this around for backwards compatibility -->
<permission android:name="com.android.browser.permission.WRITE_HISTORY_BOOKMARKS"
- android:protectionLevel="normal"
- android:permissionFlags="hidden"/>
+ android:protectionLevel="normal"
+ android:permissionFlags="removed"/>
<!-- @hide We need to keep this around for backwards compatibility -->
<permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"
- android:protectionLevel="normal"
- android:permissionFlags="hidden"/>
+ android:protectionLevel="normal"
+ android:permissionFlags="removed"/>
<!-- @hide We need to keep this around for backwards compatibility -->
<permission android:name="android.permission.MANAGE_ACCOUNTS"
- android:protectionLevel="normal"
- android:permissionFlags="hidden"/>
+ android:protectionLevel="normal"
+ android:permissionFlags="removed"/>
<!-- @hide We need to keep this around for backwards compatibility -->
<permission android:name="android.permission.USE_CREDENTIALS"
- android:protectionLevel="normal"
- android:permissionFlags="hidden"/>
+ android:protectionLevel="normal"
+ android:permissionFlags="removed"/>
<!-- @hide We need to keep this around for backwards compatibility -->
<permission android:name="android.permission.SUBSCRIBED_FEEDS_READ"
- android:protectionLevel="normal"
- android:permissionFlags="hidden"/>
+ android:protectionLevel="normal"
+ android:permissionFlags="removed"/>
<!-- @hide We need to keep this around for backwards compatibility -->
<permission android:name="android.permission.SUBSCRIBED_FEEDS_WRITE"
- android:protectionLevel="normal"
- android:permissionFlags="hidden"/>
+ android:protectionLevel="normal"
+ android:permissionFlags="removed"/>
+
+ <!-- @hide We need to keep this around for backwards compatibility -->
+ <permission android:name="android.permission.FLASHLIGHT"
+ android:protectionLevel="normal"
+ android:permissionFlags="removed"/>
<!-- ====================================================================== -->
<!-- INSTALL PERMISSIONS -->
<!-- ====================================================================== -->
+ ` <!-- =========================================== -->
+ <!-- Permissions for accessing contact metadata -->
+ <!-- =========================================== -->
+ <eat-comment />
+
+ <!-- @SystemApi Allows an application to read/write contact metadata.
+ <p>Not for use by third-party applications. -->
+ <permission android:name="android.permission.READ_WRITE_CONTACT_METADATA"
+ android:protectionLevel="signature|system" />
+
<!-- ================================== -->
<!-- Permissions for accessing messages -->
<!-- ================================== -->
@@ -839,31 +984,35 @@
to handle the respond-via-message action during incoming calls.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.SEND_RESPOND_VIA_MESSAGE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows an application to filter carrier specific sms.
@hide -->
<permission android:name="android.permission.CARRIER_FILTER_SMS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to receive emergency cell broadcast messages,
to record or display them to the user.
- <p>Not for use by third-party applications.
- @hide Pending API council approval -->
+ <p>Not for use by third-party applications. -->
<permission android:name="android.permission.RECEIVE_EMERGENCY_BROADCAST"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows an application to monitor incoming Bluetooth MAP messages, to record
or perform processing on them. -->
<!-- @hide -->
<permission android:name="android.permission.RECEIVE_BLUETOOTH_MAP"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi @hide Allows an application to execute contacts directory search.
This should only be used by ContactsProvider.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.BIND_DIRECTORY_SEARCH"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
+
+ <!-- @SystemApi @hide Allows an application to modify cell broadcasts through the content provider.
+ <p>Not for use by third-party applications. -->
+ <permission android:name="android.permission.MODIFY_CELL_BROADCASTS"
+ android:protectionLevel="signature|privileged" />
<!-- =============================================================== -->
<!-- Permissions for setting the device alarm -->
@@ -874,9 +1023,9 @@
<p>Protection level: normal
-->
<permission android:name="com.android.alarm.permission.SET_ALARM"
- android:label="@string/permlab_setAlarm"
- android:description="@string/permdesc_setAlarm"
- android:protectionLevel="normal" />
+ android:label="@string/permlab_setAlarm"
+ android:description="@string/permdesc_setAlarm"
+ android:protectionLevel="normal" />
<!-- =============================================================== -->
<!-- Permissions for accessing the user voicemail -->
@@ -884,16 +1033,16 @@
<eat-comment />
<!-- Allows an application to modify and remove existing voicemails in the system
- <p>Protection level: system|signature
+ <p>Protection level: signature|privileged
-->
<permission android:name="com.android.voicemail.permission.WRITE_VOICEMAIL"
- android:protectionLevel="system|signature" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows an application to read voicemails in the system.
- <p>Protection level: system|signature
+ <p>Protection level: signature|privileged
-->
<permission android:name="com.android.voicemail.permission.READ_VOICEMAIL"
- android:protectionLevel="system|signature" />
+ android:protectionLevel="signature|privileged" />
<!-- ======================================= -->
<!-- Permissions for accessing location info -->
@@ -904,26 +1053,26 @@
<p>Protection level: normal
-->
<permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"
- android:label="@string/permlab_accessLocationExtraCommands"
- android:description="@string/permdesc_accessLocationExtraCommands"
- android:protectionLevel="normal" />
+ android:label="@string/permlab_accessLocationExtraCommands"
+ android:description="@string/permdesc_accessLocationExtraCommands"
+ android:protectionLevel="normal" />
<!-- @SystemApi Allows an application to install a location provider into the Location Manager.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.INSTALL_LOCATION_PROVIDER"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi @hide Allows HDMI-CEC service to access device and configuration files.
This should only be used by HDMI-CEC service.
-->
<permission android:name="android.permission.HDMI_CEC"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to use location features in hardware,
such as the geofencing api.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.LOCATION_HARDWARE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<uses-permission android:name="android.permission.LOCATION_HARDWARE"/>
<!-- @SystemApi Allows an application to create mock location providers for testing.
@@ -931,7 +1080,7 @@
@hide
-->
<permission android:name="android.permission.ACCESS_MOCK_LOCATION"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- ======================================= -->
<!-- Permissions for accessing networks -->
@@ -942,67 +1091,73 @@
<p>Protection level: normal
-->
<permission android:name="android.permission.INTERNET"
- android:description="@string/permdesc_createNetworkSockets"
- android:label="@string/permlab_createNetworkSockets"
- android:protectionLevel="normal" />
+ android:description="@string/permdesc_createNetworkSockets"
+ android:label="@string/permlab_createNetworkSockets"
+ android:protectionLevel="normal" />
<!-- Allows applications to access information about networks
<p>Protection level: normal
-->
<permission android:name="android.permission.ACCESS_NETWORK_STATE"
- android:description="@string/permdesc_accessNetworkState"
- android:label="@string/permlab_accessNetworkState"
- android:protectionLevel="normal" />
+ android:description="@string/permdesc_accessNetworkState"
+ android:label="@string/permlab_accessNetworkState"
+ android:protectionLevel="normal" />
<!-- Allows applications to access information about Wi-Fi networks.
<p>Protection level: normal
-->
<permission android:name="android.permission.ACCESS_WIFI_STATE"
- android:description="@string/permdesc_accessWifiState"
- android:label="@string/permlab_accessWifiState"
- android:protectionLevel="normal" />
+ android:description="@string/permdesc_accessWifiState"
+ android:label="@string/permlab_accessWifiState"
+ android:protectionLevel="normal" />
<!-- Allows applications to change Wi-Fi connectivity state.
<p>Protection level: normal
-->
<permission android:name="android.permission.CHANGE_WIFI_STATE"
- android:description="@string/permdesc_changeWifiState"
- android:label="@string/permlab_changeWifiState"
- android:protectionLevel="normal" />
+ android:description="@string/permdesc_changeWifiState"
+ android:label="@string/permlab_changeWifiState"
+ android:protectionLevel="normal" />
<!-- @SystemApi @hide Allows applications to read Wi-Fi credential.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.READ_WIFI_CREDENTIAL"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
+
+ <!-- @SystemApi @hide Allows applications to change tether state and run
+ tether carrier provisioning.
+ <p>Not for use by third-party applications. -->
+ <permission android:name="android.permission.TETHER_PRIVILEGED"
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi @hide Allow system apps to receive broadcast
when a wifi network credential is changed.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.RECEIVE_WIFI_CREDENTIAL_CHANGE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi @hide Allows an application to modify any wifi configuration, even if created
by another application. Once reconfigured the original creator cannot make any further
modifications.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.OVERRIDE_WIFI_CONFIG"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @hide -->
<permission android:name="android.permission.ACCESS_WIMAX_STATE"
- android:description="@string/permdesc_accessWimaxState"
- android:label="@string/permlab_accessWimaxState"
- android:protectionLevel="normal" />
+ android:description="@string/permdesc_accessWimaxState"
+ android:label="@string/permlab_accessWimaxState"
+ android:protectionLevel="normal" />
<!-- @hide -->
<permission android:name="android.permission.CHANGE_WIMAX_STATE"
- android:description="@string/permdesc_changeWimaxState"
- android:label="@string/permlab_changeWimaxState"
- android:protectionLevel="normal" />
+ android:description="@string/permdesc_changeWimaxState"
+ android:label="@string/permlab_changeWimaxState"
+ android:protectionLevel="normal" />
<!-- Allows applications to act as network scorers. @hide @SystemApi-->
<permission android:name="android.permission.SCORE_NETWORKS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- ======================================= -->
<!-- Permissions for short range, peripheral networks -->
@@ -1013,68 +1168,68 @@
<p>Protection level: normal
-->
<permission android:name="android.permission.BLUETOOTH"
- android:description="@string/permdesc_bluetooth"
- android:label="@string/permlab_bluetooth"
- android:protectionLevel="normal" />
+ android:description="@string/permdesc_bluetooth"
+ android:label="@string/permlab_bluetooth"
+ android:protectionLevel="normal" />
<!-- Allows applications to discover and pair bluetooth devices.
<p>Protection level: normal
-->
<permission android:name="android.permission.BLUETOOTH_ADMIN"
- android:description="@string/permdesc_bluetoothAdmin"
- android:label="@string/permlab_bluetoothAdmin"
- android:protectionLevel="normal" />
+ android:description="@string/permdesc_bluetoothAdmin"
+ android:label="@string/permlab_bluetoothAdmin"
+ android:protectionLevel="normal" />
<!-- @SystemApi Allows applications to pair bluetooth devices without user interaction, and to
allow or disallow phonebook access or message access.
This is not available to third party applications. -->
<permission android:name="android.permission.BLUETOOTH_PRIVILEGED"
- android:protectionLevel="system|signature" />
+ android:protectionLevel="signature|privileged" />
<!-- Control access to email providers exclusively for Bluetooth
@hide
-->
<permission android:name="android.permission.BLUETOOTH_MAP"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows bluetooth stack to access files
@hide This should only be used by Bluetooth apk.
-->
<permission android:name="android.permission.BLUETOOTH_STACK"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows applications to perform I/O operations over NFC.
<p>Protection level: normal
-->
<permission android:name="android.permission.NFC"
- android:description="@string/permdesc_nfc"
- android:label="@string/permlab_nfc"
- android:protectionLevel="normal" />
+ android:description="@string/permdesc_nfc"
+ android:label="@string/permlab_nfc"
+ android:protectionLevel="normal" />
<!-- @SystemApi Allows an internal user to use privileged ConnectivityManager APIs.
@hide -->
<permission android:name="android.permission.CONNECTIVITY_INTERNAL"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows a system application to access hardware packet offload capabilities.
@hide -->
<permission android:name="android.permission.PACKET_KEEPALIVE_OFFLOAD"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi
@hide -->
<permission android:name="android.permission.RECEIVE_DATA_ACTIVITY_CHANGE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows access to the loop radio (Android@Home mesh network) device.
@hide -->
<permission android:name="android.permission.LOOP_RADIO"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows sending and receiving handover transfer status from Wifi and Bluetooth
@hide -->
<permission android:name="android.permission.NFC_HANDOVER_STATUS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- ================================== -->
<!-- Permissions for accessing accounts -->
@@ -1085,15 +1240,15 @@
<p>Protection level: normal
-->
<permission android:name="android.permission.GET_ACCOUNTS"
- android:permissionGroup="android.permission-group.CONTACTS"
- android:protectionLevel="dangerous"
- android:description="@string/permdesc_getAccounts"
- android:label="@string/permlab_getAccounts" />
+ android:permissionGroup="android.permission-group.CONTACTS"
+ android:protectionLevel="dangerous"
+ android:description="@string/permdesc_getAccounts"
+ android:label="@string/permlab_getAccounts" />
<!-- @SystemApi Allows applications to call into AccountAuthenticators.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.ACCOUNT_MANAGER"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- ================================== -->
<!-- Permissions for accessing hardware that may effect battery life-->
@@ -1104,42 +1259,34 @@
<p>Protection level: normal
-->
<permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"
- android:description="@string/permdesc_changeWifiMulticastState"
- android:label="@string/permlab_changeWifiMulticastState"
- android:protectionLevel="normal" />
+ android:description="@string/permdesc_changeWifiMulticastState"
+ android:label="@string/permlab_changeWifiMulticastState"
+ android:protectionLevel="normal" />
<!-- Allows access to the vibrator.
<p>Protection level: normal
-->
<permission android:name="android.permission.VIBRATE"
- android:label="@string/permlab_vibrate"
- android:description="@string/permdesc_vibrate"
- android:protectionLevel="normal" />
-
- <!-- Allows access to the flashlight.
- <p>Protection level: normal
- -->
- <permission android:name="android.permission.FLASHLIGHT"
- android:label="@string/permlab_flashlight"
- android:description="@string/permdesc_flashlight"
- android:protectionLevel="normal" />
+ android:label="@string/permlab_vibrate"
+ android:description="@string/permdesc_vibrate"
+ android:protectionLevel="normal" />
<!-- Allows using PowerManager WakeLocks to keep processor from sleeping or screen
from dimming.
<p>Protection level: normal
-->
<permission android:name="android.permission.WAKE_LOCK"
- android:label="@string/permlab_wakeLock"
- android:description="@string/permdesc_wakeLock"
- android:protectionLevel="normal" />
+ android:label="@string/permlab_wakeLock"
+ android:description="@string/permdesc_wakeLock"
+ android:protectionLevel="normal" />
<!-- Allows using the device's IR transmitter, if available.
<p>Protection level: normal
-->
<permission android:name="android.permission.TRANSMIT_IR"
- android:label="@string/permlab_transmitIr"
- android:description="@string/permdesc_transmitIr"
- android:protectionLevel="normal" />
+ android:label="@string/permlab_transmitIr"
+ android:description="@string/permdesc_transmitIr"
+ android:protectionLevel="normal" />
<!-- ==================================================== -->
<!-- Permissions related to changing audio settings -->
@@ -1150,9 +1297,9 @@
<p>Protection level: normal
-->
<permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"
- android:label="@string/permlab_modifyAudioSettings"
- android:description="@string/permdesc_modifyAudioSettings"
- android:protectionLevel="normal" />
+ android:label="@string/permlab_modifyAudioSettings"
+ android:description="@string/permdesc_modifyAudioSettings"
+ android:protectionLevel="normal" />
<!-- ================================== -->
<!-- Permissions for accessing hardware -->
@@ -1162,68 +1309,68 @@
<!-- @SystemApi Allows an application to manage preferences and permissions for USB devices
@hide -->
<permission android:name="android.permission.MANAGE_USB"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to access the MTP USB kernel driver.
For use only by the device side MTP implementation.
@hide -->
<permission android:name="android.permission.ACCESS_MTP"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows access to hardware peripherals. Intended only for hardware testing.
<p>Not for use by third-party applications.
@hide
-->
<permission android:name="android.permission.HARDWARE_TEST"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows access to FM
@hide This is not a third-party API (intended for system apps).-->
<permission android:name="android.permission.ACCESS_FM_RADIO"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows access to configure network interfaces, configure/use IPSec, etc.
@hide -->
<permission android:name="android.permission.NET_ADMIN"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows registration for remote audio playback. @hide -->
<permission android:name="android.permission.REMOTE_AUDIO_PLAYBACK"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows TvInputService to access underlying TV input hardware such as
built-in tuners and HDMI-in's.
@hide This should only be used by OEM's TvInputService's.
-->
<permission android:name="android.permission.TV_INPUT_HARDWARE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows to capture a frame of TV input hardware such as
built-in tuners and HDMI-in's.
@hide <p>Not for use by third-party applications.
-->
<permission android:name="android.permission.CAPTURE_TV_INPUT"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @hide Allows TvInputService to access DVB device.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.DVB_DEVICE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @hide Allows enabling/disabling OEM unlock
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.OEM_UNLOCK_STATE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @hide Allows querying state of PersistentDataBlock
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.ACCESS_PDB_STATE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @hide Allows system update service to notify device owner about pending updates.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.NOTIFY_PENDING_SYSTEM_UPDATE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- =========================================== -->
<!-- Permissions associated with camera and image capture -->
@@ -1234,12 +1381,12 @@
a camera is in use by an application.
@hide -->
<permission android:name="android.permission.CAMERA_DISABLE_TRANSMIT_LED"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows sending the camera service notifications about system-wide events.
@hide -->
<permission android:name="android.permission.CAMERA_SEND_SYSTEM_EVENTS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- =========================================== -->
<!-- Permissions associated with telephony state -->
@@ -1250,43 +1397,50 @@
Does not include placing calls.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.MODIFY_PHONE_STATE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows read only access to precise phone state.
@hide Pending API council approval -->
<permission android:name="android.permission.READ_PRECISE_PHONE_STATE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows read access to privileged phone state.
@hide Used internally. -->
<permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Protects the ability to register any PhoneAccount with
PhoneAccount#CAPABILITY_SIM_SUBSCRIPTION. This capability indicates that the PhoneAccount
corresponds to a device SIM.
@hide -->
<permission android:name="android.permission.REGISTER_SIM_SUBSCRIPTION"
- android:protectionLevel="system|signature" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Protects the ability to register any PhoneAccount with
PhoneAccount#CAPABILITY_CALL_PROVIDER.
@hide -->
<permission android:name="android.permission.REGISTER_CALL_PROVIDER"
- android:protectionLevel="system|signature" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Protects the ability to register any PhoneAccount with
PhoneAccount#CAPABILITY_CONNECTION_MANAGER
@hide -->
<permission android:name="android.permission.REGISTER_CONNECTION_MANAGER"
- android:protectionLevel="system|signature" />
+ android:protectionLevel="signature|privileged" />
<!-- Must be required by a {@link android.telecom.InCallService},
to ensure that only the system can bind to it.
- <p>Protection level: system|signature
+ <p>Protection level: signature|privileged
-->
<permission android:name="android.permission.BIND_INCALL_SERVICE"
- android:protectionLevel="system|signature" />
+ android:protectionLevel="signature|privileged" />
+
+ <!-- Must be required by a {@link android.telecom.CallScreeningService},
+ to ensure that only the system can bind to it.
+ <p>Protection level: signature|privileged
+ -->
+ <permission android:name="android.permission.BIND_SCREENING_SERVICE"
+ android:protectionLevel="signature|privileged" />
<!-- Must be required by a {@link android.telecom.ConnectionService},
to ensure that only the system can bind to it.
@@ -1295,24 +1449,24 @@
@SystemApi
@hide -->
<permission android:name="android.permission.BIND_CONNECTION_SERVICE"
- android:protectionLevel="system|signature" />
+ android:protectionLevel="signature|privileged" />
<!-- Must be required by a {@link android.telecom.ConnectionService},
to ensure that only the system can bind to it.
- <p>Protection level: system|signature
+ <p>Protection level: signature|privileged
-->
<permission android:name="android.permission.BIND_TELECOM_CONNECTION_SERVICE"
- android:protectionLevel="system|signature" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to control the in-call experience.
@hide -->
<permission android:name="android.permission.CONTROL_INCALL_EXPERIENCE"
- android:protectionLevel="system|signature" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows an application to receive STK related commands.
@hide -->
<permission android:name="android.permission.RECEIVE_STK_COMMANDS"
- android:protectionLevel="system|signature" />
+ android:protectionLevel="signature|privileged" />
<!-- ================================== -->
<!-- Permissions for sdcard interaction -->
@@ -1322,14 +1476,14 @@
<!-- @SystemApi Allows an application to write to internal media storage
@hide -->
<permission android:name="android.permission.WRITE_MEDIA_STORAGE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows an application to manage access to documents, usually as part
of a document picker.
<p>Protection level: signature
-->
<permission android:name="android.permission.MANAGE_DOCUMENTS"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- ================================== -->
<!-- Permissions for screenlock -->
@@ -1340,9 +1494,9 @@
<p>Protection level: normal
-->
<permission android:name="android.permission.DISABLE_KEYGUARD"
- android:description="@string/permdesc_disableKeyguard"
- android:label="@string/permlab_disableKeyguard"
- android:protectionLevel="normal" />
+ android:description="@string/permdesc_disableKeyguard"
+ android:label="@string/permlab_disableKeyguard"
+ android:protectionLevel="normal" />
<!-- ================================== -->
<!-- Permissions to access other installed applications -->
@@ -1351,9 +1505,9 @@
<!-- @deprecated No longer enforced. -->
<permission android:name="android.permission.GET_TASKS"
- android:label="@string/permlab_getTasks"
- android:description="@string/permdesc_getTasks"
- android:protectionLevel="normal" />
+ android:label="@string/permlab_getTasks"
+ android:description="@string/permdesc_getTasks"
+ android:protectionLevel="normal" />
<!-- New version of GET_TASKS that apps can request, since GET_TASKS doesn't really
give access to task information. We need this new one because there are
@@ -1366,87 +1520,93 @@
@hide
@SystemApi -->
<permission android:name="android.permission.REAL_GET_TASKS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows an application to start a task from a ActivityManager#RecentTaskInfo.
@hide -->
<permission android:name="android.permission.START_TASKS_FROM_RECENTS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi @hide Allows an application to call APIs that allow it to do interactions
across the users on the device, using singleton services and
user-targeted broadcasts. This permission is not available to
third party applications. -->
<permission android:name="android.permission.INTERACT_ACROSS_USERS"
- android:protectionLevel="signature|privileged|development" />
+ android:protectionLevel="signature|privileged|development" />
<!-- @hide Fuller form of {@link android.Manifest.permission#INTERACT_ACROSS_USERS}
that removes restrictions on where broadcasts can be sent and allows other
types of interactions. -->
<permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL"
- android:protectionLevel="signature|installer" />
+ android:protectionLevel="signature|installer" />
<!-- @SystemApi @hide Allows an application to call APIs that allow it to query and manage
users on the device. This permission is not available to
third party applications. -->
<permission android:name="android.permission.MANAGE_USERS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @hide Allows an application to set the profile owners and the device owner.
This permission is not available to third party applications.-->
<permission android:name="android.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS"
- android:protectionLevel="signature"
- android:label="@string/permlab_manageProfileAndDeviceOwners"
- android:description="@string/permdesc_manageProfileAndDeviceOwners" />
+ android:protectionLevel="signature"
+ android:label="@string/permlab_manageProfileAndDeviceOwners"
+ android:description="@string/permdesc_manageProfileAndDeviceOwners" />
<!-- Allows an application to get full detailed information about
recently running tasks, with full fidelity to the real state.
@hide -->
<permission android:name="android.permission.GET_DETAILED_TASKS"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows an application to change the Z-order of tasks.
<p>Protection level: normal
-->
<permission android:name="android.permission.REORDER_TASKS"
- android:label="@string/permlab_reorderTasks"
- android:description="@string/permdesc_reorderTasks"
- android:protectionLevel="normal" />
+ android:label="@string/permlab_reorderTasks"
+ android:description="@string/permdesc_reorderTasks"
+ android:protectionLevel="normal" />
<!-- @hide Allows an application to change to remove/kill tasks -->
<permission android:name="android.permission.REMOVE_TASKS"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi @hide Allows an application to create/manage/remove stacks -->
<permission android:name="android.permission.MANAGE_ACTIVITY_STACKS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows an application to start any activity, regardless of permission
protection or exported state.
@hide -->
<permission android:name="android.permission.START_ANY_ACTIVITY"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @deprecated The {@link android.app.ActivityManager#restartPackage}
API is no longer supported. -->
<permission android:name="android.permission.RESTART_PACKAGES"
- android:label="@string/permlab_killBackgroundProcesses"
- android:description="@string/permdesc_killBackgroundProcesses"
- android:protectionLevel="normal" />
+ android:label="@string/permlab_killBackgroundProcesses"
+ android:description="@string/permdesc_killBackgroundProcesses"
+ android:protectionLevel="normal" />
<!-- Allows an application to call
{@link android.app.ActivityManager#killBackgroundProcesses}.
<p>Protection level: normal
-->
<permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"
- android:label="@string/permlab_killBackgroundProcesses"
- android:description="@string/permdesc_killBackgroundProcesses"
- android:protectionLevel="normal" />
+ android:label="@string/permlab_killBackgroundProcesses"
+ android:description="@string/permdesc_killBackgroundProcesses"
+ android:protectionLevel="normal" />
+
+ <!-- @SystemApi @hide Allows an application to query process states and current
+ OOM adjustment scores.
+ <p>Not for use by third-party applications. -->
+ <permission android:name="android.permission.GET_PROCESS_STATE_AND_OOM_SCORE"
+ android:protectionLevel="signature|privileged|development" />
<!-- @SystemApi @hide Allows an application to retrieve a package's importance.
This permission is not available to third party applications. -->
<permission android:name="android.permission.GET_PACKAGE_IMPORTANCE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- ================================== -->
<!-- Permissions affecting the display of other applications -->
@@ -1459,9 +1619,9 @@
should use this permission; these windows are intended for
system-level interaction with the user. -->
<permission android:name="android.permission.SYSTEM_ALERT_WINDOW"
- android:label="@string/permlab_systemAlertWindow"
- android:description="@string/permdesc_systemAlertWindow"
- android:protectionLevel="signature|preinstalled|appop|pre23|development" />
+ android:label="@string/permlab_systemAlertWindow"
+ android:description="@string/permdesc_systemAlertWindow"
+ android:protectionLevel="signature|preinstalled|appop|pre23|development" />
<!-- ================================== -->
<!-- Permissions affecting the system wallpaper -->
@@ -1472,17 +1632,17 @@
<p>Protection level: normal
-->
<permission android:name="android.permission.SET_WALLPAPER"
- android:label="@string/permlab_setWallpaper"
- android:description="@string/permdesc_setWallpaper"
- android:protectionLevel="normal" />
+ android:label="@string/permlab_setWallpaper"
+ android:description="@string/permdesc_setWallpaper"
+ android:protectionLevel="normal" />
<!-- Allows applications to set the wallpaper hints.
<p>Protection level: normal
-->
<permission android:name="android.permission.SET_WALLPAPER_HINTS"
- android:label="@string/permlab_setWallpaperHints"
- android:description="@string/permdesc_setWallpaperHints"
- android:protectionLevel="normal" />
+ android:label="@string/permlab_setWallpaperHints"
+ android:description="@string/permdesc_setWallpaperHints"
+ android:protectionLevel="normal" />
<!-- ============================================ -->
<!-- Permissions for changing the system clock -->
@@ -1492,15 +1652,15 @@
<!-- @SystemApi Allows applications to set the system time.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.SET_TIME"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows applications to set the system time zone.
<p>Protection level: normal
-->
<permission android:name="android.permission.SET_TIME_ZONE"
- android:label="@string/permlab_setTimeZone"
- android:description="@string/permdesc_setTimeZone"
- android:protectionLevel="normal" />
+ android:label="@string/permlab_setTimeZone"
+ android:description="@string/permdesc_setTimeZone"
+ android:protectionLevel="normal" />
<!-- ==================================================== -->
<!-- Permissions related to changing status bar -->
@@ -1511,9 +1671,9 @@
<p>Protection level: normal
-->
<permission android:name="android.permission.EXPAND_STATUS_BAR"
- android:label="@string/permlab_expandStatusBar"
- android:description="@string/permdesc_expandStatusBar"
- android:protectionLevel="normal" />
+ android:label="@string/permlab_expandStatusBar"
+ android:description="@string/permdesc_expandStatusBar"
+ android:protectionLevel="normal" />
<!-- ============================================================== -->
<!-- Permissions related to adding/removing shortcuts from Launcher -->
@@ -1524,17 +1684,17 @@
<p>Protection level: normal
-->
<permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"
- android:label="@string/permlab_install_shortcut"
- android:description="@string/permdesc_install_shortcut"
- android:protectionLevel="normal"/>
+ android:label="@string/permlab_install_shortcut"
+ android:description="@string/permdesc_install_shortcut"
+ android:protectionLevel="normal"/>
<!-- Allows an application to uninstall a shortcut in Launcher.
<p>Protection level: normal
-->
<permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT"
- android:label="@string/permlab_uninstall_shortcut"
- android:description="@string/permdesc_uninstall_shortcut"
- android:protectionLevel="normal"/>
+ android:label="@string/permlab_uninstall_shortcut"
+ android:description="@string/permdesc_uninstall_shortcut"
+ android:protectionLevel="normal"/>
<!-- ==================================================== -->
<!-- Permissions related to accessing sync settings -->
@@ -1545,25 +1705,25 @@
<p>Protection level: normal
-->
<permission android:name="android.permission.READ_SYNC_SETTINGS"
- android:description="@string/permdesc_readSyncSettings"
- android:label="@string/permlab_readSyncSettings"
- android:protectionLevel="normal" />
+ android:description="@string/permdesc_readSyncSettings"
+ android:label="@string/permlab_readSyncSettings"
+ android:protectionLevel="normal" />
<!-- Allows applications to write the sync settings.
<p>Protection level: normal
-->
<permission android:name="android.permission.WRITE_SYNC_SETTINGS"
- android:description="@string/permdesc_writeSyncSettings"
- android:label="@string/permlab_writeSyncSettings"
- android:protectionLevel="normal" />
+ android:description="@string/permdesc_writeSyncSettings"
+ android:label="@string/permlab_writeSyncSettings"
+ android:protectionLevel="normal" />
<!-- Allows applications to read the sync stats.
<p>Protection level: normal
-->
<permission android:name="android.permission.READ_SYNC_STATS"
- android:description="@string/permdesc_readSyncStats"
- android:label="@string/permlab_readSyncStats"
- android:protectionLevel="normal" />
+ android:description="@string/permdesc_readSyncStats"
+ android:label="@string/permlab_readSyncStats"
+ android:protectionLevel="normal" />
<!-- ============================================ -->
<!-- Permissions for low-level system interaction -->
@@ -1572,62 +1732,62 @@
<!-- @SystemApi @hide Change the screen compatibility mode of applications -->
<permission android:name="android.permission.SET_SCREEN_COMPATIBILITY"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to modify the current configuration, such
as locale. -->
<permission android:name="android.permission.CHANGE_CONFIGURATION"
- android:protectionLevel="signature|privileged|development" />
+ android:protectionLevel="signature|privileged|development" />
<!-- Allows an application to read or write the system settings.
<p>Protection level: signature
-->
<permission android:name="android.permission.WRITE_SETTINGS"
- android:label="@string/permlab_writeSettings"
- android:description="@string/permdesc_writeSettings"
- android:protectionLevel="signature|preinstalled|appop|pre23" />
+ android:label="@string/permlab_writeSettings"
+ android:description="@string/permdesc_writeSettings"
+ android:protectionLevel="signature|preinstalled|appop|pre23" />
<!-- @SystemApi Allows an application to modify the Google service map.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.WRITE_GSERVICES"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to call
{@link android.app.ActivityManager#forceStopPackage}.
@hide -->
<permission android:name="android.permission.FORCE_STOP_PACKAGES"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi @hide Allows an application to retrieve the content of the active window
An active window is the window that has fired an accessibility event. -->
<permission android:name="android.permission.RETRIEVE_WINDOW_CONTENT"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Modify the global animation scaling factor.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.SET_ANIMATION_SCALE"
- android:protectionLevel="signature|privileged|development" />
+ android:protectionLevel="signature|privileged|development" />
<!-- @deprecated This functionality will be removed in the future; please do
not use. Allow an application to make its activities persistent. -->
<permission android:name="android.permission.PERSISTENT_ACTIVITY"
- android:label="@string/permlab_persistentActivity"
- android:description="@string/permdesc_persistentActivity"
- android:protectionLevel="normal" />
+ android:label="@string/permlab_persistentActivity"
+ android:description="@string/permdesc_persistentActivity"
+ android:protectionLevel="normal" />
<!-- Allows an application to find out the space used by any package.
<p>Protection level: normal
-->
<permission android:name="android.permission.GET_PACKAGE_SIZE"
- android:label="@string/permlab_getPackageSize"
- android:description="@string/permdesc_getPackageSize"
- android:protectionLevel="normal" />
+ android:label="@string/permlab_getPackageSize"
+ android:description="@string/permdesc_getPackageSize"
+ android:protectionLevel="normal" />
<!-- @deprecated No longer useful, see
{@link android.content.pm.PackageManager#addPackageToPreferred}
for details. -->
<permission android:name="android.permission.SET_PREFERRED_APPLICATIONS"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows an application to receive the
{@link android.content.Intent#ACTION_BOOT_COMPLETED} that is
@@ -1643,9 +1803,9 @@
<p>Protection level: normal
-->
<permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"
- android:label="@string/permlab_receiveBootCompleted"
- android:description="@string/permdesc_receiveBootCompleted"
- android:protectionLevel="normal" />
+ android:label="@string/permlab_receiveBootCompleted"
+ android:description="@string/permdesc_receiveBootCompleted"
+ android:protectionLevel="normal" />
<!-- Allows an application to broadcast sticky intents. These are
broadcasts whose data is held by the system after being finished,
@@ -1654,86 +1814,90 @@
<p>Protection level: normal
-->
<permission android:name="android.permission.BROADCAST_STICKY"
- android:label="@string/permlab_broadcastSticky"
- android:description="@string/permdesc_broadcastSticky"
- android:protectionLevel="normal" />
+ android:label="@string/permlab_broadcastSticky"
+ android:description="@string/permdesc_broadcastSticky"
+ android:protectionLevel="normal" />
<!-- @SystemApi Allows mounting and unmounting file systems for removable storage.
<p>Not for use by third-party applications.-->
<permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
- android:protectionLevel="system|signature" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows formatting file systems for removable storage.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.MOUNT_FORMAT_FILESYSTEMS"
- android:protectionLevel="system|signature" />
+ android:protectionLevel="signature|privileged" />
+
+ <!-- @hide -->
+ <permission android:name="android.permission.STORAGE_INTERNAL"
+ android:protectionLevel="signature" />
<!-- Allows access to ASEC non-destructive API calls
@hide -->
<permission android:name="android.permission.ASEC_ACCESS"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows creation of ASEC volumes
@hide -->
<permission android:name="android.permission.ASEC_CREATE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows destruction of ASEC volumes
@hide -->
<permission android:name="android.permission.ASEC_DESTROY"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows mount / unmount of ASEC volumes
@hide -->
<permission android:name="android.permission.ASEC_MOUNT_UNMOUNT"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows rename of ASEC volumes
@hide -->
<permission android:name="android.permission.ASEC_RENAME"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows applications to write the apn settings.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.WRITE_APN_SETTINGS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows applications to change network connectivity state.
<p>Protection level: normal
-->
<permission android:name="android.permission.CHANGE_NETWORK_STATE"
- android:description="@string/permdesc_changeNetworkState"
- android:label="@string/permlab_changeNetworkState"
- android:protectionLevel="normal" />
+ android:description="@string/permdesc_changeNetworkState"
+ android:label="@string/permlab_changeNetworkState"
+ android:protectionLevel="normal" />
<!-- Allows an application to clear the caches of all installed
applications on the device.
<p>Protection level: system|signature
-->
<permission android:name="android.permission.CLEAR_APP_CACHE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to use any media decoder when decoding for playback
@hide -->
<permission android:name="android.permission.ALLOW_ANY_CODEC_FOR_PLAYBACK"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to install and/or uninstall CA certificates on
behalf of the user.
@hide -->
<permission android:name="android.permission.MANAGE_CA_CERTIFICATES"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to do certain operations needed for
interacting with the recovery (system update) system.
@hide -->
<permission android:name="android.permission.RECOVERY"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows the system to bind to an application's task services
@hide -->
<permission android:name="android.permission.BIND_JOB_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<uses-permission android:name="android.permission.BIND_JOB_SERVICE"/>
<!-- Allows an application to initiate configuration updates
@@ -1742,7 +1906,7 @@
it off to the various individual installer components
@hide -->
<permission android:name="android.permission.UPDATE_CONFIG"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- ========================================= -->
<!-- Permissions for special development tools -->
@@ -1752,40 +1916,40 @@
<!-- @SystemApi Allows an application to read or write the secure system settings.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.WRITE_SECURE_SETTINGS"
- android:protectionLevel="signature|privileged|development" />
+ android:protectionLevel="signature|privileged|development" />
<!-- @SystemApi Allows an application to retrieve state dump information from system services.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.DUMP"
- android:protectionLevel="signature|privileged|development" />
+ android:protectionLevel="signature|privileged|development" />
<!-- @SystemApi Allows an application to read the low-level system log files.
<p>Not for use by third-party applications, because
Log entries can contain the user's private information. -->
<permission android:name="android.permission.READ_LOGS"
- android:protectionLevel="signature|privileged|development" />
+ android:protectionLevel="signature|privileged|development" />
<!-- @SystemApi Configure an application for debugging.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.SET_DEBUG_APP"
- android:protectionLevel="signature|privileged|development" />
+ android:protectionLevel="signature|privileged|development" />
<!-- @SystemApi Allows an application to set the maximum number of (not needed)
application processes that can be running.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.SET_PROCESS_LIMIT"
- android:protectionLevel="signature|privileged|development" />
+ android:protectionLevel="signature|privileged|development" />
<!-- @SystemApi Allows an application to control whether activities are immediately
finished when put in the background.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.SET_ALWAYS_FINISH"
- android:protectionLevel="signature|privileged|development" />
+ android:protectionLevel="signature|privileged|development" />
<!-- @SystemApi Allow an application to request that a signal be sent to all persistent processes.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.SIGNAL_PERSISTENT_PROCESSES"
- android:protectionLevel="signature|privileged|development" />
+ android:protectionLevel="signature|privileged|development" />
<!-- ==================================== -->
<!-- Private permissions -->
@@ -1794,23 +1958,29 @@
<!-- @SystemApi Allows access to the list of accounts in the Accounts Service. -->
<permission android:name="android.permission.GET_ACCOUNTS_PRIVILEGED"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows applications to RW to diagnostic resources.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.DIAGNOSTIC"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to open, close, or disable the status bar
and its icons.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.STATUS_BAR"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows an application to be the status bar. Currently used only by SystemUI.apk
@hide -->
<permission android:name="android.permission.STATUS_BAR_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
+
+ <!-- Allows an application to bind to third party quick settings tiles.
+ <p>Should only be requested by the System, should be required by
+ TileService declarations.-->
+ <permission android:name="android.permission.BIND_QUICK_SETTINGS_TILE"
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to force a BACK operation on whatever is the
top activity.
@@ -1818,21 +1988,27 @@
@hide
-->
<permission android:name="android.permission.FORCE_BACK"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to update device statistics.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.UPDATE_DEVICE_STATS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi @hide Allows an application to collect battery statistics -->
<permission android:name="android.permission.GET_APP_OPS_STATS"
- android:protectionLevel="signature|privileged|development" />
+ android:protectionLevel="signature|privileged|development" />
<!-- @SystemApi Allows an application to update application operation statistics. Not for
use by third party apps. @hide -->
<permission android:name="android.permission.UPDATE_APP_OPS_STATS"
- android:protectionLevel="signature|privileged|installer" />
+ android:protectionLevel="signature|privileged|installer" />
+
+ <!-- Allows an application to update the user app op restrictions.
+ Not for use by third party apps.
+ @hide -->
+ <permission android:name="android.permission.MANAGE_APP_OPS_RESTRICTIONS"
+ android:protectionLevel="signature|installer" />
<!-- @SystemApi Allows an application to open windows that are for use by parts
of the system user interface.
@@ -1840,7 +2016,7 @@
@hide
-->
<permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to manage (create, destroy,
Z-order) application tokens in the window manager.
@@ -1848,12 +2024,17 @@
@hide
-->
<permission android:name="android.permission.MANAGE_APP_TOKENS"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
+
+ <!-- Allows System UI to register listeners for events from Window Manager.
+ @hide -->
+ <permission android:name="android.permission.REGISTER_WINDOW_MANAGER_LISTENERS"
+ android:protectionLevel="signature" />
<!-- @hide Allows the application to temporarily freeze the screen for a
full-screen transition. -->
<permission android:name="android.permission.FREEZE_SCREEN"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to inject user events (keys, touch, trackball)
into the event stream and deliver them to ANY window. Without this
@@ -1862,24 +2043,24 @@
@hide
-->
<permission android:name="android.permission.INJECT_EVENTS"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @hide Allows an application to register an input filter which filters the stream
of user events (keys, touch, trackball) before they are dispatched to any window. -->
<permission android:name="android.permission.FILTER_EVENTS"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @hide Allows an application to retrieve the window token from the accessibility manager. -->
<permission android:name="android.permission.RETRIEVE_WINDOW_TOKEN"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @hide Allows an application to collect frame statistics -->
<permission android:name="android.permission.FRAME_STATS"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @hide Allows an application to temporary enable accessibility on the device. -->
<permission android:name="android.permission.TEMPORARY_ENABLE_ACCESSIBILITY"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to watch and control how activities are
started globally in the system. Only for is in debugging
@@ -1888,13 +2069,13 @@
@hide
-->
<permission android:name="android.permission.SET_ACTIVITY_WATCHER"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to call the activity manager shutdown() API
to put the higher-level system there into a shutdown state.
@hide -->
<permission android:name="android.permission.SHUTDOWN"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to tell the activity manager to temporarily
stop application switches, putting it into a special mode that
@@ -1902,7 +2083,7 @@
critical UI such as the home screen.
@hide -->
<permission android:name="android.permission.STOP_APP_SWITCHES"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to retrieve private information about
the current top activity, such as any assist context it can provide.
@@ -1910,42 +2091,42 @@
@hide
-->
<permission android:name="android.permission.GET_TOP_ACTIVITY_INFO"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows an application to retrieve the current state of keys and
switches.
<p>Not for use by third-party applications.
@deprecated The API that used this permission has been removed. -->
<permission android:name="android.permission.READ_INPUT_STATE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Must be required by an {@link android.inputmethodservice.InputMethodService},
to ensure that only the system can bind to it.
<p>Protection level: signature
-->
<permission android:name="android.permission.BIND_INPUT_METHOD"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Must be required by an {@link android.media.midi.MidiDeviceService},
to ensure that only the system can bind to it.
<p>Protection level: signature
-->
<permission android:name="android.permission.BIND_MIDI_DEVICE_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Must be required by an {@link android.accessibilityservice.AccessibilityService},
to ensure that only the system can bind to it.
<p>Protection level: signature
-->
<permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Must be required by a {@link android.printservice.PrintService},
to ensure that only the system can bind to it.
<p>Protection level: signature
-->
<permission android:name="android.permission.BIND_PRINT_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Must be required by a {@link android.nfc.cardemulation.HostApduService}
or {@link android.nfc.cardemulation.OffHostApduService} to ensure that only
@@ -1953,84 +2134,84 @@
<p>Protection level: signature
-->
<permission android:name="android.permission.BIND_NFC_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Must be required by the PrintSpooler to ensure that only the system can bind to it.
@hide -->
<permission android:name="android.permission.BIND_PRINT_SPOOLER_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Must be required by a TextService (e.g. SpellCheckerService)
to ensure that only the system can bind to it.
<p>Protection level: signature
-->
<permission android:name="android.permission.BIND_TEXT_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Must be required by a {@link android.net.VpnService},
to ensure that only the system can bind to it.
<p>Protection level: signature
-->
<permission android:name="android.permission.BIND_VPN_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Must be required by a {@link android.service.wallpaper.WallpaperService},
to ensure that only the system can bind to it.
<p>Protection level: system|signature
-->
<permission android:name="android.permission.BIND_WALLPAPER"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Must be required by a {@link android.service.voice.VoiceInteractionService},
to ensure that only the system can bind to it.
<p>Protection level: signature
-->
<permission android:name="android.permission.BIND_VOICE_INTERACTION"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Must be required by hotword enrollment application,
to ensure that only the system can interact with it.
@hide <p>Not for use by third-party applications.</p> -->
<permission android:name="android.permission.MANAGE_VOICE_KEYPHRASES"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Must be required by a {@link com.android.media.remotedisplay.RemoteDisplayProvider},
to ensure that only the system can bind to it.
@hide -->
<permission android:name="android.permission.BIND_REMOTE_DISPLAY"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Must be required by a {@link android.media.tv.TvInputService}
to ensure that only the system can bind to it.
<p>Protection level: signature
-->
<permission android:name="android.permission.BIND_TV_INPUT"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to modify parental controls
<p>Not for use by third-party applications.
@hide -->
<permission android:name="android.permission.MODIFY_PARENTAL_CONTROLS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Must be required by a {@link android.media.routing.MediaRouteService}
to ensure that only the system can interact with it.
@hide -->
<permission android:name="android.permission.BIND_ROUTE_PROVIDER"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Must be required by device administration receiver, to ensure that only the
system can interact with it.
<p>Protection level: signature
-->
<permission android:name="android.permission.BIND_DEVICE_ADMIN"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Required to add or remove another application as a device admin.
<p>Not for use by third-party applications.
@hide -->
<permission android:name="android.permission.MANAGE_DEVICE_ADMINS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows low-level access to setting the orientation (actually
rotation) of the screen.
@@ -2038,33 +2219,33 @@
@hide
-->
<permission android:name="android.permission.SET_ORIENTATION"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows low-level access to setting the pointer speed.
<p>Not for use by third-party applications.
@hide
-->
<permission android:name="android.permission.SET_POINTER_SPEED"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows low-level access to setting input device calibration.
<p>Not for use by normal applications.
@hide -->
<permission android:name="android.permission.SET_INPUT_CALIBRATION"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows low-level access to setting the keyboard layout.
<p>Not for use by third-party applications.
@hide -->
<permission android:name="android.permission.SET_KEYBOARD_LAYOUT"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows an application to query tablet mode state and monitor changes
in it.
<p>Not for use by third-party applications.
@hide -->
<permission android:name="android.permission.TABLET_MODE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows an application to request installing packages. Apps
targeting APIs greater than 22 must hold this permission in
@@ -2072,277 +2253,292 @@
<p>Protection level: normal
-->
<permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"
- android:label="@string/permlab_requestInstallPackages"
- android:description="@string/permdesc_requestInstallPackages"
- android:protectionLevel="normal" />
+ android:label="@string/permlab_requestInstallPackages"
+ android:description="@string/permdesc_requestInstallPackages"
+ android:protectionLevel="normal" />
<!-- @SystemApi Allows an application to install packages.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.INSTALL_PACKAGES"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to clear user data.
<p>Not for use by third-party applications
@hide
-->
<permission android:name="android.permission.CLEAR_APP_USER_DATA"
- android:protectionLevel="signature|installer" />
+ android:protectionLevel="signature|installer" />
+
+ <!-- @hide Allows an application to get the URI permissions
+ granted to another application.
+ <p>Not for use by third-party applications
+ -->
+ <permission android:name="android.permission.GET_APP_GRANTED_URI_PERMISSIONS"
+ android:protectionLevel="signature" />
+
+ <!-- @hide Allows an application to clear the URI permissions
+ granted to another application.
+ <p>Not for use by third-party applications
+ -->
+ <permission
+ android:name="android.permission.CLEAR_APP_GRANTED_URI_PERMISSIONS"
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to delete cache files.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.DELETE_CACHE_FILES"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to delete packages.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.DELETE_PACKAGES"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to move location of installed package.
@hide -->
<permission android:name="android.permission.MOVE_PACKAGE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to change whether an application component (other than its own) is
enabled or not.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows an application to grant specific permissions.
@hide -->
<permission android:name="android.permission.GRANT_RUNTIME_PERMISSIONS"
- android:protectionLevel="signature|installer|verifier" />
+ android:protectionLevel="signature|installer|verifier" />
<!-- Allows an app that has this permission and the permissions to install packages
to request certain runtime permissions to be granted at installation.
@hide
@SystemApi -->
<permission android:name="android.permission.INSTALL_GRANT_RUNTIME_PERMISSIONS"
- android:protectionLevel="signature|installer|verifier" />
+ android:protectionLevel="signature|installer|verifier" />
<!-- Allows an application to revoke specific permissions.
@hide
@SystemApi -->
<permission android:name="android.permission.REVOKE_RUNTIME_PERMISSIONS"
- android:protectionLevel="signature|installer|verifier" />
+ android:protectionLevel="signature|installer|verifier" />
<!-- @hide Allows an application to observe permission changes. -->
<permission android:name="android.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to use SurfaceFlinger's low level features.
<p>Not for use by third-party applications.
@hide
-->
<permission android:name="android.permission.ACCESS_SURFACE_FLINGER"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to take screen shots and more generally
get access to the frame buffer data.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.READ_FRAME_BUFFER"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows an application to use InputFlinger's low level features.
@hide -->
<permission android:name="android.permission.ACCESS_INPUT_FLINGER"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows an application to configure and connect to Wifi displays
@hide -->
<permission android:name="android.permission.CONFIGURE_WIFI_DISPLAY"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows an application to control low-level features of Wifi displays
such as opening an RTSP socket. This permission should only be used
by the display manager.
@hide -->
<permission android:name="android.permission.CONTROL_WIFI_DISPLAY"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows an application to control the color transforms applied to
displays system-wide.
<p>Not for use by third-party applications.</p>
@hide -->
<permission android:name="android.permission.CONFIGURE_DISPLAY_COLOR_TRANSFORM"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to control VPN.
<p>Not for use by third-party applications.</p>
@hide -->
<permission android:name="android.permission.CONTROL_VPN"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<uses-permission android:name="android.permission.CONTROL_VPN" />
<!-- @SystemApi Allows an application to capture audio output.
<p>Not for use by third-party applications.</p> -->
<permission android:name="android.permission.CAPTURE_AUDIO_OUTPUT"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to capture audio for hotword detection.
<p>Not for use by third-party applications.</p>
@hide -->
<permission android:name="android.permission.CAPTURE_AUDIO_HOTWORD"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to modify audio routing and override policy decisions.
<p>Not for use by third-party applications.</p>
@hide -->
<permission android:name="android.permission.MODIFY_AUDIO_ROUTING"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to capture video output.
<p>Not for use by third-party applications.</p> -->
<permission android:name="android.permission.CAPTURE_VIDEO_OUTPUT"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to capture secure video output.
<p>Not for use by third-party applications.</p> -->
<permission android:name="android.permission.CAPTURE_SECURE_VIDEO_OUTPUT"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to know what content is playing and control its playback.
<p>Not for use by third-party applications due to privacy of media consumption</p> -->
<permission android:name="android.permission.MEDIA_CONTENT_CONTROL"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Required to be able to disable the device (very dangerous!).
<p>Not for use by third-party applications.
@hide
-->
<permission android:name="android.permission.BRICK"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Required to be able to reboot the device.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.REBOOT"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
- <!-- @SystemApi Allows low-level access to power management.
- <p>Not for use by third-party applications.
- @hide
- -->
- <permission android:name="android.permission.DEVICE_POWER"
- android:protectionLevel="signature" />
+ <!-- @SystemApi Allows low-level access to power management.
+ <p>Not for use by third-party applications.
+ @hide
+ -->
+ <permission android:name="android.permission.DEVICE_POWER"
+ android:protectionLevel="signature" />
- <!-- Allows access to the PowerManager.userActivity function.
- <p>Not for use by third-party applications. @hide @SystemApi -->
+ <!-- Allows access to the PowerManager.userActivity function.
+ <p>Not for use by third-party applications. @hide @SystemApi -->
<permission android:name="android.permission.USER_ACTIVITY"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
- <!-- @hide Allows low-level access to tun tap driver -->
+ <!-- @hide Allows low-level access to tun tap driver -->
<permission android:name="android.permission.NET_TUNNELING"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Run as a manufacturer test application, running as the root user.
Only available when the device is running in manufacturer test mode.
<p>Not for use by third-party applications.
-->
<permission android:name="android.permission.FACTORY_TEST"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows an application to broadcast a notification that an application
package has been removed.
<p>Not for use by third-party applications.
-->
<permission android:name="android.permission.BROADCAST_PACKAGE_REMOVED"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows an application to broadcast an SMS receipt notification.
<p>Not for use by third-party applications.
-->
<permission android:name="android.permission.BROADCAST_SMS"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows an application to broadcast a WAP PUSH receipt notification.
<p>Not for use by third-party applications.
-->
<permission android:name="android.permission.BROADCAST_WAP_PUSH"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to broadcast privileged networking requests.
<p>Not for use by third-party applications. @hide -->
<permission android:name="android.permission.BROADCAST_NETWORK_PRIVILEGED"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Not for use by third-party applications. -->
<permission android:name="android.permission.MASTER_CLEAR"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to call any phone number, including emergency
numbers, without going through the Dialer user interface for the user
to confirm the call being placed.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.CALL_PRIVILEGED"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to perform CDMA OTA provisioning @hide -->
<permission android:name="android.permission.PERFORM_CDMA_PROVISIONING"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to perform SIM Activation @hide -->
<permission android:name="android.permission.PERFORM_SIM_ACTIVATION"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows enabling/disabling location update notifications from
the radio.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.CONTROL_LOCATION_UPDATES"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows read/write access to the "properties" table in the checkin
database, to change values that get uploaded.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.ACCESS_CHECKIN_PROPERTIES"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to collect component usage
statistics
<p>Declaring the permission implies intention to use the API and the user of the
device can grant permission through the Settings application. -->
<permission android:name="android.permission.PACKAGE_USAGE_STATS"
- android:protectionLevel="signature|privileged|development|appop" />
+ android:protectionLevel="signature|privileged|development|appop" />
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
<!-- @hide Allows an application to change the app idle state of an app.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.CHANGE_APP_IDLE_STATE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @hide @SystemApi Allows an application to temporarily whitelist an inactive app to
access the network and acquire wakelocks.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST"
- android:protectionLevel="system|signature" />
+ android:protectionLevel="signature|privileged" />
<!-- Permission an application must hold in order to use
{@link android.provider.Settings#ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS}.
This is a normal permission: an app requesting it will always be granted the
permission, without the user needing to approve or see it. -->
<permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"
- android:protectionLevel="normal" />
+ android:protectionLevel="normal" />
<!-- @SystemApi Allows an application to collect battery statistics -->
<permission android:name="android.permission.BATTERY_STATS"
- android:protectionLevel="signature|privileged|development" />
+ android:protectionLevel="signature|privileged|development" />
<!-- @SystemApi Allows an application to control the backup and restore process.
<p>Not for use by third-party applications.
@hide pending API council -->
<permission android:name="android.permission.BACKUP"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows a package to launch the secure full-backup confirmation UI.
ONLY the system process may hold this permission.
@hide -->
<permission android:name="android.permission.CONFIRM_FULL_BACKUP"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Must be required by a {@link android.widget.RemoteViewsService},
to ensure that only the system can bind to it. -->
<permission android:name="android.permission.BIND_REMOTEVIEWS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to tell the AppWidget service which application
can access AppWidget's data. The normal user flow is that a user
@@ -2351,25 +2547,25 @@
An application that has this permission should honor that contract.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.BIND_APPWIDGET"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Private permission, to restrict who can bring up a dialog to add a new
keyguard widget
@hide -->
<permission android:name="android.permission.BIND_KEYGUARD_APPWIDGET"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Internal permission allowing an application to query/set which
applications can bind AppWidgets.
@hide -->
<permission android:name="android.permission.MODIFY_APPWIDGET_BIND_PERMISSIONS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows applications to change the background data setting.
<p>Not for use by third-party applications.
@hide pending API council -->
<permission android:name="android.permission.CHANGE_BACKGROUND_DATA_SETTING"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi This permission can be used on content providers to allow the global
search system to access their data. Typically it used when the
@@ -2380,7 +2576,7 @@
it is used by applications to protect themselves from everyone else
besides global search. -->
<permission android:name="android.permission.GLOBAL_SEARCH"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Internal permission protecting access to the global search
system: ensures that only the system can access the provider
@@ -2390,33 +2586,33 @@
ranking).
@hide -->
<permission android:name="android.permission.GLOBAL_SEARCH_CONTROL"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Internal permission to allows an application to read indexable data.
@hide -->
<permission android:name="android.permission.READ_SEARCH_INDEXABLES"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows applications to set a live wallpaper.
@hide XXX Change to signature once the picker is moved to its
own apk as Ghod Intended. -->
<permission android:name="android.permission.SET_WALLPAPER_COMPONENT"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows applications to read dream settings and dream state.
@hide -->
<permission android:name="android.permission.READ_DREAM_STATE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows applications to write dream settings, and start or stop dreaming.
@hide -->
<permission android:name="android.permission.WRITE_DREAM_STATE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allow an application to read and write the cache partition.
@hide -->
<permission android:name="android.permission.ACCESS_CACHE_FILESYSTEM"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Must be required by default container service so that only
the system can bind to it and use it to copy
@@ -2424,67 +2620,67 @@
accessible to the system.
@hide -->
<permission android:name="android.permission.COPY_PROTECTED_DATA"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Internal permission protecting access to the encryption methods
@hide
-->
<permission android:name="android.permission.CRYPT_KEEPER"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to read historical network usage for
specific networks and applications. @hide -->
<permission android:name="android.permission.READ_NETWORK_USAGE_HISTORY"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows an application to manage network policies (such as warning and disable
limits) and to define application-specific rules. @hide -->
<permission android:name="android.permission.MANAGE_NETWORK_POLICY"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to account its network traffic against other UIDs. Used
by system services like download manager and media server. Not for use by
third party apps. @hide -->
<permission android:name="android.permission.MODIFY_NETWORK_ACCOUNTING"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- C2DM permission.
@hide Used internally.
-->
<permission android:name="android.intent.category.MASTER_CLEAR.permission.C2D_MESSAGE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<uses-permission android:name="android.intent.category.MASTER_CLEAR.permission.C2D_MESSAGE"/>
<!-- @SystemApi @hide Package verifier needs to have this permission before the PackageManager will
trust it to verify packages.
-->
<permission android:name="android.permission.PACKAGE_VERIFICATION_AGENT"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Must be required by package verifier receiver, to ensure that only the
system can interact with it.
@hide
-->
<permission android:name="android.permission.BIND_PACKAGE_VERIFIER"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi @hide Intent filter verifier needs to have this permission before the
PackageManager will trust it to verify intent filters.
-->
<permission android:name="android.permission.INTENT_FILTER_VERIFICATION_AGENT"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Must be required by intent filter verifier receiver, to ensure that only the
system can interact with it.
@hide
-->
<permission android:name="android.permission.BIND_INTENT_FILTER_VERIFIER"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows applications to access serial ports via the SerialManager.
@hide -->
<permission android:name="android.permission.SERIAL_PORT"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows the holder to access content providers from outside an ApplicationThread.
This permission is enforced by the ActivityManagerService on the corresponding APIs,
@@ -2493,67 +2689,73 @@
@hide
-->
<permission android:name="android.permission.ACCESS_CONTENT_PROVIDERS_EXTERNALLY"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to hold an UpdateLock, recommending that a headless
OTA reboot *not* occur while the lock is held.
@hide -->
<permission android:name="android.permission.UPDATE_LOCK"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to read the current set of notifications, including
any metadata and intents attached.
@hide -->
<permission android:name="android.permission.ACCESS_NOTIFICATIONS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Marker permission for applications that wish to access notification policy.
<p>Protection level: normal
-->
<permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY"
- android:description="@string/permdesc_access_notification_policy"
- android:label="@string/permlab_access_notification_policy"
- android:protectionLevel="normal" />
+ android:description="@string/permdesc_access_notification_policy"
+ android:label="@string/permlab_access_notification_policy"
+ android:protectionLevel="normal" />
+
+ <!-- Allows modification of do not disturb rules and policies. Only allowed for system
+ processes.
+ @hide -->
+ <permission android:name="android.permission.MANAGE_NOTIFICATIONS"
+ android:protectionLevel="signature" />
<!-- Allows access to keyguard secure storage. Only allowed for system processes.
@hide -->
<permission android:name="android.permission.ACCESS_KEYGUARD_SECURE_STORAGE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows managing (adding, removing) fingerprint templates. Reserved for the system. @hide -->
<permission android:name="android.permission.MANAGE_FINGERPRINT"
- android:protectionLevel="system|signature" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows an app to reset fingerprint attempt counter. Reserved for the system. @hide -->
<permission android:name="android.permission.RESET_FINGERPRINT_LOCKOUT"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows an application to control keyguard. Only allowed for system processes.
@hide -->
<permission android:name="android.permission.CONTROL_KEYGUARD"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows an application to listen to trust changes. Only allowed for system processes.
@hide -->
<permission android:name="android.permission.TRUST_LISTENER"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to provide a trust agent.
@hide For security reasons, this is a platform-only permission. -->
<permission android:name="android.permission.PROVIDE_TRUST_AGENT"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows an application to launch the trust agent settings activity.
@hide -->
<permission android:name="android.permission.LAUNCH_TRUST_AGENT_SETTINGS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Must be required by an {@link
android.service.trust.TrustAgentService},
to ensure that only the system can bind to it.
@hide -->
<permission android:name="android.permission.BIND_TRUST_AGENT"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Must be required by an {@link
android.service.notification.NotificationListenerService},
@@ -2561,7 +2763,16 @@
<p>Protection level: signature
-->
<permission android:name="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
+
+ <!-- Must be required by an {@link
+ android.service.notification.NotificationAssistantService},
+ to ensure that only the system can bind to it.
+ <p>Protection level: signature
+ @hide This is not a third-party API (intended for system apps). -->
+ -->
+ <permission android:name="android.permission.BIND_NOTIFICATION_ASSISTANT_SERVICE"
+ android:protectionLevel="signature" />
<!-- Must be required by a {@link
android.service.chooser.ChooserTargetService}, to ensure that
@@ -2569,64 +2780,65 @@
<p>Protection level: signature
-->
<permission android:name="android.permission.BIND_CHOOSER_TARGET_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
- <!-- @SystemApi Must be required by a {@link
+ <!-- Must be required by a {@link
android.service.notification.ConditionProviderService},
to ensure that only the system can bind to it.
- @hide -->
+ <p>Protection level: signature
+ -->
<permission android:name="android.permission.BIND_CONDITION_PROVIDER_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Must be required by an {@link android.service.dreams.DreamService},
to ensure that only the system can bind to it.
<p>Protection level: signature
-->
<permission android:name="android.permission.BIND_DREAM_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to call into a carrier setup flow. It is up to the
carrier setup application to enforce that this permission is required
@hide This is not a third-party API (intended for OEMs and system apps). -->
<permission android:name="android.permission.INVOKE_CARRIER_SETUP"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to listen for network condition observations.
@hide This is not a third-party API (intended for system apps). -->
<permission android:name="android.permission.ACCESS_NETWORK_CONDITIONS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to provision and access DRM certificates
@hide This is not a third-party API (intended for system apps). -->
<permission android:name="android.permission.ACCESS_DRM_CERTIFICATES"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Api Allows an application to manage media projection sessions.
@hide This is not a third-party API (intended for system apps). -->
<permission android:name="android.permission.MANAGE_MEDIA_PROJECTION"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to read install sessions
@hide This is not a third-party API (intended for system apps). -->
<permission android:name="android.permission.READ_INSTALL_SESSIONS"
- android:label="@string/permlab_readInstallSessions"
- android:description="@string/permdesc_readInstallSessions"
- android:protectionLevel="normal"/>
+ android:label="@string/permlab_readInstallSessions"
+ android:description="@string/permdesc_readInstallSessions"
+ android:protectionLevel="normal"/>
<!-- @SystemApi Allows an application to remove DRM certificates
@hide This is not a third-party API (intended for system apps). -->
<permission android:name="android.permission.REMOVE_DRM_CERTIFICATES"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @deprecated Use {@link android.Manifest.permission#BIND_CARRIER_SERVICES} instead -->
<permission android:name="android.permission.BIND_CARRIER_MESSAGING_SERVICE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows an application to interact with the currently active
{@link android.service.voice.VoiceInteractionService}.
@hide -->
<permission android:name="android.permission.ACCESS_VOICE_INTERACTION_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- The system process that is allowed to bind to services in carrier apps will
have this permission. Carrier apps should use this permission to protect
@@ -2634,9 +2846,9 @@
<p>Protection level: system|signature
-->
<permission android:name="android.permission.BIND_CARRIER_SERVICES"
- android:label="@string/permlab_bindCarrierServices"
- android:description="@string/permdesc_bindCarrierServices"
- android:protectionLevel="signature|privileged" />
+ android:label="@string/permlab_bindCarrierServices"
+ android:description="@string/permdesc_bindCarrierServices"
+ android:protectionLevel="signature|privileged" />
<!-- Allows an application to query whether DO_NOT_ASK_CREDENTIALS_ON_BOOT
flag is set.
@@ -2667,10 +2879,53 @@
<permission android:name="android.permission.DISPATCH_NFC_MESSAGE"
android:protectionLevel="signature|privileged" />
+ <!-- @SystemApi Allows changing day / night mode when system is configured with
+ config_lockDayNightMode set to true. If requesting app does not have permission,
+ it will be ignored.
+ @hide -->
+ <permission android:name="android.permission.MODIFY_DAY_NIGHT_MODE"
+ android:protectionLevel="signature|privileged" />
+
<!-- The system process is explicitly the only one allowed to launch the
confirmation UI for full backup/restore -->
<uses-permission android:name="android.permission.CONFIRM_FULL_BACKUP"/>
+
+ <!-- Allows the holder to access the ephemeral applications on the device.
+ @hide -->
+ <permission android:name="android.permission.ACCESS_EPHEMERAL_APPS"
+ android:protectionLevel="signature" />
+
+ <!-- Allows receiving the usage of media resource e.g. video/audio codec and
+ graphic memory.
+ @hide -->
+ <permission android:name="android.permission.RECEIVE_MEDIA_RESOURCE_USAGE"
+ android:protectionLevel="signature|privileged" />
+
+ <!-- Must be required by system/priv apps when accessing the sound trigger
+ APIs given by {@link SoundTriggerManager}.
+ @hide <p>Not for use by third-party applications.</p> -->
+ <permission android:name="android.permission.MANAGE_SOUND_TRIGGER"
+ android:protectionLevel="signature|privileged" />
+
+ <!-- @SystemApi Allows trusted applications to dispatch managed provisioning message to Managed
+ Provisioning app. If requesting app does not have permission, it will be ignored.
+ @hide -->
+ <permission android:name="android.permission.DISPATCH_PROVISIONING_MESSAGE"
+ android:protectionLevel="signature|privileged" />
+
+ <!-- Allows the holder to read blocked numbers. See
+ {@link android.provider.BlockedNumberContract}.
+ @hide -->
+ <permission android:name="android.permission.READ_BLOCKED_NUMBERS"
+ android:protectionLevel="signature" />
+
+ <!-- Allows the holder to write blocked numbers. See
+ {@link android.provider.BlockedNumberContract}.
+ @hide -->
+ <permission android:name="android.permission.WRITE_BLOCKED_NUMBERS"
+ android:protectionLevel="signature" />
+
<application android:process="system"
android:persistent="true"
android:hasCode="false"
@@ -2679,14 +2934,17 @@
android:backupAgent="com.android.server.backup.SystemBackupAgent"
android:killAfterRestore="false"
android:icon="@drawable/ic_launcher_android"
- android:supportsRtl="true">
+ android:supportsRtl="true"
+ android:theme="@style/Theme.Material.DayNight.DarkActionBar"
+ android:forceDeviceEncrypted="true"
+ android:encryptionAware="true">
<activity android:name="com.android.internal.app.ChooserActivity"
- android:theme="@style/Theme.DeviceDefault.Resolver"
- android:finishOnCloseSystemDialogs="true"
- android:excludeFromRecents="true"
- android:documentLaunchMode="never"
- android:relinquishTaskIdentity="true"
- android:process=":ui">
+ android:theme="@style/Theme.DeviceDefault.Resolver"
+ android:finishOnCloseSystemDialogs="true"
+ android:excludeFromRecents="true"
+ android:documentLaunchMode="never"
+ android:relinquishTaskIdentity="true"
+ android:process=":ui">
<intent-filter>
<action android:name="android.intent.action.CHOOSER" />
<category android:name="android.intent.category.DEFAULT" />
@@ -2694,102 +2952,102 @@
</intent-filter>
</activity>
<activity android:name="com.android.internal.app.IntentForwarderActivity"
- android:finishOnCloseSystemDialogs="true"
- android:theme="@style/Theme.NoDisplay"
- android:excludeFromRecents="true"
- android:label="@string/user_owner_label"
- android:exported="true"
- >
+ android:finishOnCloseSystemDialogs="true"
+ android:theme="@style/Theme.NoDisplay"
+ android:excludeFromRecents="true"
+ android:label="@string/user_owner_label"
+ android:exported="true"
+ >
</activity>
- <activity-alias android:name="com.android.internal.app.ForwardIntentToUserOwner"
- android:targetActivity="com.android.internal.app.IntentForwarderActivity"
- android:exported="true"
- android:label="@string/user_owner_label">
+ <activity-alias android:name="com.android.internal.app.ForwardIntentToParent"
+ android:targetActivity="com.android.internal.app.IntentForwarderActivity"
+ android:exported="true"
+ android:label="@string/user_owner_label">
</activity-alias>
<activity-alias android:name="com.android.internal.app.ForwardIntentToManagedProfile"
- android:targetActivity="com.android.internal.app.IntentForwarderActivity"
- android:icon="@drawable/ic_corp_icon"
- android:exported="true"
- android:label="@string/managed_profile_label">
+ android:targetActivity="com.android.internal.app.IntentForwarderActivity"
+ android:icon="@drawable/ic_corp_icon"
+ android:exported="true"
+ android:label="@string/managed_profile_label">
</activity-alias>
<activity android:name="com.android.internal.app.HeavyWeightSwitcherActivity"
- android:theme="@style/Theme.Material.Light.Dialog"
- android:label="@string/heavy_weight_switcher_title"
- android:finishOnCloseSystemDialogs="true"
- android:excludeFromRecents="true"
- android:process=":ui">
+ android:theme="@style/Theme.Material.DayNight.Dialog"
+ android:label="@string/heavy_weight_switcher_title"
+ android:finishOnCloseSystemDialogs="true"
+ android:excludeFromRecents="true"
+ android:process=":ui">
</activity>
<activity android:name="com.android.internal.app.PlatLogoActivity"
- android:theme="@style/Theme.Wallpaper.NoTitleBar.Fullscreen"
- android:configChanges="orientation|keyboardHidden"
- android:process=":ui">
+ android:theme="@style/Theme.Wallpaper.NoTitleBar.Fullscreen"
+ android:configChanges="orientation|keyboardHidden"
+ android:process=":ui">
</activity>
<activity android:name="com.android.internal.app.DisableCarModeActivity"
- android:theme="@style/Theme.NoDisplay"
- android:excludeFromRecents="true"
- android:process=":ui">
+ android:theme="@style/Theme.NoDisplay"
+ android:excludeFromRecents="true"
+ android:process=":ui">
</activity>
<activity android:name="com.android.internal.app.DumpHeapActivity"
- android:theme="@style/Theme.Translucent.NoTitleBar"
- android:label="@string/dump_heap_title"
- android:finishOnCloseSystemDialogs="true"
- android:noHistory="true"
- android:excludeFromRecents="true"
- android:process=":ui">
+ android:theme="@style/Theme.Translucent.NoTitleBar"
+ android:label="@string/dump_heap_title"
+ android:finishOnCloseSystemDialogs="true"
+ android:noHistory="true"
+ android:excludeFromRecents="true"
+ android:process=":ui">
</activity>
<provider android:name="com.android.server.am.DumpHeapProvider"
- android:authorities="com.android.server.heapdump"
- android:grantUriPermissions="true"
- android:multiprocess="false"
- android:singleUser="true" />
+ android:authorities="com.android.server.heapdump"
+ android:grantUriPermissions="true"
+ android:multiprocess="false"
+ android:singleUser="true" />
<activity android:name="android.accounts.ChooseAccountActivity"
- android:excludeFromRecents="true"
- android:exported="true"
- android:theme="@style/Theme.Material.Light.Dialog"
- android:label="@string/choose_account_label"
- android:process=":ui">
+ android:excludeFromRecents="true"
+ android:exported="true"
+ android:theme="@style/Theme.Material.DayNight.Dialog"
+ android:label="@string/choose_account_label"
+ android:process=":ui">
</activity>
<activity android:name="android.accounts.ChooseTypeAndAccountActivity"
- android:excludeFromRecents="true"
- android:exported="true"
- android:theme="@style/Theme.Material.Light.Dialog"
- android:label="@string/choose_account_label"
- android:process=":ui">
+ android:excludeFromRecents="true"
+ android:exported="true"
+ android:theme="@style/Theme.Material.DayNight.Dialog"
+ android:label="@string/choose_account_label"
+ android:process=":ui">
</activity>
<activity android:name="android.accounts.ChooseAccountTypeActivity"
- android:excludeFromRecents="true"
- android:theme="@style/Theme.Material.Light.Dialog"
- android:label="@string/choose_account_label"
- android:process=":ui">
+ android:excludeFromRecents="true"
+ android:theme="@style/Theme.Material.DayNight.Dialog"
+ android:label="@string/choose_account_label"
+ android:process=":ui">
</activity>
<activity android:name="android.accounts.CantAddAccountActivity"
- android:excludeFromRecents="true"
- android:exported="true"
- android:theme="@style/Theme.Material.Light.Dialog.NoActionBar"
- android:process=":ui">
+ android:excludeFromRecents="true"
+ android:exported="true"
+ android:theme="@style/Theme.Material.DayNight.Dialog.NoActionBar"
+ android:process=":ui">
</activity>
<activity android:name="android.accounts.GrantCredentialsPermissionActivity"
- android:excludeFromRecents="true"
- android:exported="true"
- android:theme="@style/Theme.Material.Light.DialogWhenLarge"
- android:process=":ui">
+ android:excludeFromRecents="true"
+ android:exported="true"
+ android:theme="@style/Theme.Material.DayNight.DialogWhenLarge"
+ android:process=":ui">
</activity>
<activity android:name="android.content.SyncActivityTooManyDeletes"
- android:theme="@style/Theme.Material.Light.Dialog"
- android:label="@string/sync_too_many_deletes"
- android:process=":ui">
+ android:theme="@style/Theme.Material.DayNight.Dialog"
+ android:label="@string/sync_too_many_deletes"
+ android:process=":ui">
</activity>
<activity android:name="com.android.internal.app.ShutdownActivity"
- android:permission="android.permission.SHUTDOWN"
- android:theme="@style/Theme.NoDisplay"
- android:excludeFromRecents="true">
+ android:permission="android.permission.SHUTDOWN"
+ android:theme="@style/Theme.NoDisplay"
+ android:excludeFromRecents="true">
<intent-filter>
<action android:name="android.intent.action.ACTION_REQUEST_SHUTDOWN" />
<category android:name="android.intent.category.DEFAULT" />
@@ -2801,20 +3059,49 @@
</activity>
<activity android:name="com.android.internal.app.NetInitiatedActivity"
- android:theme="@style/Theme.Material.Light.Dialog.Alert"
- android:excludeFromRecents="true"
- android:process=":ui">
+ android:theme="@style/Theme.Material.DayNight.Dialog.Alert"
+ android:excludeFromRecents="true"
+ android:process=":ui">
+ </activity>
+
+ <activity android:name="com.android.internal.app.SystemUserHomeActivity"
+ android:enabled="false"
+ android:process=":ui"
+ android:systemUserOnly="true"
+ android:theme="@style/Theme.Translucent.NoTitleBar">
+ <intent-filter android:priority="-100">
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.HOME" />
+ </intent-filter>
+ </activity>
+
+ <!-- Activity to prompt user if it's ok to create a new user sandbox for a
+ specified account. -->
+ <activity android:name="com.android.internal.app.ConfirmUserCreationActivity"
+ android:excludeFromRecents="true"
+ android:process=":ui"
+ android:theme="@style/Theme.Material.DayNight.Dialog.Alert">
+ <intent-filter android:priority="1000">
+ <action android:name="android.os.action.CREATE_USER" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="com.android.internal.app.UnlaunchableAppActivity"
+ android:theme="@style/Theme.Material.DayNight.Dialog.Alert"
+ android:excludeFromRecents="true"
+ android:process=":ui">
</activity>
<receiver android:name="com.android.server.BootReceiver"
- android:primaryUserOnly="true">
+ android:systemUserOnly="true">
<intent-filter android:priority="1000">
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<receiver android:name="com.android.server.updates.CertPinInstallReceiver"
- android:permission="android.permission.UPDATE_CONFIG">
+ android:permission="android.permission.UPDATE_CONFIG">
<intent-filter>
<action android:name="android.intent.action.UPDATE_PINS" />
<data android:scheme="content" android:host="*" android:mimeType="*/*" />
@@ -2822,7 +3109,7 @@
</receiver>
<receiver android:name="com.android.server.updates.IntentFirewallInstallReceiver"
- android:permission="android.permission.UPDATE_CONFIG">
+ android:permission="android.permission.UPDATE_CONFIG">
<intent-filter>
<action android:name="android.intent.action.UPDATE_INTENT_FIREWALL" />
<data android:scheme="content" android:host="*" android:mimeType="*/*" />
@@ -2830,15 +3117,23 @@
</receiver>
<receiver android:name="com.android.server.updates.SmsShortCodesInstallReceiver"
- android:permission="android.permission.UPDATE_CONFIG">
+ android:permission="android.permission.UPDATE_CONFIG">
<intent-filter>
<action android:name="android.intent.action.UPDATE_SMS_SHORT_CODES" />
<data android:scheme="content" android:host="*" android:mimeType="*/*" />
</intent-filter>
</receiver>
+ <receiver android:name="com.android.server.updates.ApnDbInstallReceiver"
+ android:permission="android.permission.UPDATE_CONFIG">
+ <intent-filter>
+ <action android:name="android.intent.action.UPDATE_APN_DB" />
+ <data android:scheme="content" android:host="*" android:mimeType="*/*" />
+ </intent-filter>
+ </receiver>
+
<receiver android:name="com.android.server.updates.CarrierProvisioningUrlsInstallReceiver"
- android:permission="android.permission.UPDATE_CONFIG">
+ android:permission="android.permission.UPDATE_CONFIG">
<intent-filter>
<action android:name="android.intent.action.UPDATE_CARRIER_PROVISIONING_URLS" />
<data android:scheme="content" android:host="*" android:mimeType="*/*" />
@@ -2846,7 +3141,7 @@
</receiver>
<receiver android:name="com.android.server.updates.TzDataInstallReceiver"
- android:permission="android.permission.UPDATE_CONFIG">
+ android:permission="android.permission.UPDATE_CONFIG">
<intent-filter>
<action android:name="android.intent.action.UPDATE_TZDATA" />
<data android:scheme="content" android:host="*" android:mimeType="*/*" />
@@ -2854,7 +3149,7 @@
</receiver>
<receiver android:name="com.android.server.updates.SELinuxPolicyInstallReceiver"
- android:permission="android.permission.UPDATE_CONFIG">
+ android:permission="android.permission.UPDATE_CONFIG">
<intent-filter>
<action android:name="android.intent.action.UPDATE_SEPOLICY" />
<data android:scheme="content" android:host="*" android:mimeType="*/*" />
@@ -2862,7 +3157,7 @@
</receiver>
<receiver android:name="com.android.server.MasterClearReceiver"
- android:permission="android.permission.MASTER_CLEAR">
+ android:permission="android.permission.MASTER_CLEAR">
<intent-filter
android:priority="100" >
<!-- For Checkin, Settings, etc.: action=MASTER_CLEAR -->
@@ -2875,12 +3170,12 @@
</receiver>
<service android:name="android.hardware.location.GeofenceHardwareService"
- android:permission="android.permission.LOCATION_HARDWARE"
- android:exported="false" />
+ android:permission="android.permission.LOCATION_HARDWARE"
+ android:exported="false" />
<service android:name="com.android.internal.backup.LocalTransportService"
- android:permission="android.permission.CONFIRM_FULL_BACKUP"
- android:exported="false">
+ android:permission="android.permission.CONFIRM_FULL_BACKUP"
+ android:exported="false">
<intent-filter>
<action android:name="android.backup.TRANSPORT_HOST" />
</intent-filter>
@@ -2900,10 +3195,14 @@
android:permission="android.permission.BIND_JOB_SERVICE" >
</service>
+ <service android:name="com.android.server.content.SyncJobService"
+ android:permission="android.permission.BIND_JOB_SERVICE" >
+ </service>
+
<service
- android:name="com.android.server.pm.BackgroundDexOptService"
- android:exported="true"
- android:permission="android.permission.BIND_JOB_SERVICE">
+ android:name="com.android.server.pm.BackgroundDexOptService"
+ android:exported="true"
+ android:permission="android.permission.BIND_JOB_SERVICE">
</service>
</application>
diff --git a/tests/tests/provider/src/android/provider/cts/BlockedNumberContractTest.java b/tests/tests/provider/src/android/provider/cts/BlockedNumberContractTest.java
index d4f81b5..af5df67 100644
--- a/tests/tests/provider/src/android/provider/cts/BlockedNumberContractTest.java
+++ b/tests/tests/provider/src/android/provider/cts/BlockedNumberContractTest.java
@@ -95,8 +95,8 @@
try {
mContentResolver.update(
BlockedNumbers.CONTENT_URI, getContentValues("123"), null, null);
- fail("Should throw UnsupportedOperationException");
- } catch (UnsupportedOperationException expected) {
+ fail("Should throw SecurityException");
+ } catch (SecurityException expected) {
}
}
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsContract_PhoneLookup.java b/tests/tests/provider/src/android/provider/cts/ContactsContract_PhoneLookup.java
index 434ac201..556fb2d 100644
--- a/tests/tests/provider/src/android/provider/cts/ContactsContract_PhoneLookup.java
+++ b/tests/tests/provider/src/android/provider/cts/ContactsContract_PhoneLookup.java
@@ -23,6 +23,7 @@
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.provider.ContactsContract.CommonDataKinds.SipAddress;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.PhoneLookup;
@@ -60,7 +61,17 @@
mBuilder.cleanup();
}
- private long[] setupTestData() throws Exception {
+ static class Id {
+ public long contactId;
+ public long dataId;
+
+ public Id (long contactId, long dataId) {
+ this.contactId = contactId;
+ this.dataId = dataId;
+ }
+ }
+
+ private Id[] setupTestData() throws Exception {
TestRawContact rawContact = mBuilder.newRawContact()
.with(RawContacts.ACCOUNT_TYPE, "test_account")
.with(RawContacts.ACCOUNT_NAME, "test_name")
@@ -68,7 +79,7 @@
rawContact.newDataRow(StructuredName.CONTENT_ITEM_TYPE)
.with(StructuredName.DISPLAY_NAME, "Hot Tamale")
.insert();
- rawContact.newDataRow(Phone.CONTENT_ITEM_TYPE)
+ long dataId = rawContact.newDataRow(Phone.CONTENT_ITEM_TYPE)
.with(Phone.DATA, "1111222333444")
.with(Email.TYPE, Phone.TYPE_HOME)
.insert().load().getId();
@@ -82,24 +93,41 @@
rawContact2.newDataRow(StructuredName.CONTENT_ITEM_TYPE)
.with(StructuredName.DISPLAY_NAME, "Cold Tamago")
.insert();
- rawContact2.newDataRow(Phone.CONTENT_ITEM_TYPE)
+ long dataId2 = rawContact2.newDataRow(Phone.CONTENT_ITEM_TYPE)
.with(Phone.DATA, "2111222333444")
.with(Phone.TYPE, Phone.TYPE_OTHER)
- .insert().load();
-
+ .insert().load().getId();
rawContact2.load();
TestContact contact2 = rawContact2.getContact().load();
- return new long[] {
- contact.getId(), contact2.getId()
+ // Contact with SIP address
+ TestRawContact rawContact3 = mBuilder.newRawContact()
+ .with(RawContacts.ACCOUNT_TYPE, "test_account")
+ .with(RawContacts.ACCOUNT_NAME, "test_name")
+ .insert();
+ rawContact3.newDataRow(StructuredName.CONTENT_ITEM_TYPE)
+ .with(StructuredName.DISPLAY_NAME, "Warm Tempura")
+ .insert();
+ long dataId3 = rawContact2.newDataRow(SipAddress.CONTENT_ITEM_TYPE)
+ .with(SipAddress.SIP_ADDRESS, "777@sip.org")
+ .with(SipAddress.TYPE, SipAddress.TYPE_WORK)
+ .insert().load().getId();
+ rawContact3.load();
+ TestContact contact3 = rawContact2.getContact().load();
+
+ return new Id[] {
+ new Id(contact.getId(), dataId),
+ new Id(contact2.getId(), dataId2),
+ new Id(contact3.getId(), dataId3)
};
+
}
/**
* Test for {@link android.provider.ContactsContract.PhoneLookup#CONTENT_FILTER_URI}.
*/
public void testPhoneLookup_nomatch() throws Exception {
- long[] ids = setupTestData();
+ Id[] ids = setupTestData();
final Uri uri = PhoneLookup.CONTENT_FILTER_URI.buildUpon()
.appendPath("no-such-phone-number").build();
@@ -110,12 +138,14 @@
* Test for {@link android.provider.ContactsContract.PhoneLookup#CONTENT_FILTER_URI}.
*/
public void testPhoneLookup_found1() throws Exception {
- long[] ids = setupTestData();
+ Id[] ids = setupTestData();
final Uri uri = PhoneLookup.CONTENT_FILTER_URI.buildUpon()
.appendPath("1111222333444").build();
final ContentValues expected = new ContentValues();
- expected.put(PhoneLookup._ID, ids[0]);
+ expected.put(PhoneLookup._ID, ids[0].contactId);
+ expected.put(PhoneLookup.CONTACT_ID, ids[0].contactId);
+ expected.put(PhoneLookup.DATA_ID, ids[0].dataId);
expected.put(PhoneLookup.NUMBER, "1111222333444");
assertCursorStoredValuesWithContactsFilter(uri, ids, expected);
@@ -125,22 +155,39 @@
* Test for {@link android.provider.ContactsContract.PhoneLookup#CONTENT_FILTER_URI}.
*/
public void testPhoneLookup_found2() throws Exception {
- long[] ids = setupTestData();
+ Id[] ids = setupTestData();
final Uri uri = PhoneLookup.CONTENT_FILTER_URI.buildUpon()
.appendPath("2111222333444").build();
final ContentValues expected = new ContentValues();
- expected.put(PhoneLookup._ID, ids[1]);
+ expected.put(PhoneLookup._ID, ids[1].contactId);
+ expected.put(PhoneLookup.CONTACT_ID, ids[1].contactId);
+ expected.put(PhoneLookup.DATA_ID, ids[1].dataId);
expected.put(PhoneLookup.NUMBER, "2111222333444");
assertCursorStoredValuesWithContactsFilter(uri, ids, expected);
}
+ public void testPhoneLookup_sip_found() throws Exception {
+ Id[] ids = setupTestData();
+ final Uri uri = PhoneLookup.CONTENT_FILTER_URI.buildUpon()
+ .appendPath("777@sip.org")
+ .appendQueryParameter(PhoneLookup.QUERY_PARAMETER_SIP_ADDRESS, "1")
+ .build();
+
+ final ContentValues expected = new ContentValues();
+ expected.put(PhoneLookup.CONTACT_ID, ids[2].contactId);
+ expected.put(PhoneLookup.DATA_ID, ids[2].dataId);
+ expected.put(SipAddress.SIP_ADDRESS, "777@sip.org");
+
+ assertCursorStoredValuesWithContactsFilter(uri, ids, expected);
+ }
+
/**
* Test for {@link android.provider.ContactsContract.PhoneLookup#ENTERPRISE_CONTENT_FILTER_URI}.
*/
public void testPhoneLookupEnterprise_nomatch() throws Exception {
- long[] ids = setupTestData();
+ Id[] ids = setupTestData();
final Uri uri = PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI.buildUpon()
.appendPath("no-such-phone-number").build();
@@ -151,12 +198,14 @@
* Test for {@link android.provider.ContactsContract.PhoneLookup#ENTERPRISE_CONTENT_FILTER_URI}.
*/
public void testPhoneLookupEnterprise_found1() throws Exception {
- long[] ids = setupTestData();
+ Id[] ids = setupTestData();
final Uri uri = PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI.buildUpon()
.appendPath("1111222333444").build();
final ContentValues expected = new ContentValues();
- expected.put(PhoneLookup._ID, ids[0]);
+ expected.put(PhoneLookup._ID, ids[0].contactId);
+ expected.put(PhoneLookup.CONTACT_ID, ids[0].contactId);
+ expected.put(PhoneLookup.DATA_ID, ids[0].dataId);
expected.put(PhoneLookup.NUMBER, "1111222333444");
assertCursorStoredValuesWithContactsFilter(uri, ids, expected);
@@ -166,27 +215,45 @@
* Test for {@link android.provider.ContactsContract.PhoneLookup#ENTERPRISE_CONTENT_FILTER_URI}.
*/
public void testPhoneLookupEnterprise_found2() throws Exception {
- long[] ids = setupTestData();
+ Id[] ids = setupTestData();
final Uri uri = PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI.buildUpon()
.appendPath("2111222333444").build();
final ContentValues expected = new ContentValues();
- expected.put(PhoneLookup._ID, ids[1]);
+ expected.put(PhoneLookup._ID, ids[1].contactId);
+ expected.put(PhoneLookup.CONTACT_ID, ids[1].contactId);
+ expected.put(PhoneLookup.DATA_ID, ids[1].dataId);
expected.put(PhoneLookup.NUMBER, "2111222333444");
assertCursorStoredValuesWithContactsFilter(uri, ids, expected);
}
- private void assertCursorStoredValuesWithContactsFilter(Uri uri, long[] contactsId,
+ public void testPhoneLookupEnterprise_sip_found() throws Exception {
+ Id[] ids = setupTestData();
+ final Uri uri = PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI.buildUpon()
+ .appendPath("777@sip.org")
+ .appendQueryParameter(PhoneLookup.QUERY_PARAMETER_SIP_ADDRESS, "1")
+ .build();
+
+ final ContentValues expected = new ContentValues();
+ expected.put(PhoneLookup._ID, ids[2].dataId);
+ expected.put(PhoneLookup.CONTACT_ID, ids[2].contactId);
+ expected.put(PhoneLookup.DATA_ID, ids[2].dataId);
+ expected.put(SipAddress.SIP_ADDRESS, "777@sip.org");
+
+ assertCursorStoredValuesWithContactsFilter(uri, ids, expected);
+ }
+
+ private void assertCursorStoredValuesWithContactsFilter(Uri uri, Id[] ids,
ContentValues... expected) {
// We need this helper function to add a filter for specific contacts because
// otherwise tests will fail if performed on a device with existing contacts data
StringBuilder sb = new StringBuilder();
sb.append(Contacts._ID + " in ");
sb.append("(");
- for (int i = 0; i < contactsId.length; i++) {
+ for (int i = 0; i < ids.length; i++) {
if (i != 0) sb.append(",");
- sb.append(contactsId[i]);
+ sb.append(ids[i].contactId);
}
sb.append(")");
DatabaseAsserts.assertStoredValuesInUriMatchExactly(mResolver, uri, null,
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/CoreMathVerifier.java b/tests/tests/renderscript/src/android/renderscript/cts/CoreMathVerifier.java
index 686281c..1400d86 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/CoreMathVerifier.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/CoreMathVerifier.java
@@ -582,67 +582,67 @@
}
static public void computeAcos(TestAcos.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(4, 128, false);
+ t.setPrecision(4, 128);
args.out = acos(args.inV, t);
}
static public void computeAcosh(TestAcosh.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(4, 128, false);
+ t.setPrecision(4, 128);
args.out = acosh(args.inV, t);
}
static public void computeAcospi(TestAcospi.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(5, 128, false);
+ t.setPrecision(5, 128);
args.out = acospi(args.inV, t);
}
static public void computeAsin(TestAsin.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(4, 128, false);
+ t.setPrecision(4, 128);
args.out = asin(args.inV, t);
}
static public void computeAsinh(TestAsinh.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(4, 128, false);
+ t.setPrecision(4, 128);
args.out = asinh(args.inV, t);
}
static public void computeAsinpi(TestAsinpi.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(5, 128, false);
+ t.setPrecision(5, 128);
args.out = asinpi(args.inV, t);
}
static public void computeAtan(TestAtan.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(5, 128, false);
+ t.setPrecision(5, 128);
args.out = atan(args.inV, t);
}
static public void computeAtanh(TestAtanh.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(5, 128, false);
+ t.setPrecision(5, 128);
args.out = atanh(args.inV, t);
}
static public void computeAtanpi(TestAtanpi.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(5, 128, false);
+ t.setPrecision(5, 128);
args.out = atanpi(args.inV, t);
}
static public void computeAtan2(TestAtan2.ArgumentsFloatFloatFloat args, Target t) {
- t.setPrecision(6, 128, false);
+ t.setPrecision(6, 128);
args.out = atan2(args.inNumerator, args.inDenominator, t);
}
static public void computeAtan2pi(TestAtan2pi.ArgumentsFloatFloatFloat args, Target t) {
- t.setPrecision(6, 128, false);
+ t.setPrecision(6, 128);
args.out = atan2pi(args.inNumerator, args.inDenominator, t);
}
static public void computeCbrt(TestCbrt.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(2, 128, false);
+ t.setPrecision(2, 128);
args.out = cbrt(args.inV, t);
}
static public void computeCeil(TestCeil.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(0, 1, false);
+ t.setPrecision(0, 1);
Target.Floaty in = t.new32(args.inV);
args.out = t.new32(
ceil(in.mid32()),
@@ -675,7 +675,7 @@
}
static public void computeClamp(TestClamp.ArgumentsFloatFloatFloatFloat args, Target t) {
- t.setPrecision(0, 0, false);
+ t.setPrecision(0, 0);
args.out = t.new32(Math.min(args.inMaxValue,
Math.max(args.inValue, args.inMinValue)));
}
@@ -740,11 +740,11 @@
args.out = convertCharToUlong(args.inV);
}
static public void computeConvert(TestConvert.ArgumentsCharFloat args, Target t) {
- t.setPrecision(0, 0, false);
+ t.setPrecision(0, 0);
args.out = t.new32(convertCharToFloat(args.inV));
}
static public void computeConvert(TestConvert.ArgumentsCharDouble args, Target t) {
- t.setPrecision(0, 0, false);
+ t.setPrecision(0, 0);
args.out = t.new64(convertCharToDouble(args.inV));
}
@@ -773,11 +773,11 @@
args.out = convertUcharToUlong(args.inV);
}
static public void computeConvert(TestConvert.ArgumentsUcharFloat args, Target t) {
- t.setPrecision(0, 0, false);
+ t.setPrecision(0, 0);
args.out = t.new32(convertUcharToFloat(args.inV));
}
static public void computeConvert(TestConvert.ArgumentsUcharDouble args, Target t) {
- t.setPrecision(0, 0, false);
+ t.setPrecision(0, 0);
args.out = t.new64(convertUcharToDouble(args.inV));
}
@@ -806,11 +806,11 @@
args.out = convertShortToUlong(args.inV);
}
static public void computeConvert(TestConvert.ArgumentsShortFloat args, Target t) {
- t.setPrecision(0, 0, false);
+ t.setPrecision(0, 0);
args.out = t.new32(convertShortToFloat(args.inV));
}
static public void computeConvert(TestConvert.ArgumentsShortDouble args, Target t) {
- t.setPrecision(0, 0, false);
+ t.setPrecision(0, 0);
args.out = t.new64(convertShortToDouble(args.inV));
}
@@ -839,11 +839,11 @@
args.out = convertUshortToUlong(args.inV);
}
static public void computeConvert(TestConvert.ArgumentsUshortFloat args, Target t) {
- t.setPrecision(0, 0, false);
+ t.setPrecision(0, 0);
args.out = t.new32(convertUshortToFloat(args.inV));
}
static public void computeConvert(TestConvert.ArgumentsUshortDouble args, Target t) {
- t.setPrecision(0, 0, false);
+ t.setPrecision(0, 0);
args.out = t.new64(convertUshortToDouble(args.inV));
}
@@ -872,11 +872,11 @@
args.out = convertIntToUlong(args.inV);
}
static public void computeConvert(TestConvert.ArgumentsIntFloat args, Target t) {
- t.setPrecision(1, 1, false);
+ t.setPrecision(1, 1);
args.out = t.new32(convertIntToFloat(args.inV));
}
static public void computeConvert(TestConvert.ArgumentsIntDouble args, Target t) {
- t.setPrecision(0, 0, false);
+ t.setPrecision(0, 0);
args.out = t.new64(convertIntToDouble(args.inV));
}
@@ -905,11 +905,11 @@
args.out = convertUintToUlong(args.inV);
}
static public void computeConvert(TestConvert.ArgumentsUintFloat args, Target t) {
- t.setPrecision(1, 1, false);
+ t.setPrecision(1, 1);
args.out = t.new32(convertUintToFloat(args.inV));
}
static public void computeConvert(TestConvert.ArgumentsUintDouble args, Target t) {
- t.setPrecision(0, 0, false);
+ t.setPrecision(0, 0);
args.out = t.new64(convertUintToDouble(args.inV));
}
@@ -938,11 +938,11 @@
args.out = convertLongToUlong(args.inV);
}
static public void computeConvert(TestConvert.ArgumentsLongFloat args, Target t) {
- t.setPrecision(1, 1, false);
+ t.setPrecision(1, 1);
args.out = t.new32(convertLongToFloat(args.inV));
}
static public void computeConvert(TestConvert.ArgumentsLongDouble args, Target t) {
- t.setPrecision(1, 1, false);
+ t.setPrecision(1, 1);
args.out = t.new64(convertLongToDouble(args.inV));
}
@@ -971,11 +971,11 @@
args.out = convertUlongToUlong(args.inV);
}
static public void computeConvert(TestConvert.ArgumentsUlongFloat args, Target t) {
- t.setPrecision(1, 1, false);
+ t.setPrecision(1, 1);
args.out = t.new32(convertUlongToFloat(args.inV));
}
static public void computeConvert(TestConvert.ArgumentsUlongDouble args, Target t) {
- t.setPrecision(1, 1, false);
+ t.setPrecision(1, 1);
args.out = t.new64(convertUlongToDouble(args.inV));
}
@@ -1004,11 +1004,11 @@
args.out = convertFloatToUlong(args.inV);
}
static public void computeConvert(TestConvert.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(0, 0, false);
+ t.setPrecision(0, 0);
args.out = t.new32(convertFloatToFloat(args.inV));
}
static public void computeConvert(TestConvert.ArgumentsFloatDouble args, Target t) {
- t.setPrecision(0, 0, false);
+ t.setPrecision(0, 0);
args.out = t.new64(convertFloatToDouble(args.inV));
}
@@ -1037,65 +1037,65 @@
args.out = convertDoubleToUlong(args.inV);
}
static public void computeConvert(TestConvert.ArgumentsDoubleFloat args, Target t) {
- t.setPrecision(1, 1, false);
+ t.setPrecision(1, 1);
args.out = t.new32(convertDoubleToFloat(args.inV));
}
static public void computeConvert(TestConvert.ArgumentsDoubleDouble args, Target t) {
- t.setPrecision(0, 0, false);
+ t.setPrecision(0, 0);
args.out = t.new64(convertDoubleToDouble(args.inV));
}
static public void computeCopysign(TestCopysign.ArgumentsFloatFloatFloat args, Target t) {
- t.setPrecision(0, 0, false);
+ t.setPrecision(0, 0);
args.out = t.new32(Math.copySign(args.inMagnitudeValue, args.inSignValue));
}
static public void computeCos(TestCos.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(4, 128, false);
+ t.setPrecision(4, 128);
args.out = cos(args.inV, t);
}
static public void computeCosh(TestCosh.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(4, 128, false);
+ t.setPrecision(4, 128);
args.out = cosh(args.inV, t);
}
static public void computeCospi(TestCospi.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(4, 128, false);
+ t.setPrecision(4, 128);
args.out = cospi(args.inV, t);
}
static public void computeCross(TestCross.ArgumentsFloatNFloatNFloatN args, Target t) {
- t.setPrecision(1, 4, false);
+ t.setPrecision(1, 4);
cross(args.inLeftVector, args.inRightVector, args.out, t);
}
static public void computeDegrees(TestDegrees.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(3, 3, false);
+ t.setPrecision(3, 3);
Target.Floaty in = t.new32(args.inV);
Target.Floaty k = t.new32((float)(180.0 / Math.PI));
args.out = t.multiply(in, k);
}
static public void computeDistance(TestDistance.ArgumentsFloatFloatFloat args, Target t) {
- t.setPrecision(1, 1, false);
+ t.setPrecision(1, 1);
args.out = distance(new float[] {args.inLeftVector}, new float[] {args.inRightVector}, t);
}
static public void computeDistance(TestDistance.ArgumentsFloatNFloatNFloat args, Target t) {
- t.setPrecision(1, 1, false);
+ t.setPrecision(1, 1);
args.out = distance(args.inLeftVector, args.inRightVector, t);
}
static public void computeDot(TestDot.ArgumentsFloatFloatFloat args, Target t) {
- t.setPrecision(1, 4, false);
+ t.setPrecision(1, 4);
Target.Floaty a = t.new32(args.inLeftVector);
Target.Floaty b = t.new32(args.inRightVector);
args.out = t.multiply(a, b);
}
static public void computeDot(TestDot.ArgumentsFloatNFloatNFloat args, Target t) {
- t.setPrecision(1, 4, false);
+ t.setPrecision(1, 4);
Target.Floaty sum = t.new32(0.f);
for (int i = 0; i < args.inLeftVector.length; i++) {
Target.Floaty a = t.new32(args.inLeftVector[i]);
@@ -1106,7 +1106,7 @@
}
static public void computeErf(TestErf.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(16, 128, false);
+ t.setPrecision(16, 128);
Target.Floaty in = t.new32(args.inV);
args.out = t.new32(
erf(args.inV),
@@ -1115,7 +1115,7 @@
}
static public void computeErfc(TestErfc.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(16, 128, false);
+ t.setPrecision(16, 128);
Target.Floaty in = t.new32(args.inV);
args.out = t.new32(
erfc(args.inV),
@@ -1124,27 +1124,27 @@
}
static public void computeExp(TestExp.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(3, 16, false);
+ t.setPrecision(3, 16);
args.out = exp(args.inV, t);
}
static public void computeExp10(TestExp10.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(3, 32, false);
+ t.setPrecision(3, 32);
args.out = exp10(args.inV, t);
}
static public void computeExp2(TestExp2.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(3, 16, false);
+ t.setPrecision(3, 16);
args.out = exp2(args.inV, t);
}
static public void computeExpm1(TestExpm1.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(3, 16, false);
+ t.setPrecision(3, 16);
args.out = expm1(args.inV, t);
}
static public void computeFabs(TestFabs.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(0, 0, false);
+ t.setPrecision(0, 0);
Target.Floaty in = t.new32(args.inV);
args.out = t.new32(
Math.abs(args.inV),
@@ -1153,39 +1153,39 @@
}
static public void computeFastDistance(TestFastDistance.ArgumentsFloatFloatFloat args, Target t) {
- t.setPrecision(FAST_PRECISION, FAST_PRECISION, false);
+ t.setPrecision(FAST_PRECISION, FAST_PRECISION);
args.out = distance(new float[] {args.inLeftVector}, new float[] {args.inRightVector}, t);
}
static public void computeFastDistance(TestFastDistance.ArgumentsFloatNFloatNFloat args, Target t) {
- t.setPrecision(FAST_PRECISION, FAST_PRECISION, false);
+ t.setPrecision(FAST_PRECISION, FAST_PRECISION);
args.out = distance(args.inLeftVector, args.inRightVector, t);
}
static public void computeFastLength(TestFastLength.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(FAST_PRECISION, FAST_PRECISION, false);
+ t.setPrecision(FAST_PRECISION, FAST_PRECISION);
args.out = length(new float[] {args.inV}, t);
}
static public void computeFastLength(TestFastLength.ArgumentsFloatNFloat args, Target t) {
- t.setPrecision(FAST_PRECISION, FAST_PRECISION, false);
+ t.setPrecision(FAST_PRECISION, FAST_PRECISION);
args.out = length(args.inV, t);
}
static public void computeFastNormalize(TestFastNormalize.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(FAST_PRECISION, FAST_PRECISION, false);
+ t.setPrecision(FAST_PRECISION, FAST_PRECISION);
Target.Floaty[] out = new Target.Floaty[1];
normalize(new float[] {args.inV}, out, t);
args.out = out[0];
}
static public void computeFastNormalize(TestFastNormalize.ArgumentsFloatNFloatN args, Target t) {
- t.setPrecision(FAST_PRECISION, FAST_PRECISION, false);
+ t.setPrecision(FAST_PRECISION, FAST_PRECISION);
normalize(args.inV, args.out, t);
}
static public void computeFdim(TestFdim.ArgumentsFloatFloatFloat args, Target t) {
- t.setPrecision(1, 1, false);
+ t.setPrecision(1, 1);
Target.Floaty inA = t.new32(args.inA);
Target.Floaty inB = t.new32(args.inB);
Target.Floaty r = t.subtract(inA, inB);
@@ -1196,7 +1196,7 @@
}
static public void computeFloor(TestFloor.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(0, 0, false);
+ t.setPrecision(0, 0);
Target.Floaty in = t.new32(args.inV);
args.out = t.new32(
floor(args.inV),
@@ -1205,13 +1205,13 @@
}
static public void computeFma(TestFma.ArgumentsFloatFloatFloatFloat args, Target t) {
- t.setPrecision(1, 1, false);
+ t.setPrecision(1, 1);
Target.Floaty ab = t.multiply(t.new32(args.inMultiplicand1), t.new32(args.inMultiplicand2));
args.out = t.add(ab, t.new32(args.inOffset));
}
static public void computeFmax(TestFmax.ArgumentsFloatFloatFloat args, Target t) {
- t.setPrecision(0, 0, false);
+ t.setPrecision(0, 0);
Target.Floaty a = t.new32(args.inA);
Target.Floaty b = t.new32(args.inB);
args.out = t.new32(
@@ -1223,7 +1223,7 @@
}
static public void computeFmin(TestFmin.ArgumentsFloatFloatFloat args, Target t) {
- t.setPrecision(0, 0, false);
+ t.setPrecision(0, 0);
Target.Floaty a = t.new32(args.inA);
Target.Floaty b = t.new32(args.inB);
args.out = t.new32(
@@ -1235,7 +1235,7 @@
}
static public void computeFmod(TestFmod.ArgumentsFloatFloatFloat args, Target t) {
- t.setPrecision(1, 1, false);
+ t.setPrecision(1, 1);
Target.Floaty numerator = t.new32(args.inNumerator);
Target.Floaty denominator = t.new32(args.inDenominator);
args.out = t.new32(
@@ -1247,7 +1247,7 @@
}
static public void computeFract(TestFract.ArgumentsFloatFloatFloat args, Target t) {
- t.setPrecision(1, 1, false);
+ t.setPrecision(1, 1);
float floor = floor(args.inV);
args.outFloor = t.new32(floor);
// 0x1.fffffep-1f is 0.999999...
@@ -1255,36 +1255,36 @@
}
static public void computeFract(TestFract.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(1, 1, false);
+ t.setPrecision(1, 1);
float floor = floor(args.inV);
// 0x1.fffffep-1f is 0.999999...
args.out = t.new32(Math.min(args.inV - floor, 0x1.fffffep-1f));
}
static public void computeFrexp(TestFrexp.ArgumentsFloatIntFloat args, Target t) {
- t.setPrecision(0, 0, false);
+ t.setPrecision(0, 0);
FrexpResult result = frexp(args.inV);
args.out = t.new32(result.significand);
args.outExponent = result.exponent;
}
static public void computeHalfRecip(TestHalfRecip.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(HALF_PRECISION, HALF_PRECISION, false);
+ t.setPrecision(HALF_PRECISION, HALF_PRECISION);
args.out = recip(args.inV, t);
}
static public void computeHalfRsqrt(TestHalfRsqrt.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(HALF_PRECISION, HALF_PRECISION, false);
+ t.setPrecision(HALF_PRECISION, HALF_PRECISION);
args.out = rsqrt(args.inV, t);
}
static public void computeHalfSqrt(TestHalfSqrt.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(HALF_PRECISION, HALF_PRECISION, false);
+ t.setPrecision(HALF_PRECISION, HALF_PRECISION);
args.out = sqrt(args.inV, t);
}
static public void computeHypot(TestHypot.ArgumentsFloatFloatFloat args, Target t) {
- t.setPrecision(4, 4, false);
+ t.setPrecision(4, 4);
args.out = hypot(args.inA, args.inB, t);
}
@@ -1305,7 +1305,7 @@
}
static public void computeLdexp(TestLdexp.ArgumentsFloatIntFloat args, Target t) {
- t.setPrecision(1, 1, false);
+ t.setPrecision(1, 1);
Target.Floaty inMantissa = t.new32(args.inMantissa);
args.out = t.new32(
ldexp(inMantissa.mid32(), args.inExponent),
@@ -1314,17 +1314,17 @@
}
static public void computeLength(TestLength.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(1, 1, false);
+ t.setPrecision(1, 1);
args.out = length(new float[]{args.inV}, t);
}
static public void computeLength(TestLength.ArgumentsFloatNFloat args, Target t) {
- t.setPrecision(1, 1, false);
+ t.setPrecision(1, 1);
args.out = length(args.inV, t);
}
static public void computeLgamma(TestLgamma.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(16, 128, false);
+ t.setPrecision(16, 128);
Target.Floaty in = t.new32(args.inV);
args.out = t.new32(
lgamma(in.mid32()),
@@ -1336,7 +1336,7 @@
* 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);
+ t.setPrecision(16, 128);
Target.Floaty in = t.new32(args.inV);
LgammaResult result = lgamma2(in.mid32());
LgammaResult resultMin = lgamma2(in.min32());
@@ -1346,7 +1346,7 @@
}
*/
static public String verifyLgamma(TestLgamma.ArgumentsFloatIntFloat args, Target t) {
- t.setPrecision(16, 128, false);
+ t.setPrecision(16, 128);
Target.Floaty in = t.new32(args.inV);
LgammaResult result = lgamma2(in.mid32());
LgammaResult resultMin = lgamma2(in.min32());
@@ -1375,27 +1375,27 @@
// TODO The relaxed ulf for the various log are taken from the old tests.
// They are not consistent.
static public void computeLog(TestLog.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(3, 16, false);
+ t.setPrecision(3, 16);
args.out = log(args.inV, t);
}
static public void computeLog10(TestLog10.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(3, 16, false);
+ t.setPrecision(3, 16);
args.out = log10(args.inV, t);
}
static public void computeLog1p(TestLog1p.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(2, 16, false);
+ t.setPrecision(2, 16);
args.out = log1p(args.inV, t);
}
static public void computeLog2(TestLog2.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(3, 128, false);
+ t.setPrecision(3, 128);
args.out = log2(args.inV, t);
}
static public void computeLogb(TestLogb.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(0, 0, false);
+ t.setPrecision(0, 0);
Target.Floaty in = t.new32(args.inV);
args.out = t.new32(
logb(in.mid32()),
@@ -1404,7 +1404,7 @@
}
static public void computeMad(TestMad.ArgumentsFloatFloatFloatFloat args, Target t) {
- t.setPrecision(1, 4, false);
+ t.setPrecision(1, 4);
Target.Floaty ab = t.multiply(t.new32(args.inMultiplicand1), t.new32(args.inMultiplicand2));
args.out = t.add(ab, t.new32(args.inOffset));
}
@@ -1442,7 +1442,7 @@
}
static public void computeMax(TestMax.ArgumentsFloatFloatFloat args, Target t) {
- t.setPrecision(0, 0, false);
+ t.setPrecision(0, 0);
Target.Floaty a = t.new32(args.inA);
Target.Floaty b = t.new32(args.inB);
args.out = t.new32(
@@ -1486,12 +1486,12 @@
}
static public void computeMin(TestMin.ArgumentsFloatFloatFloat args, Target t) {
- t.setPrecision(0, 0, false);
+ t.setPrecision(0, 0);
args.out = t.new32(Math.min(args.inA, args.inB));
}
static public void computeMix(TestMix.ArgumentsFloatFloatFloatFloat args, Target t) {
- t.setPrecision(1, 4, false);
+ t.setPrecision(1, 4);
Target.Floaty start = t.new32(args.inStart);
Target.Floaty stop = t.new32(args.inStop);
Target.Floaty diff = t.subtract(stop, start);
@@ -1499,146 +1499,146 @@
}
static public void computeModf(TestModf.ArgumentsFloatFloatFloat args, Target t) {
- t.setPrecision(0, 0, false);
+ t.setPrecision(0, 0);
float ret = (float)(int)args.inV;
args.outIntegralPart = t.new32(ret);
args.out = t.new32(args.inV - ret);
}
static public void computeNan(TestNan.ArgumentsUintFloat args, Target t) {
- t.setPrecision(0, 0, false);
+ t.setPrecision(0, 0);
// TODO(jeanluc) We're not using the input argument
args.out = t.new32(Float.NaN);
}
static public void computeNativeAcos(TestNativeAcos.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
args.out = acos(args.inV, t);
}
static public void computeNativeAcosh(TestNativeAcosh.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
args.out = acosh(args.inV, t);
}
static public void computeNativeAcospi(TestNativeAcospi.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
args.out = acospi(args.inV, t);
}
static public void computeNativeAsin(TestNativeAsin.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
args.out = asin(args.inV, t);
}
static public void computeNativeAsinh(TestNativeAsinh.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
args.out = asinh(args.inV, t);
}
static public void computeNativeAsinpi(TestNativeAsinpi.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
args.out = asinpi(args.inV, t);
}
static public void computeNativeAtan(TestNativeAtan.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
args.out = atan(args.inV, t);
}
static public void computeNativeAtanh(TestNativeAtanh.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
args.out = atanh(args.inV, t);
}
static public void computeNativeAtanpi(TestNativeAtanpi.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
args.out = atanpi(args.inV, t);
}
static public void computeNativeAtan2(TestNativeAtan2.ArgumentsFloatFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
args.out = atan2(args.inNumerator, args.inDenominator, t);
}
static public void computeNativeAtan2pi(TestNativeAtan2pi.ArgumentsFloatFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
args.out = atan2pi(args.inNumerator, args.inDenominator, t);
}
static public void computeNativeCbrt(TestNativeCbrt.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
args.out = cbrt(args.inV, t);
}
static public void computeNativeCos(TestNativeCos.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
args.out = cos(args.inV, t);
}
static public void computeNativeCosh(TestNativeCosh.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
args.out = cosh(args.inV, t);
}
static public void computeNativeCospi(TestNativeCospi.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
args.out = cospi(args.inV, t);
}
static public void computeNativeDistance(TestNativeDistance.ArgumentsFloatFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
args.out = distance(new float[]{args.inLeftVector}, new float[]{args.inRightVector}, t);
}
static public void computeNativeDistance(TestNativeDistance.ArgumentsFloatNFloatNFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
args.out = distance(args.inLeftVector, args.inRightVector, t);
}
static public void computeNativeDivide(TestNativeDivide.ArgumentsFloatFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
args.out = t.divide(t.new32(args.inLeftVector), t.new32(args.inRightVector));
}
static public void computeNativeExp(TestNativeExp.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
args.out = exp(args.inV, t);
}
static public void computeNativeExp10(TestNativeExp10.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
args.out = exp10(args.inV, t);
}
static public void computeNativeExp2(TestNativeExp2.ArgumentsFloatFloat args, Target t) {
// TODO we would like to use NATIVE_PRECISION, NATIVE_PRECISION
- t.setPrecision(13000, 13000, true);
+ t.setPrecision(13000, 13000);
args.out = exp2(args.inV, t);
}
static public void computeNativeExpm1(TestNativeExpm1.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
args.out = expm1(args.inV, t);
}
static public void computeNativeHypot(TestNativeHypot.ArgumentsFloatFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
args.out = hypot(args.inA, args.inB, t);
}
static public void computeNativeLength(TestNativeLength.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
args.out = length(new float[] {args.inV}, t);
}
static public void computeNativeLength(TestNativeLength.ArgumentsFloatNFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
args.out = length(args.inV, t);
}
static public void computeNativeLog(TestNativeLog.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
// For very small values, allow anything.
if (Math.abs(args.inV) < 1.e-20) {
args.out = any32(t);
@@ -1648,7 +1648,7 @@
}
static public void computeNativeLog10(TestNativeLog10.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
// For very small values, allow anything.
if (Math.abs(args.inV) < 1.e-20) {
args.out = any32(t);
@@ -1658,12 +1658,12 @@
}
static public void computeNativeLog1p(TestNativeLog1p.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
args.out = log1p(args.inV, t);
}
static public void computeNativeLog2(TestNativeLog2.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
// For very small values, allow anything.
if (Math.abs(args.inV) < 1.e-20) {
args.out = any32(t);
@@ -1673,20 +1673,20 @@
}
static public void computeNativeNormalize(TestNativeNormalize.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
Target.Floaty[] out = new Target.Floaty[1];
normalize(new float[] {args.inV}, out, t);
args.out = out[0];
}
static public void computeNativeNormalize(TestNativeNormalize.ArgumentsFloatNFloatN args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
normalize(args.inV, args.out, t);
}
static public void computeNativePowr(TestNativePowr.ArgumentsFloatFloatFloat args, Target t) {
// TODO we would like to use NATIVE_PRECISION, NATIVE_PRECISION
- t.setPrecision(32000, 32000, true);
+ t.setPrecision(32000, 32000);
// For very small values, allow anything.
if (Math.abs(args.inBase) < 1.e-20) {
args.out = any32(t);
@@ -1696,12 +1696,12 @@
}
static public void computeNativeRecip(TestNativeRecip.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
args.out = recip(args.inV, t);
}
static public void computeNativeRootn(TestNativeRootn.ArgumentsFloatIntFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
// Allow anything for zero.
if (args.inN == 0) {
args.out = any32(t);
@@ -1711,70 +1711,70 @@
}
static public void computeNativeRsqrt(TestNativeRsqrt.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
args.out = rsqrt(args.inV, t);
}
static public void computeNativeSin(TestNativeSin.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
args.out = sin(args.inV, t);
}
static public void computeNativeSincos(TestNativeSincos.ArgumentsFloatFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
args.outCos = cos(args.inV, t);
args.out = sin(args.inV, t);
}
static public void computeNativeSinh(TestNativeSinh.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
args.out = sinh(args.inV, t);
}
static public void computeNativeSinpi(TestNativeSinpi.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
args.out = sinpi(args.inV, t);
}
static public void computeNativeSqrt(TestNativeSqrt.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
args.out = sqrt(args.inV, t);
}
static public void computeNativeTan(TestNativeTan.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
args.out = tan(args.inV, t);
}
static public void computeNativeTanh(TestNativeTanh.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
args.out = tanh(args.inV, t);
}
static public void computeNativeTanpi(TestNativeTanpi.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION, true);
+ t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
args.out = tanpi(args.inV, t);
}
static public void computeNextafter(TestNextafter.ArgumentsFloatFloatFloat args, Target t) {
- t.setPrecision(0, 0, false);
+ t.setPrecision(0, 0);
args.out = t.new32(Math.nextAfter(args.inV, args.inTarget));
}
static public void computeNormalize(TestNormalize.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(1, 1, false);
+ t.setPrecision(1, 1);
Target.Floaty[] out = new Target.Floaty[1];
normalize(new float[] {args.inV}, out, t);
args.out = out[0];
}
static public void computeNormalize(TestNormalize.ArgumentsFloatNFloatN args, Target t) {
- t.setPrecision(1, 1, false);
+ t.setPrecision(1, 1);
normalize(args.inV, args.out, t);
}
static public void computePow(TestPow.ArgumentsFloatFloatFloat args, Target t) {
- t.setPrecision(16, 128, false);
+ t.setPrecision(16, 128);
Target.Floaty base = t.new32(args.inBase);
Target.Floaty exponent = t.new32(args.inExponent);
args.out = t.new32(
@@ -1786,7 +1786,7 @@
}
static public void computePown(TestPown.ArgumentsFloatIntFloat args, Target t) {
- t.setPrecision(16, 128, false);
+ t.setPrecision(16, 128);
Target.Floaty in = t.new32(args.inBase);
// We use double for the calculations because floats does not have enough
// mantissa bits. Knowing if an int is odd or even will matter for negative
@@ -1799,25 +1799,25 @@
}
static public void computePowr(TestPowr.ArgumentsFloatFloatFloat args, Target t) {
- t.setPrecision(16, 128, false);
+ t.setPrecision(16, 128);
args.out = powr(args.inBase, args.inExponent, t);
}
static public void computeRadians(TestRadians.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(3, 3, false);
+ t.setPrecision(3, 3);
Target.Floaty in = t.new32(args.inV);
Target.Floaty k = t.new32((float)(Math.PI / 180.0));
args.out = t.multiply(in, k);
}
static public void computeRemainder(TestRemainder.ArgumentsFloatFloatFloat args, Target t) {
- t.setPrecision(0, 0, false);
+ t.setPrecision(0, 0);
RemquoResult result = remquo(args.inNumerator, args.inDenominator);
args.out = t.new32(result.remainder);
}
static public String verifyRemquo(TestRemquo.ArgumentsFloatFloatIntFloat args, Target t) {
- t.setPrecision(0, 0, false);
+ t.setPrecision(0, 0);
RemquoResult expected = remquo(args.inNumerator, args.inDenominator);
// If the expected remainder is NaN, we don't validate the quotient. It's because of
// a division by zero.
@@ -1844,7 +1844,7 @@
}
static public void computeRint(TestRint.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(0, 0, false);
+ t.setPrecision(0, 0);
Target.Floaty in = t.new32(args.inV);
args.out = t.new32(
rint(in.mid32()),
@@ -1853,12 +1853,12 @@
}
static public void computeRootn(TestRootn.ArgumentsFloatIntFloat args, Target t) {
- t.setPrecision(16, 16, false);
+ t.setPrecision(16, 16);
args.out = rootn(args.inV, args.inN, t);
}
static public void computeRound(TestRound.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(0, 0, false);
+ t.setPrecision(0, 0);
Target.Floaty in = t.new32(args.inV);
args.out = t.new32(
round(in.mid32()),
@@ -1867,63 +1867,63 @@
}
static public void computeRsqrt(TestRsqrt.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(2, 2, false);
+ t.setPrecision(2, 2);
args.out = rsqrt(args.inV, t);
}
static public void computeSign(TestSign.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(0, 0, false);
+ t.setPrecision(0, 0);
args.out = t.new32(Math.signum(args.inV));
}
static public void computeSin(TestSin.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(4, 128, false);
+ t.setPrecision(4, 128);
args.out = sin(args.inV, t);
}
static public void computeSincos(TestSincos.ArgumentsFloatFloatFloat args, Target t) {
- t.setPrecision(4, 128, false);
+ t.setPrecision(4, 128);
args.outCos = cos(args.inV,t );
args.out = sin(args.inV, t);
}
static public void computeSinh(TestSinh.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(4, 128, false);
+ t.setPrecision(4, 128);
args.out = sinh(args.inV, t);
}
static public void computeSinpi(TestSinpi.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(4, 128, false);
+ t.setPrecision(4, 128);
args.out = sinpi(args.inV, t);
}
static public void computeSqrt(TestSqrt.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(3, 3, false);
+ t.setPrecision(3, 3);
args.out = sqrt(args.inV, t);
}
static public void computeStep(TestStep.ArgumentsFloatFloatFloat args, Target t) {
- t.setPrecision(0, 0, false);
+ t.setPrecision(0, 0);
args.out = t.new32(args.inV < args.inEdge ? 0.f : 1.f);
}
static public void computeTan(TestTan.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(5, 128, false);
+ t.setPrecision(5, 128);
args.out = tan(args.inV, t);
}
static public void computeTanh(TestTanh.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(5, 128, false);
+ t.setPrecision(5, 128);
args.out = tanh(args.inV, t);
}
static public void computeTanpi(TestTanpi.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(4, 128, false);
+ t.setPrecision(4, 128);
args.out = tanpi(args.inV, t);
}
static public void computeTgamma(TestTgamma.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(16, 128, false);
+ t.setPrecision(16, 128);
Target.Floaty in = t.new32(args.inV);
args.out = t.new32(
tgamma(in.mid32()),
@@ -1932,7 +1932,7 @@
}
static public void computeTrunc(TestTrunc.ArgumentsFloatFloat args, Target t) {
- t.setPrecision(0, 0, false);
+ t.setPrecision(0, 0);
Target.Floaty in = t.new32(args.inV);
args.out = t.new32(
trunc(in.mid32()),
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/DoubleTest.java b/tests/tests/renderscript/src/android/renderscript/cts/DoubleTest.java
index 2de6afd..2ff23fc 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/DoubleTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/DoubleTest.java
@@ -19,6 +19,7 @@
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RenderScript;
+import android.renderscript.cts.Target;
public class DoubleTest extends RSBaseCompute {
@@ -33,8 +34,8 @@
float[] data = new float[big];
out.copyTo(data);
- Target t = new Target(true);
- t.setPrecision(1, 1, false);
+ Target t = new Target(Target.FunctionType.NORMAL, Target.ReturnType.DOUBLE, true);
+ t.setPrecision(1, 1);
double pi = 3.14159265359;
Target.Floaty pi2 = t.new32((float) (pi * 2));
for (int x = 0; x < data.length; x++) {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/FloatyUnitTest.java b/tests/tests/renderscript/src/android/renderscript/cts/FloatyUnitTest.java
new file mode 100644
index 0000000..ccce349
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/FloatyUnitTest.java
@@ -0,0 +1,227 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.cts.Target;
+
+public class FloatyUnitTest extends RSBaseCompute {
+ static float subnormalFloat = 10000 * Float.MIN_VALUE;
+ static float normalFloat1 = 1.7833920e+16f;
+ static float normalFloat2 = -1.9905756e-16f;
+
+ static double subnormalDouble = 10000 * Double.MIN_VALUE;
+ static double normalDouble = 1.7833920e+16;
+
+ // Fail if Floaty f doesn't accept value
+ private void shouldAccept(Target.Floaty f, double value) {
+ if (!f.couldBe(value)) {
+ StringBuilder message = new StringBuilder();
+ message.append("Floaty: ");
+ appendVariableToMessage(message, f);
+ message.append("\n");
+ message.append("Value: ");
+ appendVariableToMessage(message, (float) value);
+ message.append("\n");
+ assertTrue("Floaty incorrectly doesn't accept value:\n" + message.toString(), false);
+ }
+ }
+
+ // Fail if Floaty f accepts value
+ private void shouldNotAccept(Target.Floaty f, double value) {
+ if (f.couldBe(value)) {
+ StringBuilder message = new StringBuilder();
+ message.append("Floaty: ");
+ appendVariableToMessage(message, f);
+ message.append("\n");
+ message.append("Value: ");
+ appendVariableToMessage(message, (float) value);
+ message.append("\n");
+ assertTrue("Floaty incorrectly accepts value:\n" + message.toString(), false);
+ }
+ }
+
+ // Test Target that accepts precise 1ulp error for floating values.
+ public void testFloat1Ulp() {
+ Target t = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, false);
+ t.setPrecision(1, 1);
+
+ Target.Floaty subnormalFloaty = t.new32(subnormalFloat);
+ Target.Floaty normalFloaty = t.new32(normalFloat1);
+
+ // for subnormal
+ shouldAccept(subnormalFloaty, (double) subnormalFloat);
+ shouldAccept(subnormalFloaty, (double) subnormalFloat + Math.ulp(subnormalFloat));
+ shouldAccept(subnormalFloaty, (double) subnormalFloat - Math.ulp(subnormalFloat));
+ shouldNotAccept(subnormalFloaty, (double) subnormalFloat + 2 * Math.ulp(subnormalFloat));
+ shouldNotAccept(subnormalFloaty, (double) subnormalFloat - 2 * Math.ulp(subnormalFloat));
+ shouldNotAccept(subnormalFloaty, (double) normalFloat1);
+
+ // for normalFloaty
+ shouldAccept(normalFloaty, (double) normalFloat1);
+ shouldAccept(normalFloaty, (double) normalFloat1 + Math.ulp(normalFloat1));
+ shouldAccept(normalFloaty, (double) normalFloat1 - Math.ulp(normalFloat1));
+ shouldNotAccept(normalFloaty, (double) normalFloat1 + 2 * Math.ulp(normalFloat1));
+ shouldNotAccept(normalFloaty, (double) normalFloat1 - 2 * Math.ulp(normalFloat1));
+ shouldNotAccept(normalFloaty, (double) subnormalFloat);
+ }
+
+ // Test Target that accepts precise 8192ulp error for floating values.
+ public void testFloat8192Ulp() {
+ Target t = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, false);
+ t.setPrecision(8192, 8192);
+
+ Target.Floaty subnormalFloaty = t.new32(subnormalFloat);
+ Target.Floaty normalFloaty = t.new32(normalFloat2);
+
+ // for subnormalFloaty
+ shouldAccept(subnormalFloaty, (double) subnormalFloat);
+ shouldAccept(subnormalFloaty, (double) subnormalFloat + 8192 * Math.ulp(subnormalFloat));
+ shouldAccept(subnormalFloaty, (double) subnormalFloat - 8192 * Math.ulp(subnormalFloat));
+ shouldNotAccept(subnormalFloaty, (double) subnormalFloat + 8193 * Math.ulp(subnormalFloat));
+ shouldNotAccept(subnormalFloaty, (double) subnormalFloat - 8193 * Math.ulp(subnormalFloat));
+ shouldNotAccept(subnormalFloaty, (double) normalFloat1);
+
+ // for normalFloaty
+ shouldAccept(normalFloaty, (double) normalFloat2);
+ shouldAccept(normalFloaty, (double) normalFloat2 + 8192 * Math.ulp(normalFloat2));
+ shouldAccept(normalFloaty, (double) normalFloat2 - 8192 * Math.ulp(normalFloat2));
+ shouldNotAccept(normalFloaty, (double) normalFloat2 + 8193 * Math.ulp(normalFloat2));
+ shouldNotAccept(normalFloaty, (double) normalFloat2 - 8193 * Math.ulp(normalFloat2));
+ shouldNotAccept(normalFloaty, (double) subnormalFloat);
+ }
+
+ // Test Target that accepts relaxed 1ulp error for floating values.
+ public void testFloat1UlpRelaxed() {
+ Target t = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, true);
+ t.setPrecision(1, 1);
+
+ Target.Floaty subnormalFloaty = t.new32(subnormalFloat);
+
+ // for subnormal
+ shouldAccept(subnormalFloaty, (double) subnormalFloat);
+ // In relaxed mode, Floaty uses the smallest normal as the ULP if ULP is subnormal.
+ shouldAccept(subnormalFloaty, (double) Float.MIN_NORMAL + Float.MIN_NORMAL);
+ shouldAccept(subnormalFloaty, (double) 0.f - Float.MIN_NORMAL);
+ shouldNotAccept(subnormalFloaty, (double) Float.MIN_NORMAL + 2 * Float.MIN_NORMAL);
+ shouldNotAccept(subnormalFloaty, (double) 0.f - 2 * Float.MIN_NORMAL);
+ shouldNotAccept(subnormalFloaty, (double) normalFloat1);
+ }
+
+ // Test Target that accepts relaxed 8192ulp error for floating values.
+ public void testFloat8192UlpRelaxed() {
+ Target t = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, true);
+ t.setPrecision(8192, 8192);
+
+ Target.Floaty subnormalFloaty = t.new32(subnormalFloat);
+
+ // for subnormalFloaty
+ shouldAccept(subnormalFloaty, (double) subnormalFloat);
+ // In relaxed mode, Floaty uses the smallest normal as the ULP if ULP is subnormal.
+ shouldAccept(subnormalFloaty, (double) Float.MIN_NORMAL + 8192 * Float.MIN_NORMAL);
+ shouldAccept(subnormalFloaty, (double) 0.f - 8192 * Float.MIN_NORMAL);
+ shouldNotAccept(subnormalFloaty, (double) Float.MIN_NORMAL + 8193 * Float.MIN_NORMAL);
+ shouldNotAccept(subnormalFloaty, (double) 0.f - 8193 * Float.MIN_NORMAL);
+ shouldNotAccept(subnormalFloaty, (double) normalFloat1);
+ }
+
+ // Test Target that accepts precise 1ulp error for double values.
+ public void testDouble1Ulp() {
+ Target t = new Target(Target.FunctionType.NORMAL, Target.ReturnType.DOUBLE, false);
+ t.setPrecision(1, 1);
+
+ Target.Floaty subnormalFloaty = t.new64(subnormalDouble);
+ Target.Floaty normalFloaty = t.new64(normalDouble);
+
+ // for subnormal
+ shouldAccept(subnormalFloaty, subnormalDouble);
+ shouldAccept(subnormalFloaty, subnormalDouble + Math.ulp(subnormalDouble));
+ shouldAccept(subnormalFloaty, subnormalDouble - Math.ulp(subnormalDouble));
+ shouldNotAccept(subnormalFloaty, subnormalDouble + 2 * Math.ulp(subnormalDouble));
+ shouldNotAccept(subnormalFloaty, subnormalDouble - 2 * Math.ulp(subnormalDouble));
+ shouldNotAccept(subnormalFloaty, normalDouble);
+
+ // for normalFloaty
+ shouldAccept(normalFloaty, normalDouble);
+ shouldAccept(normalFloaty, normalDouble + Math.ulp(normalDouble));
+ shouldAccept(normalFloaty, normalDouble - Math.ulp(normalDouble));
+ shouldNotAccept(normalFloaty, subnormalDouble + 2 * Math.ulp(normalDouble));
+ shouldNotAccept(normalFloaty, subnormalDouble - 2 * Math.ulp(normalDouble));
+ shouldNotAccept(normalFloaty, subnormalDouble);
+ }
+
+ // Test Target that accepts precise 8192ulp error for double values.
+ public void testDouble8192Ulp() {
+ Target t = new Target(Target.FunctionType.NORMAL, Target.ReturnType.DOUBLE, false);
+ t.setPrecision(8192, 8192);
+
+ Target.Floaty subnormalFloaty = t.new64(subnormalDouble);
+ Target.Floaty normalFloaty = t.new64(normalDouble);
+
+ // for subnormal
+ shouldAccept(subnormalFloaty, subnormalDouble);
+ shouldAccept(subnormalFloaty, subnormalDouble + 8192 * Math.ulp(subnormalDouble));
+ shouldAccept(subnormalFloaty, subnormalDouble - 8192 * Math.ulp(subnormalDouble));
+ shouldNotAccept(subnormalFloaty, subnormalDouble + 8193 * Math.ulp(subnormalDouble));
+ shouldNotAccept(subnormalFloaty, subnormalDouble - 8193 * Math.ulp(subnormalDouble));
+ shouldNotAccept(subnormalFloaty, normalDouble);
+
+ // for normalFloaty
+ shouldAccept(normalFloaty, normalDouble);
+ shouldAccept(normalFloaty, normalDouble + 8192 * Math.ulp(normalDouble));
+ shouldAccept(normalFloaty, normalDouble - 8192 * Math.ulp(normalDouble));
+ shouldNotAccept(normalFloaty, subnormalDouble + 8193 * Math.ulp(normalDouble));
+ shouldNotAccept(normalFloaty, subnormalDouble - 8193 * Math.ulp(normalDouble));
+ shouldNotAccept(normalFloaty, subnormalDouble);
+ }
+
+ // Test that range of allowed error is trimmed at the zero boundary. This function tests both
+ // float and double Targets.
+ public void testRangeDoesNotAcrossZero() {
+ Target t;
+ Target.Floaty floaty;
+
+ t = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, false);
+ t.setPrecision(4, 4);
+
+ floaty = t.new32(Float.MIN_VALUE);
+ shouldAccept(floaty, (double) Float.MIN_VALUE);
+ shouldAccept(floaty, (double) Float.MIN_VALUE + 4 * Float.MIN_VALUE);
+ shouldAccept(floaty, (double) 0.f);
+ shouldNotAccept(floaty, (double) 0.f - Float.MIN_VALUE);
+
+ floaty = t.new32(-Float.MIN_VALUE);
+ shouldAccept(floaty, (double) -Float.MIN_VALUE);
+ shouldAccept(floaty, (double) -Float.MIN_VALUE - 4 * Float.MIN_VALUE);
+ shouldAccept(floaty, (double) 0.f);
+ shouldNotAccept(floaty, (double) 0.f + Float.MIN_VALUE);
+
+ t = new Target(Target.FunctionType.NORMAL, Target.ReturnType.DOUBLE, false);
+ t.setPrecision(4, 4);
+
+ floaty = t.new64(Double.MIN_VALUE);
+ shouldAccept(floaty, Double.MIN_VALUE);
+ shouldAccept(floaty, Double.MIN_VALUE + 4 * Double.MIN_VALUE);
+ shouldAccept(floaty, 0.f);
+ shouldNotAccept(floaty, 0.f - Double.MIN_VALUE);
+
+ floaty = t.new64(-Double.MIN_VALUE);
+ shouldAccept(floaty, -Double.MIN_VALUE);
+ shouldAccept(floaty, -Double.MIN_VALUE - 4 * Double.MIN_VALUE);
+ shouldAccept(floaty, 0.f);
+ shouldNotAccept(floaty, 0.f + Double.MIN_VALUE);
+ }
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/Target.java b/tests/tests/renderscript/src/android/renderscript/cts/Target.java
index c423792..556c95f 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/Target.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/Target.java
@@ -28,6 +28,31 @@
*/
public class Target {
/**
+ * Broad classification of the type of function being tested.
+ */
+ public enum FunctionType {
+ NORMAL,
+ HALF,
+ NATIVE,
+ FAST,
+ }
+
+ /**
+ * Floating point precision of the result of the function being tested.
+ */
+ public enum ReturnType {
+ HALF,
+ FLOAT,
+ DOUBLE
+ }
+
+ /* The classification of the function being tested */
+ private FunctionType mFunctionType;
+
+ /* The floating point precision of the result of the function being tested */
+ private ReturnType mReturnType;
+
+ /*
* In relaxed precision mode, we allow:
* - less precision in the computation
* - using only normalized values
@@ -36,18 +61,8 @@
*/
private boolean mIsRelaxedPrecision;
- /*
- * The following two fields are set just before the expected values are computed for a specific
- * RenderScript function. Hence, we can't use one instance of this class to test two APIs
- * in parallel. The generated Test*.java code uses one instance of Target per test, so we're
- * safe.
- */
-
- /**
- * For native, we allow the same things as relaxed precision, plus:
- * - operations don't have to return +/- infinity
- */
- private boolean mIsNative;
+ /* If false, zero or the closest normal value are also accepted for subnormal results. */
+ private boolean mHandleSubnormal;
/**
* How much we'll allow the values tested to diverge from the values
@@ -55,16 +70,30 @@
*/
private int mUlpFactor;
- Target(boolean relaxed) {
+ Target(FunctionType functionType, ReturnType returnType, boolean relaxed) {
+ mFunctionType = functionType;
+ mReturnType = returnType;
mIsRelaxedPrecision = relaxed;
+
+ if (mReturnType == ReturnType.HALF) {
+ // Subnormal numbers need not be handled for HALF.
+ mHandleSubnormal = false;
+ } else if (mReturnType == ReturnType.FLOAT) {
+ // NORMAL functions, when in non-relaxed mode, need to handle subnormals. Subnormals
+ // need not be handled in any other mode.
+ mHandleSubnormal = (mFunctionType == FunctionType.NORMAL) && !relaxed;
+ } else if (mReturnType == ReturnType.DOUBLE) {
+ // We only have NORMAL functions for DOUBLE and they need to handle subnormal values.
+ assert(mFunctionType == FunctionType.NORMAL);
+ mHandleSubnormal = true;
+ }
}
/**
* Sets whether we are testing a native_* function and how many ulp we allow
* for full and relaxed precision.
*/
- void setPrecision(int fullUlpFactor, int relaxedUlpFactor, boolean isNative) {
- mIsNative = isNative;
+ void setPrecision(int fullUlpFactor, int relaxedUlpFactor) {
mUlpFactor = mIsRelaxedPrecision ? relaxedUlpFactor : fullUlpFactor;
}
@@ -287,7 +316,7 @@
// For relaxed mode, we don't require support of subnormal values.
// If we have a subnormal value, we'll allow both the normalized value and zero,
// to cover the two ways this small value might be handled.
- if (mIsRelaxedPrecision || mIsNative) {
+ if (!mHandleSubnormal) {
if (IsSubnormal(f)) {
updateMinAndMax(0.f);
updateMinAndMax(smallestNormal(f));
@@ -349,7 +378,7 @@
mMinValue = newValue;
}
// If subnormal, also allow the normalized value if it's smaller.
- if ((mIsRelaxedPrecision || mIsNative) && IsSubnormal(mMinValue)) {
+ if (!mHandleSubnormal && IsSubnormal(mMinValue)) {
if (mMinValue < 0) {
mMinValue = smallestNormal(-1.0f);
} else {
@@ -384,7 +413,7 @@
mMaxValue = newValue;
}
// If subnormal, also allow the normalized value if it's smaller.
- if ((mIsRelaxedPrecision || mIsNative) && IsSubnormal(mMaxValue)) {
+ if (!mHandleSubnormal && IsSubnormal(mMaxValue)) {
if (mMaxValue > 0) {
mMaxValue = smallestNormal(1.0f);
} else {
@@ -423,7 +452,7 @@
} else {
u = Math.ulp(mMaxValue);
}
- if (mIsRelaxedPrecision || mIsNative) {
+ if (!mHandleSubnormal) {
u = Math.max(u, smallestNormal(1.f));
}
return u;
@@ -437,7 +466,7 @@
} else {
u = -Math.ulp(mMinValue);
}
- if (mIsRelaxedPrecision || mIsNative) {
+ if (!mHandleSubnormal) {
u = Math.min(u, smallestNormal(-1.f));
}
return u;
@@ -469,7 +498,7 @@
}
// For native, we don't require returning +/- infinity. If that's what we expect,
// allow all answers.
- if (mIsNative) {
+ if (mFunctionType == FunctionType.NATIVE) {
if (mMinValue == Double.NEGATIVE_INFINITY &&
mMaxValue == Double.NEGATIVE_INFINITY) {
return true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAbs.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAbs.java
index ecc5319..0ab7c31 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAbs.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAbs.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAcos.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAcos.java
index a08c9b0..aa22c0a 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAcos.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAcos.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAcos(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAcos(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAcos(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAcos(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAcosh.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAcosh.java
index 743da9a..e5e3766 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAcosh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAcosh.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAcosh(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAcosh(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAcosh(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAcosh(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAcospi.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAcospi.java
index 4bc0f9a..2287fc7 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAcospi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAcospi.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAcospi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAcospi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAcospi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAcospi(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAsin.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAsin.java
index 6a49d0a..53ec3c5 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAsin.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAsin.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAsin(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAsin(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAsin(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAsin(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAsinh.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAsinh.java
index 701d03a..d14dc53 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAsinh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAsinh.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAsinh(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAsinh(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAsinh(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAsinh(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAsinpi.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAsinpi.java
index 3c46013..8f4a825 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAsinpi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAsinpi.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAsinpi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAsinpi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAsinpi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAsinpi(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtan.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtan.java
index 84d2bb1..1bbc4dc 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtan.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtan.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAtan(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAtan(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAtan(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAtan(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtan2.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtan2.java
index cc33c23..6ea47d5 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtan2.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtan2.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -82,7 +83,7 @@
args.inNumerator = arrayInNumerator[i];
args.inDenominator = arrayInDenominator[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAtan2(args, target);
// Validate the outputs.
boolean valid = true;
@@ -161,7 +162,7 @@
args.inNumerator = arrayInNumerator[i * 2 + j];
args.inDenominator = arrayInDenominator[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAtan2(args, target);
// Validate the outputs.
boolean valid = true;
@@ -240,7 +241,7 @@
args.inNumerator = arrayInNumerator[i * 4 + j];
args.inDenominator = arrayInDenominator[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAtan2(args, target);
// Validate the outputs.
boolean valid = true;
@@ -319,7 +320,7 @@
args.inNumerator = arrayInNumerator[i * 4 + j];
args.inDenominator = arrayInDenominator[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAtan2(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtan2pi.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtan2pi.java
index a921273..6068cea 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtan2pi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtan2pi.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -82,7 +83,7 @@
args.inNumerator = arrayInNumerator[i];
args.inDenominator = arrayInDenominator[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAtan2pi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -161,7 +162,7 @@
args.inNumerator = arrayInNumerator[i * 2 + j];
args.inDenominator = arrayInDenominator[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAtan2pi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -240,7 +241,7 @@
args.inNumerator = arrayInNumerator[i * 4 + j];
args.inDenominator = arrayInDenominator[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAtan2pi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -319,7 +320,7 @@
args.inNumerator = arrayInNumerator[i * 4 + j];
args.inDenominator = arrayInDenominator[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAtan2pi(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtanh.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtanh.java
index a9617e7..feebf49 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtanh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtanh.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAtanh(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAtanh(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAtanh(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAtanh(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtanpi.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtanpi.java
index 44e5dba..d38e400 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtanpi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtanpi.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAtanpi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAtanpi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAtanpi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeAtanpi(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCbrt.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCbrt.java
index 1e3515a..bfd98e6 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCbrt.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCbrt.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeCbrt(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeCbrt(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeCbrt(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeCbrt(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCeil.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCeil.java
index 3dbbc15..e5e0f6b 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCeil.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCeil.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeCeil(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeCeil(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeCeil(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeCeil(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestClamp.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestClamp.java
index 7028410..8f9b5e4 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestClamp.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestClamp.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -91,7 +92,7 @@
args.inMinValue = arrayInMinValue[i];
args.inMaxValue = arrayInMaxValue[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeClamp(args, target);
// Validate the outputs.
boolean valid = true;
@@ -181,7 +182,7 @@
args.inMinValue = arrayInMinValue[i * 2 + j];
args.inMaxValue = arrayInMaxValue[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeClamp(args, target);
// Validate the outputs.
boolean valid = true;
@@ -271,7 +272,7 @@
args.inMinValue = arrayInMinValue[i * 4 + j];
args.inMaxValue = arrayInMaxValue[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeClamp(args, target);
// Validate the outputs.
boolean valid = true;
@@ -361,7 +362,7 @@
args.inMinValue = arrayInMinValue[i * 4 + j];
args.inMaxValue = arrayInMaxValue[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeClamp(args, target);
// Validate the outputs.
boolean valid = true;
@@ -451,7 +452,7 @@
args.inMinValue = arrayInMinValue[i];
args.inMaxValue = arrayInMaxValue[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeClamp(args, target);
// Validate the outputs.
boolean valid = true;
@@ -541,7 +542,7 @@
args.inMinValue = arrayInMinValue[i];
args.inMaxValue = arrayInMaxValue[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeClamp(args, target);
// Validate the outputs.
boolean valid = true;
@@ -631,7 +632,7 @@
args.inMinValue = arrayInMinValue[i];
args.inMaxValue = arrayInMaxValue[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeClamp(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestClz.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestClz.java
index c29e3ec..fac24c9 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestClz.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestClz.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestConvert.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestConvert.java
index ae72af6..464200d 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestConvert.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestConvert.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -286,7 +287,7 @@
ArgumentsCharFloat args = new ArgumentsCharFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -355,7 +356,7 @@
ArgumentsCharFloat args = new ArgumentsCharFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -424,7 +425,7 @@
ArgumentsCharFloat args = new ArgumentsCharFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -498,7 +499,7 @@
ArgumentsUcharFloat args = new ArgumentsUcharFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -567,7 +568,7 @@
ArgumentsUcharFloat args = new ArgumentsUcharFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -636,7 +637,7 @@
ArgumentsUcharFloat args = new ArgumentsUcharFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -710,7 +711,7 @@
ArgumentsShortFloat args = new ArgumentsShortFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -779,7 +780,7 @@
ArgumentsShortFloat args = new ArgumentsShortFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -848,7 +849,7 @@
ArgumentsShortFloat args = new ArgumentsShortFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -922,7 +923,7 @@
ArgumentsUshortFloat args = new ArgumentsUshortFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -991,7 +992,7 @@
ArgumentsUshortFloat args = new ArgumentsUshortFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -1060,7 +1061,7 @@
ArgumentsUshortFloat args = new ArgumentsUshortFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -1134,7 +1135,7 @@
ArgumentsIntFloat args = new ArgumentsIntFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -1203,7 +1204,7 @@
ArgumentsIntFloat args = new ArgumentsIntFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -1272,7 +1273,7 @@
ArgumentsIntFloat args = new ArgumentsIntFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -1346,7 +1347,7 @@
ArgumentsUintFloat args = new ArgumentsUintFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -1415,7 +1416,7 @@
ArgumentsUintFloat args = new ArgumentsUintFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -1484,7 +1485,7 @@
ArgumentsUintFloat args = new ArgumentsUintFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -10336,7 +10337,7 @@
ArgumentsDoubleDouble args = new ArgumentsDoubleDouble();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.DOUBLE, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -10405,7 +10406,7 @@
ArgumentsDoubleDouble args = new ArgumentsDoubleDouble();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.DOUBLE, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -10474,7 +10475,7 @@
ArgumentsDoubleDouble args = new ArgumentsDoubleDouble();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.DOUBLE, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -10548,7 +10549,7 @@
ArgumentsLongDouble args = new ArgumentsLongDouble();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.DOUBLE, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -10617,7 +10618,7 @@
ArgumentsLongDouble args = new ArgumentsLongDouble();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.DOUBLE, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -10686,7 +10687,7 @@
ArgumentsLongDouble args = new ArgumentsLongDouble();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.DOUBLE, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -10760,7 +10761,7 @@
ArgumentsUlongDouble args = new ArgumentsUlongDouble();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.DOUBLE, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -10829,7 +10830,7 @@
ArgumentsUlongDouble args = new ArgumentsUlongDouble();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.DOUBLE, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -10898,7 +10899,7 @@
ArgumentsUlongDouble args = new ArgumentsUlongDouble();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.DOUBLE, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -12226,7 +12227,7 @@
ArgumentsDoubleFloat args = new ArgumentsDoubleFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -12295,7 +12296,7 @@
ArgumentsDoubleFloat args = new ArgumentsDoubleFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -12364,7 +12365,7 @@
ArgumentsDoubleFloat args = new ArgumentsDoubleFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -12438,7 +12439,7 @@
ArgumentsLongFloat args = new ArgumentsLongFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -12507,7 +12508,7 @@
ArgumentsLongFloat args = new ArgumentsLongFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -12576,7 +12577,7 @@
ArgumentsLongFloat args = new ArgumentsLongFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -12650,7 +12651,7 @@
ArgumentsUlongFloat args = new ArgumentsUlongFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -12719,7 +12720,7 @@
ArgumentsUlongFloat args = new ArgumentsUlongFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -12788,7 +12789,7 @@
ArgumentsUlongFloat args = new ArgumentsUlongFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -16624,7 +16625,7 @@
ArgumentsFloatDouble args = new ArgumentsFloatDouble();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.DOUBLE, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -16693,7 +16694,7 @@
ArgumentsFloatDouble args = new ArgumentsFloatDouble();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.DOUBLE, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -16762,7 +16763,7 @@
ArgumentsFloatDouble args = new ArgumentsFloatDouble();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.DOUBLE, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -16836,7 +16837,7 @@
ArgumentsCharDouble args = new ArgumentsCharDouble();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.DOUBLE, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -16905,7 +16906,7 @@
ArgumentsCharDouble args = new ArgumentsCharDouble();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.DOUBLE, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -16974,7 +16975,7 @@
ArgumentsCharDouble args = new ArgumentsCharDouble();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.DOUBLE, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -17048,7 +17049,7 @@
ArgumentsUcharDouble args = new ArgumentsUcharDouble();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.DOUBLE, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -17117,7 +17118,7 @@
ArgumentsUcharDouble args = new ArgumentsUcharDouble();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.DOUBLE, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -17186,7 +17187,7 @@
ArgumentsUcharDouble args = new ArgumentsUcharDouble();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.DOUBLE, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -17260,7 +17261,7 @@
ArgumentsShortDouble args = new ArgumentsShortDouble();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.DOUBLE, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -17329,7 +17330,7 @@
ArgumentsShortDouble args = new ArgumentsShortDouble();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.DOUBLE, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -17398,7 +17399,7 @@
ArgumentsShortDouble args = new ArgumentsShortDouble();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.DOUBLE, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -17472,7 +17473,7 @@
ArgumentsUshortDouble args = new ArgumentsUshortDouble();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.DOUBLE, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -17541,7 +17542,7 @@
ArgumentsUshortDouble args = new ArgumentsUshortDouble();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.DOUBLE, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -17610,7 +17611,7 @@
ArgumentsUshortDouble args = new ArgumentsUshortDouble();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.DOUBLE, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -17684,7 +17685,7 @@
ArgumentsIntDouble args = new ArgumentsIntDouble();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.DOUBLE, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -17753,7 +17754,7 @@
ArgumentsIntDouble args = new ArgumentsIntDouble();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.DOUBLE, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -17822,7 +17823,7 @@
ArgumentsIntDouble args = new ArgumentsIntDouble();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.DOUBLE, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -17896,7 +17897,7 @@
ArgumentsUintDouble args = new ArgumentsUintDouble();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.DOUBLE, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -17965,7 +17966,7 @@
ArgumentsUintDouble args = new ArgumentsUintDouble();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.DOUBLE, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
@@ -18034,7 +18035,7 @@
ArgumentsUintDouble args = new ArgumentsUintDouble();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.DOUBLE, relaxed);
CoreMathVerifier.computeConvert(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCopysign.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCopysign.java
index d4abf83..be650c5 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCopysign.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCopysign.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -82,7 +83,7 @@
args.inMagnitudeValue = arrayInMagnitudeValue[i];
args.inSignValue = arrayInSignValue[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeCopysign(args, target);
// Validate the outputs.
boolean valid = true;
@@ -161,7 +162,7 @@
args.inMagnitudeValue = arrayInMagnitudeValue[i * 2 + j];
args.inSignValue = arrayInSignValue[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeCopysign(args, target);
// Validate the outputs.
boolean valid = true;
@@ -240,7 +241,7 @@
args.inMagnitudeValue = arrayInMagnitudeValue[i * 4 + j];
args.inSignValue = arrayInSignValue[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeCopysign(args, target);
// Validate the outputs.
boolean valid = true;
@@ -319,7 +320,7 @@
args.inMagnitudeValue = arrayInMagnitudeValue[i * 4 + j];
args.inSignValue = arrayInSignValue[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeCopysign(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCos.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCos.java
index 8369ec9..4b7751b 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCos.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCos.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeCos(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeCos(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeCos(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeCos(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCosh.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCosh.java
index d156408..0740285 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCosh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCosh.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeCosh(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeCosh(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeCosh(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeCosh(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCospi.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCospi.java
index 2e28c03..dab5d2f 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCospi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCospi.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeCospi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeCospi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeCospi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeCospi(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCross.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCross.java
index 5062f62..31927b1 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCross.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCross.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -88,7 +89,7 @@
for (int j = 0; j < 3 ; j++) {
args.inRightVector[j] = arrayInRightVector[i * 4 + j];
}
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeCross(args, target);
// Compare the expected outputs to the actual values returned by RS.
@@ -179,7 +180,7 @@
for (int j = 0; j < 4 ; j++) {
args.inRightVector[j] = arrayInRightVector[i * 4 + j];
}
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeCross(args, target);
// Compare the expected outputs to the actual values returned by RS.
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestDegrees.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestDegrees.java
index cb90de3..c5928b7 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestDegrees.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestDegrees.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeDegrees(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeDegrees(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeDegrees(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeDegrees(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestDistance.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestDistance.java
index 452b25c..c527040 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestDistance.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestDistance.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -81,7 +82,7 @@
// Fill args with the input values
args.inLeftVector = arrayInLeftVector[i];
args.inRightVector = arrayInRightVector[i];
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeDistance(args, target);
// Compare the expected outputs to the actual values returned by RS.
@@ -169,7 +170,7 @@
for (int j = 0; j < 2 ; j++) {
args.inRightVector[j] = arrayInRightVector[i * 2 + j];
}
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeDistance(args, target);
// Compare the expected outputs to the actual values returned by RS.
@@ -255,7 +256,7 @@
for (int j = 0; j < 3 ; j++) {
args.inRightVector[j] = arrayInRightVector[i * 4 + j];
}
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeDistance(args, target);
// Compare the expected outputs to the actual values returned by RS.
@@ -341,7 +342,7 @@
for (int j = 0; j < 4 ; j++) {
args.inRightVector[j] = arrayInRightVector[i * 4 + j];
}
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeDistance(args, target);
// Compare the expected outputs to the actual values returned by RS.
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestDot.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestDot.java
index 2b92390..2385856 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestDot.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestDot.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -81,7 +82,7 @@
// Fill args with the input values
args.inLeftVector = arrayInLeftVector[i];
args.inRightVector = arrayInRightVector[i];
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeDot(args, target);
// Compare the expected outputs to the actual values returned by RS.
@@ -169,7 +170,7 @@
for (int j = 0; j < 2 ; j++) {
args.inRightVector[j] = arrayInRightVector[i * 2 + j];
}
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeDot(args, target);
// Compare the expected outputs to the actual values returned by RS.
@@ -255,7 +256,7 @@
for (int j = 0; j < 3 ; j++) {
args.inRightVector[j] = arrayInRightVector[i * 4 + j];
}
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeDot(args, target);
// Compare the expected outputs to the actual values returned by RS.
@@ -341,7 +342,7 @@
for (int j = 0; j < 4 ; j++) {
args.inRightVector[j] = arrayInRightVector[i * 4 + j];
}
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeDot(args, target);
// Compare the expected outputs to the actual values returned by RS.
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestErf.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestErf.java
index 0147b325..b36c5e5 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestErf.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestErf.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeErf(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeErf(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeErf(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeErf(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestErfc.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestErfc.java
index 9acd955..8b73a82 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestErfc.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestErfc.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeErfc(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeErfc(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeErfc(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeErfc(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestExp.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestExp.java
index 2b46ee4..556331d 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestExp.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestExp.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeExp(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeExp(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeExp(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeExp(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestExp10.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestExp10.java
index f1e73b7d..12a1f8a 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestExp10.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestExp10.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeExp10(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeExp10(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeExp10(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeExp10(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestExp2.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestExp2.java
index ac08d0f..a8d7520 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestExp2.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestExp2.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeExp2(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeExp2(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeExp2(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeExp2(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestExpm1.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestExpm1.java
index 0f0ed836..2b72471 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestExpm1.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestExpm1.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeExpm1(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeExpm1(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeExpm1(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeExpm1(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFabs.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFabs.java
index 698c198..3421871 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFabs.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFabs.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFabs(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFabs(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFabs(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFabs(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFastDistance.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFastDistance.java
index 40436d5..4c7a065 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFastDistance.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFastDistance.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -81,7 +82,7 @@
// Fill args with the input values
args.inLeftVector = arrayInLeftVector[i];
args.inRightVector = arrayInRightVector[i];
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.FAST, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFastDistance(args, target);
// Compare the expected outputs to the actual values returned by RS.
@@ -169,7 +170,7 @@
for (int j = 0; j < 2 ; j++) {
args.inRightVector[j] = arrayInRightVector[i * 2 + j];
}
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.FAST, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFastDistance(args, target);
// Compare the expected outputs to the actual values returned by RS.
@@ -255,7 +256,7 @@
for (int j = 0; j < 3 ; j++) {
args.inRightVector[j] = arrayInRightVector[i * 4 + j];
}
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.FAST, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFastDistance(args, target);
// Compare the expected outputs to the actual values returned by RS.
@@ -341,7 +342,7 @@
for (int j = 0; j < 4 ; j++) {
args.inRightVector[j] = arrayInRightVector[i * 4 + j];
}
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.FAST, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFastDistance(args, target);
// Compare the expected outputs to the actual values returned by RS.
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFastLength.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFastLength.java
index a6ea42e..e2cb9a9 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFastLength.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFastLength.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -73,7 +74,7 @@
// Create the appropriate sized arrays in args
// Fill args with the input values
args.inV = arrayInV[i];
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.FAST, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFastLength(args, target);
// Compare the expected outputs to the actual values returned by RS.
@@ -147,7 +148,7 @@
for (int j = 0; j < 2 ; j++) {
args.inV[j] = arrayInV[i * 2 + j];
}
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.FAST, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFastLength(args, target);
// Compare the expected outputs to the actual values returned by RS.
@@ -218,7 +219,7 @@
for (int j = 0; j < 3 ; j++) {
args.inV[j] = arrayInV[i * 4 + j];
}
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.FAST, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFastLength(args, target);
// Compare the expected outputs to the actual values returned by RS.
@@ -289,7 +290,7 @@
for (int j = 0; j < 4 ; j++) {
args.inV[j] = arrayInV[i * 4 + j];
}
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.FAST, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFastLength(args, target);
// Compare the expected outputs to the actual values returned by RS.
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFastNormalize.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFastNormalize.java
index 8bc5c8c..31193e7 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFastNormalize.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFastNormalize.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -73,7 +74,7 @@
// Create the appropriate sized arrays in args
// Fill args with the input values
args.inV = arrayInV[i];
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.FAST, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFastNormalize(args, target);
// Compare the expected outputs to the actual values returned by RS.
@@ -148,7 +149,7 @@
for (int j = 0; j < 2 ; j++) {
args.inV[j] = arrayInV[i * 2 + j];
}
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.FAST, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFastNormalize(args, target);
// Compare the expected outputs to the actual values returned by RS.
@@ -224,7 +225,7 @@
for (int j = 0; j < 3 ; j++) {
args.inV[j] = arrayInV[i * 4 + j];
}
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.FAST, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFastNormalize(args, target);
// Compare the expected outputs to the actual values returned by RS.
@@ -300,7 +301,7 @@
for (int j = 0; j < 4 ; j++) {
args.inV[j] = arrayInV[i * 4 + j];
}
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.FAST, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFastNormalize(args, target);
// Compare the expected outputs to the actual values returned by RS.
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFdim.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFdim.java
index 660eac2..1dea48f 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFdim.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFdim.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -82,7 +83,7 @@
args.inA = arrayInA[i];
args.inB = arrayInB[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFdim(args, target);
// Validate the outputs.
boolean valid = true;
@@ -161,7 +162,7 @@
args.inA = arrayInA[i * 2 + j];
args.inB = arrayInB[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFdim(args, target);
// Validate the outputs.
boolean valid = true;
@@ -240,7 +241,7 @@
args.inA = arrayInA[i * 4 + j];
args.inB = arrayInB[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFdim(args, target);
// Validate the outputs.
boolean valid = true;
@@ -319,7 +320,7 @@
args.inA = arrayInA[i * 4 + j];
args.inB = arrayInB[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFdim(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFloor.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFloor.java
index 962858b..96c70b9 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFloor.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFloor.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFloor(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFloor(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFloor(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFloor(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFma.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFma.java
index f6df612..cd02537 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFma.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFma.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -90,7 +91,7 @@
args.inMultiplicand2 = arrayInMultiplicand2[i];
args.inOffset = arrayInOffset[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFma(args, target);
// Validate the outputs.
boolean valid = true;
@@ -179,7 +180,7 @@
args.inMultiplicand2 = arrayInMultiplicand2[i * 2 + j];
args.inOffset = arrayInOffset[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFma(args, target);
// Validate the outputs.
boolean valid = true;
@@ -268,7 +269,7 @@
args.inMultiplicand2 = arrayInMultiplicand2[i * 4 + j];
args.inOffset = arrayInOffset[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFma(args, target);
// Validate the outputs.
boolean valid = true;
@@ -357,7 +358,7 @@
args.inMultiplicand2 = arrayInMultiplicand2[i * 4 + j];
args.inOffset = arrayInOffset[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFma(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFmax.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFmax.java
index 07453c1..5b8d11e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFmax.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFmax.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -82,7 +83,7 @@
args.inA = arrayInA[i];
args.inB = arrayInB[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFmax(args, target);
// Validate the outputs.
boolean valid = true;
@@ -161,7 +162,7 @@
args.inA = arrayInA[i * 2 + j];
args.inB = arrayInB[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFmax(args, target);
// Validate the outputs.
boolean valid = true;
@@ -240,7 +241,7 @@
args.inA = arrayInA[i * 4 + j];
args.inB = arrayInB[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFmax(args, target);
// Validate the outputs.
boolean valid = true;
@@ -319,7 +320,7 @@
args.inA = arrayInA[i * 4 + j];
args.inB = arrayInB[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFmax(args, target);
// Validate the outputs.
boolean valid = true;
@@ -398,7 +399,7 @@
args.inA = arrayInA[i * 2 + j];
args.inB = arrayInB[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFmax(args, target);
// Validate the outputs.
boolean valid = true;
@@ -477,7 +478,7 @@
args.inA = arrayInA[i * 4 + j];
args.inB = arrayInB[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFmax(args, target);
// Validate the outputs.
boolean valid = true;
@@ -556,7 +557,7 @@
args.inA = arrayInA[i * 4 + j];
args.inB = arrayInB[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFmax(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFmin.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFmin.java
index 9d67357..7ce9ce6 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFmin.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFmin.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -82,7 +83,7 @@
args.inA = arrayInA[i];
args.inB = arrayInB[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFmin(args, target);
// Validate the outputs.
boolean valid = true;
@@ -161,7 +162,7 @@
args.inA = arrayInA[i * 2 + j];
args.inB = arrayInB[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFmin(args, target);
// Validate the outputs.
boolean valid = true;
@@ -240,7 +241,7 @@
args.inA = arrayInA[i * 4 + j];
args.inB = arrayInB[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFmin(args, target);
// Validate the outputs.
boolean valid = true;
@@ -319,7 +320,7 @@
args.inA = arrayInA[i * 4 + j];
args.inB = arrayInB[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFmin(args, target);
// Validate the outputs.
boolean valid = true;
@@ -398,7 +399,7 @@
args.inA = arrayInA[i * 2 + j];
args.inB = arrayInB[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFmin(args, target);
// Validate the outputs.
boolean valid = true;
@@ -477,7 +478,7 @@
args.inA = arrayInA[i * 4 + j];
args.inB = arrayInB[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFmin(args, target);
// Validate the outputs.
boolean valid = true;
@@ -556,7 +557,7 @@
args.inA = arrayInA[i * 4 + j];
args.inB = arrayInB[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFmin(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFmod.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFmod.java
index 10b6781..cdbd1ec 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFmod.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFmod.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -82,7 +83,7 @@
args.inNumerator = arrayInNumerator[i];
args.inDenominator = arrayInDenominator[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFmod(args, target);
// Validate the outputs.
boolean valid = true;
@@ -161,7 +162,7 @@
args.inNumerator = arrayInNumerator[i * 2 + j];
args.inDenominator = arrayInDenominator[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFmod(args, target);
// Validate the outputs.
boolean valid = true;
@@ -240,7 +241,7 @@
args.inNumerator = arrayInNumerator[i * 4 + j];
args.inDenominator = arrayInDenominator[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFmod(args, target);
// Validate the outputs.
boolean valid = true;
@@ -319,7 +320,7 @@
args.inNumerator = arrayInNumerator[i * 4 + j];
args.inDenominator = arrayInDenominator[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFmod(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFract.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFract.java
index fc1117b..4040b43 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFract.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFract.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -82,7 +83,7 @@
ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFract(args, target);
// Validate the outputs.
boolean valid = true;
@@ -170,7 +171,7 @@
ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFract(args, target);
// Validate the outputs.
boolean valid = true;
@@ -258,7 +259,7 @@
ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFract(args, target);
// Validate the outputs.
boolean valid = true;
@@ -346,7 +347,7 @@
ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFract(args, target);
// Validate the outputs.
boolean valid = true;
@@ -432,7 +433,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFract(args, target);
// Validate the outputs.
boolean valid = true;
@@ -501,7 +502,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFract(args, target);
// Validate the outputs.
boolean valid = true;
@@ -570,7 +571,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFract(args, target);
// Validate the outputs.
boolean valid = true;
@@ -639,7 +640,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFract(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFrexp.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFrexp.java
index 0716dff..c4f9c33 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFrexp.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFrexp.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -82,7 +83,7 @@
ArgumentsFloatIntFloat args = new ArgumentsFloatIntFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFrexp(args, target);
// Validate the outputs.
boolean valid = true;
@@ -170,7 +171,7 @@
ArgumentsFloatIntFloat args = new ArgumentsFloatIntFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFrexp(args, target);
// Validate the outputs.
boolean valid = true;
@@ -258,7 +259,7 @@
ArgumentsFloatIntFloat args = new ArgumentsFloatIntFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFrexp(args, target);
// Validate the outputs.
boolean valid = true;
@@ -346,7 +347,7 @@
ArgumentsFloatIntFloat args = new ArgumentsFloatIntFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeFrexp(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestHalfRecip.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestHalfRecip.java
index 256ebb4..f60f372 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestHalfRecip.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestHalfRecip.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.HALF, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeHalfRecip(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.HALF, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeHalfRecip(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.HALF, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeHalfRecip(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.HALF, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeHalfRecip(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestHalfRsqrt.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestHalfRsqrt.java
index 6ac7aff..072ba59 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestHalfRsqrt.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestHalfRsqrt.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.HALF, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeHalfRsqrt(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.HALF, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeHalfRsqrt(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.HALF, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeHalfRsqrt(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.HALF, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeHalfRsqrt(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestHalfSqrt.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestHalfSqrt.java
index 9700a02..04e191e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestHalfSqrt.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestHalfSqrt.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.HALF, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeHalfSqrt(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.HALF, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeHalfSqrt(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.HALF, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeHalfSqrt(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.HALF, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeHalfSqrt(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestHypot.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestHypot.java
index 1dff70e..e0144b8 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestHypot.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestHypot.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -82,7 +83,7 @@
args.inA = arrayInA[i];
args.inB = arrayInB[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeHypot(args, target);
// Validate the outputs.
boolean valid = true;
@@ -161,7 +162,7 @@
args.inA = arrayInA[i * 2 + j];
args.inB = arrayInB[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeHypot(args, target);
// Validate the outputs.
boolean valid = true;
@@ -240,7 +241,7 @@
args.inA = arrayInA[i * 4 + j];
args.inB = arrayInB[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeHypot(args, target);
// Validate the outputs.
boolean valid = true;
@@ -319,7 +320,7 @@
args.inA = arrayInA[i * 4 + j];
args.inB = arrayInB[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeHypot(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestIlogb.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestIlogb.java
index 61a417c..329a759 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestIlogb.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestIlogb.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLdexp.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLdexp.java
index 635e6db..2bcc552 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLdexp.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLdexp.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -82,7 +83,7 @@
args.inMantissa = arrayInMantissa[i];
args.inExponent = arrayInExponent[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeLdexp(args, target);
// Validate the outputs.
boolean valid = true;
@@ -161,7 +162,7 @@
args.inMantissa = arrayInMantissa[i * 2 + j];
args.inExponent = arrayInExponent[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeLdexp(args, target);
// Validate the outputs.
boolean valid = true;
@@ -240,7 +241,7 @@
args.inMantissa = arrayInMantissa[i * 4 + j];
args.inExponent = arrayInExponent[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeLdexp(args, target);
// Validate the outputs.
boolean valid = true;
@@ -319,7 +320,7 @@
args.inMantissa = arrayInMantissa[i * 4 + j];
args.inExponent = arrayInExponent[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeLdexp(args, target);
// Validate the outputs.
boolean valid = true;
@@ -398,7 +399,7 @@
args.inMantissa = arrayInMantissa[i * 2 + j];
args.inExponent = arrayInExponent[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeLdexp(args, target);
// Validate the outputs.
boolean valid = true;
@@ -477,7 +478,7 @@
args.inMantissa = arrayInMantissa[i * 4 + j];
args.inExponent = arrayInExponent[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeLdexp(args, target);
// Validate the outputs.
boolean valid = true;
@@ -556,7 +557,7 @@
args.inMantissa = arrayInMantissa[i * 4 + j];
args.inExponent = arrayInExponent[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeLdexp(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLength.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLength.java
index 4beb4db..db9c4c0 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLength.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLength.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -73,7 +74,7 @@
// Create the appropriate sized arrays in args
// Fill args with the input values
args.inV = arrayInV[i];
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeLength(args, target);
// Compare the expected outputs to the actual values returned by RS.
@@ -147,7 +148,7 @@
for (int j = 0; j < 2 ; j++) {
args.inV[j] = arrayInV[i * 2 + j];
}
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeLength(args, target);
// Compare the expected outputs to the actual values returned by RS.
@@ -218,7 +219,7 @@
for (int j = 0; j < 3 ; j++) {
args.inV[j] = arrayInV[i * 4 + j];
}
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeLength(args, target);
// Compare the expected outputs to the actual values returned by RS.
@@ -289,7 +290,7 @@
for (int j = 0; j < 4 ; j++) {
args.inV[j] = arrayInV[i * 4 + j];
}
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeLength(args, target);
// Compare the expected outputs to the actual values returned by RS.
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLgamma.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLgamma.java
index 1b65459..d1eaa9f 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLgamma.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLgamma.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeLgamma(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeLgamma(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeLgamma(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeLgamma(args, target);
// Validate the outputs.
boolean valid = true;
@@ -366,7 +367,7 @@
args.outSignOfGamma = arrayOutSignOfGamma[i * 1 + j];
args.out = arrayOut[i * 1 + j];
// Ask the CoreMathVerifier to validate.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
String errorMessage = CoreMathVerifier.verifyLgamma(args, target);
boolean valid = errorMessage == null;
if (!valid) {
@@ -439,7 +440,7 @@
args.outSignOfGamma = arrayOutSignOfGamma[i * 2 + j];
args.out = arrayOut[i * 2 + j];
// Ask the CoreMathVerifier to validate.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
String errorMessage = CoreMathVerifier.verifyLgamma(args, target);
boolean valid = errorMessage == null;
if (!valid) {
@@ -512,7 +513,7 @@
args.outSignOfGamma = arrayOutSignOfGamma[i * 4 + j];
args.out = arrayOut[i * 4 + j];
// Ask the CoreMathVerifier to validate.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
String errorMessage = CoreMathVerifier.verifyLgamma(args, target);
boolean valid = errorMessage == null;
if (!valid) {
@@ -585,7 +586,7 @@
args.outSignOfGamma = arrayOutSignOfGamma[i * 4 + j];
args.out = arrayOut[i * 4 + j];
// Ask the CoreMathVerifier to validate.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
String errorMessage = CoreMathVerifier.verifyLgamma(args, target);
boolean valid = errorMessage == null;
if (!valid) {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLog.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLog.java
index d8166b5..64a91b2 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLog.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLog.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeLog(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeLog(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeLog(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeLog(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLog10.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLog10.java
index 9a22615..d01ec9e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLog10.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLog10.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeLog10(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeLog10(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeLog10(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeLog10(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLog1p.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLog1p.java
index b943262..405ef89 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLog1p.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLog1p.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeLog1p(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeLog1p(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeLog1p(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeLog1p(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLog2.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLog2.java
index 211abe8..fce95f2 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLog2.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLog2.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeLog2(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeLog2(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeLog2(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeLog2(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLogb.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLogb.java
index e92f1f2..f176573 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLogb.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLogb.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeLogb(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeLogb(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeLogb(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeLogb(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMad.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMad.java
index a9578ca..f905f98 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMad.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMad.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -90,7 +91,7 @@
args.inMultiplicand2 = arrayInMultiplicand2[i];
args.inOffset = arrayInOffset[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeMad(args, target);
// Validate the outputs.
boolean valid = true;
@@ -179,7 +180,7 @@
args.inMultiplicand2 = arrayInMultiplicand2[i * 2 + j];
args.inOffset = arrayInOffset[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeMad(args, target);
// Validate the outputs.
boolean valid = true;
@@ -268,7 +269,7 @@
args.inMultiplicand2 = arrayInMultiplicand2[i * 4 + j];
args.inOffset = arrayInOffset[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeMad(args, target);
// Validate the outputs.
boolean valid = true;
@@ -357,7 +358,7 @@
args.inMultiplicand2 = arrayInMultiplicand2[i * 4 + j];
args.inOffset = arrayInOffset[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeMad(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMax.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMax.java
index 9fa4646..61a8292 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMax.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMax.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -82,7 +83,7 @@
args.inA = arrayInA[i];
args.inB = arrayInB[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeMax(args, target);
// Validate the outputs.
boolean valid = true;
@@ -161,7 +162,7 @@
args.inA = arrayInA[i * 2 + j];
args.inB = arrayInB[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeMax(args, target);
// Validate the outputs.
boolean valid = true;
@@ -240,7 +241,7 @@
args.inA = arrayInA[i * 4 + j];
args.inB = arrayInB[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeMax(args, target);
// Validate the outputs.
boolean valid = true;
@@ -319,7 +320,7 @@
args.inA = arrayInA[i * 4 + j];
args.inB = arrayInB[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeMax(args, target);
// Validate the outputs.
boolean valid = true;
@@ -398,7 +399,7 @@
args.inA = arrayInA[i * 2 + j];
args.inB = arrayInB[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeMax(args, target);
// Validate the outputs.
boolean valid = true;
@@ -477,7 +478,7 @@
args.inA = arrayInA[i * 4 + j];
args.inB = arrayInB[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeMax(args, target);
// Validate the outputs.
boolean valid = true;
@@ -556,7 +557,7 @@
args.inA = arrayInA[i * 4 + j];
args.inB = arrayInB[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeMax(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMin.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMin.java
index cb9089d..28fea4e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMin.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMin.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -82,7 +83,7 @@
args.inA = arrayInA[i];
args.inB = arrayInB[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeMin(args, target);
// Validate the outputs.
boolean valid = true;
@@ -161,7 +162,7 @@
args.inA = arrayInA[i * 2 + j];
args.inB = arrayInB[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeMin(args, target);
// Validate the outputs.
boolean valid = true;
@@ -240,7 +241,7 @@
args.inA = arrayInA[i * 4 + j];
args.inB = arrayInB[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeMin(args, target);
// Validate the outputs.
boolean valid = true;
@@ -319,7 +320,7 @@
args.inA = arrayInA[i * 4 + j];
args.inB = arrayInB[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeMin(args, target);
// Validate the outputs.
boolean valid = true;
@@ -398,7 +399,7 @@
args.inA = arrayInA[i * 2 + j];
args.inB = arrayInB[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeMin(args, target);
// Validate the outputs.
boolean valid = true;
@@ -477,7 +478,7 @@
args.inA = arrayInA[i * 4 + j];
args.inB = arrayInB[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeMin(args, target);
// Validate the outputs.
boolean valid = true;
@@ -556,7 +557,7 @@
args.inA = arrayInA[i * 4 + j];
args.inB = arrayInB[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeMin(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMix.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMix.java
index fe0bc81..cc14f0e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMix.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMix.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -90,7 +91,7 @@
args.inStop = arrayInStop[i];
args.inFraction = arrayInFraction[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeMix(args, target);
// Validate the outputs.
boolean valid = true;
@@ -179,7 +180,7 @@
args.inStop = arrayInStop[i * 2 + j];
args.inFraction = arrayInFraction[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeMix(args, target);
// Validate the outputs.
boolean valid = true;
@@ -268,7 +269,7 @@
args.inStop = arrayInStop[i * 4 + j];
args.inFraction = arrayInFraction[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeMix(args, target);
// Validate the outputs.
boolean valid = true;
@@ -357,7 +358,7 @@
args.inStop = arrayInStop[i * 4 + j];
args.inFraction = arrayInFraction[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeMix(args, target);
// Validate the outputs.
boolean valid = true;
@@ -446,7 +447,7 @@
args.inStop = arrayInStop[i * 2 + j];
args.inFraction = arrayInFraction[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeMix(args, target);
// Validate the outputs.
boolean valid = true;
@@ -535,7 +536,7 @@
args.inStop = arrayInStop[i * 4 + j];
args.inFraction = arrayInFraction[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeMix(args, target);
// Validate the outputs.
boolean valid = true;
@@ -624,7 +625,7 @@
args.inStop = arrayInStop[i * 4 + j];
args.inFraction = arrayInFraction[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeMix(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestModf.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestModf.java
index d3a55b2..d45efc4 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestModf.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestModf.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -82,7 +83,7 @@
ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeModf(args, target);
// Validate the outputs.
boolean valid = true;
@@ -170,7 +171,7 @@
ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeModf(args, target);
// Validate the outputs.
boolean valid = true;
@@ -258,7 +259,7 @@
ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeModf(args, target);
// Validate the outputs.
boolean valid = true;
@@ -346,7 +347,7 @@
ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeModf(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNan.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNan.java
index 526d0e5..6558ab3 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNan.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNan.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsUintFloat args = new ArgumentsUintFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNan(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAcos.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAcos.java
index 74d41ff..24059a1 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAcos.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAcos.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAcos(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAcos(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAcos(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAcos(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAcosh.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAcosh.java
index 20dd367..561419c 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAcosh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAcosh.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAcosh(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAcosh(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAcosh(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAcosh(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAcospi.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAcospi.java
index a65353e..02625f8 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAcospi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAcospi.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAcospi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAcospi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAcospi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAcospi(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAsin.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAsin.java
index 4f25bb6..513147f 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAsin.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAsin.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAsin(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAsin(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAsin(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAsin(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAsinh.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAsinh.java
index d5dbf84..ebdb5de 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAsinh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAsinh.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAsinh(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAsinh(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAsinh(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAsinh(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAsinpi.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAsinpi.java
index da09481..e0acde3 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAsinpi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAsinpi.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAsinpi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAsinpi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAsinpi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAsinpi(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtan.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtan.java
index 9f6091d4..54b52cd 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtan.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtan.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAtan(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAtan(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAtan(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAtan(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtan2.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtan2.java
index 16dd8af..63569fd 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtan2.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtan2.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -82,7 +83,7 @@
args.inNumerator = arrayInNumerator[i];
args.inDenominator = arrayInDenominator[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAtan2(args, target);
// Validate the outputs.
boolean valid = true;
@@ -161,7 +162,7 @@
args.inNumerator = arrayInNumerator[i * 2 + j];
args.inDenominator = arrayInDenominator[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAtan2(args, target);
// Validate the outputs.
boolean valid = true;
@@ -240,7 +241,7 @@
args.inNumerator = arrayInNumerator[i * 4 + j];
args.inDenominator = arrayInDenominator[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAtan2(args, target);
// Validate the outputs.
boolean valid = true;
@@ -319,7 +320,7 @@
args.inNumerator = arrayInNumerator[i * 4 + j];
args.inDenominator = arrayInDenominator[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAtan2(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtan2pi.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtan2pi.java
index 01eab0b..c12db90 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtan2pi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtan2pi.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -82,7 +83,7 @@
args.inNumerator = arrayInNumerator[i];
args.inDenominator = arrayInDenominator[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAtan2pi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -161,7 +162,7 @@
args.inNumerator = arrayInNumerator[i * 2 + j];
args.inDenominator = arrayInDenominator[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAtan2pi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -240,7 +241,7 @@
args.inNumerator = arrayInNumerator[i * 4 + j];
args.inDenominator = arrayInDenominator[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAtan2pi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -319,7 +320,7 @@
args.inNumerator = arrayInNumerator[i * 4 + j];
args.inDenominator = arrayInDenominator[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAtan2pi(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtanh.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtanh.java
index 4daa06d..72009d6 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtanh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtanh.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAtanh(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAtanh(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAtanh(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAtanh(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtanpi.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtanpi.java
index 7de17cd..f3c64c6 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtanpi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtanpi.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAtanpi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAtanpi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAtanpi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeAtanpi(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeCbrt.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeCbrt.java
index 6982ef8..1a98da2 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeCbrt.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeCbrt.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeCbrt(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeCbrt(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeCbrt(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeCbrt(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeCos.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeCos.java
index caa8b2aa..51b85fa 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeCos.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeCos.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeCos(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeCos(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeCos(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeCos(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeCosh.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeCosh.java
index b0ae753..c9918d2 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeCosh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeCosh.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeCosh(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeCosh(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeCosh(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeCosh(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeCospi.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeCospi.java
index cb9029a..bbefc75 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeCospi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeCospi.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeCospi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeCospi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeCospi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeCospi(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeDistance.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeDistance.java
index ca81d70..bf4f898 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeDistance.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeDistance.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -81,7 +82,7 @@
// Fill args with the input values
args.inLeftVector = arrayInLeftVector[i];
args.inRightVector = arrayInRightVector[i];
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeDistance(args, target);
// Compare the expected outputs to the actual values returned by RS.
@@ -169,7 +170,7 @@
for (int j = 0; j < 2 ; j++) {
args.inRightVector[j] = arrayInRightVector[i * 2 + j];
}
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeDistance(args, target);
// Compare the expected outputs to the actual values returned by RS.
@@ -255,7 +256,7 @@
for (int j = 0; j < 3 ; j++) {
args.inRightVector[j] = arrayInRightVector[i * 4 + j];
}
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeDistance(args, target);
// Compare the expected outputs to the actual values returned by RS.
@@ -341,7 +342,7 @@
for (int j = 0; j < 4 ; j++) {
args.inRightVector[j] = arrayInRightVector[i * 4 + j];
}
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeDistance(args, target);
// Compare the expected outputs to the actual values returned by RS.
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeDivide.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeDivide.java
index 0784402..4c864e6 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeDivide.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeDivide.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -82,7 +83,7 @@
args.inLeftVector = arrayInLeftVector[i];
args.inRightVector = arrayInRightVector[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeDivide(args, target);
// Validate the outputs.
boolean valid = true;
@@ -161,7 +162,7 @@
args.inLeftVector = arrayInLeftVector[i * 2 + j];
args.inRightVector = arrayInRightVector[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeDivide(args, target);
// Validate the outputs.
boolean valid = true;
@@ -240,7 +241,7 @@
args.inLeftVector = arrayInLeftVector[i * 4 + j];
args.inRightVector = arrayInRightVector[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeDivide(args, target);
// Validate the outputs.
boolean valid = true;
@@ -319,7 +320,7 @@
args.inLeftVector = arrayInLeftVector[i * 4 + j];
args.inRightVector = arrayInRightVector[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeDivide(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeExp.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeExp.java
index 7ddbcb8..edef95d 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeExp.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeExp.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeExp(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeExp(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeExp(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeExp(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeExp10.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeExp10.java
index dd630e3..84dbdae 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeExp10.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeExp10.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeExp10(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeExp10(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeExp10(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeExp10(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeExp2.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeExp2.java
index 420a9ca..094fa1d 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeExp2.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeExp2.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeExp2(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeExp2(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeExp2(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeExp2(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeExpm1.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeExpm1.java
index 6fd7013..edae2df 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeExpm1.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeExpm1.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeExpm1(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeExpm1(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeExpm1(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeExpm1(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeHypot.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeHypot.java
index 360ceb4..a6f1c7f 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeHypot.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeHypot.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -82,7 +83,7 @@
args.inA = arrayInA[i];
args.inB = arrayInB[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeHypot(args, target);
// Validate the outputs.
boolean valid = true;
@@ -161,7 +162,7 @@
args.inA = arrayInA[i * 2 + j];
args.inB = arrayInB[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeHypot(args, target);
// Validate the outputs.
boolean valid = true;
@@ -240,7 +241,7 @@
args.inA = arrayInA[i * 4 + j];
args.inB = arrayInB[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeHypot(args, target);
// Validate the outputs.
boolean valid = true;
@@ -319,7 +320,7 @@
args.inA = arrayInA[i * 4 + j];
args.inB = arrayInB[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeHypot(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLength.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLength.java
index efd6598..e6ba53d 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLength.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLength.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -73,7 +74,7 @@
// Create the appropriate sized arrays in args
// Fill args with the input values
args.inV = arrayInV[i];
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeLength(args, target);
// Compare the expected outputs to the actual values returned by RS.
@@ -147,7 +148,7 @@
for (int j = 0; j < 2 ; j++) {
args.inV[j] = arrayInV[i * 2 + j];
}
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeLength(args, target);
// Compare the expected outputs to the actual values returned by RS.
@@ -218,7 +219,7 @@
for (int j = 0; j < 3 ; j++) {
args.inV[j] = arrayInV[i * 4 + j];
}
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeLength(args, target);
// Compare the expected outputs to the actual values returned by RS.
@@ -289,7 +290,7 @@
for (int j = 0; j < 4 ; j++) {
args.inV[j] = arrayInV[i * 4 + j];
}
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeLength(args, target);
// Compare the expected outputs to the actual values returned by RS.
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLog.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLog.java
index acca159..c9dd50e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLog.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLog.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeLog(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeLog(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeLog(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeLog(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLog10.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLog10.java
index b21baad..a5cf87f5 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLog10.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLog10.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeLog10(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeLog10(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeLog10(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeLog10(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLog1p.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLog1p.java
index 54a6472..5e1d2c5 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLog1p.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLog1p.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeLog1p(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeLog1p(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeLog1p(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeLog1p(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLog2.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLog2.java
index 826bcd1..402a746 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLog2.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLog2.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeLog2(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeLog2(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeLog2(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeLog2(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeNormalize.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeNormalize.java
index 8601374..10efcf0 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeNormalize.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeNormalize.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -73,7 +74,7 @@
// Create the appropriate sized arrays in args
// Fill args with the input values
args.inV = arrayInV[i];
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeNormalize(args, target);
// Compare the expected outputs to the actual values returned by RS.
@@ -148,7 +149,7 @@
for (int j = 0; j < 2 ; j++) {
args.inV[j] = arrayInV[i * 2 + j];
}
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeNormalize(args, target);
// Compare the expected outputs to the actual values returned by RS.
@@ -224,7 +225,7 @@
for (int j = 0; j < 3 ; j++) {
args.inV[j] = arrayInV[i * 4 + j];
}
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeNormalize(args, target);
// Compare the expected outputs to the actual values returned by RS.
@@ -300,7 +301,7 @@
for (int j = 0; j < 4 ; j++) {
args.inV[j] = arrayInV[i * 4 + j];
}
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeNormalize(args, target);
// Compare the expected outputs to the actual values returned by RS.
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativePowr.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativePowr.java
index f4a8f73..c1ef937 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativePowr.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativePowr.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -82,7 +83,7 @@
args.inBase = arrayInBase[i];
args.inExponent = arrayInExponent[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativePowr(args, target);
// Validate the outputs.
boolean valid = true;
@@ -161,7 +162,7 @@
args.inBase = arrayInBase[i * 2 + j];
args.inExponent = arrayInExponent[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativePowr(args, target);
// Validate the outputs.
boolean valid = true;
@@ -240,7 +241,7 @@
args.inBase = arrayInBase[i * 4 + j];
args.inExponent = arrayInExponent[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativePowr(args, target);
// Validate the outputs.
boolean valid = true;
@@ -319,7 +320,7 @@
args.inBase = arrayInBase[i * 4 + j];
args.inExponent = arrayInExponent[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativePowr(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeRecip.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeRecip.java
index 908a12c..c78885b 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeRecip.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeRecip.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeRecip(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeRecip(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeRecip(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeRecip(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeRootn.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeRootn.java
index 03b9d86..8143573 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeRootn.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeRootn.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -82,7 +83,7 @@
args.inV = arrayInV[i];
args.inN = arrayInN[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeRootn(args, target);
// Validate the outputs.
boolean valid = true;
@@ -161,7 +162,7 @@
args.inV = arrayInV[i * 2 + j];
args.inN = arrayInN[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeRootn(args, target);
// Validate the outputs.
boolean valid = true;
@@ -240,7 +241,7 @@
args.inV = arrayInV[i * 4 + j];
args.inN = arrayInN[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeRootn(args, target);
// Validate the outputs.
boolean valid = true;
@@ -319,7 +320,7 @@
args.inV = arrayInV[i * 4 + j];
args.inN = arrayInN[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeRootn(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeRsqrt.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeRsqrt.java
index 49ecddf..6e7389d 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeRsqrt.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeRsqrt.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeRsqrt(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeRsqrt(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeRsqrt(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeRsqrt(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSin.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSin.java
index e2328ab..0f6d59e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSin.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSin.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeSin(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeSin(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeSin(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeSin(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSincos.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSincos.java
index a46ede7..50776e3 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSincos.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSincos.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -82,7 +83,7 @@
ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeSincos(args, target);
// Validate the outputs.
boolean valid = true;
@@ -170,7 +171,7 @@
ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeSincos(args, target);
// Validate the outputs.
boolean valid = true;
@@ -258,7 +259,7 @@
ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeSincos(args, target);
// Validate the outputs.
boolean valid = true;
@@ -346,7 +347,7 @@
ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeSincos(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSinh.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSinh.java
index 4418f7e..99b8c44 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSinh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSinh.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeSinh(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeSinh(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeSinh(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeSinh(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSinpi.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSinpi.java
index f18a611..6d6b552 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSinpi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSinpi.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeSinpi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeSinpi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeSinpi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeSinpi(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSqrt.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSqrt.java
index 4592144..b280792 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSqrt.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSqrt.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeSqrt(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeSqrt(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeSqrt(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeSqrt(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeTan.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeTan.java
index 02e8613..c6c32b6 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeTan.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeTan.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeTan(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeTan(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeTan(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeTan(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeTanh.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeTanh.java
index 5806307..2898543 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeTanh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeTanh.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeTanh(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeTanh(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeTanh(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeTanh(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeTanpi.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeTanpi.java
index fcf4ab4..90afaa9 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeTanpi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeTanpi.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeTanpi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeTanpi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeTanpi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNativeTanpi(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNextafter.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNextafter.java
index b154ed0..596909f 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNextafter.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNextafter.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -82,7 +83,7 @@
args.inV = arrayInV[i];
args.inTarget = arrayInTarget[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNextafter(args, target);
// Validate the outputs.
boolean valid = true;
@@ -161,7 +162,7 @@
args.inV = arrayInV[i * 2 + j];
args.inTarget = arrayInTarget[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNextafter(args, target);
// Validate the outputs.
boolean valid = true;
@@ -240,7 +241,7 @@
args.inV = arrayInV[i * 4 + j];
args.inTarget = arrayInTarget[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNextafter(args, target);
// Validate the outputs.
boolean valid = true;
@@ -319,7 +320,7 @@
args.inV = arrayInV[i * 4 + j];
args.inTarget = arrayInTarget[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNextafter(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNormalize.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNormalize.java
index e2d65b2..567abe8 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNormalize.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNormalize.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -73,7 +74,7 @@
// Create the appropriate sized arrays in args
// Fill args with the input values
args.inV = arrayInV[i];
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNormalize(args, target);
// Compare the expected outputs to the actual values returned by RS.
@@ -148,7 +149,7 @@
for (int j = 0; j < 2 ; j++) {
args.inV[j] = arrayInV[i * 2 + j];
}
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNormalize(args, target);
// Compare the expected outputs to the actual values returned by RS.
@@ -224,7 +225,7 @@
for (int j = 0; j < 3 ; j++) {
args.inV[j] = arrayInV[i * 4 + j];
}
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNormalize(args, target);
// Compare the expected outputs to the actual values returned by RS.
@@ -300,7 +301,7 @@
for (int j = 0; j < 4 ; j++) {
args.inV[j] = arrayInV[i * 4 + j];
}
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeNormalize(args, target);
// Compare the expected outputs to the actual values returned by RS.
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestPow.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestPow.java
index 13443a3..660df1b 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestPow.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestPow.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -82,7 +83,7 @@
args.inBase = arrayInBase[i];
args.inExponent = arrayInExponent[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computePow(args, target);
// Validate the outputs.
boolean valid = true;
@@ -161,7 +162,7 @@
args.inBase = arrayInBase[i * 2 + j];
args.inExponent = arrayInExponent[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computePow(args, target);
// Validate the outputs.
boolean valid = true;
@@ -240,7 +241,7 @@
args.inBase = arrayInBase[i * 4 + j];
args.inExponent = arrayInExponent[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computePow(args, target);
// Validate the outputs.
boolean valid = true;
@@ -319,7 +320,7 @@
args.inBase = arrayInBase[i * 4 + j];
args.inExponent = arrayInExponent[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computePow(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestPown.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestPown.java
index ad1d58a..2e16f21 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestPown.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestPown.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -82,7 +83,7 @@
args.inBase = arrayInBase[i];
args.inExponent = arrayInExponent[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computePown(args, target);
// Validate the outputs.
boolean valid = true;
@@ -161,7 +162,7 @@
args.inBase = arrayInBase[i * 2 + j];
args.inExponent = arrayInExponent[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computePown(args, target);
// Validate the outputs.
boolean valid = true;
@@ -240,7 +241,7 @@
args.inBase = arrayInBase[i * 4 + j];
args.inExponent = arrayInExponent[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computePown(args, target);
// Validate the outputs.
boolean valid = true;
@@ -319,7 +320,7 @@
args.inBase = arrayInBase[i * 4 + j];
args.inExponent = arrayInExponent[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computePown(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestPowr.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestPowr.java
index 995c948..557e293 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestPowr.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestPowr.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -82,7 +83,7 @@
args.inBase = arrayInBase[i];
args.inExponent = arrayInExponent[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computePowr(args, target);
// Validate the outputs.
boolean valid = true;
@@ -161,7 +162,7 @@
args.inBase = arrayInBase[i * 2 + j];
args.inExponent = arrayInExponent[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computePowr(args, target);
// Validate the outputs.
boolean valid = true;
@@ -240,7 +241,7 @@
args.inBase = arrayInBase[i * 4 + j];
args.inExponent = arrayInExponent[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computePowr(args, target);
// Validate the outputs.
boolean valid = true;
@@ -319,7 +320,7 @@
args.inBase = arrayInBase[i * 4 + j];
args.inExponent = arrayInExponent[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computePowr(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRadians.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRadians.java
index 73a5ab8..8eeaea0 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRadians.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRadians.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeRadians(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeRadians(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeRadians(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeRadians(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRemainder.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRemainder.java
index c346012..f921c5b 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRemainder.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRemainder.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -82,7 +83,7 @@
args.inNumerator = arrayInNumerator[i];
args.inDenominator = arrayInDenominator[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeRemainder(args, target);
// Validate the outputs.
boolean valid = true;
@@ -161,7 +162,7 @@
args.inNumerator = arrayInNumerator[i * 2 + j];
args.inDenominator = arrayInDenominator[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeRemainder(args, target);
// Validate the outputs.
boolean valid = true;
@@ -240,7 +241,7 @@
args.inNumerator = arrayInNumerator[i * 4 + j];
args.inDenominator = arrayInDenominator[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeRemainder(args, target);
// Validate the outputs.
boolean valid = true;
@@ -319,7 +320,7 @@
args.inNumerator = arrayInNumerator[i * 4 + j];
args.inDenominator = arrayInDenominator[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeRemainder(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRemquo.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRemquo.java
index 6dbe11d..2aafac6 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRemquo.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRemquo.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -93,7 +94,7 @@
args.outQuotient = arrayOutQuotient[i * 1 + j];
args.out = arrayOut[i * 1 + j];
// Ask the CoreMathVerifier to validate.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
String errorMessage = CoreMathVerifier.verifyRemquo(args, target);
boolean valid = errorMessage == null;
if (!valid) {
@@ -176,7 +177,7 @@
args.outQuotient = arrayOutQuotient[i * 2 + j];
args.out = arrayOut[i * 2 + j];
// Ask the CoreMathVerifier to validate.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
String errorMessage = CoreMathVerifier.verifyRemquo(args, target);
boolean valid = errorMessage == null;
if (!valid) {
@@ -259,7 +260,7 @@
args.outQuotient = arrayOutQuotient[i * 4 + j];
args.out = arrayOut[i * 4 + j];
// Ask the CoreMathVerifier to validate.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
String errorMessage = CoreMathVerifier.verifyRemquo(args, target);
boolean valid = errorMessage == null;
if (!valid) {
@@ -342,7 +343,7 @@
args.outQuotient = arrayOutQuotient[i * 4 + j];
args.out = arrayOut[i * 4 + j];
// Ask the CoreMathVerifier to validate.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
String errorMessage = CoreMathVerifier.verifyRemquo(args, target);
boolean valid = errorMessage == null;
if (!valid) {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRint.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRint.java
index 7f5fc7e..f829798 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRint.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRint.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeRint(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeRint(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeRint(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeRint(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRootn.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRootn.java
index b22394d..7bb77a5 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRootn.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRootn.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -82,7 +83,7 @@
args.inV = arrayInV[i];
args.inN = arrayInN[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeRootn(args, target);
// Validate the outputs.
boolean valid = true;
@@ -161,7 +162,7 @@
args.inV = arrayInV[i * 2 + j];
args.inN = arrayInN[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeRootn(args, target);
// Validate the outputs.
boolean valid = true;
@@ -240,7 +241,7 @@
args.inV = arrayInV[i * 4 + j];
args.inN = arrayInN[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeRootn(args, target);
// Validate the outputs.
boolean valid = true;
@@ -319,7 +320,7 @@
args.inV = arrayInV[i * 4 + j];
args.inN = arrayInN[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeRootn(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRound.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRound.java
index 5d13540..55f16f5 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRound.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRound.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeRound(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeRound(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeRound(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeRound(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRsqrt.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRsqrt.java
index 736b4cf..f91495c 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRsqrt.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRsqrt.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeRsqrt(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeRsqrt(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeRsqrt(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeRsqrt(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSign.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSign.java
index 4cab338..2a002df 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSign.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSign.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeSign(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeSign(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeSign(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeSign(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSin.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSin.java
index 372ae23..1eeca79 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSin.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSin.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeSin(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeSin(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeSin(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeSin(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSincos.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSincos.java
index be38237..0b0d0d1 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSincos.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSincos.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -82,7 +83,7 @@
ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeSincos(args, target);
// Validate the outputs.
boolean valid = true;
@@ -170,7 +171,7 @@
ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeSincos(args, target);
// Validate the outputs.
boolean valid = true;
@@ -258,7 +259,7 @@
ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeSincos(args, target);
// Validate the outputs.
boolean valid = true;
@@ -346,7 +347,7 @@
ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeSincos(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSinh.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSinh.java
index 43e38ac..8d77970 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSinh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSinh.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeSinh(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeSinh(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeSinh(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeSinh(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSinpi.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSinpi.java
index adb03d2..a5d983e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSinpi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSinpi.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeSinpi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeSinpi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeSinpi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeSinpi(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSqrt.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSqrt.java
index 6026960..e9ac826 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSqrt.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSqrt.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeSqrt(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeSqrt(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeSqrt(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeSqrt(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestStep.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestStep.java
index e3451c8..a8e4fb9 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestStep.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestStep.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -82,7 +83,7 @@
args.inEdge = arrayInEdge[i];
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeStep(args, target);
// Validate the outputs.
boolean valid = true;
@@ -161,7 +162,7 @@
args.inEdge = arrayInEdge[i * 2 + j];
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeStep(args, target);
// Validate the outputs.
boolean valid = true;
@@ -240,7 +241,7 @@
args.inEdge = arrayInEdge[i * 4 + j];
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeStep(args, target);
// Validate the outputs.
boolean valid = true;
@@ -319,7 +320,7 @@
args.inEdge = arrayInEdge[i * 4 + j];
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeStep(args, target);
// Validate the outputs.
boolean valid = true;
@@ -398,7 +399,7 @@
args.inEdge = arrayInEdge[i * 2 + j];
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeStep(args, target);
// Validate the outputs.
boolean valid = true;
@@ -477,7 +478,7 @@
args.inEdge = arrayInEdge[i * 4 + j];
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeStep(args, target);
// Validate the outputs.
boolean valid = true;
@@ -556,7 +557,7 @@
args.inEdge = arrayInEdge[i * 4 + j];
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeStep(args, target);
// Validate the outputs.
boolean valid = true;
@@ -635,7 +636,7 @@
args.inEdge = arrayInEdge[i];
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeStep(args, target);
// Validate the outputs.
boolean valid = true;
@@ -714,7 +715,7 @@
args.inEdge = arrayInEdge[i];
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeStep(args, target);
// Validate the outputs.
boolean valid = true;
@@ -793,7 +794,7 @@
args.inEdge = arrayInEdge[i];
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeStep(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTan.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTan.java
index 5f23b3c..72f0a0b 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTan.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTan.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeTan(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeTan(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeTan(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeTan(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTanh.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTanh.java
index 60143ed..7d1e96c 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTanh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTanh.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeTanh(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeTanh(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeTanh(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeTanh(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTanpi.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTanpi.java
index 773f358..e5b9af6 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTanpi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTanpi.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeTanpi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeTanpi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeTanpi(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeTanpi(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTgamma.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTgamma.java
index e2337fc..fe2b832 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTgamma.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTgamma.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeTgamma(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeTgamma(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeTgamma(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeTgamma(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTrunc.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTrunc.java
index a61a739..6b6075e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTrunc.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTrunc.java
@@ -21,6 +21,7 @@
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
import android.renderscript.Element;
+import android.renderscript.cts.Target;
import java.util.Arrays;
@@ -74,7 +75,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeTrunc(args, target);
// Validate the outputs.
boolean valid = true;
@@ -143,7 +144,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 2 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeTrunc(args, target);
// Validate the outputs.
boolean valid = true;
@@ -212,7 +213,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeTrunc(args, target);
// Validate the outputs.
boolean valid = true;
@@ -281,7 +282,7 @@
ArgumentsFloatFloat args = new ArgumentsFloatFloat();
args.inV = arrayInV[i * 4 + j];
// Figure out what the outputs should have been.
- Target target = new Target(relaxed);
+ Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
CoreMathVerifier.computeTrunc(args, target);
// Validate the outputs.
boolean valid = true;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/single_source_alloc.rs b/tests/tests/renderscript/src/android/renderscript/cts/single_source_alloc.rs
index 2575d54..40566a0 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/single_source_alloc.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/single_source_alloc.rs
@@ -55,6 +55,7 @@
_RS_ASSERT_EQU(in.w, (CT) (val + 3)); \
} \
+VERIFY_KERNEL(half)
VERIFY_KERNEL(float)
VERIFY_KERNEL(double)
VERIFY_KERNEL(char)
@@ -182,6 +183,7 @@
// Store to a cell based on the type, vector size and
// dimensionality
switch (dt) {
+ STORE_TO_ALLOC(RS_TYPE_FLOAT_16, half);
STORE_TO_ALLOC(RS_TYPE_FLOAT_32, float);
STORE_TO_ALLOC(RS_TYPE_FLOAT_64, double);
STORE_TO_ALLOC(RS_TYPE_SIGNED_8, char);
@@ -203,6 +205,7 @@
// Launch the appropriate verify_ kernel
switch (dt) {
+ LAUNCH_VERIFY_KERNEL(RS_TYPE_FLOAT_16, half);
LAUNCH_VERIFY_KERNEL(RS_TYPE_FLOAT_32, float);
LAUNCH_VERIFY_KERNEL(RS_TYPE_FLOAT_64, double);
LAUNCH_VERIFY_KERNEL(RS_TYPE_SIGNED_8, char);
@@ -224,8 +227,7 @@
void TestAllocationCreationAndAccess() {
rs_data_type all_types[] = {
RS_TYPE_BOOLEAN,
- // Bug 24862914: Uncomment the following line to add half once the bug is fixed
- // RS_TYPE_FLOAT_16,
+ RS_TYPE_FLOAT_16,
RS_TYPE_FLOAT_32,
RS_TYPE_FLOAT_64,
RS_TYPE_SIGNED_8,
@@ -447,7 +449,7 @@
void TestHelperFunctions() {
failed = false;
- // Bug: 24862914: Add half once the bug is fixed
+ TEST_HELPER(half);
TEST_HELPERS(float);
TEST_HELPERS(double);
TEST_HELPERS(char);
diff --git a/tests/tests/security/jni/Android.mk b/tests/tests/security/jni/Android.mk
index 8ea6a96..bf229e7 100644
--- a/tests/tests/security/jni/Android.mk
+++ b/tests/tests/security/jni/Android.mk
@@ -40,10 +40,10 @@
LOCAL_C_INCLUDES := $(JNI_H_INCLUDE) \
$(TOP)/frameworks/native/include/media/openmax
-LOCAL_SHARED_LIBRARIES := libnativehelper_compat_libc++ liblog libdl libmedia libcrypto
+LOCAL_SHARED_LIBRARIES := libbinder libnativehelper_compat_libc++ liblog libdl libmedia libcrypto
LOCAL_C_INCLUDES += ndk/sources/cpufeatures
-LOCAL_STATIC_LIBRARIES := cpufeatures libbinder libselinux libutils libcutils
+LOCAL_STATIC_LIBRARIES := cpufeatures libselinux libutils libcutils
LOCAL_CXX_STL := libc++_static
include $(BUILD_SHARED_LIBRARY)
diff --git a/tests/tests/security/src/android/security/cts/SELinuxTest.java b/tests/tests/security/src/android/security/cts/SELinuxTest.java
index 3df7396..736bdc9 100644
--- a/tests/tests/security/src/android/security/cts/SELinuxTest.java
+++ b/tests/tests/security/src/android/security/cts/SELinuxTest.java
@@ -73,12 +73,6 @@
assertFalse(checkSELinuxAccess("u:r:zygote:s0", "u:object_r:runas_exec:s0", "file", "getattr", "/system/bin/run-as"));
}
- public void testNoBooleans() throws Exception {
- // Intentionally not using JNI bindings to keep things simple
- File[] files = new File("/sys/fs/selinux/booleans/").listFiles();
- assertEquals(0, files.length);
- }
-
public void testCTSIsUntrustedApp() throws IOException {
String found = KernelSettingsTest.getFile("/proc/self/attr/current");
String expected = "u:r:untrusted_app:s0";
diff --git a/tests/tests/telecom/src/android/telecom/cts/BaseTelecomTestWithMockServices.java b/tests/tests/telecom/src/android/telecom/cts/BaseTelecomTestWithMockServices.java
index 219dfec..932603d 100644
--- a/tests/tests/telecom/src/android/telecom/cts/BaseTelecomTestWithMockServices.java
+++ b/tests/tests/telecom/src/android/telecom/cts/BaseTelecomTestWithMockServices.java
@@ -138,7 +138,9 @@
}
protected void tearDownConnectionService(PhoneAccountHandle accountHandle) throws Exception {
- assertNumConnections(this.connectionService, 0);
+ if (this.connectionService != null) {
+ assertNumConnections(this.connectionService, 0);
+ }
mTelecomManager.unregisterPhoneAccount(accountHandle);
CtsConnectionService.tearDown();
assertCtsConnectionServiceUnbound();
@@ -814,12 +816,12 @@
new Condition() {
@Override
public Object expected() {
- return true;
+ return false;
}
@Override
public Object actual() {
- return CtsConnectionService.isServiceUnbound();
+ return CtsConnectionService.isServiceBound();
}
},
WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
diff --git a/tests/tests/telecom/src/android/telecom/cts/CtsConnectionService.java b/tests/tests/telecom/src/android/telecom/cts/CtsConnectionService.java
index d8d5773..2364986 100644
--- a/tests/tests/telecom/src/android/telecom/cts/CtsConnectionService.java
+++ b/tests/tests/telecom/src/android/telecom/cts/CtsConnectionService.java
@@ -16,7 +16,7 @@
package android.telecom.cts;
-import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
import android.content.Intent;
import android.telecom.Conference;
@@ -52,11 +52,13 @@
private static ConnectionService sConnectionService;
// This is the connection service registered with Telecom
private static ConnectionService sTelecomConnectionService;
- private static boolean mIsServiceUnbound;
+ private static boolean mIsServiceBound = false;
public CtsConnectionService() throws Exception {
super();
sTelecomConnectionService = this;
+ // Cant override the onBind method for ConnectionService, so reset it here.
+ mIsServiceBound = true;
}
// ConnectionService used by default as a fallback if no connection service is specified
@@ -77,13 +79,12 @@
throw new Exception("Mock ConnectionService exists. Failed to call tearDown().");
}
sConnectionService = connectionService;
- // Cant override the onBind method for ConnectionService, so reset it here.
- mIsServiceUnbound = false;
}
}
public static void tearDown() {
synchronized(sLock) {
+ sTelecomConnectionService = null;
sConnectionService = null;
}
}
@@ -188,13 +189,17 @@
@Override
public boolean onUnbind(Intent intent) {
- Log.i(LOG_TAG, "Service unbounded");
- assertFalse(mIsServiceUnbound);
- mIsServiceUnbound = true;
+ Log.i(LOG_TAG, "Service has been unbound");
+ assertTrue(mIsServiceBound);
+ mIsServiceBound = false;
return super.onUnbind(intent);
}
- public static boolean isServiceUnbound() {
- return mIsServiceUnbound;
+ public static boolean isServiceBound() {
+ return mIsServiceBound;
+ }
+
+ public static boolean isServiceRegisteredToTelecom() {
+ return sTelecomConnectionService != null;
}
}
diff --git a/tests/tests/telecom/src/android/telecom/cts/ExtendedInCallServiceTest.java b/tests/tests/telecom/src/android/telecom/cts/ExtendedInCallServiceTest.java
index 02d2f15..7d71c0f 100644
--- a/tests/tests/telecom/src/android/telecom/cts/ExtendedInCallServiceTest.java
+++ b/tests/tests/telecom/src/android/telecom/cts/ExtendedInCallServiceTest.java
@@ -18,7 +18,11 @@
import static android.telecom.cts.TestUtils.*;
+import android.content.ContentValues;
import android.content.Context;
+import android.net.Uri;
+import android.os.Bundle;
+import android.provider.BlockedNumberContract;
import android.telecom.CallAudioState;
import android.telecom.Call;
import android.telecom.Connection;
@@ -204,6 +208,39 @@
assertConnectionState(connection, Connection.STATE_ACTIVE);
}
+ public void testIncomingCallFromBlockedNumber_IsRejected() throws Exception {
+ if (!mShouldTestTelecom) {
+ return;
+ }
+
+ Uri blockedUri = null;
+
+ try {
+ Uri testNumberUri = createTestNumber();
+ blockedUri = blockNumber(testNumberUri);
+
+ final Bundle extras = new Bundle();
+ extras.putParcelable(TelecomManager.EXTRA_INCOMING_CALL_ADDRESS, testNumberUri);
+ mTelecomManager.addNewIncomingCall(TEST_PHONE_ACCOUNT_HANDLE, extras);
+
+ final MockConnection connection = verifyConnectionForIncomingCall();
+ assertConnectionState(connection, Connection.STATE_DISCONNECTED);
+ assertNull(mInCallCallbacks.getService());
+ } finally {
+ if (blockedUri != null) {
+ mContext.getContentResolver().delete(blockedUri, null, null);
+ }
+ }
+ }
+
+ private Uri blockNumber(Uri phoneNumberUri) {
+ ContentValues cv = new ContentValues();
+ cv.put(BlockedNumberContract.BlockedNumbers.COLUMN_ORIGINAL_NUMBER,
+ phoneNumberUri.getSchemeSpecificPart());
+ return mContext.getContentResolver().insert(
+ BlockedNumberContract.BlockedNumbers.CONTENT_URI, cv);
+ }
+
public void testAnswerIncomingCallAsVideo_SendsCorrectVideoState() {
if (!mShouldTestTelecom) {
return;
diff --git a/tests/tests/telecom/src/android/telecom/cts/IncomingCallTest.java b/tests/tests/telecom/src/android/telecom/cts/IncomingCallTest.java
new file mode 100644
index 0000000..7f5e7ce
--- /dev/null
+++ b/tests/tests/telecom/src/android/telecom/cts/IncomingCallTest.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.os.Bundle;
+import android.telecom.Connection;
+import android.telecom.PhoneAccountHandle;
+import android.telecom.TelecomManager;
+
+import java.util.Collection;
+
+import static android.telecom.cts.TestUtils.COMPONENT;
+import static android.telecom.cts.TestUtils.PACKAGE;
+
+/**
+ * Tests valid/invalid incoming calls that are received from the ConnectionService
+ * and registered through TelecomManager
+ */
+public class IncomingCallTest extends BaseTelecomTestWithMockServices {
+
+ private static final PhoneAccountHandle TEST_INVALID_HANDLE = new PhoneAccountHandle(
+ new ComponentName(PACKAGE, COMPONENT), "WRONG_ID");
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ mContext = getInstrumentation().getContext();
+ }
+
+ public void testAddNewIncomingCall_CorrectPhoneAccountHandle() throws Exception {
+ if (!mShouldTestTelecom) {
+ return;
+ }
+ setupConnectionService(null, FLAG_REGISTER | FLAG_ENABLE);
+ addAndVerifyNewIncomingCall(createTestNumber(), null);
+ final Connection connection3 = verifyConnectionForIncomingCall();
+ Collection<Connection> connections = CtsConnectionService.getAllConnectionsFromTelecom();
+ assertEquals(1, connections.size());
+ assertTrue(connections.contains(connection3));
+ }
+
+ /**
+ * Tests to be sure that new incoming calls can only be added using a valid PhoneAccountHandle
+ * (b/26864502). If a PhoneAccount has not been registered for the PhoneAccountHandle, then
+ * a SecurityException will be thrown.
+ */
+ public void testAddNewIncomingCall_IncorrectPhoneAccountHandle() {
+ if (!mShouldTestTelecom) {
+ return;
+ }
+
+ Bundle extras = new Bundle();
+ extras.putParcelable(TelecomManager.EXTRA_INCOMING_CALL_ADDRESS, createTestNumber());
+ try {
+ mTelecomManager.addNewIncomingCall(TEST_INVALID_HANDLE, extras);
+ fail();
+ } catch (SecurityException e) {
+ // This should create a security exception!
+ }
+
+ assertFalse(CtsConnectionService.isServiceRegisteredToTelecom());
+ }
+
+ /**
+ * Tests to be sure that new incoming calls can only be added if a PhoneAccount is enabled
+ * (b/26864502). If a PhoneAccount is not enabled for the PhoneAccountHandle, then
+ * a SecurityException will be thrown.
+ */
+ public void testAddNewIncomingCall_PhoneAccountNotEnabled() throws Exception {
+ if (!mShouldTestTelecom) {
+ return;
+ }
+
+ // Do not enable PhoneAccount
+ setupConnectionService(null, FLAG_REGISTER);
+ assertFalse(mTelecomManager.getPhoneAccount(TEST_PHONE_ACCOUNT_HANDLE).isEnabled());
+ try {
+ addAndVerifyNewIncomingCall(createTestNumber(), null);
+ fail();
+ } catch (SecurityException e) {
+ // This should create a security exception!
+ }
+
+ assertFalse(CtsConnectionService.isServiceRegisteredToTelecom());
+ }
+}
diff --git a/tests/tests/telephony/src/android/telephony/cts/SmsManagerTest.java b/tests/tests/telephony/src/android/telephony/cts/SmsManagerTest.java
index 5a80802..6b72b82a 100755
--- a/tests/tests/telephony/src/android/telephony/cts/SmsManagerTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/SmsManagerTest.java
@@ -101,6 +101,7 @@
"311230", // C SPire Wireless + Celluar South
"310600", // Cellcom
"31000", // Republic Wireless US
+ "310260", // Republic Wireless US
"310026", // T-Mobile US
"330120", // OpenMobile communication
// Verizon
@@ -142,6 +143,7 @@
"45005", // SKT Mobility
"45002", // SKT Mobility
"45006", // LGT
+ "310260", // Republic Wireless US
// Verizon
"310004",
"310012",
diff --git a/tests/tests/telephony/src/android/telephony/cts/SmsMessageTest.java b/tests/tests/telephony/src/android/telephony/cts/SmsMessageTest.java
index 2db9ba1..2406ad8 100644
--- a/tests/tests/telephony/src/android/telephony/cts/SmsMessageTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/SmsMessageTest.java
@@ -66,6 +66,9 @@
"Long dkkshsh jdjsusj kbsksbdf jfkhcu hhdiwoqiwyrygrvn?*?*!\";:'/,."
+ "__?9#9292736&4;\"$+$+((]\\[\\℅©℅™^®°¥°¥=¢£}}£∆~¶~÷|√×."
+ " 😯😆😉😇😂😀👕🎓😀👙🐕🐀🐶🐰🐩⛪⛲ ";
+ private static final String LONG_TEXT_WITH_FLAGS =
+ "🇦🇫🇦🇽🇦🇱🇩🇿🇦🇸🇦🇩🇦🇴🇦🇮🇦🇶🇦🇬🇦🇷🇦🇲🇦🇼🇦🇨"
+ + "🇦🇺🇦🇹🇦🇿🇧🇸🇧🇭🇧🇩🇧🇧🇧🇾🇧🇪🇧🇿🇧🇯🇧🇲🇧🇹🇧🇴🇧🇦";
@Override
protected void setUp() throws Exception {
@@ -317,6 +320,14 @@
assertEquals(SmsMessage.ENCODING_16BIT, result[3]);
}
+ public void testCalculateLengthFlags() throws Exception {
+ if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
+ return;
+ }
+ int[] result = SmsMessage.calculateLength(LONG_TEXT_WITH_FLAGS, false);
+ assertEquals(2, result[0]);
+ }
+
private final static char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F' };
diff --git a/tests/tests/telephony/src/android/telephony/cts/SmsUsageMonitorShortCodeTest.java b/tests/tests/telephony/src/android/telephony/cts/SmsUsageMonitorShortCodeTest.java
index 0527e9a..d89e944 100644
--- a/tests/tests/telephony/src/android/telephony/cts/SmsUsageMonitorShortCodeTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/SmsUsageMonitorShortCodeTest.java
@@ -23,6 +23,8 @@
import android.telephony.TelephonyManager;
import com.android.internal.telephony.SmsUsageMonitor;
+import android.telephony.PhoneNumberUtils;
+
/**
* Test cases for SMS short code pattern matching in SmsUsageMonitor.
*/
@@ -80,7 +82,7 @@
new ShortCodeTest("al", "55600", CATEGORY_PREMIUM_SHORT_CODE),
new ShortCodeTest("al", "654321", CATEGORY_NOT_SHORT_CODE),
- new ShortCodeTest("am", "112", CATEGORY_NOT_SHORT_CODE),
+ new ShortCodeTest("am", "112", expectedReturnCode("112")),
new ShortCodeTest("am", "101", CATEGORY_FREE_SHORT_CODE),
new ShortCodeTest("am", "102", CATEGORY_FREE_SHORT_CODE),
new ShortCodeTest("am", "103", CATEGORY_FREE_SHORT_CODE),
@@ -205,7 +207,7 @@
new ShortCodeTest("dk", "16123", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
new ShortCodeTest("dk", "987654321", CATEGORY_NOT_SHORT_CODE),
- new ShortCodeTest("ee", "112", CATEGORY_NOT_SHORT_CODE),
+ new ShortCodeTest("ee", "112", expectedReturnCode("112")),
new ShortCodeTest("ee", "116117", CATEGORY_FREE_SHORT_CODE),
new ShortCodeTest("ee", "123", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
new ShortCodeTest("ee", "1259", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
@@ -317,7 +319,7 @@
new ShortCodeTest("kz", "7790", CATEGORY_PREMIUM_SHORT_CODE),
new ShortCodeTest("kz", "98765", CATEGORY_NOT_SHORT_CODE),
- new ShortCodeTest("lt", "112", CATEGORY_NOT_SHORT_CODE),
+ new ShortCodeTest("lt", "112", expectedReturnCode("112")),
new ShortCodeTest("lt", "116117", CATEGORY_FREE_SHORT_CODE),
new ShortCodeTest("lt", "123", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
new ShortCodeTest("lt", "1234", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
@@ -370,7 +372,7 @@
new ShortCodeTest("no", "23456", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
new ShortCodeTest("no", "234567", CATEGORY_NOT_SHORT_CODE),
- new ShortCodeTest("nz", "112", CATEGORY_NOT_SHORT_CODE),
+ new ShortCodeTest("nz", "112", expectedReturnCode("112")),
new ShortCodeTest("nz", "123", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
new ShortCodeTest("nz", "2345", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
new ShortCodeTest("nz", "3903", CATEGORY_PREMIUM_SHORT_CODE),
@@ -473,12 +475,12 @@
new ShortCodeTest("zz", "54321", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
new ShortCodeTest("zz", "4321", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
new ShortCodeTest("zz", "321", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
- new ShortCodeTest("zz", "112", CATEGORY_NOT_SHORT_CODE),
+ new ShortCodeTest("zz", "112", expectedReturnCode("112")),
new ShortCodeTest(null, "2000000", CATEGORY_NOT_SHORT_CODE),
new ShortCodeTest(null, "54321", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
new ShortCodeTest(null, "4321", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
new ShortCodeTest(null, "321", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
- new ShortCodeTest(null, "112", CATEGORY_NOT_SHORT_CODE),
+ new ShortCodeTest(null, "112", expectedReturnCode("112")),
};
@Override
@@ -494,6 +496,11 @@
&& "112".equals(address);
}
+ private static int expectedReturnCode(String address) {
+ return PhoneNumberUtils.isEmergencyNumber(address) ?
+ CATEGORY_NOT_SHORT_CODE : CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE;
+ }
+
@UiThreadTest
public void testSmsUsageMonitor() {
if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
diff --git a/tests/tests/text/src/android/text/cts/StaticLayoutTest.java b/tests/tests/text/src/android/text/cts/StaticLayoutTest.java
index 9dca753..17a0fd0 100644
--- a/tests/tests/text/src/android/text/cts/StaticLayoutTest.java
+++ b/tests/tests/text/src/android/text/cts/StaticLayoutTest.java
@@ -16,23 +16,26 @@
package android.text.cts;
+import android.graphics.Typeface;
import android.test.AndroidTestCase;
import android.text.Editable;
-import android.text.GetChars;
-import android.text.GraphicsOperations;
+import android.text.Layout;
import android.text.Layout.Alignment;
-import android.text.TextUtils.TruncateAt;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
+import android.text.Spanned;
import android.text.SpannedString;
import android.text.StaticLayout;
import android.text.TextDirectionHeuristics;
import android.text.TextPaint;
import android.text.TextUtils;
+import android.text.TextUtils.TruncateAt;
+import android.text.style.StyleSpan;
import java.text.Normalizer;
import java.util.ArrayList;
import java.util.List;
+import java.util.Locale;
public class StaticLayoutTest extends AndroidTestCase {
private static final float SPACE_MULTI = 1.0f;
@@ -1014,4 +1017,20 @@
DEFAULT_ALIGN, SPACE_MULTI, SPACE_ADD, true);
assertNotNull(layout);
}
+
+ public void testDoesntCrashWhenWordStyleOverlap() {
+ // test case where word boundary overlaps multiple style spans
+ SpannableStringBuilder text = new SpannableStringBuilder("word boundaries, overlap style");
+ // span covers "boundaries"
+ text.setSpan(new StyleSpan(Typeface.BOLD),
+ "word ".length(), "word boundaries".length(),
+ Spanned.SPAN_INCLUSIVE_INCLUSIVE);
+ mDefaultPaint.setTextLocale(Locale.US);
+ StaticLayout layout = StaticLayout.Builder.obtain(text, 0, text.length(),
+ mDefaultPaint, DEFAULT_OUTER_WIDTH)
+ .setBreakStrategy(Layout.BREAK_STRATEGY_HIGH_QUALITY) // enable hyphenation
+ .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL)
+ .build();
+ assertNotNull(layout);
+ }
}
diff --git a/tests/tests/tv/src/android/media/tv/cts/TvContractTest.java b/tests/tests/tv/src/android/media/tv/cts/TvContractTest.java
index 916cf6d..9f26f46 100644
--- a/tests/tests/tv/src/android/media/tv/cts/TvContractTest.java
+++ b/tests/tests/tv/src/android/media/tv/cts/TvContractTest.java
@@ -64,8 +64,9 @@
TvContract.Programs._ID,
TvContract.Programs.COLUMN_CHANNEL_ID,
TvContract.Programs.COLUMN_TITLE,
- TvContract.Programs.COLUMN_SEASON_NUMBER,
- TvContract.Programs.COLUMN_EPISODE_NUMBER,
+ TvContract.Programs.COLUMN_SEASON_DISPLAY_NUMBER,
+ TvContract.Programs.COLUMN_SEASON_TITLE,
+ TvContract.Programs.COLUMN_EPISODE_DISPLAY_NUMBER,
TvContract.Programs.COLUMN_EPISODE_TITLE,
TvContract.Programs.COLUMN_START_TIME_UTC_MILLIS,
TvContract.Programs.COLUMN_END_TIME_UTC_MILLIS,
@@ -154,7 +155,10 @@
private static ContentValues createDummyProgramValues(long channelId) {
ContentValues values = new ContentValues();
values.put(TvContract.Programs.COLUMN_CHANNEL_ID, channelId);
- values.put(TvContract.Programs.COLUMN_EPISODE_TITLE, "Title");
+ values.put(TvContract.Programs.COLUMN_EPISODE_DISPLAY_NUMBER , "1A");
+ values.put(TvContract.Programs.COLUMN_EPISODE_TITLE, "episode_title");
+ values.put(TvContract.Programs.COLUMN_SEASON_DISPLAY_NUMBER , "2B");
+ values.put(TvContract.Programs.COLUMN_SEASON_TITLE, "season_title");
values.put(TvContract.Programs.COLUMN_CANONICAL_GENRE, TvContract.Programs.Genres.encode(
TvContract.Programs.Genres.MOVIES, TvContract.Programs.Genres.DRAMA));
TvContentRating rating = TvContentRating.createRating("android.media.tv", "US_TVPG",
@@ -164,11 +168,13 @@
return values;
}
- private static ContentValues createDummyRecordedProgramValues(long channelId) {
+ private static ContentValues createDummyRecordedProgramValues(String inputId, long channelId) {
ContentValues values = new ContentValues();
+ values.put(TvContract.RecordedPrograms.COLUMN_INPUT_ID, inputId);
values.put(TvContract.RecordedPrograms.COLUMN_CHANNEL_ID, channelId);
- values.put(TvContract.RecordedPrograms.COLUMN_SEASON_NUMBER, 6);
- values.put(TvContract.RecordedPrograms.COLUMN_EPISODE_NUMBER, 3);
+ values.put(TvContract.RecordedPrograms.COLUMN_SEASON_DISPLAY_NUMBER , "3B");
+ values.put(TvContract.RecordedPrograms.COLUMN_SEASON_TITLE, "season_title");
+ values.put(TvContract.RecordedPrograms.COLUMN_EPISODE_DISPLAY_NUMBER , "2A");
values.put(TvContract.RecordedPrograms.COLUMN_EPISODE_TITLE, "episode_title");
values.put(TvContract.RecordedPrograms.COLUMN_START_TIME_UTC_MILLIS, 1000);
values.put(TvContract.RecordedPrograms.COLUMN_END_TIME_UTC_MILLIS, 2000);
@@ -301,8 +307,11 @@
assertEquals(programId, cursor.getLong(cursor.getColumnIndex(TvContract.Programs._ID)));
verifyLongColumn(cursor, expectedValues, TvContract.Programs.COLUMN_CHANNEL_ID);
verifyStringColumn(cursor, expectedValues, TvContract.Programs.COLUMN_TITLE);
- verifyIntegerColumn(cursor, expectedValues, TvContract.Programs.COLUMN_SEASON_NUMBER);
- verifyIntegerColumn(cursor, expectedValues, TvContract.Programs.COLUMN_EPISODE_NUMBER);
+ verifyStringColumn(cursor, expectedValues,
+ TvContract.Programs.COLUMN_SEASON_DISPLAY_NUMBER);
+ verifyStringColumn(cursor, expectedValues, TvContract.Programs.COLUMN_SEASON_TITLE);
+ verifyStringColumn(cursor, expectedValues,
+ TvContract.Programs.COLUMN_EPISODE_DISPLAY_NUMBER);
verifyStringColumn(cursor, expectedValues, TvContract.Programs.COLUMN_EPISODE_TITLE);
verifyLongColumn(cursor, expectedValues,
TvContract.Programs.COLUMN_START_TIME_UTC_MILLIS);
@@ -325,6 +334,21 @@
}
}
+ private void verifyDeprecatedColumsInProgram(Uri programUri, ContentValues expectedValues) {
+ final String[] DEPRECATED_COLUMNS_PROJECTION = {
+ TvContract.Programs.COLUMN_SEASON_NUMBER,
+ TvContract.Programs.COLUMN_EPISODE_NUMBER,
+ };
+ try (Cursor cursor = mContentResolver.query(
+ programUri, DEPRECATED_COLUMNS_PROJECTION, null, null, null)) {
+ assertNotNull(cursor);
+ assertEquals(cursor.getCount(), 1);
+ assertTrue(cursor.moveToNext());
+ verifyIntegerColumn(cursor, expectedValues, TvContract.Programs.COLUMN_SEASON_NUMBER);
+ verifyIntegerColumn(cursor, expectedValues, TvContract.Programs.COLUMN_EPISODE_NUMBER);
+ }
+ }
+
private void verifyLogoIsReadable(Uri logoUri) throws Exception {
try (AssetFileDescriptor fd = mContentResolver.openAssetFileDescriptor(logoUri, "r")) {
try (InputStream is = fd.createInputStream()) {
@@ -389,6 +413,45 @@
}
}
+ public void verifyProgramsTableWithDeprecatedColumns(Uri programsUri, long channelId) {
+ if (!Utils.hasTvInputFramework(getContext())) {
+ return;
+ }
+ // Test: insert
+ ContentValues expected = createDummyProgramValues(channelId);
+ expected.put(TvContract.Programs.COLUMN_SEASON_DISPLAY_NUMBER, "3");
+ expected.put(TvContract.Programs.COLUMN_EPISODE_DISPLAY_NUMBER, "9");
+
+ ContentValues input = new ContentValues(expected);
+ input.remove(TvContract.Programs.COLUMN_SEASON_DISPLAY_NUMBER);
+ input.remove(TvContract.Programs.COLUMN_EPISODE_DISPLAY_NUMBER);
+ input.put(TvContract.Programs.COLUMN_SEASON_NUMBER, 3);
+ input.put(TvContract.Programs.COLUMN_EPISODE_NUMBER, 9);
+
+ Uri rowUri = mContentResolver.insert(programsUri, input);
+ long programId = ContentUris.parseId(rowUri);
+ Uri programUri = TvContract.buildProgramUri(programId);
+ verifyProgram(programUri, expected, programId);
+ verifyDeprecatedColumsInProgram(programUri, input);
+
+ // Test: update
+ expected.put(TvContract.Programs.COLUMN_SEASON_DISPLAY_NUMBER, "4");
+ expected.put(TvContract.Programs.COLUMN_EPISODE_DISPLAY_NUMBER, "10");
+ input.put(TvContract.Programs.COLUMN_SEASON_NUMBER, 4);
+ input.put(TvContract.Programs.COLUMN_EPISODE_NUMBER, 10);
+
+ mContentResolver.update(programUri, input, null, null);
+ verifyProgram(programUri, expected, programId);
+ verifyDeprecatedColumsInProgram(programUri, input);
+
+ // Test: delete
+ mContentResolver.delete(programsUri, null, null);
+ try (Cursor cursor = mContentResolver.query(
+ programsUri, PROGRAMS_PROJECTION, null, null, null)) {
+ assertEquals(0, cursor.getCount());
+ }
+ }
+
public void testProgramsTable() throws Exception {
if (!Utils.hasTvInputFramework(getContext())) {
return;
@@ -400,6 +463,10 @@
verifyProgramsTable(TvContract.buildProgramsUriForChannel(channelId), channelId);
verifyProgramsTable(TvContract.buildProgramsUriForChannel(channelUri), channelId);
+ verifyProgramsTableWithDeprecatedColumns(TvContract.buildProgramsUriForChannel(channelId),
+ channelId);
+ verifyProgramsTableWithDeprecatedColumns(TvContract.buildProgramsUriForChannel(channelUri),
+ channelId);
}
private void verifyOverlap(long startMillis, long endMillis, int expectedCount,
@@ -463,8 +530,11 @@
assertEquals(recordedProgramId, cursor.getLong(cursor.getColumnIndex(
RecordedPrograms._ID)));
verifyLongColumn(cursor, expectedValues, RecordedPrograms.COLUMN_CHANNEL_ID);
- verifyIntegerColumn(cursor, expectedValues, RecordedPrograms.COLUMN_SEASON_NUMBER);
- verifyIntegerColumn(cursor, expectedValues, RecordedPrograms.COLUMN_EPISODE_NUMBER);
+ verifyStringColumn(cursor, expectedValues,
+ RecordedPrograms.COLUMN_SEASON_DISPLAY_NUMBER);
+ verifyStringColumn(cursor, expectedValues, RecordedPrograms.COLUMN_SEASON_TITLE);
+ verifyStringColumn(cursor, expectedValues,
+ RecordedPrograms.COLUMN_EPISODE_DISPLAY_NUMBER);
verifyStringColumn(cursor, expectedValues, RecordedPrograms.COLUMN_EPISODE_TITLE);
verifyLongColumn(cursor, expectedValues, RecordedPrograms.COLUMN_START_TIME_UTC_MILLIS);
verifyLongColumn(cursor, expectedValues, RecordedPrograms.COLUMN_END_TIME_UTC_MILLIS);
@@ -502,7 +572,7 @@
private void verifyRecordedProgramsTable(Uri recordedProgramsUri, long channelId) {
// Test: insert
- ContentValues values = createDummyRecordedProgramValues(channelId);
+ ContentValues values = createDummyRecordedProgramValues(mInputId, channelId);
Uri rowUri = mContentResolver.insert(recordedProgramsUri, values);
long recordedProgramId = ContentUris.parseId(rowUri);
@@ -845,6 +915,9 @@
}
public void testBroadcastGenreEncodeDecode() {
+ if (!Utils.hasTvInputFramework(getContext())) {
+ return;
+ }
String[] broadcastGenre = new String[] {"Animation", "Classic, opera"};
insertProgramWithBroadcastGenre(broadcastGenre);
try (Cursor c = mContentResolver.query(TvContract.Programs.CONTENT_URI,
@@ -857,6 +930,9 @@
}
public void testBroadcastGenreQueryChannel() {
+ if (!Utils.hasTvInputFramework(getContext())) {
+ return;
+ }
// "Animation" is mapped to Genres.MOVIES
// "Classic, opera" is mapped to Genres.MUSIC
insertProgramWithBroadcastGenre(new String[]{"Animation"});
@@ -867,4 +943,12 @@
// There are two channels which belong to MUSIC genre - channel 2 and 3.
verifyChannelCountWithCanonicalGenre(Genres.MUSIC, 2);
}
+
+ public void testGenresIsCanonical() {
+ if (!Utils.hasTvInputFramework(getContext())) {
+ return;
+ }
+ assertTrue(Genres.isCanonical(Genres.DRAMA));
+ assertFalse(Genres.isCanonical("Not a genre"));
+ }
}
diff --git a/tests/tests/uirendering/res/drawable-nodpi/black1.png b/tests/tests/uirendering/res/drawable-nodpi/black1.png
index bbfc2c1..d1c246a 100644
--- a/tests/tests/uirendering/res/drawable-nodpi/black1.png
+++ b/tests/tests/uirendering/res/drawable-nodpi/black1.png
Binary files differ
diff --git a/tests/tests/uirendering/res/drawable-nodpi/blackitalic1.png b/tests/tests/uirendering/res/drawable-nodpi/blackitalic1.png
index 6a8a830..d162afc 100644
--- a/tests/tests/uirendering/res/drawable-nodpi/blackitalic1.png
+++ b/tests/tests/uirendering/res/drawable-nodpi/blackitalic1.png
Binary files differ
diff --git a/tests/tests/uirendering/res/drawable-nodpi/bold1.png b/tests/tests/uirendering/res/drawable-nodpi/bold1.png
index cd0465b..b9f5218 100644
--- a/tests/tests/uirendering/res/drawable-nodpi/bold1.png
+++ b/tests/tests/uirendering/res/drawable-nodpi/bold1.png
Binary files differ
diff --git a/tests/tests/uirendering/res/drawable-nodpi/bolditalic1.png b/tests/tests/uirendering/res/drawable-nodpi/bolditalic1.png
index 0819c8a..3a0aa23 100644
--- a/tests/tests/uirendering/res/drawable-nodpi/bolditalic1.png
+++ b/tests/tests/uirendering/res/drawable-nodpi/bolditalic1.png
Binary files differ
diff --git a/tests/tests/uirendering/res/drawable-nodpi/condensed1.png b/tests/tests/uirendering/res/drawable-nodpi/condensed1.png
index 16f03e2..88c8bef 100644
--- a/tests/tests/uirendering/res/drawable-nodpi/condensed1.png
+++ b/tests/tests/uirendering/res/drawable-nodpi/condensed1.png
Binary files differ
diff --git a/tests/tests/uirendering/res/drawable-nodpi/condensedbold1.png b/tests/tests/uirendering/res/drawable-nodpi/condensedbold1.png
index 98174f0..8318a51 100644
--- a/tests/tests/uirendering/res/drawable-nodpi/condensedbold1.png
+++ b/tests/tests/uirendering/res/drawable-nodpi/condensedbold1.png
Binary files differ
diff --git a/tests/tests/uirendering/res/drawable-nodpi/condensedbolditalic1.png b/tests/tests/uirendering/res/drawable-nodpi/condensedbolditalic1.png
index 8b017ba..4cae84d 100644
--- a/tests/tests/uirendering/res/drawable-nodpi/condensedbolditalic1.png
+++ b/tests/tests/uirendering/res/drawable-nodpi/condensedbolditalic1.png
Binary files differ
diff --git a/tests/tests/uirendering/res/drawable-nodpi/condenseditalic1.png b/tests/tests/uirendering/res/drawable-nodpi/condenseditalic1.png
index 5fc1f9c..50d0d38 100644
--- a/tests/tests/uirendering/res/drawable-nodpi/condenseditalic1.png
+++ b/tests/tests/uirendering/res/drawable-nodpi/condenseditalic1.png
Binary files differ
diff --git a/tests/tests/uirendering/res/drawable-nodpi/condensedlight1.png b/tests/tests/uirendering/res/drawable-nodpi/condensedlight1.png
index 1aca9cf..df758a5 100644
--- a/tests/tests/uirendering/res/drawable-nodpi/condensedlight1.png
+++ b/tests/tests/uirendering/res/drawable-nodpi/condensedlight1.png
Binary files differ
diff --git a/tests/tests/uirendering/res/drawable-nodpi/condensedlightitalic1.png b/tests/tests/uirendering/res/drawable-nodpi/condensedlightitalic1.png
index 47ecd67..f2959d6 100644
--- a/tests/tests/uirendering/res/drawable-nodpi/condensedlightitalic1.png
+++ b/tests/tests/uirendering/res/drawable-nodpi/condensedlightitalic1.png
Binary files differ
diff --git a/tests/tests/uirendering/res/drawable-nodpi/hello1.png b/tests/tests/uirendering/res/drawable-nodpi/hello1.png
index 6c9cb58..6ae9850 100644
--- a/tests/tests/uirendering/res/drawable-nodpi/hello1.png
+++ b/tests/tests/uirendering/res/drawable-nodpi/hello1.png
Binary files differ
diff --git a/tests/tests/uirendering/res/drawable-nodpi/italic1.png b/tests/tests/uirendering/res/drawable-nodpi/italic1.png
index 0afb3ae..5083186 100644
--- a/tests/tests/uirendering/res/drawable-nodpi/italic1.png
+++ b/tests/tests/uirendering/res/drawable-nodpi/italic1.png
Binary files differ
diff --git a/tests/tests/uirendering/res/drawable-nodpi/light1.png b/tests/tests/uirendering/res/drawable-nodpi/light1.png
index 6822edb..bb829d7 100644
--- a/tests/tests/uirendering/res/drawable-nodpi/light1.png
+++ b/tests/tests/uirendering/res/drawable-nodpi/light1.png
Binary files differ
diff --git a/tests/tests/uirendering/res/drawable-nodpi/lightitalic1.png b/tests/tests/uirendering/res/drawable-nodpi/lightitalic1.png
index b49d2d6..ee3a210 100644
--- a/tests/tests/uirendering/res/drawable-nodpi/lightitalic1.png
+++ b/tests/tests/uirendering/res/drawable-nodpi/lightitalic1.png
Binary files differ
diff --git a/tests/tests/uirendering/res/drawable-nodpi/medium1.png b/tests/tests/uirendering/res/drawable-nodpi/medium1.png
index 5b187bc..c4c047d 100644
--- a/tests/tests/uirendering/res/drawable-nodpi/medium1.png
+++ b/tests/tests/uirendering/res/drawable-nodpi/medium1.png
Binary files differ
diff --git a/tests/tests/uirendering/res/drawable-nodpi/mediumitalic1.png b/tests/tests/uirendering/res/drawable-nodpi/mediumitalic1.png
index 057edc0..1f94b86 100644
--- a/tests/tests/uirendering/res/drawable-nodpi/mediumitalic1.png
+++ b/tests/tests/uirendering/res/drawable-nodpi/mediumitalic1.png
Binary files differ
diff --git a/tests/tests/uirendering/res/drawable-nodpi/thin1.png b/tests/tests/uirendering/res/drawable-nodpi/thin1.png
index a780f16..af0aabd 100644
--- a/tests/tests/uirendering/res/drawable-nodpi/thin1.png
+++ b/tests/tests/uirendering/res/drawable-nodpi/thin1.png
Binary files differ
diff --git a/tests/tests/uirendering/res/drawable-nodpi/thinitalic1.png b/tests/tests/uirendering/res/drawable-nodpi/thinitalic1.png
index 6ddb52b..da6c3bc 100644
--- a/tests/tests/uirendering/res/drawable-nodpi/thinitalic1.png
+++ b/tests/tests/uirendering/res/drawable-nodpi/thinitalic1.png
Binary files differ
diff --git a/tests/tests/view/res/drawable/custom_pointer_icon.xml b/tests/tests/view/res/drawable/custom_pointer_icon.xml
new file mode 100644
index 0000000..fc5a9e1
--- /dev/null
+++ b/tests/tests/view/res/drawable/custom_pointer_icon.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"
+ android:bitmap="@drawable/icon_red"
+ android:hotSpotX="16dp"
+ android:hotSpotY="16dp" />
diff --git a/tests/tests/view/res/layout/view_layout.xml b/tests/tests/view/res/layout/view_layout.xml
index 07a9f0d..9769aa4 100644
--- a/tests/tests/view/res/layout/view_layout.xml
+++ b/tests/tests/view/res/layout/view_layout.xml
@@ -110,13 +110,16 @@
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
- android:layout_height="50px"
+ android:layout_height="70px"
android:pointerShape="crosshair">
<View android:layout_width="match_parent"
android:layout_height="20px"
android:pointerShape="help"/>
<View android:layout_width="match_parent"
android:layout_height="20px"/>
+ <View android:layout_width="match_parent"
+ android:layout_height="20px"
+ android:pointerShape="@drawable/custom_pointer_icon"/>
</LinearLayout>
</LinearLayout>
diff --git a/tests/tests/view/src/android/view/cts/FrameMetricsListenerTest.java b/tests/tests/view/src/android/view/cts/FrameMetricsListenerTest.java
new file mode 100644
index 0000000..860c394
--- /dev/null
+++ b/tests/tests/view/src/android/view/cts/FrameMetricsListenerTest.java
@@ -0,0 +1,243 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.view.cts;
+
+import android.view.cts.R;
+
+import android.app.Activity;
+import android.app.Instrumentation;
+import android.cts.util.PollingCheck;
+import android.os.Looper;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.SystemClock;
+import android.test.ActivityInstrumentationTestCase2;
+import android.util.Log;
+import android.view.FrameMetrics;
+import android.view.View;
+import android.view.Window;
+import android.widget.ScrollView;
+
+import java.lang.Thread;
+import java.lang.Exception;
+import java.lang.System;
+import java.util.ArrayList;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class FrameMetricsListenerTest extends ActivityInstrumentationTestCase2<MockActivity> {
+
+ private Instrumentation mInstrumentation;
+ private Window.FrameMetricsListener mFrameMetricsListener;
+ private Activity mActivity;
+
+ public FrameMetricsListenerTest() {
+ super(MockActivity.class);
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ mActivity = getActivity();
+ mInstrumentation = getInstrumentation();
+ }
+
+ private void layout(final int layoutId) {
+ mInstrumentation.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ mActivity.setContentView(layoutId);
+ }
+ });
+ mInstrumentation.waitForIdleSync();
+ }
+
+ public void testReceiveData() throws Throwable {
+ layout(R.layout.scrollview_layout);
+ final ScrollView scrollView = (ScrollView) mActivity.findViewById(R.id.scroll_view);
+ final ArrayList<FrameMetrics> data = new ArrayList<>();
+ final Handler handler = new Handler(Looper.getMainLooper());
+ final Window myWindow = mActivity.getWindow();
+ final Window.FrameMetricsListener listener =
+ new Window.FrameMetricsListener() {
+ @Override
+ public void onMetricsAvailable(Window window, FrameMetrics frameMetrics, int dropCount) {
+ assertEquals(myWindow, window);
+ assertEquals(0, dropCount);
+ data.add(new FrameMetrics(frameMetrics));
+ }
+ };
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mActivity.getWindow().addFrameMetricsListener(listener, handler);
+ }
+ });
+
+ mInstrumentation.waitForIdleSync();
+
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ scrollView.fling(-100);
+ }
+ });
+
+ mInstrumentation.waitForIdleSync();
+ new PollingCheck() {
+ @Override
+ protected boolean check() {
+ return data.size() != 0;
+ }
+ }.run();
+
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mActivity.getWindow().removeFrameMetricsListener(listener);
+ data.clear();
+ }
+ });
+
+ mInstrumentation.waitForIdleSync();
+
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ scrollView.fling(100);
+ assertEquals(0, data.size());
+ }
+ });
+
+ mInstrumentation.waitForIdleSync();
+ }
+
+ public void testMultipleListeners() throws Throwable {
+ layout(R.layout.scrollview_layout);
+ final ScrollView scrollView = (ScrollView) mActivity.findViewById(R.id.scroll_view);
+ final ArrayList<FrameMetrics> data1 = new ArrayList<>();
+ final Handler handler = new Handler(Looper.getMainLooper());
+ final Window myWindow = mActivity.getWindow();
+
+ final Window.FrameMetricsListener frameMetricsListener1 =
+ new Window.FrameMetricsListener() {
+ @Override
+ public void onMetricsAvailable(Window window, FrameMetrics frameMetrics, int dropCount) {
+ assertEquals(myWindow, window);
+ assertEquals(0, dropCount);
+ data1.add(new FrameMetrics(frameMetrics));
+ }
+ };
+ final ArrayList<FrameMetrics> data2 = new ArrayList<>();
+ final Window.FrameMetricsListener frameMetricsListener2 =
+ new Window.FrameMetricsListener() {
+ @Override
+ public void onMetricsAvailable(Window window, FrameMetrics frameMetrics, int dropCount) {
+ assertEquals(myWindow, window);
+ assertEquals(0, dropCount);
+ data2.add(new FrameMetrics(frameMetrics));
+ }
+ };
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mActivity.getWindow().addFrameMetricsListener(frameMetricsListener1, handler);
+ mActivity.getWindow().addFrameMetricsListener(frameMetricsListener2, handler);
+ }
+ });
+
+ mInstrumentation.waitForIdleSync();
+
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ scrollView.fling(-100);
+ }
+ });
+
+ mInstrumentation.waitForIdleSync();
+ new PollingCheck() {
+ @Override
+ protected boolean check() {
+ return data1.size() != 0 && data1.size() == data2.size();
+ }
+ }.run();
+
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mActivity.getWindow().removeFrameMetricsListener(frameMetricsListener1);
+ mActivity.getWindow().removeFrameMetricsListener(frameMetricsListener2);
+ }
+ });
+ }
+
+ public void testDropCount() throws Throwable {
+ layout(R.layout.scrollview_layout);
+ final ScrollView scrollView = (ScrollView) mActivity.findViewById(R.id.scroll_view);
+
+ final Window window = mActivity.getWindow();
+ final AtomicInteger framesDropped = new AtomicInteger();
+ final AtomicInteger frameCount = new AtomicInteger();
+
+ final HandlerThread thread = new HandlerThread("Listener");
+ thread.start();
+ final Handler handler = new Handler(thread.getLooper());
+ final Window.FrameMetricsListener frameMetricsListener =
+ new Window.FrameMetricsListener() {
+ @Override
+ public void onMetricsAvailable(Window window, FrameMetrics frameMetrics, int dropCount) {
+ try {
+ Thread.sleep(100);
+ framesDropped.addAndGet(dropCount);
+ } catch (Exception e) { }
+ }
+ };
+
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mActivity.getWindow().addFrameMetricsListener(frameMetricsListener, handler);
+ }
+ });
+
+ mInstrumentation.waitForIdleSync();
+
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ scrollView.fling(-100);
+ }
+ });
+
+ mInstrumentation.waitForIdleSync();
+ new PollingCheck() {
+ @Override
+ protected boolean check() {
+ return framesDropped.get() > 0;
+ }
+ }.run();
+
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mActivity.getWindow().removeFrameMetricsListener(frameMetricsListener);
+ }
+ });
+ }
+}
+
+
diff --git a/tests/tests/view/src/android/view/cts/MockView.java b/tests/tests/view/src/android/view/cts/MockView.java
index d6939dc..0a56369 100644
--- a/tests/tests/view/src/android/view/cts/MockView.java
+++ b/tests/tests/view/src/android/view/cts/MockView.java
@@ -17,7 +17,6 @@
package android.view.cts;
import android.content.Context;
-import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
@@ -28,9 +27,9 @@
import android.view.ContextMenu;
import android.view.KeyEvent;
import android.view.MotionEvent;
+import android.view.PointerIcon;
import android.view.View;
import android.view.ViewGroup;
-import android.view.ViewParent;
import android.view.ContextMenu.ContextMenuInfo;
public class MockView extends View {
@@ -70,6 +69,7 @@
private boolean mCalledComputeScroll = false;
private boolean mCalledDispatchKeyEventPreIme = false;
private boolean mCalledOnKeyPreIme = false;
+ private boolean mCalledGetPointerIcon = false;
private int mOldWidth = -1;
private int mOldHeight = -1;
@@ -606,6 +606,16 @@
return mCalledOnKeyPreIme;
}
+ @Override
+ public PointerIcon getPointerIcon(MotionEvent event, float x, float y) {
+ mCalledGetPointerIcon = true;
+ return super.getPointerIcon(event, x, y);
+ }
+
+ public boolean hasCalledGetPointerIcon() {
+ return mCalledGetPointerIcon;
+ }
+
public void reset() {
mCalledOnCreateContextMenu = false;
@@ -644,6 +654,7 @@
mCalledComputeScroll = false;
mCalledDispatchKeyEventPreIme = false;
mCalledOnKeyPreIme = false;
+ mCalledGetPointerIcon = false;
mOldWidth = -1;
mOldHeight = -1;
diff --git a/tests/tests/view/src/android/view/cts/ViewTest.java b/tests/tests/view/src/android/view/cts/ViewTest.java
index c3fe030..1e23660 100644
--- a/tests/tests/view/src/android/view/cts/ViewTest.java
+++ b/tests/tests/view/src/android/view/cts/ViewTest.java
@@ -18,6 +18,7 @@
import static org.mockito.Mockito.*;
+import android.graphics.BitmapFactory;
import com.android.internal.view.menu.ContextMenuBuilder;
import android.content.Context;
@@ -353,29 +354,104 @@
assertNull(view.getTouchDelegate());
}
+ public void testMouseEventCallsGetPointerIcon() {
+ final MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
+
+ final int[] xy = new int[2];
+ view.getLocationOnScreen(xy);
+ final int viewWidth = view.getWidth();
+ final int viewHeight = view.getHeight();
+ float x = xy[0] + viewWidth / 2.0f;
+ float y = xy[1] + viewHeight / 2.0f;
+
+ long eventTime = SystemClock.uptimeMillis();
+
+ MotionEvent.PointerCoords[] pointerCoords = new MotionEvent.PointerCoords[1];
+ pointerCoords[0] = new MotionEvent.PointerCoords();
+ pointerCoords[0].x = x;
+ pointerCoords[0].y = y;
+
+ final int[] pointerIds = new int[1];
+ pointerIds[0] = 0;
+
+ MotionEvent event = MotionEvent.obtain(0, eventTime, MotionEvent.ACTION_HOVER_MOVE,
+ 1, pointerIds, pointerCoords, 0, 0, 0, 0, 0, InputDevice.SOURCE_MOUSE, 0);
+ getInstrumentation().sendPointerSync(event);
+ getInstrumentation().waitForIdleSync();
+
+ assertTrue(view.hasCalledGetPointerIcon());
+
+ final MockView view2 = (MockView) mActivity.findViewById(R.id.scroll_view);
+ assertFalse(view2.hasCalledGetPointerIcon());
+ }
+
public void testAccessPointerShape() {
View view = mActivity.findViewById(R.id.pointer_icon_layout);
MotionEvent event = MotionEvent.obtain(0, 0, MotionEvent.ACTION_HOVER_MOVE,
view.getX(), view.getY(), 0);
+ // First view has pointerShape="help"
assertEquals(PointerIcon.getSystemIcon(mActivity, PointerIcon.STYLE_HELP),
view.getPointerIcon(event, 0, 0));
+ // Second view inherits pointerShape="crosshair" from the parent
event.setLocation(0, 21);
assertEquals(PointerIcon.getSystemIcon(mActivity, PointerIcon.STYLE_CROSSHAIR),
view.getPointerIcon(event, 0, 21));
+
+ // Third view has custom pointer shape defined in a resource.
event.setLocation(0, 41);
+ assertNotNull(view.getPointerIcon(event, 0, 41));
+
+ // Parent view has pointerShape="crosshair"
+ event.setLocation(0, 61);
assertEquals(PointerIcon.getSystemIcon(mActivity, PointerIcon.STYLE_CROSSHAIR),
- view.getPointerIcon(event, 0, 41));
- event.setLocation(0, 51);
- assertNull(view.getPointerIcon(event, 0, 51));
+ view.getPointerIcon(event, 0, 61));
+
+ // Outside of the parent view, no pointer shape defined.
+ event.setLocation(0, 71);
+ assertNull(view.getPointerIcon(event, 0, 71));
view.setPointerIcon(PointerIcon.getSystemIcon(mActivity, PointerIcon.STYLE_TEXT));
assertEquals(PointerIcon.getSystemIcon(mActivity, PointerIcon.STYLE_TEXT),
- view.getPointerIcon(event, 0, 51));
+ view.getPointerIcon(event, 0,71));
event.recycle();
}
+ public void testCreatePointerIcons() {
+ assertSystemPointerIcon(PointerIcon.STYLE_NULL);
+ assertSystemPointerIcon(PointerIcon.STYLE_DEFAULT);
+ assertSystemPointerIcon(PointerIcon.STYLE_ARROW);
+ assertSystemPointerIcon(PointerIcon.STYLE_CONTEXT_MENU);
+ assertSystemPointerIcon(PointerIcon.STYLE_HAND);
+ assertSystemPointerIcon(PointerIcon.STYLE_HELP);
+ assertSystemPointerIcon(PointerIcon.STYLE_WAIT);
+ assertSystemPointerIcon(PointerIcon.STYLE_CELL);
+ assertSystemPointerIcon(PointerIcon.STYLE_CROSSHAIR);
+ assertSystemPointerIcon(PointerIcon.STYLE_TEXT);
+ assertSystemPointerIcon(PointerIcon.STYLE_VERTICAL_TEXT);
+ assertSystemPointerIcon(PointerIcon.STYLE_ALIAS);
+ assertSystemPointerIcon(PointerIcon.STYLE_COPY);
+ assertSystemPointerIcon(PointerIcon.STYLE_NO_DROP);
+ assertSystemPointerIcon(PointerIcon.STYLE_ALL_SCROLL);
+ assertSystemPointerIcon(PointerIcon.STYLE_HORIZONTAL_DOUBLE_ARROW);
+ assertSystemPointerIcon(PointerIcon.STYLE_VERTICAL_DOUBLE_ARROW);
+ assertSystemPointerIcon(PointerIcon.STYLE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW);
+ assertSystemPointerIcon(PointerIcon.STYLE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW);
+ assertSystemPointerIcon(PointerIcon.STYLE_ZOOM_IN);
+ assertSystemPointerIcon(PointerIcon.STYLE_ZOOM_OUT);
+ assertSystemPointerIcon(PointerIcon.STYLE_GRAB);
+
+ assertNotNull(PointerIcon.loadCustomIcon(mResources, R.drawable.custom_pointer_icon));
+
+ Bitmap bitmap = BitmapFactory.decodeResource(mResources, R.drawable.icon_blue);
+ assertNotNull(PointerIcon.createCustomIcon(bitmap, 0, 0));
+ }
+
+ private void assertSystemPointerIcon(int style) {
+ assertNotNull(PointerIcon.getSystemIcon(mActivity, style));
+ }
+
@UiThreadTest
public void testAccessTag() {
ViewGroup viewGroup = (ViewGroup) mActivity.findViewById(R.id.viewlayout_root);
diff --git a/tests/tests/view/src/android/view/inputmethod/cts/InputConnectionWrapperTest.java b/tests/tests/view/src/android/view/inputmethod/cts/InputConnectionWrapperTest.java
index 432fa20..b939346 100644
--- a/tests/tests/view/src/android/view/inputmethod/cts/InputConnectionWrapperTest.java
+++ b/tests/tests/view/src/android/view/inputmethod/cts/InputConnectionWrapperTest.java
@@ -18,6 +18,7 @@
import android.os.Bundle;
+import android.os.Handler;
import android.test.AndroidTestCase;
import android.text.TextUtils;
import android.view.KeyEvent;
@@ -88,6 +89,9 @@
assertTrue(inputConnection.isSetComposingRegionCalled);
wrapper.requestCursorUpdates(InputConnection.CURSOR_UPDATE_IMMEDIATE);
assertTrue(inputConnection.isRequestCursorUpdatesCalled);
+ assertFalse(inputConnection.isGetHandlerCalled);
+ assertNull(inputConnection.getHandler());
+ assertTrue(inputConnection.isGetHandlerCalled);
}
private class MockInputConnection implements InputConnection {
@@ -114,6 +118,7 @@
public boolean isSetComposingRegionCalled;
public boolean isSetSelectionCalled;
public boolean isRequestCursorUpdatesCalled;
+ public boolean isGetHandlerCalled;
public boolean beginBatchEdit() {
isBeginBatchEditCalled = true;
@@ -229,5 +234,10 @@
isRequestCursorUpdatesCalled = true;
return false;
}
+
+ public Handler getHandler() {
+ isGetHandlerCalled = true;
+ return null;
+ }
}
}
diff --git a/tests/tests/view/src/android/view/inputmethod/cts/InputMethodInfoTest.java b/tests/tests/view/src/android/view/inputmethod/cts/InputMethodInfoTest.java
index 1a067b4..2b02324 100644
--- a/tests/tests/view/src/android/view/inputmethod/cts/InputMethodInfoTest.java
+++ b/tests/tests/view/src/android/view/inputmethod/cts/InputMethodInfoTest.java
@@ -25,6 +25,7 @@
import android.content.pm.ServiceInfo;
import android.content.res.Resources;
import android.os.Parcel;
+import android.os.storage.StorageManager;
import android.test.AndroidTestCase;
import android.util.Printer;
import android.view.inputmethod.InputMethod;
@@ -37,7 +38,6 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.HashMap;
import java.util.List;
public class InputMethodInfoTest extends AndroidTestCase {
@@ -202,10 +202,9 @@
return;
}
- final InputMethodManager imm = (InputMethodManager) mContext
- .getSystemService(Context.INPUT_METHOD_SERVICE);
+ final InputMethodManager imm = mContext.getSystemService(InputMethodManager.class);
final List<InputMethodInfo> imis = imm.getInputMethodList();
- final ArrayList<String> localeList = new ArrayList<String>(Arrays.asList(
+ final ArrayList<String> localeList = new ArrayList<>(Arrays.asList(
Resources.getSystem().getAssets().getLocales()));
boolean foundEnabledSystemImeSubtypeWithValidLanguage = false;
for (InputMethodInfo imi : imis) {
@@ -239,6 +238,36 @@
assertTrue(foundEnabledSystemImeSubtypeWithValidLanguage);
}
+ public void testAtLeastOneEncryptionAwareInputMethodIsAvailable() {
+ if (!getContext().getPackageManager().hasSystemFeature(
+ PackageManager.FEATURE_INPUT_METHODS)) {
+ return;
+ }
+
+ if (!StorageManager.isFileBasedEncryptionEnabled()) {
+ return;
+ }
+
+ final InputMethodManager imm = mContext.getSystemService(InputMethodManager.class);
+ final List<InputMethodInfo> imis = imm.getInputMethodList();
+ boolean hasEncryptionAwareInputMethod = false;
+ for (final InputMethodInfo imi : imis) {
+ final ServiceInfo serviceInfo = imi.getServiceInfo();
+ if (serviceInfo == null) {
+ continue;
+ }
+ if ((serviceInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) !=
+ ApplicationInfo.FLAG_SYSTEM) {
+ continue;
+ }
+ if (serviceInfo.encryptionAware) {
+ hasEncryptionAwareInputMethod = true;
+ break;
+ }
+ }
+ assertTrue(hasEncryptionAwareInputMethod);
+ }
+
class MockPrinter implements Printer {
@Override
public void println(String x) {
diff --git a/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java b/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java
index ff580e3..db67787 100644
--- a/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java
+++ b/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java
@@ -494,7 +494,7 @@
TransitionListener exitListener = mock(TransitionListener.class);
Transition exitTransition = new BaseTransition();
- enterTransition.addListener(enterListener);
+ exitTransition.addListener(exitListener);
OnDismissListener dismissListener = mock(OnDismissListener.class);
@@ -513,7 +513,7 @@
}
});
mInstrumentation.waitForIdleSync();
- verify(enterListener, times(1)).onTransitionStart(enterTransition);
+ verify(enterListener, times(1)).onTransitionStart(any(Transition.class));
verify(exitListener, never()).onTransitionStart(any(Transition.class));
verify(dismissListener, never()).onDismiss();
@@ -523,13 +523,9 @@
}
});
mInstrumentation.waitForIdleSync();
- verify(enterListener, times(1)).onTransitionStart(enterTransition);
- verify(exitListener, times(1)).onTransitionStart(exitTransition);
+ verify(enterListener, times(1)).onTransitionStart(any(Transition.class));
+ verify(exitListener, times(1)).onTransitionStart(any(Transition.class));
verify(dismissListener, times(1)).onDismiss();
-
- InOrder inOrder = inOrder(exitListener, dismissListener);
- inOrder.verify(exitListener).onTransitionEnd(exitTransition);
- inOrder.verify(dismissListener).onDismiss();
}
public void testUpdatePositionAndDimension() {
@@ -860,7 +856,7 @@
private View createPopupContent() {
View popupView = new View(mActivity);
popupView.setLayoutParams(new ViewGroup.LayoutParams(50, 50));
- popupView.setBackgroundColor(Color.WHITE);
+ popupView.setBackgroundColor(Color.MAGENTA);
return popupView;
}
diff --git a/tests/tests/widget/src/android/widget/cts/ToolbarTest.java b/tests/tests/widget/src/android/widget/cts/ToolbarTest.java
index 6bbcd4c..09414ce 100644
--- a/tests/tests/widget/src/android/widget/cts/ToolbarTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ToolbarTest.java
@@ -47,7 +47,7 @@
@UiThreadTest
public void testSetTitleMargins() {
- Toolbar toolbar = new Toolbar(mContext);
+ Toolbar toolbar = new Toolbar(mContext, null, 0, 0);
assertEquals(0, toolbar.getTitleMarginStart());
assertEquals(0, toolbar.getTitleMarginTop());
assertEquals(0, toolbar.getTitleMarginEnd());
diff --git a/tools/cts-tradefed/Android.mk b/tools/cts-tradefed/Android.mk
index 2f743e6..06cacd5 100644
--- a/tools/cts-tradefed/Android.mk
+++ b/tools/cts-tradefed/Android.mk
@@ -21,7 +21,7 @@
LOCAL_JAVA_RESOURCE_DIRS := res
LOCAL_JAVA_RESOURCE_DIRS += ../../common/host-side/tradefed/res
-LOCAL_SUITE_BUILD_NUMBER := $(BUILD_NUMBER)
+LOCAL_SUITE_BUILD_NUMBER := $(BUILD_NUMBER_FROM_FILE)
LOCAL_SUITE_NAME := CTS_V2
LOCAL_SUITE_FULLNAME := "Compatibility Test Suite"
LOCAL_SUITE_VERSION := 5.0
diff --git a/tools/cts-tradefed/res/config/basic-reporters.xml b/tools/cts-tradefed/res/config/basic-reporters.xml
new file mode 100644
index 0000000..df51e4c
--- /dev/null
+++ b/tools/cts-tradefed/res/config/basic-reporters.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<configuration description="Configuration with basic cts v2 reporters" >
+</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-preconditions.xml b/tools/cts-tradefed/res/config/cts-preconditions.xml
index 9f0a8c9..7f93182 100644
--- a/tools/cts-tradefed/res/config/cts-preconditions.xml
+++ b/tools/cts-tradefed/res/config/cts-preconditions.xml
@@ -19,12 +19,18 @@
<target_preparer class="com.android.compatibility.common.tradefed.targetprep.DynamicConfigPusher">
<option name="target" value="host" />
- <option name="module-name" value="cts_v2"/>
- <option name="version-name" value="1.0"/>
+ <option name="config-filename" value="cts_v2"/>
+ <option name="version" value="1.0"/>
</target_preparer>
<target_preparer class="com.android.compatibility.common.tradefed.targetprep.StayAwakePreparer" />
+ <target_preparer class="com.android.compatibility.common.tradefed.targetprep.SettingsPreparer">
+ <option name="device-setting" value="verifier_verify_adb_installs"/>
+ <option name="setting-type" value="global"/>
+ <option name="set-value" value="0"/>
+ </target_preparer>
+
<target_preparer class="com.android.compatibility.common.tradefed.targetprep.ApkPreconditionCheck">
<option name="apk" value="CtsPreconditions.apk"/>
<option name="package" value="com.android.preconditions.cts"/>
diff --git a/tools/cts-tradefed/res/config/cts.xml b/tools/cts-tradefed/res/config/cts.xml
index 8e34297..8104570 100644
--- a/tools/cts-tradefed/res/config/cts.xml
+++ b/tools/cts-tradefed/res/config/cts.xml
@@ -40,5 +40,5 @@
<option name="expected-value" value="en-US"/> <!-- Device locale should be US English -->
<option name="throw-error" value="false"/> <!-- Only print warning if not en-US -->
</target_preparer>
-
+ <template-include name="reporters" default="basic-reporters" />
</configuration>
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DeqpTestRunner.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DeqpTestRunner.java
index 66fcd44..7bde54e 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DeqpTestRunner.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DeqpTestRunner.java
@@ -311,6 +311,8 @@
final Map<String, String> emptyMap = Collections.emptyMap();
mSink.testEnded(testId, emptyMap);
+ } else {
+ CLog.w("Finalization for non-pending case %s", testId);
}
}
@@ -372,6 +374,8 @@
public void abortTest(TestIdentifier testId, String errorMessage) {
final PendingResult result = mPendingResults.get(testId);
+ CLog.i("Test %s aborted with message %s", testId, errorMessage);
+
// Mark as executed
result.allInstancesPassed = false;
result.errorMessages.put(mRunConfig, errorMessage);
@@ -390,37 +394,57 @@
/**
* Handles beginning of dEQP session.
*/
- private void handleBeginSession(Map<String, String> values) {
+ private boolean handleBeginSession(Map<String, String> values) {
// ignore
+ return true;
+ }
+
+ /**
+ * Handle session info
+ */
+ private boolean handleSessionInfo(Map<String, String> values) {
+ // ignore
+ return true;
}
/**
* Handles end of dEQP session.
*/
- private void handleEndSession(Map<String, String> values) {
+ private boolean handleEndSession(Map<String, String> values) {
// ignore
+ return true;
}
/**
* Handles beginning of dEQP testcase.
*/
- private void handleBeginTestCase(Map<String, String> values) {
- mCurrentTestId = pathToIdentifier(values.get("dEQP-BeginTestCase-TestCasePath"));
+ private boolean handleBeginTestCase(Map<String, String> values) {
+ String casePath = values.get("dEQP-BeginTestCase-TestCasePath");
+
mCurrentTestLog = "";
mGotTestResult = false;
+ if (casePath == null) {
+ CLog.w("Got null case path for test case begin event. Current test ID: %s", mCurrentTestId);
+ mCurrentTestId = null;
+ return false;
+ }
+
+ mCurrentTestId = pathToIdentifier(casePath);
+
// mark instance as started
if (mPendingResults.get(mCurrentTestId) != null) {
mPendingResults.get(mCurrentTestId).remainingConfigs.remove(mRunConfig);
} else {
CLog.w("Got unexpected start of %s", mCurrentTestId);
}
+ return true;
}
/**
* Handles end of dEQP testcase.
*/
- private void handleEndTestCase(Map<String, String> values) {
+ private boolean handleEndTestCase(Map<String, String> values) {
final PendingResult result = mPendingResults.get(mCurrentTestId);
if (result != null) {
@@ -442,19 +466,24 @@
CLog.w("Got unexpected end of %s", mCurrentTestId);
}
mCurrentTestId = null;
+ return true;
}
/**
* Handles dEQP testcase result.
*/
- private void handleTestCaseResult(Map<String, String> values) {
+ private boolean handleTestCaseResult(Map<String, String> values) {
String code = values.get("dEQP-TestCaseResult-Code");
+ if (code == null) {
+ return false;
+ }
+
String details = values.get("dEQP-TestCaseResult-Details");
if (mPendingResults.get(mCurrentTestId) == null) {
CLog.w("Got unexpected result for %s", mCurrentTestId);
mGotTestResult = true;
- return;
+ return true;
}
if (code.compareTo("Pass") == 0) {
@@ -480,12 +509,13 @@
mGotTestResult = true;
CLog.e("Got invalid result code '%s' for test %s", code, mCurrentTestId);
}
+ return true;
}
/**
* Handles terminated dEQP testcase.
*/
- private void handleTestCaseTerminate(Map<String, String> values) {
+ private boolean handleTestCaseTerminate(Map<String, String> values) {
final PendingResult result = mPendingResults.get(mCurrentTestId);
if (result != null) {
@@ -504,40 +534,52 @@
mCurrentTestId = null;
mGotTestResult = true;
+ return true;
}
/**
* Handles dEQP testlog data.
*/
- private void handleTestLogData(Map<String, String> values) {
- mCurrentTestLog = mCurrentTestLog + values.get("dEQP-TestLogData-Log");
+ private boolean handleTestLogData(Map<String, String> values) {
+ String newLog = values.get("dEQP-TestLogData-Log");
+ if (newLog == null) {
+ return false;
+ }
+ mCurrentTestLog = mCurrentTestLog + newLog;
+ return true;
}
/**
* Handles new instrumentation status message.
+ * @return true if handled correctly, false if missing values.
*/
- public void handleStatus(Map<String, String> values) {
+ public boolean handleStatus(Map<String, String> values) {
String eventType = values.get("dEQP-EventType");
if (eventType == null) {
- return;
+ // Not an event, but some other line
+ return true;
}
if (eventType.compareTo("BeginSession") == 0) {
- handleBeginSession(values);
+ return handleBeginSession(values);
+ } else if (eventType.compareTo("SessionInfo") == 0) {
+ return handleSessionInfo(values);
} else if (eventType.compareTo("EndSession") == 0) {
- handleEndSession(values);
+ return handleEndSession(values);
} else if (eventType.compareTo("BeginTestCase") == 0) {
- handleBeginTestCase(values);
+ return handleBeginTestCase(values);
} else if (eventType.compareTo("EndTestCase") == 0) {
- handleEndTestCase(values);
+ return handleEndTestCase(values);
} else if (eventType.compareTo("TestCaseResult") == 0) {
- handleTestCaseResult(values);
+ return handleTestCaseResult(values);
} else if (eventType.compareTo("TerminateTestCase") == 0) {
- handleTestCaseTerminate(values);
+ return handleTestCaseTerminate(values);
} else if (eventType.compareTo("TestLogData") == 0) {
- handleTestLogData(values);
+ return handleTestLogData(values);
}
+ CLog.e("Unknown event type (%s)", eventType);
+ return false;
}
/**
@@ -548,6 +590,7 @@
if (mCurrentTestId != null) {
// Current instance was removed from remainingConfigs when case
// started. Mark current instance as pending.
+ CLog.i("Batch ended with test '%s' current", mCurrentTestId);
if (mPendingResults.get(mCurrentTestId) != null) {
mPendingResults.get(mCurrentTestId).remainingConfigs.add(mRunConfig);
} else {
@@ -569,6 +612,7 @@
private String mCurrentValue;
private int mResultCode;
private boolean mGotExitValue = false;
+ private boolean mParseSuccessful = true;
public InstrumentationParser(TestInstanceResultListener listener) {
@@ -591,7 +635,7 @@
mCurrentValue = null;
}
- mListener.handleStatus(mValues);
+ mParseSuccessful &= mListener.handleStatus(mValues);
mValues = null;
} else if (line.startsWith("INSTRUMENTATION_STATUS: dEQP-")) {
if (mCurrentName != null) {
@@ -604,16 +648,25 @@
String prefix = "INSTRUMENTATION_STATUS: ";
int nameBegin = prefix.length();
int nameEnd = line.indexOf('=');
- int valueBegin = nameEnd + 1;
-
- mCurrentName = line.substring(nameBegin, nameEnd);
- mCurrentValue = line.substring(valueBegin);
+ if (nameEnd < 0) {
+ CLog.e("Line does not contain value. Logcat interrupted? (%s)", line);
+ mCurrentValue = null;
+ mCurrentName = null;
+ mParseSuccessful = false;
+ return;
+ } else {
+ int valueBegin = nameEnd + 1;
+ mCurrentName = line.substring(nameBegin, nameEnd);
+ mCurrentValue = line.substring(valueBegin);
+ }
} else if (line.startsWith("INSTRUMENTATION_CODE: ")) {
try {
mResultCode = Integer.parseInt(line.substring(22));
mGotExitValue = true;
} catch (NumberFormatException ex) {
- CLog.w("Instrumentation code format unexpected");
+ CLog.e("Instrumentation code format unexpected");
+ mParseSuccessful = false;
+ return;
}
} else if (mCurrentValue != null) {
mCurrentValue = mCurrentValue + line;
@@ -634,7 +687,7 @@
}
if (mValues != null) {
- mListener.handleStatus(mValues);
+ mParseSuccessful &= mListener.handleStatus(mValues);
mValues = null;
}
}
@@ -651,7 +704,7 @@
* Returns whether target instrumentation exited normally.
*/
public boolean wasSuccessful() {
- return mGotExitValue;
+ return mGotExitValue && mParseSuccessful;
}
/**
@@ -1452,11 +1505,12 @@
Throwable interruptingError = null;
try {
+ CLog.d("Running command '%s'", command);
executeShellCommandAndReadOutput(command, parser);
- } catch (Throwable ex) {
- interruptingError = ex;
- } finally {
parser.flush();
+ } catch (Throwable ex) {
+ CLog.w("Instrumented call threw '%s'", ex.getMessage());
+ interruptingError = ex;
}
final boolean progressedSinceLastCall = mInstanceListerner.getCurrentTestId() != null ||
diff --git a/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/DeqpTestRunnerTest.java b/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/DeqpTestRunnerTest.java
index 2c8a816..2ba6b42 100644
--- a/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/DeqpTestRunnerTest.java
+++ b/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/DeqpTestRunnerTest.java
@@ -1162,6 +1162,735 @@
EasyMock.verify(mockDevice);
}
+ public void testRun_sessionInfoValueMissing() throws Exception {
+ final String instrumentationAnswerOk =
+ "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=dEQP-GLES3.instances.test1\r\n"
+ + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+ + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=Pass\r\n"
+ + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Pass\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";
+
+ final String instrumentationAnswerBroken =
+ "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";
+
+ final TestIdentifier[] testIds = {
+ new TestIdentifier("dEQP-GLES3.instances", "test1"),
+ };
+
+ final String[] testPaths = {
+ "dEQP-GLES3.instances.test1",
+ };
+
+ Map<String,String> config = new HashMap<>();
+ config.put("glconfig", "rgba8888d24s8");
+ config.put("rotation", "unspecified");
+ config.put("surfacetype", "window");
+
+ Map<TestIdentifier, List<Map<String, String>>> instances = new HashMap<>();
+
+ instances.put(testIds[0], new ArrayList<Map<String,String>>());
+ instances.get(testIds[0]).add(config);
+
+ Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+ for (TestIdentifier id : testIds) {
+ tests.add(id);
+ }
+
+ ITestInvocationListener mockListener
+ = EasyMock.createStrictMock(ITestInvocationListener.class);
+ IMocksControl orderedControl = EasyMock.createStrictControl();
+ ITestDevice mockDevice = orderedControl.createMock(ITestDevice.class);
+ IDevice mockIDevice = orderedControl.createMock(IDevice.class);
+
+ DeqpTestRunner.IRecovery mockRecovery = EasyMock.createMock(DeqpTestRunner.IRecovery.class);
+
+ DeqpTestRunner deqpTest = new DeqpTestRunner(NAME, NAME, tests, instances);
+ deqpTest.setAbi(UnitTests.ABI);
+ deqpTest.setDevice(mockDevice);
+ deqpTest.setBuildHelper(new StubCtsBuildHelper());
+ deqpTest.setRecovery(mockRecovery);
+
+ int version = 3 << 16;
+ EasyMock.expect(mockDevice.getProperty("ro.opengles.version"))
+ .andReturn(Integer.toString(version)).atLeastOnce();
+
+ mockRecovery.onExecutionProgressed();
+ EasyMock.expectLastCall().atLeastOnce();
+
+ mockRecovery.setDevice(mockDevice);
+ EasyMock.expectLastCall().atLeastOnce();
+
+ EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).
+ andReturn("").once();
+
+ EasyMock.expect(mockDevice.installPackage(EasyMock.<File>anyObject(),
+ EasyMock.eq(true),
+ EasyMock.eq(AbiUtils.createAbiFlag(UnitTests.ABI.getName())))).andReturn(null)
+ .once();
+
+ // query config
+ expectRenderConfigQueryAndReturn(mockDevice,
+ "--deqp-gl-config-name=rgba8888d24s8 "
+ + "--deqp-screen-rotation=unspecified "
+ + "--deqp-surface-type=window "
+ + "--deqp-gl-major-version=3 "
+ + "--deqp-gl-minor-version=0", "Yes");
+
+ // run config and fail
+ runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+ "{dEQP-GLES3{instances{test1}}}",
+ "--deqp-caselist-file=" + CASE_LIST_FILE_NAME
+ + " --deqp-gl-config-name=rgba8888d24s8 "
+ + "--deqp-screen-rotation=unspecified "
+ + "--deqp-surface-type=window "
+ + "--deqp-log-images=disable "
+ + "--deqp-watchdog=enable", instrumentationAnswerBroken);
+
+ mockRecovery.recoverComLinkKilled();
+ EasyMock.expectLastCall().once();
+
+ // Re-try
+ runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+ "{dEQP-GLES3{instances{test1}}}",
+ "--deqp-caselist-file=" + CASE_LIST_FILE_NAME
+ + " --deqp-gl-config-name=rgba8888d24s8 "
+ + "--deqp-screen-rotation=unspecified "
+ + "--deqp-surface-type=window "
+ + "--deqp-log-images=disable "
+ + "--deqp-watchdog=enable", instrumentationAnswerOk);
+
+ EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG)))
+ .andReturn("").once();
+
+ mockListener.testRunStarted(ID, 1);
+ EasyMock.expectLastCall().once();
+
+ // test1
+ mockListener.testStarted(EasyMock.eq(testIds[0]));
+ EasyMock.expectLastCall().once();
+
+ mockListener.testEnded(EasyMock.eq(testIds[0]), EasyMock.<Map<String, String>>notNull());
+ EasyMock.expectLastCall().once();
+
+ mockListener.testRunEnded(EasyMock.anyLong(), EasyMock.<Map<String, String>>notNull());
+ EasyMock.expectLastCall().once();
+
+ orderedControl.replay();
+ EasyMock.replay(mockListener);
+ EasyMock.replay(mockRecovery);
+ deqpTest.run(mockListener);
+
+ EasyMock.verify(mockListener);
+ orderedControl.verify();
+ EasyMock.verify(mockRecovery);
+ }
+
+ public void testRun_resultEventTypeMissing() throws Exception {
+ final String instrumentationAnswerOk =
+ "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=dEQP-GLES3.instances.test1\r\n"
+ + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+ + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=Pass\r\n"
+ + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Pass\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";
+
+ final String instrumentationAnswerBroken =
+ "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=dEQP-GLES3.instances.test1\r\n"
+ + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+ + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=Pass\r\n"
+ + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Pass\r\n";
+
+ final TestIdentifier[] testIds = {
+ new TestIdentifier("dEQP-GLES3.instances", "test1"),
+ };
+
+ final String[] testPaths = {
+ "dEQP-GLES3.instances.test1",
+ };
+
+ Map<String,String> config = new HashMap<>();
+ config.put("glconfig", "rgba8888d24s8");
+ config.put("rotation", "unspecified");
+ config.put("surfacetype", "window");
+
+ Map<TestIdentifier, List<Map<String, String>>> instances = new HashMap<>();
+
+ instances.put(testIds[0], new ArrayList<Map<String,String>>());
+ instances.get(testIds[0]).add(config);
+
+ Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+ for (TestIdentifier id : testIds) {
+ tests.add(id);
+ }
+
+ ITestInvocationListener mockListener
+ = EasyMock.createStrictMock(ITestInvocationListener.class);
+ IMocksControl orderedControl = EasyMock.createStrictControl();
+ ITestDevice mockDevice = orderedControl.createMock(ITestDevice.class);
+ IDevice mockIDevice = orderedControl.createMock(IDevice.class);
+
+ DeqpTestRunner.IRecovery mockRecovery = EasyMock.createMock(DeqpTestRunner.IRecovery.class);
+
+ DeqpTestRunner deqpTest = new DeqpTestRunner(NAME, NAME, tests, instances);
+ deqpTest.setAbi(UnitTests.ABI);
+ deqpTest.setDevice(mockDevice);
+ deqpTest.setBuildHelper(new StubCtsBuildHelper());
+ deqpTest.setRecovery(mockRecovery);
+
+ int version = 3 << 16;
+ EasyMock.expect(mockDevice.getProperty("ro.opengles.version"))
+ .andReturn(Integer.toString(version)).atLeastOnce();
+
+ mockRecovery.onExecutionProgressed();
+ EasyMock.expectLastCall().atLeastOnce();
+
+ mockRecovery.setDevice(mockDevice);
+ EasyMock.expectLastCall().atLeastOnce();
+
+ EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).
+ andReturn("").once();
+
+ EasyMock.expect(mockDevice.installPackage(EasyMock.<File>anyObject(),
+ EasyMock.eq(true),
+ EasyMock.eq(AbiUtils.createAbiFlag(UnitTests.ABI.getName())))).andReturn(null)
+ .once();
+
+ // query config
+ expectRenderConfigQueryAndReturn(mockDevice,
+ "--deqp-gl-config-name=rgba8888d24s8 "
+ + "--deqp-screen-rotation=unspecified "
+ + "--deqp-surface-type=window "
+ + "--deqp-gl-major-version=3 "
+ + "--deqp-gl-minor-version=0", "Yes");
+
+ // run config and fail
+ runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+ "{dEQP-GLES3{instances{test1}}}",
+ "--deqp-caselist-file=" + CASE_LIST_FILE_NAME
+ + " --deqp-gl-config-name=rgba8888d24s8 "
+ + "--deqp-screen-rotation=unspecified "
+ + "--deqp-surface-type=window "
+ + "--deqp-log-images=disable "
+ + "--deqp-watchdog=enable", instrumentationAnswerBroken);
+
+ mockRecovery.recoverComLinkKilled();
+ EasyMock.expectLastCall().once();
+
+ // Re-try
+ runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+ "{dEQP-GLES3{instances{test1}}}",
+ "--deqp-caselist-file=" + CASE_LIST_FILE_NAME
+ + " --deqp-gl-config-name=rgba8888d24s8 "
+ + "--deqp-screen-rotation=unspecified "
+ + "--deqp-surface-type=window "
+ + "--deqp-log-images=disable "
+ + "--deqp-watchdog=enable", instrumentationAnswerOk);
+
+ EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG)))
+ .andReturn("").once();
+
+ mockListener.testRunStarted(ID, 1);
+ EasyMock.expectLastCall().once();
+
+ // test1
+ mockListener.testStarted(EasyMock.eq(testIds[0]));
+ EasyMock.expectLastCall().once();
+
+ mockListener.testEnded(EasyMock.eq(testIds[0]), EasyMock.<Map<String, String>>notNull());
+ EasyMock.expectLastCall().once();
+
+ mockListener.testRunEnded(EasyMock.anyLong(), EasyMock.<Map<String, String>>notNull());
+ EasyMock.expectLastCall().once();
+
+ orderedControl.replay();
+ EasyMock.replay(mockListener);
+ EasyMock.replay(mockRecovery);
+ deqpTest.run(mockListener);
+
+ EasyMock.verify(mockListener);
+ orderedControl.verify();
+ EasyMock.verify(mockRecovery);
+ }
+
+ /**
+ * Test handling of interrupted line in the instrumentation output
+ * and recovery from the error.
+ */
+ public void testRun_testCasePathInterrupted() throws Exception {
+ final String instrumentationAnswerOk1 =
+ "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=dEQP-GLES3.instances.test1\r\n"
+ + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+ + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=Pass\r\n"
+ + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Pass\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";
+ final String instrumentationAnswerOk2 =
+ "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=dEQP-GLES3.instances.test2\r\n"
+ + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+ + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=Pass\r\n"
+ + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Pass\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";
+ final String instrumentationAnswerBroken =
+ "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-TestCasePat";
+
+ final TestIdentifier[] testIds = {
+ new TestIdentifier("dEQP-GLES3.instances", "test1"),
+ new TestIdentifier("dEQP-GLES3.instances", "test2"),
+ };
+
+ final String[] testPaths = {
+ "dEQP-GLES3.instances.test1",
+ "dEQP-GLES3.instances.test2",
+ };
+
+ Map<String,String> config = new HashMap<>();
+ config.put("glconfig", "rgba8888d24s8");
+ config.put("rotation", "unspecified");
+ config.put("surfacetype", "window");
+
+ Map<TestIdentifier, List<Map<String, String>>> instances = new HashMap<>();
+
+ instances.put(testIds[0], new ArrayList<Map<String,String>>());
+ instances.get(testIds[0]).add(config);
+ instances.put(testIds[1], new ArrayList<Map<String,String>>());
+ instances.get(testIds[1]).add(config);
+
+ Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+ for (TestIdentifier id : testIds) {
+ tests.add(id);
+ }
+
+ ITestInvocationListener mockListener
+ = EasyMock.createStrictMock(ITestInvocationListener.class);
+ IMocksControl orderedControl = EasyMock.createStrictControl();
+ ITestDevice mockDevice = orderedControl.createMock(ITestDevice.class);
+ IDevice mockIDevice = orderedControl.createMock(IDevice.class);
+
+ DeqpTestRunner.IRecovery mockRecovery = EasyMock.createMock(DeqpTestRunner.IRecovery.class);
+
+ DeqpTestRunner deqpTest = new DeqpTestRunner(NAME, NAME, tests, instances);
+ deqpTest.setAbi(UnitTests.ABI);
+ deqpTest.setDevice(mockDevice);
+ deqpTest.setBuildHelper(new StubCtsBuildHelper());
+ deqpTest.setRecovery(mockRecovery);
+
+ int version = 3 << 16;
+ EasyMock.expect(mockDevice.getProperty("ro.opengles.version"))
+ .andReturn(Integer.toString(version)).atLeastOnce();
+
+ mockRecovery.onExecutionProgressed();
+ EasyMock.expectLastCall().atLeastOnce();
+
+ mockRecovery.setDevice(mockDevice);
+ EasyMock.expectLastCall().atLeastOnce();
+
+ EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).
+ andReturn("").once();
+
+ EasyMock.expect(mockDevice.installPackage(EasyMock.<File>anyObject(),
+ EasyMock.eq(true),
+ EasyMock.eq(AbiUtils.createAbiFlag(UnitTests.ABI.getName())))).andReturn(null)
+ .once();
+
+ // query config
+ expectRenderConfigQueryAndReturn(mockDevice,
+ "--deqp-gl-config-name=rgba8888d24s8 "
+ + "--deqp-screen-rotation=unspecified "
+ + "--deqp-surface-type=window "
+ + "--deqp-gl-major-version=3 "
+ + "--deqp-gl-minor-version=0", "Yes");
+
+ // run config and fail
+ runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+ "{dEQP-GLES3{instances{test1,test2}}}",
+ "--deqp-caselist-file=" + CASE_LIST_FILE_NAME
+ + " --deqp-gl-config-name=rgba8888d24s8 "
+ + "--deqp-screen-rotation=unspecified "
+ + "--deqp-surface-type=window "
+ + "--deqp-log-images=disable "
+ + "--deqp-watchdog=enable", instrumentationAnswerBroken);
+
+ mockRecovery.recoverComLinkKilled();
+ EasyMock.expectLastCall().once();
+
+ // Re-try
+ runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+ "{dEQP-GLES3{instances{test1}}}",
+ "--deqp-caselist-file=" + CASE_LIST_FILE_NAME
+ + " --deqp-gl-config-name=rgba8888d24s8 "
+ + "--deqp-screen-rotation=unspecified "
+ + "--deqp-surface-type=window "
+ + "--deqp-log-images=disable "
+ + "--deqp-watchdog=enable", instrumentationAnswerOk1);
+
+ runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+ "{dEQP-GLES3{instances{test2}}}",
+ "--deqp-caselist-file=" + CASE_LIST_FILE_NAME
+ + " --deqp-gl-config-name=rgba8888d24s8 "
+ + "--deqp-screen-rotation=unspecified "
+ + "--deqp-surface-type=window "
+ + "--deqp-log-images=disable "
+ + "--deqp-watchdog=enable", instrumentationAnswerOk2);
+
+ EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG)))
+ .andReturn("").once();
+
+ mockListener.testRunStarted(ID, 2);
+ EasyMock.expectLastCall().once();
+
+ // test1
+ mockListener.testStarted(EasyMock.eq(testIds[0]));
+ EasyMock.expectLastCall().once();
+
+ mockListener.testEnded(EasyMock.eq(testIds[0]), EasyMock.<Map<String, String>>notNull());
+ EasyMock.expectLastCall().once();
+
+ // test2
+ mockListener.testStarted(EasyMock.eq(testIds[1]));
+ EasyMock.expectLastCall().once();
+
+ mockListener.testEnded(EasyMock.eq(testIds[1]), EasyMock.<Map<String, String>>notNull());
+ EasyMock.expectLastCall().once();
+
+ mockListener.testRunEnded(EasyMock.anyLong(), EasyMock.<Map<String, String>>notNull());
+ EasyMock.expectLastCall().once();
+
+ orderedControl.replay();
+ EasyMock.replay(mockListener);
+ EasyMock.replay(mockRecovery);
+ deqpTest.run(mockListener);
+
+ EasyMock.verify(mockListener);
+ orderedControl.verify();
+ EasyMock.verify(mockRecovery);
+ }
+
+ /**
+ * Test handling of interrupted line in the instrumentation output
+ * and recovery from the error.
+ */
+ public void testRun_testCasePathMissing() throws Exception {
+ final String instrumentationAnswerOk1 =
+ "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=dEQP-GLES3.instances.test1\r\n"
+ + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+ + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=Pass\r\n"
+ + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Pass\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";
+ final String instrumentationAnswerOk2 =
+ "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=dEQP-GLES3.instances.test2\r\n"
+ + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+ + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=Pass\r\n"
+ + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Pass\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";
+ final String instrumentationAnswerBroken =
+ "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";
+
+
+ final TestIdentifier[] testIds = {
+ new TestIdentifier("dEQP-GLES3.instances", "test1"),
+ new TestIdentifier("dEQP-GLES3.instances", "test2"),
+ };
+
+ final String[] testPaths = {
+ "dEQP-GLES3.instances.test1",
+ "dEQP-GLES3.instances.test2",
+ };
+
+ Map<String,String> config = new HashMap<>();
+ config.put("glconfig", "rgba8888d24s8");
+ config.put("rotation", "unspecified");
+ config.put("surfacetype", "window");
+
+ Map<TestIdentifier, List<Map<String, String>>> instances = new HashMap<>();
+
+ instances.put(testIds[0], new ArrayList<Map<String,String>>());
+ instances.get(testIds[0]).add(config);
+ instances.put(testIds[1], new ArrayList<Map<String,String>>());
+ instances.get(testIds[1]).add(config);
+
+ Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+ for (TestIdentifier id : testIds) {
+ tests.add(id);
+ }
+
+ ITestInvocationListener mockListener
+ = EasyMock.createStrictMock(ITestInvocationListener.class);
+ IMocksControl orderedControl = EasyMock.createStrictControl();
+ ITestDevice mockDevice = orderedControl.createMock(ITestDevice.class);
+ IDevice mockIDevice = orderedControl.createMock(IDevice.class);
+
+ DeqpTestRunner.IRecovery mockRecovery = EasyMock.createMock(DeqpTestRunner.IRecovery.class);
+
+ DeqpTestRunner deqpTest = new DeqpTestRunner(NAME, NAME, tests, instances);
+ deqpTest.setAbi(UnitTests.ABI);
+ deqpTest.setDevice(mockDevice);
+ deqpTest.setBuildHelper(new StubCtsBuildHelper());
+ deqpTest.setRecovery(mockRecovery);
+
+ int version = 3 << 16;
+ EasyMock.expect(mockDevice.getProperty("ro.opengles.version"))
+ .andReturn(Integer.toString(version)).atLeastOnce();
+
+ mockRecovery.onExecutionProgressed();
+ EasyMock.expectLastCall().atLeastOnce();
+
+ mockRecovery.setDevice(mockDevice);
+ EasyMock.expectLastCall().atLeastOnce();
+
+ EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).
+ andReturn("").once();
+
+ EasyMock.expect(mockDevice.installPackage(EasyMock.<File>anyObject(),
+ EasyMock.eq(true),
+ EasyMock.eq(AbiUtils.createAbiFlag(UnitTests.ABI.getName())))).andReturn(null)
+ .once();
+
+ // query config
+ expectRenderConfigQueryAndReturn(mockDevice,
+ "--deqp-gl-config-name=rgba8888d24s8 "
+ + "--deqp-screen-rotation=unspecified "
+ + "--deqp-surface-type=window "
+ + "--deqp-gl-major-version=3 "
+ + "--deqp-gl-minor-version=0", "Yes");
+
+ // run config and fail
+ runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+ "{dEQP-GLES3{instances{test1,test2}}}",
+ "--deqp-caselist-file=" + CASE_LIST_FILE_NAME
+ + " --deqp-gl-config-name=rgba8888d24s8 "
+ + "--deqp-screen-rotation=unspecified "
+ + "--deqp-surface-type=window "
+ + "--deqp-log-images=disable "
+ + "--deqp-watchdog=enable", instrumentationAnswerBroken);
+
+ mockRecovery.recoverComLinkKilled();
+ EasyMock.expectLastCall().once();
+
+ // Re-try
+ runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+ "{dEQP-GLES3{instances{test1}}}",
+ "--deqp-caselist-file=" + CASE_LIST_FILE_NAME
+ + " --deqp-gl-config-name=rgba8888d24s8 "
+ + "--deqp-screen-rotation=unspecified "
+ + "--deqp-surface-type=window "
+ + "--deqp-log-images=disable "
+ + "--deqp-watchdog=enable", instrumentationAnswerOk1);
+
+ runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+ "{dEQP-GLES3{instances{test2}}}",
+ "--deqp-caselist-file=" + CASE_LIST_FILE_NAME
+ + " --deqp-gl-config-name=rgba8888d24s8 "
+ + "--deqp-screen-rotation=unspecified "
+ + "--deqp-surface-type=window "
+ + "--deqp-log-images=disable "
+ + "--deqp-watchdog=enable", instrumentationAnswerOk2);
+
+ EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG)))
+ .andReturn("").once();
+
+ mockListener.testRunStarted(ID, 2);
+ EasyMock.expectLastCall().once();
+
+ // test1
+ mockListener.testStarted(EasyMock.eq(testIds[0]));
+ EasyMock.expectLastCall().once();
+
+ mockListener.testEnded(EasyMock.eq(testIds[0]), EasyMock.<Map<String, String>>notNull());
+ EasyMock.expectLastCall().once();
+
+ // test2
+ mockListener.testStarted(EasyMock.eq(testIds[1]));
+ EasyMock.expectLastCall().once();
+
+ mockListener.testEnded(EasyMock.eq(testIds[1]), EasyMock.<Map<String, String>>notNull());
+ EasyMock.expectLastCall().once();
+
+ mockListener.testRunEnded(EasyMock.anyLong(), EasyMock.<Map<String, String>>notNull());
+ EasyMock.expectLastCall().once();
+
+ orderedControl.replay();
+ EasyMock.replay(mockListener);
+ EasyMock.replay(mockRecovery);
+ deqpTest.run(mockListener);
+
+ EasyMock.verify(mockListener);
+ orderedControl.verify();
+ EasyMock.verify(mockRecovery);
+ }
+
/**
* Test dEQP with multiple instances
*/
diff --git a/tools/utils/buildCts.py b/tools/utils/buildCts.py
index d8529f5..9001440 100755
--- a/tools/utils/buildCts.py
+++ b/tools/utils/buildCts.py
@@ -339,6 +339,7 @@
plan.Exclude('.*')
plan.Include(r'android\.security$')
plan.Include('android\.host\.jdwpsecurity$')
+ plan.Include('android\.host\.abioverride$')
self.__WritePlan(plan, 'Security')
def BuildAospMediumSizeTestList():
@@ -365,7 +366,6 @@
already published to aosp. """
return {
'android.aadb' : [],
- 'android.abioverride' : [],
'android.acceleration' : [],
'android.accessibility' : [],
'android.accessibilityservice' : [],
diff --git a/tools/vm-tests-tf/Android.mk b/tools/vm-tests-tf/Android.mk
index 4958d4e..90410fa 100644
--- a/tools/vm-tests-tf/Android.mk
+++ b/tools/vm-tests-tf/Android.mk
@@ -34,7 +34,7 @@
# ============================================================
include $(CLEAR_VARS)
-# custom variables used to generate test description. do not touch!
+# custom variables used by cts/tools/utils/CollectAllTests.java to generate test description. do not touch!
LOCAL_TEST_TYPE := vmHostTest
LOCAL_JAR_PATH := android.core.vm-tests-tf.jar
@@ -57,25 +57,38 @@
include $(CLEAR_VARS)
LOCAL_JACK_ENABLED := $(strip $(LOCAL_JACK_ENABLED))
-intermediates := $(call intermediates-dir-for,JAVA_LIBRARIES,vm-tests-tf,HOST)
-vmteststf_jar := $(intermediates)/android.core.vm-tests-tf.jar
+LOCAL_MODULE := vm-tests-tf
+LOCAL_MODULE_CLASS := JAVA_LIBRARIES
+LOCAL_MODULE_SUFFIX := $(COMMON_JAVA_PACKAGE_SUFFIX)
+LOCAL_IS_HOST_MODULE := true
+LOCAL_BUILT_MODULE_STEM := javalib.jar
+intermediates := $(call local-intermediates-dir)
+# Install the module as $(intermediates)/android.core.vm-tests-tf.jar.
+LOCAL_INSTALLED_MODULE_STEM := android.core.vm-tests-tf.jar
+LOCAL_MODULE_PATH := $(intermediates)
+
+LOCAL_COMPATIBILITY_SUITE := cts_v2
+
+include $(BUILD_SYSTEM)/base_rules.mk
+
vmteststf_dep_jars := $(addprefix $(HOST_OUT_JAVA_LIBRARIES)/, cts-tf-dalvik-buildutil.jar dasm.jar dx.jar cfassembler.jar junit.jar)
-$(vmteststf_jar): PRIVATE_JACK_EXTRA_ARGS := $(LOCAL_JACK_EXTRA_ARGS)
+$(LOCAL_BUILT_MODULE): PRIVATE_JACK_EXTRA_ARGS := $(LOCAL_JACK_EXTRA_ARGS)
ifdef LOCAL_JACK_ENABLED
vmteststf_dep_jars += $(cts-tf-dalvik-lib.jack)
endif
-$(vmteststf_jar): PRIVATE_SRC_FOLDER := $(LOCAL_PATH)/src
-$(vmteststf_jar): PRIVATE_INTERMEDIATES_CLASSES := $(call intermediates-dir-for,JAVA_LIBRARIES,cts-tf-dalvik-buildutil,HOST)/classes
-$(vmteststf_jar): PRIVATE_INTERMEDIATES := $(intermediates)/tests
-$(vmteststf_jar): PRIVATE_INTERMEDIATES_DEXCORE_JAR := $(intermediates)/tests/dot/junit/dexcore.jar
-$(vmteststf_jar): PRIVATE_INTERMEDIATES_MAIN_FILES := $(intermediates)/main_files
-$(vmteststf_jar): PRIVATE_INTERMEDIATES_HOSTJUNIT_FILES := $(intermediates)/hostjunit_files
-$(vmteststf_jar): PRIVATE_CLASS_PATH := $(subst $(space),:,$(vmteststf_dep_jars)):$(HOST_JDK_TOOLS_JAR)
+$(LOCAL_BUILT_MODULE): PRIVATE_SRC_FOLDER := $(LOCAL_PATH)/src
+$(LOCAL_BUILT_MODULE): PRIVATE_INTERMEDIATES_CLASSES := $(call intermediates-dir-for,JAVA_LIBRARIES,cts-tf-dalvik-buildutil,HOST)/classes
+$(LOCAL_BUILT_MODULE): PRIVATE_INTERMEDIATES := $(intermediates)/tests
+$(LOCAL_BUILT_MODULE): PRIVATE_INTERMEDIATES_DEXCORE_JAR := $(intermediates)/tests/dot/junit/dexcore.jar
+$(LOCAL_BUILT_MODULE): PRIVATE_INTERMEDIATES_MAIN_FILES := $(intermediates)/main_files
+$(LOCAL_BUILT_MODULE): PRIVATE_INTERMEDIATES_HOSTJUNIT_FILES := $(intermediates)/hostjunit_files
+$(LOCAL_BUILT_MODULE): PRIVATE_CLASS_PATH := $(subst $(space),:,$(vmteststf_dep_jars)):$(HOST_JDK_TOOLS_JAR)
+$(LOCAL_BUILT_MODULE): PRIVATE_JACK_VERSION := $(LOCAL_JACK_VERSION)
ifndef LOCAL_JACK_ENABLED
-$(vmteststf_jar) : $(vmteststf_dep_jars) $(HOST_OUT_JAVA_LIBRARIES)/tradefed-prebuilt.jar
+$(LOCAL_BUILT_MODULE) : $(vmteststf_dep_jars) $(HOST_OUT_JAVA_LIBRARIES)/tradefed-prebuilt.jar
$(hide) rm -rf $(dir $@) && mkdir -p $(dir $@)
$(hide) mkdir -p $(PRIVATE_INTERMEDIATES_HOSTJUNIT_FILES)/dot/junit $(dir $(PRIVATE_INTERMEDIATES_DEXCORE_JAR))
# generated and compile the host side junit tests
@@ -88,35 +101,36 @@
$(addprefix -C $(PRIVATE_INTERMEDIATES_CLASSES) , dot/junit/DxUtil.class dot/junit/DxAbstractMain.class)
$(hide) $(DX) -JXms16M -JXmx768M --dex --output=$(PRIVATE_INTERMEDIATES_DEXCORE_JAR) \
$(if $(NO_OPTIMIZE_DX), --no-optimize) $(PRIVATE_INTERMEDIATES_DEXCORE_JAR).jar && rm -f $(PRIVATE_INTERMEDIATES_DEXCORE_JAR).jar
- $(hide) cd $(PRIVATE_INTERMEDIATES_HOSTJUNIT_FILES)/classes && zip -q -r ../../android.core.vm-tests-tf.jar .
- $(hide) cd $(dir $@) && zip -q -r android.core.vm-tests-tf.jar tests
+ $(hide) cd $(PRIVATE_INTERMEDIATES_HOSTJUNIT_FILES)/classes && zip -q -r ../../$(notdir $@) .
+ $(hide) cd $(dir $@) && zip -q -r $(notdir $@) tests
else # LOCAL_JACK_ENABLED
oj_jack := $(call intermediates-dir-for,JAVA_LIBRARIES,core-oj,,COMMON)/classes.jack
libart_jack := $(call intermediates-dir-for,JAVA_LIBRARIES,core-libart,,COMMON)/classes.jack
-$(vmteststf_jar): PRIVATE_DALVIK_SUITE_CLASSPATH := $(oj_jack):$(libart_jack):$(cts-tf-dalvik-lib.jack):$(HOST_OUT_JAVA_LIBRARIES)/tradefed-prebuilt.jar
-$(vmteststf_jar) : $(vmteststf_dep_jars) $(JACK) $(oj_jack) $(libart_jack) $(HOST_OUT_JAVA_LIBRARIES)/tradefed-prebuilt.jar | setup-jack-server
+$(LOCAL_BUILT_MODULE): PRIVATE_DALVIK_SUITE_CLASSPATH := $(oj_jack):$(libart_jack):$(cts-tf-dalvik-lib.jack):$(HOST_OUT_JAVA_LIBRARIES)/tradefed-prebuilt.jar
+$(LOCAL_BUILT_MODULE) : $(vmteststf_dep_jars) $(JACK) $(oj_jack) $(libart_jack) $(HOST_OUT_JAVA_LIBRARIES)/tradefed-prebuilt.jar | setup-jack-server
$(hide) rm -rf $(dir $@) && mkdir -p $(dir $@)
$(hide) mkdir -p $(PRIVATE_INTERMEDIATES_HOSTJUNIT_FILES)/dot/junit $(dir $(PRIVATE_INTERMEDIATES_DEXCORE_JAR))
# generated and compile the host side junit tests
@echo "Write generated Main_*.java files to $(PRIVATE_INTERMEDIATES_MAIN_FILES)"
- $(hide) JACK_VERSION=$(JACK_DEFAULT_VERSION) java -cp $(PRIVATE_CLASS_PATH) util.build.JackBuildDalvikSuite $(JACK) $(PRIVATE_SRC_FOLDER) $(PRIVATE_INTERMEDIATES) \
+ $(hide) JACK_VERSION=$(PRIVATE_JACK_VERSION) java -cp $(PRIVATE_CLASS_PATH) util.build.JackBuildDalvikSuite $(JACK) $(PRIVATE_SRC_FOLDER) $(PRIVATE_INTERMEDIATES) \
$(PRIVATE_DALVIK_SUITE_CLASSPATH) \
$(PRIVATE_INTERMEDIATES_MAIN_FILES) $(PRIVATE_INTERMEDIATES_CLASSES) $(PRIVATE_INTERMEDIATES_HOSTJUNIT_FILES) $$RUN_VM_TESTS_RTO
@echo "Generate $(PRIVATE_INTERMEDIATES_DEXCORE_JAR)"
$(hide) jar -cf $(PRIVATE_INTERMEDIATES_DEXCORE_JAR)-class.jar \
$(addprefix -C $(PRIVATE_INTERMEDIATES_CLASSES) , dot/junit/DxUtil.class dot/junit/DxAbstractMain.class)
- $(hide) $(JACK) --import $(PRIVATE_INTERMEDIATES_DEXCORE_JAR)-class.jar --output-jack $(PRIVATE_INTERMEDIATES_DEXCORE_JAR).jack
+ $(hide) $(call call-jack) --import $(PRIVATE_INTERMEDIATES_DEXCORE_JAR)-class.jar --output-jack $(PRIVATE_INTERMEDIATES_DEXCORE_JAR).jack
$(hide) mkdir -p $(PRIVATE_INTERMEDIATES_DEXCORE_JAR).tmp
$(hide) $(call call-jack,$(PRIVATE_JACK_EXTRA_ARGS)) --output-dex $(PRIVATE_INTERMEDIATES_DEXCORE_JAR).tmp \
$(if $(NO_OPTIMIZE_DX), -D jack.dex.optimize "false") --import $(PRIVATE_INTERMEDIATES_DEXCORE_JAR).jack && rm -f $(PRIVATE_INTERMEDIATES_DEXCORE_JAR).jack
$(hide) cd $(PRIVATE_INTERMEDIATES_DEXCORE_JAR).tmp && zip -q -r $(abspath $(PRIVATE_INTERMEDIATES_DEXCORE_JAR)) .
- $(hide) cd $(PRIVATE_INTERMEDIATES_HOSTJUNIT_FILES)/classes && zip -q -r ../../android.core.vm-tests-tf.jar .
- $(hide) cd $(dir $@) && zip -q -r android.core.vm-tests-tf.jar tests
+ $(hide) cd $(PRIVATE_INTERMEDIATES_HOSTJUNIT_FILES)/classes && zip -q -r ../../$(notdir $@) .
+ $(hide) cd $(dir $@) && zip -q -r $(notdir $@) tests
oj_jack :=
libart_jack :=
endif # LOCAL_JACK_ENABLED
# Clean up temp vars
intermediates :=
-vmteststf_jar :=
vmteststf_dep_jars :=
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/abioverride/AndroidTest.xml b/tools/vm-tests-tf/AndroidTest.xml
similarity index 60%
copy from tests/abioverride/AndroidTest.xml
copy to tools/vm-tests-tf/AndroidTest.xml
index cbe4d6a..35db3ad 100644
--- a/tests/abioverride/AndroidTest.xml
+++ b/tools/vm-tests-tf/AndroidTest.xml
@@ -13,12 +13,9 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<configuration description="Config for CTS AbiOverride test cases">
- <target_preparer class="com.android.compatibility.common.tradefed.targetprep.ApkInstaller">
- <option name="cleanup-apks" value="true" />
- <option name="test-file-name" value="CtsAbiOverrideTestCases.apk" />
- </target_preparer>
- <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
- <option name="package" value="android.abioverride.cts" />
+<configuration description="Config for CTS VM test cases">
+ <target_preparer class="android.core.vm.targetprep.VmTestPreparer" />
+ <test class="com.android.compatibility.common.tradefed.testtype.JarHostTest" >
+ <option name="jar" value="android.core.vm-tests-tf.jar" />
</test>
</configuration>
diff --git a/tools/vm-tests-tf/targetprep/Android.mk b/tools/vm-tests-tf/targetprep/Android.mk
new file mode 100644
index 0000000..18c2dea
--- /dev/null
+++ b/tools/vm-tests-tf/targetprep/Android.mk
@@ -0,0 +1,32 @@
+# Copyright (C) 2016 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT 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)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_JAVA_LIBRARIES := compatibility-host-util cts-tradefed_v2 tradefed-prebuilt
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_MODULE := compatibility-host-vm-targetprep
+
+# Tag this module as a cts_v2 test artifact
+LOCAL_COMPATIBILITY_SUITE := cts_v2
+
+include $(BUILD_HOST_JAVA_LIBRARY)
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tools/vm-tests-tf/targetprep/src/android/core/vm/targetprep/VmTestPreparer.java b/tools/vm-tests-tf/targetprep/src/android/core/vm/targetprep/VmTestPreparer.java
new file mode 100644
index 0000000..d46e330
--- /dev/null
+++ b/tools/vm-tests-tf/targetprep/src/android/core/vm/targetprep/VmTestPreparer.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.core.vm.targetprep;
+
+import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.config.Option;
+import com.android.tradefed.config.OptionClass;
+import com.android.tradefed.device.DeviceNotAvailableException;
+import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.log.LogUtil.CLog;
+import com.android.tradefed.targetprep.BuildError;
+import com.android.tradefed.targetprep.ITargetCleaner;
+import com.android.tradefed.targetprep.TargetSetupError;
+import com.android.tradefed.util.FileUtil;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.zip.ZipFile;
+
+/**
+ * Configures the device to run VM tests.
+ */
+@OptionClass(alias="vm-test-preparer")
+public class VmTestPreparer implements ITargetCleaner {
+
+ private static final String JAR_FILE = "android.core.vm-tests-tf.jar";
+ private static final String TEMP_DIR = "/data/local/tmp";
+ private static final String VM_TEMP_DIR = TEMP_DIR +"/vm-tests";
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void setUp(ITestDevice device, IBuildInfo buildInfo)
+ throws TargetSetupError, BuildError, DeviceNotAvailableException {
+ CompatibilityBuildHelper helper = new CompatibilityBuildHelper(buildInfo);
+ if (!installVmPrereqs(device, helper)) {
+ throw new RuntimeException(String.format(
+ "Failed to install vm-tests prereqs on device %s",
+ device.getSerialNumber()));
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void tearDown(ITestDevice device, IBuildInfo buildInfo, Throwable e)
+ throws DeviceNotAvailableException {
+ cleanupDeviceFiles(device);
+ }
+
+ /**
+ * Install pre-requisite jars for running vm-tests, creates temp directories for test.
+ *
+ * @param device the {@link ITestDevice}
+ * @param ctsBuild the {@link CompatibilityBuildHelper}
+ * @throws DeviceNotAvailableException
+ * @return true if test jar files are extracted and pushed to device successfully
+ */
+ private boolean installVmPrereqs(ITestDevice device, CompatibilityBuildHelper ctsBuild)
+ throws DeviceNotAvailableException {
+ cleanupDeviceFiles(device);
+ // Creates temp directory recursively. We also need to create the dalvik-cache directory
+ // which is used by the dalvikvm to optimize things. Without the dalvik-cache, there will be
+ // a sigsev thrown by the vm.
+ createRemoteDir(device, VM_TEMP_DIR + "/dalvik-cache" );
+ try {
+ File tmpDir = new File(System.getProperty("java.io.tmpdir"));
+ File localTmpDir = FileUtil.createTempDir("cts-vm", tmpDir);
+ File jarFile = new File(ctsBuild.getTestsDir(), JAR_FILE);
+ if (!jarFile.exists()) {
+ CLog.e("Missing jar file %s", jarFile.getPath());
+ return false;
+ }
+ ZipFile zipFile = new ZipFile(jarFile);
+ FileUtil.extractZip(zipFile, localTmpDir);
+ File localTestTmpDir = new File(localTmpDir, "tests");
+ if (!device.pushDir(localTestTmpDir, VM_TEMP_DIR)) {
+ CLog.e("Failed to push vm test files");
+ return false;
+ }
+ FileUtil.recursiveDelete(localTmpDir);
+ } catch (IOException e) {
+ CLog.e("Failed to extract jar file %s and sync it to device %s.",
+ JAR_FILE, device.getSerialNumber());
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Removes temporary file directory from device
+ *
+ * @param device
+ * @throws DeviceNotAvailableException
+ */
+ private void cleanupDeviceFiles(ITestDevice device) throws DeviceNotAvailableException {
+ if (device.doesFileExist(VM_TEMP_DIR)) {
+ device.executeShellCommand(String.format("rm -r %s", VM_TEMP_DIR));
+ }
+ }
+
+ /**
+ * Creates the file directory recursively in the device.
+ *
+ * @param device the {@link ITestDevice}
+ * @param remoteFilePath the absolute path.
+ * @throws DeviceNotAvailableException
+ */
+ private void createRemoteDir(ITestDevice device, String remoteFilePath)
+ throws DeviceNotAvailableException {
+ if (device.doesFileExist(remoteFilePath)) {
+ return;
+ }
+ if (!(device.doesFileExist(TEMP_DIR))) {
+ CLog.e("Error: %s does not exist", TEMP_DIR);
+ }
+ device.executeShellCommand(String.format("mkdir %s", VM_TEMP_DIR));
+ device.executeShellCommand(String.format("mkdir %s", remoteFilePath));
+ }
+}
\ No newline at end of file