Merge "add drmserver64 for 64bit only projects"
diff --git a/apps/CameraITS/config.yml b/apps/CameraITS/config.yml
index bc35cb1..fc712b3 100644
--- a/apps/CameraITS/config.yml
+++ b/apps/CameraITS/config.yml
@@ -44,7 +44,7 @@
test_length: 7
debug_mode: "False" # quotes are needed here
chart_distance: 25
- rotator_cntl: <controller-type> # can be arduino or canakit
+ rotator_cntl: <controller-type> # arduino, canakit, or as-is for manual
rotator_ch: <controller-channel>
camera: <camera-id>
diff --git a/apps/CameraITS/tests/its_base_test.py b/apps/CameraITS/tests/its_base_test.py
index d488a6f..937edfc 100644
--- a/apps/CameraITS/tests/its_base_test.py
+++ b/apps/CameraITS/tests/its_base_test.py
@@ -160,6 +160,7 @@
self.tablet.adb.shell('am force-stop com.google.android.apps.docs')
self.tablet.adb.shell('am force-stop com.google.android.apps.photos')
self.tablet.adb.shell('am force-stop com.android.gallery3d')
+ self.tablet.adb.shell('am force-stop com.sec.android.gallery3d')
def set_tablet_landscape_orientation(self):
"""Sets the screen orientation to landscape.
diff --git a/apps/CameraITS/tests/scene0/test_solid_color_test_pattern.py b/apps/CameraITS/tests/scene0/test_solid_color_test_pattern.py
index 5b1b74b..01fbb77 100644
--- a/apps/CameraITS/tests/scene0/test_solid_color_test_pattern.py
+++ b/apps/CameraITS/tests/scene0/test_solid_color_test_pattern.py
@@ -226,8 +226,12 @@
'testPatternData: %s', captured_pattern,
str(cap['metadata']['android.sensor.testPatternData']))
# Save test pattern image
- img = image_processing_utils.convert_capture_to_rgb_image(
- cap, props=props)
+ if fmt['format'] == 'yuv':
+ img = image_processing_utils.convert_capture_to_rgb_image(
+ cap, props=props)
+ else:
+ img = image_processing_utils.convert_capture_to_rgb_image(
+ cap, props=props, apply_ccm_raw_to_rgb=False)
captured_color = color['color']
image_processing_utils.write_image(
img,
diff --git a/apps/CameraITS/tests/scene1_1/test_ev_compensation_advanced.py b/apps/CameraITS/tests/scene1_1/test_ev_compensation_advanced.py
index 4f589ce..710e207 100644
--- a/apps/CameraITS/tests/scene1_1/test_ev_compensation_advanced.py
+++ b/apps/CameraITS/tests/scene1_1/test_ev_compensation_advanced.py
@@ -15,11 +15,11 @@
import logging
+import math
import os.path
import matplotlib
from matplotlib import pylab
from mobly import test_runner
-import numpy as np
import its_base_test
import camera_properties_utils
@@ -29,17 +29,15 @@
LINEAR_TONEMAP_CURVE = [0.0, 0.0, 1.0, 1.0]
LOCKED = 3
-LUMA_DELTA_THRESH = 0.05
-LUMA_LOCKED_TOL = 0.05
+LUMA_DELTA_ATOL = 0.05
+LUMA_DELTA_ATOL_SAT = 0.10
+LUMA_SAT_THRESH = 0.75 # luma value at which ATOL changes from MID to SAT
NAME = os.path.splitext(os.path.basename(__file__))[0]
PATCH_H = 0.1 # center 10%
PATCH_W = 0.1
PATCH_X = 0.5 - PATCH_W/2
PATCH_Y = 0.5 - PATCH_H/2
THRESH_CONVERGE_FOR_EV = 8 # AE must converge within this num auto reqs for EV
-YUV_FULL_SCALE = 255.0
-YUV_SAT_MIN = 250.0
-YUV_SAT_TOL = 3.0
def create_request_with_ev(ev):
@@ -122,6 +120,10 @@
caps = cam.do_capture([req]*THRESH_CONVERGE_FOR_EV, fmt)
for cap in caps:
if cap['metadata']['android.control.aeState'] == LOCKED:
+ ev_meta = cap['metadata']['android.control.aeExposureCompensation']
+ if ev_meta != ev:
+ raise AssertionError(
+ f'EV comp capture != request! cap: {ev_meta}, req: {ev}')
lumas.append(extract_luma_from_capture(cap))
break
if caps[THRESH_CONVERGE_FOR_EV-1]['metadata'][
@@ -133,6 +135,8 @@
i_mid = len(ev_steps) // 2
luma_normal = lumas[i_mid] / ev_shifts[i_mid]
expected_lumas = [min(1.0, luma_normal*shift) for shift in ev_shifts]
+ luma_delta_atols = [LUMA_DELTA_ATOL if l < LUMA_SAT_THRESH
+ else LUMA_DELTA_ATOL_SAT for l in expected_lumas]
# Create plot
pylab.figure(NAME)
@@ -145,17 +149,15 @@
matplotlib.pyplot.savefig(
'%s_plot_means.png' % os.path.join(log_path, NAME))
- luma_diffs = [expected_lumas[i]-lumas[i] for i in range(len(ev_steps))]
- max_diff = max(abs(i) for i in luma_diffs)
- avg_diff = abs(np.array(luma_diffs)).mean()
- logging.debug(
- 'Max delta between modeled and measured lumas: %.4f', max_diff)
- logging.debug(
- 'Avg delta between modeled and measured lumas: %.4f', avg_diff)
- if max_diff > LUMA_DELTA_THRESH:
- raise AssertionError(f'Max delta between modeled and measured '
- f'lumas: {max_diff:.3f}, '
- f'TOL: {LUMA_DELTA_THRESH}.')
+ for i, luma in enumerate(lumas):
+ luma_delta_atol = luma_delta_atols[i]
+ logging.debug('EV step: %3d, luma: %.3f, model: %.3f, ATOL: %.2f',
+ ev_steps[i], luma, expected_lumas[i], luma_delta_atol)
+ if not math.isclose(luma, expected_lumas[i],
+ abs_tol=luma_delta_atol):
+ raise AssertionError('Modeled/measured luma deltas too large! '
+ f'meas: {lumas[i]}, model: {expected_lumas[i]}, '
+ f'ATOL: {luma_delta_atol}.')
if __name__ == '__main__':
diff --git a/apps/CameraITS/tests/scene1_1/test_ev_compensation_basic.py b/apps/CameraITS/tests/scene1_1/test_ev_compensation_basic.py
index 379cc11..7d8b9f2 100644
--- a/apps/CameraITS/tests/scene1_1/test_ev_compensation_basic.py
+++ b/apps/CameraITS/tests/scene1_1/test_ev_compensation_basic.py
@@ -29,7 +29,8 @@
import its_session_utils
LOCKED = 3
-LUMA_LOCKED_TOL = 0.05
+LUMA_LOCKED_RTOL_EV_SM = 0.05
+LUMA_LOCKED_RTOL_EV_LG = 0.10
NAME = os.path.splitext(os.path.basename(__file__))[0]
NUM_UNSATURATED_EVS = 3
PATCH_H = 0.1 # center 10%
@@ -87,6 +88,11 @@
props['android.control.aeCompensationStep'])
steps_per_ev = int(1.0 / ev_per_step)
evs = range(-2 * steps_per_ev, 2 * steps_per_ev + 1, steps_per_ev)
+ luma_locked_rtols = [LUMA_LOCKED_RTOL_EV_LG,
+ LUMA_LOCKED_RTOL_EV_SM,
+ LUMA_LOCKED_RTOL_EV_SM,
+ LUMA_LOCKED_RTOL_EV_SM,
+ LUMA_LOCKED_RTOL_EV_LG]
# Converge 3A, and lock AE once converged. skip AF trigger as
# dark/bright scene could make AF convergence fail and this test
@@ -100,7 +106,8 @@
fmt = capture_request_utils.get_smallest_yuv_format(
props, match_ar=match_ar)
lumas = []
- for ev in evs:
+ for j, ev in enumerate(evs):
+ luma_locked_rtol = luma_locked_rtols[j]
# Capture a single shot with the same EV comp and locked AE.
req = create_request_with_ev(ev)
caps = cam.do_capture([req]*THRESH_CONVERGE_FOR_EV, fmt)
@@ -112,14 +119,19 @@
image_processing_utils.write_image(
img, f'{test_name_w_path}_ev{ev}_frame{i}.jpg')
if cap['metadata']['android.control.aeState'] == LOCKED:
+ ev_meta = cap['metadata']['android.control.aeExposureCompensation']
+ logging.debug('cap EV compensation: %d', ev_meta)
+ if ev != ev_meta:
+ raise AssertionError(
+ f'EV compensation cap != req! cap: {ev_meta}, req: {ev}')
luma = extract_luma_from_capture(cap)
luma_locked.append(luma)
if i == THRESH_CONVERGE_FOR_EV-1:
lumas.append(luma)
if not math.isclose(min(luma_locked), max(luma_locked),
- rel_tol=LUMA_LOCKED_TOL):
+ rel_tol=luma_locked_rtol):
raise AssertionError(f'AE locked lumas: {luma_locked}, '
- f'RTOL: {LUMA_LOCKED_TOL}')
+ f'RTOL: {luma_locked_rtol}')
logging.debug('lumas in AE locked captures: %s', str(lumas))
if caps[THRESH_CONVERGE_FOR_EV-1]['metadata'][
'android.control.aeState'] != LOCKED:
diff --git a/apps/CameraITS/utils/image_processing_utils.py b/apps/CameraITS/utils/image_processing_utils.py
index c041e24..8e6a82a 100644
--- a/apps/CameraITS/utils/image_processing_utils.py
+++ b/apps/CameraITS/utils/image_processing_utils.py
@@ -50,7 +50,8 @@
def convert_capture_to_rgb_image(cap,
ccm_yuv_to_rgb=DEFAULT_YUV_TO_RGB_CCM,
yuv_off=DEFAULT_YUV_OFFSETS,
- props=None):
+ props=None,
+ apply_ccm_raw_to_rgb=True):
"""Convert a captured image object to a RGB image.
Args:
@@ -59,6 +60,7 @@
yuv_off: (Optional) offsets to subtract from each of Y,U,V values.
props: (Optional) camera properties object (of static values);
required for processing raw images.
+ apply_ccm_raw_to_rgb: (Optional) boolean to apply color correction matrix.
Returns:
RGB float-3 image array, with pixel values in [0.0, 1.0].
@@ -83,7 +85,8 @@
elif cap['format'] == 'raw' or cap['format'] == 'rawStats':
assert props is not None
r, gr, gb, b = convert_capture_to_planes(cap, props)
- return convert_raw_to_rgb_image(r, gr, gb, b, props, cap['metadata'])
+ return convert_raw_to_rgb_image(
+ r, gr, gb, b, props, cap['metadata'], apply_ccm_raw_to_rgb)
elif cap['format'] == 'y8':
y = cap['data'][0: w * h]
return convert_y8_to_rgb_image(y, w, h)
@@ -348,7 +351,7 @@
def convert_raw_to_rgb_image(r_plane, gr_plane, gb_plane, b_plane, props,
- cap_res):
+ cap_res, apply_ccm_raw_to_rgb=True):
"""Convert a Bayer raw-16 image to an RGB image.
Includes some extremely rudimentary demosaicking and color processing
@@ -363,9 +366,10 @@
in the Bayer image, with pixels in the [0.0, 1.0] range.
props: Camera properties object.
cap_res: Capture result (metadata) object.
+ apply_ccm_raw_to_rgb: (Optional) boolean to apply color correction matrix.
Returns:
- RGB float-3 image array, with pixel values in [0.0, 1.0]
+ RGB float-3 image array, with pixel values in [0.0, 1.0]
"""
# Values required for the RAW to RGB conversion.
assert props is not None
@@ -396,7 +400,9 @@
h, w = r_plane.shape[:2]
img = numpy.dstack([r_plane, (gr_plane + gb_plane) / 2.0, b_plane])
img = (((img.reshape(h, w, 3) - black_levels) * scale) * gains).clip(0.0, 1.0)
- img = numpy.dot(img.reshape(w * h, 3), ccm.T).reshape(h, w, 3).clip(0.0, 1.0)
+ if apply_ccm_raw_to_rgb:
+ img = numpy.dot(
+ img.reshape(w * h, 3), ccm.T).reshape(h, w, 3).clip(0.0, 1.0)
return img
diff --git a/apps/CameraITS/utils/sensor_fusion_utils.py b/apps/CameraITS/utils/sensor_fusion_utils.py
index 6ce53b1..59f5a60 100644
--- a/apps/CameraITS/utils/sensor_fusion_utils.py
+++ b/apps/CameraITS/utils/sensor_fusion_utils.py
@@ -234,12 +234,15 @@
elif rotate_cntl.lower() == 'canakit':
canakit_serial_port = serial_port_def('Canakit')
+ else:
+ logging.info('No rotation rig defined. Manual test: rotate phone by hand.')
+
# rotate phone
logging.debug('Rotating phone %dx', num_rotations)
for _ in range(num_rotations):
if rotate_cntl == 'arduino':
arduino_rotate_servo(rotate_ch, arduino_serial_port)
- else:
+ elif rotate_cntl == 'canakit':
canakit_set_relay_channel_state(canakit_serial_port, rotate_ch, 'ON')
canakit_set_relay_channel_state(canakit_serial_port, rotate_ch, 'OFF')
logging.debug('Finished rotations')
diff --git a/apps/CrossProfileTestApp/OWNERS b/apps/CrossProfileTestApp/OWNERS
index e889bfe..c3feb80 100644
--- a/apps/CrossProfileTestApp/OWNERS
+++ b/apps/CrossProfileTestApp/OWNERS
@@ -1,6 +1,2 @@
# Bug component: 149743808
-sandness@google.com
-arangelov@google.com
-alexkershaw@google.com
-scottjonathan@google.com
-kholoudm@google.com
+file:platform/frameworks/base:/core/java/android/app/admin/EnterprisePlatform_OWNERS
\ No newline at end of file
diff --git a/apps/CtsVerifier/AndroidManifest.xml b/apps/CtsVerifier/AndroidManifest.xml
index b25bd98..cb546c1 100644
--- a/apps/CtsVerifier/AndroidManifest.xml
+++ b/apps/CtsVerifier/AndroidManifest.xml
@@ -22,7 +22,6 @@
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="31"/>
- <uses-permission android:name="android.car.permission.CAR_EXTERIOR_ENVIRONMENT" />
<uses-permission android:name="android.car.permission.CAR_POWERTRAIN" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
@@ -135,6 +134,8 @@
<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" />
+ <meta-data android:name="test_excluded_features"
+ android:value="android.hardware.type.watch" />
<meta-data android:name="display_mode"
android:value="single_display_mode" />
</activity>
@@ -5166,21 +5167,6 @@
android:value="multi_display_mode" />
</activity>
- <activity android:name=".car.NightModeTestActivity"
- android:exported="true"
- android:label="@string/night_mode_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_category" android:value="@string/test_category_car" />
- <meta-data
- android:name="test_required_features"
- android:value="android.hardware.type.automotive"/>
- <meta-data android:name="display_mode"
- android:value="multi_display_mode" />
- </activity>
-
<activity android:name=".car.ParkingBrakeOnTestActivity"
android:exported="true"
android:label="@string/parking_brake_on_test">
diff --git a/apps/CtsVerifier/res/layout/night_mode_test.xml b/apps/CtsVerifier/res/layout/night_mode_test.xml
deleted file mode 100644
index cdba032..0000000
--- a/apps/CtsVerifier/res/layout/night_mode_test.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2019 The Android Open Source Project
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT 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">
- <TextView
- android:id="@+id/night_mode_instruction"
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1"
- android:gravity="center"
- android:textSize="50dip" />
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="2"
- android:orientation="horizontal">
- <TextView
- android:id="@+id/current_night_mode_value_title"
- android:layout_width="0dp"
- android:layout_weight="2"
- android:layout_height="match_parent"
- android:gravity="center"
- android:text="@string/current_night_mode_value_title"
- android:textSize="50dip" />
- <TextView
- android:id="@+id/current_night_mode_value"
- android:layout_width="0dp"
- android:layout_weight="1"
- android:layout_height="match_parent"
- android:gravity="center"
- android:textSize="50dip" />
- </LinearLayout>
- <include layout="@layout/pass_fail_buttons" />
-</LinearLayout>
diff --git a/apps/CtsVerifier/res/values/strings.xml b/apps/CtsVerifier/res/values/strings.xml
index 7f9e132..6f47237 100644
--- a/apps/CtsVerifier/res/values/strings.xml
+++ b/apps/CtsVerifier/res/values/strings.xml
@@ -162,12 +162,6 @@
implemented gears then the pass button will be enabled.</string>
<string name="expected_gear_selection_title">Expected Gear Selection</string>
<string name="current_gear_selection_title">Current Gear Selection</string>
- <string name="night_mode_test">NIGHT_MODE Test</string>
- <string name="night_mode_test_desc">This test ensures that the NIGHT_MODE vehicle property is
- implemented correctly.\n\nFollow the instructions on the screen to engage and disengage
- NIGHT_MODE through the vehicle HAL. When the instructions are completed, the pass button
- will be enabled.</string>
- <string name="current_night_mode_value_title">Current NIGHT_MODE Value:</string>
<string name="parking_brake_on_test">PARKING_BRAKE_ON Test</string>
<string name="parking_brake_on_test_desc">This test ensures that the
PARKING_BRAKE_ON property is implemented correctly.\n\nFollow the
@@ -1035,6 +1029,9 @@
<string name="nfc_not_enabled_message">These tests require NFC to be enabled. Click the
button below to goto Settings and enable it.</string>
<string name="nfc_settings">NFC Settings</string>
+ <string name="secure_nfc_enabled">\"Require device unlock for NFC\" is enabled!</string>
+ <string name="secure_nfc_enabled_message">These tests require \"Require device unlock for NFC\"
+ to be disabled. Click the button below to goto Settings and disable it.</string>
<string name="ndef_push_not_enabled">NDEF Push is not enabled!</string>
<string name="ndef_push_not_enabled_message">These tests require Android Beam to be enabled.
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/admin/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/admin/OWNERS
index f51c943..cf88726 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/admin/OWNERS
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/admin/OWNERS
@@ -1,6 +1,2 @@
# Bug template url: https://b.corp.google.com/issues/new?component=100560&template=63204
-alexkershaw@google.com
-eranm@google.com
-rubinxu@google.com
-sandness@google.com
-pgrafov@google.com
+file:platform/frameworks/base:/core/java/android/app/admin/EnterprisePlatform_OWNERS
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/car/NightModeTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/car/NightModeTestActivity.java
deleted file mode 100644
index 786dc57..0000000
--- a/apps/CtsVerifier/src/com/android/cts/verifier/car/NightModeTestActivity.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.car;
-
-import android.car.Car;
-import android.car.hardware.CarPropertyConfig;
-import android.car.hardware.CarPropertyValue;
-import android.car.hardware.property.CarPropertyManager;
-import android.car.VehicleAreaType;
-import android.car.VehiclePropertyIds;
-import android.os.Bundle;
-import android.widget.TextView;
-import android.util.ArraySet;
-import android.util.Log;
-
-import com.android.cts.verifier.PassFailButtons;
-import com.android.cts.verifier.R;
-
-import java.util.Arrays;
-import java.util.List;
-
-/** A CTS Verifier test case to verify NIGHT_MODE is implemented correctly.*/
-public class NightModeTestActivity extends PassFailButtons.Activity {
- private static final String TAG = NightModeTestActivity.class.getSimpleName();
- private static final int TOTAL_MATCHES_NEEDED_TO_FINISH = 2;
- private static final String TOTAL_TIMES_NEW_VALUE_MATCHED_INSTRUCTION =
- "TotalTimesNewValueMatchedInstruction";
- private static final String CURRENT_NIGHT_MODE_VALUE = "CurrentNightModeValue";
- private Boolean mCurrentNightModeValue;
- private TextView mInstructionTextView;
- private TextView mCurrentNightModeValueTextView;
- private int mTotalTimesNewValueMatchedInstruction = 0;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- // Setup the UI.
- setContentView(R.layout.night_mode_test);
- setPassFailButtonClickListeners();
- setInfoResources(R.string.night_mode_test, R.string.night_mode_test_desc, -1);
- getPassButton().setEnabled(false);
-
- mInstructionTextView = (TextView) findViewById(R.id.night_mode_instruction);
- mInstructionTextView.setText("Waiting to get first NIGHT_MODE callback from Vehicle HAL");
- mCurrentNightModeValueTextView = (TextView) findViewById(R.id.current_night_mode_value);
-
-
- CarPropertyManager carPropertyManager =
- (CarPropertyManager) Car.createCar(this).getCarManager(Car.PROPERTY_SERVICE);
-
- if(!carPropertyManager.registerCallback(mCarPropertyEventCallback,
- VehiclePropertyIds.NIGHT_MODE, CarPropertyManager.SENSOR_RATE_ONCHANGE)) {
- mInstructionTextView.setText("ERROR: Unable to register for NIGHT_MODE callback");
- Log.e(TAG, "Failed to register callback for NIGHT_MODE with CarPropertyManager");
- }
- }
-
- // Need to save the state because of the UI Mode switch with the change in the NIGHT_MODE
- // property value.
- @Override
- protected void onSaveInstanceState(final Bundle outState) {
- super.onSaveInstanceState(outState);
- outState.putBoolean(CURRENT_NIGHT_MODE_VALUE, mCurrentNightModeValue);
- outState.putInt(TOTAL_TIMES_NEW_VALUE_MATCHED_INSTRUCTION,
- mTotalTimesNewValueMatchedInstruction);
- }
-
- @Override
- protected void onRestoreInstanceState(final Bundle savedInstanceState) {
- super.onRestoreInstanceState(savedInstanceState);
- mCurrentNightModeValue = savedInstanceState.getBoolean(CURRENT_NIGHT_MODE_VALUE);
- mTotalTimesNewValueMatchedInstruction =
- savedInstanceState.getInt(TOTAL_TIMES_NEW_VALUE_MATCHED_INSTRUCTION);
- }
-
- private final CarPropertyManager.CarPropertyEventCallback mCarPropertyEventCallback =
- new CarPropertyManager.CarPropertyEventCallback() {
- @Override
- public void onChangeEvent(CarPropertyValue value) {
- if(value.getStatus() != CarPropertyValue.STATUS_AVAILABLE) {
- Log.e(TAG, "New CarPropertyValue's status is not available - propId: " +
- value.getPropertyId() + " status: " + value.getStatus());
- return;
- }
-
- Boolean newValue = (Boolean) value.getValue();
- Log.i(TAG, "New NIGHT_MODE value: " + newValue);
-
- // On the first callback, mCurrentNightModeValue will be null, so just save the
- // current value. All other callbacks, check if the NIGHT_MODE value has switched.
- // If switched, update the count.
- if (mCurrentNightModeValue != null && !mCurrentNightModeValue.equals(newValue)) {
- mTotalTimesNewValueMatchedInstruction++;
- }
-
- mCurrentNightModeValue = newValue;
- mCurrentNightModeValueTextView.setText(mCurrentNightModeValue.toString());
-
- // Check if the test is finished. If not finished, update the instructions.
- if(mTotalTimesNewValueMatchedInstruction >= TOTAL_MATCHES_NEEDED_TO_FINISH) {
- mInstructionTextView.setText("Test Finished!");
- getPassButton().setEnabled(true);
- } else if(mCurrentNightModeValue) {
- mInstructionTextView.setText("Toggle off NIGHT_MODE through Vehicle HAL");
- } else {
- mInstructionTextView.setText("Toggle on NIGHT_MODE through Vehicle HAL");
- }
- }
-
- @Override
- public void onErrorEvent(int propId, int zone) {
- Log.e(TAG, "propId: " + propId + " zone: " + zone);
- }
- };
-}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/features/FeatureUtil.java b/apps/CtsVerifier/src/com/android/cts/verifier/features/FeatureUtil.java
new file mode 100644
index 0000000..64a4451
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/features/FeatureUtil.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.features;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+
+/**
+ * Feature without feature flag for now will be skipped based on the devices temporarily.
+ * TODO(b/189282625): replace device feature with a more specific feature.
+ */
+public final class FeatureUtil {
+
+ private FeatureUtil() {
+ throw new AssertionError();
+ }
+
+ /**
+ * Checks whether the device supports configing (e.g. disable, enable) location
+ */
+ public static boolean isConfigLocationSupported(Context context) {
+ return !isWatchOrAutomotive(context);
+ }
+
+ /**
+ * Checks whether the device supports configing lock screen
+ */
+ public static boolean isConfigLockScreenSupported(Context context) {
+ return !isWatchOrAutomotive(context);
+ }
+
+ /**
+ * Checks whether the device supports Easter egg / game
+ */
+ public static boolean isFunSupported(Context context) {
+ return !isWatchOrAutomotive(context);
+ }
+
+ /**
+ * Checks whether the device supports screen timeout
+ */
+ public static boolean isScreenTimeoutSupported(Context context) {
+ return !isWatchOrAutomotive(context);
+ }
+
+ /**
+ * Checks whether the device supports third party accessibility service
+ */
+ public static boolean isThirdPartyAccessibilityServiceSupported(Context context) {
+ return !isWatchOrAutomotive(context);
+ }
+
+ /**
+ * Checks whether the device is watch or automotive
+ */
+ private static boolean isWatchOrAutomotive(Context context) {
+ PackageManager pm = context.getPackageManager();
+ return pm.hasSystemFeature(PackageManager.FEATURE_WATCH)
+ || pm.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE);
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/OWNERS
index f51c943..cf88726 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/OWNERS
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/OWNERS
@@ -1,6 +1,2 @@
# Bug template url: https://b.corp.google.com/issues/new?component=100560&template=63204
-alexkershaw@google.com
-eranm@google.com
-rubinxu@google.com
-sandness@google.com
-pgrafov@google.com
+file:platform/frameworks/base:/core/java/android/app/admin/EnterprisePlatform_OWNERS
\ No newline at end of file
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 c5257ba..15775bc 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/PolicyTransparencyTestListActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/PolicyTransparencyTestListActivity.java
@@ -28,6 +28,7 @@
import com.android.cts.verifier.PassFailButtons;
import com.android.cts.verifier.R;
import com.android.cts.verifier.TestListAdapter.TestListItem;
+import com.android.cts.verifier.features.FeatureUtil;
import java.util.Arrays;
import java.util.List;
@@ -140,28 +141,32 @@
private void addTestsToAdapter(final ArrayTestListAdapter adapter) {
for (String restriction :
UserRestrictions.getUserRestrictionsForPolicyTransparency(mMode)) {
- final Intent intent = UserRestrictions.getUserRestrictionTestIntent(this, restriction);
+ Intent intent =
+ UserRestrictions.getUserRestrictionTestIntent(this, restriction, mMode);
if (!UserRestrictions.isRestrictionValid(this, restriction)) {
continue;
}
- final String title = UserRestrictions.getRestrictionLabel(this, restriction);
+ String title = UserRestrictions.getRestrictionLabel(this, restriction);
String testId = getTestId(title);
intent.putExtra(PolicyTransparencyTestActivity.EXTRA_TEST_ID, testId);
adapter.add(TestListItem.newTest(title, testId, intent, null));
}
for (Pair<Intent, Integer> policy : POLICIES) {
- final Intent intent = policy.first;
+ Intent intent = policy.first;
String test = intent.getStringExtra(PolicyTransparencyTestActivity.EXTRA_TEST);
if (!isPolicyValid(test)) {
continue;
}
+
+ String action = intent.getStringExtra(
+ PolicyTransparencyTestActivity.EXTRA_SETTINGS_INTENT_ACTION);
if (mMode == MODE_MANAGED_PROFILE && !ALSO_VALID_FOR_MANAGED_PROFILE.contains(test)) {
continue;
}
if (mMode == MODE_MANAGED_USER && !ALSO_VALID_FOR_MANAGED_USER.contains(test)) {
continue;
}
- final String title = getString(policy.second);
+ String title = getString(policy.second);
String testId = getTestId(title);
intent.putExtra(PolicyTransparencyTestActivity.EXTRA_TITLE, title);
intent.putExtra(PolicyTransparencyTestActivity.EXTRA_TEST_ID, testId);
@@ -185,16 +190,14 @@
switch (test) {
case PolicyTransparencyTestActivity.TEST_CHECK_PERMITTED_INPUT_METHOD:
return pm.hasSystemFeature(PackageManager.FEATURE_INPUT_METHODS);
- // TODO(b/189282625): replace FEATURE_WATCH with a more specific feature
case PolicyTransparencyTestActivity.TEST_CHECK_PERMITTED_ACCESSIBILITY_SERVICE:
return (pm.hasSystemFeature(PackageManager.FEATURE_AUDIO_OUTPUT)
- && !pm.hasSystemFeature(PackageManager.FEATURE_WATCH));
- // TODO(b/189282625): replace FEATURE_WATCH with a more specific feature
+ && FeatureUtil.isThirdPartyAccessibilityServiceSupported(this));
case PolicyTransparencyTestActivity.TEST_CHECK_KEYGURAD_UNREDACTED_NOTIFICATION:
case PolicyTransparencyTestActivity.TEST_CHECK_LOCK_SCREEN_INFO:
case PolicyTransparencyTestActivity.TEST_CHECK_MAXIMUM_TIME_TO_LOCK:
return (pm.hasSystemFeature(PackageManager.FEATURE_SECURE_LOCK_SCREEN)
- && !pm.hasSystemFeature(PackageManager.FEATURE_WATCH));
+ && FeatureUtil.isConfigLockScreenSupported(this));
default:
return true;
}
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 6a91c06..ca695e9 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/UserRestrictions.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/UserRestrictions.java
@@ -28,6 +28,7 @@
import android.util.ArrayMap;
import com.android.cts.verifier.R;
+import com.android.cts.verifier.features.FeatureUtil;
import java.util.ArrayList;
import java.util.Arrays;
@@ -203,7 +204,7 @@
}
public static List<String> getUserRestrictionsForPolicyTransparency(int mode) {
- if (mode == PolicyTransparencyTestListActivity.MODE_DEVICE_OWNER) {
+ if (isDeviceOwnerMode(mode)) {
ArrayList<String> result = new ArrayList<String>();
// They are all valid except for DISALLOW_REMOVE_MANAGED_PROFILE
for (String st : RESTRICTION_IDS_FOR_POLICY_TRANSPARENCY) {
@@ -221,7 +222,11 @@
throw new RuntimeException("Invalid mode " + mode);
}
- public static Intent getUserRestrictionTestIntent(Context context, String restriction) {
+ /**
+ * Creates and returns a new intent to set user restriction
+ */
+ public static Intent getUserRestrictionTestIntent(Context context, String restriction,
+ int mode) {
final UserRestrictionItem item = USER_RESTRICTION_ITEMS.get(restriction);
final Intent intent =
new Intent(PolicyTransparencyTestActivity.ACTION_SHOW_POLICY_TRANSPARENCY_TEST)
@@ -232,10 +237,10 @@
context.getString(item.label))
.putExtra(PolicyTransparencyTestActivity.EXTRA_SETTINGS_INTENT_ACTION,
item.intentAction);
- // For DISALLOW_FACTORY_RESET, set on the device owner, not on the current user.
- if (!UserManager.DISALLOW_FACTORY_RESET.equals(restriction)) {
- intent.putExtra(CommandReceiverActivity.EXTRA_USE_CURRENT_USER_DPM, true);
- }
+
+ // When test for restriction in device owner test mode, not set on the current user.
+ intent.putExtra(CommandReceiverActivity.EXTRA_USE_CURRENT_USER_DPM,
+ !isDeviceOwnerMode(mode));
return intent;
}
@@ -275,8 +280,8 @@
}
return isCellBroadcastAppLinkEnabled;
case UserManager.DISALLOW_FUN:
- // Easter egg is not available on watch
- return !pm.hasSystemFeature(PackageManager.FEATURE_WATCH);
+ // Easter egg is not available on watch or automotive
+ return FeatureUtil.isFunSupported(context);
case UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS:
return pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY);
case UserManager.DISALLOW_CONFIG_WIFI:
@@ -294,9 +299,13 @@
case UserManager.DISALLOW_CONFIG_CREDENTIALS:
return !pm.hasSystemFeature(PackageManager.FEATURE_WATCH)
&& hasSettingsActivity(context, ACTION_CREDENTIALS_INSTALL);
- case UserManager.DISALLOW_CONFIG_LOCATION:
case UserManager.DISALLOW_CONFIG_SCREEN_TIMEOUT:
- // TODO(b/189282625): replace FEATURE_WATCH with a more specific feature
+ return FeatureUtil.isScreenTimeoutSupported(context);
+ case UserManager.DISALLOW_CONFIG_LOCATION:
+ return FeatureUtil.isConfigLocationSupported(context);
+ case UserManager.DISALLOW_APPS_CONTROL:
+ return !pm.hasSystemFeature(PackageManager.FEATURE_WATCH);
+ case UserManager.DISALLOW_UNINSTALL_APPS:
return !pm.hasSystemFeature(PackageManager.FEATURE_WATCH);
default:
return true;
@@ -345,6 +354,13 @@
return !TextUtils.isEmpty(resolveInfo.activityInfo.applicationInfo.packageName);
}
+ /**
+ * Checks whether target mode is device owner test mode
+ */
+ private static boolean isDeviceOwnerMode(int mode) {
+ return mode == PolicyTransparencyTestListActivity.MODE_DEVICE_OWNER;
+ }
+
private static class UserRestrictionItem {
final int label;
final int userAction;
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/NfcDialogs.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/NfcDialogs.java
index 644e637..4e2f5f1 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/NfcDialogs.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/NfcDialogs.java
@@ -16,14 +16,14 @@
package com.android.cts.verifier.nfc;
-import com.android.cts.verifier.R;
-
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.provider.Settings;
+import com.android.cts.verifier.R;
+
/** Class containing methods to create common dialogs for NFC activities. */
public class NfcDialogs {
@@ -82,6 +82,25 @@
.create();
}
+ /**
+ * SecureNfcEnabled dialog
+ */
+ public static AlertDialog createSecureNfcEnabledDialog(final Context context) {
+ return new AlertDialog.Builder(context)
+ .setIcon(android.R.drawable.ic_dialog_alert)
+ .setTitle(R.string.secure_nfc_enabled)
+ .setMessage(R.string.secure_nfc_enabled_message)
+ .setPositiveButton(R.string.nfc_settings, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ Intent intent = new Intent(Settings.ACTION_NFC_SETTINGS);
+ context.startActivity(intent);
+ }
+ })
+ .create();
+ }
+
+
private NfcDialogs() {
}
}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/ScreenOffPaymentEmulatorActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/ScreenOffPaymentEmulatorActivity.java
index 50a97e6..557170d 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/ScreenOffPaymentEmulatorActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/ScreenOffPaymentEmulatorActivity.java
@@ -1,10 +1,13 @@
package com.android.cts.verifier.nfc.hce;
+import android.app.Dialog;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.nfc.NfcAdapter;
+import android.nfc.NfcManager;
import android.os.Bundle;
import com.android.cts.verifier.R;
@@ -13,9 +16,11 @@
public class ScreenOffPaymentEmulatorActivity extends BaseEmulatorActivity {
final static int STATE_SCREEN_ON = 0;
final static int STATE_SCREEN_OFF = 1;
+ private static final int SECURE_NFC_ENABLED_DIALOG_ID = 1;
private int mState = STATE_SCREEN_ON;
private ScreenOnOffReceiver mReceiver;
+ private NfcAdapter mNfcAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -31,11 +36,17 @@
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_SCREEN_ON);
registerReceiver(mReceiver, filter);
+
+ NfcManager nfcManager = getSystemService(NfcManager.class);
+ mNfcAdapter = nfcManager.getDefaultAdapter();
}
@Override
protected void onResume() {
super.onResume();
+ if (mNfcAdapter.isSecureNfcSupported() && mNfcAdapter.isSecureNfcEnabled()) {
+ showDialog(SECURE_NFC_ENABLED_DIALOG_ID);
+ }
}
@Override
@@ -86,6 +97,16 @@
}
}
+ @Override
+ public Dialog onCreateDialog(int id, Bundle args) {
+ switch (id) {
+ case SECURE_NFC_ENABLED_DIALOG_ID:
+ return NfcDialogs.createSecureNfcEnabledDialog(this);
+ default:
+ return super.onCreateDialog(id, args);
+ }
+ }
+
private class ScreenOnOffReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/security/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/security/OWNERS
index f5cd322..40ff6060 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/security/OWNERS
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/security/OWNERS
@@ -2,7 +2,7 @@
# Bug template url: https://b.corp.google.com/issues/new?component=100560&template=63204 = per-file LockConfirmBypassTest.java, SetNewPasswordComplexityTest.java
# Bug template url: https://b.corp.google.com/issues/new?component=746324&template=1398789 = per-file: SecurityModeFeatureVerifierActivity.java
# Bug component: 189335 = per-file FingerprintBoundKeysTest.java, IdentityCredentialAuthentication.java, ProtectedConfirmationTest.java, ScreenLockBoundKeysTest.java
-per-file CA*.java, Ca*.java, KeyChainTest.java = alexkershaw@google.com, eranm@google.com, rubinxu@google.com, sandness@google.com, pgrafov@google.com
-per-file LockConfirmBypassTest.java, SetNewPasswordComplexityTest.java, CredentialManagementAppActivity.java = alexkershaw@google.com, eranm@google.com, rubinxu@google.com, sandness@google.com, pgrafov@google.com
+per-file CA*.java, Ca*.java, KeyChainTest.java = file:platform/frameworks/base:/core/java/android/app/admin/EnterprisePlatformSecurity_OWNERS
+per-file LockConfirmBypassTest.java, SetNewPasswordComplexityTest.java, CredentialManagementAppActivity.java = file:platform/frameworks/base:/core/java/android/app/admin/EnterprisePlatformSecurity_OWNERS
per-file FingerprintBoundKeysTest.java, IdentityCredentialAuthentication.java, ProtectedConfirmationTest.java, ScreenLockBoundKeysTest.java = swillden@google.com
per-file SecurityModeFeatureVerifierActivity.java = jjoslin@google.com, tomcherry@google.com
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/security/SecurityModeFeatureVerifierActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/security/SecurityModeFeatureVerifierActivity.java
index d7e6ddb..43a8c18 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/security/SecurityModeFeatureVerifierActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/security/SecurityModeFeatureVerifierActivity.java
@@ -16,19 +16,19 @@
package com.android.cts.verifier.security;
-import static android.os.Build.VERSION;
import static android.os.Build.VERSION_CODES;
+import static com.android.compatibility.common.util.PropertyUtil.getFirstApiLevel;
+import static com.android.compatibility.common.util.PropertyUtil.getVendorApiLevel;
+
import android.content.pm.PackageManager;
import android.os.Bundle;
-import android.os.SystemProperties;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
-
import com.android.cts.verifier.PassFailButtons;
import com.android.cts.verifier.R;
@@ -60,9 +60,8 @@
mHandheldOrTabletOkButton = (Button) findViewById(R.id.handheld_or_tablet_yes);
mHandheldOrTabletNaButton = (Button) findViewById(R.id.handheld_or_tablet_not_applicable);
- final int firstApiLevel =
- SystemProperties.getInt("ro.product.first_api_level", VERSION.SDK_INT);
- mDeviceLaunchedBeforeS = firstApiLevel < VERSION_CODES.S;
+ // Devices launched before S will always pass the test.
+ mDeviceLaunchedBeforeS = isLaunchedBeforeS();
mFeatureAvailable = getPackageManager()
.hasSystemFeature(PackageManager.FEATURE_SECURITY_MODEL_COMPATIBLE);
@@ -81,4 +80,8 @@
}
});
}
+
+ private static boolean isLaunchedBeforeS() {
+ return Math.min(getFirstApiLevel(), getVendorApiLevel()) < VERSION_CODES.S;
+ }
}
diff --git a/common/device-side/util-axt/src/com/android/compatibility/common/util/ExtraBusinessLogicTestCase.java b/common/device-side/util-axt/src/com/android/compatibility/common/util/ExtraBusinessLogicTestCase.java
index b0ec2e9..27d86b5 100644
--- a/common/device-side/util-axt/src/com/android/compatibility/common/util/ExtraBusinessLogicTestCase.java
+++ b/common/device-side/util-axt/src/com/android/compatibility/common/util/ExtraBusinessLogicTestCase.java
@@ -18,6 +18,8 @@
import static org.junit.Assert.assertTrue;
+import android.util.Log;
+
import org.junit.Before;
import java.util.List;
@@ -35,7 +37,7 @@
* Now Business Logics rules and actions can be called from the GCL by using the interface fully
* qualified name.
*/
-public abstract class ExtraBusinessLogicTestCase extends BusinessLogicTestCase implements MultiLogDevice {
+public abstract class ExtraBusinessLogicTestCase extends BusinessLogicTestCase {
private static final String LOG_TAG = BusinessLogicTestCase.class.getSimpleName();
@@ -52,7 +54,8 @@
"Test \"%s\" is unable to execute as it depends on the missing remote "
+ "configuration.", mTestCase.getMethodName()), mCanReadBusinessLogic);
} else if (!mCanReadBusinessLogic) {
- logInfo(LOG_TAG, "Skipping Business Logic for %s", mTestCase.getMethodName());
+ Log.i(LOG_TAG, String.format(
+ "Skipping Business Logic for %s", mTestCase.getMethodName()));
return;
}
diff --git a/common/device-side/util-axt/src/com/android/compatibility/common/util/MultiLogDevice.java b/common/device-side/util-axt/src/com/android/compatibility/common/util/MultiLogDevice.java
deleted file mode 100644
index dbe5128..0000000
--- a/common/device-side/util-axt/src/com/android/compatibility/common/util/MultiLogDevice.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.compatibility.common.util;
-
-import android.util.Log;
-import com.android.compatibility.common.util.MultiLog;
-
-/** Implement the deviceside interface for logging on host+device-common code. */
-public interface MultiLogDevice extends MultiLog {
- /** {@inheritDoc} */
- @Override
- default void logInfo(String logTag, String format, Object... args) {
- Log.i(logTag, String.format(format, args));
- }
-
- /** {@inheritDoc} */
- @Override
- default void logDebug(String logTag, String format, Object... args) {
- Log.d(logTag, String.format(format, args));
- }
-
- /** {@inheritDoc} */
- @Override
- default void logWarn(String logTag, String format, Object... args) {
- Log.w(logTag, String.format(format, args));
- }
-
- /** {@inheritDoc} */
- @Override
- default void logError(String logTag, String format, Object... args) {
- Log.e(logTag, String.format(format, args));
- }
-}
diff --git a/common/device-side/util-axt/src/com/android/compatibility/common/util/OWNERS b/common/device-side/util-axt/src/com/android/compatibility/common/util/OWNERS
index e794f2c..c7cf374 100644
--- a/common/device-side/util-axt/src/com/android/compatibility/common/util/OWNERS
+++ b/common/device-side/util-axt/src/com/android/compatibility/common/util/OWNERS
@@ -1 +1 @@
-per-file BaseDefaultPermissionGrantPolicyTest.java = moltmann@google.com, svetoslavganov@google.com
+per-file BaseDefaultPermissionGrantPolicyTest.java = file:platform/frameworks/base:/core/java/android/permission/DEFAULT_PERMISSION_GRANT_POLICY_OWNERS
diff --git a/common/device-side/util-axt/src/com/android/compatibility/common/util/enterprise/OWNERS b/common/device-side/util-axt/src/com/android/compatibility/common/util/enterprise/OWNERS
index b37176e..cf88726 100644
--- a/common/device-side/util-axt/src/com/android/compatibility/common/util/enterprise/OWNERS
+++ b/common/device-side/util-axt/src/com/android/compatibility/common/util/enterprise/OWNERS
@@ -1,7 +1,2 @@
# Bug template url: https://b.corp.google.com/issues/new?component=100560&template=63204
-alexkershaw@google.com
-eranm@google.com
-rubinxu@google.com
-sandness@google.com
-pgrafov@google.com
-scottjonathan@google.com
+file:platform/frameworks/base:/core/java/android/app/admin/EnterprisePlatform_OWNERS
\ No newline at end of file
diff --git a/hostsidetests/appcompat/OWNERS b/hostsidetests/appcompat/OWNERS
index 11a1173..8411969 100644
--- a/hostsidetests/appcompat/OWNERS
+++ b/hostsidetests/appcompat/OWNERS
@@ -1,8 +1,2 @@
# Bug component: 610774
-
-# Use this reviewer by default.
-platform-compat-eng+reviews@google.com
-
-andreionea@google.com
-mathewi@google.com
-satayev@google.com
+include tools/platform-compat:/OWNERS
diff --git a/hostsidetests/appcompat/compatchanges/src/com/android/cts/appcompat/CompatChangesValidConfigTest.java b/hostsidetests/appcompat/compatchanges/src/com/android/cts/appcompat/CompatChangesValidConfigTest.java
index de060ffd..9b31366 100644
--- a/hostsidetests/appcompat/compatchanges/src/com/android/cts/appcompat/CompatChangesValidConfigTest.java
+++ b/hostsidetests/appcompat/compatchanges/src/com/android/cts/appcompat/CompatChangesValidConfigTest.java
@@ -89,7 +89,7 @@
public void testOnlyAllowedlistedChangesAreOverridable() throws Exception {
for (Change c : getOnDeviceCompatConfig()) {
if (c.overridable) {
- assertWithMessage("Please contact platform-compat-eng@google.com for approval")
+ assertWithMessage("Please contact compat-team@google.com for approval")
.that(OVERRIDABLE_CHANGES).contains(c.changeName);
}
}
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/ApkVerityInstallTest.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/ApkVerityInstallTest.java
index 3524357..620c9eb 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/ApkVerityInstallTest.java
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/ApkVerityInstallTest.java
@@ -19,6 +19,9 @@
import static org.junit.Assert.fail;
import static org.junit.Assume.assumeTrue;
+import static com.android.compatibility.common.util.PropertyUtil.getFirstApiLevel;
+import static com.android.compatibility.common.util.PropertyUtil.getVendorApiLevel;
+
import android.platform.test.annotations.AppModeFull;
import com.android.compatibility.common.util.CddTest;
@@ -435,7 +438,9 @@
private void assumeSecurityModelCompat() throws DeviceNotAvailableException {
// This feature name check only applies to devices that first shipped with
// SC or later.
- if (mLaunchApiLevel >= 31) {
+ final int firstApiLevel =
+ Math.min(getFirstApiLevel(getDevice()), getVendorApiLevel(getDevice()));
+ if (firstApiLevel >= 31) {
assumeTrue("Skipping test: FEATURE_SECURITY_MODEL_COMPATIBLE missing.",
getDevice().hasFeature("feature:android.hardware.security.model.compatible"));
}
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/DirectBootHostTest.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/DirectBootHostTest.java
index 0abb593..e513aa7 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/DirectBootHostTest.java
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/DirectBootHostTest.java
@@ -18,6 +18,9 @@
import static android.appsecurity.cts.Utils.waitForBootCompleted;
+import static com.android.compatibility.common.util.PropertyUtil.getFirstApiLevel;
+import static com.android.compatibility.common.util.PropertyUtil.getVendorApiLevel;
+
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeFalse;
@@ -25,7 +28,6 @@
import android.platform.test.annotations.RequiresDevice;
-import com.android.compatibility.common.util.PropertyUtil;
import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
@@ -205,7 +207,9 @@
getDevice().hasFeature(FEATURE_SECURE_LOCK_SCREEN));
// This feature name check only applies to devices that first shipped with
// SC or later.
- if (PropertyUtil.getFirstApiLevel(getDevice()) >= 31) {
+ final int firstApiLevel =
+ Math.min(getFirstApiLevel(getDevice()), getVendorApiLevel(getDevice()));
+ if (firstApiLevel >= 31) {
assumeTrue("Skipping test: FEATURE_SECURITY_MODEL_COMPATIBLE missing.",
getDevice().hasFeature("feature:android.hardware.security.model.compatible"));
}
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/StorageHostTest.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/StorageHostTest.java
index f08f964c..7f4cf27 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/StorageHostTest.java
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/StorageHostTest.java
@@ -31,6 +31,7 @@
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import static org.junit.Assume.assumeTrue;
import java.util.Map;
@@ -187,6 +188,7 @@
@Test
public void testFullDisk() throws Exception {
+ assumeTrue(!isWatch());
// Clear all other cached and external storage data to give ourselves a
// clean slate to test against
getDevice().executeShellCommand("pm trim-caches 4096G");
@@ -261,4 +263,12 @@
}
}
}
+
+ private boolean isWatch() {
+ try {
+ return getDevice().hasFeature("feature:android.hardware.type.watch");
+ } catch (DeviceNotAvailableException e) {
+ return false;
+ }
+ }
}
diff --git a/hostsidetests/appsecurity/test-apps/KeyRotationTest/Android.mk b/hostsidetests/appsecurity/test-apps/KeyRotationTest/Android.mk
deleted file mode 100644
index 930dd06..0000000
--- a/hostsidetests/appsecurity/test-apps/KeyRotationTest/Android.mk
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright (C) 2021 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT 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)
-
-# Build the test APKs using their own makefiles
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/hostsidetests/appsecurity/test-apps/StorageApp/src/com/android/cts/storageapp/StorageTest.java b/hostsidetests/appsecurity/test-apps/StorageApp/src/com/android/cts/storageapp/StorageTest.java
index 0d6bcc1..8f41f0a 100644
--- a/hostsidetests/appsecurity/test-apps/StorageApp/src/com/android/cts/storageapp/StorageTest.java
+++ b/hostsidetests/appsecurity/test-apps/StorageApp/src/com/android/cts/storageapp/StorageTest.java
@@ -117,11 +117,15 @@
}
private void clearSpaceGeneric(UiDevice device) throws UiObjectNotFoundException {
- UiScrollable uiScrollable = new UiScrollable(new UiSelector().scrollable(true));
- try {
- uiScrollable.scrollTextIntoView("internal storage");
- } catch (UiObjectNotFoundException e) {
- // Scrolling can fail if the UI is not scrollable
+ int i = device.findObjects(android.support.test.uiautomator.By.scrollable(true)).size();
+ for (int j = 0; j < i; j++) {
+ UiScrollable localObject = new UiScrollable(new UiSelector().scrollable(true).instance(j));
+ ((UiScrollable) localObject).setMaxSearchSwipes(10);
+ try {
+ ((UiScrollable) localObject).scrollTextIntoView("internal storage");
+ } catch (UiObjectNotFoundException localUiObjectNotFoundException) {
+ // Scrolling can fail if the UI is not scrollable
+ }
}
device.findObject(new UiSelector().textContains("internal storage")).click();
device.waitForIdle();
diff --git a/hostsidetests/devicepolicy/OWNERS b/hostsidetests/devicepolicy/OWNERS
index b37176e..cf88726 100644
--- a/hostsidetests/devicepolicy/OWNERS
+++ b/hostsidetests/devicepolicy/OWNERS
@@ -1,7 +1,2 @@
# Bug template url: https://b.corp.google.com/issues/new?component=100560&template=63204
-alexkershaw@google.com
-eranm@google.com
-rubinxu@google.com
-sandness@google.com
-pgrafov@google.com
-scottjonathan@google.com
+file:platform/frameworks/base:/core/java/android/app/admin/EnterprisePlatform_OWNERS
\ No newline at end of file
diff --git a/hostsidetests/devicepolicy/app/CrossProfileTestApps/ModifyQuietModeEnabledApp/OWNERS b/hostsidetests/devicepolicy/app/CrossProfileTestApps/ModifyQuietModeEnabledApp/OWNERS
index 9647f11..61a60e4 100644
--- a/hostsidetests/devicepolicy/app/CrossProfileTestApps/ModifyQuietModeEnabledApp/OWNERS
+++ b/hostsidetests/devicepolicy/app/CrossProfileTestApps/ModifyQuietModeEnabledApp/OWNERS
@@ -1,4 +1,3 @@
# Bug component: 168445
-alexkershaw@google.com
-kholoudm@google.com
-pbdr@google.com
+file:platform/frameworks/base:/core/java/android/app/admin/EnterprisePlatform_OWNERS
+pbdr@google.com
\ No newline at end of file
diff --git a/hostsidetests/devicepolicy/app/HasLauncherActivityApp/no_launcher_activity_AndroidManifest.xml b/hostsidetests/devicepolicy/app/HasLauncherActivityApp/no_launcher_activity_AndroidManifest.xml
index 614377c..0b21b15 100755
--- a/hostsidetests/devicepolicy/app/HasLauncherActivityApp/no_launcher_activity_AndroidManifest.xml
+++ b/hostsidetests/devicepolicy/app/HasLauncherActivityApp/no_launcher_activity_AndroidManifest.xml
@@ -18,15 +18,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.cts.nolauncheractivityapp">
<uses-permission android:name="android.permission.INTERNET" />
- <application>
- <activity android:name="com.android.cts.haslauncheractivityapp.MainActivity"
- android:exported="true">
- <intent-filter>
- <action android:name="android.intent.action.VIEW" />
- </intent-filter>
- </activity>
- <service android:name=".EmptyService" android:enabled="true"></service>
- </application>
+ <application />
</manifest>
diff --git a/hostsidetests/devicepolicy/app/SharingApps/OWNERS b/hostsidetests/devicepolicy/app/SharingApps/OWNERS
index 2638902..a491b1e 100644
--- a/hostsidetests/devicepolicy/app/SharingApps/OWNERS
+++ b/hostsidetests/devicepolicy/app/SharingApps/OWNERS
@@ -1,5 +1,2 @@
# Bug component: 168445
-alexkershaw@google.com
-arangelov@google.com
-scottjonathan@google.com
-kholoudm@google.com
+file:platform/frameworks/base:/core/java/android/app/admin/EnterprisePlatform_OWNERS
\ No newline at end of file
diff --git a/hostsidetests/edi/src/android/edi/cts/PropertyDeviceInfo.java b/hostsidetests/edi/src/android/edi/cts/PropertyDeviceInfo.java
index b9f6ea1..3c99725 100644
--- a/hostsidetests/edi/src/android/edi/cts/PropertyDeviceInfo.java
+++ b/hostsidetests/edi/src/android/edi/cts/PropertyDeviceInfo.java
@@ -37,13 +37,12 @@
ITestDevice device = getDevice();
CommandResult commandResult = device.executeShellV2Command("getprop");
if (commandResult.getExitCode() == null) {
- CLog.e("getprop exit code is null");
- return;
+ throw new NullPointerException("getprop exit code is null");
}
if (commandResult.getExitCode() != 0) {
- CLog.e("getprop returns %d: %s", commandResult.getExitCode(),
- commandResult.getStderr());
- return;
+ throw new IllegalStateException(
+ String.format("getprop returns %d: %s", commandResult.getExitCode(),
+ commandResult.getStderr()));
}
if (commandResult.getExitCode() == 0 && !commandResult.getStderr().isEmpty()) {
CLog.w("Warnings occur when running getprop:\n%s",
@@ -59,6 +58,7 @@
private void parseProps(String stdout, HostInfoStore store) throws Exception {
Pattern pattern = Pattern.compile("\\[(ro.+)\\]: \\[(.+)\\]");
if (stdout == null) stdout = "";
+ boolean hasMatched = false;
try (Scanner scanner = new Scanner(stdout)) {
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
@@ -71,8 +71,13 @@
store.addResult("name", name);
store.addResult("value", value);
store.endGroup();
+ hasMatched = true;
}
}
}
+ if (!hasMatched) {
+ throw new IllegalStateException(
+ "Unable to find any read-only properties. Output is " + stdout);
+ }
}
}
diff --git a/hostsidetests/gputools/apps/AndroidManifest.xml b/hostsidetests/gputools/apps/AndroidManifest.xml
index 89ecaf8..3c8de1f 100755
--- a/hostsidetests/gputools/apps/AndroidManifest.xml
+++ b/hostsidetests/gputools/apps/AndroidManifest.xml
@@ -19,13 +19,13 @@
package="android.rootlessgpudebug.app">
<application android:extractNativeLibs="true">
- <activity android:name=".RootlessGpuDebugDeviceActivity"
+ <service android:name=".RootlessGpuDebugService"
+ android:process=":target_api_service"
android:exported="true">
<intent-filter>
- <action android:name="android.intent.action.MAIN"/>
- <category android:name="android.intent.category.LAUNCHER"/>
+ <action android:name="android.service.action.TARGET_API_SERVICE"/>
</intent-filter>
- </activity>
+ </service>
</application>
</manifest>
diff --git a/hostsidetests/gputools/apps/inject/AndroidManifest.xml b/hostsidetests/gputools/apps/inject/AndroidManifest.xml
index 63bd9c1..743c2be 100644
--- a/hostsidetests/gputools/apps/inject/AndroidManifest.xml
+++ b/hostsidetests/gputools/apps/inject/AndroidManifest.xml
@@ -21,13 +21,12 @@
<application android:extractNativeLibs="true">
<meta-data android:name="com.android.graphics.injectLayers.enable"
android:value="true"/>
- <activity android:name=".RootlessGpuDebugDeviceActivity"
- android:exported="true">
+ <service android:name=".RootlessGpuDebugService"
+ android:process=":target_api_service"
+ android:exported="true">
<intent-filter>
- <action android:name="android.intent.action.MAIN"/>
- <category android:name="android.intent.category.LAUNCHER"/>
+ <action android:name="android.service.action.TARGET_API_SERVICE"/>
</intent-filter>
- </activity>
+ </service>
</application>
-
</manifest>
diff --git a/hostsidetests/gputools/apps/jni/android_gputools_cts_RootlessGpuDebug.cpp b/hostsidetests/gputools/apps/jni/android_gputools_cts_RootlessGpuDebug.cpp
index f62a583..44317c5 100644
--- a/hostsidetests/gputools/apps/jni/android_gputools_cts_RootlessGpuDebug.cpp
+++ b/hostsidetests/gputools/apps/jni/android_gputools_cts_RootlessGpuDebug.cpp
@@ -17,9 +17,6 @@
#define LOG_TAG "RootlessGpuDebug"
-#include <string>
-#include <vector>
-
#include <EGL/egl.h>
#include <GLES3/gl3.h>
#include <android/log.h>
@@ -27,6 +24,10 @@
#include <jni.h>
#include <vulkan/vulkan.h>
+#include <sstream>
+#include <string>
+#include <vector>
+
#define ALOGI(msg, ...) \
__android_log_print(ANDROID_LOG_INFO, LOG_TAG, (msg), __VA_ARGS__)
#define ALOGE(msg, ...) \
@@ -39,7 +40,7 @@
typedef __eglMustCastToProperFunctionPointerType EGLFuncPointer;
std::string initVulkan() {
- std::string result = "";
+ std::stringstream result;
{
uint32_t count = 0;
@@ -78,13 +79,13 @@
};
VkInstance instance;
VkResult vkResult = vkCreateInstance(&instance_info, nullptr, &instance);
- if (vkResult == VK_ERROR_INITIALIZATION_FAILED) {
- result = "vkCreateInstance failed, meaning layers could not be chained.";
+ if (vkResult == VK_SUCCESS) {
+ result << "vkCreateInstance succeeded.";
} else {
- result = "vkCreateInstance succeeded.";
+ result << "vkCreateInstance failed with VkResult: " << vkResult;
}
- return result;
+ return result.str();
}
std::string initGLES() {
@@ -163,8 +164,7 @@
} // anonymous namespace
int register_android_gputools_cts_RootlessGpuDebug(JNIEnv* env) {
- jclass clazz = env->FindClass(
- "android/rootlessgpudebug/app/RootlessGpuDebugDeviceActivity");
+ jclass clazz = env->FindClass("android/rootlessgpudebug/app/RootlessGpuDebugService");
return env->RegisterNatives(clazz, gMethods,
sizeof(gMethods) / sizeof(JNINativeMethod));
}
diff --git a/hostsidetests/gputools/apps/src/android/rootlessgpudebug/app/RootlessGpuDebugDeviceActivity.java b/hostsidetests/gputools/apps/src/android/rootlessgpudebug/app/RootlessGpuDebugDeviceActivity.java
deleted file mode 100644
index a29a246..0000000
--- a/hostsidetests/gputools/apps/src/android/rootlessgpudebug/app/RootlessGpuDebugDeviceActivity.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.rootlessgpudebug.app;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.util.Log;
-
-import java.lang.Override;
-
-public class RootlessGpuDebugDeviceActivity extends Activity {
-
- static {
- System.loadLibrary("ctsgputools_jni");
- }
-
- private static final String TAG = RootlessGpuDebugDeviceActivity.class.getSimpleName();
-
- @Override
- public void onCreate(Bundle icicle) {
- super.onCreate(icicle);
-
- String result = nativeInitVulkan();
- Log.i(TAG, result);
-
- result = nativeInitGLES();
- Log.i(TAG, result);
-
- Log.i(TAG, "RootlessGpuDebug activity complete");
- }
-
- private static native String nativeInitVulkan();
- private static native String nativeInitGLES();
-
-}
-
diff --git a/hostsidetests/gputools/apps/src/android/rootlessgpudebug/app/RootlessGpuDebugService.java b/hostsidetests/gputools/apps/src/android/rootlessgpudebug/app/RootlessGpuDebugService.java
new file mode 100644
index 0000000..47b1ad6
--- /dev/null
+++ b/hostsidetests/gputools/apps/src/android/rootlessgpudebug/app/RootlessGpuDebugService.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.rootlessgpudebug.app;
+
+import android.app.Service;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.util.Log;
+
+import java.lang.Override;
+
+
+public class RootlessGpuDebugService extends Service {
+
+ private static final String TAG = RootlessGpuDebugService.class.getSimpleName();
+
+ static {
+ System.loadLibrary("ctsgputools_jni");
+ }
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ // We don't provide binding, so return null
+ return null;
+ }
+
+ @Override
+ public int onStartCommand(Intent intent, int flags, int startId) {
+
+ // The target API is provided via Intent extras
+ String API = null;
+
+ if (intent == null) {
+ throw new AssertionError("No Intent provided to " + TAG);
+ }
+
+ Bundle bundle = intent.getExtras();
+
+ // Ensure the service was started with extras
+ if (bundle == null) {
+ throw new AssertionError("Failed to get Intent extras for " + TAG);
+ }
+
+ API = bundle.getString("API");
+
+ // Without an API to target, we're done
+ if (API == null) {
+ throw new AssertionError("No API provided for " + TAG);
+ }
+
+ // Only three combinations are expected
+ Boolean supportedApi = API.equals("Vulkan") ||
+ API.equals("GLES") ||
+ API.equals("Both");
+ if (!supportedApi) {
+ throw new AssertionError("Unsupported API " + API + " in " + TAG);
+ }
+
+ // For each choice, init the target API
+ if (API.equals("Vulkan") || API.equals("Both")) {
+ String result = nativeInitVulkan();
+ Log.i(TAG, result);
+ }
+
+ if (API.equals("GLES") || API.equals("Both")) {
+ String result = nativeInitGLES();
+ Log.i(TAG, result);
+ }
+
+ // Mark service completion
+ Log.i(TAG, "RootlessGpuDebugService complete");
+
+ // Don't try to restart when this is shut down
+ return START_NOT_STICKY;
+ }
+
+ private static native String nativeInitVulkan();
+ private static native String nativeInitGLES();
+}
+
diff --git a/hostsidetests/gputools/src/android/gputools/cts/CtsRootlessGpuDebugHostTest.java b/hostsidetests/gputools/src/android/gputools/cts/CtsRootlessGpuDebugHostTest.java
index 4ec4ef8..3f4c4c9 100644
--- a/hostsidetests/gputools/src/android/gputools/cts/CtsRootlessGpuDebugHostTest.java
+++ b/hostsidetests/gputools/src/android/gputools/cts/CtsRootlessGpuDebugHostTest.java
@@ -33,7 +33,7 @@
@RunWith(DeviceJUnit4ClassRunner.class)
public class CtsRootlessGpuDebugHostTest extends BaseHostJUnit4Test {
- public static final String TAG = "RootlessGpuDebugDeviceActivity";
+ public static final String TAG = "RootlessGpuDebugService";
// This test ensures that the Vulkan and GLES loaders can use Settings to load layers
// from the base directory of debuggable applications. Is also tests several
@@ -90,8 +90,9 @@
// Positive combined tests
// - Ensure we can load Vulkan and GLES layers at the same time, from multiple external apps (testMultipleExternalApps)
- private static final String CLASS = "RootlessGpuDebugDeviceActivity";
- private static final String ACTIVITY = "android.rootlessgpudebug.app.RootlessGpuDebugDeviceActivity";
+ private static final String API_VULKAN = "Vulkan";
+ private static final String API_GLES = "GLES";
+ private static final String API_BOTH = "Both";
private static final String VK_LAYER_LIB_PREFIX = "libVkLayer_nullLayer";
private static final String VK_LAYER_A_LIB = VK_LAYER_LIB_PREFIX + "A.so";
private static final String VK_LAYER_B_LIB = VK_LAYER_LIB_PREFIX + "B.so";
@@ -257,7 +258,7 @@
result.found = true;
result.lineNumber = lineNumber;
}
- if (line.contains("RootlessGpuDebug activity complete")) {
+ if (line.contains("RootlessGpuDebugService complete")) {
// Once we've got output from the app, we've collected what we need
scanComplete= true;
}
@@ -311,6 +312,20 @@
}
/**
+ * Launch our test as a background service, avoiding any platform rendering code
+ */
+ private void launchBackgroundService(String appName, String Api) throws Exception {
+
+ // Allow the app to be launched as a background service
+ getDevice().executeAdbCommand("shell", "cmd", "deviceidle", "tempwhitelist", appName);
+
+ // Start the service and tell it to init Vulkan/GLES/Both
+ getDevice().executeAdbCommand("shell", "am", "startservice", "-a", "android.service.action.TARGET_API_SERVICE",
+ "--es", "API", Api, appName);
+ }
+
+
+ /**
* This is the primary test of the feature. It pushes layers to our debuggable app and ensures they are
* loaded in the correct order.
*/
@@ -326,7 +341,6 @@
setupLayer(VK_LAYER_A_LIB, LAYERS_APP);
setupLayer(VK_LAYER_B_LIB, LAYERS_APP);
-
// Copy them over to our DEBUG app
getDevice().executeAdbCommand("shell", "cat", "/data/local/tmp/" + VK_LAYER_A_LIB, "|",
"run-as", DEBUG_APP, "--user", Integer.toString(getDevice().getCurrentUser()),
@@ -335,10 +349,9 @@
"run-as", DEBUG_APP, "--user", Integer.toString(getDevice().getCurrentUser()),
"sh", "-c", "\'cat", ">", VK_LAYER_B_LIB, ";", "chmod", "700", VK_LAYER_B_LIB + "\'");
-
// Kick off our DEBUG app
String appStartTime = getTime();
- getDevice().executeAdbCommand("shell", "am", "start", "-n", DEBUG_APP + "/" + ACTIVITY);
+ launchBackgroundService(DEBUG_APP, API_VULKAN);
// Check that both layers were loaded, in the correct order
String searchStringA = "nullCreateInstance called in " + VK_LAYER_A;
@@ -353,6 +366,7 @@
}
public void testLayerNotLoadedVulkan(final String APP_NAME) throws Exception {
+
// Set up a layers to be loaded for RELEASE or INJECT app
applySetting("enable_gpu_debug_layers", "1");
applySetting("gpu_debug_app", APP_NAME);
@@ -366,9 +380,9 @@
"run-as", APP_NAME, "--user", Integer.toString(getDevice().getCurrentUser()),
"sh", "-c", "\'cat", ">", VK_LAYER_A_LIB, ";", "chmod", "700", VK_LAYER_A_LIB + "\'", "||", "echo", "run-as", "failed");
- // Kick off our RELEASE app
+ // Kick off our app
String appStartTime = getTime();
- getDevice().executeAdbCommand("shell", "am", "start", "-n", APP_NAME + "/" + ACTIVITY);
+ launchBackgroundService(APP_NAME, API_VULKAN);
// Ensure we don't load the layer in base dir
assertVkLayerEnumeration(appStartTime, VK_LAYER_A, false);
@@ -414,7 +428,7 @@
// Kick off our DEBUG app
String appStartTime = getTime();
- getDevice().executeAdbCommand("shell", "am", "start", "-n", DEBUG_APP + "/" + ACTIVITY);
+ launchBackgroundService(DEBUG_APP, API_VULKAN);
// Ensure we don't load the layer in base dir
assertVkLayerEnumeration(appStartTime, VK_LAYER_A, false);
@@ -442,7 +456,7 @@
// Kick off our DEBUG app
String appStartTime = getTime();
- getDevice().executeAdbCommand("shell", "am", "start", "-n", DEBUG_APP + "/" + ACTIVITY);
+ launchBackgroundService(DEBUG_APP, API_VULKAN);
// Ensure we don't load the layer in base dir
assertVkLayerEnumeration(appStartTime, VK_LAYER_A, false);
@@ -470,7 +484,7 @@
// Kick off our DEBUG app
String appStartTime = getTime();
- getDevice().executeAdbCommand("shell", "am", "start", "-n", DEBUG_APP + "/" + ACTIVITY);
+ launchBackgroundService(DEBUG_APP, API_VULKAN);
// Ensure layerA is not loaded
assertVkLayerLoading(appStartTime, VK_LAYER_A, false);
@@ -492,7 +506,7 @@
// Kick off our RELEASE app
String appStartTime = getTime();
- getDevice().executeAdbCommand("shell", "am", "start", "-n", RELEASE_APP + "/" + ACTIVITY);
+ launchBackgroundService(RELEASE_APP, API_VULKAN);
// Check that only layerC was loaded
assertVkLayerEnumeration(appStartTime, VK_LAYER_A, false);
@@ -527,7 +541,7 @@
// Kick off our DEBUG app
String appStartTime = getTime();
- getDevice().executeAdbCommand("shell", "am", "start", "-n", DEBUG_APP + "/" + ACTIVITY);
+ launchBackgroundService(DEBUG_APP, API_VULKAN);
// Ensure only layerA is loaded
assertVkLayerLoading(appStartTime, VK_LAYER_A, true);
@@ -548,9 +562,9 @@
// Specify the external app that hosts layers
applySetting("gpu_debug_layer_app", LAYERS_APP);
- // Kick off our DEBUG app
+ // Kick off our app
String appStartTime = getTime();
- getDevice().executeAdbCommand("shell", "am", "start", "-n", APP_NAME + "/" + ACTIVITY);
+ launchBackgroundService(APP_NAME, API_VULKAN);
String[] layerNames = layers.split(":");
for (String layerName : layerNames) {
@@ -621,7 +635,7 @@
// Kick off our DEBUG app
String appStartTime = getTime();
- getDevice().executeAdbCommand("shell", "am", "start", "-n", DEBUG_APP + "/" + ACTIVITY);
+ launchBackgroundService(DEBUG_APP, API_GLES);
// Check that both layers were loaded, in the correct order
String searchStringA = "glesLayer_eglChooseConfig called in " + GLES_LAYER_A;
@@ -657,7 +671,7 @@
// Kick off our RELEASE app
String appStartTime = getTime();
- getDevice().executeAdbCommand("shell", "am", "start", "-n", RELEASE_APP + "/" + ACTIVITY);
+ launchBackgroundService(RELEASE_APP, API_GLES);
// Ensure we don't load the layer in base dir
String searchStringA = GLES_LAYER_A + " loaded";
@@ -686,7 +700,7 @@
// Kick off our DEBUG app
String appStartTime = getTime();
- getDevice().executeAdbCommand("shell", "am", "start", "-n", DEBUG_APP + "/" + ACTIVITY);
+ launchBackgroundService(DEBUG_APP, API_GLES);
// Ensure we don't load the layer in base dir
String searchStringA = GLES_LAYER_A + " loaded";
@@ -715,7 +729,7 @@
// Kick off our DEBUG app
String appStartTime = getTime();
- getDevice().executeAdbCommand("shell", "am", "start", "-n", DEBUG_APP + "/" + ACTIVITY);
+ launchBackgroundService(DEBUG_APP, API_GLES);
// Ensure we don't load the layer in base dir
String searchStringA = GLES_LAYER_A + " loaded";
@@ -744,7 +758,7 @@
// Kick off our DEBUG app
String appStartTime = getTime();
- getDevice().executeAdbCommand("shell", "am", "start", "-n", DEBUG_APP + "/" + ACTIVITY);
+ launchBackgroundService(DEBUG_APP, API_GLES);
// Ensure layerA is not loaded
String searchStringA = "glesLayer_eglChooseConfig called in " + GLES_LAYER_A;
@@ -768,7 +782,7 @@
// Kick off our RELEASE app
String appStartTime = getTime();
- getDevice().executeAdbCommand("shell", "am", "start", "-n", RELEASE_APP + "/" + ACTIVITY);
+ launchBackgroundService(RELEASE_APP, API_GLES);
// Check that both layers were loaded, in the correct order
String searchStringA = GLES_LAYER_A + "loaded";
@@ -808,7 +822,7 @@
// Kick off our DEBUG app
String appStartTime = getTime();
- getDevice().executeAdbCommand("shell", "am", "start", "-n", DEBUG_APP + "/" + ACTIVITY);
+ launchBackgroundService(DEBUG_APP, API_GLES);
// Ensure only layerA is loaded
String searchStringA = "glesLayer_eglChooseConfig called in " + GLES_LAYER_A;
@@ -829,9 +843,9 @@
// Specify the external app that hosts layers
applySetting("gpu_debug_layer_app", GLES_LAYERS_APP);
- // Kick off our DEBUG app
+ // Kick off our app
String appStartTime = getTime();
- getDevice().executeAdbCommand("shell", "am", "start", "-n", APP_NAME + "/" + ACTIVITY);
+ launchBackgroundService(APP_NAME, API_GLES);
// Check that our external layer was loaded
String searchStringC = "glesLayer_eglChooseConfig called in " + GLES_LAYER_C;
@@ -872,7 +886,7 @@
// Kick off our DEBUG app
String appStartTime = getTime();
- getDevice().executeAdbCommand("shell", "am", "start", "-n", DEBUG_APP + "/" + ACTIVITY);
+ launchBackgroundService(DEBUG_APP, API_BOTH);
// Check that external layers were loaded from both apps
assertVkLayerLoading(appStartTime, VK_LAYER_C, true);
diff --git a/hostsidetests/hdmicec/app/AndroidManifest.xml b/hostsidetests/hdmicec/app/AndroidManifest.xml
index 06e994d..2ea9a81 100644
--- a/hostsidetests/hdmicec/app/AndroidManifest.xml
+++ b/hostsidetests/hdmicec/app/AndroidManifest.xml
@@ -20,6 +20,7 @@
<uses-feature android:name="android.software.leanback"
android:required="false"/>
<uses-permission android:name="android.permission.HDMI_CEC" />
+ <uses-permission android:name="android.permission.WAKE_LOCK" />
<application>
<activity android:name=".HdmiCecKeyEventCapture"
android:exported="true">
@@ -28,6 +29,15 @@
<category android:name="android.intent.category.LEANBACK_LAUNCHER"/>
</intent-filter>
</activity>
+ <activity android:name=".HdmiCecWakeLock"
+ android:launchMode="singleTop"
+ android:exported="true" >
+ <intent-filter>
+ <action android:name="android.hdmicec.app.ACQUIRE_LOCK" />
+ <action android:name="android.hdmicec.app.RELEASE_LOCK" />
+ <category android:name="android.intent.category.LEANBACK_LAUNCHER"/>
+ </intent-filter>
+ </activity>
<activity android:name=".HdmiCecAudioManager"
android:exported="true">
<intent-filter>
diff --git a/hostsidetests/hdmicec/app/src/android/hdmicec/app/HdmiCecWakeLock.java b/hostsidetests/hdmicec/app/src/android/hdmicec/app/HdmiCecWakeLock.java
new file mode 100644
index 0000000..e1c0c13
--- /dev/null
+++ b/hostsidetests/hdmicec/app/src/android/hdmicec/app/HdmiCecWakeLock.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.hdmicec.app;
+
+import static android.os.PowerManager.PARTIAL_WAKE_LOCK;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.PowerManager;
+import android.os.PowerManager.WakeLock;
+import android.util.Log;
+
+/**
+ * A simple activity that can be used to acquire and release the wake lock for controlling power
+ * management. The actions supported are:
+ *
+ * <p>
+ *
+ * <p>1. android.hdmicec.app.ACQUIRE_LOCK: Acquires the wake lock.
+ *
+ * <p>Usage: <code>START_COMMAND -a android.hdmicec.app.ACQUIRE_LOCK</code>
+ *
+ * <p>2. android.hdmicec.app.RELEASE_LOCK: Releases the wake lock.
+ *
+ * <p>Usage: <code>START_COMMAND -a android.hdmicec.app.RELEASE_LOCK</code>
+ *
+ * <p>
+ *
+ * <p>where START_COMMAND is
+ *
+ * <p><code>
+ * adb shell am start -n "android.hdmicec.app/android.hdmicec.app.HdmiCecWakeLock -a "
+ * </code>
+ */
+public class HdmiCecWakeLock extends Activity {
+ private static final String TAG = HdmiCecWakeLock.class.getSimpleName();
+ private WakeLock mWakeLock;
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ handleIntent(getIntent().getAction());
+ }
+
+ // Overriding this method since we expect intents to be sent to this activity.
+ @Override
+ public void onNewIntent(Intent intent) {
+ super.onNewIntent(intent);
+ handleIntent(intent.getAction());
+ }
+
+ private void handleIntent(String action) {
+ if (mWakeLock == null && !initializeWakeLock()) {
+ return;
+ }
+ switch (action) {
+ case "android.hdmicec.app.ACQUIRE_LOCK":
+ acquireWakeLock();
+ break;
+ case "android.hdmicec.app.RELEASE_LOCK":
+ releaseWakeLock();
+ // Finish the activity after releasing the lock.
+ finish();
+ break;
+ default:
+ Log.i(TAG, "Unknown intent!");
+ }
+ }
+
+ private boolean initializeWakeLock() {
+ PowerManager powerManager = getSystemService(PowerManager.class);
+ if (powerManager == null) {
+ Log.i(TAG, "Failed to get PowerManager");
+ return false;
+ }
+ // Creates a new wake lock.
+ mWakeLock = powerManager.newWakeLock(PARTIAL_WAKE_LOCK, TAG);
+ mWakeLock.setReferenceCounted(false);
+ Log.i(TAG, "wake lock object is : " + mWakeLock.toString());
+ return true;
+ }
+
+ private void acquireWakeLock() {
+ if (!mWakeLock.isHeld()) {
+ mWakeLock.acquire();
+ Log.i(TAG, "Acquired wake lock.");
+ } else {
+ Log.i(TAG, "Wake lock is already acquired.");
+ }
+ }
+
+ private void releaseWakeLock() {
+ if (mWakeLock.isHeld()) {
+ mWakeLock.release();
+ Log.i(TAG, "Released wake lock.");
+ } else {
+ Log.i(TAG, "No active wake locks to release.");
+ }
+ }
+}
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/BaseHdmiCecCtsTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/BaseHdmiCecCtsTest.java
index 0ca9569..fcb0164 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/BaseHdmiCecCtsTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/BaseHdmiCecCtsTest.java
@@ -16,6 +16,8 @@
package android.hdmicec.cts;
+import static com.google.common.truth.Truth.assertThat;
+
import static org.junit.Assume.assumeTrue;
import android.hdmicec.cts.HdmiCecConstants.CecDeviceType;
@@ -362,4 +364,66 @@
return getDevice().executeShellCommand(
"dumpsys hdmi_control | sed -n '/mDeviceInfos/,/mCecController/{//!p;}'");
}
+
+ public void checkDeviceAsleep() throws Exception {
+ ITestDevice device = getDevice();
+ TimeUnit.SECONDS.sleep(HdmiCecConstants.DEVICE_WAIT_TIME_SECONDS);
+ String wakeState = device.executeShellCommand("dumpsys power | grep mWakefulness=");
+ assertThat(wakeState.trim()).isEqualTo("mWakefulness=Asleep");
+ }
+
+ public void sendDeviceToSleepAndValidate() throws Exception {
+ sendDeviceToSleep();
+ checkDeviceAsleep();
+ }
+
+ private void waitForTransitionTo(int finalState) throws Exception {
+ int powerStatus;
+ int waitTimeSeconds = 0;
+ LogicalAddress cecClientDevice = hdmiCecClient.getSelfDevice();
+ int transitionState;
+ if (finalState == HdmiCecConstants.CEC_POWER_STATUS_STANDBY) {
+ transitionState = HdmiCecConstants.CEC_POWER_STATUS_IN_TRANSITION_TO_STANDBY;
+ } else if (finalState == HdmiCecConstants.CEC_POWER_STATUS_ON) {
+ transitionState = HdmiCecConstants.CEC_POWER_STATUS_IN_TRANSITION_TO_ON;
+ } else {
+ throw new Exception("Unsupported final power state!");
+ }
+ do {
+ TimeUnit.SECONDS.sleep(HdmiCecConstants.SLEEP_TIMESTEP_SECONDS);
+ waitTimeSeconds += HdmiCecConstants.SLEEP_TIMESTEP_SECONDS;
+ hdmiCecClient.sendCecMessage(cecClientDevice, CecOperand.GIVE_POWER_STATUS);
+ powerStatus =
+ CecMessage.getParams(
+ hdmiCecClient.checkExpectedOutput(
+ cecClientDevice, CecOperand.REPORT_POWER_STATUS));
+ if (powerStatus == finalState) {
+ return;
+ }
+ } while (powerStatus == transitionState
+ && waitTimeSeconds <= HdmiCecConstants.MAX_SLEEP_TIME_SECONDS);
+ if (powerStatus != finalState) {
+ // Transition not complete even after wait, throw an Exception.
+ throw new Exception("Power status did not change to expected state.");
+ }
+ }
+
+ public void sendDeviceToSleep() throws Exception {
+ ITestDevice device = getDevice();
+ WakeLockHelper.acquirePartialWakeLock(device);
+ device.executeShellCommand("input keyevent KEYCODE_SLEEP");
+ waitForTransitionTo(HdmiCecConstants.CEC_POWER_STATUS_STANDBY);
+ }
+
+ public void wakeUpDevice() throws Exception {
+ ITestDevice device = getDevice();
+ device.executeShellCommand("input keyevent KEYCODE_WAKEUP");
+ waitForTransitionTo(HdmiCecConstants.CEC_POWER_STATUS_ON);
+ WakeLockHelper.releasePartialWakeLock(device);
+ }
+
+ public void checkStandbyAndWakeUp() throws Exception {
+ checkDeviceAsleep();
+ wakeUpDevice();
+ }
}
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/CecOperand.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/CecOperand.java
index c08bb2d..75b1abf 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/CecOperand.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/CecOperand.java
@@ -20,6 +20,7 @@
import java.util.Map;
public enum CecOperand {
+ POLL(-1),
FEATURE_ABORT(0x00),
IMAGE_VIEW_ON(0x04),
TEXT_VIEW_ON(0x0d),
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/HdmiCecClientWrapper.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/HdmiCecClientWrapper.java
index bb59adc..9a1cc98 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/HdmiCecClientWrapper.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/HdmiCecClientWrapper.java
@@ -57,6 +57,11 @@
private StringBuilder sendVendorCommand = new StringBuilder("cmd hdmi_control vendorcommand ");
private int physicalAddress = 0xFFFF;
+ private CecOperand featureAbortOperand = CecOperand.FEATURE_ABORT;
+ private List<Integer> featureAbortReasons =
+ new ArrayList<>(HdmiCecConstants.ABORT_INVALID_OPERAND);
+ private boolean isFeatureAbortExpected = false;
+
private static final String CEC_PORT_BUSY = "unable to open the device on port";
public HdmiCecClientWrapper(String ...clientParams) {
@@ -536,6 +541,26 @@
}
/**
+ * The next checkExpectedOutput calls will also permit a feature abort as an alternate to the
+ * expected operand. The feature abort will be permissible if it has
+ *
+ * @param abortForOperand The operand for which the feature abort could be an allowed response
+ * @param reasons List of allowed reasons that the feature abort message could have
+ */
+ private void setExpectFeatureAbortFor(CecOperand abortOperand, Integer... abortReasons) {
+ isFeatureAbortExpected = true;
+ featureAbortOperand = abortOperand;
+ featureAbortReasons = Arrays.asList(abortReasons);
+ }
+
+ /** Removes feature abort as a permissible alternate response for {@link checkExpectedOutput} */
+ private void unsetExpectFeatureAbort() {
+ isFeatureAbortExpected = false;
+ CecOperand featureAbortOperand = CecOperand.FEATURE_ABORT;
+ List<Integer> featureAbortReasons = new ArrayList<>(HdmiCecConstants.ABORT_INVALID_OPERAND);
+ }
+
+ /**
* Looks for the CEC expectedMessage broadcast on the cec-client communication channel and
* returns the first line that contains that message within default timeout. If the CEC message
* is not found within the timeout, an CecClientWrapperException is thrown.
@@ -581,6 +606,27 @@
}
/**
+ * Looks for the CEC expectedMessage or a {@code <Feature Abort>} for {@code
+ * featureAbortOperand} with one of the abort reasons in {@code abortReason} is sent from
+ * cec-client device fromDevice to the DUT on the cec-client communication channel and returns
+ * the first line that contains that message within default timeout. If the CEC message is not
+ * found within the timeout, a CecClientWrapperException is thrown.
+ */
+ public String checkExpectedOutputOrFeatureAbort(
+ LogicalAddress fromDevice,
+ CecOperand expectedMessage,
+ CecOperand featureAbortOperand,
+ Integer... featureAbortReasons)
+ throws CecClientWrapperException {
+ setExpectFeatureAbortFor(featureAbortOperand, featureAbortReasons);
+ String message =
+ checkExpectedOutput(
+ targetDevice, fromDevice, expectedMessage, DEFAULT_TIMEOUT, false);
+ unsetExpectFeatureAbort();
+ return message;
+ }
+
+ /**
* Looks for the CEC expectedMessage broadcast on the cec-client communication channel and
* returns the first line that contains that message within timeoutMillis. If the CEC message is
* not found within the timeout, an CecClientWrapperException is thrown.
@@ -620,25 +666,54 @@
long startTime = System.currentTimeMillis();
long endTime = startTime;
String direction = fromCecClient ? "<<" : ">>";
- Pattern pattern =
- Pattern.compile(
- "(.*"
- + direction
- + ")(.*?)"
- + "("
- + fromDevice
- + toDevice
- + "):"
- + "("
- + expectedMessage
- + ")(.*)",
- Pattern.CASE_INSENSITIVE);
-
+ Pattern pattern;
+ if (expectedMessage == CecOperand.POLL) {
+ pattern =
+ Pattern.compile(
+ "(.*"
+ + direction
+ + ")(.*?)"
+ + "("
+ + fromDevice
+ + toDevice
+ + ")(.*)",
+ Pattern.CASE_INSENSITIVE);
+ } else {
+ String expectedOperands = expectedMessage.toString();
+ if (isFeatureAbortExpected) {
+ expectedOperands += "|" + CecOperand.FEATURE_ABORT;
+ }
+ pattern =
+ Pattern.compile(
+ "(.*"
+ + direction
+ + ")(.*?)"
+ + "("
+ + fromDevice
+ + toDevice
+ + "):"
+ + "("
+ + expectedOperands
+ + ")(.*)",
+ Pattern.CASE_INSENSITIVE);
+ }
while ((endTime - startTime <= timeoutMillis)) {
try {
if (mInputConsole.ready()) {
String line = mInputConsole.readLine();
if (pattern.matcher(line).matches()) {
+ if (isFeatureAbortExpected
+ && CecMessage.getOperand(line) == CecOperand.FEATURE_ABORT) {
+ CecOperand featureAbortedFor =
+ CecOperand.getOperand(CecMessage.getParams(line, 0, 2));
+ int reason = CecMessage.getParams(line, 2, 4);
+ if (featureAbortedFor == featureAbortOperand
+ && featureAbortReasons.contains(reason)) {
+ return line;
+ } else {
+ continue;
+ }
+ }
CLog.v("Found " + expectedMessage.name() + " in " + line);
return line;
}
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/HdmiCecConstants.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/HdmiCecConstants.java
index 44af562..2f1298d 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/HdmiCecConstants.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/HdmiCecConstants.java
@@ -31,8 +31,9 @@
// Standard delay to allow the DUT to react to a CEC message or ADB command
public static final int DEVICE_WAIT_TIME_SECONDS = 5;
+ public static final int DEVICE_WAIT_TIME_MS = 5000;
public static final int MAX_SLEEP_TIME_SECONDS = 8;
-
+ public static final int SLEEP_TIMESTEP_SECONDS = 1;
public static final int DEFAULT_PHYSICAL_ADDRESS = 0x1000;
public static final int TV_PHYSICAL_ADDRESS = 0x0000;
public static final int PHYSICAL_ADDRESS_LENGTH = 4; /* Num nibbles in CEC message */
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/LogHelper.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/LogHelper.java
index 7b2c857..646ce07 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/LogHelper.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/LogHelper.java
@@ -66,6 +66,17 @@
assertThat(testString).isIn(expectedOutputs);
}
+ /** Skip the test if the expectedOutput was not found in the device logs. */
+ public static void assumeLog(ITestDevice device, String tag, String expectedOutput)
+ throws Exception {
+ String testString = getLog(device, tag);
+ assumeTrue(
+ "Skip the test since "
+ + expectedOutput
+ + " message is not found in the device logs.",
+ testString.contains(expectedOutput));
+ }
+
/** This method will return the DUT volume. */
public static int parseDutVolume(ITestDevice device, String tag) throws Exception {
String testString = getLog(device, tag);
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/WakeLockHelper.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/WakeLockHelper.java
new file mode 100644
index 0000000..b3d4432
--- /dev/null
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/WakeLockHelper.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.hdmicec.cts;
+
+import com.android.tradefed.device.ITestDevice;
+
+/**
+ * Helper class to help standby test acquire and release wakelock to avoid device going into deep
+ * sleep.
+ */
+public final class WakeLockHelper {
+ private static final String TAG = "HdmiCecWakeLock";
+ private static final String ACQUIRE_LOCK = "android.hdmicec.app.ACQUIRE_LOCK";
+ private static final String RELEASE_LOCK = "android.hdmicec.app.RELEASE_LOCK";
+
+ /** The package name of the APK. */
+ private static final String PACKAGE = "android.hdmicec.app";
+
+ /** The class name of the wake lock activity in the APK. */
+ private static final String CLASS = "HdmiCecWakeLock";
+
+ /** The command to launch the wake lock activity. */
+ private static final String START_COMMAND =
+ String.format("am start -n %s/%s.%s -a ", PACKAGE, PACKAGE, CLASS);
+
+ /** The command to clear the wake lock activity. */
+ private static final String CLEAR_COMMAND = String.format("pm clear %s", PACKAGE);
+
+ public static void acquirePartialWakeLock(ITestDevice device) throws Exception {
+ // Clear activity if any.
+ device.executeShellCommand(CLEAR_COMMAND);
+ // Start the APK to acquire the wake lock and wait for it to complete.
+ device.executeShellCommand(START_COMMAND + ACQUIRE_LOCK);
+ LogHelper.assumeLog(device, TAG, "Acquired wake lock.");
+ }
+
+ public static void releasePartialWakeLock(ITestDevice device) throws Exception {
+ // Release the acquired wake lock.
+ device.executeShellCommand(START_COMMAND + RELEASE_LOCK);
+ // Clear activity
+ device.executeShellCommand(CLEAR_COMMAND);
+ }
+}
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/audio/HdmiCecAudioReturnChannelControlTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/audio/HdmiCecAudioReturnChannelControlTest.java
index f652d0c..72a2cf0 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/audio/HdmiCecAudioReturnChannelControlTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/audio/HdmiCecAudioReturnChannelControlTest.java
@@ -93,11 +93,11 @@
CecOperand.REPORT_PHYSICAL_ADDRESS,
CecMessage.formatParams(HdmiCecConstants.TV_PHYSICAL_ADDRESS,
HdmiCecConstants.PHYSICAL_ADDRESS_LENGTH));
- getDevice().executeShellCommand("input keyevent KEYCODE_SLEEP");
+ sendDeviceToSleep();
try {
hdmiCecClient.checkExpectedOutput(LogicalAddress.TV, CecOperand.TERMINATE_ARC);
} finally {
- getDevice().executeShellCommand("input keyevent KEYCODE_WAKEUP");
+ wakeUpDevice();
}
}
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/audio/HdmiCecSystemAudioModeTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/audio/HdmiCecSystemAudioModeTest.java
index 94b3e4a..0b217b8 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/audio/HdmiCecSystemAudioModeTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/audio/HdmiCecSystemAudioModeTest.java
@@ -210,15 +210,15 @@
@Test
public void cect_11_2_15_6_SystemAudioModeOffBeforeStandby() throws Exception {
try {
- getDevice().executeShellCommand("input keyevent KEYCODE_WAKEUP");
+ wakeUpDevice();
sendSystemAudioModeInitiation();
String message = hdmiCecClient.checkExpectedOutput(CecOperand.SET_SYSTEM_AUDIO_MODE);
assertThat(CecMessage.getParams(message)).isEqualTo(ON);
- getDevice().executeShellCommand("input keyevent KEYCODE_SLEEP");
+ sendDeviceToSleep();
message = hdmiCecClient.checkExpectedOutput(CecOperand.SET_SYSTEM_AUDIO_MODE);
assertThat(CecMessage.getParams(message)).isEqualTo(OFF);
} finally {
- getDevice().executeShellCommand("input keyevent KEYCODE_WAKEUP");
+ wakeUpDevice();
}
}
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecPollingTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecPollingTest.java
index 720242a..8bc0f24 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecPollingTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecPollingTest.java
@@ -61,12 +61,15 @@
setCec20();
ITestDevice device = getDevice();
- device.executeShellCommand("input keyevent KEYCODE_SLEEP");
-
- String expectedOutput = "POLL message sent";
- hdmiCecClient.sendPoll();
- if (!hdmiCecClient.checkConsoleOutput(expectedOutput)) {
- throw new Exception("Could not find " + expectedOutput);
+ try {
+ sendDeviceToSleep();
+ String expectedOutput = "POLL message sent";
+ hdmiCecClient.sendPoll();
+ if (!hdmiCecClient.checkConsoleOutput(expectedOutput)) {
+ throw new Exception("Could not find " + expectedOutput);
+ }
+ } finally {
+ wakeUpDevice();
}
}
}
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecPowerStatusTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecPowerStatusTest.java
index b6585a9..966173a 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecPowerStatusTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecPowerStatusTest.java
@@ -24,6 +24,7 @@
import android.hdmicec.cts.CecOperand;
import android.hdmicec.cts.HdmiCecConstants;
import android.hdmicec.cts.LogicalAddress;
+import android.hdmicec.cts.WakeLockHelper;
import com.android.tradefed.device.ITestDevice;
import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
@@ -68,12 +69,10 @@
setCec20();
// Move device to standby
- device.executeShellCommand("input keyevent KEYCODE_SLEEP");
- TimeUnit.SECONDS.sleep(HdmiCecConstants.DEVICE_WAIT_TIME_SECONDS);
+ sendDeviceToSleep();
// Turn device on
- device.executeShellCommand("input keyevent KEYCODE_WAKEUP");
- TimeUnit.SECONDS.sleep(HdmiCecConstants.DEVICE_WAIT_TIME_SECONDS);
+ wakeUpDevice();
String reportPowerStatus = hdmiCecClient.checkExpectedOutput(LogicalAddress.BROADCAST,
CecOperand.REPORT_POWER_STATUS);
@@ -99,25 +98,29 @@
ITestDevice device = getDevice();
setCec20();
- // Turn device on
- device.executeShellCommand("input keyevent KEYCODE_WAKEUP");
- TimeUnit.SECONDS.sleep(HdmiCecConstants.DEVICE_WAIT_TIME_SECONDS);
+ try {
+ // Turn device on
+ wakeUpDevice();
- // Move device to standby
- device.executeShellCommand("input keyevent KEYCODE_SLEEP");
- TimeUnit.SECONDS.sleep(HdmiCecConstants.DEVICE_WAIT_TIME_SECONDS);
+ // Move device to standby
+ sendDeviceToSleep();
- String reportPowerStatus = hdmiCecClient.checkExpectedOutput(LogicalAddress.BROADCAST,
- CecOperand.REPORT_POWER_STATUS);
+ String reportPowerStatus =
+ hdmiCecClient.checkExpectedOutput(
+ LogicalAddress.BROADCAST, CecOperand.REPORT_POWER_STATUS);
- if (CecMessage.getParams(reportPowerStatus) == HdmiCecConstants.CEC_POWER_STATUS_ON) {
- // Received the "wake up" broadcast, check for the next broadcast message
- reportPowerStatus = hdmiCecClient.checkExpectedOutput(LogicalAddress.BROADCAST,
- CecOperand.REPORT_POWER_STATUS);
+ if (CecMessage.getParams(reportPowerStatus) == HdmiCecConstants.CEC_POWER_STATUS_ON) {
+ // Received the "wake up" broadcast, check for the next broadcast message
+ reportPowerStatus =
+ hdmiCecClient.checkExpectedOutput(
+ LogicalAddress.BROADCAST, CecOperand.REPORT_POWER_STATUS);
+ }
+
+ assertThat(CecMessage.getParams(reportPowerStatus))
+ .isEqualTo(HdmiCecConstants.CEC_POWER_STATUS_STANDBY);
+ } finally {
+ wakeUpDevice();
}
-
- assertThat(CecMessage.getParams(reportPowerStatus)).isEqualTo(
- HdmiCecConstants.CEC_POWER_STATUS_STANDBY);
}
/**
@@ -131,8 +134,7 @@
ITestDevice device = getDevice();
/* Make sure the device is not booting up/in standby */
device.waitForBootComplete(HdmiCecConstants.REBOOT_TIMEOUT);
- device.executeShellCommand("input keyevent KEYCODE_WAKEUP");
- TimeUnit.SECONDS.sleep(HdmiCecConstants.DEVICE_WAIT_TIME_SECONDS);
+ wakeUpDevice();
LogicalAddress cecClientDevice = hdmiCecClient.getSelfDevice();
hdmiCecClient.sendCecMessage(cecClientDevice, CecOperand.GIVE_POWER_STATUS);
@@ -154,8 +156,7 @@
/* Make sure the device is not booting up/in standby */
device.waitForBootComplete(HdmiCecConstants.REBOOT_TIMEOUT);
/* The sleep below could send some devices into a deep suspend state. */
- device.executeShellCommand("input keyevent KEYCODE_SLEEP");
- TimeUnit.SECONDS.sleep(HdmiCecConstants.DEVICE_WAIT_TIME_SECONDS);
+ sendDeviceToSleep();
int waitTimeSeconds = HdmiCecConstants.DEVICE_WAIT_TIME_SECONDS;
int powerStatus;
LogicalAddress cecClientDevice = hdmiCecClient.getSelfDevice();
@@ -172,7 +173,7 @@
assertThat(powerStatus).isEqualTo(OFF);
} finally {
/* Wake up the device */
- device.executeShellCommand("input keyevent KEYCODE_WAKEUP");
+ wakeUpDevice();
}
}
@@ -195,8 +196,7 @@
for (Integer operand : powerControlOperands) {
try {
- device.executeShellCommand("input keyevent KEYCODE_SLEEP");
- TimeUnit.SECONDS.sleep(HdmiCecConstants.MAX_SLEEP_TIME_SECONDS);
+ sendDeviceToSleep();
String wakeStateBefore = device.executeShellCommand(
"dumpsys power | grep mWakefulness=");
assertThat(wakeStateBefore.trim()).isEqualTo("mWakefulness=Asleep");
@@ -209,7 +209,7 @@
assertWithMessage("Device should wake up on <User Control Pressed> %s", operand)
.that(wakeStateAfter.trim()).isEqualTo("mWakefulness=Awake");
} finally {
- device.executeShellCommand("input keyevent KEYCODE_WAKEUP");
+ wakeUpDevice();
}
}
}
@@ -233,12 +233,12 @@
for (Integer operand : powerControlOperands) {
try {
- device.executeShellCommand("input keyevent KEYCODE_WAKEUP");
- TimeUnit.SECONDS.sleep(HdmiCecConstants.DEVICE_WAIT_TIME_SECONDS);
+ wakeUpDevice();
String wakeStateBefore = device.executeShellCommand(
"dumpsys power | grep mWakefulness=");
assertThat(wakeStateBefore.trim()).isEqualTo("mWakefulness=Awake");
+ WakeLockHelper.acquirePartialWakeLock(device);
hdmiCecClient.sendUserControlPressAndRelease(source, operand, false);
TimeUnit.SECONDS.sleep(HdmiCecConstants.DEVICE_WAIT_TIME_SECONDS);
@@ -248,7 +248,7 @@
operand)
.that(wakeStateAfter.trim()).isEqualTo("mWakefulness=Asleep");
} finally {
- device.executeShellCommand("input keyevent KEYCODE_WAKEUP");
+ wakeUpDevice();
}
}
}
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecSystemAudioControlTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecSystemAudioControlTest.java
index afe1c10..5a7cda1 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecSystemAudioControlTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecSystemAudioControlTest.java
@@ -17,6 +17,7 @@
package android.hdmicec.cts.common;
import static com.google.common.truth.Truth.assertThat;
+
import static org.junit.Assume.assumeFalse;
import android.hdmicec.cts.AudioManagerHelper;
@@ -29,13 +30,13 @@
import com.android.tradefed.device.ITestDevice;
import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
-import java.util.concurrent.TimeUnit;
-
import org.junit.Before;
import org.junit.Rule;
+import org.junit.Test;
import org.junit.rules.RuleChain;
import org.junit.runner.RunWith;
-import org.junit.Test;
+
+import java.util.concurrent.TimeUnit;
/** HDMI CEC test to verify system audio control commands (Section 11.1.15, 11.2.15) */
@RunWith(DeviceJUnit4ClassRunner.class)
@@ -154,8 +155,8 @@
ITestDevice device = getDevice();
/* Home Key to prevent device from going to deep suspend state */
device.executeShellCommand("input keyevent KEYCODE_HOME");
- device.executeShellCommand("input keyevent KEYCODE_SLEEP");
- device.executeShellCommand("input keyevent KEYCODE_WAKEUP");
+ sendDeviceToSleep();
+ wakeUpDevice();
hdmiCecClient.checkExpectedOutput(
hdmiCecClient.getSelfDevice(), CecOperand.GIVE_SYSTEM_AUDIO_MODE_STATUS);
}
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecSystemInformationTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecSystemInformationTest.java
index d0db224..15eca65 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecSystemInformationTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecSystemInformationTest.java
@@ -26,6 +26,7 @@
import android.hdmicec.cts.HdmiCecConstants;
import android.hdmicec.cts.LogicalAddress;
+import com.android.tradefed.device.ITestDevice;
import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
import org.junit.Rule;
@@ -171,4 +172,30 @@
CecOperand.REPORT_FEATURES);
assertThat(CecMessage.getParams(reportFeatures, 2)).isEqualTo(cecVersion);
}
+
+ /**
+ * Tests that the device sends a {@code <CEC Version>} in response to a {@code <Get CEC
+ * Version>} in standby
+ */
+ @Test
+ public void cectGiveCecVersionInStandby() throws Exception {
+ ITestDevice device = getDevice();
+ try {
+ sendDeviceToSleepAndValidate();
+ hdmiCecClient.sendCecMessage(hdmiCecClient.getSelfDevice(), CecOperand.GET_CEC_VERSION);
+ String message =
+ hdmiCecClient.checkExpectedOutputOrFeatureAbort(
+ hdmiCecClient.getSelfDevice(),
+ CecOperand.CEC_VERSION,
+ CecOperand.GET_CEC_VERSION,
+ HdmiCecConstants.ABORT_NOT_IN_CORRECT_MODE);
+ assertThat(CecMessage.getParams(message))
+ .isIn(
+ Arrays.asList(
+ HdmiCecConstants.CEC_VERSION_2_0,
+ HdmiCecConstants.CEC_VERSION_1_4));
+ } finally {
+ wakeUpDevice();
+ }
+ }
}
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecSystemStandbyTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecSystemStandbyTest.java
index ccad335..19eff6c 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecSystemStandbyTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecSystemStandbyTest.java
@@ -16,12 +16,11 @@
package android.hdmicec.cts.common;
-import static com.google.common.truth.Truth.assertThat;
-
import android.hdmicec.cts.BaseHdmiCecCtsTest;
import android.hdmicec.cts.CecOperand;
import android.hdmicec.cts.HdmiCecConstants;
import android.hdmicec.cts.LogicalAddress;
+import android.hdmicec.cts.WakeLockHelper;
import com.android.tradefed.device.ITestDevice;
import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
@@ -29,44 +28,46 @@
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
+import org.junit.Test;
import org.junit.rules.RuleChain;
import org.junit.runner.RunWith;
-import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
-/**
- * HDMI CEC test to verify the device handles standby correctly (Section 11.1.3, 11.2.3)
- */
+/** HDMI CEC test to verify the device handles standby correctly (Section 11.1.3, 11.2.3) */
@RunWith(DeviceJUnit4ClassRunner.class)
public final class HdmiCecSystemStandbyTest extends BaseHdmiCecCtsTest {
private static final String HDMI_CONTROL_DEVICE_AUTO_OFF =
"hdmi_control_auto_device_off_enabled";
+ private static final String POWER_CONTROL_MODE = "send_standby_on_sleep";
+ private static final String POWER_CONTROL_MODE_NONE = "none";
public List<LogicalAddress> mLogicalAddresses = new ArrayList<>();
- public boolean wasOn;
+ public boolean previousDeviceAutoOff;
+ public String previousPowerControlMode;
@Rule
public RuleChain ruleChain =
- RuleChain
- .outerRule(CecRules.requiresCec(this))
+ RuleChain.outerRule(CecRules.requiresCec(this))
.around(CecRules.requiresLeanback(this))
.around(hdmiCecClient);
@Before
public void initialTestSetup() throws Exception {
defineLogicalAddressList();
- wasOn = setHdmiControlDeviceAutoOff(false);
+ previousDeviceAutoOff = setHdmiControlDeviceAutoOff(false);
+ previousPowerControlMode = setPowerControlMode(POWER_CONTROL_MODE_NONE);
}
@After
public void resetDutState() throws Exception {
/* Wake up the device */
- getDevice().executeShellCommand("input keyevent KEYCODE_WAKEUP");
- setHdmiControlDeviceAutoOff(wasOn);
+ wakeUpDevice();
+ setHdmiControlDeviceAutoOff(previousDeviceAutoOff);
+ setPowerControlMode(previousPowerControlMode);
}
/**
@@ -75,13 +76,15 @@
*/
@Test
public void cect_HandleBroadcastStandby() throws Exception {
- getDevice().reboot();
+ ITestDevice device = getDevice();
+ device.reboot();
TimeUnit.SECONDS.sleep(5);
for (LogicalAddress source : mLogicalAddresses) {
if (!hasLogicalAddress(source)) {
+ WakeLockHelper.acquirePartialWakeLock(device);
hdmiCecClient.sendCecMessage(source, LogicalAddress.BROADCAST, CecOperand.STANDBY);
- checkDeviceAsleepAfterStandbySent();
- }
+ checkStandbyAndWakeUp();
+ }
}
}
@@ -91,12 +94,14 @@
*/
@Test
public void cect_HandleAddressedStandby() throws Exception {
- getDevice().reboot();
+ ITestDevice device = getDevice();
+ device.reboot();
for (LogicalAddress source : mLogicalAddresses) {
if (!hasLogicalAddress(source)) {
+ WakeLockHelper.acquirePartialWakeLock(device);
hdmiCecClient.sendCecMessage(source, CecOperand.STANDBY);
- checkDeviceAsleepAfterStandbySent();
- }
+ checkStandbyAndWakeUp();
+ }
}
}
@@ -110,10 +115,13 @@
* CEC CTS does not specify for TV a no broadcast on standby test. On Android TVs, there is
* a feature to turn off this standby broadcast and this test tests the same.
*/
- ITestDevice device = getDevice();
- device.executeShellCommand("input keyevent KEYCODE_SLEEP");
- hdmiCecClient.checkOutputDoesNotContainMessage(LogicalAddress.BROADCAST,
- CecOperand.STANDBY);
+ sendDeviceToSleep();
+ try {
+ hdmiCecClient.checkOutputDoesNotContainMessage(
+ LogicalAddress.BROADCAST, CecOperand.STANDBY);
+ } finally {
+ wakeUpDevice();
+ }
}
private void defineLogicalAddressList() throws Exception {
@@ -125,7 +133,7 @@
mLogicalAddresses.add(LogicalAddress.AUDIO_SYSTEM);
if (hasDeviceType(HdmiCecConstants.CEC_DEVICE_TYPE_TV)) {
- //Add logical addresses 13, 14 only for TV panel tests.
+ // Add logical addresses 13, 14 only for TV panel tests.
mLogicalAddresses.add(LogicalAddress.RESERVED_2);
mLogicalAddresses.add(LogicalAddress.SPECIFIC_USE);
}
@@ -142,12 +150,9 @@
return val.equals("1");
}
- private void checkDeviceAsleepAfterStandbySent() throws Exception {
- ITestDevice device = getDevice();
- TimeUnit.SECONDS.sleep(5);
- String wakeState = device.executeShellCommand("dumpsys power | grep mWakefulness=");
- assertThat(wakeState.trim()).isEqualTo("mWakefulness=Asleep");
- device.executeShellCommand("input keyevent KEYCODE_WAKEUP");
- TimeUnit.SECONDS.sleep(5);
+ private String setPowerControlMode(String valToSet) throws Exception {
+ String val = getSettingsValue(POWER_CONTROL_MODE);
+ setSettingsValue(POWER_CONTROL_MODE, valToSet);
+ return val;
}
}
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecVendorCommandsTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecVendorCommandsTest.java
index 596f34c..d2e00fd 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecVendorCommandsTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecVendorCommandsTest.java
@@ -65,6 +65,20 @@
}
/**
+ * Tests that the device responds to a {@code <GIVE_DEVICE_VENDOR_ID>} when in standby.
+ */
+ @Test
+ public void cectGiveDeviceVendorIdDuringStandby() throws Exception {
+ ITestDevice device = getDevice();
+ try {
+ sendDeviceToSleepAndValidate();
+ cect_11_2_9_1_GiveDeviceVendorId();
+ } finally {
+ wakeUpDevice();
+ }
+ }
+
+ /**
* Test 11.2.9-2
* <p>Tests that the device broadcasts a {@code <DEVICE_VENDOR_ID>} message after successful
* initialisation and address allocation.
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecDeviceOsdNameTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecDeviceOsdNameTest.java
index 754a752..afe78d4 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecDeviceOsdNameTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecDeviceOsdNameTest.java
@@ -21,12 +21,10 @@
import android.hdmicec.cts.BaseHdmiCecCtsTest;
import android.hdmicec.cts.CecMessage;
import android.hdmicec.cts.CecOperand;
-import android.hdmicec.cts.HdmiCecClientWrapper;
import android.hdmicec.cts.HdmiCecConstants;
import android.hdmicec.cts.LogicalAddress;
-import android.hdmicec.cts.RequiredPropertyRule;
-import android.hdmicec.cts.RequiredFeatureRule;
+import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.device.ITestDevice;
import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
@@ -52,13 +50,7 @@
this, HdmiCecConstants.CEC_DEVICE_TYPE_PLAYBACK_DEVICE))
.around(hdmiCecClient);
- /**
- * Test 11.2.11-1a
- * Tests that the device responds to a <GIVE_OSD_NAME> with a <SET_OSD_NAME> that has the
- * correct device name in the parameters.
- */
- @Test
- public void cect_11_2_11_1a_GiveOsdNameTest() throws Exception {
+ private String getDeviceName() throws DeviceNotAvailableException {
/* The params for <SET_OSD_NAME> only allow for 14 characters */
final int nameLength = 14;
ITestDevice device = getDevice();
@@ -66,12 +58,49 @@
if (deviceName.length() > nameLength) {
deviceName = deviceName.substring(0, nameLength).trim();
}
+ return deviceName;
+ }
+
+ /**
+ * Test 11.2.11-1a
+ *
+ * <p>Tests that the device responds to a {@code <GIVE_OSD_NAME>} with a {@code <SET_OSD_NAME>}
+ * that has the correct device name in the parameters.
+ */
+ @Test
+ public void cect_11_2_11_1a_GiveOsdNameTest() throws Exception {
+ String deviceName = getDeviceName();
hdmiCecClient.sendCecMessage(LogicalAddress.TV, CecOperand.GIVE_OSD_NAME);
String message = hdmiCecClient.checkExpectedOutput(LogicalAddress.TV, CecOperand.SET_OSD_NAME);
assertThat(CecMessage.getAsciiString(message)).isEqualTo(deviceName);
}
/**
+ * Tests that the device responds to a {@code <GIVE_OSD_NAME>} with a {@code <SET_OSD_NAME>}
+ * that has the correct device name in the parameters in standby mode.
+ */
+ @Test
+ public void cectGiveOsdNameTestInStandby() throws Exception {
+ ITestDevice device = getDevice();
+ try {
+ sendDeviceToSleepAndValidate();
+ String deviceName = getDeviceName();
+ hdmiCecClient.sendCecMessage(LogicalAddress.TV, CecOperand.GIVE_OSD_NAME);
+ String message =
+ hdmiCecClient.checkExpectedOutputOrFeatureAbort(
+ LogicalAddress.TV,
+ CecOperand.SET_OSD_NAME,
+ CecOperand.GIVE_OSD_NAME,
+ HdmiCecConstants.ABORT_NOT_IN_CORRECT_MODE);
+ if (CecMessage.getOperand(message) != CecOperand.FEATURE_ABORT) {
+ assertThat(CecMessage.getAsciiString(message)).isEqualTo(deviceName);
+ }
+ } finally {
+ wakeUpDevice();
+ }
+ }
+
+ /**
* Test 11.2.11-1b
* Test updates the device_name in global properties and checks that the device responds to a
* <GIVE_OSD_NAME> with a <SET_OSD_NAME> that has the updated device name in the parameters.
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecPowerStatusTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecPowerStatusTest.java
index 38344436..0d0b6cf 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecPowerStatusTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecPowerStatusTest.java
@@ -68,7 +68,7 @@
ITestDevice device = getDevice();
try {
- device.executeShellCommand("input keyevent KEYCODE_SLEEP");
+ sendDeviceToSleep();
TimeUnit.SECONDS.sleep(HdmiCecConstants.MAX_SLEEP_TIME_SECONDS);
@@ -89,7 +89,7 @@
assertWithMessage("Device should wake up on <Set Stream Path>")
.that(wakeStateAfter.trim()).isEqualTo("mWakefulness=Awake");
} finally {
- device.executeShellCommand("input keyevent KEYCODE_WAKEUP");
+ wakeUpDevice();
}
}
}
\ No newline at end of file
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecRoutingControlTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecRoutingControlTest.java
index e81bbb4..75d73ea 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecRoutingControlTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecRoutingControlTest.java
@@ -152,13 +152,13 @@
CecOperand.SET_STREAM_PATH,
CecMessage.formatParams(dumpsysPhysicalAddress));
TimeUnit.SECONDS.sleep(5);
- device.executeShellCommand("input keyevent KEYCODE_SLEEP");
+ sendDeviceToSleep();
String message = hdmiCecClient.checkExpectedOutput(LogicalAddress.TV,
CecOperand.INACTIVE_SOURCE);
CecMessage.assertPhysicalAddressValid(message, dumpsysPhysicalAddress);
} finally {
/* Wake up the device */
- device.executeShellCommand("input keyevent KEYCODE_WAKEUP");
+ wakeUpDevice();
setPowerControlMode(previousPowerControlMode);
}
}
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecTvPowerToggleTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecTvPowerToggleTest.java
index d66cd07..141cb63 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecTvPowerToggleTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecTvPowerToggleTest.java
@@ -21,11 +21,9 @@
import android.hdmicec.cts.BaseHdmiCecCtsTest;
import android.hdmicec.cts.CecMessage;
import android.hdmicec.cts.CecOperand;
-import android.hdmicec.cts.HdmiCecClientWrapper;
import android.hdmicec.cts.HdmiCecConstants;
import android.hdmicec.cts.LogicalAddress;
-import android.hdmicec.cts.RequiredPropertyRule;
-import android.hdmicec.cts.RequiredFeatureRule;
+import android.hdmicec.cts.WakeLockHelper;
import com.android.tradefed.device.ITestDevice;
import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
@@ -35,7 +33,6 @@
import org.junit.runner.RunWith;
import org.junit.Test;
-import static android.hdmicec.cts.HdmiCecConstants.TIMEOUT_SAFETY_MS;
import java.util.concurrent.TimeUnit;
@@ -95,6 +92,7 @@
CecOperand.ACTIVE_SOURCE, CecMessage.formatParams("0000"));
TimeUnit.SECONDS.sleep(HdmiCecConstants.DEVICE_WAIT_TIME_SECONDS);
hdmiCecClient.clearClientOutput();
+ WakeLockHelper.acquirePartialWakeLock(device);
device.executeShellCommand("input keyevent KEYCODE_TV_POWER");
hdmiCecClient.checkExpectedOutput(LogicalAddress.TV, CecOperand.GIVE_POWER_STATUS);
hdmiCecClient.sendCecMessage(LogicalAddress.TV, PLAYBACK_DEVICE,
@@ -105,6 +103,7 @@
assertThat(wakeState.trim()).isEqualTo("mWakefulness=Asleep");
} finally {
setPowerControlMode(previousPowerControlMode);
+ wakeUpDevice();
}
}
@@ -128,6 +127,7 @@
device.executeShellCommand("input keyevent KEYCODE_HOME");
TimeUnit.SECONDS.sleep(HdmiCecConstants.DEVICE_WAIT_TIME_SECONDS);
hdmiCecClient.clearClientOutput();
+ WakeLockHelper.acquirePartialWakeLock(device);
device.executeShellCommand("input keyevent KEYCODE_TV_POWER");
hdmiCecClient.checkExpectedOutput(LogicalAddress.TV, CecOperand.GIVE_POWER_STATUS);
hdmiCecClient.sendCecMessage(LogicalAddress.TV, PLAYBACK_DEVICE,
@@ -138,6 +138,7 @@
assertThat(wakeState.trim()).isEqualTo("mWakefulness=Asleep");
} finally {
setPowerControlMode(previousPowerControlMode);
+ wakeUpDevice();
}
}
@@ -158,8 +159,7 @@
hdmiCecClient.sendCecMessage(LogicalAddress.TV, PLAYBACK_DEVICE,
CecOperand.REPORT_POWER_STATUS, CecMessage.formatParams(OFF));
TimeUnit.SECONDS.sleep(HdmiCecConstants.DEVICE_WAIT_TIME_SECONDS);
- device.executeShellCommand("input keyevent KEYCODE_SLEEP");
- TimeUnit.SECONDS.sleep(HdmiCecConstants.DEVICE_WAIT_TIME_SECONDS);
+ sendDeviceToSleep();
hdmiCecClient.clearClientOutput();
device.executeShellCommand("input keyevent KEYCODE_TV_POWER");
hdmiCecClient.checkExpectedOutput(LogicalAddress.TV, CecOperand.GIVE_POWER_STATUS);
@@ -171,6 +171,7 @@
assertThat(wakeState.trim()).isEqualTo("mWakefulness=Asleep");
} finally {
setPowerControlMode(previousPowerControlMode);
+ wakeUpDevice();
}
}
@@ -191,8 +192,7 @@
hdmiCecClient.sendCecMessage(LogicalAddress.TV, PLAYBACK_DEVICE,
CecOperand.REPORT_POWER_STATUS, CecMessage.formatParams(OFF));
TimeUnit.SECONDS.sleep(HdmiCecConstants.DEVICE_WAIT_TIME_SECONDS);
- device.executeShellCommand("input keyevent KEYCODE_SLEEP");
- TimeUnit.SECONDS.sleep(HdmiCecConstants.DEVICE_WAIT_TIME_SECONDS);
+ sendDeviceToSleep();
hdmiCecClient.clearClientOutput();
device.executeShellCommand("input keyevent KEYCODE_TV_POWER");
hdmiCecClient.checkExpectedOutput(LogicalAddress.TV, CecOperand.GIVE_POWER_STATUS);
@@ -205,6 +205,7 @@
assertThat(wakeState.trim()).isEqualTo("mWakefulness=Awake");
} finally {
setPowerControlMode(previousPowerControlMode);
+ wakeUpDevice();
}
}
-}
\ No newline at end of file
+}
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/tv/HdmiCecTvOneTouchPlayTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/tv/HdmiCecTvOneTouchPlayTest.java
index 5329f19..13c0381 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/tv/HdmiCecTvOneTouchPlayTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/tv/HdmiCecTvOneTouchPlayTest.java
@@ -145,15 +145,14 @@
public void cect_11_1_1_3_ImageViewOnWhenInStandby() throws Exception {
try {
getDevice().reboot();
- getDevice().executeShellCommand("input keyevent KEYCODE_SLEEP");
+ sendDeviceToSleep();
assertDevicePowerStatus(HdmiCecConstants.CEC_POWER_STATUS_STANDBY);
/* Get the first device the client has started as */
LogicalAddress testDevice = testDevices.get(0);
hdmiCecClient.sendCecMessage(testDevice, LogicalAddress.TV, CecOperand.IMAGE_VIEW_ON);
assertDevicePowerStatus(HdmiCecConstants.CEC_POWER_STATUS_ON);
} finally {
- getDevice().executeShellCommand("input keyevent KEYCODE_WAKEUP");
- TimeUnit.SECONDS.sleep(MAX_POWER_TRANSITION_WAIT_TIME);
+ wakeUpDevice();
}
}
@@ -167,15 +166,14 @@
public void cect_11_1_1_4_TextViewOnWhenInStandby() throws Exception {
try {
getDevice().reboot();
- getDevice().executeShellCommand("input keyevent KEYCODE_SLEEP");
+ sendDeviceToSleep();
assertDevicePowerStatus(HdmiCecConstants.CEC_POWER_STATUS_STANDBY);
/* Get the first device the client has started as */
LogicalAddress testDevice = testDevices.get(0);
hdmiCecClient.sendCecMessage(testDevice, LogicalAddress.TV, CecOperand.TEXT_VIEW_ON);
assertDevicePowerStatus(HdmiCecConstants.CEC_POWER_STATUS_ON);
} finally {
- getDevice().executeShellCommand("input keyevent KEYCODE_WAKEUP");
- TimeUnit.SECONDS.sleep(MAX_POWER_TRANSITION_WAIT_TIME);
+ wakeUpDevice();
}
}
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/tv/HdmiCecTvStandbyTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/tv/HdmiCecTvStandbyTest.java
index 7a861a1..4efab29 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/tv/HdmiCecTvStandbyTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/tv/HdmiCecTvStandbyTest.java
@@ -62,14 +62,14 @@
device.waitForBootComplete(HdmiCecConstants.REBOOT_TIMEOUT);
boolean wasOn = setHdmiControlDeviceAutoOff(true);
try {
- device.executeShellCommand("input keyevent KEYCODE_SLEEP");
+ sendDeviceToSleep();
hdmiCecClient.checkExpectedOutput(LogicalAddress.BROADCAST, CecOperand.STANDBY);
String wakeState = device.executeShellCommand("dumpsys power | grep mWakefulness=");
assertWithMessage("Device is not in standby.")
.that(wakeState.trim())
.isEqualTo("mWakefulness=Asleep");
} finally {
- device.executeShellCommand("input keyevent KEYCODE_WAKEUP");
+ wakeUpDevice();
setHdmiControlDeviceAutoOff(wasOn);
}
}
diff --git a/hostsidetests/incrementalinstall/Android.mk b/hostsidetests/incrementalinstall/Android.mk
deleted file mode 100644
index eb303a2..0000000
--- a/hostsidetests/incrementalinstall/Android.mk
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright (C) 2021 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-include $(call all-subdir-makefiles)
-
diff --git a/hostsidetests/multidevice/AndroidTest.xml b/hostsidetests/multidevice/AndroidTest.xml
index 758a5eb..e77c72e 100644
--- a/hostsidetests/multidevice/AndroidTest.xml
+++ b/hostsidetests/multidevice/AndroidTest.xml
@@ -16,6 +16,20 @@
<option name="config-descriptor:metadata" key="parameter" value="not_instant_app" />
<option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
<option name="config-descriptor:metadata" key="parameter" value="not_secondary_user" />
+
+ <device name="device1">
+ <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
+ <option name="run-command" value="input keyevent KEYCODE_WAKEUP" />
+ <option name="run-command" value="wm dismiss-keyguard" />
+ </target_preparer>
+ </device>
+ <device name="device2">
+ <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
+ <option name="run-command" value="input keyevent KEYCODE_WAKEUP" />
+ <option name="run-command" value="wm dismiss-keyguard" />
+ </target_preparer>
+ </device>
+
<test class="com.android.compatibility.common.tradefed.testtype.JarHostTest" >
<option name="class" value="android.sample.cts.SampleMultiDeviceTest" />
</test>
diff --git a/hostsidetests/multidevice/src/android/sample/cts/SampleMultiDeviceTest.java b/hostsidetests/multidevice/src/android/sample/cts/SampleMultiDeviceTest.java
index 80d3e073..f15bdb4 100644
--- a/hostsidetests/multidevice/src/android/sample/cts/SampleMultiDeviceTest.java
+++ b/hostsidetests/multidevice/src/android/sample/cts/SampleMultiDeviceTest.java
@@ -23,6 +23,8 @@
import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
+import com.google.common.truth.Truth;
+
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -32,8 +34,13 @@
@RunWith(DeviceJUnit4ClassRunner.class)
public class SampleMultiDeviceTest extends BaseHostJUnit4Test {
+ /**
+ * Sample tests that showcase that we are receiving the multiple devices in the test side.
+ */
@Test
public void testMultiDeviceTest() throws Exception {
+ // Validate we are actually multi-devices
+ Truth.assertThat(getListDevices().size()).isGreaterThan(1);
for (ITestDevice device : getListDevices()) {
CLog.i("device '%s' is available.", device.getSerialNumber());
String buildId = device.getProperty("ro.vendor.build.id");
diff --git a/hostsidetests/multiuser/src/android/host/multiuser/BaseMultiUserTest.java b/hostsidetests/multiuser/src/android/host/multiuser/BaseMultiUserTest.java
index a94ceea..7df340d 100644
--- a/hostsidetests/multiuser/src/android/host/multiuser/BaseMultiUserTest.java
+++ b/hostsidetests/multiuser/src/android/host/multiuser/BaseMultiUserTest.java
@@ -136,6 +136,10 @@
return -1;
}
+ protected void assumeGuestDoesNotExist() throws Exception {
+ assumeTrue("Device already has a guest user", getGuestUser() == -1);
+ }
+
protected void assumeIsAutomotive() throws Exception {
assumeTrue("Device does not have " + FEATURE_AUTOMOTIVE,
getDevice().hasFeature(FEATURE_AUTOMOTIVE));
diff --git a/hostsidetests/multiuser/src/android/host/multiuser/CreateUsersPermissionTest.java b/hostsidetests/multiuser/src/android/host/multiuser/CreateUsersPermissionTest.java
index 4f19d81..bd3ed1b 100644
--- a/hostsidetests/multiuser/src/android/host/multiuser/CreateUsersPermissionTest.java
+++ b/hostsidetests/multiuser/src/android/host/multiuser/CreateUsersPermissionTest.java
@@ -34,6 +34,10 @@
@Test
public void testCanCreateGuestUser() throws Exception {
+ // The device may already have a guest present if it is configured with
+ // config_guestUserAutoCreated. If so, skip the test.
+ assumeGuestDoesNotExist();
+
createGuestUser();
}
diff --git a/hostsidetests/packagemanager/extractnativelibs/apps/app_extract/src/com/android/cts/extractnativelibs/app/extract/ExtractNativeLibsTrueDeviceTest.java b/hostsidetests/packagemanager/extractnativelibs/apps/app_extract/src/com/android/cts/extractnativelibs/app/extract/ExtractNativeLibsTrueDeviceTest.java
index 4755b10..7930580 100644
--- a/hostsidetests/packagemanager/extractnativelibs/apps/app_extract/src/com/android/cts/extractnativelibs/app/extract/ExtractNativeLibsTrueDeviceTest.java
+++ b/hostsidetests/packagemanager/extractnativelibs/apps/app_extract/src/com/android/cts/extractnativelibs/app/extract/ExtractNativeLibsTrueDeviceTest.java
@@ -47,7 +47,9 @@
File nativeLibDir = new File(mContext.getApplicationInfo().nativeLibraryDir);
Assert.assertTrue(nativeLibDir.exists());
Assert.assertTrue(nativeLibDir.isDirectory());
- Assert.assertTrue(nativeLibDir.getAbsolutePath().endsWith(expectedSubDir));
+ Assert.assertTrue("Native lib dir: " + nativeLibDir.getAbsolutePath()
+ + " does not end with: " + expectedSubDir,
+ nativeLibDir.getAbsolutePath().endsWith(expectedSubDir));
Assert.assertEquals(1, nativeLibDir.list().length);
}
diff --git a/hostsidetests/packagemanager/extractnativelibs/src/android/extractnativelibs/cts/CtsExtractNativeLibsHostTestAbiOverride.java b/hostsidetests/packagemanager/extractnativelibs/src/android/extractnativelibs/cts/CtsExtractNativeLibsHostTestAbiOverride.java
index f36ab6b..a67c83d 100644
--- a/hostsidetests/packagemanager/extractnativelibs/src/android/extractnativelibs/cts/CtsExtractNativeLibsHostTestAbiOverride.java
+++ b/hostsidetests/packagemanager/extractnativelibs/src/android/extractnativelibs/cts/CtsExtractNativeLibsHostTestAbiOverride.java
@@ -58,12 +58,17 @@
@Override
public void setUp() throws Exception {
+ // Skip the test if the requested test ABI is 32 bit (that defeats the purpose of this test)
+ assumeTrue(AbiUtils.getBitness(getAbi().getName()).equals("64"));
final String deviceAbi = getDeviceAbi();
final Set<String> deviceAbis = getDeviceAbis();
+ final Set<String> apkAbis = getApkAbis();
// Only run these tests for supported ABIs
assumeTrue(deviceAbis.contains(mFirstAbi));
+ assumeTrue(apkAbis.contains(mFirstAbi));
if (!mSecondAbi.equals("-")) {
assumeTrue(deviceAbis.contains(mSecondAbi));
+ assumeTrue(apkAbis.contains(mSecondAbi));
}
assumeTrue(AbiUtils.getBaseArchForAbi(deviceAbi).equals(
AbiUtils.getBaseArchForAbi(mFirstAbi)));
diff --git a/hostsidetests/packagemanager/extractnativelibs/src/android/extractnativelibs/cts/CtsExtractNativeLibsHostTestBase.java b/hostsidetests/packagemanager/extractnativelibs/src/android/extractnativelibs/cts/CtsExtractNativeLibsHostTestBase.java
index 00afa9a..e1dcea4 100644
--- a/hostsidetests/packagemanager/extractnativelibs/src/android/extractnativelibs/cts/CtsExtractNativeLibsHostTestBase.java
+++ b/hostsidetests/packagemanager/extractnativelibs/src/android/extractnativelibs/cts/CtsExtractNativeLibsHostTestBase.java
@@ -35,6 +35,7 @@
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
+import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
@@ -176,17 +177,17 @@
* @return an ABI string from AbiUtils.ABI_*
* @return an ABI string from AbiUtils.ABI_*
*/
- final String getExpectedLibAbi(String abiSuffix) throws Exception {
- final String deviceAbi = getDeviceAbi();
- final String deviceBitness = AbiUtils.getBitness(deviceAbi);
+ final String getExpectedLibAbi(String abiSuffix) {
+ final String testAbi = getAbi().getName();
+ final String testBitness = AbiUtils.getBitness(testAbi);
final String libBitness;
- // Use 32-bit native libs if device only supports 32-bit or APK only has 32-libs native libs
- if (abiSuffix.equals("32") || deviceBitness.equals("32")) {
+ // Use 32-bit native libs if test only supports 32-bit or APK only has 32-libs native libs
+ if (abiSuffix.equals("32") || testBitness.equals("32")) {
libBitness = "32";
} else {
libBitness = "64";
}
- final Set<String> libAbis = AbiUtils.getAbisForArch(AbiUtils.getBaseArchForAbi(deviceAbi));
+ final Set<String> libAbis = AbiUtils.getAbisForArch(AbiUtils.getBaseArchForAbi(testAbi));
for (String libAbi : libAbis) {
if (AbiUtils.getBitness(libAbi).equals(libBitness)) {
return libAbi;
@@ -195,22 +196,26 @@
return null;
}
+ /**
+ * Get ABIs supported by the test APKs. For example, if the test ABI is "armeabi-v7a", the test
+ * APKs should include native libs for "armeabi-v7a" and/or "arm64-v8a".
+ */
+ final Set<String> getApkAbis() throws Exception {
+ String testApkBaseArch = AbiUtils.getArchForAbi(getAbi().getName());
+ return AbiUtils.getAbisForArch(testApkBaseArch);
+ }
+
final String getDeviceAbi() throws Exception {
return getDevice().getProperty("ro.product.cpu.abi");
}
+ /**
+ * Device ABIs might includes native bridge ABIs that are different from base arch (e.g.,
+ * emulators with NDK translations).
+ */
final Set<String> getDeviceAbis() throws Exception {
- String[] abiArray = getDevice().getProperty("ro.product.cpu.abilist").split(",");
- // Ignore native bridge ABIs if they are of different base arch
- String deviceBaseArch = AbiUtils.getArchForAbi(getDeviceAbi());
- Set<String> deviceBaseArchSupportedAbis = AbiUtils.getAbisForArch(deviceBaseArch);
- HashSet<String> deviceSupportedAbis = new HashSet<>();
- for (String abi : abiArray) {
- if (deviceBaseArchSupportedAbis.contains(abi)) {
- deviceSupportedAbis.add(abi);
- }
- }
- return deviceSupportedAbis;
+ String[] deviceAbis = getDevice().getProperty("ro.product.cpu.abilist").split(",");
+ return new HashSet<>(Arrays.asList(deviceAbis));
}
final Set<String> getDeviceAbiSuffixes() throws Exception {
diff --git a/hostsidetests/packagemanager/extractnativelibs/src/android/extractnativelibs/cts/CtsExtractNativeLibsHostTestInstalls.java b/hostsidetests/packagemanager/extractnativelibs/src/android/extractnativelibs/cts/CtsExtractNativeLibsHostTestInstalls.java
index ca82dec..d5ca4f7 100644
--- a/hostsidetests/packagemanager/extractnativelibs/src/android/extractnativelibs/cts/CtsExtractNativeLibsHostTestInstalls.java
+++ b/hostsidetests/packagemanager/extractnativelibs/src/android/extractnativelibs/cts/CtsExtractNativeLibsHostTestInstalls.java
@@ -23,6 +23,8 @@
import android.cts.host.utils.DeviceJUnit4Parameterized;
import android.platform.test.annotations.AppModeFull;
+import com.android.tradefed.util.AbiUtils;
+
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -72,6 +74,11 @@
// Skip incremental installations for non-incremental devices
assumeTrue(isIncrementalInstallSupported());
}
+ // Skip 64 bit tests if the test requires 32 bit ABI
+ final boolean isTest32Bit = AbiUtils.getBitness(getAbi().getName()).equals("32");
+ if (isTest32Bit) {
+ assumeTrue(mAbiSuffix.equals("32"));
+ }
if (!mAbiSuffix.equals("Both")) {
// Skip tests for unsupported abi suffixes.
assumeTrue(getDeviceAbiSuffixes().contains(mAbiSuffix));
diff --git a/hostsidetests/packagemanager/extractnativelibs/src/android/extractnativelibs/cts/CtsExtractNativeLibsHostTestUpdates.java b/hostsidetests/packagemanager/extractnativelibs/src/android/extractnativelibs/cts/CtsExtractNativeLibsHostTestUpdates.java
index 9ad35f1..0450f54 100644
--- a/hostsidetests/packagemanager/extractnativelibs/src/android/extractnativelibs/cts/CtsExtractNativeLibsHostTestUpdates.java
+++ b/hostsidetests/packagemanager/extractnativelibs/src/android/extractnativelibs/cts/CtsExtractNativeLibsHostTestUpdates.java
@@ -23,6 +23,8 @@
import android.cts.host.utils.DeviceJUnit4Parameterized;
import android.platform.test.annotations.AppModeFull;
+import com.android.tradefed.util.AbiUtils;
+
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -77,6 +79,8 @@
@Override
public void setUp() throws Exception {
+ // Skip the test if the requested test ABI is 32 bit (that defeats the purpose of this test)
+ assumeTrue(AbiUtils.getBitness(getAbi().getName()).equals("64"));
if (mIsIncremental) {
// Skip incremental installations for non-incremental devices
assumeTrue(isIncrementalInstallSupported());
diff --git a/hostsidetests/security/src/android/security/cts/KernelConfigTest.java b/hostsidetests/security/src/android/security/cts/KernelConfigTest.java
index 90289ba..1a9ce61 100644
--- a/hostsidetests/security/src/android/security/cts/KernelConfigTest.java
+++ b/hostsidetests/security/src/android/security/cts/KernelConfigTest.java
@@ -409,7 +409,9 @@
private void assumeSecurityModelCompat() throws Exception {
// This feature name check only applies to devices that first shipped with
// SC or later.
- if (PropertyUtil.getFirstApiLevel(mDevice) >= 31) {
+ final int firstApiLevel = Math.min(PropertyUtil.getFirstApiLevel(mDevice),
+ PropertyUtil.getVendorApiLevel(mDevice));
+ if (firstApiLevel >= 31) {
assumeTrue("Skipping test: FEATURE_SECURITY_MODEL_COMPATIBLE missing.",
getDevice().hasFeature("feature:android.hardware.security.model.compatible"));
}
diff --git a/hostsidetests/security/src/android/security/cts/MetadataEncryptionTest.java b/hostsidetests/security/src/android/security/cts/MetadataEncryptionTest.java
index d9da47a..1351be9 100644
--- a/hostsidetests/security/src/android/security/cts/MetadataEncryptionTest.java
+++ b/hostsidetests/security/src/android/security/cts/MetadataEncryptionTest.java
@@ -70,7 +70,9 @@
private void assumeSecurityModelCompat() throws Exception {
// This feature name check only applies to devices that first shipped with
// SC or later.
- if (PropertyUtil.getFirstApiLevel(mDevice) >= 31) {
+ final int firstApiLevel = Math.min(PropertyUtil.getFirstApiLevel(mDevice),
+ PropertyUtil.getVendorApiLevel(mDevice));
+ if (firstApiLevel >= 31) {
assumeTrue("Skipping test: FEATURE_SECURITY_MODEL_COMPATIBLE missing.",
getDevice().hasFeature("feature:android.hardware.security.model.compatible"));
}
diff --git a/hostsidetests/security/src/android/security/cts/PerfEventParanoidTest.java b/hostsidetests/security/src/android/security/cts/PerfEventParanoidTest.java
index 6122e09..35a9942 100644
--- a/hostsidetests/security/src/android/security/cts/PerfEventParanoidTest.java
+++ b/hostsidetests/security/src/android/security/cts/PerfEventParanoidTest.java
@@ -89,7 +89,9 @@
private void assumeSecurityModelCompat() throws DeviceNotAvailableException {
// This feature name check only applies to devices that first shipped with
// SC or later.
- if (PropertyUtil.getFirstApiLevel(mDevice) >= ANDROID_S_API_LEVEL) {
+ final int firstApiLevel = Math.min(PropertyUtil.getFirstApiLevel(mDevice),
+ PropertyUtil.getVendorApiLevel(mDevice));
+ if (firstApiLevel >= ANDROID_S_API_LEVEL) {
assumeTrue("Skipping test: FEATURE_SECURITY_MODEL_COMPATIBLE missing.",
getDevice().hasFeature("feature:android.hardware.security.model.compatible"));
}
diff --git a/hostsidetests/security/src/android/security/cts/SELinuxHostTest.java b/hostsidetests/security/src/android/security/cts/SELinuxHostTest.java
index f528f94..68f734d 100644
--- a/hostsidetests/security/src/android/security/cts/SELinuxHostTest.java
+++ b/hostsidetests/security/src/android/security/cts/SELinuxHostTest.java
@@ -189,7 +189,9 @@
private void assumeSecurityModelCompat() throws Exception {
// This feature name check only applies to devices that first shipped with
// SC or later.
- if (PropertyUtil.getFirstApiLevel(mDevice) >= 31) {
+ final int firstApiLevel = Math.min(PropertyUtil.getFirstApiLevel(mDevice),
+ PropertyUtil.getVendorApiLevel(mDevice));
+ if (firstApiLevel >= 31) {
assumeTrue("Skipping test: FEATURE_SECURITY_MODEL_COMPATIBLE missing.",
getDevice().hasFeature("feature:android.hardware.security.model.compatible"));
}
diff --git a/hostsidetests/statsdatom/apps/statsdapp/src/com/android/server/cts/device/statsdatom/AtomTests.java b/hostsidetests/statsdatom/apps/statsdapp/src/com/android/server/cts/device/statsdatom/AtomTests.java
index c7a39bb..ef24a7a 100644
--- a/hostsidetests/statsdatom/apps/statsdapp/src/com/android/server/cts/device/statsdatom/AtomTests.java
+++ b/hostsidetests/statsdatom/apps/statsdapp/src/com/android/server/cts/device/statsdatom/AtomTests.java
@@ -219,6 +219,8 @@
APP_OPS_ENUM_MAP.put(AppOpsManager.OPSTR_BLUETOOTH_ADVERTISE, 114);
APP_OPS_ENUM_MAP.put(AppOpsManager.OPSTR_RECORD_INCOMING_PHONE_AUDIO, 115);
APP_OPS_ENUM_MAP.put(AppOpsManager.OPSTR_NEARBY_WIFI_DEVICES, 116);
+ APP_OPS_ENUM_MAP.put(AppOpsManager.OPSTR_ESTABLISH_VPN_SERVICE, 117);
+ APP_OPS_ENUM_MAP.put(AppOpsManager.OPSTR_ESTABLISH_VPN_MANAGER, 118);
}
@Test
diff --git a/hostsidetests/statsdatom/src/android/cts/statsdatom/statsd/HostAtomTests.java b/hostsidetests/statsdatom/src/android/cts/statsdatom/statsd/HostAtomTests.java
index ad92513..0bb3873 100644
--- a/hostsidetests/statsdatom/src/android/cts/statsdatom/statsd/HostAtomTests.java
+++ b/hostsidetests/statsdatom/src/android/cts/statsdatom/statsd/HostAtomTests.java
@@ -75,6 +75,7 @@
private static final String FEATURE_AUTOMOTIVE = "android.hardware.type.automotive";
private static final String FEATURE_WATCH = "android.hardware.type.watch";
+ private static final String FEATURE_TWM = "com.google.clockwork.hardware.traditional_watch_mode";
private static final String FEATURE_WIFI = "android.hardware.wifi";
private static final String FEATURE_LEANBACK_ONLY = "android.software.leanback_only";
@@ -335,6 +336,7 @@
}
public void testBatterySaverModeStateChangedAtom() throws Exception {
+ if (DeviceUtils.hasFeature(getDevice(), FEATURE_TWM)) return;
if (DeviceUtils.hasFeature(getDevice(), FEATURE_AUTOMOTIVE)) return;
// Setup, turn off battery saver.
turnBatterySaverOff();
diff --git a/tests/admin/OWNERS b/tests/admin/OWNERS
index 58d02a3..4d977c5 100644
--- a/tests/admin/OWNERS
+++ b/tests/admin/OWNERS
@@ -1,9 +1,2 @@
# Bug component: 100560
-sandness@google.com
-rubinxu@google.com
-eranm@google.com
-kholoudm@google.com
-pgrafov@google.com
-alexkershaw@google.com
-arangelov@google.com
-scottjonathan@google.com
+file:platform/frameworks/base:/core/java/android/app/admin/EnterprisePlatform_OWNERS
\ No newline at end of file
diff --git a/tests/attestationverification/OWNERS b/tests/attestationverification/OWNERS
new file mode 100644
index 0000000..32a0456
--- /dev/null
+++ b/tests/attestationverification/OWNERS
@@ -0,0 +1,3 @@
+# Bug component: 1111194
+
+include platform/frameworks/base:/core/java/android/security/attestationverification/OWNERS
diff --git a/tests/autofillservice/src/android/autofillservice/cts/activities/MultiWindowLoginActivity.java b/tests/autofillservice/src/android/autofillservice/cts/activities/MultiWindowLoginActivity.java
index 53bd825..cceec68 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/activities/MultiWindowLoginActivity.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/activities/MultiWindowLoginActivity.java
@@ -16,6 +16,7 @@
package android.autofillservice.cts.activities;
import android.autofillservice.cts.testcore.Timeouts;
+import android.content.res.Configuration;
import com.android.compatibility.common.util.RetryableException;
@@ -48,6 +49,17 @@
}
}
+ @Override
+ public void onMultiWindowModeChanged(boolean isInMultiWindowMode, Configuration newConfig) {
+ super.onMultiWindowModeChanged(isInMultiWindowMode, newConfig);
+ if (sLastInstanceLatch != null) {
+ // mWindowingMode is split-screen-primary
+ if (isInMultiWindowMode) {
+ sLastInstanceLatch.countDown();
+ }
+ }
+ }
+
public static void expectNewInstance(boolean waitWindowFocus) {
sLastInstanceLatch = new CountDownLatch(waitWindowFocus ? 2 : 1);
}
diff --git a/tests/camera/src/android/hardware/camera2/cts/MultiViewTest.java b/tests/camera/src/android/hardware/camera2/cts/MultiViewTest.java
index 6428896..6123592 100644
--- a/tests/camera/src/android/hardware/camera2/cts/MultiViewTest.java
+++ b/tests/camera/src/android/hardware/camera2/cts/MultiViewTest.java
@@ -185,7 +185,7 @@
for (String cameraId : mCameraIdsUnderTest) {
Exception prior = null;
- ImageVerifierListener yuvListener;
+ ImageVerifierListener yuvListener = null;
ImageReader yuvReader = null;
try {
@@ -210,6 +210,9 @@
prior = e;
} finally {
try {
+ if (yuvListener != null) {
+ yuvListener.onReaderDestroyed();
+ }
if (yuvReader != null) {
yuvReader.close();
}
diff --git a/tests/camera/src/android/hardware/camera2/cts/RecordingTest.java b/tests/camera/src/android/hardware/camera2/cts/RecordingTest.java
index c7f0622..774477d 100644
--- a/tests/camera/src/android/hardware/camera2/cts/RecordingTest.java
+++ b/tests/camera/src/android/hardware/camera2/cts/RecordingTest.java
@@ -1367,14 +1367,15 @@
* Initialize the supported video sizes.
*/
private void initSupportedVideoSize(String cameraId) throws Exception {
+ int id = Integer.valueOf(cameraId);
Size maxVideoSize = SIZE_BOUND_720P;
- if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_2160P)) {
+ if (CamcorderProfile.hasProfile(id, CamcorderProfile.QUALITY_2160P)) {
maxVideoSize = SIZE_BOUND_2160P;
- } else if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_QHD)) {
+ } else if (CamcorderProfile.hasProfile(id, CamcorderProfile.QUALITY_QHD)) {
maxVideoSize = SIZE_BOUND_QHD;
- } else if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_2K)) {
+ } else if (CamcorderProfile.hasProfile(id, CamcorderProfile.QUALITY_2K)) {
maxVideoSize = SIZE_BOUND_2K;
- } else if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_1080P)) {
+ } else if (CamcorderProfile.hasProfile(id, CamcorderProfile.QUALITY_1080P)) {
maxVideoSize = SIZE_BOUND_1080P;
}
diff --git a/tests/camera/src/android/hardware/camera2/cts/RobustnessTest.java b/tests/camera/src/android/hardware/camera2/cts/RobustnessTest.java
index b125d25..492cc68 100644
--- a/tests/camera/src/android/hardware/camera2/cts/RobustnessTest.java
+++ b/tests/camera/src/android/hardware/camera2/cts/RobustnessTest.java
@@ -243,19 +243,24 @@
if (mStaticInfo.isLogicalMultiCamera()) {
Set<String> physicalCameraIds =
mStaticInfo.getCharacteristics().getPhysicalCameraIds();
+ boolean skipTest = false;
for (String physicalId : physicalCameraIds) {
if (Arrays.asList(mCameraIdsUnderTest).contains(physicalId)) {
// If physicalId is advertised in camera ID list, do not need to test
// its stream combination through logical camera.
- continue;
+ skipTest = true;
}
for (Pair<String, String> unavailPhysicalCam : unavailablePhysicalCameras) {
if (unavailPhysicalCam.first.equals(id) ||
unavailPhysicalCam.second.equals(physicalId)) {
// This particular physical camera isn't available. Skip.
- continue;
+ skipTest = true;
+ break;
}
}
+ if (skipTest) {
+ continue;
+ }
StaticMetadata physicalStaticInfo = mAllStaticInfo.get(physicalId);
MandatoryStreamCombination[] phyCombinations =
diff --git a/tests/camera/utils/src/android/hardware/camera2/cts/CameraTestUtils.java b/tests/camera/utils/src/android/hardware/camera2/cts/CameraTestUtils.java
index bec4a2d..b15282c 100644
--- a/tests/camera/utils/src/android/hardware/camera2/cts/CameraTestUtils.java
+++ b/tests/camera/utils/src/android/hardware/camera2/cts/CameraTestUtils.java
@@ -494,14 +494,22 @@
public static class ImageVerifierListener implements ImageReader.OnImageAvailableListener {
private Size mSize;
private int mFormat;
+ // Whether the parent ImageReader is valid or not. If the parent ImageReader
+ // is destroyed, the acquired Image may become invalid.
+ private boolean mReaderIsValid;
public ImageVerifierListener(Size sz, int format) {
mSize = sz;
mFormat = format;
+ mReaderIsValid = true;
+ }
+
+ public synchronized void onReaderDestroyed() {
+ mReaderIsValid = false;
}
@Override
- public void onImageAvailable(ImageReader reader) {
+ public synchronized void onImageAvailable(ImageReader reader) {
Image image = null;
try {
image = reader.acquireNextImage();
@@ -511,7 +519,11 @@
// could be closed asynchronously, which will close all images acquired from
// this ImageReader.
checkImage(image, mSize.getWidth(), mSize.getHeight(), mFormat);
- checkAndroidImageFormat(image);
+ // checkAndroidImageFormat calls into underlying Image object, which could
+ // become invalid if the ImageReader is destroyed.
+ if (mReaderIsValid) {
+ checkAndroidImageFormat(image);
+ }
image.close();
}
}
diff --git a/tests/devicepolicy/OWNERS b/tests/devicepolicy/OWNERS
index b37176e..cf88726 100644
--- a/tests/devicepolicy/OWNERS
+++ b/tests/devicepolicy/OWNERS
@@ -1,7 +1,2 @@
# Bug template url: https://b.corp.google.com/issues/new?component=100560&template=63204
-alexkershaw@google.com
-eranm@google.com
-rubinxu@google.com
-sandness@google.com
-pgrafov@google.com
-scottjonathan@google.com
+file:platform/frameworks/base:/core/java/android/app/admin/EnterprisePlatform_OWNERS
\ No newline at end of file
diff --git a/tests/framework/base/windowmanager/AndroidManifest.xml b/tests/framework/base/windowmanager/AndroidManifest.xml
index f0f40a6..4607110 100644
--- a/tests/framework/base/windowmanager/AndroidManifest.xml
+++ b/tests/framework/base/windowmanager/AndroidManifest.xml
@@ -357,6 +357,8 @@
<activity android:name="android.server.wm.WindowInsetsPolicyTest$ImmersiveFullscreenTestActivity"
android:documentLaunchMode="always"
android:theme="@style/no_animation"/>
+ <activity android:name="android.server.wm.WindowInsetsPolicyTest$NaturalOrientationTestActivity"
+ android:screenOrientation="nosensor"/>
<activity android:name="android.server.wm.LayoutTests$TestActivity"
android:theme="@style/no_animation"/>
<activity android:name="android.server.wm.LocationOnScreenTests$TestActivity"
@@ -382,7 +384,8 @@
<activity android:name="android.server.wm.WindowInsetsLayoutTests$TestActivity"/>
<activity android:name="android.server.wm.WindowInsetsControllerTests$TestActivity"
android:theme="@style/no_starting_window"/>
- <activity android:name="android.server.wm.WindowInsetsControllerTests$TestHideOnCreateActivity"/>
+ <activity android:name="android.server.wm.WindowInsetsControllerTests$TestHideOnCreateActivity"
+ android:windowSoftInputMode="adjustPan|stateUnchanged"/>
<activity android:name="android.server.wm.WindowInsetsControllerTests$TestShowOnCreateActivity"/>
<activity android:name="android.server.wm.DragDropTest$DragDropActivity"
diff --git a/tests/framework/base/windowmanager/backgroundactivity/src/android/server/wm/BackgroundActivityLaunchTest.java b/tests/framework/base/windowmanager/backgroundactivity/src/android/server/wm/BackgroundActivityLaunchTest.java
index d46e922..453c29b 100644
--- a/tests/framework/base/windowmanager/backgroundactivity/src/android/server/wm/BackgroundActivityLaunchTest.java
+++ b/tests/framework/base/windowmanager/backgroundactivity/src/android/server/wm/BackgroundActivityLaunchTest.java
@@ -49,10 +49,14 @@
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+import android.Manifest;
+import android.app.UiAutomation;
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.PackageManager;
+import android.content.pm.UserInfo;
import android.os.ResultReceiver;
+import android.os.UserManager;
import android.platform.test.annotations.Presubmit;
import android.platform.test.annotations.SystemUserOnly;
import android.server.wm.backgroundactivity.common.CommonComponents.Event;
@@ -60,6 +64,7 @@
import androidx.annotation.Nullable;
import androidx.test.filters.FlakyTest;
+import androidx.test.platform.app.InstrumentationRegistry;
import com.android.compatibility.common.util.AppOpsUtils;
@@ -480,6 +485,45 @@
assertTaskStack(null, APP_A_BACKGROUND_ACTIVITY);
}
+ /**
+ * Returns a list of alive users on the device
+ */
+ private List<UserInfo> getAliveUsers() {
+ // Setting the CREATE_USERS permission in AndroidManifest.xml has no effect when the test
+ // is run through the CTS harness, so instead adopt it as a shell permission. We use
+ // the CREATE_USERS permission instead of MANAGE_USERS because the shell can never use
+ // MANAGE_USERS.
+ UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
+ uiAutomation.adoptShellPermissionIdentity(Manifest.permission.CREATE_USERS);
+ List<UserInfo> userList = mContext.getSystemService(UserManager.class)
+ .getUsers(/* excludePartial= */ true,
+ /* excludeDying= */ true,
+ /* excludePreCreated= */ true);
+ uiAutomation.dropShellPermissionIdentity();
+ return userList;
+ }
+
+ /**
+ * Removes the guest user from the device if present
+ */
+ private void removeGuestUser() {
+ List<UserInfo> userList = getAliveUsers();
+ for (UserInfo info : userList) {
+ if (info.isGuest()) {
+ removeUser(info.id);
+ // Device is only allowed to have one alive guest user, so stop if it's found
+ break;
+ }
+ }
+ }
+
+ /**
+ * Removes a user from the device given their ID
+ */
+ private void removeUser(int userId) {
+ executeShellCommand(String.format("pm remove-user %d", userId));
+ }
+
@Test
@SystemUserOnly(reason = "Device owner must be SYSTEM user")
public void testDeviceOwner() throws Exception {
@@ -489,6 +533,15 @@
return;
}
+ // Remove existing guest user. The device may already have a guest present if it is
+ // configured with config_guestUserAutoCreated.
+ //
+ // In production flow the DO can only be created before device provisioning finishes
+ // (e.g. during SUW), and we make sure the guest user in only created after the device
+ // provision is finished. Ideally this test would use the provisioning flow and Device
+ // Owner (DO) creation in a similar manner as that of production flow.
+ removeGuestUser();
+
String cmdResult = runShellCommand("dpm set-device-owner --user 0 "
+ APP_A_SIMPLE_ADMIN_RECEIVER.flattenToString());
assertThat(cmdResult).contains("Success");
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/ActivityVisibilityTests.java b/tests/framework/base/windowmanager/src/android/server/wm/ActivityVisibilityTests.java
index ec4903b..aaeedc2 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/ActivityVisibilityTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/ActivityVisibilityTests.java
@@ -205,18 +205,14 @@
}
final ActivitySessionClient activityClient = createManagedActivityClientSession();
testTurnScreenOnActivity(lockScreenSession, activityClient,
- true /* useWindowFlags */, true /* showWhenLocked */);
+ true /* useWindowFlags */);
testTurnScreenOnActivity(lockScreenSession, activityClient,
- false /* useWindowFlags */, true /* showWhenLocked */);
+ false /* useWindowFlags */);
if (notSupportsInsecureLock) {
// In the platform without InsecureLock, we just test if the display is on with
// TurnScreenOnActivity.
mObjectTracker.close(lockScreenSession);
}
- testTurnScreenOnActivity(lockScreenSession, activityClient,
- true /* useWindowFlags */, false /* showWhenLocked */);
- testTurnScreenOnActivity(lockScreenSession, activityClient,
- false /* useWindowFlags */, false /* showWhenLocked */);
}
@Test
@@ -230,21 +226,20 @@
// timeout should still notify the client activity to be visible. Then the relayout can
// send the visible request to apply the flags and turn on screen.
testTurnScreenOnActivity(lockScreenSession, activityClient, true /* useWindowFlags */,
- true /* showWhenLocked */, 1000 /* sleepMsInOnCreate */);
+ 1000 /* sleepMsInOnCreate */);
}
private void testTurnScreenOnActivity(LockScreenSession lockScreenSession,
- ActivitySessionClient activitySessionClient, boolean useWindowFlags,
- boolean showWhenLocked) {
+ ActivitySessionClient activitySessionClient, boolean useWindowFlags) {
testTurnScreenOnActivity(lockScreenSession, activitySessionClient, useWindowFlags,
- showWhenLocked, 0 /* sleepMsInOnCreate */);
+ 0 /* sleepMsInOnCreate */);
}
private void testTurnScreenOnActivity(LockScreenSession lockScreenSession,
ActivitySessionClient activitySessionClient, boolean useWindowFlags,
- boolean showWhenLocked, int sleepMsInOnCreate) {
+ int sleepMsInOnCreate) {
ActivitySession activity = sleepDeviceAndLaunchTurnScreenOnActivity(lockScreenSession,
- activitySessionClient, useWindowFlags, showWhenLocked, sleepMsInOnCreate,
+ activitySessionClient, useWindowFlags, sleepMsInOnCreate,
WINDOWING_MODE_FULLSCREEN);
mWmState.assertVisibility(TURN_SCREEN_ON_ACTIVITY, true);
@@ -263,21 +258,16 @@
final ActivitySessionClient activityClient = createManagedActivityClientSession();
testFreeformWindowTurnScreenOnActivity(lockScreenSession, activityClient,
- true/* useWindowFlags */, true/* showWhenLocked */);
+ true/* useWindowFlags */);
testFreeformWindowTurnScreenOnActivity(lockScreenSession, activityClient,
- true/* useWindowFlags */, false/* showWhenLocked */);
- testFreeformWindowTurnScreenOnActivity(lockScreenSession, activityClient,
- false/* useWindowFlags */, true/* showWhenLocked */);
- testFreeformWindowTurnScreenOnActivity(lockScreenSession, activityClient,
- false/* useWindowFlags */, false/* showWhenLocked */);
+ false/* useWindowFlags */);
}
private void testFreeformWindowTurnScreenOnActivity(LockScreenSession lockScreenSession,
- ActivitySessionClient activityClient, boolean useWindowFlags,
- boolean showWhenLocked) {
+ ActivitySessionClient activityClient, boolean useWindowFlags) {
ActivitySession activity = sleepDeviceAndLaunchTurnScreenOnActivity(lockScreenSession,
- activityClient, useWindowFlags, showWhenLocked,
- 0 /* sleepMsInOnCreate */, WINDOWING_MODE_FREEFORM);
+ activityClient, useWindowFlags, 0 /* sleepMsInOnCreate */,
+ WINDOWING_MODE_FREEFORM);
mWmState.waitForValidState(
new WaitForValidActivityState.Builder(TURN_SCREEN_ON_ACTIVITY)
.setWindowingMode(WINDOWING_MODE_FULLSCREEN)
@@ -291,16 +281,13 @@
private ActivitySession sleepDeviceAndLaunchTurnScreenOnActivity(
LockScreenSession lockScreenSession, ActivitySessionClient activitySessionClient,
- boolean useWindowFlags, boolean showWhenLocked, int sleepMsInOnCreate,
- int windowingMode) {
+ boolean useWindowFlags, int sleepMsInOnCreate, int windowingMode) {
lockScreenSession.sleepDevice();
return activitySessionClient.startActivity(
getLaunchActivityBuilder().setUseInstrumentation().setIntentExtra(extra -> {
extra.putBoolean(Components.TurnScreenOnActivity.EXTRA_USE_WINDOW_FLAGS,
useWindowFlags);
- extra.putBoolean(Components.TurnScreenOnActivity.EXTRA_SHOW_WHEN_LOCKED,
- showWhenLocked);
extra.putLong(Components.TurnScreenOnActivity.EXTRA_SLEEP_MS_IN_ON_CREATE,
sleepMsInOnCreate);
}).setTargetActivity(TURN_SCREEN_ON_ACTIVITY).setWindowingMode(windowingMode));
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/CompatChangeTests.java b/tests/framework/base/windowmanager/src/android/server/wm/CompatChangeTests.java
index 2524090..4cd3719e 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/CompatChangeTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/CompatChangeTests.java
@@ -18,8 +18,6 @@
import static android.content.pm.ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO_LARGE_VALUE;
import static android.content.pm.ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO_MEDIUM_VALUE;
-import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
-import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
import static android.provider.DeviceConfig.NAMESPACE_CONSTRAIN_DISPLAY_APIS;
import static android.view.Display.DEFAULT_DISPLAY;
@@ -84,8 +82,6 @@
private static final ComponentName SUPPORTS_SIZE_CHANGES_PORTRAIT_ACTIVITY =
component(SupportsSizeChangesPortraitActivity.class);
- // Device aspect ratio (both portrait and landscape orientations) for min aspect ratio tests
- private static final float SIZE_COMPAT_DISPLAY_ASPECT_RATIO = 1.4f;
// Fixed orientation min aspect ratio
private static final float FIXED_ORIENTATION_MIN_ASPECT_RATIO = 1.03f;
// The min aspect ratio of NON_RESIZEABLE_ASPECT_RATIO_ACTIVITY (as defined in the manifest).
@@ -330,11 +326,7 @@
@Test
@EnableCompatChanges({ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO})
public void testOverrideMinAspectRatioMissingSpecificOverride() {
- // Note that we're using getBounds() in portrait, rather than getAppBounds() like other
- // tests, because we're comparing to the display size and therefore need to consider insets.
- runMinAspectRatioTest(NON_RESIZEABLE_PORTRAIT_ACTIVITY,
- /* expected= */ SIZE_COMPAT_DISPLAY_ASPECT_RATIO,
- /* useAppBoundsInPortrait= */false);
+ runMinAspectRatioTest(NON_RESIZEABLE_PORTRAIT_ACTIVITY, /* expected= */ 0);
}
/**
@@ -344,11 +336,7 @@
@Test
@EnableCompatChanges({ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO_LARGE})
public void testOverrideMinAspectRatioMissingGeneralOverride() {
- // Note that we're using getBounds() in portrait, rather than getAppBounds() like other
- // tests, because we're comparing to the display size and therefore need to consider insets.
- runMinAspectRatioTest(NON_RESIZEABLE_PORTRAIT_ACTIVITY,
- /* expected= */ SIZE_COMPAT_DISPLAY_ASPECT_RATIO,
- /* useAppBoundsInPortrait= */false);
+ runMinAspectRatioTest(NON_RESIZEABLE_PORTRAIT_ACTIVITY, /* expected= */ 0);
}
/**
@@ -557,47 +545,18 @@
}
/**
- * Launches the provided activity twice. The first time, the display is resized to a portrait
- * aspect ratio. The second time, the display is resized to a landscape aspect ratio.
+ * Launches the provided activity and verifies that its min aspect ratio is equal to {@code
+ * expected}.
*
* @param activity the activity under test.
- * @param expected the expected aspect ratio in both portrait and landscape displays.
+ * @param expected the expected min aspect ratio in both portrait and landscape displays.
*/
private void runMinAspectRatioTest(ComponentName activity, float expected) {
- runMinAspectRatioTest(activity, expected, /* useAppBoundsInPortrait= */ true);
- }
-
- /**
- * Launches the provided activity twice. The first time, the display is resized to a portrait
- * aspect ratio. The second time, the display is resized to a landscape aspect ratio.
- *
- * @param activity the activity under test.
- * @param expected the expected aspect ratio in both a portrait and a landscape
- * display.
- * @param useAppBoundsInPortrait whether to use {@code activity#getAppBounds} rather than
- * {@code activity.getBounds} in portrait display.
- */
- private void runMinAspectRatioTest(ComponentName activity, float expected,
- boolean useAppBoundsInPortrait) {
- // Change the aspect ratio of the display to something that is smaller than all the aspect
- // ratios used throughout those tests but still portrait. This ensures we're using
- // enforcing aspect ratio behaviour within orientation.
- // NOTE: using a smaller aspect ratio (e.g., 1.2) might cause activities to have a landscape
- // window because of insets.
- mDisplayMetricsSession.changeAspectRatio(SIZE_COMPAT_DISPLAY_ASPECT_RATIO,
- ORIENTATION_PORTRAIT);
launchActivity(activity);
+ WindowManagerState.Activity activityContainer = mWmState.getActivity(activity);
+ assertNotNull(activityContainer);
assertEquals(expected,
- getActivityAspectRatio(activity, /* useAppBounds= */ useAppBoundsInPortrait),
- FLOAT_EQUALITY_DELTA);
-
- // Change the orientation of the display to landscape. In this case we should see
- // fixed orientation letterboxing and the aspect ratio should be applied there.
- mDisplayMetricsSession.changeAspectRatio(SIZE_COMPAT_DISPLAY_ASPECT_RATIO,
- ORIENTATION_LANDSCAPE);
- launchActivity(activity);
- assertEquals(expected,
- getActivityAspectRatio(activity, /* useAppBounds= */ true),
+ activityContainer.getMinAspectRatio(),
FLOAT_EQUALITY_DELTA);
}
@@ -638,15 +597,6 @@
}, "checking task bounds updated");
}
- private float getActivityAspectRatio(ComponentName componentName, boolean useAppBounds) {
- WindowManagerState.Activity activity = mWmState.getActivity(componentName);
- assertNotNull(activity);
- Rect bounds = useAppBounds ? activity.getAppBounds() : activity.getBounds();
- assertNotNull(bounds);
- return Math.max(bounds.height(), bounds.width())
- / (float) (Math.min(bounds.height(), bounds.width()));
- }
-
private float getInitialDisplayAspectRatio() {
Size size = mDisplayMetricsSession.getInitialDisplayMetrics().getSize();
return Math.max(size.getHeight(), size.getWidth())
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/DisplayTests.java b/tests/framework/base/windowmanager/src/android/server/wm/DisplayTests.java
index bd415bf..9da0698 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/DisplayTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/DisplayTests.java
@@ -165,8 +165,8 @@
// Apply new override values that don't match the physical metrics.
final Size overrideSize = new Size(
- (int) (originalDisplayMetrics.physicalSize.getWidth() * 1.5),
- (int) (originalDisplayMetrics.physicalSize.getHeight() * 1.5));
+ (int) (originalDisplayMetrics.physicalSize.getWidth() * 0.9),
+ (int) (originalDisplayMetrics.physicalSize.getHeight() * 0.9));
final Integer overrideDensity = (int) (originalDisplayMetrics.physicalDensity * 1.1);
displayMetricsSession.overrideDisplayMetrics(overrideSize, overrideDensity);
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/KeyguardLockedTests.java b/tests/framework/base/windowmanager/src/android/server/wm/KeyguardLockedTests.java
index 635472f..354807f 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/KeyguardLockedTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/KeyguardLockedTests.java
@@ -216,40 +216,6 @@
}
@Test
- public void testTurnScreenOnActivity_withSecureKeyguardAndAod() {
- final AodSession aodSession = createManagedAodSession();
- final LockScreenSession lockScreenSession = createManagedLockScreenSession();
- lockScreenSession.setLockCredential();
- testTurnScreenOnActivity_withSecureKeyguard(aodSession, lockScreenSession,
- false /* enableAod */);
- testTurnScreenOnActivity_withSecureKeyguard(aodSession, lockScreenSession,
- true /* enableAod */);
- }
-
- private void testTurnScreenOnActivity_withSecureKeyguard(AodSession aodSession,
- LockScreenSession lockScreenSession, boolean enableAod) {
- if (enableAod) {
- assumeTrue(aodSession.isAodAvailable());
- }
- aodSession.setAodEnabled(enableAod);
- lockScreenSession.sleepDevice();
- mWmState.computeState();
- assertTrue(mWmState.getKeyguardControllerState().keyguardShowing);
-
- final CommandSession.ActivitySessionClient activityClient =
- createManagedActivityClientSession();
- final CommandSession.ActivitySession activity = activityClient.startActivity(
- getLaunchActivityBuilder().setUseInstrumentation().setIntentExtra(extra -> {
- extra.putBoolean(Components.TurnScreenOnActivity.EXTRA_SHOW_WHEN_LOCKED, false);
- }).setTargetActivity(TURN_SCREEN_ON_ACTIVITY));
- mWmState.waitForKeyguardShowingAndNotOccluded();
- mWmState.assertVisibility(TURN_SCREEN_ON_ACTIVITY, false);
- assertTrue(mWmState.getKeyguardControllerState().keyguardShowing);
- assertFalse(isDisplayOn(DEFAULT_DISPLAY));
- activity.finish();
- }
-
- @Test
public void testDismissKeyguardAttrActivity_method_turnScreenOn_withSecureKeyguard() {
final LockScreenSession lockScreenSession = createManagedLockScreenSession();
lockScreenSession.setLockCredential().sleepDevice();
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/KeyguardTests.java b/tests/framework/base/windowmanager/src/android/server/wm/KeyguardTests.java
index 4213984..dc7c308 100755
--- a/tests/framework/base/windowmanager/src/android/server/wm/KeyguardTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/KeyguardTests.java
@@ -443,7 +443,7 @@
}
@Test
- public void testTurnScreenOnOnActivityOnAod() {
+ public void testTurnScreenOnActivityOnAod() {
final AodSession aodSession = createManagedAodSession();
assumeTrue(aodSession.isAodAvailable());
aodSession.setAodEnabled(true);
@@ -460,10 +460,13 @@
false);
}).setTargetActivity(TURN_SCREEN_ON_ACTIVITY));
- mWmState.computeState(TURN_SCREEN_ON_ACTIVITY);
- mWmState.assertVisibility(TURN_SCREEN_ON_ACTIVITY, true);
- assertFalse(mWmState.getKeyguardControllerState().keyguardShowing);
- assertTrue(isDisplayOn(DEFAULT_DISPLAY));
+ mWmState.waitForAllStoppedActivities();
+ // An activity without set showWhenLocked or dismissKeyguard cannot wakeup device and/or
+ // unlock insecure keyguard even if it has setTurnScreenOn, so the device should stay
+ // invisible and the display stay in dozing.
+ mWmState.assertVisibility(TURN_SCREEN_ON_ACTIVITY, false);
+ assertTrue(mWmState.getKeyguardControllerState().keyguardShowing);
+ assertFalse(isDisplayOn(DEFAULT_DISPLAY));
}
/**
* Tests whether a FLAG_DISMISS_KEYGUARD activity occludes Keyguard.
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplaySystemDecorationTests.java b/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplaySystemDecorationTests.java
index c7755e0..2541c43 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplaySystemDecorationTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplaySystemDecorationTests.java
@@ -640,25 +640,7 @@
assumeTrue(MSG_NO_MOCK_IME, supportsInstallableIme());
final MockImeSession mockImeSession = createManagedMockImeSession(this);
-
- // Launch Ime test activity on default display.
- final TestActivitySession<ImeTestActivity2> defaultDisplaySession =
- createManagedTestActivitySession();
- defaultDisplaySession.launchTestActivityOnDisplaySync(ImeTestActivity2.class,
- DEFAULT_DISPLAY);
-
- // Tap the EditText to start IME session.
- final int[] location = new int[2];
- EditText editText = defaultDisplaySession.getActivity().mEditText;
- tapOnDisplayCenter(DEFAULT_DISPLAY);
- editText.getLocationOnScreen(location);
- tapOnDisplaySync(location[0], location[1], DEFAULT_DISPLAY);
-
- // Verify the activity shows soft input on the default display.
final ImeEventStream stream = mockImeSession.openEventStream();
- waitOrderedImeEventsThenAssertImeShown(stream, DEFAULT_DISPLAY,
- editorMatcher("onStartInput", editText.getPrivateImeOptions()),
- event -> "showSoftInput".equals(event.getEventName()));
// Create a virtual display with the policy to hide the IME.
final DisplayContent newDisplay = createManagedVirtualDisplaySession()
@@ -681,7 +663,8 @@
newDisplay.mId);
// Tap the EditText on the virtual display.
- editText = imeTestActivitySession.getActivity().mEditText;
+ final int[] location = new int[2];
+ EditText editText = imeTestActivitySession.getActivity().mEditText;
tapOnDisplayCenter(newDisplay.mId);
editText.getLocationOnScreen(location);
tapOnDisplaySync(location[0], location[1], newDisplay.mId);
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/PinnedStackTests.java b/tests/framework/base/windowmanager/src/android/server/wm/PinnedStackTests.java
index 2dd9dd6..5e56733 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/PinnedStackTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/PinnedStackTests.java
@@ -1292,8 +1292,8 @@
launchActivity(PIP_ACTIVITY, extraString(EXTRA_ALLOW_AUTO_PIP, "true"));
assertPinnedStackDoesNotExist();
- // Go home and ensure that there is a pinned stack.
- launchHomeActivity();
+ // Launch a new activity and ensure that there is a pinned stack.
+ launchActivity(RESUME_WHILE_PAUSING_ACTIVITY);
waitForEnterPip(PIP_ACTIVITY);
assertPinnedStackExists();
}
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/SurfaceControlTest.java b/tests/framework/base/windowmanager/src/android/server/wm/SurfaceControlTest.java
index a8517c2..9e00b08 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/SurfaceControlTest.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/SurfaceControlTest.java
@@ -44,6 +44,12 @@
@Presubmit
public class SurfaceControlTest {
private static final int DEFAULT_SURFACE_SIZE = 100;
+ /**
+ * Use a rect that doesn't include 1 pixel in the border since some composers add blending at
+ * the edges. It's easier to just ignore those pixels and ensure the rest are correct.
+ */
+ private static final Rect DEFAULT_RECT = new Rect(1, 1, DEFAULT_SURFACE_SIZE - 1,
+ DEFAULT_SURFACE_SIZE - 1);
@Rule
public ActivityScenarioRule<ASurfaceControlTestActivity> mActivityRule =
@@ -153,7 +159,7 @@
sc.release();
}
},
- new RectChecker(new Rect(0, 0, 100, 100), PixelColor.RED));
+ new RectChecker(DEFAULT_RECT, PixelColor.RED));
}
/**
@@ -172,7 +178,7 @@
sc.release();
}
},
- new RectChecker(new Rect(0, 0, 100, 100), PixelColor.BLACK));
+ new RectChecker(DEFAULT_RECT, PixelColor.BLACK));
}
/**
@@ -189,7 +195,7 @@
new SurfaceControl.Transaction().reparent(sc, null).apply();
}
},
- new RectChecker(new Rect(0, 0, 100, 100), PixelColor.BLACK));
+ new RectChecker(DEFAULT_RECT, PixelColor.BLACK));
// Since the SurfaceControl is parented off-screen, if we release our reference
// it may completely die. If this occurs while the render thread is still rendering
// the RED background we could trigger a crash. For this test defer destroying the
@@ -217,7 +223,7 @@
sc.release();
}
},
- new RectChecker(new Rect(0, 0, 100, 100), PixelColor.RED));
+ new RectChecker(DEFAULT_RECT, PixelColor.RED));
}
/**
@@ -241,7 +247,7 @@
sc.release();
}
},
- new RectChecker(new Rect(0, 0, 100, 100), PixelColor.GREEN));
+ new RectChecker(DEFAULT_RECT, PixelColor.GREEN));
}
/**
@@ -262,7 +268,7 @@
},
// The rect should be offset by -50 pixels
- new MultiRectChecker(new Rect(0, 0, 100, 100)) {
+ new MultiRectChecker(DEFAULT_RECT) {
final PixelColor red = new PixelColor(PixelColor.RED);
final PixelColor black = new PixelColor(PixelColor.BLACK);
@Override
@@ -295,7 +301,7 @@
},
// The rect should be offset by 50 pixels
- new MultiRectChecker(new Rect(0, 0, 100, 100)) {
+ new MultiRectChecker(DEFAULT_RECT) {
final PixelColor red = new PixelColor(PixelColor.RED);
final PixelColor black = new PixelColor(PixelColor.BLACK);
@Override
@@ -328,6 +334,6 @@
}
},
- new RectChecker(new Rect(0, 0, 100, 100), PixelColor.RED));
+ new RectChecker(DEFAULT_RECT, PixelColor.RED));
}
}
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/WindowInsetsPolicyTest.java b/tests/framework/base/windowmanager/src/android/server/wm/WindowInsetsPolicyTest.java
index dbbb4fd..a3b504e 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/WindowInsetsPolicyTest.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/WindowInsetsPolicyTest.java
@@ -88,6 +88,11 @@
new ActivityTestRule<>(ImmersiveFullscreenTestActivity.class,
false /* initialTouchMode */, false /* launchActivity */);
+ @Rule
+ public final ActivityTestRule<NaturalOrientationTestActivity> mNaturalOrientationTestActivity =
+ new ActivityTestRule<>(NaturalOrientationTestActivity.class,
+ false /* initialTouchMode */, false /* launchActivity */);
+
@Before
@Override
public void setUp() throws Exception {
@@ -124,6 +129,7 @@
assumeTrue("Skipping test: no split multi-window support",
supportsSplitScreenMultiWindow());
+ launchAndWait(mNaturalOrientationTestActivity);
mWmState.computeState(new ComponentName[] {});
final boolean naturalOrientationPortrait =
mWmState.getDisplay(DEFAULT_DISPLAY)
@@ -356,4 +362,7 @@
| View.SYSTEM_UI_FLAG_FULLSCREEN);
}
}
+
+ public static class NaturalOrientationTestActivity extends TestActivity {
+ }
}
diff --git a/tests/framework/base/windowmanager/util/src/android/server/wm/WindowManagerState.java b/tests/framework/base/windowmanager/util/src/android/server/wm/WindowManagerState.java
index 388095c..8d2769c 100644
--- a/tests/framework/base/windowmanager/util/src/android/server/wm/WindowManagerState.java
+++ b/tests/framework/base/windowmanager/util/src/android/server/wm/WindowManagerState.java
@@ -1452,6 +1452,7 @@
boolean visible;
boolean frontOfTask;
boolean inSizeCompatMode;
+ float minAspectRatio;
int procId = -1;
public boolean translucent;
ActivityTask task;
@@ -1464,6 +1465,7 @@
visible = proto.visible;
frontOfTask = proto.frontOfTask;
inSizeCompatMode = proto.inSizeCompatMode;
+ minAspectRatio = proto.minAspectRatio;
if (proto.procId != 0) {
procId = proto.procId;
}
@@ -1482,6 +1484,10 @@
return inSizeCompatMode;
}
+ public float getMinAspectRatio() {
+ return minAspectRatio;
+ }
+
@Override
public Rect getBounds() {
if (mBounds == null) {
diff --git a/tests/framework/base/windowmanager/util/src/android/server/wm/WindowManagerStateHelper.java b/tests/framework/base/windowmanager/util/src/android/server/wm/WindowManagerStateHelper.java
index 0a70d01..080c0cb 100644
--- a/tests/framework/base/windowmanager/util/src/android/server/wm/WindowManagerStateHelper.java
+++ b/tests/framework/base/windowmanager/util/src/android/server/wm/WindowManagerStateHelper.java
@@ -160,6 +160,7 @@
public static boolean isKeyguardShowingAndNotOccluded(WindowManagerState state) {
return state.getKeyguardControllerState().keyguardShowing
+ && !state.getKeyguardControllerState().aodShowing
&& !state.getKeyguardControllerState().isKeyguardOccluded(DEFAULT_DISPLAY);
}
diff --git a/tests/inputmethod/AndroidManifest.xml b/tests/inputmethod/AndroidManifest.xml
index 4b1cead..18c6ebf 100644
--- a/tests/inputmethod/AndroidManifest.xml
+++ b/tests/inputmethod/AndroidManifest.xml
@@ -29,7 +29,7 @@
<activity android:name="android.view.inputmethod.cts.util.TestActivity"
android:theme="@style/no_starting_window"
android:label="TestActivity"
- android:configChanges="fontScale|smallestScreenSize"
+ android:configChanges="fontScale|smallestScreenSize|screenSize|screenLayout"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
diff --git a/tests/inputmethod/mockime/src/com/android/cts/mockime/ImeEventStreamTestUtils.java b/tests/inputmethod/mockime/src/com/android/cts/mockime/ImeEventStreamTestUtils.java
index 5f88d27..bf301d6 100644
--- a/tests/inputmethod/mockime/src/com/android/cts/mockime/ImeEventStreamTestUtils.java
+++ b/tests/inputmethod/mockime/src/com/android/cts/mockime/ImeEventStreamTestUtils.java
@@ -169,6 +169,25 @@
}
/**
+ * Checks if {@code eventName} has occurred on the EditText(or TextView) of the current
+ * activity mainly for onStartInput restarting check.
+ * @param eventName event name to check
+ * @param marker Test marker set to {@link android.widget.EditText#setPrivateImeOptions(String)}
+ * @return true if event occurred and restarting is false.
+ */
+ public static Predicate<ImeEvent> editorMatcherRestartingFalse(
+ @NonNull String eventName, @NonNull String marker) {
+ return event -> {
+ if (!TextUtils.equals(eventName, event.getEventName())) {
+ return false;
+ }
+ final EditorInfo editorInfo = event.getArguments().getParcelable("editorInfo");
+ final boolean restarting = event.getArguments().getBoolean("restarting");
+ return (TextUtils.equals(marker, editorInfo.privateImeOptions) && !restarting );
+ };
+ }
+
+ /**
* Checks if {@code eventName} has occurred on the EditText(or TextView) of the current
* activity.
* @param eventName event name to check
diff --git a/tests/inputmethod/src/android/view/inputmethod/cts/FocusHandlingTest.java b/tests/inputmethod/src/android/view/inputmethod/cts/FocusHandlingTest.java
index 5c738e1..34d4443 100644
--- a/tests/inputmethod/src/android/view/inputmethod/cts/FocusHandlingTest.java
+++ b/tests/inputmethod/src/android/view/inputmethod/cts/FocusHandlingTest.java
@@ -25,6 +25,7 @@
import static android.widget.PopupWindow.INPUT_METHOD_NOT_NEEDED;
import static com.android.cts.mockime.ImeEventStreamTestUtils.editorMatcher;
+import static com.android.cts.mockime.ImeEventStreamTestUtils.editorMatcherRestartingFalse;
import static com.android.cts.mockime.ImeEventStreamTestUtils.expectBindInput;
import static com.android.cts.mockime.ImeEventStreamTestUtils.expectCommand;
import static com.android.cts.mockime.ImeEventStreamTestUtils.expectEvent;
@@ -159,7 +160,8 @@
assertFalse(stream.dump(), onStart.getArguments().getBoolean("restarting"));
// There shouldn't be onStartInput any more.
- notExpectEvent(stream, editorMatcher("onStartInput", marker), NOT_EXPECT_TIMEOUT);
+ notExpectEvent(stream, editorMatcherRestartingFalse("onStartInput", marker),
+ NOT_EXPECT_TIMEOUT);
}
}
diff --git a/tests/mediapc/src/android/mediapc/cts/AdaptivePlaybackFrameDropTest.java b/tests/mediapc/src/android/mediapc/cts/AdaptivePlaybackFrameDropTest.java
index 8c735d9..160fef7 100644
--- a/tests/mediapc/src/android/mediapc/cts/AdaptivePlaybackFrameDropTest.java
+++ b/tests/mediapc/src/android/mediapc/cts/AdaptivePlaybackFrameDropTest.java
@@ -17,8 +17,15 @@
package android.mediapc.cts;
import android.media.MediaCodecInfo;
+import android.os.Build;
import androidx.test.filters.LargeTest;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.compatibility.common.util.CddTest;
+import com.android.compatibility.common.util.DeviceReportLog;
+import com.android.compatibility.common.util.ResultType;
+import com.android.compatibility.common.util.ResultUnit;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -57,14 +64,27 @@
*/
@LargeTest
@Test(timeout = CodecTestBase.PER_TEST_TIMEOUT_LARGE_TEST_MS)
+ @CddTest(requirement="2.2.7.1/5.3/H-1-2")
public void testAdaptivePlaybackFrameDrop() throws Exception {
PlaybackFrameDrop playbackFrameDrop = new PlaybackFrameDrop(mMime, mDecoderName,
new String[]{m1080pTestFiles.get(mMime), m540pTestFiles.get(mMime)},
mSurface, FRAME_RATE, mIsAsync);
int frameDropCount = playbackFrameDrop.getFrameDropCount();
- assertTrue("Adaptive Playback FrameDrop count for mime: " + mMime + ", decoder: " +
- mDecoderName + ", FrameRate: " + FRAME_RATE + ", is not as expected. act/exp: " +
- frameDropCount + "/" + MAX_FRAME_DROP_FOR_30S,
- frameDropCount <= MAX_FRAME_DROP_FOR_30S);
+ if (Utils.isPerfClass()) {
+ assertTrue("Adaptive Playback FrameDrop count for mime: " + mMime + ", decoder: "
+ + mDecoderName + ", FrameRate: " + FRAME_RATE
+ + ", is not as expected. act/exp: " + frameDropCount + "/"
+ + MAX_FRAME_DROP_FOR_30S, frameDropCount <= MAX_FRAME_DROP_FOR_30S);
+ } else {
+ int pc = frameDropCount <= MAX_FRAME_DROP_FOR_30S ? Build.VERSION_CODES.R : 0;
+ DeviceReportLog log = new DeviceReportLog("MediaPerformanceClassLogs",
+ "AdaptiveFrameDrop_" + mDecoderName);
+ log.addValue("decoder", mDecoderName, ResultType.NEUTRAL, ResultUnit.NONE);
+ log.addValue("adaptive_frame_drops_for_30sec", frameDropCount, ResultType.LOWER_BETTER,
+ ResultUnit.NONE);
+ log.setSummary("CDD 2.2.7.1/5.3/H-1-2 performance_class", pc, ResultType.NEUTRAL,
+ ResultUnit.NONE);
+ log.submit(InstrumentationRegistry.getInstrumentation());
+ }
}
}
diff --git a/tests/mediapc/src/android/mediapc/cts/EncoderInitializationLatencyTest.java b/tests/mediapc/src/android/mediapc/cts/EncoderInitializationLatencyTest.java
index 8598622..6a2372f 100644
--- a/tests/mediapc/src/android/mediapc/cts/EncoderInitializationLatencyTest.java
+++ b/tests/mediapc/src/android/mediapc/cts/EncoderInitializationLatencyTest.java
@@ -24,6 +24,7 @@
import android.media.MediaCodecList;
import android.media.MediaFormat;
import android.media.MediaRecorder;
+import android.os.Build;
import android.util.Log;
import android.util.Pair;
import android.view.Surface;
@@ -32,6 +33,14 @@
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
+import com.android.compatibility.common.util.CddTest;
+import com.android.compatibility.common.util.ReportLog;
+import com.android.compatibility.common.util.ReportLog.Metric;
+
+import com.android.compatibility.common.util.DeviceReportLog;
+import com.android.compatibility.common.util.ResultType;
+import com.android.compatibility.common.util.ResultUnit;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
@@ -62,6 +71,11 @@
public class EncoderInitializationLatencyTest {
private static final String LOG_TAG = EncoderInitializationLatencyTest.class.getSimpleName();
private static final boolean[] boolStates = {false, true};
+ private static final int MAX_AUDIOENC_INITIALIZATION_LATENCY_PC_R_MS = 50;
+ private static final int MAX_VIDEOENC_INITIALIZATION_LATENCY_PC_R_MS = 65;
+ private static final int MAX_AUDIOENC_INITIALIZATION_LATENCY_PC_S_MS = 40;
+ private static final int MAX_VIDEOENC_INITIALIZATION_LATENCY_PC_S_MS = 50;
+
private static final int MAX_AUDIOENC_INITIALIZATION_LATENCY_MS;
private static final int MAX_VIDEOENC_INITIALIZATION_LATENCY_MS;
private static final String AVC = MediaFormat.MIMETYPE_VIDEO_AVC;
@@ -69,14 +83,15 @@
private static final String AVC_TRANSCODE_FILE = "bbb_1280x720_3mbps_30fps_avc.mp4";
private static String AVC_DECODER_NAME;
private static String AVC_ENCODER_NAME;
+
static {
if (Utils.isRPerfClass()) {
- MAX_AUDIOENC_INITIALIZATION_LATENCY_MS = 50;
- MAX_VIDEOENC_INITIALIZATION_LATENCY_MS = 65;
+ MAX_AUDIOENC_INITIALIZATION_LATENCY_MS = MAX_AUDIOENC_INITIALIZATION_LATENCY_PC_R_MS;
+ MAX_VIDEOENC_INITIALIZATION_LATENCY_MS = MAX_VIDEOENC_INITIALIZATION_LATENCY_PC_R_MS;
} else {
// Performance class Build.VERSION_CODES.S and beyond
- MAX_AUDIOENC_INITIALIZATION_LATENCY_MS = 40;
- MAX_VIDEOENC_INITIALIZATION_LATENCY_MS = 50;
+ MAX_AUDIOENC_INITIALIZATION_LATENCY_MS = MAX_AUDIOENC_INITIALIZATION_LATENCY_PC_S_MS;
+ MAX_VIDEOENC_INITIALIZATION_LATENCY_MS = MAX_VIDEOENC_INITIALIZATION_LATENCY_PC_S_MS;
}
}
@@ -92,7 +107,8 @@
@Before
public void setUp() throws Exception {
- assumeTrue("Test requires performance class.", Utils.isPerfClass());
+ Utils.assumeDeviceMeetsPerformanceClassPreconditions();
+
ArrayList<String> listOfAvcHwDecoders = selectHardwareCodecs(AVC, null, null, false);
assumeFalse("Test requires h/w avc decoder", listOfAvcHwDecoders.isEmpty());
AVC_DECODER_NAME = listOfAvcHwDecoders.get(0);
@@ -274,6 +290,7 @@
*/
@LargeTest
@Test(timeout = CodecTestBase.PER_TEST_TIMEOUT_LARGE_TEST_MS)
+ @CddTest(requirement="2.2.7.1/5.1/H-1-7,H-1-8")
public void testInitializationLatency() throws Exception {
final int NUM_MEASUREMENTS = 5;
// Test gathers initialization latency for a number of iterations and
@@ -303,16 +320,35 @@
Log.i(LOG_TAG, "Min " + statsLog + encoderInitializationLatencyMs[0]);
Log.i(LOG_TAG, "Max " + statsLog + encoderInitializationLatencyMs[count - 1]);
Log.i(LOG_TAG, "Avg " + statsLog + (sumOfEncoderInitializationLatencyMs / count));
-
- String errorLog = String.format(
- "CodecInitialization latency for mime: %s, Encoder: %s is not as expected. "
- + "act/exp in Ms :: %d/%d",
- mMime, mEncoderName, encoderInitializationLatencyMs[percentile * count / 100],
- expectedMaxCodecInitializationLatencyMs);
- assertTrue(errorLog,
- encoderInitializationLatencyMs[percentile * count / 100]
- <= expectedMaxCodecInitializationLatencyMs);
-
+ long initializationLatency = encoderInitializationLatencyMs[percentile * count / 100];
+ if (Utils.isPerfClass()) {
+ String errorLog = String.format(
+ "CodecInitialization latency for mime: %s, Encoder: %s is not as expected. "
+ + "act/exp in Ms :: %d/%d", mMime, mEncoderName, initializationLatency,
+ expectedMaxCodecInitializationLatencyMs);
+ assertTrue(errorLog, initializationLatency <= expectedMaxCodecInitializationLatencyMs);
+ } else {
+ int pc = 0;
+ if (mMime.startsWith("audio/")) {
+ pc = initializationLatency < MAX_AUDIOENC_INITIALIZATION_LATENCY_PC_S_MS
+ ? Build.VERSION_CODES.S
+ : initializationLatency < MAX_AUDIOENC_INITIALIZATION_LATENCY_PC_R_MS
+ ? Build.VERSION_CODES.R : 0;
+ } else {
+ pc = initializationLatency < MAX_VIDEOENC_INITIALIZATION_LATENCY_PC_S_MS
+ ? Build.VERSION_CODES.S
+ : initializationLatency < MAX_VIDEOENC_INITIALIZATION_LATENCY_PC_R_MS
+ ? Build.VERSION_CODES.R : 0;
+ }
+ DeviceReportLog log = new DeviceReportLog("MediaPerformanceClassLogs",
+ "InitializationLatency_" + mEncoderName);
+ log.addValue("encoder", mEncoderName, ResultType.NEUTRAL, ResultUnit.NONE);
+ log.addValue("initialization_latency", initializationLatency, ResultType.LOWER_BETTER,
+ ResultUnit.NONE);
+ log.setSummary("CDD 2.2.7.1/5.1/H-1-7,H-1-8 performance_class", pc, ResultType.NEUTRAL,
+ ResultUnit.NONE);
+ log.submit(InstrumentationRegistry.getInstrumentation());
+ }
}
}
diff --git a/tests/mediapc/src/android/mediapc/cts/FrameDropTest.java b/tests/mediapc/src/android/mediapc/cts/FrameDropTest.java
index b3d54de..60bc7a7 100644
--- a/tests/mediapc/src/android/mediapc/cts/FrameDropTest.java
+++ b/tests/mediapc/src/android/mediapc/cts/FrameDropTest.java
@@ -16,7 +16,15 @@
package android.mediapc.cts;
+import android.os.Build;
+
import androidx.test.filters.LargeTest;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.compatibility.common.util.CddTest;
+import com.android.compatibility.common.util.DeviceReportLog;
+import com.android.compatibility.common.util.ResultType;
+import com.android.compatibility.common.util.ResultUnit;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -54,12 +62,26 @@
*/
@LargeTest
@Test(timeout = CodecTestBase.PER_TEST_TIMEOUT_LARGE_TEST_MS)
+ @CddTest(requirement="2.2.7.1/5.3/H-1-1")
public void testDecodeToSurface() throws Exception {
PlaybackFrameDrop playbackFrameDrop = new PlaybackFrameDrop(mMime, mDecoderName,
new String[]{m1080pTestFiles.get(mMime)}, mSurface, FRAME_RATE, mIsAsync);
int frameDropCount = playbackFrameDrop.getFrameDropCount();
- assertTrue("FrameDrop count for mime: " + mMime + ", decoder: " + mDecoderName +
- ", FrameRate: " + FRAME_RATE + ", is not as expected. act/exp: " + frameDropCount +
- "/" + MAX_FRAME_DROP_FOR_30S, frameDropCount <= MAX_FRAME_DROP_FOR_30S);
+ if (Utils.isPerfClass()) {
+ assertTrue("FrameDrop count for mime: " + mMime + ", decoder: " + mDecoderName
+ + ", FrameRate: " + FRAME_RATE + ", is not as expected. act/exp: "
+ + frameDropCount + "/" + MAX_FRAME_DROP_FOR_30S,
+ frameDropCount <= MAX_FRAME_DROP_FOR_30S);
+ } else {
+ int pc = frameDropCount <= MAX_FRAME_DROP_FOR_30S ? Build.VERSION_CODES.R : 0;
+ DeviceReportLog log = new DeviceReportLog("MediaPerformanceClassLogs",
+ "FrameDrop_" + mDecoderName);
+ log.addValue("decoder", mDecoderName, ResultType.NEUTRAL, ResultUnit.NONE);
+ log.addValue("frame_drops_for_30sec", frameDropCount, ResultType.LOWER_BETTER,
+ ResultUnit.NONE);
+ log.setSummary("CDD 2.2.7.1/5.3/H-1-1 performance_class", pc, ResultType.NEUTRAL,
+ ResultUnit.NONE);
+ log.submit(InstrumentationRegistry.getInstrumentation());
+ }
}
}
diff --git a/tests/mediapc/src/android/mediapc/cts/FrameDropTestBase.java b/tests/mediapc/src/android/mediapc/cts/FrameDropTestBase.java
index a57faf7..47eae77 100644
--- a/tests/mediapc/src/android/mediapc/cts/FrameDropTestBase.java
+++ b/tests/mediapc/src/android/mediapc/cts/FrameDropTestBase.java
@@ -85,7 +85,7 @@
m1080pTestFiles.put(VP8, "bbb_1920x1080_8mbps_60fps_vp8.webm");
m1080pTestFiles.put(VP9, "bbb_1920x1080_6mbps_60fps_vp9.webm");
m1080pTestFiles.put(AV1, "bbb_1920x1080_6mbps_60fps_av1.mp4");
- } else if (Utils.isRPerfClass()) {
+ } else {
// One frame drops per 10 seconds at 30 fps is 3 drops per 30 seconds
MAX_FRAME_DROP_FOR_30S = 3;
m540pTestFiles.put(AVC, "bbb_960x540_2mbps_30fps_avc.mp4");
@@ -99,15 +99,12 @@
m1080pTestFiles.put(VP8, "bbb_1920x1080_6mbps_30fps_vp8.webm");
m1080pTestFiles.put(VP9, "bbb_1920x1080_4mbps_30fps_vp9.webm");
m1080pTestFiles.put(AV1, "bbb_1920x1080_4mbps_30fps_av1.mp4");
- } else {
- MAX_FRAME_DROP_FOR_30S = 0;
- Log.e(LOG_TAG, "Unknown performance class.");
}
}
@Before
public void setUp() throws Exception {
- assumeTrue("Test requires performance class.", Utils.isPerfClass());
+ Utils.assumeDeviceMeetsPerformanceClassPreconditions();
ArrayList<String> listOfAvcHwDecoders = selectHardwareCodecs(AVC, null, null, false);
assumeFalse("Test requires h/w avc decoder", listOfAvcHwDecoders.isEmpty());
diff --git a/tests/mediapc/src/android/mediapc/cts/MultiCodecPerfTestBase.java b/tests/mediapc/src/android/mediapc/cts/MultiCodecPerfTestBase.java
index 596532b..07ee73a 100644
--- a/tests/mediapc/src/android/mediapc/cts/MultiCodecPerfTestBase.java
+++ b/tests/mediapc/src/android/mediapc/cts/MultiCodecPerfTestBase.java
@@ -21,7 +21,7 @@
import android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint;
import android.media.MediaFormat;
import android.util.Pair;
-
+import android.util.Log;
import org.junit.Before;
import java.io.IOException;
@@ -70,8 +70,8 @@
double mMaxFrameRate;
@Before
- public void isPerformanceClass() {
- assumeTrue("Test requires performance class.", Utils.isPerfClass());
+ public void isPerformanceClassCandidate() {
+ Utils.assumeDeviceMeetsPerformanceClassPreconditions();
}
public MultiCodecPerfTestBase(String mime, String testFile, boolean isAsync) {
@@ -125,8 +125,11 @@
}
}
codec.release();
- assertTrue("Codec " + mimeCodecPair.second + " doesn't support 720p " +
- requiredFrameRate + " performance point", supports720pPerformance);
+ if (!supports720pPerformance) {
+ Log.e(LOG_TAG, "Codec " + mimeCodecPair.second + " doesn't support 720p " +
+ requiredFrameRate + " performance point");
+ return 0;
+ }
loopCount++;
}
Arrays.sort(maxInstances);
diff --git a/tests/mediapc/src/android/mediapc/cts/MultiDecoderPairPerfTest.java b/tests/mediapc/src/android/mediapc/cts/MultiDecoderPairPerfTest.java
index ddb7451..bff0793 100644
--- a/tests/mediapc/src/android/mediapc/cts/MultiDecoderPairPerfTest.java
+++ b/tests/mediapc/src/android/mediapc/cts/MultiDecoderPairPerfTest.java
@@ -16,9 +16,17 @@
package android.mediapc.cts;
+import android.media.MediaFormat;
+import android.os.Build;
import android.util.Pair;
import androidx.test.filters.LargeTest;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.compatibility.common.util.CddTest;
+import com.android.compatibility.common.util.DeviceReportLog;
+import com.android.compatibility.common.util.ResultType;
+import com.android.compatibility.common.util.ResultUnit;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -88,30 +96,59 @@
*/
@LargeTest
@Test(timeout = CodecTestBase.PER_TEST_TIMEOUT_LARGE_TEST_MS)
+ @CddTest(requirement="2.2.7.1/5.1/H-1-1,H-1-2")
public void test720p() throws Exception {
ArrayList<Pair<String, String>> mimeDecoderPairs = new ArrayList<>();
mimeDecoderPairs.add(mFirstPair);
mimeDecoderPairs.add(mSecondPair);
int maxInstances = checkAndGetMaxSupportedInstancesFor720p(mimeDecoderPairs);
- int secondPairInstances = maxInstances / 2;
- int firstPairInstances = maxInstances - secondPairInstances;
- ExecutorService pool = Executors.newFixedThreadPool(maxInstances);
- List<Decode> testList = new ArrayList<>();
- for (int i = 0; i < firstPairInstances; i++) {
- testList.add(new Decode(mFirstPair.first, mTestFiles.get(mFirstPair.first),
- mFirstPair.second, mIsAsync));
+ int requiredMinInstances = REQUIRED_MIN_CONCURRENT_INSTANCES;
+ if (mFirstPair.first.equals(MediaFormat.MIMETYPE_VIDEO_VP9)
+ || mSecondPair.first.equals(MediaFormat.MIMETYPE_VIDEO_VP9)) {
+ requiredMinInstances = REQUIRED_MIN_CONCURRENT_INSTANCES_FOR_VP9;
}
- for (int i = 0; i < secondPairInstances; i++) {
- testList.add(new Decode(mSecondPair.first, mTestFiles.get(mSecondPair.first),
- mSecondPair.second, mIsAsync));
- }
- List<Future<Double>> resultList = pool.invokeAll(testList);
double achievedFrameRate = 0.0;
- for (Future<Double> result : resultList) {
- achievedFrameRate += result.get();
+ if (maxInstances >= requiredMinInstances) {
+ int secondPairInstances = maxInstances / 2;
+ int firstPairInstances = maxInstances - secondPairInstances;
+ ExecutorService pool = Executors.newFixedThreadPool(maxInstances);
+ List<Decode> testList = new ArrayList<>();
+ for (int i = 0; i < firstPairInstances; i++) {
+ testList.add(new Decode(mFirstPair.first, mTestFiles.get(mFirstPair.first),
+ mFirstPair.second, mIsAsync));
+ }
+ for (int i = 0; i < secondPairInstances; i++) {
+ testList.add(new Decode(mSecondPair.first, mTestFiles.get(mSecondPair.first),
+ mSecondPair.second, mIsAsync));
+ }
+ List<Future<Double>> resultList = pool.invokeAll(testList);
+ for (Future<Double> result : resultList) {
+ achievedFrameRate += result.get();
+ }
}
- assertTrue("Unable to achieve the maxFrameRate supported. act/exp: " + achievedFrameRate
- + "/" + mMaxFrameRate + " for " + maxInstances + " instances.",
- achievedFrameRate >= mMaxFrameRate);
+ if (Utils.isPerfClass()) {
+ assertTrue("Decoder pair " + mFirstPair.second + " and " + mSecondPair.second
+ + " unable to support minimum concurrent " +
+ "instances. act/exp: " + maxInstances + "/" + requiredMinInstances,
+ maxInstances >= requiredMinInstances);
+
+ assertTrue("Unable to achieve the maxFrameRate supported. act/exp: " + achievedFrameRate
+ + "/" + mMaxFrameRate + " for " + maxInstances + " instances.",
+ achievedFrameRate >= mMaxFrameRate);
+ } else {
+ int pc = maxInstances >= requiredMinInstances && achievedFrameRate >= mMaxFrameRate
+ ? Build.VERSION_CODES.R : 0;
+ DeviceReportLog log = new DeviceReportLog("MediaPerformanceClassLogs",
+ "MultiDecoderPairPerf_" + mFirstPair.second);
+ log.addValue("decoders",
+ mFirstPair.first + "_" + mFirstPair.second + "_" + mSecondPair.first + "_"
+ + mSecondPair.second, ResultType.NEUTRAL, ResultUnit.NONE);
+ log.addValue("achieved_framerate", achievedFrameRate, ResultType.HIGHER_BETTER,
+ ResultUnit.NONE);
+ log.addValue("expected_framerate", mMaxFrameRate, ResultType.NEUTRAL, ResultUnit.NONE);
+ log.setSummary("CDD 2.2.7.1/5.1/H-1-1,H-1-2 performance_class", pc, ResultType.NEUTRAL,
+ ResultUnit.NONE);
+ log.submit(InstrumentationRegistry.getInstrumentation());
+ }
}
}
diff --git a/tests/mediapc/src/android/mediapc/cts/MultiDecoderPerfTest.java b/tests/mediapc/src/android/mediapc/cts/MultiDecoderPerfTest.java
index 4647719..3e3881b 100644
--- a/tests/mediapc/src/android/mediapc/cts/MultiDecoderPerfTest.java
+++ b/tests/mediapc/src/android/mediapc/cts/MultiDecoderPerfTest.java
@@ -16,9 +16,16 @@
package android.mediapc.cts;
import android.media.MediaFormat;
+import android.os.Build;
import android.util.Pair;
import androidx.test.filters.LargeTest;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.compatibility.common.util.CddTest;
+import com.android.compatibility.common.util.DeviceReportLog;
+import com.android.compatibility.common.util.ResultType;
+import com.android.compatibility.common.util.ResultUnit;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -75,6 +82,7 @@
*/
@LargeTest
@Test(timeout = CodecTestBase.PER_TEST_TIMEOUT_LARGE_TEST_MS)
+ @CddTest(requirement="2.2.7.1/5.1/H-1-1,H-1-2")
public void test720p() throws Exception {
ArrayList<Pair<String, String>> mimeDecoderPairs = new ArrayList<>();
mimeDecoderPairs.add(Pair.create(mMime, mDecoderName));
@@ -83,21 +91,39 @@
if (mMime.equals(MediaFormat.MIMETYPE_VIDEO_VP9)) {
requiredMinInstances = REQUIRED_MIN_CONCURRENT_INSTANCES_FOR_VP9;
}
- assertTrue("Decoder " + mDecoderName + " unable to support minimum concurrent " +
- "instances. act/exp: " + maxInstances + "/" + requiredMinInstances,
- maxInstances >= requiredMinInstances);
- ExecutorService pool = Executors.newFixedThreadPool(maxInstances);
- List<Decode> testList = new ArrayList<>();
- for (int i = 0; i < maxInstances; i++) {
- testList.add(new Decode(mMime, mTestFile, mDecoderName, mIsAsync));
- }
- List<Future<Double>> resultList = pool.invokeAll(testList);
double achievedFrameRate = 0.0;
- for (Future<Double> result : resultList) {
- achievedFrameRate += result.get();
+ if (maxInstances >= requiredMinInstances) {
+ ExecutorService pool = Executors.newFixedThreadPool(maxInstances);
+ List<Decode> testList = new ArrayList<>();
+ for (int i = 0; i < maxInstances; i++) {
+ testList.add(new Decode(mMime, mTestFile, mDecoderName, mIsAsync));
+ }
+ List<Future<Double>> resultList = pool.invokeAll(testList);
+ for (Future<Double> result : resultList) {
+ achievedFrameRate += result.get();
+ }
}
- assertTrue("Unable to achieve the maxFrameRate supported. act/exp: " + achievedFrameRate
- + "/" + mMaxFrameRate + " for " + maxInstances + " instances.",
- achievedFrameRate >= mMaxFrameRate);
+ if (Utils.isPerfClass()) {
+ assertTrue("Decoder " + mDecoderName + " unable to support minimum concurrent " +
+ "instances. act/exp: " + maxInstances + "/" + requiredMinInstances,
+ maxInstances >= requiredMinInstances);
+ assertTrue("Unable to achieve the maxFrameRate supported. act/exp: " + achievedFrameRate
+ + "/" + mMaxFrameRate + " for " + maxInstances + " instances.",
+ achievedFrameRate >= mMaxFrameRate);
+ } else {
+ int pc = maxInstances >= requiredMinInstances && achievedFrameRate >= mMaxFrameRate
+ ? Build.VERSION_CODES.R : 0;
+ DeviceReportLog log = new DeviceReportLog("MediaPerformanceClassLogs",
+ "MultiDecoderPerf_" + mDecoderName);
+ log.addValue("decoders", mMime + "_" + mDecoderName, ResultType.NEUTRAL,
+ ResultUnit.NONE);
+ log.addValue("achieved_framerate", achievedFrameRate, ResultType.HIGHER_BETTER,
+ ResultUnit.NONE);
+ log.addValue("expected_framerate", mMaxFrameRate, ResultType.NEUTRAL, ResultUnit.NONE);
+ log.setSummary("CDD 2.2.7.1/5.1/H-1-1,H-1-2 performance_class", pc, ResultType.NEUTRAL,
+ ResultUnit.NONE);
+ log.submit(InstrumentationRegistry.getInstrumentation());
+ }
+
}
}
diff --git a/tests/mediapc/src/android/mediapc/cts/MultiEncoderPairPerfTest.java b/tests/mediapc/src/android/mediapc/cts/MultiEncoderPairPerfTest.java
index 0ef9f26..4cd2a0c 100644
--- a/tests/mediapc/src/android/mediapc/cts/MultiEncoderPairPerfTest.java
+++ b/tests/mediapc/src/android/mediapc/cts/MultiEncoderPairPerfTest.java
@@ -16,10 +16,17 @@
package android.mediapc.cts;
+import android.media.MediaFormat;
+import android.os.Build;
import android.util.Pair;
import androidx.test.filters.LargeTest;
+import androidx.test.platform.app.InstrumentationRegistry;
+import com.android.compatibility.common.util.CddTest;
+import com.android.compatibility.common.util.DeviceReportLog;
+import com.android.compatibility.common.util.ResultType;
+import com.android.compatibility.common.util.ResultUnit;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -31,6 +38,7 @@
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
+import static org.junit.Assert.assertTrue;
/**
* The following test class calculates the maximum number of concurrent encode sessions that it can
* support by the two hardware (mime - encoder) pair calculated via the
@@ -86,26 +94,49 @@
*/
@LargeTest
@Test(timeout = CodecTestBase.PER_TEST_TIMEOUT_LARGE_TEST_MS)
+ @CddTest(requirement="2.2.7.1/5.1/H-1-3,H-1-4")
public void test720p() throws Exception {
ArrayList<Pair<String, String>> mimeEncoderPairs = new ArrayList<>();
mimeEncoderPairs.add(mFirstPair);
mimeEncoderPairs.add(mSecondPair);
int maxInstances = checkAndGetMaxSupportedInstancesFor720p(mimeEncoderPairs);
- int secondPairInstances = maxInstances / 2;
- int firstPairInstances = maxInstances - secondPairInstances;
- ExecutorService pool = Executors.newFixedThreadPool(maxInstances);
- List<Encode> testList = new ArrayList<>();
- for (int i = 0; i < firstPairInstances; i++) {
- testList.add(new Encode(mFirstPair.first, mFirstPair.second, mIsAsync));
+ int requiredMinInstances = REQUIRED_MIN_CONCURRENT_INSTANCES;
+ if (mFirstPair.first.equals(MediaFormat.MIMETYPE_VIDEO_VP9)
+ || mSecondPair.first.equals(MediaFormat.MIMETYPE_VIDEO_VP9)) {
+ requiredMinInstances = REQUIRED_MIN_CONCURRENT_INSTANCES_FOR_VP9;
}
- for (int i = 0; i < secondPairInstances; i++) {
- testList.add(new Encode(mSecondPair.first, mSecondPair.second, mIsAsync));
- }
- List<Future<Double>> resultList = pool.invokeAll(testList);
- double achievedFrameRate = 0.0;
- for (Future<Double> result : resultList) {
- achievedFrameRate += result.get();
+ if (maxInstances >= requiredMinInstances) {
+ int secondPairInstances = maxInstances / 2;
+ int firstPairInstances = maxInstances - secondPairInstances;
+ ExecutorService pool = Executors.newFixedThreadPool(maxInstances);
+ List<Encode> testList = new ArrayList<>();
+ for (int i = 0; i < firstPairInstances; i++) {
+ testList.add(new Encode(mFirstPair.first, mFirstPair.second, mIsAsync));
+ }
+ for (int i = 0; i < secondPairInstances; i++) {
+ testList.add(new Encode(mSecondPair.first, mSecondPair.second, mIsAsync));
+ }
+ List<Future<Double>> resultList = pool.invokeAll(testList);
+ double achievedFrameRate = 0.0;
+ for (Future<Double> result : resultList) {
+ achievedFrameRate += result.get();
+ }
}
// Achieved frame rate is not compared as this test runs in byte buffer mode.
+ if (Utils.isPerfClass()) {
+ assertTrue("Encoder pair " + mFirstPair.second + " and " + mSecondPair.second
+ + " unable to support minimum concurrent instances. act/exp: " + maxInstances
+ + "/" + requiredMinInstances, maxInstances >= requiredMinInstances);
+ } else {
+ int pc = maxInstances >= requiredMinInstances ? Build.VERSION_CODES.R : 0;
+ DeviceReportLog log = new DeviceReportLog("MediaPerformanceClassLogs",
+ "MultiEncoderPairPerf_" + mFirstPair.second);
+ log.addValue("encoders",
+ mFirstPair.first + "_" + mFirstPair.second + "_" + mSecondPair.first + "_"
+ + mSecondPair.second, ResultType.NEUTRAL, ResultUnit.NONE);
+ log.setSummary("CDD 2.2.7.1/5.1/H-1-3,H-1-4 performance_class", pc, ResultType.NEUTRAL,
+ ResultUnit.NONE);
+ log.submit(InstrumentationRegistry.getInstrumentation());
+ }
}
}
diff --git a/tests/mediapc/src/android/mediapc/cts/MultiEncoderPerfTest.java b/tests/mediapc/src/android/mediapc/cts/MultiEncoderPerfTest.java
index 969dc19..f45c411 100644
--- a/tests/mediapc/src/android/mediapc/cts/MultiEncoderPerfTest.java
+++ b/tests/mediapc/src/android/mediapc/cts/MultiEncoderPerfTest.java
@@ -16,9 +16,16 @@
package android.mediapc.cts;
import android.media.MediaFormat;
+import android.os.Build;
import android.util.Pair;
import androidx.test.filters.LargeTest;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.compatibility.common.util.CddTest;
+import com.android.compatibility.common.util.DeviceReportLog;
+import com.android.compatibility.common.util.ResultType;
+import com.android.compatibility.common.util.ResultUnit;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -74,6 +81,7 @@
*/
@LargeTest
@Test(timeout = CodecTestBase.PER_TEST_TIMEOUT_LARGE_TEST_MS)
+ @CddTest(requirement="2.2.7.1/5.1/H-1-3,H-1-4")
public void test720p() throws Exception {
ArrayList<Pair<String, String>> mimeEncoderPairs = new ArrayList<>();
mimeEncoderPairs.add(Pair.create(mMime, mEncoderName));
@@ -82,19 +90,32 @@
if (mMime.equals(MediaFormat.MIMETYPE_VIDEO_VP9)) {
requiredMinInstances = REQUIRED_MIN_CONCURRENT_INSTANCES_FOR_VP9;
}
- assertTrue("Encoder " + mEncoderName + " unable to support minimum concurrent " +
- "instances. act/exp: " + maxInstances + "/" + requiredMinInstances,
- maxInstances >= requiredMinInstances);
- ExecutorService pool = Executors.newFixedThreadPool(maxInstances);
- List<Encode> testList = new ArrayList<>();
- for (int i = 0; i < maxInstances; i++) {
- testList.add(new Encode(mMime, mEncoderName, mIsAsync));
- }
- List<Future<Double>> resultList = pool.invokeAll(testList);
- double achievedFrameRate = 0.0;
- for (Future<Double> result : resultList) {
- achievedFrameRate += result.get();
+ if (maxInstances >= requiredMinInstances) {
+ ExecutorService pool = Executors.newFixedThreadPool(maxInstances);
+ List<Encode> testList = new ArrayList<>();
+ for (int i = 0; i < maxInstances; i++) {
+ testList.add(new Encode(mMime, mEncoderName, mIsAsync));
+ }
+ List<Future<Double>> resultList = pool.invokeAll(testList);
+ double achievedFrameRate = 0.0;
+ for (Future<Double> result : resultList) {
+ achievedFrameRate += result.get();
+ }
}
// Achieved frame rate is not compared as this test runs in byte buffer mode.
+ if (Utils.isPerfClass()) {
+ assertTrue("Encoder " + mEncoderName + " unable to support minimum concurrent " +
+ "instances. act/exp: " + maxInstances + "/" + requiredMinInstances,
+ maxInstances >= requiredMinInstances);
+ } else {
+ int pc = maxInstances >= requiredMinInstances ? Build.VERSION_CODES.R : 0;
+ DeviceReportLog log = new DeviceReportLog("MediaPerformanceClassLogs",
+ "MultiEncoderPerf_" + mEncoderName);
+ log.addValue("encoder", mMime + "_" + mEncoderName, ResultType.NEUTRAL,
+ ResultUnit.NONE);
+ log.setSummary("CDD 2.2.7.1/5.1/H-1-3,H-1-4 performance_class", pc, ResultType.NEUTRAL,
+ ResultUnit.NONE);
+ log.submit(InstrumentationRegistry.getInstrumentation());
+ }
}
}
diff --git a/tests/mediapc/src/android/mediapc/cts/MultiTranscoderPerfTest.java b/tests/mediapc/src/android/mediapc/cts/MultiTranscoderPerfTest.java
index 4854853..29c8dcb 100644
--- a/tests/mediapc/src/android/mediapc/cts/MultiTranscoderPerfTest.java
+++ b/tests/mediapc/src/android/mediapc/cts/MultiTranscoderPerfTest.java
@@ -16,11 +16,18 @@
package android.mediapc.cts;
import android.media.MediaFormat;
+import android.os.Build;
import android.util.Pair;
import android.view.Surface;
import androidx.test.filters.LargeTest;
import androidx.test.rule.ActivityTestRule;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.compatibility.common.util.CddTest;
+import com.android.compatibility.common.util.DeviceReportLog;
+import com.android.compatibility.common.util.ResultType;
+import com.android.compatibility.common.util.ResultUnit;
import org.junit.Rule;
import org.junit.Test;
@@ -98,6 +105,7 @@
*/
@LargeTest
@Test(timeout = CodecTestBase.PER_TEST_TIMEOUT_LARGE_TEST_MS)
+ @CddTest(requirement="2.2.7.1/5.1/H-1-5,H-1-6")
public void test720p() throws Exception {
ArrayList<Pair<String, String>> mimeCodecPairs = new ArrayList<>();
mimeCodecPairs.add(mDecoderPair);
@@ -108,40 +116,63 @@
|| mEncoderPair.first.equals(MediaFormat.MIMETYPE_VIDEO_VP9)) {
requiredMinInstances = REQUIRED_MIN_CONCURRENT_INSTANCES_FOR_VP9 / 2;
}
- assertTrue("DecodeMime: " + mDecoderPair.first + ", Decoder " + mDecoderPair.second +
- ", EncodeMime: " + mEncoderPair.first + ", Encoder: " + mEncoderPair.second +
- ", unable to support minimum concurrent instances. act/exp: " + maxInstances +
- "/" + requiredMinInstances, maxInstances >= requiredMinInstances);
- ExecutorService pool = Executors.newFixedThreadPool(maxInstances / 2 + maxInstances % 2);
- List<Transcode> transcodeList = new ArrayList<>();
- for (int i = 0; i < maxInstances / 2 ; i++) {
- transcodeList.add(new Transcode(mEncoderPair.first, mTestFiles.get(mDecoderPair.first),
- mDecoderPair.second, mEncoderPair.second, mIsAsync));
- }
double achievedFrameRate = 0.0;
- List<Future<Double>> decodeResultList = null;
- if (maxInstances % 2 == 1) {
- List<DecodeToSurface> decodeList = new ArrayList<>();
- mActivityRule.getActivity().waitTillSurfaceIsCreated();
- Surface surface = mActivityRule.getActivity().getSurface();
- assertTrue("Surface created is null.", surface != null);
- assertTrue("Surface created is invalid.", surface.isValid());
- mActivityRule.getActivity().setScreenParams(1280, 720, true);
- decodeList.add(new DecodeToSurface(mDecoderPair.first,
- mTestFiles.get(mDecoderPair.first), mDecoderPair.second, surface, mIsAsync));
- decodeResultList = pool.invokeAll(decodeList);
- }
- List<Future<Double>> transcodeResultList = pool.invokeAll(transcodeList);
- for (Future<Double> result : transcodeResultList) {
- achievedFrameRate += result.get();
- }
- if (decodeResultList != null) {
- for (Future<Double> result : decodeResultList) {
+ if (maxInstances >= requiredMinInstances) {
+ ExecutorService pool = Executors.newFixedThreadPool(
+ maxInstances / 2 + maxInstances % 2);
+ List<Transcode> transcodeList = new ArrayList<>();
+ for (int i = 0; i < maxInstances / 2; i++) {
+ transcodeList.add(
+ new Transcode(mEncoderPair.first, mTestFiles.get(mDecoderPair.first),
+ mDecoderPair.second, mEncoderPair.second, mIsAsync));
+ }
+ List<Future<Double>> decodeResultList = null;
+ if (maxInstances % 2 == 1) {
+ List<DecodeToSurface> decodeList = new ArrayList<>();
+ mActivityRule.getActivity().waitTillSurfaceIsCreated();
+ Surface surface = mActivityRule.getActivity().getSurface();
+ assertTrue("Surface created is null.", surface != null);
+ assertTrue("Surface created is invalid.", surface.isValid());
+ mActivityRule.getActivity().setScreenParams(1280, 720, true);
+ decodeList.add(new DecodeToSurface(mDecoderPair.first,
+ mTestFiles.get(mDecoderPair.first), mDecoderPair.second, surface,
+ mIsAsync));
+ decodeResultList = pool.invokeAll(decodeList);
+ }
+ List<Future<Double>> transcodeResultList = pool.invokeAll(transcodeList);
+ for (Future<Double> result : transcodeResultList) {
achievedFrameRate += result.get();
}
+ if (decodeResultList != null) {
+ for (Future<Double> result : decodeResultList) {
+ achievedFrameRate += result.get();
+ }
+ }
}
- assertTrue("Unable to achieve the maxFrameRate supported. act/exp: " + achievedFrameRate
- + "/" + mMaxFrameRate / 2 + " for " + maxInstances + " instances.",
- achievedFrameRate >= mMaxFrameRate / 2);
+ if (Utils.isPerfClass()) {
+ assertTrue("DecodeMime: " + mDecoderPair.first + ", Decoder " + mDecoderPair.second +
+ ", EncodeMime: " + mEncoderPair.first + ", Encoder: " + mEncoderPair.second +
+ ", unable to support minimum concurrent instances. act/exp: " + maxInstances +
+ "/" + requiredMinInstances, maxInstances >= requiredMinInstances);
+
+ assertTrue("Unable to achieve the maxFrameRate supported. act/exp: " + achievedFrameRate
+ + "/" + mMaxFrameRate / 2 + " for " + maxInstances + " instances.",
+ achievedFrameRate >= mMaxFrameRate / 2);
+ } else {
+ int pc = maxInstances >= requiredMinInstances && achievedFrameRate >= mMaxFrameRate / 2
+ ? Build.VERSION_CODES.R : 0;
+ DeviceReportLog log = new DeviceReportLog("MediaPerformanceClassLogs",
+ "MultiTranscoderPairPerf_" + mDecoderPair.second);
+ log.addValue("decoders", mDecoderPair.first + "_" + mDecoderPair.second + "_"
+ + mEncoderPair.first + "_" + mEncoderPair.second, ResultType.NEUTRAL,
+ ResultUnit.NONE);
+ log.addValue("achieved_framerate", achievedFrameRate, ResultType.HIGHER_BETTER,
+ ResultUnit.NONE);
+ log.addValue("expected_framerate", mMaxFrameRate, ResultType.NEUTRAL, ResultUnit.NONE);
+ log.setSummary("CDD 2.2.7.1/5.1/H-1-5,H-1-6 performance_class", pc, ResultType.NEUTRAL,
+ ResultUnit.NONE);
+ log.submit(InstrumentationRegistry.getInstrumentation());
+ }
+
}
}
diff --git a/tests/mediapc/src/android/mediapc/cts/PerformanceClassTest.java b/tests/mediapc/src/android/mediapc/cts/PerformanceClassTest.java
index e493dcd..0ace441 100644
--- a/tests/mediapc/src/android/mediapc/cts/PerformanceClassTest.java
+++ b/tests/mediapc/src/android/mediapc/cts/PerformanceClassTest.java
@@ -21,12 +21,17 @@
import android.app.ActivityManager;
import android.content.Context;
import android.content.pm.PackageManager;
+import android.os.Build;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.WindowManager;
import androidx.test.filters.SmallTest;
import androidx.test.platform.app.InstrumentationRegistry;
+import com.android.compatibility.common.util.CddTest;
+import com.android.compatibility.common.util.DeviceReportLog;
+import com.android.compatibility.common.util.ResultType;
+import com.android.compatibility.common.util.ResultUnit;
import org.junit.Assume;
import org.junit.Test;
@@ -66,16 +71,14 @@
}
@Test
+ @CddTest(requirement="2.2.7.3/7.1.1.1,7.1.1.3,7.6.1/H-1-1")
public void testMinimumMemory() {
+ Context context = InstrumentationRegistry.getInstrumentation().getContext();
- if (Utils.isSPerfClass()) {
- Context context = InstrumentationRegistry.getInstrumentation().getContext();
-
- // Verify minimum screen density and resolution
- assertMinDpiAndPixels(context, DENSITY_400, 1920, 1080);
- // Verify minimum memory
- assertMinMemoryMb(context, 6 * 1024);
- }
+ // Verify minimum screen density and resolution
+ assertMinDpiAndPixels(context, DENSITY_400, 1920, 1080);
+ // Verify minimum memory
+ assertMinMemoryMb(context, 6 * 1024);
}
/** Asserts that the given values conform to the specs in CDD */
@@ -92,11 +95,23 @@
Log.i(TAG, String.format("minDpi=%d minSize=%dx%dpix", minDpi, minLong, minShort));
Log.i(TAG, String.format("dpi=%d size=%dx%dpix", density, longPix, shortPix));
- assertTrue("Display density " + density + " must be at least " + minDpi + "dpi",
- density >= minDpi);
- assertTrue("Display resolution " + longPix + "x" + shortPix + "pix must be at least " +
- minLong + "x" + minShort + "pix",
- longPix >= minLong && shortPix >= minShort);
+ if (Utils.isPerfClass()) {
+ assertTrue("Display density " + density + " must be at least " + minDpi + "dpi",
+ density >= minDpi);
+ assertTrue("Display resolution " + longPix + "x" + shortPix + "pix must be at least " +
+ minLong + "x" + minShort + "pix",
+ longPix >= minLong && shortPix >= minShort);
+ } else {
+ int pc = density >= minDpi && longPix >= minLong && shortPix >= minShort
+ ? Build.VERSION_CODES.S : 0;
+ DeviceReportLog log = new DeviceReportLog("MediaPerformanceClassLogs", "Display");
+ log.addValue("DisplayDensity", density, ResultType.LOWER_BETTER, ResultUnit.NONE);
+ log.addValue("ResolutionLong", longPix, ResultType.LOWER_BETTER, ResultUnit.NONE);
+ log.addValue("ResolutionShort", shortPix, ResultType.LOWER_BETTER, ResultUnit.NONE);
+ log.setSummary("CDD 2.2.7.3/7.1.1.1,7.1.1.3/H-1-1 performance_class", pc,
+ ResultType.NEUTRAL, ResultUnit.NONE);
+ log.submit(InstrumentationRegistry.getInstrumentation());
+ }
}
/** Asserts that the given values conform to the specs in CDD 7.6.1 */
@@ -107,9 +122,18 @@
Log.i(TAG, String.format("minMb=%,d", minMb));
Log.i(TAG, String.format("totalMemoryMb=%,d", totalMemoryMb));
+ if (Utils.isPerfClass()) {
+ assertTrue(String.format("Does not meet minimum memory requirements (CDD 7.6.1)."
+ + "Found = %d, Minimum = %d", totalMemoryMb, minMb), totalMemoryMb >= minMb);
+ } else {
+ int pc = totalMemoryMb >= minMb ? Build.VERSION_CODES.S : 0;
+ DeviceReportLog log = new DeviceReportLog("MediaPerformanceClassLogs", "MinMemory");
+ log.addValue("MemoryMB", totalMemoryMb, ResultType.LOWER_BETTER, ResultUnit.NONE);
+ log.setSummary("CDD 2.2.7.3/7.6.1/H-1-1 performance_class", pc, ResultType.NEUTRAL,
+ ResultUnit.NONE);
+ log.submit(InstrumentationRegistry.getInstrumentation());
+ }
- assertTrue(String.format("Does not meet minimum memory requirements (CDD 7.6.1)."
- + "Found = %d, Minimum = %d", totalMemoryMb, minMb), totalMemoryMb >= minMb);
}
/**
diff --git a/tests/mediapc/src/android/mediapc/cts/Utils.java b/tests/mediapc/src/android/mediapc/cts/Utils.java
index c4038cf..d3510b6 100644
--- a/tests/mediapc/src/android/mediapc/cts/Utils.java
+++ b/tests/mediapc/src/android/mediapc/cts/Utils.java
@@ -16,19 +16,61 @@
package android.mediapc.cts;
+import static android.util.DisplayMetrics.DENSITY_400;
+
+import android.app.ActivityManager;
+import android.content.Context;
+import android.content.pm.PackageManager;
import android.os.Build;
+import android.os.SystemProperties;
+import android.util.DisplayMetrics;
import android.util.Log;
+import android.view.WindowManager;
+
+import com.android.compatibility.common.util.ApiLevelUtil;
+
+import static org.junit.Assume.assumeTrue;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+
/**
* Test utilities.
*/
/* package private */ class Utils {
- private static final int sPc = Build.VERSION.MEDIA_PERFORMANCE_CLASS;
+ private static final int sPc;
private static final String TAG = "PerformanceClassTestUtils";
+ public static final int DISPLAY_DPI;
+ public static final int MIN_DISPLAY_CANDIDATE_DPI = DENSITY_400;
+ public static final int DISPLAY_LONG_PIXELS;
+ public static final int MIN_DISPLAY_LONG_CANDIDATE_PIXELS = 1920;
+ public static final int DISPLAY_SHORT_PIXELS;
+ public static final int MIN_DISPLAY_SHORT_CANDIDATE_PIXELS = 1080;
+
+ public static final long TOTAL_MEMORY_MB;
+ // Media performance requires 6 GB minimum RAM, but keeping the following to 5 GB
+ // as activityManager.getMemoryInfo() returns around 5.4 GB on a 6 GB device.
+ public static final long MIN_MEMORY_PERF_CLASS_CANDIDATE_MB = 5 * 1024;
+
static {
- Log.d(TAG, "performance class is " + sPc);
+ sPc = ApiLevelUtil.isAtLeast(Build.VERSION_CODES.S) ? Build.VERSION.MEDIA_PERFORMANCE_CLASS
+ : SystemProperties.getInt("ro.odm.build.media_performance_class", 0);
+ Log.d(TAG, "performance class is " + sPc);
+
+ Context context = InstrumentationRegistry.getInstrumentation().getContext();
+ DisplayMetrics metrics = new DisplayMetrics();
+ WindowManager windowManager = context.getSystemService(WindowManager.class);
+ windowManager.getDefaultDisplay().getMetrics(metrics);
+ DISPLAY_DPI = metrics.densityDpi;
+ DISPLAY_LONG_PIXELS = Math.max(metrics.widthPixels, metrics.heightPixels);
+ DISPLAY_SHORT_PIXELS = Math.min(metrics.widthPixels, metrics.heightPixels);
+
+ ActivityManager activityManager = context.getSystemService(ActivityManager.class);
+ ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
+ activityManager.getMemoryInfo(memoryInfo);
+ TOTAL_MEMORY_MB = memoryInfo.totalMem / 1024 / 1024;
}
/**
@@ -41,14 +83,25 @@
}
public static boolean isSPerfClass() {
- return sPc == Build.VERSION_CODES.R + 1; /* TODO: make this S */
+ return sPc == Build.VERSION_CODES.S;
}
/**
* Latest defined media performance class.
*/
- /* TODO: make this S */
- private static final int LAST_PERFORMANCE_CLASS = Build.VERSION_CODES.R + 1;
+ private static final int LAST_PERFORMANCE_CLASS = Build.VERSION_CODES.S;
+
+ public static boolean isHandheld() {
+ // handheld nature is not exposed to package manager, for now
+ // we check for touchscreen and NOT watch and NOT tv
+ PackageManager pm =
+ InstrumentationRegistry.getInstrumentation().getContext().getPackageManager();
+ return pm.hasSystemFeature(pm.FEATURE_TOUCHSCREEN)
+ && !pm.hasSystemFeature(pm.FEATURE_WATCH)
+ && !pm.hasSystemFeature(pm.FEATURE_TELEVISION)
+ && !pm.hasSystemFeature(pm.FEATURE_AUTOMOTIVE);
+ }
+
public static int getPerfClass() {
return sPc;
@@ -58,4 +111,28 @@
return sPc >= FIRST_PERFORMANCE_CLASS &&
sPc <= LAST_PERFORMANCE_CLASS;
}
+
+ public static boolean meetsPerformanceClassPreconditions() {
+ if (isPerfClass()) {
+ return true;
+ }
+
+ // If device doesn't advertise performance class, check if this can be ruled out as a
+ // candidate for performance class tests.
+ if (!isHandheld() ||
+ TOTAL_MEMORY_MB < MIN_MEMORY_PERF_CLASS_CANDIDATE_MB ||
+ DISPLAY_DPI < MIN_DISPLAY_CANDIDATE_DPI ||
+ DISPLAY_LONG_PIXELS < MIN_DISPLAY_LONG_CANDIDATE_PIXELS ||
+ DISPLAY_SHORT_PIXELS < MIN_DISPLAY_SHORT_CANDIDATE_PIXELS) {
+ return false;
+ }
+ return true;
+ }
+
+ public static void assumeDeviceMeetsPerformanceClassPreconditions() {
+ assumeTrue(
+ "Test skipped because the device does not meet the hardware requirements for "
+ + "performance class.",
+ meetsPerformanceClassPreconditions());
+ }
}
diff --git a/tests/rotationresolverservice/Android.bp b/tests/rotationresolverservice/Android.bp
new file mode 100644
index 0000000..ba2218b
--- /dev/null
+++ b/tests/rotationresolverservice/Android.bp
@@ -0,0 +1,52 @@
+// Copyright (C) 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT 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 {
+ // See: http://go/android-license-faq
+ default_applicable_licenses: [
+ "Android-Apache-2.0",
+ ],
+}
+
+android_test {
+ name: "CtsRotationResolverServiceDeviceTestCases",
+ defaults: ["cts_defaults"],
+ dex_preopt: {
+ enabled: false,
+ },
+ optimize: {
+ enabled: false,
+ },
+ static_libs: [
+ "androidx.test.rules",
+ "androidx.test.ext.junit",
+ "compatibility-device-util-axt",
+ "platform-test-annotations",
+ "compatibility-device-util-axt",
+ "cts-wm-util",
+ "android-common",
+ "android-support-v4",
+ ],
+ libs: [
+ "android.test.base",
+ "android.test.runner",
+ ],
+ srcs: ["src/**/*.java"],
+ // Tag this module as a cts test artifact
+ test_suites: [
+ "cts",
+ "general-tests",
+ ],
+ sdk_version: "test_current",
+}
diff --git a/tests/rotationresolverservice/Android.mk b/tests/rotationresolverservice/Android.mk
deleted file mode 100644
index aaaafbc..0000000
--- a/tests/rotationresolverservice/Android.mk
+++ /dev/null
@@ -1,55 +0,0 @@
-# Copyright (C) 2021 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT 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)
-
-# Don't include this package in any target
-LOCAL_MODULE_TAGS := tests
-
-# When built, explicitly put it in the data partition.
-LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-
-LOCAL_DEX_PREOPT := false
-
-LOCAL_PROGUARD_ENABLED := disabled
-
-LOCAL_STATIC_JAVA_LIBRARIES := \
- androidx.test.rules \
- androidx.test.ext.junit \
- compatibility-device-util-axt \
- platform-test-annotations \
- compatibility-device-util-axt \
- cts-wm-util \
- android-common \
- android-support-v4 \
-
-LOCAL_JAVA_LIBRARIES := \
- android.test.base \
- android.test.runner \
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-# Tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts general-tests
-
-LOCAL_PACKAGE_NAME := CtsRotationResolverServiceDeviceTestCases
-LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
-LOCAL_LICENSE_CONDITIONS := notice
-
-LOCAL_SDK_VERSION := test_current
-
-include $(BUILD_CTS_PACKAGE)
-
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/signature/api-check/OWNERS b/tests/signature/api-check/OWNERS
index c8305d1..2e21bf8 100644
--- a/tests/signature/api-check/OWNERS
+++ b/tests/signature/api-check/OWNERS
@@ -1,7 +1,6 @@
# Bug component: 24949
-platform-compat-eng+reviews@google.com
-andreionea@google.com
-mathewi@google.com
ngeoffray@google.com
paulduffin@google.com
+andreionea@google.com
+mathewi@google.com
satayev@google.com
diff --git a/tests/signature/api-check/hidden-api-blocklist-current-api/OWNERS b/tests/signature/api-check/hidden-api-blocklist-current-api/OWNERS
deleted file mode 100644
index 39dbe17..0000000
--- a/tests/signature/api-check/hidden-api-blocklist-current-api/OWNERS
+++ /dev/null
@@ -1,7 +0,0 @@
-# Bug component: 610774
-platform-compat-eng+reviews@google.com
-andreionea@google.com
-atrost@google.com
-mathewi@google.com
-ngeoffray@google.com
-satayev@google.com
diff --git a/tests/signature/api-check/hidden-api-blocklist-test-api/OWNERS b/tests/signature/api-check/hidden-api-blocklist-test-api/OWNERS
deleted file mode 100644
index 66ea541..0000000
--- a/tests/signature/api-check/hidden-api-blocklist-test-api/OWNERS
+++ /dev/null
@@ -1,9 +0,0 @@
-# Bug component: 610774
-
-# Use this reviewer by default.
-platform-compat-eng+reviews@google.com
-
-andreionea@google.com
-mathewi@google.com
-ngeoffray@google.com
-satayev@google.com
diff --git a/tests/tests/app.usage/src/android/app/usage/cts/UsageStatsTest.java b/tests/tests/app.usage/src/android/app/usage/cts/UsageStatsTest.java
index f90bd5d..1aa05ef 100644
--- a/tests/tests/app.usage/src/android/app/usage/cts/UsageStatsTest.java
+++ b/tests/tests/app.usage/src/android/app/usage/cts/UsageStatsTest.java
@@ -909,6 +909,8 @@
@AppModeFull(reason = "Test APK Activity not found when installed as an instant app")
@Test
public void testIsAppInactive() throws Exception {
+ assumeTrue("Test only works on devices with a battery", BatteryUtils.hasBattery());
+
setStandByBucket(mTargetPackage, "rare");
try {
@@ -954,6 +956,8 @@
@AppModeFull(reason = "Test APK Activity not found when installed as an instant app")
@Test
public void testIsAppInactive_Charging() throws Exception {
+ assumeTrue("Test only works on devices with a battery", BatteryUtils.hasBattery());
+
setStandByBucket(TEST_APP_PKG, "rare");
try {
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/test_ibinder.cpp b/tests/tests/binder_ndk/libbinder_ndk_test/test_ibinder.cpp
index 343a224..4b0c129 100644
--- a/tests/tests/binder_ndk/libbinder_ndk_test/test_ibinder.cpp
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/test_ibinder.cpp
@@ -165,7 +165,7 @@
AIBinder_decStrong(binder);
- AIBinder* promoted = AIBinder_Weak_promote(weak);
+ AIBinder* promoted = AIBinder_Weak_promote(copy);
EXPECT_EQ(nullptr, promoted);
AIBinder_Weak_delete(copy);
diff --git a/tests/tests/car/AndroidTest.xml b/tests/tests/car/AndroidTest.xml
index 7b44a58..f3d0aa7 100644
--- a/tests/tests/car/AndroidTest.xml
+++ b/tests/tests/car/AndroidTest.xml
@@ -18,7 +18,7 @@
type="module_controller"/>
<option name="test-suite-tag" value="cts"/>
<option name="config-descriptor:metadata" key="component" value="auto"/>
- <option name="config-descriptor:metadata" key="parameter" value="instant_app"/>
+ <option name="config-descriptor:metadata" key="parameter" value="not_instant_app"/>
<option name="config-descriptor:metadata" key="parameter" value="multi_abi"/>
<option name="config-descriptor:metadata" key="parameter" value="secondary_user"/>
diff --git a/tests/tests/carrierapi/src/android/carrierapi/cts/CarrierApiTest.java b/tests/tests/carrierapi/src/android/carrierapi/cts/CarrierApiTest.java
index b6ee78c..aac7049 100644
--- a/tests/tests/carrierapi/src/android/carrierapi/cts/CarrierApiTest.java
+++ b/tests/tests/carrierapi/src/android/carrierapi/cts/CarrierApiTest.java
@@ -520,6 +520,10 @@
mTelephonyManager.getServiceState();
mTelephonyManager.getManualNetworkSelectionPlmn();
mTelephonyManager.setForbiddenPlmns(new ArrayList<String>());
+ int activeModemCount = mTelephonyManager.getActiveModemCount();
+ for (int i = 0; i < activeModemCount; i++) {
+ mTelephonyManager.isModemEnabledForSlot(i);
+ }
} catch (SecurityException e) {
fail(NO_CARRIER_PRIVILEGES_FAILURE_MESSAGE);
}
diff --git a/tests/tests/content/src/android/content/pm/cts/ApplicationInfoTest.java b/tests/tests/content/src/android/content/pm/cts/ApplicationInfoTest.java
index ae3e7cd..a77433f5 100644
--- a/tests/tests/content/src/android/content/pm/cts/ApplicationInfoTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/ApplicationInfoTest.java
@@ -31,6 +31,7 @@
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeFalse;
import static org.junit.Assume.assumeNotNull;
import android.content.Context;
@@ -38,6 +39,7 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
+import android.os.Build;
import android.os.Environment;
import android.os.Parcel;
import android.os.Process;
@@ -291,6 +293,10 @@
@Test
public void testIsProduct() throws Exception {
+ // The product flag is supported since P. Suppose that devices lauch on Android P may not
+ // have product partition.
+ assumeFalse(Build.VERSION.DEVICE_INITIAL_SDK_INT <= Build.VERSION_CODES.P);
+
final String systemPath = Environment.getRootDirectory().getAbsolutePath();
final String productPath = Environment.getProductDirectory().getAbsolutePath();
final String packageName = getPartitionFirstPackageName(systemPath, productPath);
diff --git a/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandIncrementalTest.java b/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandIncrementalTest.java
index 8470a12..c8410f3 100644
--- a/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandIncrementalTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandIncrementalTest.java
@@ -154,10 +154,17 @@
public void testAndroid12RequiresIncFsV2() throws Exception {
// IncFS is a kernel feature, which is a subject to vendor freeze. That's why
// the test verifies the vendor API level here, not the system's one.
- final boolean v2Required = PropertyUtil.isVendorApiLevelNewerThan(30);
+ // Note: vendor API level getter returns either the frozen API level, or the current one for
+ // non-vendor-freeze devices; need to verify both the system first API level and vendor
+ // level to make the final decision.
+ final boolean v2ReqdForSystem = PropertyUtil.getFirstApiLevel() > 30;
+ final boolean v2ReqdForVendor = PropertyUtil.isVendorApiLevelNewerThan(30);
+ final boolean v2Required = v2ReqdForSystem && v2ReqdForVendor;
if (v2Required) {
- Assert.assertTrue(getPackageManager().hasSystemFeature(
- PackageManager.FEATURE_INCREMENTAL_DELIVERY, 2));
+ Assert.assertTrue("Devices launched at API 31+ with a vendor partition of API 31+ need "
+ + "to support Incremental Delivery version 2 or higher",
+ getPackageManager().hasSystemFeature(
+ PackageManager.FEATURE_INCREMENTAL_DELIVERY, 2));
}
}
diff --git a/tests/tests/deviceconfig/OWNERS b/tests/tests/deviceconfig/OWNERS
index ac6ec2d..8553170 100644
--- a/tests/tests/deviceconfig/OWNERS
+++ b/tests/tests/deviceconfig/OWNERS
@@ -1,4 +1,4 @@
# Bug component: 326016
-hongyiz@google.com
-shuc@google.com
+fdunlap@google.com
+jiewenlei@google.com
svetoslavganov@google.com
diff --git a/tests/tests/display/src/android/display/cts/DisplayTest.java b/tests/tests/display/src/android/display/cts/DisplayTest.java
index a495285..7385be8 100644
--- a/tests/tests/display/src/android/display/cts/DisplayTest.java
+++ b/tests/tests/display/src/android/display/cts/DisplayTest.java
@@ -577,24 +577,25 @@
Display.Mode[] modes = mDefaultDisplay.getSupportedModes();
assumeTrue("Need two or more display modes to exercise switching.", modes.length > 1);
- // Create a deterministically shuffled list of display modes, which ends with the
- // current active mode. We'll switch to the modes in this order. The active mode is last
- // so we don't need an extra mode switch in case the test completes successfully.
- Display.Mode activeMode = mDefaultDisplay.getMode();
- List<Display.Mode> modesList = new ArrayList<>(modes.length);
- for (Display.Mode mode : modes) {
- if (mode.getModeId() != activeMode.getModeId()) {
- modesList.add(mode);
- }
- }
- Random random = new Random(42);
- Collections.shuffle(modesList, random);
- modesList.add(activeMode);
-
try {
mDisplayManager.setShouldAlwaysRespectAppRequestedMode(true);
assertTrue(mDisplayManager.shouldAlwaysRespectAppRequestedMode());
final DisplayTestActivity activity = launchActivity(mRetainedDisplayTestActivity);
+
+ // Create a deterministically shuffled list of display modes, which ends with the
+ // current active mode. We'll switch to the modes in this order. The active mode is last
+ // so we don't need an extra mode switch in case the test completes successfully.
+ Display.Mode activeMode = mDefaultDisplay.getMode();
+ List<Display.Mode> modesList = new ArrayList<>(modes.length);
+ for (Display.Mode mode : modes) {
+ if (mode.getModeId() != activeMode.getModeId()) {
+ modesList.add(mode);
+ }
+ }
+ Random random = new Random(42);
+ Collections.shuffle(modesList, random);
+ modesList.add(activeMode);
+
for (Display.Mode mode : modesList) {
testSwitchToModeId(activity, mode);
}
diff --git a/tests/tests/hardware/src/android/hardware/cts/SecurityModelFeatureTest.java b/tests/tests/hardware/src/android/hardware/cts/SecurityModelFeatureTest.java
index 810aebc..b94877f 100644
--- a/tests/tests/hardware/src/android/hardware/cts/SecurityModelFeatureTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/SecurityModelFeatureTest.java
@@ -16,14 +16,15 @@
package android.hardware.cts;
-import static android.os.Build.VERSION;
import static android.os.Build.VERSION_CODES;
+import static com.android.compatibility.common.util.PropertyUtil.getFirstApiLevel;
+import static com.android.compatibility.common.util.PropertyUtil.getVendorApiLevel;
+
import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeTrue;
import android.content.pm.PackageManager;
-import android.os.SystemProperties;
import androidx.test.InstrumentationRegistry;
import androidx.test.runner.AndroidJUnit4;
@@ -47,8 +48,7 @@
@Before
public void setUp() throws Exception {
- final int firstApiLevel =
- SystemProperties.getInt("ro.product.first_api_level", VERSION.SDK_INT);
+ final int firstApiLevel = Math.min(getFirstApiLevel(), getVendorApiLevel());
assumeTrue("Skipping test: it only applies to devices that first shipped with S or later.",
firstApiLevel >= VERSION_CODES.S);
diff --git a/tests/tests/jni/libjnitest/android_jni_cts_LinkerNamespacesTest.cpp b/tests/tests/jni/libjnitest/android_jni_cts_LinkerNamespacesTest.cpp
index f2f2a85..45b2683 100644
--- a/tests/tests/jni/libjnitest/android_jni_cts_LinkerNamespacesTest.cpp
+++ b/tests/tests/jni/libjnitest/android_jni_cts_LinkerNamespacesTest.cpp
@@ -49,16 +49,35 @@
#endif
static const std::string kSystemLibraryPath = "/system/" LIB_DIR;
-static const std::string kArtApexLibraryPath = "/apex/com.android.art/" LIB_DIR;
static const std::string kVendorLibraryPath = "/vendor/" LIB_DIR;
static const std::string kProductLibraryPath = "/product/" LIB_DIR;
+// APEX library paths to check for either presence or absence of public
+// libraries.
+static const std::vector<std::string> kApexLibraryPaths = {
+ "/apex/com.android.art/" LIB_DIR,
+ "/apex/com.android.i18n/" LIB_DIR,
+ "/apex/com.android.neuralnetworks/" LIB_DIR,
+ "/apex/com.android.runtime/" LIB_DIR,
+};
+
static const std::vector<std::regex> kSystemPathRegexes = {
std::regex("/system/lib(64)?"),
std::regex("/apex/com\\.android\\.[^/]*/lib(64)?"),
std::regex("/system/(lib/arm|lib64/arm64)"), // when CTS runs in ARM ABI on non-ARM CPU. http://b/149852946
};
+// Full paths to libraries in system or APEX search paths that are not public
+// but still may or may not be possible to load in an app.
+static const std::vector<std::string> kOtherLoadableLibrariesInSearchPaths = {
+ // This library may be loaded using DF_1_GLOBAL into the global group in
+ // app_process, which is necessary to make it override some symbols in libc in
+ // all DSO's. As a side effect it also gets inherited into the classloader
+ // namespaces constructed in libnativeloader, and is hence possible to dlopen
+ // even though there is no linker namespace link for it.
+ "/apex/com.android.art/" LIB_DIR "/libsigchain.so",
+};
+
static const std::string kWebViewPlatSupportLib = "libwebviewchromium_plat_support.so";
static bool is_directory(const char* path) {
@@ -171,6 +190,24 @@
return error;
}
+static bool skip_subdir_load_check(const std::string& path) {
+ static bool vndk_lite = android::base::GetBoolProperty("ro.vndk.lite", false);
+ static const std::string system_vndk_dir = kSystemLibraryPath + "/vndk-sp-";
+ return vndk_lite && android::base::StartsWith(path, system_vndk_dir);
+}
+
+// Checks that a .so library can or cannot be loaded with dlopen() and
+// System.load(), as appropriate by the other settings:
+// - clazz: The java class instance of android.jni.cts.LinkerNamespacesHelper,
+// used for calling System.load() and System.loadLibrary().
+// - path: Full path to the library to load.
+// - library_search_paths: Directories that should be searched for public
+// libraries. They should not be loaded from a subdirectory of these.
+// - public_library_basenames: File names without paths of expected public
+// libraries.
+// - test_system_load_library: Try loading with System.loadLibrary() as well.
+// - check_absence: Raise an error if it is a non-public library but still is
+// loaded successfully from a searched directory.
static bool check_lib(JNIEnv* env,
jclass clazz,
const std::string& path,
@@ -210,7 +247,7 @@
return false;
}
} else { // !is_in_search_path
- if (loaded) {
+ if (loaded && !skip_subdir_load_check(path)) {
errors->push_back("The library \"" + path +
"\" is a public library that was loaded from a subdirectory.");
return false;
@@ -220,7 +257,10 @@
// If the library loaded successfully but is in a subdirectory then it is
// still not public. That is the case e.g. for
// /apex/com.android.runtime/lib{,64}/bionic/lib*.so.
- if (loaded && is_in_search_path && check_absence) {
+ if (loaded && is_in_search_path && check_absence &&
+ (std::find(kOtherLoadableLibrariesInSearchPaths.begin(),
+ kOtherLoadableLibrariesInSearchPaths.end(), path) ==
+ kOtherLoadableLibrariesInSearchPaths.end())) {
errors->push_back("The library \"" + path + "\" is not a public library but it loaded.");
return false;
}
@@ -234,6 +274,7 @@
return true;
}
+// Calls check_lib for every file found recursively within library_path.
static bool check_path(JNIEnv* env,
jclass clazz,
const std::string& library_path,
@@ -279,8 +320,8 @@
static bool jobject_array_to_set(JNIEnv* env,
jobjectArray java_libraries_array,
std::unordered_set<std::string>* libraries,
- std::string* error_msg) {
- error_msg->clear();
+ std::string* error_msgs) {
+ error_msgs->clear();
size_t size = env->GetArrayLength(java_libraries_array);
bool success = true;
for (size_t i = 0; i<size; ++i) {
@@ -290,7 +331,7 @@
// Verify that the name doesn't contain any directory components.
if (soname.rfind('/') != std::string::npos) {
- *error_msg += "\n---Illegal value, no directories allowed: " + soname;
+ *error_msgs += "\n---Illegal value, no directories allowed: " + soname;
continue;
}
@@ -300,7 +341,7 @@
if (space_pos != std::string::npos) {
std::string type = soname.substr(space_pos + 1);
if (type != "32" && type != "64") {
- *error_msg += "\n---Illegal value at end of line (only 32 or 64 allowed): " + soname;
+ *error_msgs += "\n---Illegal value at end of line (only 32 or 64 allowed): " + soname;
success = false;
continue;
}
@@ -332,21 +373,21 @@
JNIEnv* env,
jclass clazz,
jobjectArray java_system_public_libraries,
- jobjectArray java_runtime_public_libraries) {
+ jobjectArray java_apex_public_libraries) {
bool success = true;
std::vector<std::string> errors;
- std::string error_msg;
+ std::string error_msgs;
std::unordered_set<std::string> system_public_libraries;
if (!jobject_array_to_set(env, java_system_public_libraries, &system_public_libraries,
- &error_msg)) {
+ &error_msgs)) {
success = false;
- errors.push_back("Errors in system public library file:" + error_msg);
+ errors.push_back("Errors in system public library list:" + error_msgs);
}
- std::unordered_set<std::string> runtime_public_libraries;
- if (!jobject_array_to_set(env, java_runtime_public_libraries, &runtime_public_libraries,
- &error_msg)) {
+ std::unordered_set<std::string> apex_public_libraries;
+ if (!jobject_array_to_set(env, java_apex_public_libraries, &apex_public_libraries,
+ &error_msgs)) {
success = false;
- errors.push_back("Errors in runtime public library file:" + error_msg);
+ errors.push_back("Errors in APEX public library list:" + error_msgs);
}
// Check the system libraries.
@@ -362,8 +403,8 @@
// /apex/com.android.*/lib*.
std::unordered_set<std::string> system_library_search_paths;
- for (const auto& path : library_search_paths) {
- for (const auto& regex : kSystemPathRegexes) {
+ for (const std::string& path : library_search_paths) {
+ for (const std::regex& regex : kSystemPathRegexes) {
if (std::regex_match(path, regex)) {
system_library_search_paths.insert(path);
break;
@@ -374,7 +415,7 @@
// These paths should be tested too - this is because apps may rely on some
// libraries being available there.
system_library_search_paths.insert(kSystemLibraryPath);
- system_library_search_paths.insert(kArtApexLibraryPath);
+ system_library_search_paths.insert(kApexLibraryPaths.begin(), kApexLibraryPaths.end());
if (!check_path(env, clazz, kSystemLibraryPath, system_library_search_paths,
system_public_libraries,
@@ -387,17 +428,19 @@
// don't complain about that in that case.
bool check_absence = !android::base::GetBoolProperty("ro.vndk.lite", false);
- // Check the runtime libraries.
- if (!check_path(env, clazz, kArtApexLibraryPath, {kArtApexLibraryPath},
- runtime_public_libraries,
- /*test_system_load_library=*/true,
- check_absence, &errors)) {
- success = false;
+ // Check the APEX libraries.
+ for (const std::string& apex_path : kApexLibraryPaths) {
+ if (!check_path(env, clazz, apex_path, {apex_path},
+ apex_public_libraries,
+ /*test_system_load_library=*/true,
+ check_absence, &errors)) {
+ success = false;
+ }
}
if (!success) {
std::string error_str;
- for (const auto& line : errors) {
+ for (const std::string& line : errors) {
error_str += line + '\n';
}
return env->NewStringUTF(error_str.c_str());
diff --git a/tests/tests/jni/src/android/jni/cts/LinkerNamespacesHelper.java b/tests/tests/jni/src/android/jni/cts/LinkerNamespacesHelper.java
index 796fbd8..1f4f351 100644
--- a/tests/tests/jni/src/android/jni/cts/LinkerNamespacesHelper.java
+++ b/tests/tests/jni/src/android/jni/cts/LinkerNamespacesHelper.java
@@ -63,7 +63,6 @@
"libmediandk.so",
"libm.so",
"libnativewindow.so",
- "libneuralnetworks.so",
"libOpenMAXAL.so",
"libOpenSLES.so",
"libRS.so",
@@ -78,12 +77,16 @@
"libclang_rt.hwasan-aarch64-android.so"
};
- // Libraries listed in public.libraries.android.txt, located in /apex/com.android.art/${LIB}
- private final static String[] PUBLIC_ART_LIBRARIES = {
+ // Libraries listed in public.libraries.android.txt that are located in APEXes
+ private final static String[] PUBLIC_APEX_LIBRARIES = {
+ // Libraries in /apex/com.android.i18n/${LIB}
+ "libicu.so",
"libicui18n.so",
"libicuuc.so",
+ // Libraries in /apex/com.android.art/${LIB}
"libnativehelper.so",
- "libsigchain.so"
+ // Libraries in /apex/com.android.neuralnetworks/${LIB}
+ "libneuralnetworks.so",
};
// The grey-list.
@@ -185,13 +188,13 @@
public static String runAccessibilityTest() throws IOException {
List<String> systemLibs = new ArrayList<>();
- List<String> artApexLibs = new ArrayList<>();
+ List<String> apexLibs = new ArrayList<>();
Collections.addAll(systemLibs, PUBLIC_SYSTEM_LIBRARIES);
Collections.addAll(systemLibs, OPTIONAL_SYSTEM_LIBRARIES);
- // System path could contain public ART libraries on foreign arch. http://b/149852946
+ // System path could contain public ART libraries on foreign arch. http://b/149852946
if (isForeignArchitecture()) {
- Collections.addAll(systemLibs, PUBLIC_ART_LIBRARIES);
+ Collections.addAll(systemLibs, PUBLIC_APEX_LIBRARIES);
}
if (InstrumentationRegistry.getContext().getPackageManager().
@@ -199,7 +202,7 @@
systemLibs.add(WEBVIEW_PLAT_SUPPORT_LIB);
}
- Collections.addAll(artApexLibs, PUBLIC_ART_LIBRARIES);
+ Collections.addAll(apexLibs, PUBLIC_APEX_LIBRARIES);
// Check if /system/etc/public.libraries-company.txt and /product/etc/public.libraries
// -company.txt files are well-formed. The libraries however are not loaded for test;
@@ -232,11 +235,11 @@
}
return runAccessibilityTestImpl(systemLibs.toArray(new String[systemLibs.size()]),
- artApexLibs.toArray(new String[artApexLibs.size()]));
+ apexLibs.toArray(new String[apexLibs.size()]));
}
private static native String runAccessibilityTestImpl(String[] publicSystemLibs,
- String[] publicRuntimeLibs);
+ String[] publicApexLibs);
private static void invokeIncrementGlobal(Class<?> clazz) throws Exception {
clazz.getMethod("incrementGlobal").invoke(null);
@@ -385,7 +388,7 @@
String error = null;
List<String> publicLibs = new ArrayList<>();
Collections.addAll(publicLibs, PUBLIC_SYSTEM_LIBRARIES);
- Collections.addAll(publicLibs, PUBLIC_ART_LIBRARIES);
+ Collections.addAll(publicLibs, PUBLIC_APEX_LIBRARIES);
for (String lib : publicLibs) {
String result = LinkerNamespacesHelper.tryDlopen(lib);
if (result != null) {
diff --git a/tests/tests/keystore/src/android/keystore/cts/CipherTest.java b/tests/tests/keystore/src/android/keystore/cts/CipherTest.java
index b56c7bf..562910b 100644
--- a/tests/tests/keystore/src/android/keystore/cts/CipherTest.java
+++ b/tests/tests/keystore/src/android/keystore/cts/CipherTest.java
@@ -298,7 +298,6 @@
public void performDeviceUnlock() throws Exception {
mLockCredential.gotoKeyguard();
UiDeviceUtils.pressUnlockButton();
- SystemClock.sleep(200);
mLockCredential.enterAndConfirmLockCredential();
launchHomeActivity();
KeyguardManager keyguardManager = (KeyguardManager)getContext().getSystemService(
diff --git a/tests/tests/media/Android.bp b/tests/tests/media/Android.bp
index f1248d8..c88882b 100644
--- a/tests/tests/media/Android.bp
+++ b/tests/tests/media/Android.bp
@@ -26,13 +26,13 @@
java_library {
name: "ctsmediautil",
srcs: [
- "src/android/media/cts/CodecImage.java",
- "src/android/media/cts/YUVImage.java",
- "src/android/media/cts/CodecUtils.java",
- "src/android/media/cts/CodecState.java",
- "src/android/media/cts/MediaCodecTunneledPlayer.java",
- "src/android/media/cts/MediaTimeProvider.java",
- "src/android/media/cts/NonBlockingAudioTrack.java",
+ "common/src/android/media/cts/CodecImage.java",
+ "common/src/android/media/cts/YUVImage.java",
+ "common/src/android/media/cts/CodecUtils.java",
+ "common/src/android/media/cts/CodecState.java",
+ "common/src/android/media/cts/MediaCodecTunneledPlayer.java",
+ "common/src/android/media/cts/MediaTimeProvider.java",
+ "common/src/android/media/cts/NonBlockingAudioTrack.java",
],
static_libs: [
"compatibility-device-util-axt",
@@ -54,33 +54,9 @@
}
android_library {
- name: "cts-media-drm-common",
+ name: "cts-media-common",
srcs: [
- "src/android/media/cts/AudioHelper.java",
- "src/android/media/cts/AudioManagerStub.java",
- "src/android/media/cts/AudioManagerStubHelper.java",
- "src/android/media/cts/AudioRecordNative.java",
- "src/android/media/cts/AudioTrackNative.java",
- "src/android/media/cts/CodecState.java",
- "src/android/media/cts/ConnectionStatus.java",
- "src/android/media/cts/IConnectionStatus.java",
- "src/android/media/cts/InputSurface.java",
- "src/android/media/cts/InputSurfaceInterface.java",
- "src/android/media/cts/MediaCodecBlockModelHelper.java",
- "src/android/media/cts/MediaCodecClearKeyPlayer.java",
- "src/android/media/cts/MediaCodecPlayerTestBase.java",
- "src/android/media/cts/MediaCodecWrapper.java",
- "src/android/media/cts/MediaTimeProvider.java",
- "src/android/media/cts/MediaStubActivity.java",
- "src/android/media/cts/NdkInputSurface.java",
- "src/android/media/cts/NdkMediaCodec.java",
- "src/android/media/cts/NonBlockingAudioTrack.java",
- "src/android/media/cts/NonMediaMainlineTest.java",
- "src/android/media/cts/OutputSurface.java",
- "src/android/media/cts/Preconditions.java",
- "src/android/media/cts/TestMediaDataSource.java",
- "src/android/media/cts/TestUtils.java",
- "src/android/media/cts/TextureRender.java",
+ "common/src/**/*.java",
],
static_libs: [
"androidx.heifwriter_heifwriter",
@@ -114,7 +90,7 @@
"ctstestrunner-axt",
"hamcrest-library",
"ctstestserver",
- "cts-media-drm-common",
+ "cts-media-common",
"cts-media-res-lib",
"junit",
"junit-params",
diff --git a/tests/tests/media/assets/audio_only/00.aac b/tests/tests/media/assets/audio_only/00.aac
deleted file mode 100644
index 1c620bf..0000000
--- a/tests/tests/media/assets/audio_only/00.aac
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/00.key b/tests/tests/media/assets/audio_only/00.key
deleted file mode 100644
index eb61918..0000000
--- a/tests/tests/media/assets/audio_only/00.key
+++ /dev/null
@@ -1 +0,0 @@
-ëÝbñhÒ{hï*üä®<
\ No newline at end of file
diff --git a/tests/tests/media/assets/audio_only/01.aac b/tests/tests/media/assets/audio_only/01.aac
deleted file mode 100644
index dc23c48..0000000
--- a/tests/tests/media/assets/audio_only/01.aac
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/02.aac b/tests/tests/media/assets/audio_only/02.aac
deleted file mode 100644
index 1dd827d..0000000
--- a/tests/tests/media/assets/audio_only/02.aac
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/03.aac b/tests/tests/media/assets/audio_only/03.aac
deleted file mode 100644
index f6fd0c0..0000000
--- a/tests/tests/media/assets/audio_only/03.aac
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/04.aac b/tests/tests/media/assets/audio_only/04.aac
deleted file mode 100644
index 60d0aef..0000000
--- a/tests/tests/media/assets/audio_only/04.aac
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/05.aac b/tests/tests/media/assets/audio_only/05.aac
deleted file mode 100644
index 2875292..0000000
--- a/tests/tests/media/assets/audio_only/05.aac
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/06.aac b/tests/tests/media/assets/audio_only/06.aac
deleted file mode 100644
index dd0413f..0000000
--- a/tests/tests/media/assets/audio_only/06.aac
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/07.aac b/tests/tests/media/assets/audio_only/07.aac
deleted file mode 100644
index 5d63cef..0000000
--- a/tests/tests/media/assets/audio_only/07.aac
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/08.aac b/tests/tests/media/assets/audio_only/08.aac
deleted file mode 100644
index 402cd72..0000000
--- a/tests/tests/media/assets/audio_only/08.aac
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/09.aac b/tests/tests/media/assets/audio_only/09.aac
deleted file mode 100644
index 587b910..0000000
--- a/tests/tests/media/assets/audio_only/09.aac
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/10.aac b/tests/tests/media/assets/audio_only/10.aac
deleted file mode 100644
index db8c5b8..0000000
--- a/tests/tests/media/assets/audio_only/10.aac
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/11.aac b/tests/tests/media/assets/audio_only/11.aac
deleted file mode 100644
index 707dd38..0000000
--- a/tests/tests/media/assets/audio_only/11.aac
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/12.aac b/tests/tests/media/assets/audio_only/12.aac
deleted file mode 100644
index 5ebe080..0000000
--- a/tests/tests/media/assets/audio_only/12.aac
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/index.m3u8 b/tests/tests/media/assets/audio_only/index.m3u8
deleted file mode 100644
index fedfafa..0000000
--- a/tests/tests/media/assets/audio_only/index.m3u8
+++ /dev/null
@@ -1,31 +0,0 @@
-#EXTM3U
-#EXT-X-INDEPENDENT-SEGMENTS
-#EXT-X-VERSION:5
-#EXT-X-TARGETDURATION:10
-#EXT-X-PLAYLIST-TYPE:VOD
-#EXT-X-KEY:METHOD=SAMPLE-AES,URI="00.key",IV=0x76fb8e8c870c8f95234d6c40aac52902
-#EXTINF:9.984,
-00.aac
-#EXTINF:9.984,
-01.aac
-#EXTINF:9.984,
-02.aac
-#EXTINF:9.984,
-03.aac
-#EXTINF:9.984,
-04.aac
-#EXTINF:9.984,
-05.aac
-#EXTINF:9.984,
-06.aac
-#EXTINF:9.984,
-07.aac
-#EXTINF:9.984,
-08.aac
-#EXTINF:9.984,
-09.aac
-#EXTINF:9.984,
-10.aac
-#EXTINF:9.984,
-11.aac
-#EXT-X-ENDLIST
\ No newline at end of file
diff --git a/tests/tests/media/assets/fileSequence0.ts b/tests/tests/media/assets/fileSequence0.ts
deleted file mode 100644
index 48f2bcd..0000000
--- a/tests/tests/media/assets/fileSequence0.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/fileSequence1.ts b/tests/tests/media/assets/fileSequence1.ts
deleted file mode 100644
index 737fbd0..0000000
--- a/tests/tests/media/assets/fileSequence1.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls.m3u8 b/tests/tests/media/assets/hls.m3u8
deleted file mode 100644
index 127574a..0000000
--- a/tests/tests/media/assets/hls.m3u8
+++ /dev/null
@@ -1,8 +0,0 @@
-#EXTM3U
-#EXT-X-TARGETDURATION:10
-#EXT-X-MEDIA-SEQUENCE:0
-#EXTINF:10, no desc
-segment000000.ts
-#EXTINF:10, no desc
-segment000001.ts
-#EXT-X-ENDLIST
diff --git a/tests/tests/media/assets/hls_variant/165340/00.ts b/tests/tests/media/assets/hls_variant/165340/00.ts
deleted file mode 100644
index 8a95fc5..0000000
--- a/tests/tests/media/assets/hls_variant/165340/00.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/01.ts b/tests/tests/media/assets/hls_variant/165340/01.ts
deleted file mode 100644
index 7983a01..0000000
--- a/tests/tests/media/assets/hls_variant/165340/01.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/02.ts b/tests/tests/media/assets/hls_variant/165340/02.ts
deleted file mode 100644
index 2582937..0000000
--- a/tests/tests/media/assets/hls_variant/165340/02.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/03.ts b/tests/tests/media/assets/hls_variant/165340/03.ts
deleted file mode 100644
index 4e4711e..0000000
--- a/tests/tests/media/assets/hls_variant/165340/03.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/04.ts b/tests/tests/media/assets/hls_variant/165340/04.ts
deleted file mode 100644
index e210aac..0000000
--- a/tests/tests/media/assets/hls_variant/165340/04.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/05.ts b/tests/tests/media/assets/hls_variant/165340/05.ts
deleted file mode 100644
index 5d445bf..0000000
--- a/tests/tests/media/assets/hls_variant/165340/05.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/06.ts b/tests/tests/media/assets/hls_variant/165340/06.ts
deleted file mode 100644
index e83d2a3..0000000
--- a/tests/tests/media/assets/hls_variant/165340/06.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/07.ts b/tests/tests/media/assets/hls_variant/165340/07.ts
deleted file mode 100644
index 37322c0..0000000
--- a/tests/tests/media/assets/hls_variant/165340/07.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/08.ts b/tests/tests/media/assets/hls_variant/165340/08.ts
deleted file mode 100644
index 25f9f00..0000000
--- a/tests/tests/media/assets/hls_variant/165340/08.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/09.ts b/tests/tests/media/assets/hls_variant/165340/09.ts
deleted file mode 100644
index 2debe48..0000000
--- a/tests/tests/media/assets/hls_variant/165340/09.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/10.ts b/tests/tests/media/assets/hls_variant/165340/10.ts
deleted file mode 100644
index 3eed736..0000000
--- a/tests/tests/media/assets/hls_variant/165340/10.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/11.ts b/tests/tests/media/assets/hls_variant/165340/11.ts
deleted file mode 100644
index 7ae79e9..0000000
--- a/tests/tests/media/assets/hls_variant/165340/11.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/12.ts b/tests/tests/media/assets/hls_variant/165340/12.ts
deleted file mode 100644
index 4153626..0000000
--- a/tests/tests/media/assets/hls_variant/165340/12.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/13.ts b/tests/tests/media/assets/hls_variant/165340/13.ts
deleted file mode 100644
index 027adf4..0000000
--- a/tests/tests/media/assets/hls_variant/165340/13.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/14.ts b/tests/tests/media/assets/hls_variant/165340/14.ts
deleted file mode 100644
index ea7d0be..0000000
--- a/tests/tests/media/assets/hls_variant/165340/14.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/15.ts b/tests/tests/media/assets/hls_variant/165340/15.ts
deleted file mode 100644
index 48c92c9..0000000
--- a/tests/tests/media/assets/hls_variant/165340/15.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/16.ts b/tests/tests/media/assets/hls_variant/165340/16.ts
deleted file mode 100644
index 19f0ebd..0000000
--- a/tests/tests/media/assets/hls_variant/165340/16.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/17.ts b/tests/tests/media/assets/hls_variant/165340/17.ts
deleted file mode 100644
index 7d4897d..0000000
--- a/tests/tests/media/assets/hls_variant/165340/17.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/18.ts b/tests/tests/media/assets/hls_variant/165340/18.ts
deleted file mode 100644
index 47431d0..0000000
--- a/tests/tests/media/assets/hls_variant/165340/18.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/19.ts b/tests/tests/media/assets/hls_variant/165340/19.ts
deleted file mode 100644
index 9e98a4f..0000000
--- a/tests/tests/media/assets/hls_variant/165340/19.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/20.ts b/tests/tests/media/assets/hls_variant/165340/20.ts
deleted file mode 100644
index e674296..0000000
--- a/tests/tests/media/assets/hls_variant/165340/20.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/21.ts b/tests/tests/media/assets/hls_variant/165340/21.ts
deleted file mode 100644
index 2affe9d..0000000
--- a/tests/tests/media/assets/hls_variant/165340/21.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/22.ts b/tests/tests/media/assets/hls_variant/165340/22.ts
deleted file mode 100644
index 0634296..0000000
--- a/tests/tests/media/assets/hls_variant/165340/22.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/23.ts b/tests/tests/media/assets/hls_variant/165340/23.ts
deleted file mode 100644
index faf9ca8..0000000
--- a/tests/tests/media/assets/hls_variant/165340/23.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/24.ts b/tests/tests/media/assets/hls_variant/165340/24.ts
deleted file mode 100644
index 3b3f4d7..0000000
--- a/tests/tests/media/assets/hls_variant/165340/24.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/index.m3u8 b/tests/tests/media/assets/hls_variant/165340/index.m3u8
deleted file mode 100644
index f36f33d..0000000
--- a/tests/tests/media/assets/hls_variant/165340/index.m3u8
+++ /dev/null
@@ -1,53 +0,0 @@
-#EXTM3U
-#EXT-X-VERSION:3
-#EXT-X-TARGETDURATION:5
-#EXT-X-PLAYLIST-TYPE:VOD
-#EXTINF:5,
-00.ts
-#EXTINF:5,
-01.ts
-#EXTINF:5,
-02.ts
-#EXTINF:5,
-03.ts
-#EXTINF:5,
-04.ts
-#EXTINF:5,
-05.ts
-#EXTINF:5,
-06.ts
-#EXTINF:5,
-07.ts
-#EXTINF:5,
-08.ts
-#EXTINF:5,
-09.ts
-#EXTINF:5,
-10.ts
-#EXTINF:5,
-11.ts
-#EXTINF:5,
-12.ts
-#EXTINF:5,
-13.ts
-#EXTINF:5,
-14.ts
-#EXTINF:5,
-15.ts
-#EXTINF:5,
-16.ts
-#EXTINF:5,
-17.ts
-#EXTINF:5,
-18.ts
-#EXTINF:5,
-19.ts
-#EXTINF:5,
-20.ts
-#EXTINF:5,
-21.ts
-#EXTINF:5,
-22.ts
-#EXTINF:5,
-23.ts
-#EXT-X-ENDLIST
\ No newline at end of file
diff --git a/tests/tests/media/assets/hls_variant/1676816/00.ts b/tests/tests/media/assets/hls_variant/1676816/00.ts
deleted file mode 100644
index aba6f79..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/00.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/01.ts b/tests/tests/media/assets/hls_variant/1676816/01.ts
deleted file mode 100644
index 18c382b..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/01.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/02.ts b/tests/tests/media/assets/hls_variant/1676816/02.ts
deleted file mode 100644
index 8b45649..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/02.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/03.ts b/tests/tests/media/assets/hls_variant/1676816/03.ts
deleted file mode 100644
index 5a1dee6..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/03.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/04.ts b/tests/tests/media/assets/hls_variant/1676816/04.ts
deleted file mode 100644
index 69c4dfa..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/04.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/05.ts b/tests/tests/media/assets/hls_variant/1676816/05.ts
deleted file mode 100644
index bd1e938..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/05.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/06.ts b/tests/tests/media/assets/hls_variant/1676816/06.ts
deleted file mode 100644
index dfdfe31..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/06.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/07.ts b/tests/tests/media/assets/hls_variant/1676816/07.ts
deleted file mode 100644
index be22e90..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/07.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/08.ts b/tests/tests/media/assets/hls_variant/1676816/08.ts
deleted file mode 100644
index a892318..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/08.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/09.ts b/tests/tests/media/assets/hls_variant/1676816/09.ts
deleted file mode 100644
index 9a1e3c9..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/09.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/10.ts b/tests/tests/media/assets/hls_variant/1676816/10.ts
deleted file mode 100644
index 528e424..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/10.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/11.ts b/tests/tests/media/assets/hls_variant/1676816/11.ts
deleted file mode 100644
index 2ad52f9..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/11.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/12.ts b/tests/tests/media/assets/hls_variant/1676816/12.ts
deleted file mode 100644
index 5275b47..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/12.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/13.ts b/tests/tests/media/assets/hls_variant/1676816/13.ts
deleted file mode 100644
index 5894d31..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/13.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/14.ts b/tests/tests/media/assets/hls_variant/1676816/14.ts
deleted file mode 100644
index 44f5200..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/14.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/15.ts b/tests/tests/media/assets/hls_variant/1676816/15.ts
deleted file mode 100644
index e548fb18..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/15.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/16.ts b/tests/tests/media/assets/hls_variant/1676816/16.ts
deleted file mode 100644
index 9ad2c6a..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/16.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/17.ts b/tests/tests/media/assets/hls_variant/1676816/17.ts
deleted file mode 100644
index 1cd735f..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/17.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/18.ts b/tests/tests/media/assets/hls_variant/1676816/18.ts
deleted file mode 100644
index a593dba..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/18.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/19.ts b/tests/tests/media/assets/hls_variant/1676816/19.ts
deleted file mode 100644
index 3fb49cb..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/19.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/20.ts b/tests/tests/media/assets/hls_variant/1676816/20.ts
deleted file mode 100644
index 7a586e7..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/20.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/21.ts b/tests/tests/media/assets/hls_variant/1676816/21.ts
deleted file mode 100644
index bd70554..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/21.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/22.ts b/tests/tests/media/assets/hls_variant/1676816/22.ts
deleted file mode 100644
index 12ea80d..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/22.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/23.ts b/tests/tests/media/assets/hls_variant/1676816/23.ts
deleted file mode 100644
index c1b5be9..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/23.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/24.ts b/tests/tests/media/assets/hls_variant/1676816/24.ts
deleted file mode 100644
index 76bd0b5..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/24.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/index.m3u8 b/tests/tests/media/assets/hls_variant/1676816/index.m3u8
deleted file mode 100644
index f36f33d..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/index.m3u8
+++ /dev/null
@@ -1,53 +0,0 @@
-#EXTM3U
-#EXT-X-VERSION:3
-#EXT-X-TARGETDURATION:5
-#EXT-X-PLAYLIST-TYPE:VOD
-#EXTINF:5,
-00.ts
-#EXTINF:5,
-01.ts
-#EXTINF:5,
-02.ts
-#EXTINF:5,
-03.ts
-#EXTINF:5,
-04.ts
-#EXTINF:5,
-05.ts
-#EXTINF:5,
-06.ts
-#EXTINF:5,
-07.ts
-#EXTINF:5,
-08.ts
-#EXTINF:5,
-09.ts
-#EXTINF:5,
-10.ts
-#EXTINF:5,
-11.ts
-#EXTINF:5,
-12.ts
-#EXTINF:5,
-13.ts
-#EXTINF:5,
-14.ts
-#EXTINF:5,
-15.ts
-#EXTINF:5,
-16.ts
-#EXTINF:5,
-17.ts
-#EXTINF:5,
-18.ts
-#EXTINF:5,
-19.ts
-#EXTINF:5,
-20.ts
-#EXTINF:5,
-21.ts
-#EXTINF:5,
-22.ts
-#EXTINF:5,
-23.ts
-#EXT-X-ENDLIST
\ No newline at end of file
diff --git a/tests/tests/media/assets/hls_variant/344388/00.ts b/tests/tests/media/assets/hls_variant/344388/00.ts
deleted file mode 100644
index e26ad20..0000000
--- a/tests/tests/media/assets/hls_variant/344388/00.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/01.ts b/tests/tests/media/assets/hls_variant/344388/01.ts
deleted file mode 100644
index fa5395d..0000000
--- a/tests/tests/media/assets/hls_variant/344388/01.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/02.ts b/tests/tests/media/assets/hls_variant/344388/02.ts
deleted file mode 100644
index a924b05..0000000
--- a/tests/tests/media/assets/hls_variant/344388/02.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/03.ts b/tests/tests/media/assets/hls_variant/344388/03.ts
deleted file mode 100644
index 4136491..0000000
--- a/tests/tests/media/assets/hls_variant/344388/03.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/04.ts b/tests/tests/media/assets/hls_variant/344388/04.ts
deleted file mode 100644
index cf03032..0000000
--- a/tests/tests/media/assets/hls_variant/344388/04.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/05.ts b/tests/tests/media/assets/hls_variant/344388/05.ts
deleted file mode 100644
index 25d127b..0000000
--- a/tests/tests/media/assets/hls_variant/344388/05.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/06.ts b/tests/tests/media/assets/hls_variant/344388/06.ts
deleted file mode 100644
index f132be4..0000000
--- a/tests/tests/media/assets/hls_variant/344388/06.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/07.ts b/tests/tests/media/assets/hls_variant/344388/07.ts
deleted file mode 100644
index b1e7f36..0000000
--- a/tests/tests/media/assets/hls_variant/344388/07.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/08.ts b/tests/tests/media/assets/hls_variant/344388/08.ts
deleted file mode 100644
index bbeb4fd..0000000
--- a/tests/tests/media/assets/hls_variant/344388/08.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/09.ts b/tests/tests/media/assets/hls_variant/344388/09.ts
deleted file mode 100644
index f444ab9..0000000
--- a/tests/tests/media/assets/hls_variant/344388/09.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/10.ts b/tests/tests/media/assets/hls_variant/344388/10.ts
deleted file mode 100644
index 910dd43..0000000
--- a/tests/tests/media/assets/hls_variant/344388/10.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/11.ts b/tests/tests/media/assets/hls_variant/344388/11.ts
deleted file mode 100644
index 892a6b3..0000000
--- a/tests/tests/media/assets/hls_variant/344388/11.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/12.ts b/tests/tests/media/assets/hls_variant/344388/12.ts
deleted file mode 100644
index 2a8bfeb..0000000
--- a/tests/tests/media/assets/hls_variant/344388/12.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/13.ts b/tests/tests/media/assets/hls_variant/344388/13.ts
deleted file mode 100644
index bf9f1a4..0000000
--- a/tests/tests/media/assets/hls_variant/344388/13.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/14.ts b/tests/tests/media/assets/hls_variant/344388/14.ts
deleted file mode 100644
index 45c604c..0000000
--- a/tests/tests/media/assets/hls_variant/344388/14.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/15.ts b/tests/tests/media/assets/hls_variant/344388/15.ts
deleted file mode 100644
index 4d5de4f..0000000
--- a/tests/tests/media/assets/hls_variant/344388/15.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/16.ts b/tests/tests/media/assets/hls_variant/344388/16.ts
deleted file mode 100644
index 9551838..0000000
--- a/tests/tests/media/assets/hls_variant/344388/16.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/17.ts b/tests/tests/media/assets/hls_variant/344388/17.ts
deleted file mode 100644
index dde4452..0000000
--- a/tests/tests/media/assets/hls_variant/344388/17.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/18.ts b/tests/tests/media/assets/hls_variant/344388/18.ts
deleted file mode 100644
index c7b3919..0000000
--- a/tests/tests/media/assets/hls_variant/344388/18.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/19.ts b/tests/tests/media/assets/hls_variant/344388/19.ts
deleted file mode 100644
index 5aa3c84..0000000
--- a/tests/tests/media/assets/hls_variant/344388/19.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/20.ts b/tests/tests/media/assets/hls_variant/344388/20.ts
deleted file mode 100644
index 0d509bb..0000000
--- a/tests/tests/media/assets/hls_variant/344388/20.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/21.ts b/tests/tests/media/assets/hls_variant/344388/21.ts
deleted file mode 100644
index 252a953..0000000
--- a/tests/tests/media/assets/hls_variant/344388/21.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/22.ts b/tests/tests/media/assets/hls_variant/344388/22.ts
deleted file mode 100644
index 7098fdd..0000000
--- a/tests/tests/media/assets/hls_variant/344388/22.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/23.ts b/tests/tests/media/assets/hls_variant/344388/23.ts
deleted file mode 100644
index 69bd886..0000000
--- a/tests/tests/media/assets/hls_variant/344388/23.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/24.ts b/tests/tests/media/assets/hls_variant/344388/24.ts
deleted file mode 100644
index 0542cc2..0000000
--- a/tests/tests/media/assets/hls_variant/344388/24.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/index.m3u8 b/tests/tests/media/assets/hls_variant/344388/index.m3u8
deleted file mode 100644
index f36f33d..0000000
--- a/tests/tests/media/assets/hls_variant/344388/index.m3u8
+++ /dev/null
@@ -1,53 +0,0 @@
-#EXTM3U
-#EXT-X-VERSION:3
-#EXT-X-TARGETDURATION:5
-#EXT-X-PLAYLIST-TYPE:VOD
-#EXTINF:5,
-00.ts
-#EXTINF:5,
-01.ts
-#EXTINF:5,
-02.ts
-#EXTINF:5,
-03.ts
-#EXTINF:5,
-04.ts
-#EXTINF:5,
-05.ts
-#EXTINF:5,
-06.ts
-#EXTINF:5,
-07.ts
-#EXTINF:5,
-08.ts
-#EXTINF:5,
-09.ts
-#EXTINF:5,
-10.ts
-#EXTINF:5,
-11.ts
-#EXTINF:5,
-12.ts
-#EXTINF:5,
-13.ts
-#EXTINF:5,
-14.ts
-#EXTINF:5,
-15.ts
-#EXTINF:5,
-16.ts
-#EXTINF:5,
-17.ts
-#EXTINF:5,
-18.ts
-#EXTINF:5,
-19.ts
-#EXTINF:5,
-20.ts
-#EXTINF:5,
-21.ts
-#EXTINF:5,
-22.ts
-#EXTINF:5,
-23.ts
-#EXT-X-ENDLIST
\ No newline at end of file
diff --git a/tests/tests/media/assets/hls_variant/387360/00.ts b/tests/tests/media/assets/hls_variant/387360/00.ts
deleted file mode 100644
index c7233c2..0000000
--- a/tests/tests/media/assets/hls_variant/387360/00.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/01.ts b/tests/tests/media/assets/hls_variant/387360/01.ts
deleted file mode 100644
index 4d092dd..0000000
--- a/tests/tests/media/assets/hls_variant/387360/01.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/02.ts b/tests/tests/media/assets/hls_variant/387360/02.ts
deleted file mode 100644
index 5b0322e..0000000
--- a/tests/tests/media/assets/hls_variant/387360/02.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/03.ts b/tests/tests/media/assets/hls_variant/387360/03.ts
deleted file mode 100644
index 5081ef0..0000000
--- a/tests/tests/media/assets/hls_variant/387360/03.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/04.ts b/tests/tests/media/assets/hls_variant/387360/04.ts
deleted file mode 100644
index 0f6f0fe..0000000
--- a/tests/tests/media/assets/hls_variant/387360/04.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/05.ts b/tests/tests/media/assets/hls_variant/387360/05.ts
deleted file mode 100644
index e455dec..0000000
--- a/tests/tests/media/assets/hls_variant/387360/05.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/06.ts b/tests/tests/media/assets/hls_variant/387360/06.ts
deleted file mode 100644
index 14afcb9d..0000000
--- a/tests/tests/media/assets/hls_variant/387360/06.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/07.ts b/tests/tests/media/assets/hls_variant/387360/07.ts
deleted file mode 100644
index 6f23d02..0000000
--- a/tests/tests/media/assets/hls_variant/387360/07.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/08.ts b/tests/tests/media/assets/hls_variant/387360/08.ts
deleted file mode 100644
index a3d8dfd..0000000
--- a/tests/tests/media/assets/hls_variant/387360/08.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/09.ts b/tests/tests/media/assets/hls_variant/387360/09.ts
deleted file mode 100644
index 87d6de1..0000000
--- a/tests/tests/media/assets/hls_variant/387360/09.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/10.ts b/tests/tests/media/assets/hls_variant/387360/10.ts
deleted file mode 100644
index 04ab37a..0000000
--- a/tests/tests/media/assets/hls_variant/387360/10.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/11.ts b/tests/tests/media/assets/hls_variant/387360/11.ts
deleted file mode 100644
index 1fa238b..0000000
--- a/tests/tests/media/assets/hls_variant/387360/11.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/12.ts b/tests/tests/media/assets/hls_variant/387360/12.ts
deleted file mode 100644
index 445b0b9..0000000
--- a/tests/tests/media/assets/hls_variant/387360/12.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/13.ts b/tests/tests/media/assets/hls_variant/387360/13.ts
deleted file mode 100644
index 6bcd81b..0000000
--- a/tests/tests/media/assets/hls_variant/387360/13.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/14.ts b/tests/tests/media/assets/hls_variant/387360/14.ts
deleted file mode 100644
index f3f8e78..0000000
--- a/tests/tests/media/assets/hls_variant/387360/14.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/15.ts b/tests/tests/media/assets/hls_variant/387360/15.ts
deleted file mode 100644
index 6b12e72..0000000
--- a/tests/tests/media/assets/hls_variant/387360/15.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/16.ts b/tests/tests/media/assets/hls_variant/387360/16.ts
deleted file mode 100644
index d95eeba..0000000
--- a/tests/tests/media/assets/hls_variant/387360/16.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/17.ts b/tests/tests/media/assets/hls_variant/387360/17.ts
deleted file mode 100644
index 141ae44..0000000
--- a/tests/tests/media/assets/hls_variant/387360/17.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/18.ts b/tests/tests/media/assets/hls_variant/387360/18.ts
deleted file mode 100644
index fc52f1d..0000000
--- a/tests/tests/media/assets/hls_variant/387360/18.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/19.ts b/tests/tests/media/assets/hls_variant/387360/19.ts
deleted file mode 100644
index 077db9b..0000000
--- a/tests/tests/media/assets/hls_variant/387360/19.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/20.ts b/tests/tests/media/assets/hls_variant/387360/20.ts
deleted file mode 100644
index 4ffb301..0000000
--- a/tests/tests/media/assets/hls_variant/387360/20.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/21.ts b/tests/tests/media/assets/hls_variant/387360/21.ts
deleted file mode 100644
index 6072368..0000000
--- a/tests/tests/media/assets/hls_variant/387360/21.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/22.ts b/tests/tests/media/assets/hls_variant/387360/22.ts
deleted file mode 100644
index 5edc055..0000000
--- a/tests/tests/media/assets/hls_variant/387360/22.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/23.ts b/tests/tests/media/assets/hls_variant/387360/23.ts
deleted file mode 100644
index 7870e39..0000000
--- a/tests/tests/media/assets/hls_variant/387360/23.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/24.ts b/tests/tests/media/assets/hls_variant/387360/24.ts
deleted file mode 100644
index f4fc858..0000000
--- a/tests/tests/media/assets/hls_variant/387360/24.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/index.m3u8 b/tests/tests/media/assets/hls_variant/387360/index.m3u8
deleted file mode 100644
index f36f33d..0000000
--- a/tests/tests/media/assets/hls_variant/387360/index.m3u8
+++ /dev/null
@@ -1,53 +0,0 @@
-#EXTM3U
-#EXT-X-VERSION:3
-#EXT-X-TARGETDURATION:5
-#EXT-X-PLAYLIST-TYPE:VOD
-#EXTINF:5,
-00.ts
-#EXTINF:5,
-01.ts
-#EXTINF:5,
-02.ts
-#EXTINF:5,
-03.ts
-#EXTINF:5,
-04.ts
-#EXTINF:5,
-05.ts
-#EXTINF:5,
-06.ts
-#EXTINF:5,
-07.ts
-#EXTINF:5,
-08.ts
-#EXTINF:5,
-09.ts
-#EXTINF:5,
-10.ts
-#EXTINF:5,
-11.ts
-#EXTINF:5,
-12.ts
-#EXTINF:5,
-13.ts
-#EXTINF:5,
-14.ts
-#EXTINF:5,
-15.ts
-#EXTINF:5,
-16.ts
-#EXTINF:5,
-17.ts
-#EXTINF:5,
-18.ts
-#EXTINF:5,
-19.ts
-#EXTINF:5,
-20.ts
-#EXTINF:5,
-21.ts
-#EXTINF:5,
-22.ts
-#EXTINF:5,
-23.ts
-#EXT-X-ENDLIST
\ No newline at end of file
diff --git a/tests/tests/media/assets/hls_variant/765178/00.ts b/tests/tests/media/assets/hls_variant/765178/00.ts
deleted file mode 100644
index c544131..0000000
--- a/tests/tests/media/assets/hls_variant/765178/00.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/01.ts b/tests/tests/media/assets/hls_variant/765178/01.ts
deleted file mode 100644
index 11adb7a..0000000
--- a/tests/tests/media/assets/hls_variant/765178/01.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/02.ts b/tests/tests/media/assets/hls_variant/765178/02.ts
deleted file mode 100644
index d5300f4..0000000
--- a/tests/tests/media/assets/hls_variant/765178/02.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/03.ts b/tests/tests/media/assets/hls_variant/765178/03.ts
deleted file mode 100644
index 8a3ce79..0000000
--- a/tests/tests/media/assets/hls_variant/765178/03.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/04.ts b/tests/tests/media/assets/hls_variant/765178/04.ts
deleted file mode 100644
index 94b1ced..0000000
--- a/tests/tests/media/assets/hls_variant/765178/04.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/05.ts b/tests/tests/media/assets/hls_variant/765178/05.ts
deleted file mode 100644
index d44d4a6..0000000
--- a/tests/tests/media/assets/hls_variant/765178/05.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/06.ts b/tests/tests/media/assets/hls_variant/765178/06.ts
deleted file mode 100644
index 52455dd..0000000
--- a/tests/tests/media/assets/hls_variant/765178/06.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/07.ts b/tests/tests/media/assets/hls_variant/765178/07.ts
deleted file mode 100644
index cea2858..0000000
--- a/tests/tests/media/assets/hls_variant/765178/07.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/08.ts b/tests/tests/media/assets/hls_variant/765178/08.ts
deleted file mode 100644
index 79a1ef1..0000000
--- a/tests/tests/media/assets/hls_variant/765178/08.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/09.ts b/tests/tests/media/assets/hls_variant/765178/09.ts
deleted file mode 100644
index 6e987f2..0000000
--- a/tests/tests/media/assets/hls_variant/765178/09.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/10.ts b/tests/tests/media/assets/hls_variant/765178/10.ts
deleted file mode 100644
index c5f1af4..0000000
--- a/tests/tests/media/assets/hls_variant/765178/10.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/11.ts b/tests/tests/media/assets/hls_variant/765178/11.ts
deleted file mode 100644
index 1a96c19..0000000
--- a/tests/tests/media/assets/hls_variant/765178/11.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/12.ts b/tests/tests/media/assets/hls_variant/765178/12.ts
deleted file mode 100644
index b6095bb..0000000
--- a/tests/tests/media/assets/hls_variant/765178/12.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/13.ts b/tests/tests/media/assets/hls_variant/765178/13.ts
deleted file mode 100644
index b91b740..0000000
--- a/tests/tests/media/assets/hls_variant/765178/13.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/14.ts b/tests/tests/media/assets/hls_variant/765178/14.ts
deleted file mode 100644
index d033f16..0000000
--- a/tests/tests/media/assets/hls_variant/765178/14.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/15.ts b/tests/tests/media/assets/hls_variant/765178/15.ts
deleted file mode 100644
index f294842..0000000
--- a/tests/tests/media/assets/hls_variant/765178/15.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/16.ts b/tests/tests/media/assets/hls_variant/765178/16.ts
deleted file mode 100644
index 15a9e9e..0000000
--- a/tests/tests/media/assets/hls_variant/765178/16.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/17.ts b/tests/tests/media/assets/hls_variant/765178/17.ts
deleted file mode 100644
index e024ce0..0000000
--- a/tests/tests/media/assets/hls_variant/765178/17.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/18.ts b/tests/tests/media/assets/hls_variant/765178/18.ts
deleted file mode 100644
index 9e7fea2..0000000
--- a/tests/tests/media/assets/hls_variant/765178/18.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/19.ts b/tests/tests/media/assets/hls_variant/765178/19.ts
deleted file mode 100644
index 4bb80bf..0000000
--- a/tests/tests/media/assets/hls_variant/765178/19.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/20.ts b/tests/tests/media/assets/hls_variant/765178/20.ts
deleted file mode 100644
index 591fda9..0000000
--- a/tests/tests/media/assets/hls_variant/765178/20.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/21.ts b/tests/tests/media/assets/hls_variant/765178/21.ts
deleted file mode 100644
index a3cab10..0000000
--- a/tests/tests/media/assets/hls_variant/765178/21.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/22.ts b/tests/tests/media/assets/hls_variant/765178/22.ts
deleted file mode 100644
index c60c3f8..0000000
--- a/tests/tests/media/assets/hls_variant/765178/22.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/23.ts b/tests/tests/media/assets/hls_variant/765178/23.ts
deleted file mode 100644
index e60a254..0000000
--- a/tests/tests/media/assets/hls_variant/765178/23.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/24.ts b/tests/tests/media/assets/hls_variant/765178/24.ts
deleted file mode 100644
index bc75f31..0000000
--- a/tests/tests/media/assets/hls_variant/765178/24.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/index.m3u8 b/tests/tests/media/assets/hls_variant/765178/index.m3u8
deleted file mode 100644
index f36f33d..0000000
--- a/tests/tests/media/assets/hls_variant/765178/index.m3u8
+++ /dev/null
@@ -1,53 +0,0 @@
-#EXTM3U
-#EXT-X-VERSION:3
-#EXT-X-TARGETDURATION:5
-#EXT-X-PLAYLIST-TYPE:VOD
-#EXTINF:5,
-00.ts
-#EXTINF:5,
-01.ts
-#EXTINF:5,
-02.ts
-#EXTINF:5,
-03.ts
-#EXTINF:5,
-04.ts
-#EXTINF:5,
-05.ts
-#EXTINF:5,
-06.ts
-#EXTINF:5,
-07.ts
-#EXTINF:5,
-08.ts
-#EXTINF:5,
-09.ts
-#EXTINF:5,
-10.ts
-#EXTINF:5,
-11.ts
-#EXTINF:5,
-12.ts
-#EXTINF:5,
-13.ts
-#EXTINF:5,
-14.ts
-#EXTINF:5,
-15.ts
-#EXTINF:5,
-16.ts
-#EXTINF:5,
-17.ts
-#EXTINF:5,
-18.ts
-#EXTINF:5,
-19.ts
-#EXTINF:5,
-20.ts
-#EXTINF:5,
-21.ts
-#EXTINF:5,
-22.ts
-#EXTINF:5,
-23.ts
-#EXT-X-ENDLIST
\ No newline at end of file
diff --git a/tests/tests/media/assets/hls_variant/index.m3u8 b/tests/tests/media/assets/hls_variant/index.m3u8
deleted file mode 100644
index 2e94f5d..0000000
--- a/tests/tests/media/assets/hls_variant/index.m3u8
+++ /dev/null
@@ -1,12 +0,0 @@
-#EXTM3U
-#EXT-X-INDEPENDENT-SEGMENTS
-#EXT-X-STREAM-INF:CLOSED-CAPTIONS=NONE,BANDWIDTH=165340,RESOLUTION=256x144,CODECS="mp4a.40.5,avc1.42c00b"
-165340/index.m3u8
-#EXT-X-STREAM-INF:CLOSED-CAPTIONS=NONE,BANDWIDTH=344388,RESOLUTION=426x240,CODECS="mp4a.40.5,avc1.4d4015"
-344388/index.m3u8
-#EXT-X-STREAM-INF:CLOSED-CAPTIONS=NONE,BANDWIDTH=387360,RESOLUTION=640x360,CODECS="mp4a.40.2,avc1.4d401e"
-387360/index.m3u8
-#EXT-X-STREAM-INF:CLOSED-CAPTIONS=NONE,BANDWIDTH=765178,RESOLUTION=854x480,CODECS="mp4a.40.2,avc1.4d401f"
-765178/index.m3u8
-#EXT-X-STREAM-INF:CLOSED-CAPTIONS=NONE,BANDWIDTH=1676816,RESOLUTION=1280x720,CODECS="mp4a.40.2,avc1.4d401f"
-1676816/index.m3u8
diff --git a/tests/tests/media/assets/prog_index.m3u8 b/tests/tests/media/assets/prog_index.m3u8
deleted file mode 100644
index 88f99d3..0000000
--- a/tests/tests/media/assets/prog_index.m3u8
+++ /dev/null
@@ -1,10 +0,0 @@
-#EXTM3U
-#EXT-X-TARGETDURATION:10
-#EXT-X-VERSION:3
-#EXT-X-MEDIA-SEQUENCE:0
-#EXT-X-PLAYLIST-TYPE:VOD
-#EXTINF:9.90000,
-fileSequence0.ts
-#EXTINF:10.00000,
-fileSequence1.ts
-#EXT-X-ENDLIST
diff --git a/tests/tests/media/assets/segment000000.ts b/tests/tests/media/assets/segment000000.ts
deleted file mode 100644
index 8992c7b..0000000
--- a/tests/tests/media/assets/segment000000.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/segment000001.ts b/tests/tests/media/assets/segment000001.ts
deleted file mode 100644
index fb112ec..0000000
--- a/tests/tests/media/assets/segment000001.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/00.key b/tests/tests/media/assets/unmuxed_1500k/00.key
deleted file mode 100644
index eb61918..0000000
--- a/tests/tests/media/assets/unmuxed_1500k/00.key
+++ /dev/null
@@ -1 +0,0 @@
-ëÝbñhÒ{hï*üä®<
\ No newline at end of file
diff --git a/tests/tests/media/assets/unmuxed_1500k/00.ts b/tests/tests/media/assets/unmuxed_1500k/00.ts
deleted file mode 100644
index 9891dc6..0000000
--- a/tests/tests/media/assets/unmuxed_1500k/00.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/01.ts b/tests/tests/media/assets/unmuxed_1500k/01.ts
deleted file mode 100644
index d374565..0000000
--- a/tests/tests/media/assets/unmuxed_1500k/01.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/02.ts b/tests/tests/media/assets/unmuxed_1500k/02.ts
deleted file mode 100644
index 6a6fbdb..0000000
--- a/tests/tests/media/assets/unmuxed_1500k/02.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/03.ts b/tests/tests/media/assets/unmuxed_1500k/03.ts
deleted file mode 100644
index cba18a5..0000000
--- a/tests/tests/media/assets/unmuxed_1500k/03.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/04.ts b/tests/tests/media/assets/unmuxed_1500k/04.ts
deleted file mode 100644
index bed2e63..0000000
--- a/tests/tests/media/assets/unmuxed_1500k/04.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/05.ts b/tests/tests/media/assets/unmuxed_1500k/05.ts
deleted file mode 100644
index 35504ca..0000000
--- a/tests/tests/media/assets/unmuxed_1500k/05.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/06.ts b/tests/tests/media/assets/unmuxed_1500k/06.ts
deleted file mode 100644
index 8456a79..0000000
--- a/tests/tests/media/assets/unmuxed_1500k/06.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/07.ts b/tests/tests/media/assets/unmuxed_1500k/07.ts
deleted file mode 100644
index e19ec6b..0000000
--- a/tests/tests/media/assets/unmuxed_1500k/07.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/08.ts b/tests/tests/media/assets/unmuxed_1500k/08.ts
deleted file mode 100644
index 9a695cd..0000000
--- a/tests/tests/media/assets/unmuxed_1500k/08.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/09.ts b/tests/tests/media/assets/unmuxed_1500k/09.ts
deleted file mode 100644
index eecdb09..0000000
--- a/tests/tests/media/assets/unmuxed_1500k/09.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/10.ts b/tests/tests/media/assets/unmuxed_1500k/10.ts
deleted file mode 100644
index ce1383a..0000000
--- a/tests/tests/media/assets/unmuxed_1500k/10.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/11.ts b/tests/tests/media/assets/unmuxed_1500k/11.ts
deleted file mode 100644
index 99a9ba2..0000000
--- a/tests/tests/media/assets/unmuxed_1500k/11.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/12.ts b/tests/tests/media/assets/unmuxed_1500k/12.ts
deleted file mode 100644
index e63f897..0000000
--- a/tests/tests/media/assets/unmuxed_1500k/12.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/13.ts b/tests/tests/media/assets/unmuxed_1500k/13.ts
deleted file mode 100644
index 50010e2..0000000
--- a/tests/tests/media/assets/unmuxed_1500k/13.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/14.ts b/tests/tests/media/assets/unmuxed_1500k/14.ts
deleted file mode 100644
index 8667a91..0000000
--- a/tests/tests/media/assets/unmuxed_1500k/14.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/15.ts b/tests/tests/media/assets/unmuxed_1500k/15.ts
deleted file mode 100644
index 124b1b5..0000000
--- a/tests/tests/media/assets/unmuxed_1500k/15.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/index.m3u8 b/tests/tests/media/assets/unmuxed_1500k/index.m3u8
deleted file mode 100644
index ee979a2..0000000
--- a/tests/tests/media/assets/unmuxed_1500k/index.m3u8
+++ /dev/null
@@ -1,37 +0,0 @@
-#EXTM3U
-#EXT-X-INDEPENDENT-SEGMENTS
-#EXT-X-VERSION:5
-#EXT-X-TARGETDURATION:10
-#EXT-X-PLAYLIST-TYPE:VOD
-#EXT-X-KEY:METHOD=SAMPLE-AES,URI="00.key",IV=0x10428210ced85ee2ece4f45206ba81ce
-#EXTINF:5.04167,
-00.ts
-#EXTINF:6.83333,
-01.ts
-#EXTINF:3.875,
-02.ts
-#EXTINF:7.29167,
-03.ts
-#EXTINF:10,
-04.ts
-#EXTINF:10,
-05.ts
-#EXTINF:4.66667,
-06.ts
-#EXTINF:8.375,
-07.ts
-#EXTINF:7.70833,
-08.ts
-#EXTINF:9.66667,
-09.ts
-#EXTINF:6.5,
-10.ts
-#EXTINF:9.79167,
-11.ts
-#EXTINF:10,
-12.ts
-#EXTINF:4.16667,
-13.ts
-#EXTINF:8.75,
-14.ts
-#EXT-X-ENDLIST
\ No newline at end of file
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1216x2160_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1216x2160_30fps.mp4
deleted file mode 100644
index d66b238..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1216x2160_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1280x544_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1280x544_30fps.mp4
deleted file mode 100644
index e46a7c7..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1280x544_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1280x720_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1280x720_30fps.mp4
deleted file mode 100644
index 8af2cf1..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1280x720_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_136x240_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_136x240_30fps.mp4
deleted file mode 100644
index 92815cb..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_136x240_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1440x1080_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1440x1080_30fps.mp4
deleted file mode 100644
index ec81fe7..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1440x1080_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1920x1080_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1920x1080_30fps.mp4
deleted file mode 100644
index 97e4958..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1920x1080_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1920x1440_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1920x1440_30fps.mp4
deleted file mode 100644
index 6e22847..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1920x1440_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1920x818_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1920x818_30fps.mp4
deleted file mode 100644
index 9c061e0..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1920x818_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_192x144_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_192x144_30fps.mp4
deleted file mode 100644
index 58d899d..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_192x144_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_202x360_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_202x360_30fps.mp4
deleted file mode 100644
index ade1d8e..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_202x360_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_2560x1090_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_2560x1090_30fps.mp4
deleted file mode 100644
index fc5a7b82..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_2560x1090_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_2560x1440_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_2560x1440_30fps.mp4
deleted file mode 100644
index 52d2466..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_2560x1440_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_256x108_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_256x108_30fps.mp4
deleted file mode 100644
index 55b2a50..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_256x108_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_256x144_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_256x144_30fps.mp4
deleted file mode 100644
index 34bef63..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_256x144_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_270x480_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_270x480_30fps.mp4
deleted file mode 100644
index dd8ff39..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_270x480_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_2880x2160_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_2880x2160_30fps.mp4
deleted file mode 100644
index 2437833..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_2880x2160_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_320x240_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_320x240_30fps.mp4
deleted file mode 100644
index 1e249f3..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_320x240_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_3840x1634_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_3840x1634_30fps.mp4
deleted file mode 100644
index 7d52627..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_3840x1634_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_3840x2160_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_3840x2160_30fps.mp4
deleted file mode 100644
index a44925b..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_3840x2160_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_406x720_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_406x720_30fps.mp4
deleted file mode 100644
index 8ca7660..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_406x720_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_426x182_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_426x182_30fps.mp4
deleted file mode 100644
index e190f9f..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_426x182_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_426x240_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_426x240_30fps.mp4
deleted file mode 100644
index 01f33de..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_426x240_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_480x360_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_480x360_30fps.mp4
deleted file mode 100644
index 2163aebe..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_480x360_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_608x1080_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_608x1080_30fps.mp4
deleted file mode 100644
index 5bae22d9..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_608x1080_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_640x272_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_640x272_30fps.mp4
deleted file mode 100644
index 34738b0..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_640x272_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_640x360_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_640x360_30fps.mp4
deleted file mode 100644
index 257037c..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_640x360_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_640x480_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_640x480_30fps.mp4
deleted file mode 100644
index 6caa288..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_640x480_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_810x1440_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_810x1440_30fps.mp4
deleted file mode 100644
index 081a5d3..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_810x1440_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_82x144_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_82x144_30fps.mp4
deleted file mode 100644
index 48463db..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_82x144_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_854x362_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_854x362_30fps.mp4
deleted file mode 100644
index bfe1fe0..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_854x362_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_854x480_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_854x480_30fps.mp4
deleted file mode 100644
index 97df960..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_854x480_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_960x720_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_960x720_30fps.mp4
deleted file mode 100644
index 671329e..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_960x720_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1216x2160_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1216x2160_30fps.webm
deleted file mode 100644
index 3e987e0..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1216x2160_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1280x544_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1280x544_30fps.webm
deleted file mode 100644
index 4453d53..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1280x544_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1280x720_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1280x720_30fps.webm
deleted file mode 100644
index 086a0ee..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1280x720_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_136x240_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_136x240_30fps.webm
deleted file mode 100644
index 6b54d00..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_136x240_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1440x1080_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1440x1080_30fps.webm
deleted file mode 100644
index edf8a42..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1440x1080_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1920x1080_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1920x1080_30fps.webm
deleted file mode 100644
index b8515e5..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1920x1080_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1920x1440_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1920x1440_30fps.webm
deleted file mode 100644
index 6c6f219..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1920x1440_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1920x818_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1920x818_30fps.webm
deleted file mode 100644
index 1870a54..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1920x818_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_192x144_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_192x144_30fps.webm
deleted file mode 100644
index 45dcd2b..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_192x144_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_202x360_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_202x360_30fps.webm
deleted file mode 100644
index 74e4e89..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_202x360_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_2560x1090_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_2560x1090_30fps.webm
deleted file mode 100644
index 20eef7d..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_2560x1090_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_2560x1440_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_2560x1440_30fps.webm
deleted file mode 100644
index 2108a75..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_2560x1440_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_256x108_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_256x108_30fps.webm
deleted file mode 100644
index 2242a44..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_256x108_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_256x144_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_256x144_30fps.webm
deleted file mode 100644
index 48962e8..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_256x144_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_270x480_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_270x480_30fps.webm
deleted file mode 100644
index 121e955..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_270x480_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_2880x2160_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_2880x2160_30fps.webm
deleted file mode 100644
index e95fc45..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_2880x2160_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_320x240_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_320x240_30fps.webm
deleted file mode 100644
index e105985..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_320x240_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_3840x1634_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_3840x1634_30fps.webm
deleted file mode 100644
index a3ade36..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_3840x1634_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_3840x2160_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_3840x2160_30fps.webm
deleted file mode 100644
index e94d4da..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_3840x2160_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_406x720_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_406x720_30fps.webm
deleted file mode 100644
index 7b903de..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_406x720_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_426x182_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_426x182_30fps.webm
deleted file mode 100644
index a37299c..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_426x182_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_426x240_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_426x240_30fps.webm
deleted file mode 100644
index 85974a8..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_426x240_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_480x360_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_480x360_30fps.webm
deleted file mode 100644
index efb8747ff..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_480x360_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_608x1080_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_608x1080_30fps.webm
deleted file mode 100644
index af82abf..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_608x1080_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_640x272_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_640x272_30fps.webm
deleted file mode 100644
index e8ff426..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_640x272_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_640x360_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_640x360_30fps.webm
deleted file mode 100644
index bb40cd8..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_640x360_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_640x480_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_640x480_30fps.webm
deleted file mode 100644
index d252278..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_640x480_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_810x1440_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_810x1440_30fps.webm
deleted file mode 100644
index 853981a..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_810x1440_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_82x144_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_82x144_30fps.webm
deleted file mode 100644
index b6dc9a5..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_82x144_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_854x362_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_854x362_30fps.webm
deleted file mode 100644
index cbc6b2cc..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_854x362_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_854x480_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_854x480_30fps.webm
deleted file mode 100644
index adef5bc..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_854x480_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_960x720_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_960x720_30fps.webm
deleted file mode 100644
index 44c0b82..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_960x720_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_with_cropping-h264_520x360_30fps.mp4 b/tests/tests/media/assets/video_decode_with_cropping-h264_520x360_30fps.mp4
deleted file mode 100644
index 9a899b2..0000000
--- a/tests/tests/media/assets/video_decode_with_cropping-h264_520x360_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_with_cropping-vp9_520x360_30fps.webm b/tests/tests/media/assets/video_decode_with_cropping-vp9_520x360_30fps.webm
deleted file mode 100644
index df2723c..0000000
--- a/tests/tests/media/assets/video_decode_with_cropping-vp9_520x360_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/src/android/media/cts/AudioHelper.java b/tests/tests/media/common/src/android/media/cts/AudioHelper.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/AudioHelper.java
rename to tests/tests/media/common/src/android/media/cts/AudioHelper.java
diff --git a/tests/tests/media/src/android/media/cts/AudioManagerStub.java b/tests/tests/media/common/src/android/media/cts/AudioManagerStub.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/AudioManagerStub.java
rename to tests/tests/media/common/src/android/media/cts/AudioManagerStub.java
diff --git a/tests/tests/media/src/android/media/cts/AudioManagerStubHelper.java b/tests/tests/media/common/src/android/media/cts/AudioManagerStubHelper.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/AudioManagerStubHelper.java
rename to tests/tests/media/common/src/android/media/cts/AudioManagerStubHelper.java
diff --git a/tests/tests/media/src/android/media/cts/AudioRecordNative.java b/tests/tests/media/common/src/android/media/cts/AudioRecordNative.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/AudioRecordNative.java
rename to tests/tests/media/common/src/android/media/cts/AudioRecordNative.java
diff --git a/tests/tests/media/src/android/media/cts/AudioTrackNative.java b/tests/tests/media/common/src/android/media/cts/AudioTrackNative.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/AudioTrackNative.java
rename to tests/tests/media/common/src/android/media/cts/AudioTrackNative.java
diff --git a/tests/tests/media/src/android/media/cts/CodecImage.java b/tests/tests/media/common/src/android/media/cts/CodecImage.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/CodecImage.java
rename to tests/tests/media/common/src/android/media/cts/CodecImage.java
diff --git a/tests/tests/media/src/android/media/cts/CodecState.java b/tests/tests/media/common/src/android/media/cts/CodecState.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/CodecState.java
rename to tests/tests/media/common/src/android/media/cts/CodecState.java
diff --git a/tests/tests/media/src/android/media/cts/CodecUtils.java b/tests/tests/media/common/src/android/media/cts/CodecUtils.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/CodecUtils.java
rename to tests/tests/media/common/src/android/media/cts/CodecUtils.java
diff --git a/tests/tests/media/src/android/media/cts/CompositionTextureView.java b/tests/tests/media/common/src/android/media/cts/CompositionTextureView.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/CompositionTextureView.java
rename to tests/tests/media/common/src/android/media/cts/CompositionTextureView.java
diff --git a/tests/tests/media/src/android/media/cts/ConnectionStatus.java b/tests/tests/media/common/src/android/media/cts/ConnectionStatus.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/ConnectionStatus.java
rename to tests/tests/media/common/src/android/media/cts/ConnectionStatus.java
diff --git a/tests/tests/media/src/android/media/cts/DeviceUtils.java b/tests/tests/media/common/src/android/media/cts/DeviceUtils.java
similarity index 84%
rename from tests/tests/media/src/android/media/cts/DeviceUtils.java
rename to tests/tests/media/common/src/android/media/cts/DeviceUtils.java
index 9051c69..eb7dc6c 100644
--- a/tests/tests/media/src/android/media/cts/DeviceUtils.java
+++ b/tests/tests/media/common/src/android/media/cts/DeviceUtils.java
@@ -27,27 +27,27 @@
import android.util.Log;
-/* package */ class DeviceUtils {
+public class DeviceUtils {
private static final String TAG = "DeviceUtils";
- /* package */ static boolean hasOutputDevice(AudioManager audioMgr) {
+ public static boolean hasOutputDevice(AudioManager audioMgr) {
AudioDeviceInfo[] devices = audioMgr.getDevices(AudioManager.GET_DEVICES_OUTPUTS);
return devices.length != 0;
}
- /* package */ static boolean hasInputDevice(AudioManager audioMgr) {
+ public static boolean hasInputDevice(AudioManager audioMgr) {
AudioDeviceInfo[] devices = audioMgr.getDevices(AudioManager.GET_DEVICES_INPUTS);
return devices.length != 0;
}
- /* package */ static boolean isTVDevice(Context context) {
+ public static boolean isTVDevice(Context context) {
return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK);
}
/*
* HDMI
*/
- /* package */ static boolean isHDMIConnected(Context context) {
+ public static boolean isHDMIConnected(Context context) {
// configure the IntentFilter
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(AudioManager.ACTION_HDMI_AUDIO_PLUG);
diff --git a/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayWithCompositionTestImpl.java b/tests/tests/media/common/src/android/media/cts/EncodeVirtualDisplayWithCompositionTestImpl.java
similarity index 98%
rename from tests/tests/media/src/android/media/cts/EncodeVirtualDisplayWithCompositionTestImpl.java
rename to tests/tests/media/common/src/android/media/cts/EncodeVirtualDisplayWithCompositionTestImpl.java
index 0dbedee..4ad8d27 100644
--- a/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayWithCompositionTestImpl.java
+++ b/tests/tests/media/common/src/android/media/cts/EncodeVirtualDisplayWithCompositionTestImpl.java
@@ -87,10 +87,10 @@
private static final int COLOR_BLUE = makeColor(0, 0, 100);
private static final int COLOR_GREY = makeColor(100, 100, 100);
- static final int BITRATE_1080p = 20000000;
- static final int BITRATE_720p = 14000000;
- static final int BITRATE_800x480 = 14000000;
- static final int BITRATE_DEFAULT = 10000000;
+ public static final int BITRATE_1080p = 20000000;
+ public static final int BITRATE_720p = 14000000;
+ public static final int BITRATE_800x480 = 14000000;
+ public static final int BITRATE_DEFAULT = 10000000;
private static final int IFRAME_INTERVAL = 10;
@@ -139,14 +139,14 @@
* @param h
* @throws Exception
*/
- void runTestRenderingInSeparateThread(final Context context, final String mimeType,
+ public void runTestRenderingInSeparateThread(final Context context, final String mimeType,
final int w, final int h, final boolean runRemotely, final boolean multipleWindows)
throws Throwable {
runTestRenderingInSeparateThread(
context, mimeType, w, h, runRemotely, multipleWindows, /* degrees */ 0, null);
}
- void runTestRenderingInSeparateThread(final Context context, final String mimeType,
+ public void runTestRenderingInSeparateThread(final Context context, final String mimeType,
final int w, final int h, final boolean runRemotely, final boolean multipleWindows,
final int degrees, final String decoderName) throws Throwable {
mTestException = null;
@@ -435,7 +435,8 @@
private static final int NUM_CODEC_CREATION = 5;
private static final int NUM_DISPLAY_CREATION = 10;
private static final int NUM_RENDERING = 10;
- void doTestVirtualDisplayRecycles(final Context context, int numDisplays) throws Exception {
+ public void doTestVirtualDisplayRecycles(final Context context, int numDisplays)
+ throws Exception {
Size maxSize = getMaxSupportedEncoderSize();
if (maxSize == null) {
Log.i(TAG, "no codec found, skipping");
@@ -1470,7 +1471,7 @@
* Check is done for 4 different levels: 1080p, 720p, 800x480, 480p
* (The last one is required by CDD.)
*/
- Size checkMaxConcurrentEncodingDecodingResolution() {
+ public Size checkMaxConcurrentEncodingDecodingResolution() {
if (isConcurrentEncodingDecodingSupported(MIME_TYPE, 1920, 1080, BITRATE_1080p)) {
return new Size(1920, 1080);
} else if (isConcurrentEncodingDecodingSupported(MIME_TYPE, 1280, 720, BITRATE_720p)) {
@@ -1484,12 +1485,12 @@
return null;
}
- boolean isConcurrentEncodingDecodingSupported(
+ public boolean isConcurrentEncodingDecodingSupported(
String mimeType, int w, int h, int bitRate) {
return isConcurrentEncodingDecodingSupported(mimeType, w, h, bitRate, null);
}
- boolean isConcurrentEncodingDecodingSupported(
+ public boolean isConcurrentEncodingDecodingSupported(
String mimeType, int w, int h, int bitRate, String decoderName) {
MediaCodecList mcl = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
MediaFormat testFormat = MediaFormat.createVideoFormat(mimeType, w, h);
diff --git a/tests/tests/media/src/android/media/cts/IConnectionStatus.java b/tests/tests/media/common/src/android/media/cts/IConnectionStatus.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/IConnectionStatus.java
rename to tests/tests/media/common/src/android/media/cts/IConnectionStatus.java
diff --git a/tests/tests/media/src/android/media/cts/InputSurface.java b/tests/tests/media/common/src/android/media/cts/InputSurface.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/InputSurface.java
rename to tests/tests/media/common/src/android/media/cts/InputSurface.java
diff --git a/tests/tests/media/src/android/media/cts/InputSurfaceInterface.java b/tests/tests/media/common/src/android/media/cts/InputSurfaceInterface.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/InputSurfaceInterface.java
rename to tests/tests/media/common/src/android/media/cts/InputSurfaceInterface.java
diff --git a/tests/tests/media/src/android/media/cts/LocalMediaProjectionService.java b/tests/tests/media/common/src/android/media/cts/LocalMediaProjectionService.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/LocalMediaProjectionService.java
rename to tests/tests/media/common/src/android/media/cts/LocalMediaProjectionService.java
diff --git a/tests/tests/media/src/android/media/cts/MediaCodecBlockModelHelper.java b/tests/tests/media/common/src/android/media/cts/MediaCodecBlockModelHelper.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/MediaCodecBlockModelHelper.java
rename to tests/tests/media/common/src/android/media/cts/MediaCodecBlockModelHelper.java
diff --git a/tests/tests/media/src/android/media/cts/MediaCodecClearKeyPlayer.java b/tests/tests/media/common/src/android/media/cts/MediaCodecClearKeyPlayer.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/MediaCodecClearKeyPlayer.java
rename to tests/tests/media/common/src/android/media/cts/MediaCodecClearKeyPlayer.java
diff --git a/tests/tests/media/src/android/media/cts/MediaCodecPlayerTestBase.java b/tests/tests/media/common/src/android/media/cts/MediaCodecPlayerTestBase.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/MediaCodecPlayerTestBase.java
rename to tests/tests/media/common/src/android/media/cts/MediaCodecPlayerTestBase.java
diff --git a/tests/tests/media/src/android/media/cts/MediaCodecTunneledPlayer.java b/tests/tests/media/common/src/android/media/cts/MediaCodecTunneledPlayer.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/MediaCodecTunneledPlayer.java
rename to tests/tests/media/common/src/android/media/cts/MediaCodecTunneledPlayer.java
diff --git a/tests/tests/media/src/android/media/cts/MediaCodecWrapper.java b/tests/tests/media/common/src/android/media/cts/MediaCodecWrapper.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/MediaCodecWrapper.java
rename to tests/tests/media/common/src/android/media/cts/MediaCodecWrapper.java
diff --git a/tests/tests/media/src/android/media/cts/MediaHeavyPresubmitTest.java b/tests/tests/media/common/src/android/media/cts/MediaHeavyPresubmitTest.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/MediaHeavyPresubmitTest.java
rename to tests/tests/media/common/src/android/media/cts/MediaHeavyPresubmitTest.java
diff --git a/tests/tests/media/src/android/media/cts/MediaPlayerTestBase.java b/tests/tests/media/common/src/android/media/cts/MediaPlayerTestBase.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/MediaPlayerTestBase.java
rename to tests/tests/media/common/src/android/media/cts/MediaPlayerTestBase.java
diff --git a/tests/tests/media/src/android/media/cts/MediaProjectionActivity.java b/tests/tests/media/common/src/android/media/cts/MediaProjectionActivity.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/MediaProjectionActivity.java
rename to tests/tests/media/common/src/android/media/cts/MediaProjectionActivity.java
diff --git a/tests/tests/media/src/android/media/cts/MediaStubActivity.java b/tests/tests/media/common/src/android/media/cts/MediaStubActivity.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/MediaStubActivity.java
rename to tests/tests/media/common/src/android/media/cts/MediaStubActivity.java
diff --git a/tests/tests/media/src/android/media/cts/MediaStubActivity2.java b/tests/tests/media/common/src/android/media/cts/MediaStubActivity2.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/MediaStubActivity2.java
rename to tests/tests/media/common/src/android/media/cts/MediaStubActivity2.java
diff --git a/tests/tests/media/src/android/media/cts/MediaTimeProvider.java b/tests/tests/media/common/src/android/media/cts/MediaTimeProvider.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/MediaTimeProvider.java
rename to tests/tests/media/common/src/android/media/cts/MediaTimeProvider.java
diff --git a/tests/tests/media/src/android/media/cts/NdkInputSurface.java b/tests/tests/media/common/src/android/media/cts/NdkInputSurface.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/NdkInputSurface.java
rename to tests/tests/media/common/src/android/media/cts/NdkInputSurface.java
diff --git a/tests/tests/media/src/android/media/cts/NdkMediaCodec.java b/tests/tests/media/common/src/android/media/cts/NdkMediaCodec.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/NdkMediaCodec.java
rename to tests/tests/media/common/src/android/media/cts/NdkMediaCodec.java
diff --git a/tests/tests/media/src/android/media/cts/NonBlockingAudioTrack.java b/tests/tests/media/common/src/android/media/cts/NonBlockingAudioTrack.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/NonBlockingAudioTrack.java
rename to tests/tests/media/common/src/android/media/cts/NonBlockingAudioTrack.java
diff --git a/tests/tests/media/src/android/media/cts/NonMediaMainlineTest.java b/tests/tests/media/common/src/android/media/cts/NonMediaMainlineTest.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/NonMediaMainlineTest.java
rename to tests/tests/media/common/src/android/media/cts/NonMediaMainlineTest.java
diff --git a/tests/tests/media/src/android/media/cts/OutputSurface.java b/tests/tests/media/common/src/android/media/cts/OutputSurface.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/OutputSurface.java
rename to tests/tests/media/common/src/android/media/cts/OutputSurface.java
diff --git a/tests/tests/media/src/android/media/cts/PostProcTestBase.java b/tests/tests/media/common/src/android/media/cts/PostProcTestBase.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/PostProcTestBase.java
rename to tests/tests/media/common/src/android/media/cts/PostProcTestBase.java
diff --git a/tests/tests/media/src/android/media/cts/Preconditions.java b/tests/tests/media/common/src/android/media/cts/Preconditions.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/Preconditions.java
rename to tests/tests/media/common/src/android/media/cts/Preconditions.java
diff --git a/tests/tests/media/src/android/media/cts/RemoteVirtualDisplayService.java b/tests/tests/media/common/src/android/media/cts/RemoteVirtualDisplayService.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/RemoteVirtualDisplayService.java
rename to tests/tests/media/common/src/android/media/cts/RemoteVirtualDisplayService.java
diff --git a/tests/tests/media/src/android/media/cts/SdkMediaCodec.java b/tests/tests/media/common/src/android/media/cts/SdkMediaCodec.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/SdkMediaCodec.java
rename to tests/tests/media/common/src/android/media/cts/SdkMediaCodec.java
diff --git a/tests/tests/media/src/android/media/cts/TestMediaDataSource.java b/tests/tests/media/common/src/android/media/cts/TestMediaDataSource.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/TestMediaDataSource.java
rename to tests/tests/media/common/src/android/media/cts/TestMediaDataSource.java
diff --git a/tests/tests/media/src/android/media/cts/TestUtils.java b/tests/tests/media/common/src/android/media/cts/TestUtils.java
similarity index 98%
rename from tests/tests/media/src/android/media/cts/TestUtils.java
rename to tests/tests/media/common/src/android/media/cts/TestUtils.java
index ae4cb59..79aaada 100644
--- a/tests/tests/media/src/android/media/cts/TestUtils.java
+++ b/tests/tests/media/common/src/android/media/cts/TestUtils.java
@@ -78,7 +78,7 @@
* @param minVersion the minimum version
* @throws AssumptionViolatedException if module version < minVersion
*/
- static void assumeMainlineModuleAtLeast(String module, long minVersion) {
+ public static void assumeMainlineModuleAtLeast(String module, long minVersion) {
try {
long actualVersion = getModuleVersion(module);
assumeTrue("Assume module " + module + " version " + actualVersion + " < minVersion"
diff --git a/tests/tests/media/src/android/media/cts/TextureRender.java b/tests/tests/media/common/src/android/media/cts/TextureRender.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/TextureRender.java
rename to tests/tests/media/common/src/android/media/cts/TextureRender.java
diff --git a/tests/tests/media/src/android/media/cts/Utils.java b/tests/tests/media/common/src/android/media/cts/Utils.java
similarity index 98%
rename from tests/tests/media/src/android/media/cts/Utils.java
rename to tests/tests/media/common/src/android/media/cts/Utils.java
index c95768b..bf942a7 100644
--- a/tests/tests/media/src/android/media/cts/Utils.java
+++ b/tests/tests/media/common/src/android/media/cts/Utils.java
@@ -106,7 +106,7 @@
}
}
- protected static void toggleNotificationPolicyAccess(String packageName,
+ public static void toggleNotificationPolicyAccess(String packageName,
Instrumentation instrumentation, boolean on) throws IOException {
String command = " cmd notification " + (on ? "allow_dnd " : "disallow_dnd ") + packageName;
diff --git a/tests/tests/media/src/android/media/cts/WorkDir.java b/tests/tests/media/common/src/android/media/cts/WorkDir.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/WorkDir.java
rename to tests/tests/media/common/src/android/media/cts/WorkDir.java
diff --git a/tests/tests/media/src/android/media/cts/YUVImage.java b/tests/tests/media/common/src/android/media/cts/YUVImage.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/YUVImage.java
rename to tests/tests/media/common/src/android/media/cts/YUVImage.java
diff --git a/tests/tests/media/src/android/media/cts/MediaCodecBlockModelTest.java b/tests/tests/media/src/android/media/cts/MediaCodecBlockModelTest.java
index 1585462..b4f41cd 100644
--- a/tests/tests/media/src/android/media/cts/MediaCodecBlockModelTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaCodecBlockModelTest.java
@@ -358,18 +358,19 @@
rowSampling = 2;
colSampling = 2;
}
- long timestampUs = 1000000l * frameIndex / kFrameRate;
- ++frameIndex;
- if (frameIndex >= 32) {
- signaledEos = true;
- }
- timestampList.add(timestampUs);
- mediaCodec.getQueueRequest(event.index)
- .setHardwareBuffer(buffer)
- .setPresentationTimeUs(timestampUs)
- .setFlags(signaledEos ? MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0)
- .queue();
}
+
+ long timestampUs = 1000000l * frameIndex / kFrameRate;
+ ++frameIndex;
+ if (frameIndex >= 32) {
+ signaledEos = true;
+ }
+ timestampList.add(timestampUs);
+ mediaCodec.getQueueRequest(event.index)
+ .setHardwareBuffer(buffer)
+ .setPresentationTimeUs(timestampUs)
+ .setFlags(signaledEos ? MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0)
+ .queue();
} else {
MediaCodec.OutputFrame frame = mediaCodec.getOutputFrame(event.index);
eos = (frame.getFlags() & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0;
diff --git a/tests/tests/mediadrm/Android.bp b/tests/tests/mediadrm/Android.bp
index 5430869..27afc76 100644
--- a/tests/tests/mediadrm/Android.bp
+++ b/tests/tests/mediadrm/Android.bp
@@ -33,9 +33,8 @@
"androidx.test.ext.junit",
"compatibility-device-util-axt",
"ctsdeviceutillegacy-axt",
- "ctsmediautil",
"ctstestrunner-axt",
- "cts-media-drm-common",
+ "cts-media-common",
"cts-media-res-lib",
"hamcrest-library",
"ctstestserver",
diff --git a/tests/tests/mediatranscoding/OWNERS b/tests/tests/mediatranscoding/OWNERS
index dbe0a55..9334bfa 100644
--- a/tests/tests/mediatranscoding/OWNERS
+++ b/tests/tests/mediatranscoding/OWNERS
@@ -1,3 +1,4 @@
# Bug component: 761430
-hkuang@google.com
-lnilsson@google.com
+
+# go/android-fwk-media-solutions for info on areas of ownership.
+include platform/frameworks/av:/media/janitors/media_solutions_OWNERS
\ No newline at end of file
diff --git a/tests/tests/mediatranscoding/res/raw/Video_HEVC_480p_30Frames.mp4 b/tests/tests/mediatranscoding/res/raw/Video_HEVC_480p_30Frames.mp4
new file mode 100644
index 0000000..41f6c22
--- /dev/null
+++ b/tests/tests/mediatranscoding/res/raw/Video_HEVC_480p_30Frames.mp4
Binary files differ
diff --git a/tests/tests/mediatranscoding/res/raw/Video_HEVC_720p_30Frames.mp4 b/tests/tests/mediatranscoding/res/raw/Video_HEVC_720p_30Frames.mp4
new file mode 100644
index 0000000..7211fec1
--- /dev/null
+++ b/tests/tests/mediatranscoding/res/raw/Video_HEVC_720p_30Frames.mp4
Binary files differ
diff --git a/tests/tests/mediatranscoding/src/android/media/mediatranscoding/cts/MediaTranscodingManagerTest.java b/tests/tests/mediatranscoding/src/android/media/mediatranscoding/cts/MediaTranscodingManagerTest.java
index 15cdf5d..9cc7e1f 100644
--- a/tests/tests/mediatranscoding/src/android/media/mediatranscoding/cts/MediaTranscodingManagerTest.java
+++ b/tests/tests/mediatranscoding/src/android/media/mediatranscoding/cts/MediaTranscodingManagerTest.java
@@ -24,6 +24,9 @@
import android.content.pm.PackageManager;
import android.content.res.AssetFileDescriptor;
import android.media.ApplicationMediaCapabilities;
+import android.media.MediaCodec;
+import android.media.MediaCodecInfo;
+import android.media.MediaExtractor;
import android.media.MediaFormat;
import android.media.MediaTranscodingManager;
import android.media.MediaTranscodingManager.TranscodingRequest;
@@ -85,9 +88,9 @@
// Default setting for transcoding to H.264.
private static final String MIME_TYPE = MediaFormat.MIMETYPE_VIDEO_AVC;
- private static final int BIT_RATE = 20000000; // 20Mbps
- private static final int WIDTH = 1920;
- private static final int HEIGHT = 1080;
+ private static final int BIT_RATE = 4000000; // 4Mbps
+ private static final int WIDTH = 720;
+ private static final int HEIGHT = 480;
// Threshold for the psnr to make sure the transcoded video is valid.
private static final int PSNR_THRESHOLD = 20;
@@ -145,9 +148,9 @@
androidx.test.InstrumentationRegistry.registerInstance(
InstrumentationRegistry.getInstrumentation(), new Bundle());
- // Setup source HEVC file uri.
- mSourceHEVCVideoUri = resourceToUri(mContext, R.raw.Video_HEVC_30Frames,
- "Video_HEVC_30Frames.mp4");
+ // Setup default source HEVC 480p file uri.
+ mSourceHEVCVideoUri = resourceToUri(mContext, R.raw.Video_HEVC_480p_30Frames,
+ "Video_HEVC_480p_30Frames.mp4");
// Setup source AVC file uri.
mSourceAVCVideoUri = resourceToUri(mContext, R.raw.Video_AVC_30Frames,
@@ -376,6 +379,14 @@
TranscodingSession.RESULT_SUCCESS);
}
+ public void testHevcTranscoding720PVideo30FramesWithoutAudio() throws Exception {
+ if (shouldSkip()) {
+ return;
+ }
+ transcodeFile(resourceToUri(mContext, R.raw.Video_HEVC_720p_30Frames,
+ "Video_HEVC_720p_30Frames.mp4"), false /* testFileDescriptor */);
+ }
+
public void testAvcTranscoding1080PVideo30FramesWithoutAudio() throws Exception {
if (shouldSkip()) {
return;
@@ -423,14 +434,6 @@
if (shouldSkip()) {
return;
}
- MediaFormat format = new MediaFormat();
- format.setString(MediaFormat.KEY_MIME, MediaFormat.MIMETYPE_VIDEO_HEVC);
- format.setInteger(MediaFormat.KEY_WIDTH, 3840);
- format.setInteger(MediaFormat.KEY_HEIGHT, 2160);
- format.setInteger(MediaFormat.KEY_FRAME_RATE, 30);
- if (!MediaUtils.canDecode(format) || !MediaUtils.canEncode(format) ) {
- return;
- }
transcodeFile(resourceToUri(mContext, R.raw.Video_4K_HEVC_64Frames_Audio,
"Video_4K_HEVC_64Frames_Audio.mp4"), false /* testFileDescriptor */);
}
@@ -453,14 +456,26 @@
ApplicationMediaCapabilities clientCaps =
new ApplicationMediaCapabilities.Builder().build();
+ MediaFormat srcVideoFormat = getVideoTrackFormat(fileUri);
+ assertNotNull(srcVideoFormat);
+
+ int width = srcVideoFormat.getInteger(MediaFormat.KEY_WIDTH);
+ int height = srcVideoFormat.getInteger(MediaFormat.KEY_HEIGHT);
+
TranscodingRequest.VideoFormatResolver
resolver = new TranscodingRequest.VideoFormatResolver(clientCaps,
MediaFormat.createVideoFormat(
- MediaFormat.MIMETYPE_VIDEO_HEVC, WIDTH, HEIGHT));
+ MediaFormat.MIMETYPE_VIDEO_HEVC, width, height));
assertTrue(resolver.shouldTranscode());
MediaFormat videoTrackFormat = resolver.resolveVideoFormat();
assertNotNull(videoTrackFormat);
+ // Return if the source or target video format is not supported
+ if (!isFormatSupported(srcVideoFormat, false)
+ || !isFormatSupported(videoTrackFormat, true)) {
+ return;
+ }
+
int pid = android.os.Process.myPid();
int uid = android.os.Process.myUid();
@@ -758,4 +773,51 @@
assertTrue("Failed to receive at least 10 progress updates",
progressUpdateCount.get() > 10);
}
+
+ private MediaFormat getVideoTrackFormat(Uri fileUri) throws IOException {
+ MediaFormat videoFormat = null;
+ MediaExtractor extractor = new MediaExtractor();
+ extractor.setDataSource(fileUri.toString());
+ // Find video track format
+ for (int trackID = 0; trackID < extractor.getTrackCount(); trackID++) {
+ MediaFormat format = extractor.getTrackFormat(trackID);
+ if (format.getString(MediaFormat.KEY_MIME).startsWith("video/")) {
+ videoFormat = format;
+ break;
+ }
+ }
+ extractor.release();
+ return videoFormat;
+ }
+
+ private boolean isFormatSupported(MediaFormat format, boolean isEncoder) {
+ String mime = format.getString(MediaFormat.KEY_MIME);
+ MediaCodec codec = null;
+ try {
+ // The underlying transcoder library uses AMediaCodec_createEncoderByType
+ // to create encoder. So we cannot perform an exhaustive search of
+ // all codecs that support the format. This is because the codec that
+ // advertises support for the format during search may not be the one
+ // instantiated by the transcoder library. So, we have to check whether
+ // the codec returned by createEncoderByType supports the format.
+ // The same point holds for decoder too.
+ if (isEncoder) {
+ codec = MediaCodec.createEncoderByType(mime);
+ } else {
+ codec = MediaCodec.createDecoderByType(mime);
+ }
+ MediaCodecInfo info = codec.getCodecInfo();
+ MediaCodecInfo.CodecCapabilities caps = info.getCapabilitiesForType(mime);
+ if (caps != null && caps.isFormatSupported(format) && info.isHardwareAccelerated()) {
+ return true;
+ }
+ } catch (IOException e) {
+ Log.d(TAG, "Exception: " + e);
+ } finally {
+ if (codec != null) {
+ codec.release();
+ }
+ }
+ return false;
+ }
}
diff --git a/tests/tests/neuralnetworks/benchmark/src/com/android/nn/benchmark/cts/NNAccuracyTest.java b/tests/tests/neuralnetworks/benchmark/src/com/android/nn/benchmark/cts/NNAccuracyTest.java
index c6ad0dc..1851b36 100644
--- a/tests/tests/neuralnetworks/benchmark/src/com/android/nn/benchmark/cts/NNAccuracyTest.java
+++ b/tests/tests/neuralnetworks/benchmark/src/com/android/nn/benchmark/cts/NNAccuracyTest.java
@@ -22,6 +22,7 @@
import android.util.Pair;
import androidx.test.filters.LargeTest;
+import androidx.test.filters.RequiresDevice;
import androidx.test.rule.ActivityTestRule;
import com.android.nn.benchmark.core.BenchmarkException;
@@ -91,6 +92,7 @@
}
@Test
+ @RequiresDevice
@LargeTest
public void testNNAPI() throws BenchmarkException, IOException {
List<String> accelerators = new ArrayList<>();
diff --git a/tests/tests/opengl/src/android/opengl/cts/OpenGlEsVersionTest.java b/tests/tests/opengl/src/android/opengl/cts/OpenGlEsVersionTest.java
index ef2a0c1..e5026de 100644
--- a/tests/tests/opengl/src/android/opengl/cts/OpenGlEsVersionTest.java
+++ b/tests/tests/opengl/src/android/opengl/cts/OpenGlEsVersionTest.java
@@ -81,8 +81,6 @@
@CddTest(requirement="7.1.4.1/C-0-1")
@Test
public void testOpenGlEsVersion() throws InterruptedException {
- Assume.assumeFalse(isRunningANGLE());
-
int detectedMajorVersion = getDetectedMajorVersion();
int reportedVersion = getVersionFromActivityManager(mActivity);
@@ -102,8 +100,6 @@
@CddTest(requirement="7.1.4.1/C-2-2")
@Test
public void testRequiredExtensions() throws InterruptedException {
- Assume.assumeFalse(isRunningANGLE());
-
int reportedVersion = getVersionFromActivityManager(mActivity);
if (getMajorVersion(reportedVersion) < 3)
@@ -134,8 +130,6 @@
@CddTest(requirement="7.1.4.1/C-2-1,C-5-1,C-4-1")
@Test
public void testExtensionPack() throws InterruptedException {
- Assume.assumeFalse(isRunningANGLE());
-
// Requirements:
// 1. If the device claims support for the system feature, the extension must be available.
// 2. If the extension is available, the device must claim support for it.
@@ -165,8 +159,6 @@
@CddTest(requirement="7.9.2/C-1-4")
@Test
public void testOpenGlEsVersionForVrHighPerformance() throws InterruptedException {
- Assume.assumeFalse(isRunningANGLE());
-
if (!supportsVrHighPerformance())
return;
restartActivityWithClientVersion(3);
@@ -183,8 +175,6 @@
@CddTest(requirement="7.9.2/C-1-6,C-1-8")
@Test
public void testRequiredExtensionsForVrHighPerformance() throws InterruptedException {
- Assume.assumeFalse(isRunningANGLE());
-
if (!supportsVrHighPerformance())
return;
restartActivityWithClientVersion(3);
@@ -291,8 +281,6 @@
"EGL_EXT_surface_CTA861_3_metadata",
};
- Assume.assumeFalse(isRunningANGLE());
-
// This requirement only applies if device is handheld and claims to be HDR capable.
boolean isHdrCapable = mActivity.getResources().getConfiguration().isScreenHdr();
if (!isHdrCapable || !isHandheld())
@@ -336,8 +324,6 @@
@CddTest(requirement="7.1.4.5/C-1-5")
@Test
public void testRequiredEglExtensionsForWideColorDisplay() {
- Assume.assumeFalse(isRunningANGLE());
-
// See CDD section 7.1.4.5
// This test covers the EGL portion of the CDD requirement. The VK portion of the
// requirement is covered elsewhere.
@@ -523,14 +509,4 @@
PackageManager pm = mActivity.getPackageManager();
return pm.hasSystemFeature(PackageManager.FEATURE_VR_MODE_HIGH_PERFORMANCE);
}
-
- private boolean isRunningANGLE() {
- try {
- // We expect to find something like: OpenGL ES 1.0 (ANGLE 2.1.0.310294adacdd)
- return mActivity.getVersionString().contains("ANGLE");
- } catch (Exception e) {
- Log.e(TAG, "Caught exception: " + e);
- }
- return false;
- }
}
diff --git a/tests/tests/os/jni/android_os_cts_CpuInstructions.cpp b/tests/tests/os/jni/android_os_cts_CpuInstructions.cpp
index c8cf735..ac1feba 100644
--- a/tests/tests/os/jni/android_os_cts_CpuInstructions.cpp
+++ b/tests/tests/os/jni/android_os_cts_CpuInstructions.cpp
@@ -83,14 +83,6 @@
asm volatile ( "swp r0, r0, [%0]" : "+r"(ptr) : : "r0" );
}
-static void setend()
-{
- asm volatile (
- "setend be" "\n"
- "setend le" "\n"
- );
-}
-
static void cp15_dsb()
{
asm volatile ( "mcr p15, 0, %0, c7, c10, 4" : : "r"(0) );
@@ -101,11 +93,6 @@
return test_instruction(swp);
}
-jboolean android_os_cts_CpuInstructions_hasSetend(JNIEnv *, jobject)
-{
- return test_instruction(setend);
-}
-
jboolean android_os_cts_CpuInstructions_hasCp15Barriers(JNIEnv *, jobject)
{
return test_instruction(cp15_dsb);
@@ -116,11 +103,6 @@
return false;
}
-jboolean android_os_cts_CpuInstructions_hasSetend(JNIEnv *, jobject)
-{
- return false;
-}
-
jboolean android_os_cts_CpuInstructions_hasCp15Barriers(JNIEnv *, jobject)
{
return false;
@@ -130,7 +112,6 @@
static JNINativeMethod gMethods[] = {
{ "canReadCntvct", "()Z", (void *)android_os_cts_CpuInstructions_canReadCntvct },
{ "hasSwp", "()Z", (void *)android_os_cts_CpuInstructions_hasSwp },
- { "hasSetend", "()Z", (void *)android_os_cts_CpuInstructions_hasSetend },
{ "hasCp15Barriers", "()Z",
(void *)android_os_cts_CpuInstructions_hasCp15Barriers },
};
diff --git a/tests/tests/os/src/android/os/cts/BundleTest.java b/tests/tests/os/src/android/os/cts/BundleTest.java
index bb6b904..8c91216 100644
--- a/tests/tests/os/src/android/os/cts/BundleTest.java
+++ b/tests/tests/os/src/android/os/cts/BundleTest.java
@@ -54,6 +54,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
+import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.Callable;
@@ -837,6 +838,61 @@
}
@Test
+ public void testHasFileDescriptors_withParcelable() throws Exception {
+ assertTrue(mBundle.isEmpty());
+ assertFalse(mBundle.hasFileDescriptors());
+
+ mBundle.putParcelable("key", ParcelFileDescriptor.dup(FileDescriptor.in));
+ assertTrue(mBundle.hasFileDescriptors());
+
+ mBundle.putParcelable("key", new CustomParcelable(13, "Tiramisu"));
+ assertFalse(mBundle.hasFileDescriptors());
+ }
+
+ @Test
+ public void testHasFileDescriptors_withStringArray() throws Exception {
+ assertTrue(mBundle.isEmpty());
+ assertFalse(mBundle.hasFileDescriptors());
+
+ mBundle.putStringArray("key", new String[] { "string" });
+ assertFalse(mBundle.hasFileDescriptors());
+ }
+
+ @Test
+ public void testHasFileDescriptors_withSparseArray() throws Exception {
+ assertTrue(mBundle.isEmpty());
+ assertFalse(mBundle.hasFileDescriptors());
+
+ SparseArray<Parcelable> fdArray = new SparseArray<>();
+ fdArray.append(0, ParcelFileDescriptor.dup(FileDescriptor.in));
+ mBundle.putSparseParcelableArray("key", fdArray);
+ assertTrue(mBundle.hasFileDescriptors());
+
+ SparseArray<Parcelable> noFdArray = new SparseArray<>();
+ noFdArray.append(0, new CustomParcelable(13, "Tiramisu"));
+ mBundle.putSparseParcelableArray("key", noFdArray);
+ assertFalse(mBundle.hasFileDescriptors());
+
+ SparseArray<Parcelable> emptyArray = new SparseArray<>();
+ mBundle.putSparseParcelableArray("key", emptyArray);
+ assertFalse(mBundle.hasFileDescriptors());
+ }
+
+ @Test
+ public void testHasFileDescriptors_withParcelableArray() throws Exception {
+ assertTrue(mBundle.isEmpty());
+ assertFalse(mBundle.hasFileDescriptors());
+
+ mBundle.putParcelableArray("key",
+ new Parcelable[] { ParcelFileDescriptor.dup(FileDescriptor.in) });
+ assertTrue(mBundle.hasFileDescriptors());
+
+ mBundle.putParcelableArray("key",
+ new Parcelable[] { new CustomParcelable(13, "Tiramisu") });
+ assertFalse(mBundle.hasFileDescriptors());
+ }
+
+ @Test
public void testHasFileDescriptorsOnNullValuedCollection() {
assertFalse(mBundle.hasFileDescriptors());
@@ -857,6 +913,23 @@
mBundle.clear();
}
+ @SuppressWarnings("unchecked")
+ @Test
+ public void testHasFileDescriptors_withNestedContainers() throws IOException {
+ // Purposely omitting generic types here, this is still "valid" app code after all.
+ ArrayList nested = new ArrayList(
+ Arrays.asList(Arrays.asList(ParcelFileDescriptor.dup(FileDescriptor.in))));
+ mBundle.putParcelableArrayList("list", nested);
+ assertTrue(mBundle.hasFileDescriptors());
+
+ roundtrip(/* parcel */ false);
+ assertTrue(mBundle.hasFileDescriptors());
+
+ mBundle.isEmpty(); // Triggers partial deserialization (leaving lazy values)
+ mBundle.remove("unexistent"); // Removes cached value (removes FLAG_HAS_FDS_KNOWN)
+ assertTrue(mBundle.hasFileDescriptors()); // Checks lazy value
+ }
+
@Test
public void testHasFileDescriptors_withOriginalParcelContainingFdButNotItems() throws IOException {
mBundle.putParcelable("fd", ParcelFileDescriptor.dup(FileDescriptor.in));
diff --git a/tests/tests/os/src/android/os/cts/CpuInstructions.java b/tests/tests/os/src/android/os/cts/CpuInstructions.java
index 45fb2f1..1def367 100644
--- a/tests/tests/os/src/android/os/cts/CpuInstructions.java
+++ b/tests/tests/os/src/android/os/cts/CpuInstructions.java
@@ -24,6 +24,5 @@
public static native boolean canReadCntvct();
public static native boolean hasSwp();
- public static native boolean hasSetend();
public static native boolean hasCp15Barriers();
}
diff --git a/tests/tests/os/src/android/os/cts/CpuInstructionsTest.java b/tests/tests/os/src/android/os/cts/CpuInstructionsTest.java
index 780be99..3d4f396 100644
--- a/tests/tests/os/src/android/os/cts/CpuInstructionsTest.java
+++ b/tests/tests/os/src/android/os/cts/CpuInstructionsTest.java
@@ -41,8 +41,6 @@
assertTrue("Machine does not support ARM swp instruction emulation",
CpuInstructions.hasSwp());
- assertTrue("Machine does not support ARM setend instruction emulation",
- CpuInstructions.hasSetend());
assertTrue("Machine does not support ARM CP15 barrier emulation",
CpuInstructions.hasCp15Barriers());
}
diff --git a/tests/tests/os/src/android/os/cts/ParcelTest.java b/tests/tests/os/src/android/os/cts/ParcelTest.java
index 054adf9..8b5a6e8 100644
--- a/tests/tests/os/src/android/os/cts/ParcelTest.java
+++ b/tests/tests/os/src/android/os/cts/ParcelTest.java
@@ -2051,6 +2051,59 @@
p.recycle();
}
+ public void testReadSerializableWithClass_whenNull(){
+ Parcel p = Parcel.obtain();
+ MockClassLoader mcl = new MockClassLoader();
+ p.writeSerializable(null);
+ p.setDataPosition(0);
+ assertNull(p.readSerializable(mcl, Exception.class));
+
+ p.setDataPosition(0);
+ assertNull(p.readSerializable(null, Exception.class));
+ p.recycle();
+ }
+
+ public void testReadSerializableWithClass_whenSameClass(){
+ Parcel p = Parcel.obtain();
+ MockClassLoader mcl = new MockClassLoader();
+ Throwable throwable = new Throwable("test");
+ p.writeSerializable(throwable);
+ p.setDataPosition(0);
+ Object object = p.readSerializable(mcl, Throwable.class);
+ assertTrue(object instanceof Throwable);
+ Throwable t1 = (Throwable) object;
+ assertEquals("test", t1.getMessage());
+
+ p.setDataPosition(0);
+ Object object1 = p.readSerializable(null, Throwable.class);
+ assertTrue(object1 instanceof Throwable);
+ Throwable t2 = (Throwable) object1;
+ assertEquals("test", t2.getMessage());
+ p.recycle();
+ }
+
+ public void testReadSerializableWithClass_whenSubClass(){
+ Parcel p = Parcel.obtain();
+ MockClassLoader mcl = new MockClassLoader();
+ Exception exception = new Exception("test");
+ p.writeSerializable(exception);
+ p.setDataPosition(0);
+ Object object = p.readSerializable(mcl, Throwable.class);
+ assertTrue(object instanceof Exception);
+ Exception e1 = (Exception) object;
+ assertEquals("test", e1.getMessage());
+
+ p.setDataPosition(0);
+ Object object1 = p.readSerializable(null, Throwable.class);
+ assertTrue(object1 instanceof Exception);
+ Exception e2 = (Exception) object1;
+ assertEquals("test", e2.getMessage());
+
+ p.setDataPosition(0);
+ assertThrows(BadParcelableException.class, () -> p.readSerializable(mcl, String.class));
+ p.recycle();
+ }
+
public void testReadParcelable() {
Parcel p;
MockClassLoader mcl = new MockClassLoader();
@@ -3342,6 +3395,182 @@
p.recycle();
}
+ public void testInterfaceArray() {
+ Parcel p;
+ MockIInterface[] iface2 = {new MockIInterface(), new MockIInterface(), null};
+ MockIInterface[] iface3 = new MockIInterface[iface2.length];
+ MockIInterface[] iface4 = new MockIInterface[iface2.length + 1];
+
+ p = Parcel.obtain();
+ p.writeInterfaceArray(null);
+ p.setDataPosition(0);
+ try {
+ // input array shouldn't be null
+ p.readInterfaceArray(null, null);
+ fail("Should throw a RuntimeException");
+ } catch (RuntimeException e) {
+ // expected
+ }
+
+ p.setDataPosition(0);
+ try {
+ // can't read null array
+ p.readInterfaceArray(iface3, MockIInterface::asInterface);
+ fail("Should throw a RuntimeException");
+ } catch (RuntimeException e) {
+ // expected
+ }
+
+ p.setDataPosition(0);
+ // null if parcel has null array
+ assertNull(p.createInterfaceArray(MockIInterface[]::new, MockIInterface::asInterface));
+ p.recycle();
+
+ p = Parcel.obtain();
+ p.writeInterfaceArray(iface2);
+ p.setDataPosition(0);
+ try {
+ // input array shouldn't be null
+ p.readInterfaceArray(null, null);
+ fail("Should throw a RuntimeException");
+ } catch (RuntimeException e) {
+ // expected
+ }
+
+ p.setDataPosition(0);
+ try {
+ // input array should be the same size
+ p.readInterfaceArray(iface4, MockIInterface::asInterface);
+ fail("Should throw a RuntimeException");
+ } catch (RuntimeException e) {
+ // expected
+ }
+
+ p.setDataPosition(0);
+ try {
+ // asInterface shouldn't be null
+ p.readInterfaceArray(iface3, null);
+ fail("Should throw a RuntimeException");
+ } catch (RuntimeException e) {
+ // expected
+ }
+
+ p.setDataPosition(0);
+ // read into input array with the exact size
+ p.readInterfaceArray(iface3, MockIInterface::asInterface);
+ for (int i = 0; i < iface3.length; i++) {
+ assertEquals(iface2[i], iface3[i]);
+ }
+
+ p.setDataPosition(0);
+ try {
+ // newArray/asInterface shouldn't be null
+ p.createInterfaceArray(null, null);
+ fail("Should throw a RuntimeException");
+ } catch (RuntimeException e) {
+ // expected
+ }
+
+ p.setDataPosition(0);
+ // create a new array from parcel
+ MockIInterface[] iface5 =
+ p.createInterfaceArray(MockIInterface[]::new, MockIInterface::asInterface);
+ assertNotNull(iface5);
+ assertEquals(iface2.length, iface5.length);
+ for (int i = 0; i < iface5.length; i++) {
+ assertEquals(iface2[i], iface5[i]);
+ }
+ p.recycle();
+ }
+
+ public void testInterfaceList() {
+ Parcel p;
+ ArrayList<MockIInterface> arrayList = new ArrayList<>();
+ ArrayList<MockIInterface> arrayList2 = new ArrayList<>();
+ ArrayList<MockIInterface> arrayList3;
+ arrayList.add(new MockIInterface());
+ arrayList.add(new MockIInterface());
+ arrayList.add(null);
+
+ p = Parcel.obtain();
+ p.writeInterfaceList(null);
+ p.setDataPosition(0);
+ try {
+ // input list shouldn't be null
+ p.readInterfaceList(null, null);
+ fail("Should throw a RuntimeException");
+ } catch (RuntimeException e) {
+ // expected
+ }
+
+ p.setDataPosition(0);
+ arrayList2.clear();
+ arrayList2.add(null);
+ try {
+ // can't read null list into non-empty list
+ p.readInterfaceList(arrayList2, MockIInterface::asInterface);
+ fail("Should throw a RuntimeException");
+ } catch (RuntimeException e) {
+ // expected
+ }
+
+ p.setDataPosition(0);
+ arrayList2.clear();
+ // read null list into empty list
+ p.readInterfaceList(arrayList2, MockIInterface::asInterface);
+ assertEquals(0, arrayList2.size());
+
+ p.setDataPosition(0);
+ // null if parcel has null list
+ arrayList3 = p.createInterfaceArrayList(MockIInterface::asInterface);
+ assertNull(arrayList3);
+ p.recycle();
+
+ p = Parcel.obtain();
+ p.writeInterfaceList(arrayList);
+ p.setDataPosition(0);
+ try {
+ // input list shouldn't be null
+ p.readInterfaceList(null, null);
+ fail("Should throw a RuntimeException");
+ } catch (RuntimeException e) {
+ // expected
+ }
+
+ p.setDataPosition(0);
+ arrayList2.clear();
+ try {
+ // asInterface shouldn't be null
+ p.readInterfaceList(arrayList2, null);
+ fail("Should throw a RuntimeException");
+ } catch (RuntimeException e) {
+ //expected
+ }
+
+ p.setDataPosition(0);
+ arrayList2.clear();
+ // fill a list with parcel
+ p.readInterfaceList(arrayList2, MockIInterface::asInterface);
+ assertEquals(arrayList, arrayList2);
+
+ p.setDataPosition(0);
+ arrayList2.clear();
+ // add one more item
+ for (int i=0; i<arrayList.size() + 1; i++) {
+ arrayList2.add(null);
+ }
+ // extra item should be discarded after read
+ p.readInterfaceList(arrayList2, MockIInterface::asInterface);
+ assertEquals(arrayList, arrayList2);
+
+ p.setDataPosition(0);
+ // create a new ArrayList from parcel
+ arrayList3 = p.createInterfaceArrayList(MockIInterface::asInterface);
+ assertEquals(arrayList, arrayList3);
+ p.recycle();
+ }
+
+
@SuppressWarnings("unchecked")
public void testWriteMap() {
Parcel p;
@@ -3372,6 +3601,84 @@
p.recycle();
}
+ public void testReadMapWithClass_whenNull() {
+ Parcel p = Parcel.obtain();
+ MockClassLoader mcl = new MockClassLoader();
+ p.writeMap(null);
+ HashMap<String, Intent> map = new HashMap<>();
+
+ p.setDataPosition(0);
+ p.readMap(map, mcl, String.class, Intent.class);
+ assertEquals(0, map.size());
+
+ p.recycle();
+ }
+
+ public void testReadMapWithClass_whenMismatchingClass() {
+ Parcel p = Parcel.obtain();
+ ClassLoader loader = getClass().getClassLoader();
+ HashMap<Signature, TestSubIntent> map = new HashMap<>();
+
+ Intent baseIntent = new Intent();
+ map.put(new Signature("1234"), new TestSubIntent(
+ baseIntent, "test_intent1"));
+ map.put(new Signature("4321"), new TestSubIntent(
+ baseIntent, "test_intent2"));
+ p.writeMap(map);
+
+ p.setDataPosition(0);
+ assertThrows(BadParcelableException.class, () ->
+ p.readMap(new HashMap<Intent, TestSubIntent>(), loader,
+ Intent.class, TestSubIntent.class));
+
+ p.setDataPosition(0);
+ assertThrows(BadParcelableException.class, () ->
+ p.readMap(new HashMap<Signature, Signature>(), loader,
+ Signature.class, Signature.class));
+ p.recycle();
+ }
+
+ public void testReadMapWithClass_whenSameClass() {
+ Parcel p = Parcel.obtain();
+ ClassLoader loader = getClass().getClassLoader();
+ HashMap<String, TestSubIntent> map = new HashMap<>();
+ HashMap<String, TestSubIntent> map2 = new HashMap<>();
+
+ Intent baseIntent = new Intent();
+ map.put("key1", new TestSubIntent(
+ baseIntent, "test_intent1"));
+ map.put("key2", new TestSubIntent(
+ baseIntent, "test_intent2"));
+ p.writeMap(map);
+ p.setDataPosition(0);
+ p.readMap(map2, loader, String.class, TestSubIntent.class);
+ assertEquals(map, map2);
+
+ p.recycle();
+ }
+
+ public void testReadMapWithClass_whenSubClass() {
+ Parcel p = Parcel.obtain();
+ ClassLoader loader = getClass().getClassLoader();
+ HashMap<TestSubIntent, TestSubIntent> map = new HashMap<>();
+
+ Intent baseIntent = new Intent();
+ map.put(new TestSubIntent(baseIntent, "test_intent_key1"), new TestSubIntent(
+ baseIntent, "test_intent_val1"));
+ p.writeMap(map);
+ p.setDataPosition(0);
+ HashMap<Intent, Intent> map2 = new HashMap<>();
+ p.readMap(map2, loader, Intent.class, TestSubIntent.class);
+ assertEquals(map, map2);
+
+ p.setDataPosition(0);
+ HashMap<Intent, Intent> map3 = new HashMap<>();
+ p.readMap(map3, loader, TestSubIntent.class, Intent.class);
+ assertEquals(map, map3);
+
+ p.recycle();
+ }
+
@SuppressWarnings("unchecked")
public void testReadHashMap() {
Parcel p;
@@ -3402,6 +3709,80 @@
p.recycle();
}
+ public void testReadHashMapWithClass_whenNull() {
+ Parcel p = Parcel.obtain();
+ MockClassLoader mcl = new MockClassLoader();
+ p.writeMap(null);
+ p.setDataPosition(0);
+ assertNull(p.readHashMap(mcl, String.class, Intent.class));
+
+ p.setDataPosition(0);
+ assertNull(p.readHashMap(null, String.class, Intent.class));
+ p.recycle();
+ }
+
+ public void testReadHashMapWithClass_whenMismatchingClass() {
+ Parcel p = Parcel.obtain();
+ ClassLoader loader = getClass().getClassLoader();
+ HashMap<Signature, TestSubIntent> map = new HashMap<>();
+
+ Intent baseIntent = new Intent();
+ map.put(new Signature("1234"), new TestSubIntent(
+ baseIntent, "test_intent1"));
+ map.put(new Signature("4321"), new TestSubIntent(
+ baseIntent, "test_intent2"));
+ p.writeMap(map);
+
+ p.setDataPosition(0);
+ assertThrows(BadParcelableException.class, () ->
+ p.readHashMap(loader, Intent.class, TestSubIntent.class));
+
+ p.setDataPosition(0);
+ assertThrows(BadParcelableException.class, () ->
+ p.readHashMap(loader, Signature.class, Signature.class));
+ p.recycle();
+ }
+
+ public void testReadHashMapWithClass_whenSameClass() {
+ Parcel p = Parcel.obtain();
+ ClassLoader loader = getClass().getClassLoader();
+ HashMap<String, TestSubIntent> map = new HashMap<>();
+
+ Intent baseIntent = new Intent();
+ map.put("key1", new TestSubIntent(
+ baseIntent, "test_intent1"));
+ map.put("key2", new TestSubIntent(
+ baseIntent, "test_intent2"));
+
+ p.writeMap(map);
+ p.setDataPosition(0);
+ HashMap<String, TestSubIntent> map2 = p.readHashMap(loader, String.class,
+ TestSubIntent.class);
+ assertEquals(map, map2);
+
+ p.recycle();
+ }
+
+ public void testReadHashMapWithClass_whenSubClass() {
+ Parcel p = Parcel.obtain();
+ ClassLoader loader = getClass().getClassLoader();
+ HashMap<TestSubIntent, TestSubIntent> map = new HashMap<>();
+
+ Intent baseIntent = new Intent();
+ TestSubIntent test_intent_key1 = new TestSubIntent(baseIntent, "test_intent_key1");
+ map.put(test_intent_key1, new TestSubIntent(
+ baseIntent, "test_intent_val1"));
+ p.writeMap(map);
+ p.setDataPosition(0);
+ HashMap<Intent, Intent> map2 = p.readHashMap(loader, Intent.class, TestSubIntent.class);
+ assertEquals(map, map2);
+
+ p.setDataPosition(0);
+ HashMap<Intent, Intent> map3 = p.readHashMap(loader, TestSubIntent.class, Intent.class);
+ assertEquals(map, map3);
+ p.recycle();
+ }
+
@SuppressWarnings("unchecked")
public void testReadList() {
Parcel p;
@@ -3567,16 +3948,27 @@
}
}
- private class MockIInterface implements IInterface {
+ private static class MockIInterface implements IInterface {
public Binder binder;
-
+ private static final String DESCRIPTOR = "MockIInterface";
public MockIInterface() {
binder = new Binder();
+ binder.attachInterface(this, DESCRIPTOR);
}
public IBinder asBinder() {
return binder;
}
+
+ public static MockIInterface asInterface(IBinder binder) {
+ if (binder != null) {
+ IInterface iface = binder.queryLocalInterface(DESCRIPTOR);
+ if (iface != null && iface instanceof MockIInterface) {
+ return (MockIInterface) iface;
+ }
+ }
+ return null;
+ }
}
private static boolean parcelableWithBadCreatorInitializerHasRun;
@@ -3933,6 +4325,11 @@
final TestSubIntent other = (TestSubIntent) obj;
return mString.equals(other.mString);
}
+
+ @Override
+ public int hashCode() {
+ return mString.hashCode();
+ }
}
public static class ParcelObjectFreeService extends Service {
diff --git a/tests/tests/permission/src/android/permission/cts/OneTimePermissionTest.java b/tests/tests/permission/src/android/permission/cts/OneTimePermissionTest.java
index 70147e2..f243b3b 100644
--- a/tests/tests/permission/src/android/permission/cts/OneTimePermissionTest.java
+++ b/tests/tests/permission/src/android/permission/cts/OneTimePermissionTest.java
@@ -34,6 +34,7 @@
import android.provider.DeviceConfig;
import android.support.test.uiautomator.By;
import android.support.test.uiautomator.UiDevice;
+import android.support.test.uiautomator.UiObject2;
import androidx.test.platform.app.InstrumentationRegistry;
@@ -256,9 +257,10 @@
}
private void clickOneTimeButton() throws Throwable {
- UiAutomatorUtils.waitFindObject(By.res(
- "com.android.permissioncontroller:id/permission_allow_one_time_button"), 10000)
- .click();
+ final UiObject2 uiObject = UiAutomatorUtils.waitFindObject(By.res(
+ "com.android.permissioncontroller:id/permission_allow_one_time_button"), 10000);
+ Thread.sleep(500);
+ uiObject.click();
}
/**
diff --git a/tests/tests/preference/src/android/preference/cts/TestUtils.java b/tests/tests/preference/src/android/preference/cts/TestUtils.java
index 1992b95..e69e98f 100644
--- a/tests/tests/preference/src/android/preference/cts/TestUtils.java
+++ b/tests/tests/preference/src/android/preference/cts/TestUtils.java
@@ -16,6 +16,8 @@
package android.preference.cts;
+import static org.junit.Assert.assertNotNull;
+
import android.app.Activity;
import android.app.Instrumentation;
import android.app.UiAutomation;
@@ -69,6 +71,7 @@
waitForIdle();
Bitmap bt = mAutomation.takeScreenshot();
+ assertNotNull("Screenshot must not return null", bt);
// Crop-out the status bar to avoid flakiness with changing notifications / time.
int statusBarHeight = getStatusBarHeight();
diff --git a/tests/tests/security/native/Android.bp b/tests/tests/security/native/Android.bp
index c0cb8c5..bf840b6 100644
--- a/tests/tests/security/native/Android.bp
+++ b/tests/tests/security/native/Android.bp
@@ -28,5 +28,8 @@
":__subpackages__",
],
srcs: ["utils.cpp"],
+ shared_libs: [
+ "libbase",
+ ],
export_include_dirs: ["."],
}
diff --git a/tests/tests/security/native/encryption/FileBasedEncryptionPolicyTest.cpp b/tests/tests/security/native/encryption/FileBasedEncryptionPolicyTest.cpp
index 2952105..e5d824c 100644
--- a/tests/tests/security/native/encryption/FileBasedEncryptionPolicyTest.cpp
+++ b/tests/tests/security/native/encryption/FileBasedEncryptionPolicyTest.cpp
@@ -37,17 +37,6 @@
#define R_API_LEVEL 30
#define S_API_LEVEL 31
-static int getFirstApiLevel(void) {
- int level = property_get_int32("ro.product.first_api_level", 0);
- if (level == 0) {
- level = property_get_int32("ro.build.version.sdk", 0);
- }
- if (level == 0) {
- ADD_FAILURE() << "Failed to determine first API level";
- }
- return level;
-}
-
#ifdef __arm__
// For ARM32, assemble the 'aese.8' instruction as an .inst, since otherwise
// clang does not accept it. It would be allowed in a separate file compiled
@@ -203,6 +192,7 @@
// https://source.android.com/security/encryption/file-based.html
TEST(FileBasedEncryptionPolicyTest, allowedPolicy) {
int first_api_level = getFirstApiLevel();
+ int vendor_api_level = getVendorApiLevel();
char crypto_type[PROPERTY_VALUE_MAX];
struct fscrypt_get_policy_ex_arg arg;
int res;
@@ -219,10 +209,13 @@
property_get("ro.crypto.type", crypto_type, "");
GTEST_LOG_(INFO) << "ro.crypto.type is '" << crypto_type << "'";
GTEST_LOG_(INFO) << "First API level is " << first_api_level;
+ GTEST_LOG_(INFO) << "Vendor API level is " << vendor_api_level;
// This feature name check only applies to devices that first shipped with
// SC or later.
- if(first_api_level >= S_API_LEVEL &&
+ int min_api_level = (first_api_level < vendor_api_level) ? first_api_level
+ : vendor_api_level;
+ if (min_api_level >= S_API_LEVEL &&
!deviceSupportsFeature("android.hardware.security.model.compatible")) {
GTEST_SKIP()
<< "Skipping test: FEATURE_SECURITY_MODEL_COMPATIBLE missing.";
diff --git a/tests/tests/security/native/utils.cpp b/tests/tests/security/native/utils.cpp
index 373b00e..fb9b1ee 100644
--- a/tests/tests/security/native/utils.cpp
+++ b/tests/tests/security/native/utils.cpp
@@ -15,6 +15,10 @@
*/
#include <string>
+#include <vector>
+
+#include <android-base/properties.h>
+#include <gtest/gtest.h>
#include "utils.h"
@@ -34,4 +38,29 @@
pclose(p);
}
return device_supports_feature;
+}
+
+int getFirstApiLevel() {
+ int level = android::base::GetIntProperty("ro.product.first_api_level", 0);
+ if (level == 0) {
+ level = android::base::GetIntProperty("ro.build.version.sdk", 0);
+ }
+ if (level == 0) {
+ ADD_FAILURE() << "Failed to determine first API level";
+ }
+ return level;
+}
+
+int getVendorApiLevel() {
+ std::vector<std::string> BOARD_API_LEVEL_PROPS = {
+ "ro.board.api_level", "ro.board.first_api_level", "ro.vndk.version",
+ "ro.vendor.build.version.sdk"};
+ const int API_LEVEL_CURRENT = 10000;
+ for (const auto& api_level_prop : BOARD_API_LEVEL_PROPS) {
+ int api_level = android::base::GetIntProperty(api_level_prop, API_LEVEL_CURRENT);
+ if (api_level != API_LEVEL_CURRENT) {
+ return api_level;
+ }
+ }
+ return API_LEVEL_CURRENT;
}
\ No newline at end of file
diff --git a/tests/tests/security/native/utils.h b/tests/tests/security/native/utils.h
index d6c651c..3176dbb 100644
--- a/tests/tests/security/native/utils.h
+++ b/tests/tests/security/native/utils.h
@@ -18,5 +18,7 @@
#define CTS_TESTS_TESTS_SECURITY_NATIVE_UTILS_H
bool deviceSupportsFeature(const char *feature);
+int getFirstApiLevel();
+int getVendorApiLevel();
#endif // CTS_TESTS_TESTS_SECURITY_NATIVE_UTILS_H
diff --git a/tests/tests/security/native/verified_boot/VerifiedBootTest.cpp b/tests/tests/security/native/verified_boot/VerifiedBootTest.cpp
index 625ef66..424da9a9 100644
--- a/tests/tests/security/native/verified_boot/VerifiedBootTest.cpp
+++ b/tests/tests/security/native/verified_boot/VerifiedBootTest.cpp
@@ -28,23 +28,14 @@
// The relevant Android API levels
constexpr auto S_API_LEVEL = 31;
-static int getFirstApiLevel() {
- int level = android::base::GetIntProperty("ro.product.first_api_level", 0);
- if (level == 0) {
- level = android::base::GetIntProperty("ro.build.version.sdk", 0);
- }
- if (level == 0) {
- ADD_FAILURE() << "Failed to determine first API level";
- }
- return level;
-}
-
// As required by CDD, verified boot MUST use verification algorithms as strong
// as current recommendations from NIST for hashing algorithms (SHA-256).
// https://source.android.com/compatibility/11/android-11-cdd#9_10_device_integrity
TEST(VerifiedBootTest, avbHashtreeNotUsingSha1) {
int first_api_level = getFirstApiLevel();
+ int vendor_api_level = getVendorApiLevel();
GTEST_LOG_(INFO) << "First API level is " << first_api_level;
+ GTEST_LOG_(INFO) << "Vendor API level is " << vendor_api_level;
if (first_api_level < S_API_LEVEL) {
GTEST_LOG_(INFO)
<< "Exempt from avb hash tree test due to old starting API level";
@@ -52,11 +43,24 @@
}
// This feature name check only applies to devices that first shipped with
- // SC or later. The check above already screens out pre-S devices.
- if(!deviceSupportsFeature("android.hardware.security.model.compatible")) {
+ // SC or later.
+ int min_api_level = (first_api_level < vendor_api_level) ? first_api_level
+ : vendor_api_level;
+ if (min_api_level >= S_API_LEVEL &&
+ !deviceSupportsFeature("android.hardware.security.model.compatible")) {
GTEST_SKIP()
<< "Skipping test: FEATURE_SECURITY_MODEL_COMPATIBLE missing.";
- return;
+ return;
+ }
+
+ android::fs_mgr::Fstab mounted_fstab;
+ ASSERT_TRUE(ReadFstabFromFile("/proc/mounts", &mounted_fstab))
+ << "Failed to read the mounted fstab";
+ // Build a list of mount points that are either mounted or known to have
+ // importance.
+ std::set<std::string> mount_points = {"/", "/system"};
+ for (const auto& entry : mounted_fstab) {
+ mount_points.insert(entry.mount_point);
}
android::fs_mgr::Fstab fstab;
ASSERT_TRUE(ReadDefaultFstab(&fstab)) << "Failed to read default fstab";
@@ -66,13 +70,19 @@
continue;
}
+ if (mount_points.find(entry.mount_point) == mount_points.end()) {
+ GTEST_LOG_(INFO) << entry.mount_point << " isn't mounted, skipping"
+ << " hashtree algorithm verification";
+ continue;
+ }
+
if (android::base::EqualsIgnoreCase(entry.fs_type, "emmc")) {
GTEST_LOG_(INFO) << entry.mount_point << " has emmc fs_type, skipping"
<< " hashtree algorithm verification";
continue;
}
- GTEST_LOG_(ERROR) << "partition enabled verity " << entry.mount_point;
+ GTEST_LOG_(INFO) << "partition enabled verity " << entry.mount_point;
// The verity sysprop use "system" as the partition name in the system as
// root case.
diff --git a/tests/tests/security/src/android/security/cts/EncryptionTest.java b/tests/tests/security/src/android/security/cts/EncryptionTest.java
index 7a40bb6..f6c5240 100644
--- a/tests/tests/security/src/android/security/cts/EncryptionTest.java
+++ b/tests/tests/security/src/android/security/cts/EncryptionTest.java
@@ -51,7 +51,9 @@
Context context = InstrumentationRegistry.getInstrumentation().getContext();
// This feature name check only applies to devices that first shipped with
// SC or later.
- if (PropertyUtil.getFirstApiLevel() >= Build.VERSION_CODES.S) {
+ final int firstApiLevel =
+ Math.min(PropertyUtil.getFirstApiLevel(), PropertyUtil.getVendorApiLevel());
+ if (firstApiLevel >= Build.VERSION_CODES.S) {
// Assumes every test in this file asserts a requirement of CDD section 9.
assumeTrue("Skipping test: FEATURE_SECURITY_MODEL_COMPATIBLE missing.",
!context.getPackageManager()
diff --git a/tests/tests/security/src/android/security/cts/FileIntegrityManagerTest.java b/tests/tests/security/src/android/security/cts/FileIntegrityManagerTest.java
index 64b3c33..a0f2aea 100644
--- a/tests/tests/security/src/android/security/cts/FileIntegrityManagerTest.java
+++ b/tests/tests/security/src/android/security/cts/FileIntegrityManagerTest.java
@@ -62,7 +62,9 @@
mContext = InstrumentationRegistry.getInstrumentation().getContext();
// This feature name check only applies to devices that first shipped with
// SC or later.
- if (PropertyUtil.getFirstApiLevel() >= Build.VERSION_CODES.S) {
+ final int firstApiLevel =
+ Math.min(PropertyUtil.getFirstApiLevel(), PropertyUtil.getVendorApiLevel());
+ if (firstApiLevel >= Build.VERSION_CODES.S) {
// Assumes every test in this file asserts a requirement of CDD section 9.
assumeTrue("Skipping test: FEATURE_SECURITY_MODEL_COMPATIBLE missing.",
mContext.getPackageManager()
diff --git a/tests/tests/security/src/android/security/cts/VerifiedBootTest.java b/tests/tests/security/src/android/security/cts/VerifiedBootTest.java
index 6342bf4..fb5d621 100644
--- a/tests/tests/security/src/android/security/cts/VerifiedBootTest.java
+++ b/tests/tests/security/src/android/security/cts/VerifiedBootTest.java
@@ -43,7 +43,9 @@
mContext = InstrumentationRegistry.getInstrumentation().getContext();
// This feature name check only applies to devices that first shipped with
// SC or later.
- if (PropertyUtil.getFirstApiLevel() >= Build.VERSION_CODES.S) {
+ final int firstApiLevel =
+ Math.min(PropertyUtil.getFirstApiLevel(), PropertyUtil.getVendorApiLevel());
+ if (firstApiLevel >= Build.VERSION_CODES.S) {
// Assumes every test in this file asserts a requirement of CDD section 9.
assumeTrue("Skipping test: FEATURE_SECURITY_MODEL_COMPATIBLE missing.",
mContext.getPackageManager()
diff --git a/tests/tests/telephony/OWNERS b/tests/tests/telephony/OWNERS
index 1111752..c26db0f 100644
--- a/tests/tests/telephony/OWNERS
+++ b/tests/tests/telephony/OWNERS
@@ -1,5 +1,4 @@
# Bug component: 20868
-amitmahajan@google.com
breadley@google.com
fionaxu@google.com
jackyu@google.com
@@ -7,11 +6,10 @@
tgunn@google.com
jminjie@google.com
shuoq@google.com
-nazaninb@google.com
sarahchin@google.com
xiaotonj@google.com
huiwang@google.com
jayachandranc@google.com
chinmayd@google.com
amruthr@google.com
-
+sasindran@google.com
diff --git a/tests/tests/telephony/current/src/android/telephony/cts/AvailableNetworkInfoTest.java b/tests/tests/telephony/current/src/android/telephony/cts/AvailableNetworkInfoTest.java
index 2e39996..75383bf 100644
--- a/tests/tests/telephony/current/src/android/telephony/cts/AvailableNetworkInfoTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/cts/AvailableNetworkInfoTest.java
@@ -20,6 +20,7 @@
import android.os.Parcel;
import android.telephony.AvailableNetworkInfo;
+import android.telephony.RadioAccessSpecifier;
import org.junit.Test;
@@ -29,17 +30,28 @@
public class AvailableNetworkInfoTest {
private static final String OPERATOR_MCCMNC_1 = "123456";
private static final String OPERATOR_MCCMNC_2 = "246135";
+ private static final RadioAccessSpecifier RAS_1 =
+ new RadioAccessSpecifier(1, new int[]{2,4,6,8}, new int[]{1,3,5,7});
+ private static final RadioAccessSpecifier RAS_2 =
+ new RadioAccessSpecifier(2, new int[]{1,3,5,7}, new int[]{2,4,6,8});
private static final int SUB_ID = 123;
+ private static List<String> mccMncs = new ArrayList<String>();
+ private static List<Integer> bands = new ArrayList<Integer>();
+ private static List<RadioAccessSpecifier> ras = new ArrayList<RadioAccessSpecifier>();
+
+ static {
+ mccMncs.add(OPERATOR_MCCMNC_1);
+ mccMncs.add(OPERATOR_MCCMNC_2);
+
+ ras.add(RAS_1);
+ ras.add(RAS_2);
+ }
+
@Test
public void testAvailableNetworkInfo() {
- List<String> mccMncs = new ArrayList<String>();
- mccMncs.add(OPERATOR_MCCMNC_1);
- mccMncs.add(OPERATOR_MCCMNC_2);
- List<Integer> bands = new ArrayList<Integer>();
-
AvailableNetworkInfo availableNetworkInfo = new AvailableNetworkInfo(SUB_ID,
- AvailableNetworkInfo.PRIORITY_HIGH, mccMncs, bands);
+ AvailableNetworkInfo.PRIORITY_HIGH, mccMncs, bands);
assertEquals(0, availableNetworkInfo.describeContents());
assertEquals(SUB_ID, availableNetworkInfo.getSubId());
assertEquals(AvailableNetworkInfo.PRIORITY_HIGH, availableNetworkInfo.getPriority());
@@ -50,7 +62,44 @@
availableNetworkInfo.writeToParcel(availableNetworkInfoParcel, 0);
availableNetworkInfoParcel.setDataPosition(0);
AvailableNetworkInfo tempAvailableNetworkInfo =
- AvailableNetworkInfo.CREATOR.createFromParcel(availableNetworkInfoParcel);
+ AvailableNetworkInfo.CREATOR.createFromParcel(availableNetworkInfoParcel);
assertTrue(tempAvailableNetworkInfo.equals(availableNetworkInfo));
}
-}
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testAvailableNetworkInfoBuilder_invalidPriority_throwsIllegalArgumentException() {
+ AvailableNetworkInfo.Builder availableNetworkInfo =
+ new AvailableNetworkInfo.Builder(SUB_ID)
+ .setPriority(0);
+ }
+
+ @Test(expected = NullPointerException.class)
+ public void testAvailableNetworkInfoBuilder_nullMccMnc_throwsNullPointerException() {
+ AvailableNetworkInfo.Builder availableNetworkInfo =
+ new AvailableNetworkInfo.Builder(SUB_ID)
+ .setMccMncs(null);
+ }
+
+ @Test(expected = NullPointerException.class)
+ public void testAvailableNetworkInfoBuilder_nullRAS_throwsNullPointerException() {
+ AvailableNetworkInfo.Builder availableNetworkInfo =
+ new AvailableNetworkInfo.Builder(SUB_ID)
+ .setRadioAccessSpecifiers(null);
+ }
+
+ @Test
+ public void testAvailableNetworkInfoBuilder_success() {
+ AvailableNetworkInfo availableNetworkInfo =
+ new AvailableNetworkInfo.Builder(SUB_ID)
+ .setMccMncs(mccMncs)
+ .setPriority(AvailableNetworkInfo.PRIORITY_HIGH)
+ .setRadioAccessSpecifiers(ras)
+ .build();
+
+ assertEquals(SUB_ID, availableNetworkInfo.getSubId());
+ assertEquals(AvailableNetworkInfo.PRIORITY_HIGH, availableNetworkInfo.getPriority());
+ assertEquals(mccMncs, availableNetworkInfo.getMccMncs());
+ assertEquals(ras, availableNetworkInfo.getRadioAccessSpecifiers());
+ assertEquals(bands, availableNetworkInfo.getBands());
+ }
+}
\ No newline at end of file
diff --git a/tests/tests/telephony/current/src/android/telephony/cts/DataProfileTest.java b/tests/tests/telephony/current/src/android/telephony/cts/DataProfileTest.java
index 5740272..7faf091 100644
--- a/tests/tests/telephony/current/src/android/telephony/cts/DataProfileTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/cts/DataProfileTest.java
@@ -18,9 +18,15 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.fail;
+
import android.os.Parcel;
+import android.telephony.TelephonyManager;
import android.telephony.data.ApnSetting;
import android.telephony.data.DataProfile;
+import android.telephony.data.TrafficDescriptor;
import org.junit.Test;
@@ -33,9 +39,9 @@
private static final String PASSWORD = "PASSWORD";
private static final int TYPE = DataProfile.TYPE_3GPP2;
private static final boolean IS_ENABLED = true;
- private static final int APN_BITMASK = 1;
+ private static final int APN_BITMASK = ApnSetting.TYPE_DEFAULT;
private static final int ROAMING_PROTOCOL_TYPE = ApnSetting.PROTOCOL_IP;
- private static final int BEARER_BITMASK = 14;
+ private static final int BEARER_BITMASK = (int) TelephonyManager.NETWORK_TYPE_BITMASK_LTE;
private static final int MTU_V4 = 1440;
private static final int MTU_V6 = 1400;
private static final boolean IS_PREFERRED = true;
@@ -188,5 +194,130 @@
DataProfile parcelProfile = DataProfile.CREATOR.createFromParcel(stateParcel);
assertThat(profile).isEqualTo(parcelProfile);
+
+ ApnSetting apnSetting = new ApnSetting.Builder()
+ .setEntryName(APN)
+ .setApnName(APN)
+ .setApnTypeBitmask(APN_BITMASK)
+ .setNetworkTypeBitmask(BEARER_BITMASK)
+ .setMtuV4(MTU_V4)
+ .setMtuV6(MTU_V6)
+ .setModemCognitive(IS_PERSISTENT)
+ .setProtocol(PROTOCOL_TYPE)
+ .setRoamingProtocol(ROAMING_PROTOCOL_TYPE)
+ .setUser(USER_NAME)
+ .setPassword(PASSWORD)
+ .setCarrierEnabled(IS_ENABLED)
+ .setProfileId(PROFILE_ID)
+ .setAuthType(AUTH_TYPE)
+ .build();
+
+ byte[] osAppId = {1, 2, 3, 4};
+ TrafficDescriptor td = new TrafficDescriptor.Builder()
+ .setDataNetworkName(APN)
+ .setOsAppId(osAppId)
+ .build();
+
+ profile = new DataProfile.Builder()
+ .setApnSetting(apnSetting)
+ .setTrafficDescriptor(td)
+ .build();
+
+ stateParcel = Parcel.obtain();
+ profile.writeToParcel(stateParcel, 0);
+ stateParcel.setDataPosition(0);
+
+ parcelProfile = DataProfile.CREATOR.createFromParcel(stateParcel);
+ assertThat(profile).isEqualTo(parcelProfile);
+
+ stateParcel.recycle();
+ }
+
+ @Test
+ public void testGetApnSetting() {
+ ApnSetting apnSetting = new ApnSetting.Builder()
+ .setEntryName(APN)
+ .setApnName(APN)
+ .setApnTypeBitmask(APN_BITMASK)
+ .setNetworkTypeBitmask(BEARER_BITMASK)
+ .setMtuV4(MTU_V4)
+ .setMtuV6(MTU_V6)
+ .setModemCognitive(IS_PERSISTENT)
+ .setProtocol(PROTOCOL_TYPE)
+ .setRoamingProtocol(ROAMING_PROTOCOL_TYPE)
+ .setUser(USER_NAME)
+ .setPassword(PASSWORD)
+ .setCarrierEnabled(IS_ENABLED)
+ .setProfileId(PROFILE_ID)
+ .setAuthType(AUTH_TYPE)
+ .build();
+
+ DataProfile profile = new DataProfile.Builder()
+ .setApnSetting(apnSetting)
+ .build();
+
+ assertEquals(apnSetting, profile.getApnSetting());
+ }
+
+ @Test
+ public void testGetTrafficDescriptor() {
+ byte[] osAppId = {1, 2, 3, 4};
+ TrafficDescriptor td = new TrafficDescriptor.Builder()
+ .setDataNetworkName(APN)
+ .setOsAppId(osAppId)
+ .build();
+
+ DataProfile profile = new DataProfile.Builder()
+ .setTrafficDescriptor(td)
+ .build();
+
+ assertEquals(td, profile.getTrafficDescriptor());
+ }
+
+ @Test
+ public void testNullApnSetting() {
+ byte[] osAppId = {1, 2, 3, 4};
+ TrafficDescriptor td = new TrafficDescriptor.Builder()
+ .setDataNetworkName(APN)
+ .setOsAppId(osAppId)
+ .build();
+ DataProfile profile = new DataProfile.Builder()
+ .setApnSetting(null)
+ .setTrafficDescriptor(td)
+ .build();
+
+ assertEquals("", profile.getApn());
+ assertEquals(null, profile.getApnSetting());
+ assertEquals(ApnSetting.AUTH_TYPE_NONE, profile.getAuthType());
+ assertEquals((int) TelephonyManager.NETWORK_TYPE_BITMASK_UNKNOWN,
+ profile.getBearerBitmask());
+ assertEquals(0, profile.getMtu());
+ assertEquals(0, profile.getMtuV4());
+ assertEquals(0, profile.getMtuV6());
+ assertEquals(null, profile.getUserName());
+ assertEquals(null, profile.getPassword());
+ assertEquals(0, profile.getProfileId());
+ assertEquals(ApnSetting.PROTOCOL_IP, profile.getProtocolType());
+ assertEquals(ApnSetting.PROTOCOL_IP, profile.getRoamingProtocolType());
+ assertEquals(ApnSetting.TYPE_NONE, profile.getSupportedApnTypesBitmask());
+ assertEquals(DataProfile.TYPE_COMMON, profile.getType());
+ assertFalse(profile.isEnabled());
+ assertFalse(profile.isPersistent());
+ assertFalse(profile.isPreferred());
+ assertEquals(td, profile.getTrafficDescriptor());
+ }
+
+ @Test
+ public void illegalDataProfile() {
+ try {
+ DataProfile profile = new DataProfile.Builder()
+ .setApnSetting(null)
+ .setTrafficDescriptor(null)
+ .build();
+ fail("Should throw exception if both APN setting and traffic descriptor are null.");
+ } catch (IllegalArgumentException ex) {
+ // Expected to get illegal argument exception.
+ }
+
}
}
diff --git a/tests/tests/telephony/current/src/android/telephony/cts/PhoneStateListenerTest.java b/tests/tests/telephony/current/src/android/telephony/cts/PhoneStateListenerTest.java
index 5c9d8b9..dfe41cf 100644
--- a/tests/tests/telephony/current/src/android/telephony/cts/PhoneStateListenerTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/cts/PhoneStateListenerTest.java
@@ -279,53 +279,6 @@
assertTrue(mOnSignalStrengthChangedCalled);
}
- /**
- * Due to the corresponding API is hidden in R and will be public in S, this test
- * is commented and will be un-commented in Android S.
- *
- @Test
- public void testOnAlwaysReportedSignalStrengthChanged() throws Throwable {
- if (mCm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE) == null) {
- Log.d(TAG, "Skipping test that requires ConnectivityManager.TYPE_MOBILE");
- return;
- }
-
- assertTrue(mSignalStrength == null);
-
- mHandler.post(() -> {
- mListener = new PhoneStateListener() {
- @Override
- public void onSignalStrengthsChanged(SignalStrength signalStrength) {
- synchronized (mLock) {
- mSignalStrength = signalStrength;
- mLock.notify();
- }
- }
- };
- ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(mTelephonyManager,
- (tm) -> tm.listen(mListener,
- PhoneStateListener.LISTEN_ALWAYS_REPORTED_SIGNAL_STRENGTH));
- });
- synchronized (mLock) {
- if (mSignalStrength == null) {
- mLock.wait(WAIT_TIME);
- }
- }
-
- assertTrue(mSignalStrength != null);
- // Call SignalStrength methods to make sure they do not throw any exceptions
- mSignalStrength.getCdmaDbm();
- mSignalStrength.getCdmaEcio();
- mSignalStrength.getEvdoDbm();
- mSignalStrength.getEvdoEcio();
- mSignalStrength.getEvdoSnr();
- mSignalStrength.getGsmBitErrorRate();
- mSignalStrength.getGsmSignalStrength();
- mSignalStrength.isGsm();
- mSignalStrength.getLevel();
- }
- */
-
@Test
public void testOnSignalStrengthsChanged() throws Throwable {
if (mCm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE) == null) {
diff --git a/tests/tests/telephony/current/src/android/telephony/cts/SubscriptionManagerTest.java b/tests/tests/telephony/current/src/android/telephony/cts/SubscriptionManagerTest.java
index e61f748..729b444 100755
--- a/tests/tests/telephony/current/src/android/telephony/cts/SubscriptionManagerTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/cts/SubscriptionManagerTest.java
@@ -232,8 +232,10 @@
public void testActiveSubscriptions() throws Exception {
if (!isSupported()) return;
- List<SubscriptionInfo> subList = mSm.getActiveSubscriptionInfoList();
- int[] idList = mSm.getActiveSubscriptionIdList();
+ List<SubscriptionInfo> subList = ShellIdentityUtils.invokeMethodWithShellPermissions(mSm,
+ (sm) -> sm.getActiveSubscriptionInfoList());
+ int[] idList = ShellIdentityUtils.invokeMethodWithShellPermissions(mSm,
+ (sm) -> sm.getActiveSubscriptionIdList());
// Assert when there is no sim card present or detected
assertNotNull("Active subscriber required", subList);
assertNotNull("Active subscriber required", idList);
diff --git a/tests/tests/telephony/current/src/android/telephony/cts/TelephonyManagerTest.java b/tests/tests/telephony/current/src/android/telephony/cts/TelephonyManagerTest.java
index d60fee5..55c8467 100644
--- a/tests/tests/telephony/current/src/android/telephony/cts/TelephonyManagerTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/cts/TelephonyManagerTest.java
@@ -1422,7 +1422,8 @@
return;
}
- int[] allSubs = mSubscriptionManager.getActiveSubscriptionIdList();
+ int[] allSubs = ShellIdentityUtils.invokeMethodWithShellPermissions(
+ mSubscriptionManager, (sm) ->sm.getActiveSubscriptionIdList());
// generate a subscription that is valid (>0) but inactive (not part of active subId list)
// A simple way to do this is sum the active subIds and add 1
int inactiveValidSub = 1;
diff --git a/tests/tests/telephony/current/src/android/telephony/cts/util/CarrierPrivilegeUtils.java b/tests/tests/telephony/current/src/android/telephony/cts/util/CarrierPrivilegeUtils.java
index b20ea16..ea46c9b 100644
--- a/tests/tests/telephony/current/src/android/telephony/cts/util/CarrierPrivilegeUtils.java
+++ b/tests/tests/telephony/current/src/android/telephony/cts/util/CarrierPrivilegeUtils.java
@@ -160,11 +160,9 @@
// the CarrierConfig override (as it will override the existing shell permissions).
if (isShell) {
configManager.overrideConfig(subId, carrierConfigs);
- configManager.notifyConfigChangedForSubId(subId);
} else {
runWithShellPermissionIdentity(() -> {
configManager.overrideConfig(subId, carrierConfigs);
- configManager.notifyConfigChangedForSubId(subId);
}, android.Manifest.permission.MODIFY_PHONE_STATE);
}
diff --git a/tests/tests/telephony/current/src/android/telephony/gba/cts/GbaServiceTest.java b/tests/tests/telephony/current/src/android/telephony/gba/cts/GbaServiceTest.java
index c5baf84..0a16299 100644
--- a/tests/tests/telephony/current/src/android/telephony/gba/cts/GbaServiceTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/gba/cts/GbaServiceTest.java
@@ -328,8 +328,11 @@
PackageManager.FEATURE_TELEPHONY)) {
return false;
}
- int[] activeSubs = InstrumentationRegistry.getContext().getSystemService(
- SubscriptionManager.class).getActiveSubscriptionIdList();
+
+ SubscriptionManager subscriptionManager = InstrumentationRegistry.getContext()
+ .getSystemService(SubscriptionManager.class);
+ int[] activeSubs = ShellIdentityUtils.invokeMethodWithShellPermissions(subscriptionManager,
+ (sm) -> sm.getActiveSubscriptionIdList());
if (activeSubs.length == 0) {
return false;
}
diff --git a/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsMmTelManagerTest.java b/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsMmTelManagerTest.java
index c707d0e..e962912 100644
--- a/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsMmTelManagerTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsMmTelManagerTest.java
@@ -37,6 +37,7 @@
import android.telephony.ims.ImsException;
import android.telephony.ims.ImsManager;
import android.telephony.ims.ImsMmTelManager;
+import android.telephony.ims.ImsStateCallback;
import android.telephony.ims.feature.MmTelFeature;
import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -576,6 +577,59 @@
} catch (SecurityException e) {
fail("getRegistrationTransportType requires READ_PRIVILEGED_PHONE_STATE permission.");
}
+
+ ImsStateCallback callback = new ImsStateCallback() {
+ @Override
+ public void onUnavailable(int reason) { }
+ @Override
+ public void onAvailable() { }
+ @Override
+ public void onError() { }
+ };
+
+ try {
+ mMmTelManager.registerImsStateCallback(Runnable::run, callback);
+ fail("registerImsStateCallback requires READ_PRECISE_PHONE_STATE or "
+ + "READ_PRIVILEGED_PHONE_STATE permission.");
+ } catch (SecurityException e) {
+ //expected
+ } catch (ImsException ie) {
+ fail("registerImsStateCallback requires READ_PRECISE_PHONE_STATE or "
+ + "READ_PRIVILEGED_PHONE_STATE permission.");
+ }
+
+ try {
+ ShellIdentityUtils.invokeThrowableMethodWithShellPermissionsNoReturn(mMmTelManager,
+ m -> m.registerImsStateCallback(Runnable::run, callback),
+ ImsException.class, "android.permission.READ_PRECISE_PHONE_STATE");
+ } catch (SecurityException e) {
+ fail("registerImsStateCallback requires READ_PRECISE_PHONE_STATE permission.");
+ } catch (ImsException ignore) {
+ // don't care, permission check passed
+ }
+
+ try {
+ mMmTelManager.unregisterImsStateCallback(callback);
+ } catch (SecurityException e) {
+ fail("uregisterImsStateCallback requires no permission.");
+ }
+
+ try {
+ ShellIdentityUtils.invokeThrowableMethodWithShellPermissionsNoReturn(mMmTelManager,
+ m -> m.registerImsStateCallback(Runnable::run, callback),
+ ImsException.class, "android.permission.READ_PRIVILEGED_PHONE_STATE");
+ } catch (SecurityException e) {
+ fail("registerImsStateCallback requires READ_PRIVILEGED_PHONE_STATE permission.");
+ } catch (ImsException ignore) {
+ // don't care, permission check passed
+ }
+
+ try {
+ mMmTelManager.unregisterImsStateCallback(callback);
+ } catch (SecurityException e) {
+ // unreachable, already passed permission check
+ fail("uregisterImsStateCallback requires no permission.");
+ }
}
private void overrideCarrierConfig(PersistableBundle bundle) throws Exception {
diff --git a/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsRcsManagerTest.java b/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsRcsManagerTest.java
new file mode 100644
index 0000000..e5d9804
--- /dev/null
+++ b/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsRcsManagerTest.java
@@ -0,0 +1,168 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.telephony.ims.cts;
+
+import static org.junit.Assert.fail;
+
+import android.content.Context;
+import android.os.Looper;
+import android.telephony.SubscriptionManager;
+import android.telephony.ims.ImsException;
+import android.telephony.ims.ImsManager;
+import android.telephony.ims.ImsRcsManager;
+import android.telephony.ims.ImsStateCallback;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.compatibility.common.util.ShellIdentityUtils;
+
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class ImsRcsManagerTest {
+
+ private static int sTestSub = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+
+ @BeforeClass
+ public static void beforeAllTests() {
+ // assumeTrue() in @BeforeClass is not supported by our test runner.
+ // Resort to the early exit.
+ if (!ImsUtils.shouldTestImsService()) {
+ return;
+ }
+
+ sTestSub = ImsUtils.getPreferredActiveSubId();
+
+ if (Looper.getMainLooper() == null) {
+ Looper.prepareMainLooper();
+ }
+ }
+
+ @Before
+ public void beforeTest() {
+ if (!ImsUtils.shouldTestImsService()) {
+ return;
+ }
+
+ if (!SubscriptionManager.isValidSubscriptionId(sTestSub)) {
+ fail("This test requires that there is a SIM in the device!");
+ }
+ }
+
+ /**
+ * Test Permissions on various APIs.
+ */
+ @Test
+ public void testMethodPermissions() throws Exception {
+ if (!ImsUtils.shouldTestTelephony()) {
+ return;
+ }
+
+ // This verifies the permission checking in ITelephony,
+ // not the IMS service's behavior.
+ // Since SecurityException has the highest priority,
+ // DEFAULT_SUBSCRIPTION_ID is enough to check permissions.
+ // Though it throws an ImsException, we ignore that.
+ if (sTestSub == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+ sTestSub = SubscriptionManager.DEFAULT_SUBSCRIPTION_ID;
+ }
+
+ ImsManager imsManager = getContext().getSystemService(ImsManager.class);
+ ImsRcsManager rcsManager = imsManager.getImsRcsManager(sTestSub);
+
+ ImsStateCallback callback = new ImsStateCallback() {
+ @Override
+ public void onUnavailable(int reason) { }
+ @Override
+ public void onAvailable() { }
+ @Override
+ public void onError() { }
+ };
+
+ try {
+ rcsManager.registerImsStateCallback(Runnable::run, callback);
+ fail("registerImsStateCallback requires READ_PRECISE_PHONE_STATE, "
+ + "ACCESS_RCS_USER_CAPABILITY_EXCHANGE or "
+ + "READ_PRIVILEGED_PHONE_STATE permission.");
+ } catch (SecurityException e) {
+ //expected
+ } catch (ImsException ie) {
+ fail("registerImsStateCallback requires READ_PRECISE_PHONE_STATE, "
+ + "ACCESS_RCS_USER_CAPABILITY_EXCHANGE or "
+ + "READ_PRIVILEGED_PHONE_STATE permission.");
+ }
+
+ try {
+ ShellIdentityUtils.invokeThrowableMethodWithShellPermissionsNoReturn(rcsManager,
+ m -> m.registerImsStateCallback(Runnable::run, callback),
+ ImsException.class, "android.permission.READ_PRECISE_PHONE_STATE");
+ } catch (SecurityException e) {
+ fail("registerImsStateCallback requires READ_PRECISE_PHONE_STATE permission.");
+ } catch (ImsException ignore) {
+ // don't care, permission check passed
+ }
+
+ try {
+ rcsManager.unregisterImsStateCallback(callback);
+ } catch (SecurityException e) {
+ fail("uregisterImsStateCallback requires no permission.");
+ }
+
+ try {
+ ShellIdentityUtils.invokeThrowableMethodWithShellPermissionsNoReturn(rcsManager,
+ m -> m.registerImsStateCallback(Runnable::run, callback),
+ ImsException.class, "android.permission.ACCESS_RCS_USER_CAPABILITY_EXCHANGE");
+ } catch (SecurityException e) {
+ fail("registerImsStateCallback requires "
+ + "ACCESS_RCS_USER_CAPABILITY_EXCHANGE permission.");
+ } catch (ImsException ignore) {
+ // don't care, permission check passed
+ }
+
+ try {
+ rcsManager.unregisterImsStateCallback(callback);
+ } catch (SecurityException e) {
+ // unreachable, already passed permission check
+ fail("uregisterImsStateCallback requires no permission.");
+ }
+
+ try {
+ ShellIdentityUtils.invokeThrowableMethodWithShellPermissionsNoReturn(rcsManager,
+ m -> m.registerImsStateCallback(Runnable::run, callback),
+ ImsException.class, "android.permission.READ_PRIVILEGED_PHONE_STATE");
+ } catch (SecurityException e) {
+ fail("registerImsStateCallback requires READ_PRIVILEGED_PHONE_STATE permission.");
+ } catch (ImsException ignore) {
+ // don't care, permission check passed
+ }
+
+ try {
+ rcsManager.unregisterImsStateCallback(callback);
+ } catch (SecurityException e) {
+ // unreachable, already passed permission check
+ fail("uregisterImsStateCallback requires no permission.");
+ }
+ }
+
+ private static Context getContext() {
+ return InstrumentationRegistry.getInstrumentation().getContext();
+ }
+}
diff --git a/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsServiceTest.java b/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsServiceTest.java
index 4970d89..e9fc555 100644
--- a/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsServiceTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsServiceTest.java
@@ -48,12 +48,14 @@
import android.telephony.ims.ImsRcsManager;
import android.telephony.ims.ImsReasonInfo;
import android.telephony.ims.ImsRegistrationAttributes;
+import android.telephony.ims.ImsStateCallback;
import android.telephony.ims.ProvisioningManager;
import android.telephony.ims.RcsClientConfiguration;
import android.telephony.ims.RcsContactUceCapability;
import android.telephony.ims.RcsUceAdapter;
import android.telephony.ims.RegistrationManager;
import android.telephony.ims.RtpHeaderExtensionType;
+import android.telephony.ims.SipDelegateManager;
import android.telephony.ims.feature.ImsFeature;
import android.telephony.ims.feature.MmTelFeature;
import android.telephony.ims.feature.RcsFeature.RcsImsCapabilities;
@@ -198,6 +200,8 @@
private static final String FILE_TRANSFER_SERVICE_ID =
"org.openmobilealliance:File-Transfer-HTTP";
+ private static final int FEATURE_STATE_READY = 0;
+
private static CarrierConfigReceiver sReceiver;
private static SingleRegistrationCapabilityReceiver sSrcReceiver;
@@ -3531,6 +3535,267 @@
}
}
+ @Test
+ public void testImsMmTelManagerImsStateCallback() throws Exception {
+ if (!ImsUtils.shouldTestImsService()) {
+ return;
+ }
+
+ ImsManager imsManager = getContext().getSystemService(ImsManager.class);
+ if (imsManager == null) {
+ fail("Cannot find IMS service");
+ }
+
+ LinkedBlockingQueue<Integer> stateQueue = new LinkedBlockingQueue<>();
+ ImsStateCallback callback = buildImsStateCallback(stateQueue);
+
+ ImsMmTelManager mmTelManager = null;
+ final UiAutomation automan = InstrumentationRegistry.getInstrumentation().getUiAutomation();
+ try {
+ automan.adoptShellPermissionIdentity();
+ mmTelManager = imsManager.getImsMmTelManager(sTestSub);
+ mmTelManager.registerImsStateCallback(getContext().getMainExecutor(), callback);
+ } finally {
+ automan.dropShellPermissionIdentity();
+ }
+
+ int reason = waitForIntResult(stateQueue);
+ assertTrue(reason == ImsStateCallback.REASON_UNKNOWN_TEMPORARY_ERROR
+ || reason == ImsStateCallback.REASON_UNKNOWN_PERMANENT_ERROR
+ || reason == ImsStateCallback.REASON_IMS_SERVICE_DISCONNECTED
+ || reason == ImsStateCallback.REASON_NO_IMS_SERVICE_CONFIGURED
+ || reason == ImsStateCallback.REASON_SUBSCRIPTION_INACTIVE
+ || reason == ImsStateCallback.REASON_IMS_SERVICE_NOT_READY);
+
+ mmTelManager.unregisterImsStateCallback(callback);
+
+ // Connect to device ImsService with MmTelFeature
+ triggerFrameworkConnectToCarrierImsService();
+
+ stateQueue = new LinkedBlockingQueue<>();
+ callback = buildImsStateCallback(stateQueue);
+
+ try {
+ automan.adoptShellPermissionIdentity();
+ mmTelManager.registerImsStateCallback(getContext().getMainExecutor(), callback);
+ } finally {
+ automan.dropShellPermissionIdentity();
+ }
+
+ // expects FEATURE_MMTEL STATE_READY
+ assertEquals(FEATURE_STATE_READY, waitForIntResult(stateQueue));
+
+ if (sServiceConnector != null) {
+ sServiceConnector.getCarrierService().getMmTelFeature().setFeatureState(
+ ImsFeature.STATE_INITIALIZING);
+ }
+
+ // expects NOT_READY
+ assertEquals(ImsStateCallback.REASON_IMS_SERVICE_NOT_READY,
+ waitForIntResult(stateQueue));
+
+ // Unbind the GTS ImsService
+ if (sServiceConnector != null) {
+ sServiceConnector.disconnectCarrierImsService();
+ }
+
+ // expects DISCONNECTED
+ assertEquals(ImsStateCallback.REASON_IMS_SERVICE_DISCONNECTED,
+ waitForIntResult(stateQueue));
+
+ mmTelManager.unregisterImsStateCallback(callback);
+ }
+
+ @Test
+ public void testImsRcsManagerImsStateCallback() throws Exception {
+ if (!ImsUtils.shouldTestImsService()) {
+ return;
+ }
+
+ ImsManager imsManager = getContext().getSystemService(ImsManager.class);
+ if (imsManager == null) {
+ fail("Cannot find IMS service");
+ }
+
+ LinkedBlockingQueue<Integer> rcsQueue = new LinkedBlockingQueue<>();
+ ImsStateCallback rcsCallback = buildImsStateCallback(rcsQueue);
+
+ LinkedBlockingQueue<Integer> sipQueue = new LinkedBlockingQueue<>();
+ ImsStateCallback sipCallback = buildImsStateCallback(sipQueue);
+
+ ImsRcsManager imsRcsManager;
+ SipDelegateManager imsSipManager;
+ final UiAutomation automan = InstrumentationRegistry.getInstrumentation().getUiAutomation();
+ try {
+ automan.adoptShellPermissionIdentity();
+ imsRcsManager = imsManager.getImsRcsManager(sTestSub);
+ imsRcsManager.registerImsStateCallback(getContext().getMainExecutor(), rcsCallback);
+ imsSipManager = imsManager.getSipDelegateManager(sTestSub);
+ imsSipManager.registerImsStateCallback(getContext().getMainExecutor(), sipCallback);
+ } finally {
+ automan.dropShellPermissionIdentity();
+ }
+
+ int reason = waitForIntResult(rcsQueue);
+ assertTrue(reason == ImsStateCallback.REASON_UNKNOWN_TEMPORARY_ERROR
+ || reason == ImsStateCallback.REASON_UNKNOWN_PERMANENT_ERROR
+ || reason == ImsStateCallback.REASON_IMS_SERVICE_DISCONNECTED
+ || reason == ImsStateCallback.REASON_NO_IMS_SERVICE_CONFIGURED
+ || reason == ImsStateCallback.REASON_SUBSCRIPTION_INACTIVE
+ || reason == ImsStateCallback.REASON_IMS_SERVICE_NOT_READY);
+
+ reason = waitForIntResult(sipQueue);
+ assertTrue(reason == ImsStateCallback.REASON_UNKNOWN_TEMPORARY_ERROR
+ || reason == ImsStateCallback.REASON_UNKNOWN_PERMANENT_ERROR
+ || reason == ImsStateCallback.REASON_IMS_SERVICE_DISCONNECTED
+ || reason == ImsStateCallback.REASON_NO_IMS_SERVICE_CONFIGURED
+ || reason == ImsStateCallback.REASON_SUBSCRIPTION_INACTIVE
+ || reason == ImsStateCallback.REASON_IMS_SERVICE_NOT_READY);
+
+ imsRcsManager.unregisterImsStateCallback(rcsCallback);
+ imsSipManager.unregisterImsStateCallback(sipCallback);
+
+ // Override the carrier config
+ PersistableBundle bundle = new PersistableBundle();
+ bundle.putBoolean(CarrierConfigManager.Ims.KEY_ENABLE_PRESENCE_PUBLISH_BOOL, false);
+ bundle.putBoolean(
+ CarrierConfigManager.Ims.KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL, false);
+ overrideCarrierConfig(bundle);
+
+ // Connect to device ImsService with RcsFeature
+ triggerFrameworkConnectToLocalImsServiceBindRcsFeature();
+
+ rcsQueue = new LinkedBlockingQueue<>();
+ rcsCallback = buildImsStateCallback(rcsQueue);
+
+ sipQueue = new LinkedBlockingQueue<>();
+ sipCallback = buildImsStateCallback(sipQueue);
+
+ try {
+ automan.adoptShellPermissionIdentity();
+ imsRcsManager.registerImsStateCallback(getContext().getMainExecutor(), rcsCallback);
+ imsSipManager.registerImsStateCallback(getContext().getMainExecutor(), sipCallback);
+ } finally {
+ automan.dropShellPermissionIdentity();
+ }
+
+ // expects FEATURE_RCS, NO_IMS_SERVICE_CONFIGURED
+ assertEquals(ImsStateCallback.REASON_NO_IMS_SERVICE_CONFIGURED,
+ waitForIntResult(rcsQueue));
+ assertEquals(ImsStateCallback.REASON_NO_IMS_SERVICE_CONFIGURED,
+ waitForIntResult(sipQueue));
+
+ // Override the carrier config
+ bundle = new PersistableBundle();
+ bundle.putBoolean(CarrierConfigManager.Ims.KEY_ENABLE_PRESENCE_PUBLISH_BOOL, true);
+ overrideCarrierConfig(bundle);
+
+ // Wait for the framework to set the capabilities on the ImsService
+ sServiceConnector.getCarrierService().waitForLatchCountdown(
+ TestImsService.LATCH_RCS_CAP_SET);
+
+ // expects FEATURE_RCS, STATE_READY
+ assertEquals(FEATURE_STATE_READY, waitForIntResult(rcsQueue));
+ assertEquals(FEATURE_STATE_READY, waitForIntResult(sipQueue));
+
+ bundle = new PersistableBundle();
+ bundle.putBoolean(CarrierConfigManager.Ims.KEY_ENABLE_PRESENCE_PUBLISH_BOOL, false);
+ overrideCarrierConfig(bundle);
+
+ // expects FEATURE_RCS, NO_IMS_SERVICE_CONFIGURED
+ assertEquals(ImsStateCallback.REASON_NO_IMS_SERVICE_CONFIGURED,
+ waitForIntResult(rcsQueue));
+ assertEquals(ImsStateCallback.REASON_NO_IMS_SERVICE_CONFIGURED,
+ waitForIntResult(sipQueue));
+
+ // Override the carrier config
+ bundle = new PersistableBundle();
+ bundle.putBoolean(
+ CarrierConfigManager.Ims.KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL, true);
+ overrideCarrierConfig(bundle);
+
+ // expects FEATURE_RCS, STATE_READY
+ assertEquals(FEATURE_STATE_READY, waitForIntResult(rcsQueue));
+ assertEquals(FEATURE_STATE_READY, waitForIntResult(sipQueue));
+
+ bundle = new PersistableBundle();
+ bundle.putBoolean(
+ CarrierConfigManager.Ims.KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL, false);
+ overrideCarrierConfig(bundle);
+
+ // expects FEATURE_RCS, NO_IMS_SERVICE_CONFIGURED
+ assertEquals(ImsStateCallback.REASON_NO_IMS_SERVICE_CONFIGURED,
+ waitForIntResult(rcsQueue));
+ assertEquals(ImsStateCallback.REASON_NO_IMS_SERVICE_CONFIGURED,
+ waitForIntResult(sipQueue));
+
+ // Override the carrier config
+ bundle = new PersistableBundle();
+ bundle.putBoolean(CarrierConfigManager.Ims.KEY_ENABLE_PRESENCE_PUBLISH_BOOL, true);
+ bundle.putBoolean(
+ CarrierConfigManager.Ims.KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL, true);
+ overrideCarrierConfig(bundle);
+
+ // expects FEATURE_RCS, STATE_READY
+ assertEquals(FEATURE_STATE_READY, waitForIntResult(rcsQueue));
+ assertEquals(FEATURE_STATE_READY, waitForIntResult(sipQueue));
+
+ bundle = new PersistableBundle();
+ bundle.putBoolean(
+ CarrierConfigManager.Ims.KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL, false);
+ overrideCarrierConfig(bundle);
+
+ // ensure no change in state since having one active feature
+ reason = waitForIntResult(rcsQueue, 3000);
+ assertEquals(Integer.MAX_VALUE, reason);
+ reason = waitForIntResult(sipQueue, 1000);
+ assertEquals(Integer.MAX_VALUE, reason);
+
+ bundle = new PersistableBundle();
+ bundle.putBoolean(CarrierConfigManager.Ims.KEY_ENABLE_PRESENCE_PUBLISH_BOOL, false);
+ overrideCarrierConfig(bundle);
+
+ // expects FEATURE_RCS, NO_IMS_SERVICE_CONFIGURED
+ assertEquals(ImsStateCallback.REASON_NO_IMS_SERVICE_CONFIGURED,
+ waitForIntResult(rcsQueue));
+ assertEquals(ImsStateCallback.REASON_NO_IMS_SERVICE_CONFIGURED,
+ waitForIntResult(sipQueue));
+
+ // Override the carrier config
+ bundle = new PersistableBundle();
+ bundle.putBoolean(CarrierConfigManager.Ims.KEY_ENABLE_PRESENCE_PUBLISH_BOOL, true);
+ overrideCarrierConfig(bundle);
+
+ // expects FEATURE_RCS, STATE_READY
+ assertEquals(FEATURE_STATE_READY, waitForIntResult(rcsQueue));
+ assertEquals(FEATURE_STATE_READY, waitForIntResult(sipQueue));
+
+ if (sServiceConnector != null) {
+ sServiceConnector.getCarrierService().getRcsFeature().setFeatureState(
+ ImsFeature.STATE_INITIALIZING);
+ }
+
+ // expects NOT_READY
+ assertEquals(ImsStateCallback.REASON_IMS_SERVICE_NOT_READY,
+ waitForIntResult(rcsQueue));
+ assertEquals(ImsStateCallback.REASON_IMS_SERVICE_NOT_READY,
+ waitForIntResult(sipQueue));
+
+ // Unbind the GTS ImsService
+ if (sServiceConnector != null) {
+ sServiceConnector.disconnectCarrierImsService();
+ }
+
+ // expects DISCONNECTED
+ assertEquals(ImsStateCallback.REASON_IMS_SERVICE_DISCONNECTED,
+ waitForIntResult(rcsQueue));
+ assertEquals(ImsStateCallback.REASON_IMS_SERVICE_DISCONNECTED,
+ waitForIntResult(sipQueue));
+
+ imsRcsManager.unregisterImsStateCallback(rcsCallback);
+ imsSipManager.unregisterImsStateCallback(sipCallback);
+ }
+
private void verifyIntKey(ProvisioningManager pm,
LinkedBlockingQueue<Pair<Integer, Integer>> intQueue, int key, int value)
throws Exception {
@@ -3655,6 +3920,25 @@
sTestSlot, serviceSlot);
}
+ private ImsStateCallback buildImsStateCallback(final LinkedBlockingQueue<Integer> stateQueue) {
+ return new ImsStateCallback() {
+ @Override
+ public void onUnavailable(int reason) {
+ stateQueue.offer(reason);
+ }
+
+ @Override
+ public void onAvailable() {
+ stateQueue.offer(FEATURE_STATE_READY);
+ }
+
+ @Override
+ public void onError() {
+ stateQueue.offer(-1);
+ }
+ };
+ }
+
private ProvisioningManager.RcsProvisioningCallback buildRcsProvisioningCallback(
LinkedBlockingQueue<Integer> actionQueue,
LinkedBlockingQueue<RcsProvisioningCallbackParams> paramQueue) {
diff --git a/tests/tests/telephony/current/src/android/telephony/ims/cts/SipDelegateManagerTest.java b/tests/tests/telephony/current/src/android/telephony/ims/cts/SipDelegateManagerTest.java
index 13e9a33..e8e4aec 100644
--- a/tests/tests/telephony/current/src/android/telephony/ims/cts/SipDelegateManagerTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/ims/cts/SipDelegateManagerTest.java
@@ -43,6 +43,7 @@
import android.telephony.ims.ImsException;
import android.telephony.ims.ImsManager;
import android.telephony.ims.ImsService;
+import android.telephony.ims.ImsStateCallback;
import android.telephony.ims.SipDelegateConfiguration;
import android.telephony.ims.SipDelegateManager;
import android.telephony.ims.SipMessage;
@@ -325,6 +326,60 @@
} catch (SecurityException e) {
//expected
}
+
+
+ ImsStateCallback callback = new ImsStateCallback() {
+ @Override
+ public void onUnavailable(int reason) { }
+ @Override
+ public void onAvailable() { }
+ @Override
+ public void onError() { }
+ };
+
+ try {
+ manager.registerImsStateCallback(Runnable::run, callback);
+ fail("registerImsStateCallback requires PERFORM_IMS_SINGLE_REGISTRATION or "
+ + "READ_PRIVILEGED_PHONE_STATE permission.");
+ } catch (SecurityException e) {
+ //expected
+ } catch (ImsException ignore) {
+ fail("registerImsStateCallback requires PERFORM_IMS_SINGLE_REGISTRATION or "
+ + "READ_PRIVILEGED_PHONE_STATE permission.");
+ }
+
+ try {
+ ShellIdentityUtils.invokeThrowableMethodWithShellPermissionsNoReturn(manager,
+ m -> m.registerImsStateCallback(Runnable::run, callback),
+ ImsException.class, "android.permission.PERFORM_IMS_SINGLE_REGISTRATION");
+ } catch (SecurityException e) {
+ fail("registerImsStateCallback requires PERFORM_IMS_SINGLE_REGISTRATION permission.");
+ } catch (ImsException ignore) {
+ // don't care, permission check passed
+ }
+
+ try {
+ manager.unregisterImsStateCallback(callback);
+ } catch (SecurityException e) {
+ fail("uregisterImsStateCallback requires no permission.");
+ }
+
+ try {
+ ShellIdentityUtils.invokeThrowableMethodWithShellPermissionsNoReturn(manager,
+ m -> m.registerImsStateCallback(Runnable::run, callback),
+ ImsException.class, "android.permission.READ_PRIVILEGED_PHONE_STATE");
+ } catch (SecurityException e) {
+ fail("registerImsStateCallback requires READ_PRIVILEGED_PHONE_STATE permission.");
+ } catch (ImsException ignore) {
+ // don't care, permission check passed
+ }
+
+ try {
+ manager.unregisterImsStateCallback(callback);
+ } catch (SecurityException e) {
+ // unreachable, already passed permission check
+ fail("uregisterImsStateCallback requires no permission.");
+ }
}
@Test
diff --git a/tests/tests/vcn/OWNERS b/tests/tests/vcn/OWNERS
index 574aa9f..b3efc7b 100644
--- a/tests/tests/vcn/OWNERS
+++ b/tests/tests/vcn/OWNERS
@@ -1,3 +1,3 @@
# Bug component: 685852
nharold@google.com
-junyin@google.com
\ No newline at end of file
+yangji@google.com
\ No newline at end of file
diff --git a/tests/tests/vcn/src/android/net/vcn/cts/VcnManagerTest.java b/tests/tests/vcn/src/android/net/vcn/cts/VcnManagerTest.java
index f401d55..8376ccb 100644
--- a/tests/tests/vcn/src/android/net/vcn/cts/VcnManagerTest.java
+++ b/tests/tests/vcn/src/android/net/vcn/cts/VcnManagerTest.java
@@ -439,8 +439,10 @@
// Get current cell Network then wait for it to drop (due to losing NOT_VCN_MANAGED) before
// waiting for VCN Network.
- final NetworkRequest cellNetworkReq =
- new NetworkRequest.Builder().addTransportType(TRANSPORT_CELLULAR).build();
+ final NetworkRequest cellNetworkReq = new NetworkRequest.Builder()
+ .addTransportType(TRANSPORT_CELLULAR)
+ .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
+ .build();
final VcnTestNetworkCallback cellNetworkCb = new VcnTestNetworkCallback();
mConnectivityManager.requestNetwork(cellNetworkReq, cellNetworkCb);
final Network cellNetwork = cellNetworkCb.waitForAvailable();
@@ -560,8 +562,10 @@
// Get current cell Network then wait for it to drop (due to losing NOT_VCN_MANAGED) before
// waiting for VCN Network.
- final NetworkRequest cellNetworkReq =
- new NetworkRequest.Builder().addTransportType(TRANSPORT_CELLULAR).build();
+ final NetworkRequest cellNetworkReq = new NetworkRequest.Builder()
+ .addTransportType(TRANSPORT_CELLULAR)
+ .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
+ .build();
final VcnTestNetworkCallback cellNetworkCb = new VcnTestNetworkCallback();
mConnectivityManager.requestNetwork(cellNetworkReq, cellNetworkCb);
final Network cellNetwork = cellNetworkCb.waitForAvailable();
@@ -661,8 +665,10 @@
// Get current cell Network then wait for it to drop (due to losing NOT_VCN_MANAGED) before
// waiting for VCN Network.
- final NetworkRequest cellNetworkReq =
- new NetworkRequest.Builder().addTransportType(TRANSPORT_CELLULAR).build();
+ final NetworkRequest cellNetworkReq = new NetworkRequest.Builder()
+ .addTransportType(TRANSPORT_CELLULAR)
+ .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
+ .build();
final VcnTestNetworkCallback cellNetworkCb = new VcnTestNetworkCallback();
mConnectivityManager.requestNetwork(cellNetworkReq, cellNetworkCb);
final Network cellNetwork = cellNetworkCb.waitForAvailable();
diff --git a/tests/tests/view/src/android/view/cts/KeyEventInterceptTest.java b/tests/tests/view/src/android/view/cts/KeyEventInterceptTest.java
index bf73550..b0a882c 100644
--- a/tests/tests/view/src/android/view/cts/KeyEventInterceptTest.java
+++ b/tests/tests/view/src/android/view/cts/KeyEventInterceptTest.java
@@ -41,6 +41,9 @@
* KEYCODE_ASSIST
* KEYCODE_VOICE_ASSIST
* KEYCODE_HOME
+ * KEYCODE_VIDEO_APP_X
+ * KEYCODE_FEATURED_APP_X
+ * KEYCODE_DEMO_APP_X
* This test launches an Activity and injects KeyEvents with the corresponding key codes.
* The test will fail if any of these keys are received by the activity.
* Note: The ASSIST tests were removed because they caused a side-effect of launching the
@@ -76,6 +79,26 @@
}
@Test
+ public void testKeyCodesForLaunchingApplications() {
+ testKey(KeyEvent.KEYCODE_VIDEO_APP_1);
+ testKey(KeyEvent.KEYCODE_VIDEO_APP_2);
+ testKey(KeyEvent.KEYCODE_VIDEO_APP_3);
+ testKey(KeyEvent.KEYCODE_VIDEO_APP_4);
+ testKey(KeyEvent.KEYCODE_VIDEO_APP_5);
+ testKey(KeyEvent.KEYCODE_VIDEO_APP_6);
+ testKey(KeyEvent.KEYCODE_VIDEO_APP_7);
+ testKey(KeyEvent.KEYCODE_VIDEO_APP_8);
+ testKey(KeyEvent.KEYCODE_FEATURED_APP_1);
+ testKey(KeyEvent.KEYCODE_FEATURED_APP_2);
+ testKey(KeyEvent.KEYCODE_FEATURED_APP_3);
+ testKey(KeyEvent.KEYCODE_FEATURED_APP_4);
+ testKey(KeyEvent.KEYCODE_DEMO_APP_1);
+ testKey(KeyEvent.KEYCODE_DEMO_APP_2);
+ testKey(KeyEvent.KEYCODE_DEMO_APP_3);
+ testKey(KeyEvent.KEYCODE_DEMO_APP_4);
+ }
+
+ @Test
public void testKeyCodeHomeShortcutLeftMeta() {
testKeyCodeHomeShortcut(KeyEvent.META_META_LEFT_ON | KeyEvent.META_META_ON);
}
diff --git a/tests/tests/voiceinteraction/common/Android.bp b/tests/tests/voiceinteraction/common/Android.bp
index e9052de..d667329 100644
--- a/tests/tests/voiceinteraction/common/Android.bp
+++ b/tests/tests/voiceinteraction/common/Android.bp
@@ -19,5 +19,6 @@
java_library {
name: "CtsVoiceInteractionCommon",
srcs: ["src/**/*.java"],
- sdk_version: "current",
+ static_libs: ["compatibility-device-util-axt"],
+ sdk_version: "test_current",
}
diff --git a/tests/tests/voiceinteraction/common/src/android/voiceinteraction/common/Utils.java b/tests/tests/voiceinteraction/common/src/android/voiceinteraction/common/Utils.java
index 4a34e2a..29a8bb5 100644
--- a/tests/tests/voiceinteraction/common/src/android/voiceinteraction/common/Utils.java
+++ b/tests/tests/voiceinteraction/common/src/android/voiceinteraction/common/Utils.java
@@ -22,7 +22,10 @@
import android.os.Parcelable;
import android.util.Log;
+import com.android.compatibility.common.util.PropertyUtil;
+
import java.util.ArrayList;
+import java.util.Objects;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
@@ -267,4 +270,10 @@
}
return bits;
}
+
+ public static boolean isVirtualDevice() {
+ final String property = PropertyUtil.getProperty("ro.hardware.virtual_device");
+ Log.v(TAG, "virtual device property=" + property);
+ return Objects.equals(property, "1");
+ }
}
diff --git a/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/MainHotwordDetectionService.java b/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/MainHotwordDetectionService.java
index d63dc3d..9e547ad 100644
--- a/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/MainHotwordDetectionService.java
+++ b/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/MainHotwordDetectionService.java
@@ -310,6 +310,11 @@
}
numBytes += bytesRead;
}
+ // The audio data will be zero on virtual device, so it would be better to skip to
+ // check the audio data.
+ if (Utils.isVirtualDevice()) {
+ return true;
+ }
for (byte b : buffer) {
// TODO: Maybe check that some portion of the bytes are non-zero.
if (b != 0) {
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java b/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java
index 47153af..0161540 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java
@@ -38,8 +38,6 @@
import android.webkit.cts.WebViewSyncLoader.WaitForLoadedClient;
import android.util.Pair;
-import androidx.test.filters.FlakyTest;
-
import com.android.compatibility.common.util.NullWebViewUtils;
import com.android.compatibility.common.util.PollingCheck;
import com.google.common.util.concurrent.SettableFuture;
@@ -144,7 +142,6 @@
// Verify shouldoverrideurlloading called on webview called via onCreateWindow
// TODO(sgurun) upstream this test to Aw.
- @FlakyTest(bugId = 172331117)
public void testShouldOverrideUrlLoadingOnCreateWindow() throws Exception {
if (!NullWebViewUtils.isWebViewAvailable()) {
return;
diff --git a/tests/video/src/android/video/cts/CodecInfo.java b/tests/video/src/android/video/cts/CodecInfo.java
index 4309a96..5b07326 100644
--- a/tests/video/src/android/video/cts/CodecInfo.java
+++ b/tests/video/src/android/video/cts/CodecInfo.java
@@ -43,6 +43,8 @@
public boolean mSupportSemiPlanar = false;
/** if codec is supporting YUV planar format */
public boolean mSupportPlanar = false;
+ /** if codec is software-based */
+ public boolean mIsSoftware = false;
private static final String TAG = "CodecInfo";
private static final String VIDEO_AVC = MediaFormat.MIMETYPE_VIDEO_AVC;
@@ -86,6 +88,8 @@
info.mFps = format.getInteger(MediaFormat.KEY_FRAME_RATE);
info.mBitRate = format.getInteger(MediaFormat.KEY_BIT_RATE);
+ info.mIsSoftware = !codec.getCodecInfo().isHardwareAccelerated();
+
codec.release();
return info;
}
diff --git a/tests/video/src/android/video/cts/VideoEncoderDecoderTest.java b/tests/video/src/android/video/cts/VideoEncoderDecoderTest.java
index ea15e91..4755b9a 100644
--- a/tests/video/src/android/video/cts/VideoEncoderDecoderTest.java
+++ b/tests/video/src/android/video/cts/VideoEncoderDecoderTest.java
@@ -143,6 +143,16 @@
private TestConfig mTestConfig;
+ private static boolean isPreferredAbi() {
+ boolean prefers64Bit = false;
+ if (Build.SUPPORTED_64_BIT_ABIS.length > 0 &&
+ Build.SUPPORTED_ABIS.length > 0 &&
+ Build.SUPPORTED_ABIS[0].equals(Build.SUPPORTED_64_BIT_ABIS[0])) {
+ prefers64Bit = true;
+ }
+ return android.os.Process.is64Bit() ? prefers64Bit : !prefers64Bit;
+ }
+
@Override
protected void setUp() throws Exception {
mEncodedOutputBuffer = new LinkedList<Pair<ByteBuffer, BufferInfo>>();
@@ -702,6 +712,7 @@
if (MediaUtils.onFrankenDevice()) {
mTestConfig.mMaxTimeMs /= 10;
}
+ Log.i(TAG, "current ABI is " + (isPreferredAbi() ? "" : "not ") + "a preferred one");
mVideoWidth = w;
mVideoHeight = h;
@@ -811,7 +822,14 @@
String error = MediaPerfUtils.verifyAchievableFrameRates(
encoderName, mimeType, w, h, measuredFps);
// Performance numbers only make sense on real devices, so skip on non-real devices
- if (MediaUtils.onFrankenDevice() && error != null) {
+ //
+ // Also ignore verification on non-preferred ABIs due to the possibility of
+ // this being emulated. On some CPU-s 32-bit mode is emulated using big cores
+ // that results in the SW codecs also running much faster (perhaps they are
+ // scheduled for the big cores as well)
+ // TODO: still verify lower bound.
+ if ((MediaUtils.onFrankenDevice() || (infoEnc.mIsSoftware && !isPreferredAbi()))
+ && error != null) {
// ensure there is data, but don't insist that it is correct
assertFalse(error, error.startsWith("Failed to get "));
} else {
diff --git a/tools/cts-dynamic-config/Android.bp b/tools/cts-dynamic-config/Android.bp
index c978ab2..61f9e54 100644
--- a/tools/cts-dynamic-config/Android.bp
+++ b/tools/cts-dynamic-config/Android.bp
@@ -33,7 +33,7 @@
test_suites: [
"cts",
"general-tests",
- "mts",
+ "mts-media",
],
java_resources: [
":cts-dynamic-config.dynamic",
diff --git a/tools/cts-tradefed/tests/src/com/android/compatibility/common/tradefed/presubmit/ApkPackageNameCheck.java b/tools/cts-tradefed/tests/src/com/android/compatibility/common/tradefed/presubmit/ApkPackageNameCheck.java
index b50c906..673d93c 100644
--- a/tools/cts-tradefed/tests/src/com/android/compatibility/common/tradefed/presubmit/ApkPackageNameCheck.java
+++ b/tools/cts-tradefed/tests/src/com/android/compatibility/common/tradefed/presubmit/ApkPackageNameCheck.java
@@ -23,6 +23,7 @@
import com.android.tradefed.config.ConfigurationException;
import com.android.tradefed.config.ConfigurationFactory;
import com.android.tradefed.config.IConfiguration;
+import com.android.tradefed.config.IDeviceConfiguration;
import com.android.tradefed.targetprep.ITargetPreparer;
import com.android.tradefed.targetprep.PushFilePreparer;
import com.android.tradefed.targetprep.TestAppInstallSetup;
@@ -87,64 +88,65 @@
// For each config, we check all the apk it's going to install
List<File> apkNames = new ArrayList<>();
List<String> packageListNames = new ArrayList<>();
- for (ITargetPreparer prep : c.getTargetPreparers()) {
- if (prep instanceof TestAppInstallSetup) {
- apkNames.addAll(((TestAppInstallSetup) prep).getTestsFileName());
- }
- // Ensure the files requested to be pushed exist.
- if (prep instanceof FilePusher && ((FilePusher) prep).shouldAppendBitness()) {
- for (File f : ((PushFilePreparer) prep).getPushSpecs(null).values()) {
- String path = f.getPath();
- if (!new File(testcases, path + "32").exists()
- || !new File(testcases, path + "64").exists()) {
- // TODO: Enforce should abort on failure is True in CTS
- if (((FilePusher) prep).shouldAbortOnFailure()) {
- fail(
- String.format(
- "File %s[32/64] wasn't found in testcases/ while "
- + "it's expected to be pushed as part of "
- + "%s",
- path, config.getName()));
+ for (IDeviceConfiguration dConfig : c.getDeviceConfig()) {
+ for (ITargetPreparer prep : dConfig.getTargetPreparers()) {
+ if (prep instanceof TestAppInstallSetup) {
+ apkNames.addAll(((TestAppInstallSetup) prep).getTestsFileName());
+ }
+ // Ensure the files requested to be pushed exist.
+ if (prep instanceof FilePusher && ((FilePusher) prep).shouldAppendBitness()) {
+ for (File f : ((PushFilePreparer) prep).getPushSpecs(null).values()) {
+ String path = f.getPath();
+ if (!new File(testcases, path + "32").exists()
+ || !new File(testcases, path + "64").exists()) {
+ // TODO: Enforce should abort on failure is True in CTS
+ if (((FilePusher) prep).shouldAbortOnFailure()) {
+ fail(
+ String.format(
+ "File %s[32/64] wasn't found in testcases/ while "
+ + "it's expected to be pushed as part of "
+ + "%s",
+ path, config.getName()));
+ }
}
}
- }
- } else if (prep instanceof PushFilePreparer) {
- for (File f : ((PushFilePreparer) prep).getPushSpecs(null).values()) {
- String path = f.getPath();
- if (!new File(testcases, path).exists()) {
- // TODO: Enforce should abort on failure is True in CTS
- if (((PushFilePreparer) prep).shouldAbortOnFailure()) {
- fail(
- String.format(
- "File %s wasn't found in testcases/ while it's "
- + "expected to be pushed as part of %s",
- path, config.getName()));
+ } else if (prep instanceof PushFilePreparer) {
+ for (File f : ((PushFilePreparer) prep).getPushSpecs(null).values()) {
+ String path = f.getPath();
+ if (!new File(testcases, path).exists()) {
+ // TODO: Enforce should abort on failure is True in CTS
+ if (((PushFilePreparer) prep).shouldAbortOnFailure()) {
+ fail(
+ String.format(
+ "File %s wasn't found in testcases/ while it's "
+ + "expected to be pushed as part of %s",
+ path, config.getName()));
+ }
}
}
}
}
- }
-
- for (File apk : apkNames) {
- String apkName = apk.getName();
- File apkFile = new File(testcases, apkName);
- if (!apkFile.exists()) {
- fail(String.format("Module %s is trying to install %s which does not "
- + "exists in testcases/", config.getName(), apkFile));
- }
- AaptParser res = AaptParser.parse(apkFile);
- assertNotNull(res);
- String packageName = res.getPackageName();
- String put = packageNames.put(packageName, apkName);
- packageListNames.add(packageName);
- // The package already exists and it's a different apk
- if (put != null && !apkName.equals(put) && !EXCEPTION_LIST.contains(packageName)) {
- fail(String.format("Module %s: Package name '%s' from apk '%s' was already "
- + "added by previous apk '%s'.",
- config.getName(), packageName, apkName, put));
+
+ for (File apk : apkNames) {
+ String apkName = apk.getName();
+ File apkFile = new File(testcases, apkName);
+ if (!apkFile.exists()) {
+ fail(String.format("Module %s is trying to install %s which does not "
+ + "exists in testcases/", config.getName(), apkFile));
+ }
+ AaptParser res = AaptParser.parse(apkFile);
+ assertNotNull(res);
+ String packageName = res.getPackageName();
+ String put = packageNames.put(packageName, apkName);
+ packageListNames.add(packageName);
+ // The package already exists and it's a different apk
+ if (put != null && !apkName.equals(put) && !EXCEPTION_LIST.contains(packageName)) {
+ fail(String.format("Module %s: Package name '%s' from apk '%s' was already "
+ + "added by previous apk '%s'.",
+ config.getName(), packageName, apkName, put));
+ }
}
}
-
// Catch a test trying to run something it doesn't install.
List<IRemoteTest> tests = c.getTests();
for (IRemoteTest test : tests) {
diff --git a/tools/cts-tradefed/tests/src/com/android/compatibility/common/tradefed/presubmit/CtsConfigLoadingTest.java b/tools/cts-tradefed/tests/src/com/android/compatibility/common/tradefed/presubmit/CtsConfigLoadingTest.java
index d8fb115..da4208e 100644
--- a/tools/cts-tradefed/tests/src/com/android/compatibility/common/tradefed/presubmit/CtsConfigLoadingTest.java
+++ b/tools/cts-tradefed/tests/src/com/android/compatibility/common/tradefed/presubmit/CtsConfigLoadingTest.java
@@ -27,6 +27,7 @@
import com.android.tradefed.config.ConfigurationException;
import com.android.tradefed.config.ConfigurationFactory;
import com.android.tradefed.config.IConfiguration;
+import com.android.tradefed.config.IDeviceConfiguration;
import com.android.tradefed.invoker.ExecutionFiles.FilesKey;
import com.android.tradefed.invoker.TestInformation;
import com.android.tradefed.invoker.shard.token.TokenProperty;
@@ -215,31 +216,36 @@
for (File config : listConfig) {
IConfiguration c = ConfigurationFactory.getInstance()
.createConfigurationFromArgs(new String[] {config.getAbsolutePath()});
- // Ensure the deprecated ApkInstaller is not used anymore.
- for (ITargetPreparer prep : c.getTargetPreparers()) {
- if (prep.getClass().isAssignableFrom(ApkInstaller.class)) {
- throw new ConfigurationException(
- String.format("%s: Use com.android.tradefed.targetprep.suite."
- + "SuiteApkInstaller instead of com.android.compatibility."
- + "common.tradefed.targetprep.ApkInstaller, options will be "
- + "the same.", config));
- }
- if (prep.getClass().isAssignableFrom(PreconditionPreparer.class)) {
- throw new ConfigurationException(
- String.format(
- "%s: includes a PreconditionPreparer (%s) which is not allowed"
- + " in modules.",
- config.getName(), prep.getClass()));
- }
- if (prep.getClass().isAssignableFrom(DeviceSetup.class)) {
- DeviceSetup deviceSetup = (DeviceSetup) prep;
- if (!deviceSetup.isForceSkipSystemProps()) {
- throw new ConfigurationException(
- String.format("%s: %s needs to be configured with "
- + "<option name=\"force-skip-system-props\" "
- + "value=\"true\" /> in CTS.",
- config.getName(), prep.getClass()));
- }
+ if (c.getDeviceConfig().size() > 2) {
+ throw new ConfigurationException(String.format("%s declares more than 2 devices.", config));
+ }
+ for (IDeviceConfiguration dConfig : c.getDeviceConfig()) {
+ // Ensure the deprecated ApkInstaller is not used anymore.
+ for (ITargetPreparer prep : dConfig.getTargetPreparers()) {
+ if (prep.getClass().isAssignableFrom(ApkInstaller.class)) {
+ throw new ConfigurationException(
+ String.format("%s: Use com.android.tradefed.targetprep.suite."
+ + "SuiteApkInstaller instead of com.android.compatibility."
+ + "common.tradefed.targetprep.ApkInstaller, options will be "
+ + "the same.", config));
+ }
+ if (prep.getClass().isAssignableFrom(PreconditionPreparer.class)) {
+ throw new ConfigurationException(
+ String.format(
+ "%s: includes a PreconditionPreparer (%s) which is not "
+ + "allowed in modules.",
+ config.getName(), prep.getClass()));
+ }
+ if (prep.getClass().isAssignableFrom(DeviceSetup.class)) {
+ DeviceSetup deviceSetup = (DeviceSetup) prep;
+ if (!deviceSetup.isForceSkipSystemProps()) {
+ throw new ConfigurationException(
+ String.format("%s: %s needs to be configured with "
+ + "<option name=\"force-skip-system-props\" "
+ + "value=\"true\" /> in CTS.",
+ config.getName(), prep.getClass()));
+ }
+ }
}
}
// We can ensure that Host side tests are not empty.
@@ -292,6 +298,7 @@
}
}
}
+
ConfigurationDescriptor cd = c.getConfigurationDescription();
Assert.assertNotNull(config + ": configuration descriptor is null", cd);
List<String> component = cd.getMetaData(METADATA_COMPONENT);
diff --git a/tools/vm-tests-tf/Android.bp b/tools/vm-tests-tf/Android.bp
index c9b656a..97c17196 100644
--- a/tools/vm-tests-tf/Android.bp
+++ b/tools/vm-tests-tf/Android.bp
@@ -101,3 +101,80 @@
],
installable: false,
}
+
+java_library_host {
+ name: "cts-tf-dalvik-buildutil",
+ srcs: [
+ "build/src/**/*.java",
+ "src/**/*.java",
+ ],
+ libs: [
+ "junit",
+ "jsr305",
+ "d8",
+ "smali",
+ ],
+}
+
+java_genrule_host {
+ name: "vm-tests-tf-lib",
+ tools: [
+ "soong_zip",
+ "d8"
+ ],
+ srcs: [
+ ":cts-tf-dalvik-buildutil",
+ ":vmtests-generated-resources",
+ ":vmtests-mains",
+ ":cts-vmtests-dot",
+ ":junit",
+ ":d8",
+ ":smali",
+ ],
+ cmd: "echo Generating BuildDalvikSuite tests" +
+ " && mkdir -p $(genDir)/classes" +
+ " && unzip -bq $(location :cts-tf-dalvik-buildutil) -d $(genDir)/classes" +
+ " && mkdir -p $(genDir)/tests" +
+ " && java" +
+ " -cp $(location :cts-tf-dalvik-buildutil):$(location :junit):$(location :d8):$(location :smali):$(location :cts-vmtests-dot)" +
+ " util.build.BuildDalvikSuite" +
+ " cts/tools/vm-tests-tf/src" +
+ " $(genDir)/tests" +
+ " $(genDir)/classes" +
+ " && echo Generating dexcore tests" +
+ " && $(location soong_zip) -jar -o $(genDir)/tests/dot/junit/dexcore.jar-class.jar" +
+ " -C $(genDir)/classes" +
+ " -f $(genDir)/classes/dot/junit/DxUtil.class" +
+ " -f $(genDir)/classes/dot/junit/DxAbstractMain.class" +
+ " -f $(genDir)/classes/dot/junit/AssertionFailedException.class" +
+ " && mkdir -p $(genDir)/dexcore" +
+ " && $(location d8) -JXms16M -JXmx2048M" +
+ " --output $(genDir)/dexcore" +
+ " $(genDir)/tests/dot/junit/dexcore.jar-class.jar" +
+ " && $(location soong_zip) -jar -o $(genDir)/tests/dot/junit/dexcore.jar" +
+ " -C $(genDir)/dexcore" +
+ " -D $(genDir)/dexcore" +
+ " && echo Combining tests" +
+ " && mkdir -p $(genDir)/out" +
+ " && unzip -bq $(location :vmtests-generated-resources) -d $(genDir)/generated-resources" +
+ " && cp $(location :vmtests-mains) $(genDir)/mains.jar" +
+ " && $(location soong_zip) -o $(out)" +
+ " -C $(genDir)/generated-resources" +
+ " -D $(genDir)/generated-resources" +
+ " -C $(genDir)" +
+ " -D $(genDir)/tests" +
+ " -j -P tests -f $(genDir)/mains.jar",
+ out: ["vm-tests-tf-lib.jar"],
+}
+
+java_test_host {
+ name: "vm-tests-tf",
+ static_libs: [
+ "vm-tests-tf-lib"
+ ],
+ test_config: "AndroidTest.xml",
+ test_suites: [
+ "cts",
+ "general-tests",
+ ],
+}
diff --git a/tools/vm-tests-tf/Android.mk b/tools/vm-tests-tf/Android.mk
deleted file mode 100644
index 18449e1..0000000
--- a/tools/vm-tests-tf/Android.mk
+++ /dev/null
@@ -1,121 +0,0 @@
-# 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.
-
-LOCAL_PATH := $(call my-dir)
-
-# test dex library
-# ============================================================
-include $(CLEAR_VARS)
-
-# custom variables used to generate test description. do not touch!
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_MODULE := cts-tf-dalvik-lib
-LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
-LOCAL_LICENSE_CONDITIONS := notice
-LOCAL_MODULE_CLASS := JAVA_LIBRARIES
-LOCAL_MODULE_TAGS := optional
-LOCAL_JAVA_LIBRARIES := junit
-include $(BUILD_JAVA_LIBRARY)
-
-cts-tf-dalvik-lib.jar := $(full_classes_jar)
-
-# buildutil java library
-# ============================================================
-include $(CLEAR_VARS)
-
-# 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
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src build/src)
-
-LOCAL_MODULE := cts-tf-dalvik-buildutil
-LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
-LOCAL_LICENSE_CONDITIONS := notice
-LOCAL_MODULE_CLASS := JAVA_LIBRARIES
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_JAVA_LIBRARIES := junit jsr305 d8 smali
-
-LOCAL_CLASSPATH := $(HOST_JDK_TOOLS_JAR)
-
-include $(BUILD_HOST_JAVA_LIBRARY)
-
-# Buid android.core.vm-tests-tf.jar
-# ============================================================
-#
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := vm-tests-tf
-LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
-LOCAL_LICENSE_CONDITIONS := notice
-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)
-
-# Tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts general-tests
-
-include $(BUILD_SYSTEM)/base_rules.mk
-
-vmteststf_dep_jars := \
- $(HOST_JDK_TOOLS_JAR) \
- $(cts-tf-dalvik-lib.jar) \
- $(addprefix $(HOST_OUT_JAVA_LIBRARIES)/, cts-tf-dalvik-buildutil.jar junit.jar d8.jar smali.jar) \
- $(call intermediates-dir-for,JAVA_LIBRARIES,cts-vmtests-dot,HOST,COMMON)/classes.jar
-
-vmtests_generated_resources_jar := \
- $(call intermediates-dir-for,JAVA_LIBRARIES,vmtests-generated-resources,HOST)/javalib.jar
-vmtests_mains_generated_jar := \
- $(call intermediates-dir-for,JAVA_LIBRARIES,vmtests-mains,,COMMON)/javalib.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_CLASS_PATH := $(call normalize-path-list, $(vmteststf_dep_jars))
-$(LOCAL_BUILT_MODULE): PRIVATE_VMTESTS_GENERATED_RESOURCES := $(vmtests_generated_resources_jar)
-$(LOCAL_BUILT_MODULE): PRIVATE_VMTESTS_MAINS_GENERATED := $(vmtests_mains_generated_jar)
-$(LOCAL_BUILT_MODULE) : $(vmteststf_dep_jars) $(HOST_OUT_JAVA_LIBRARIES)/tradefed.jar $(DX) $(vmtests_generated_resources_jar) $(vmtests_mains_generated_jar)
- $(hide) rm -rf $(dir $@) && mkdir -p $(dir $@)
- $(hide) mkdir -p $(dir $(PRIVATE_INTERMEDIATES_DEXCORE_JAR))
- # generated and compile the host side junit tests
- @echo "Write generated Main_*.java"
- $(hide) $(JAVA) \
- -cp $(PRIVATE_CLASS_PATH) util.build.BuildDalvikSuite $(PRIVATE_SRC_FOLDER) $(PRIVATE_INTERMEDIATES) \
- $(PRIVATE_INTERMEDIATES_CLASSES)
- @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 dot/junit/AssertionFailedException.class)
- $(hide) mkdir -p $(PRIVATE_INTERMEDIATES_DEXCORE_JAR).tmp
- $(hide) $(DX_COMMAND) --output $(PRIVATE_INTERMEDIATES_DEXCORE_JAR).tmp \
- $(if $(NO_OPTIMIZE_DX), --debug) $(PRIVATE_INTERMEDIATES_DEXCORE_JAR)-class.jar && rm -f $(PRIVATE_INTERMEDIATES_DEXCORE_JAR).jar
- $(hide) cd $(PRIVATE_INTERMEDIATES_DEXCORE_JAR).tmp && zip -q -r $(abspath $(PRIVATE_INTERMEDIATES_DEXCORE_JAR)) .
- $(hide) cp $(PRIVATE_VMTESTS_GENERATED_RESOURCES) $@
- $(hide) cp $(PRIVATE_VMTESTS_MAINS_GENERATED) $(dir $@)/tests/mains.jar
- $(hide) cd $(dir $@) && zip -q -r $(notdir $@) tests
-
-# Clean up temp vars
-intermediates :=
-vmteststf_dep_jars :=
-vmtests_generated_resources_jar :=
-vmtests_mains_generated_jar :=
-
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tools/vm-tests-tf/AndroidTest.xml b/tools/vm-tests-tf/AndroidTest.xml
index 4006b65..4ca3b57 100644
--- a/tools/vm-tests-tf/AndroidTest.xml
+++ b/tools/vm-tests-tf/AndroidTest.xml
@@ -22,7 +22,7 @@
<option name="config-descriptor:metadata" key="component" value="art" />
<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" />
+ <option name="jar" value="vm-tests-tf.jar" />
<option name="runtime-hint" value="51m" />
</test>
</configuration>
diff --git a/tools/vm-tests-tf/build/src/util/build/BuildDalvikSuite.java b/tools/vm-tests-tf/build/src/util/build/BuildDalvikSuite.java
index 0b069b5..2e0f068 100644
--- a/tools/vm-tests-tf/build/src/util/build/BuildDalvikSuite.java
+++ b/tools/vm-tests-tf/build/src/util/build/BuildDalvikSuite.java
@@ -76,8 +76,8 @@
}
private static void printUsage() {
- System.out.println("usage: java-src-folder output-folder classpath " +
- "generated-main-files compiled_output");
+ System.out.println("usage: $(JAVA) -cp $(CLASSPATH) util.build.BuildDalvikSuite" +
+ " JAVASRC_FOLDER OUTPUT_FOLDER COMPILED_CLASSES_FOLDER");
}
class MyTestHandler implements TestHandler {
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
index 6a17e91..dd23d79 100644
--- 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
@@ -39,7 +39,7 @@
@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 JAR_FILE = "vm-tests-tf.jar";
private static final String TEMP_DIR = "/data/local/tmp";
private static final String VM_TEMP_DIR = TEMP_DIR +"/vm-tests";
@@ -50,10 +50,11 @@
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()));
+ try {
+ installVmPrereqs(device, helper);
+ } catch (Exception ex) {
+ throw new RuntimeException("Failed to install vm-tests prereqs on device "
+ + device.getSerialNumber(), ex);
}
}
@@ -71,10 +72,10 @@
*
* @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
+ * @throws DeviceNotAvailableException if device is unavailable
+ * @throws RuntimeException if there is another failure
*/
- private boolean installVmPrereqs(ITestDevice device, CompatibilityBuildHelper ctsBuild)
+ private void installVmPrereqs(ITestDevice device, CompatibilityBuildHelper ctsBuild)
throws DeviceNotAvailableException {
cleanupDeviceFiles(device);
// Creates temp directory recursively. We also need to create the dalvik-cache directory
@@ -84,14 +85,13 @@
try {
File jarFile = ctsBuild.getTestFile(JAR_FILE);
if (!jarFile.exists()) {
- CLog.e("Missing jar file %s", jarFile.getPath());
- return false;
+ throw new RuntimeException("Missing jar file " + jarFile.getPath());
}
String jarOnDevice = VM_TEMP_DIR + "/" + JAR_FILE;
if (!device.pushFile(jarFile, jarOnDevice)) {
- CLog.e("Failed to push vm test jar");
- return false;
+ throw new RuntimeException("Failed to push vm test jar " + jarFile + " to "
+ + jarOnDevice);
}
// TODO: Only extract tests directory, avoid rm.
@@ -99,17 +99,17 @@
+ " && rm -rf " + VM_TEMP_DIR + "/dot*"
+ " && mv " + VM_TEMP_DIR + "/tests/* " + VM_TEMP_DIR + "/"
+ " && echo Success";
+
CommandResult result = device.executeShellV2Command(cmd);
+
if (result.getStatus() != CommandStatus.SUCCESS) {
- CLog.e("Failed to extract and prepare vm tests jar");
- return false;
+ throw new RuntimeException("Failed to extract and prepare vm tests jar: [" + cmd
+ + "] with stderr: " + result.getStderr());
}
} catch (IOException e) {
- CLog.e("Failed to extract jar file %s and sync it to device %s.",
- JAR_FILE, device.getSerialNumber());
- return false;
+ throw new RuntimeException("Failed to extract jar file " + JAR_FILE
+ + " and sync it to device.", e);
}
- return true;
}
/**