Merge "DO NOT MERGE Skip of testEncryption with FEATURE_AUTOMOTIVE" into oreo-mr1-cts-dev
diff --git a/apps/CtsVerifier/AndroidManifest.xml b/apps/CtsVerifier/AndroidManifest.xml
index 13962a1..a06db9e 100644
--- a/apps/CtsVerifier/AndroidManifest.xml
+++ b/apps/CtsVerifier/AndroidManifest.xml
@@ -18,7 +18,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.cts.verifier"
android:versionCode="5"
- android:versionName="8.1_r16">
+ android:versionName="8.1_r17">
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="27"/>
@@ -1951,6 +1951,7 @@
<meta-data android:name="test_category" android:value="@string/test_category_notifications" />
<meta-data android:name="test_excluded_features"
android:value="android.hardware.type.watch:android.hardware.type.television:android.software.leanback" />
+ <meta-data android:name="test_required_features" android:value="android.software.device_admin" />
</activity>
<activity android:name=".security.CANotifyOnBootActivity"
android:label="@string/caboot_test">
@@ -1961,6 +1962,7 @@
<meta-data android:name="test_category" android:value="@string/test_category_notifications" />
<meta-data android:name="test_excluded_features"
android:value="android.hardware.type.watch:android.hardware.type.television:android.software.leanback" />
+ <meta-data android:name="test_required_features" android:value="android.software.device_admin" />
</activity>
<activity android:name=".security.KeyChainTest"
diff --git a/apps/CtsVerifier/res/layout-small-dpad/positive_device_owner.xml b/apps/CtsVerifier/res/layout-small-dpad/positive_device_owner.xml
new file mode 100644
index 0000000..e8b926b
--- /dev/null
+++ b/apps/CtsVerifier/res/layout-small-dpad/positive_device_owner.xml
@@ -0,0 +1,58 @@
+<?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"
+ style="@style/RootLayoutPadding"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <ScrollView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:fillViewport="true">
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <TextView
+ android:id="@+id/positive_device_owner_instructions"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/device_owner_positive_tests_instructions"
+ android:textSize="18dip" />
+
+ <Button
+ android:id="@+id/check_preconditions"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/device_owner_precondition_button_label" />
+
+ <Button
+ android:id="@+id/set_device_owner_button"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/set_device_owner_button_label" />
+
+ <ListView
+ android:id="@+id/android:list"
+ android:layout_width="match_parent"
+ android:layout_height="950dp"
+ android:layout_weight="1" />
+
+ <include layout="@layout/pass_fail_buttons" />
+ </LinearLayout>
+ </ScrollView>
+</LinearLayout>
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/RingerModeActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/RingerModeActivity.java
index 7c807c2..b4bfa01 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/audio/RingerModeActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/RingerModeActivity.java
@@ -136,7 +136,8 @@
private boolean supportsConditionProviders() {
ActivityManager am = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
- return !am.isLowRamDevice();
+ return !am.isLowRamDevice()
+ || mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH);
}
private int getVolumeDelta(int volume) {
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/peripheralprofile/ProfileManager.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/peripheralprofile/ProfileManager.java
index fc4e6c9..45b1220 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/audio/peripheralprofile/ProfileManager.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/peripheralprofile/ProfileManager.java
@@ -49,7 +49,7 @@
"<ProfileList Version=\"1.0.0\">" +
"<PeripheralProfile ProfileName=\"AudioBox USB 96\" ProfileDescription=\"PreSonus AudioBox USB 96\" ProductName=\"USB-Audio - AudioBox USB 96\">" +
"<OutputDevInfo ChanCounts=\"2\" ChanPosMasks=\"12\" ChanIndexMasks=\"3\" Encodings=\"4\" SampleRates=\"44100,48000,88200,96000\"/>" +
- "<InputDevInfo ChanCounts=\"1, 2\" ChanPosMasks=\"12, 16\" ChanIndexMasks=\"1,3\" Encodings=\"4\" SampleRates=\"44100,48000,88200,96000\"/>" +
+ "<InputDevInfo ChanCounts=\"1,2\" ChanPosMasks=\"12,16\" ChanIndexMasks=\"1,3\" Encodings=\"4\" SampleRates=\"44100,48000,88200,96000\"/>" +
"</PeripheralProfile>" +
"<PeripheralProfile ProfileName=\"AudioBox 44VSL\" ProfileDescription=\"Presonus AudioBox 44VSL\" ProductName=\"USB-Audio - AudioBox 44 VSL\">" +
"<OutputDevInfo ChanCounts=\"2,3,4\" ChanPosMasks=\"12\" ChanIndexMasks=\"3,7,15\" Encodings=\"4\" SampleRates=\"44100,48000,88200,96000\" />" +
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/CrashReporter.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/CrashReporter.java
index c564067..f17498d 100644
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/CrashReporter.java
+++ b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/CrashReporter.java
@@ -120,15 +120,16 @@
private void processLogLine(String line) {
mLogcatChunk.append(line);
+ mLogcatChunk.append('\n');
Matcher m;
- if ((m = CrashUtils.sNewTestPattern.matcher(line)).matches()) {
+ if ((m = CrashUtils.sNewTestPattern.matcher(line)).find()) {
mTestName = m.group(1);
mCrashes = new JSONArray();
mLogcatChunk.setLength(0);
- } else if (CrashUtils.sEndofCrashPattern.matcher(line).matches()) {
+ } else if (CrashUtils.sEndofCrashPattern.matcher(line).find()) {
CrashUtils.addAllCrashes(mLogcatChunk.toString(), mCrashes);
mLogcatChunk.setLength(0);
- } else if (CrashUtils.sUploadRequestPattern.matcher(line).matches()) {
+ } else if (CrashUtils.sUploadRequestPattern.matcher(line).find()) {
upload(mDevice, mTestName, mCrashes);
}
}
diff --git a/common/util/src/com/android/compatibility/common/util/CrashUtils.java b/common/util/src/com/android/compatibility/common/util/CrashUtils.java
index e058df4..2b0531c 100644
--- a/common/util/src/com/android/compatibility/common/util/CrashUtils.java
+++ b/common/util/src/com/android/compatibility/common/util/CrashUtils.java
@@ -16,89 +16,133 @@
package com.android.compatibility.common.util;
+import java.io.File;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
+import java.math.BigInteger;
/** Contains helper functions and shared constants for crash parsing. */
public class CrashUtils {
+ // used to only detect actual addresses instead of nullptr and other unlikely values
+ public static final BigInteger MIN_CRASH_ADDR = new BigInteger("8000", 16);
- public static final long MIN_CRASH_ADDR = 32768;
// Matches the end of a crash
public static final Pattern sEndofCrashPattern =
- Pattern.compile(".*DEBUG\\s+:\\s+backtrace:.*");
+ Pattern.compile("DEBUG\\s+?:\\s+?backtrace:");
public static final String DEVICE_PATH = "/data/local/tmp/CrashParserResults/";
public static final String LOCK_FILENAME = "lockFile.loc";
public static final String UPLOAD_REQUEST = "Please upload a result file to stagefright";
public static final Pattern sUploadRequestPattern =
- Pattern.compile(".*" + UPLOAD_REQUEST + ".*");
+ Pattern.compile(UPLOAD_REQUEST);
public static final String NEW_TEST_ALERT = "New test starting with name: ";
public static final Pattern sNewTestPattern =
- Pattern.compile(".*" + NEW_TEST_ALERT + "(\\w+)\\(.*\\).*");
- public static final String SIGNAL = "signal",
- NAME = "name",
- PID = "pid",
- TID = "tid",
- FAULT_ADDRESS = "faultaddress";
+ Pattern.compile(NEW_TEST_ALERT + "(\\w+?)\\(.*?\\)");
+ public static final String SIGNAL = "signal";
+ public static final String NAME = "name";
+ public static final String PROCESS = "process";
+ public static final String PID = "pid";
+ public static final String TID = "tid";
+ public static final String FAULT_ADDRESS = "faultaddress";
// Matches the smallest blob that has the appropriate header and footer
private static final Pattern sCrashBlobPattern =
- Pattern.compile("DEBUG\\s+:( [*]{3})+.*?DEBUG\\s+:\\s+backtrace:", Pattern.DOTALL);
+ Pattern.compile("DEBUG\\s+?:( [*]{3})+?.*?DEBUG\\s+?:\\s+?backtrace:", Pattern.DOTALL);
// Matches process id and name line and captures them
private static final Pattern sPidtidNamePattern =
- Pattern.compile("pid: (\\d+), tid: (\\d+), name: ([^\\s]+\\s+)*>>> (.*) <<<");
+ Pattern.compile("pid: (\\d+?), tid: (\\d+?), name: ([^\\s]+?\\s+?)*?>>> (.*?) <<<");
// Matches fault address and signal type line
private static final Pattern sFaultLinePattern =
Pattern.compile(
- "\\w+ \\d+ \\((.*)\\), code -*\\d+ \\(.*\\), fault addr "
+ "\\w+? \\d+? \\((.*?)\\), code -*?\\d+? \\(.*?\\), fault addr "
+ "(?:0x(\\p{XDigit}+)|-+)");
// Matches the abort message line if it contains CHECK_
private static Pattern sAbortMessageCheckPattern =
- Pattern.compile("(?i)Abort message.*CHECK_.*");
+ Pattern.compile("(?i)Abort message.*?CHECK_");
+
+ /**
+ * returns true if the signal is a segmentation fault or bus error.
+ */
+ public static boolean isSecuritySignal(JSONObject crash) throws JSONException {
+ return crash.getString(SIGNAL).toLowerCase().matches("sig(segv|bus)");
+ }
+
+ /**
+ * returns the filename of the process.
+ * e.g. "/system/bin/mediaserver" returns "mediaserver"
+ */
+ public static String getProcessFileName(JSONObject crash) throws JSONException {
+ return new File(crash.getString(PROCESS)).getName();
+ }
/**
* Determines if the given input has a {@link com.android.compatibility.common.util.Crash} that
* should fail an sts test
*
- * @param processNames list of applicable process names
+ * @param processPatterns list of patterns that match applicable process names
* @param checkMinAddr if the minimum fault address should be respected
* @param crashes list of crashes to check
* @return if a crash is serious enough to fail an sts test
*/
- public static boolean detectCrash(
- String[] processNames, boolean checkMinAddr, JSONArray crashes) {
+ public static boolean securityCrashDetected(
+ JSONArray crashes, boolean checkMinAddr, Pattern... processPatterns) {
+ return matchSecurityCrashes(crashes, checkMinAddr, processPatterns).length() > 0;
+ }
+
+ public static BigInteger getBigInteger(JSONObject source, String name) throws JSONException {
+ if (source.isNull(name)) {
+ return null;
+ }
+ String intString = source.getString(name);
+ BigInteger value = null;
+ try {
+ value = new BigInteger(intString, 16);
+ } catch (NumberFormatException e) {}
+ return value;
+ }
+
+ /**
+ * Determines which given inputs have a {@link com.android.compatibility.common.util.Crash} that
+ * should fail an sts test
+ *
+ * @param processPatterns list of patterns that match applicable process names
+ * @param checkMinAddr if the minimum fault address should be respected
+ * @param crashes list of crashes to check
+ * @return the list of crashes serious enough to fail an sts test
+ */
+ public static JSONArray matchSecurityCrashes(
+ JSONArray crashes, boolean checkMinAddr, Pattern... processPatterns) {
+ JSONArray securityCrashes = new JSONArray();
for (int i = 0; i < crashes.length(); i++) {
try {
JSONObject crash = crashes.getJSONObject(i);
- if (!crash.getString(SIGNAL).toLowerCase().matches("sig(segv|bus)")) {
+ if (!matchesAny(getProcessFileName(crash), processPatterns)) {
continue;
}
-
- if (checkMinAddr && !crash.isNull(FAULT_ADDRESS)) {
- if (crash.getLong(FAULT_ADDRESS) < MIN_CRASH_ADDR) {
- continue;
- }
- }
-
- boolean foundProcess = false;
- String name = crash.getString(NAME);
- for (String process : processNames) {
- if (name.equals(process)) {
- foundProcess = true;
- break;
- }
- }
-
- if (!foundProcess) {
+ if (!isSecuritySignal(crash)) {
continue;
}
+ BigInteger faultAddress = getBigInteger(crash, FAULT_ADDRESS);
+ if (checkMinAddr && faultAddress != null
+ && faultAddress.compareTo(MIN_CRASH_ADDR) < 0) {
+ continue;
+ }
+ securityCrashes.put(crash);
+ } catch (JSONException | NullPointerException e) {}
+ }
+ return securityCrashes;
+ }
- return true; // crash detected
- } catch (JSONException | NullPointerException e) {
+ /**
+ * returns true if the input matches any of the patterns.
+ */
+ private static boolean matchesAny(String input, Pattern... patterns) {
+ for (Pattern p : patterns) {
+ if (p.matcher(input).matches()) {
+ return true;
}
}
-
return false;
}
@@ -107,21 +151,23 @@
Matcher crashBlobFinder = sCrashBlobPattern.matcher(input);
while (crashBlobFinder.find()) {
String crashStr = crashBlobFinder.group(0);
- int tid = 0, pid = 0;
- Long faultAddress = null;
- String name = null, signal = null;
+ int tid = 0;
+ int pid = 0;
+ BigInteger faultAddress = null;
+ String name = null;
+ String process = null;
+ String signal = null;
Matcher pidtidNameMatcher = sPidtidNamePattern.matcher(crashStr);
if (pidtidNameMatcher.find()) {
try {
pid = Integer.parseInt(pidtidNameMatcher.group(1));
- } catch (NumberFormatException e) {
- }
+ } catch (NumberFormatException e) {}
try {
tid = Integer.parseInt(pidtidNameMatcher.group(2));
- } catch (NumberFormatException e) {
- }
+ } catch (NumberFormatException e) {}
name = pidtidNameMatcher.group(3).trim();
+ process = pidtidNameMatcher.group(4).trim();
}
Matcher faultLineMatcher = sFaultLinePattern.matcher(crashStr);
@@ -130,9 +176,8 @@
String faultAddrMatch = faultLineMatcher.group(2);
if (faultAddrMatch != null) {
try {
- faultAddress = Long.parseLong(faultAddrMatch, 16);
- } catch (NumberFormatException e) {
- }
+ faultAddress = new BigInteger(faultAddrMatch, 16);
+ } catch (NumberFormatException e) {}
}
}
if (!sAbortMessageCheckPattern.matcher(crashStr).find()) {
@@ -141,12 +186,12 @@
crash.put(PID, pid);
crash.put(TID, tid);
crash.put(NAME, name);
- crash.put(FAULT_ADDRESS, faultAddress);
+ crash.put(PROCESS, process);
+ crash.put(FAULT_ADDRESS,
+ faultAddress == null ? null : faultAddress.toString(16));
crash.put(SIGNAL, signal);
crashes.put(crash);
- } catch (JSONException e) {
-
- }
+ } catch (JSONException e) {}
}
}
return crashes;
diff --git a/common/util/tests/res/logcat.txt b/common/util/tests/res/logcat.txt
index ad778c7..b9d10d0 100644
--- a/common/util/tests/res/logcat.txt
+++ b/common/util/tests/res/logcat.txt
@@ -271,4 +271,66 @@
11-25 19:47:35.597 940 940 F DEBUG : #24 pc 0003fa3b /system/lib/libc.so (_ZL15__pthread_startPv+30)
11-25 19:47:35.597 940 940 F DEBUG : #25 pc 0001a085 /system/lib/libc.so (__start_thread+6)
11-25 19:47:35.837 940 940 F DEBUG :
-11-25 19:47:35.837 940 940 F DEBUG : Tombstone written to: /data/tombstones/tombstone_01
\ No newline at end of file
+11-25 19:47:35.837 940 940 F DEBUG : Tombstone written to: /data/tombstones/tombstone_01
+--------- beginning of crash
+09-03 17:48:05.627 11071 11189 F libc : Fatal signal 11 (SIGSEGV), code 1, fault addr 0xe9380000 in tid 11189 (synthetic_thread)
+09-03 17:48:05.707 359 359 W : debuggerd: handling request: pid=11071 uid=1041 gid=1005 tid=11189
+09-03 17:48:05.796 7072 7072 F DEBUG : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
+09-03 17:48:05.796 7072 7072 F DEBUG : Build fingerprint: 'google/angler/angler:7.1.1/N4F26T/3687331:userdebug/dev-keys'
+09-03 17:48:05.796 7072 7072 F DEBUG : Revision: '0'
+09-03 17:48:05.796 7072 7072 F DEBUG : ABI: 'arm'
+09-03 17:48:05.796 7072 7072 F DEBUG : pid: 11071, tid: 11189, name: synthetic_thread >>> synthetic_process_0 <<<
+09-03 17:48:05.797 7072 7072 F DEBUG : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xe9380000
+09-03 17:48:05.797 7072 7072 F DEBUG : r0 e9e7a240 r1 e9380000 r2 00000170 r3 00000000
+09-03 17:48:05.797 7072 7072 F DEBUG : r4 00000002 r5 00000000 r6 ec1e1f25 r7 eb6f8000
+09-03 17:48:05.797 7072 7072 F DEBUG : r8 00000000 r9 eb105204 sl 00000000 fp 000003c0
+09-03 17:48:05.797 7072 7072 F DEBUG : ip ebd3df18 sp eaf80688 lr ec1e1f41 pc ebd38dd6 cpsr 20000030
+09-03 17:48:05.805 7072 7072 F DEBUG :
+09-03 17:48:05.805 7072 7072 F DEBUG : backtrace:
+09-03 17:48:05.806 7072 7072 F DEBUG : #00 pc 00002dd6 /system/lib/libaudioutils.so (memcpy_to_float_from_i16+5)
+09-03 17:48:05.806 7072 7072 F DEBUG : #01 pc 00040f3d /system/lib/libaudioflinger.so
+09-03 17:48:05.806 7072 7072 F DEBUG : #02 pc 00040799 /system/lib/libaudioflinger.so
+09-03 17:48:05.806 7072 7072 F DEBUG : #03 pc 00011178 /system/lib/libaudioflinger.so
+09-03 17:48:05.806 7072 7072 F DEBUG : #04 pc 0003180b /system/lib/libaudioflinger.so
+09-03 17:48:05.806 7072 7072 F DEBUG : #05 pc 0002fe57 /system/lib/libaudioflinger.so
+09-03 17:48:05.806 7072 7072 F DEBUG : #06 pc 0000e345 /system/lib/libutils.so (_ZN7android6Thread11_threadLoopEPv+140)
+09-03 17:48:05.806 7072 7072 F DEBUG : #07 pc 000470b3 /system/lib/libc.so (_ZL15__pthread_startPv+22)
+09-03 17:48:05.806 7072 7072 F DEBUG : #08 pc 00019e3d /system/lib/libc.so (__start_thread+6)
+09-03 17:48:05.967 11272 11568 W NativeCrashListener: Couldn't find ProcessRecord for pid 11071
+09-03 17:48:05.969 359 359 W : debuggerd: resuming target 11071
+09-03 17:48:05.981 11272 11307 I BootReceiver: Copying /data/tombstones/tombstone_01 to DropBox (SYSTEM_TOMBSTONE)
+09-03 17:48:06.067 394 394 I ServiceManager: service 'media.sound_trigger_hw' died
+06-15 19:57:33.607 12736 12761 D PermissionCache: checking android.permission.MODIFY_AUDIO_SETTINGS for uid=10197 => granted (698 us)
+--------- beginning of crash
+06-15 19:57:33.607 12736 12761 F libc : Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 12761 (synthetic_thread)
+06-15 19:57:33.608 379 379 W : debuggerd: handling request: pid=12736 uid=1041 gid=1005 tid=12761
+06-15 19:57:33.670 26192 26192 F DEBUG : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
+06-15 19:57:33.670 26192 26192 F DEBUG : Build fingerprint: 'google/bullhead/bullhead:7.1.2/N2G48C/4104010:userdebug/dev-keys'
+06-15 19:57:33.670 26192 26192 F DEBUG : Revision: 'rev_1.0'
+06-15 19:57:33.670 26192 26192 F DEBUG : ABI: 'arm'
+06-15 19:57:33.670 26192 26192 F DEBUG : pid: 12736, tid: 12761, name: synthetic_thread >>> synthetic_process_1 <<<
+06-15 19:57:33.670 26192 26192 F DEBUG : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0
+06-15 19:57:33.670 26192 26192 F DEBUG : r0 00000000 r1 00000000 r2 0000005f r3 00000000
+06-15 19:57:33.670 26192 26192 F DEBUG : r4 ffffffff r5 00000000 r6 f14f9000 r7 00000001
+06-15 19:57:33.670 26192 26192 F DEBUG : r8 00000004 r9 f3353114 sl f3313900 fp 00000000
+06-15 19:57:33.670 26192 26192 F DEBUG : ip f3bd4d88 sp f127d9c8 lr f3b9cbc5 pc f3b65af4 cpsr 60000030
+06-15 19:57:33.676 26192 26192 F DEBUG :
+06-15 19:57:33.676 26192 26192 F DEBUG : backtrace:
+06-15 19:57:33.677 26192 26192 F DEBUG : #00 pc 00018af4 /system/lib/libc.so (strlen+71)
+06-15 19:57:33.677 26192 26192 F DEBUG : #01 pc 0004fbc1 /system/lib/libc.so (__strlen_chk+4)
+06-15 19:57:33.677 26192 26192 F DEBUG : #02 pc 0000c599 /system/lib/libutils.so (_ZN7android7String8C2EPKc+12)
+06-15 19:57:33.677 26192 26192 F DEBUG : #03 pc 0002fdbf /system/lib/libaudiopolicymanagerdefault.so (_ZNK7android18HwModuleCollection19getDeviceDescriptorEjPKcS2_b+458)
+06-15 19:57:33.677 26192 26192 F DEBUG : #04 pc 0001de47 /system/lib/libaudiopolicymanagerdefault.so (_ZN7android18AudioPolicyManager27setDeviceConnectionStateIntEj24audio_policy_dev_state_tPKcS3_+178)
+06-15 19:57:33.677 26192 26192 F DEBUG : #05 pc 0000a009 /system/lib/libaudiopolicyservice.so
+06-15 19:57:33.677 26192 26192 F DEBUG : #06 pc 000a01a5 /system/lib/libmedia.so (_ZN7android20BnAudioPolicyService10onTransactEjRKNS_6ParcelEPS1_j+1256)
+06-15 19:57:33.677 26192 26192 F DEBUG : #07 pc 000359c3 /system/lib/libbinder.so (_ZN7android7BBinder8transactEjRKNS_6ParcelEPS1_j+70)
+06-15 19:57:33.677 26192 26192 F DEBUG : #08 pc 0003d1bb /system/lib/libbinder.so (_ZN7android14IPCThreadState14executeCommandEi+702)
+06-15 19:57:33.677 26192 26192 F DEBUG : #09 pc 0003ce07 /system/lib/libbinder.so (_ZN7android14IPCThreadState20getAndExecuteCommandEv+114)
+06-15 19:57:33.677 26192 26192 F DEBUG : #10 pc 0003d31b /system/lib/libbinder.so (_ZN7android14IPCThreadState14joinThreadPoolEb+46)
+06-15 19:57:33.678 26192 26192 F DEBUG : #11 pc 0004f8c5 /system/lib/libbinder.so
+06-15 19:57:33.678 26192 26192 F DEBUG : #12 pc 0000e345 /system/lib/libutils.so (_ZN7android6Thread11_threadLoopEPv+140)
+06-15 19:57:33.678 26192 26192 F DEBUG : #13 pc 000470b3 /system/lib/libc.so (_ZL15__pthread_startPv+22)
+06-15 19:57:33.678 26192 26192 F DEBUG : #14 pc 00019e3d /system/lib/libc.so (__start_thread+6)
+06-15 19:57:33.839 934 2991 W NativeCrashListener: Couldn't find ProcessRecord for pid 12736
+06-15 19:57:33.846 934 952 I BootReceiver: Copying /data/tombstones/tombstone_01 to DropBox (SYSTEM_TOMBSTONE)
+
diff --git a/common/util/tests/src/com/android/compatibility/common/util/CrashUtilsTest.java b/common/util/tests/src/com/android/compatibility/common/util/CrashUtilsTest.java
index 94f472e..2138b7b 100644
--- a/common/util/tests/src/com/android/compatibility/common/util/CrashUtilsTest.java
+++ b/common/util/tests/src/com/android/compatibility/common/util/CrashUtilsTest.java
@@ -27,6 +27,7 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
+import java.util.regex.Pattern;
/** Unit tests for {@link CrashUtils}. */
@RunWith(JUnit4.class)
@@ -52,67 +53,89 @@
@Test
public void testGetAllCrashes() throws Exception {
JSONArray expectedResults = new JSONArray();
- expectedResults.put(createCrashJson(11071, 11189, "AudioOut_D", 3912761344L, "SIGSEGV"));
- expectedResults.put(createCrashJson(12736, 12761, "Binder:12736_2", 0L, "SIGSEGV"));
- expectedResults.put(createCrashJson(26201, 26227, "Binder:26201_3", 0L, "SIGSEGV"));
- expectedResults.put(createCrashJson(26246, 26282, "Binder:26246_5", 0L, "SIGSEGV"));
- expectedResults.put(createCrashJson(245, 245, "installd", null, "SIGABRT"));
- expectedResults.put(createCrashJson(6371, 8072, "media.codec", 3976200192L, "SIGSEGV"));
- expectedResults.put(createCrashJson(8373, 8414, "loo", null, "SIGABRT"));
+ expectedResults.put(createCrashJson(
+ 11071, 11189, "AudioOut_D", "/system/bin/audioserver", "e9380000", "SIGSEGV"));
+ expectedResults.put(createCrashJson(
+ 12736, 12761, "Binder:12736_2", "/system/bin/audioserver", "0", "SIGSEGV"));
+ expectedResults.put(createCrashJson(
+ 26201, 26227, "Binder:26201_3", "/system/bin/audioserver", "0", "SIGSEGV"));
+ expectedResults.put(createCrashJson(
+ 26246, 26282, "Binder:26246_5", "/system/bin/audioserver", "0", "SIGSEGV"));
+ expectedResults.put(createCrashJson(
+ 245, 245, "installd", "/system/bin/installd", null, "SIGABRT"));
+ expectedResults.put(createCrashJson(
+ 6371, 8072, "media.codec", "omx@1.0-service", "ed000000", "SIGSEGV"));
+ expectedResults.put(createCrashJson(
+ 8373, 8414, "loo", "com.android.bluetooth", null, "SIGABRT"));
+ expectedResults.put(createCrashJson(
+ 11071, 11189, "synthetic_thread", "synthetic_process_0", "e9380000", "SIGSEGV"));
+ expectedResults.put(createCrashJson(
+ 12736, 12761, "synthetic_thread", "synthetic_process_1", "0", "SIGSEGV"));
Assert.assertEquals(mCrashes.toString(), expectedResults.toString());
}
public JSONObject createCrashJson(
- int pid, int tid, String name, Long faultaddress, String signal) {
+ int pid, int tid, String name, String process, String faultaddress, String signal) {
JSONObject json = new JSONObject();
try {
json.put(CrashUtils.PID, pid);
json.put(CrashUtils.TID, tid);
json.put(CrashUtils.NAME, name);
+ json.put(CrashUtils.PROCESS, process);
json.put(CrashUtils.FAULT_ADDRESS, faultaddress);
json.put(CrashUtils.SIGNAL, signal);
- } catch (JSONException e) {
-
- }
+ } catch (JSONException e) {}
return json;
}
@Test
public void testValidCrash() throws Exception {
- Assert.assertTrue(CrashUtils.detectCrash(new String[] {"AudioOut_D"}, true, mCrashes));
+ Assert.assertTrue(CrashUtils.securityCrashDetected(mCrashes, true,
+ Pattern.compile("synthetic_process_0")));
}
@Test
public void testMissingName() throws Exception {
- Assert.assertFalse(CrashUtils.detectCrash(new String[] {""}, true, mCrashes));
+ Assert.assertFalse(CrashUtils.securityCrashDetected(mCrashes, true,
+ Pattern.compile("")));
}
@Test
public void testSIGABRT() throws Exception {
- Assert.assertFalse(CrashUtils.detectCrash(new String[] {"installd"}, true, mCrashes));
+ Assert.assertFalse(CrashUtils.securityCrashDetected(mCrashes, true,
+ Pattern.compile("installd")));
}
@Test
public void testFaultAddressBelowMin() throws Exception {
- Assert.assertFalse(CrashUtils.detectCrash(new String[] {"Binder:12736_2"}, true, mCrashes));
+ Assert.assertFalse(CrashUtils.securityCrashDetected(mCrashes, true,
+ Pattern.compile("synthetic_process_1")));
}
@Test
public void testIgnoreMinAddressCheck() throws Exception {
- Assert.assertTrue(CrashUtils.detectCrash(new String[] {"Binder:12736_2"}, false, mCrashes));
+ Assert.assertTrue(CrashUtils.securityCrashDetected(mCrashes, false,
+ Pattern.compile("synthetic_process_1")));
+ }
+
+ @Test
+ public void testBadAbortMessage() throws Exception {
+ Assert.assertFalse(CrashUtils.securityCrashDetected(mCrashes, true,
+ Pattern.compile("generic")));
}
@Test
public void testGoodAndBadCrashes() throws Exception {
- Assert.assertTrue(
- CrashUtils.detectCrash(new String[] {"AudioOut_D", "generic"}, true, mCrashes));
+ Assert.assertTrue(CrashUtils.securityCrashDetected(mCrashes, true,
+ Pattern.compile("synthetic_process_0"), Pattern.compile("generic")));
}
@Test
public void testNullFaultAddress() throws Exception {
JSONArray crashes = new JSONArray();
- crashes.put(createCrashJson(8373, 8414, "loo", null, "SIGSEGV"));
- Assert.assertTrue(CrashUtils.detectCrash(new String[] {"loo"}, true, crashes));
+ crashes.put(createCrashJson(8373, 8414, "loo", "com.android.bluetooth", null, "SIGSEGV"));
+ Assert.assertTrue(CrashUtils.securityCrashDetected(crashes, true,
+ Pattern.compile("com\\.android\\.bluetooth")));
}
}
diff --git a/hostsidetests/incident/src/com/android/server/cts/BatteryStatsValidationTest.java b/hostsidetests/incident/src/com/android/server/cts/BatteryStatsValidationTest.java
index 8a82416..1fcbf91 100644
--- a/hostsidetests/incident/src/com/android/server/cts/BatteryStatsValidationTest.java
+++ b/hostsidetests/incident/src/com/android/server/cts/BatteryStatsValidationTest.java
@@ -58,9 +58,9 @@
private static final int STATE_TIME_CACHED_INDEX = 9;
private static final long TIME_SPENT_IN_TOP = 2000;
- private static final long TIME_SPENT_IN_FOREGROUND = 2000;
+ private static final long TIME_SPENT_IN_FOREGROUND = 4000;
private static final long TIME_SPENT_IN_BACKGROUND = 2000;
- private static final long TIME_SPENT_IN_CACHED = 2000;
+ private static final long TIME_SPENT_IN_CACHED = 4000;
private static final long SCREEN_STATE_CHANGE_TIMEOUT = 4000;
private static final long SCREEN_STATE_POLLING_INTERVAL = 500;
diff --git a/hostsidetests/services/activityandwindowmanager/windowmanager/frametestapp/src/android/server/frametestapp/DialogTestActivity.java b/hostsidetests/services/activityandwindowmanager/windowmanager/frametestapp/src/android/server/frametestapp/DialogTestActivity.java
index 54ee34c..cb86b5e 100644
--- a/hostsidetests/services/activityandwindowmanager/windowmanager/frametestapp/src/android/server/frametestapp/DialogTestActivity.java
+++ b/hostsidetests/services/activityandwindowmanager/windowmanager/frametestapp/src/android/server/frametestapp/DialogTestActivity.java
@@ -208,6 +208,6 @@
private int getSize() {
float density = getResources().getDisplayMetrics().density;
- return (int)(200 * density);
+ return density > 1.0 ? 200 : (int)(200 * density);
}
}
diff --git a/hostsidetests/services/activityandwindowmanager/windowmanager/src/android/server/cts/DialogFrameTests.java b/hostsidetests/services/activityandwindowmanager/windowmanager/src/android/server/cts/DialogFrameTests.java
index 125bcb3..0b28fd7 100644
--- a/hostsidetests/services/activityandwindowmanager/windowmanager/src/android/server/cts/DialogFrameTests.java
+++ b/hostsidetests/services/activityandwindowmanager/windowmanager/src/android/server/cts/DialogFrameTests.java
@@ -216,7 +216,7 @@
int size = explicitDimension;
try {
float density = getDensity();
- size = (int)(explicitDimension * density);
+ size = density > 1.0 ? explicitDimension : (int)(explicitDimension * density);
} catch (DeviceNotAvailableException e) {
}
return size;
diff --git a/hostsidetests/theme/src/android/theme/cts/ThemeHostTest.java b/hostsidetests/theme/src/android/theme/cts/ThemeHostTest.java
index 169e651..d549e03 100644
--- a/hostsidetests/theme/src/android/theme/cts/ThemeHostTest.java
+++ b/hostsidetests/theme/src/android/theme/cts/ThemeHostTest.java
@@ -146,7 +146,7 @@
@CddTest(requirement="3.8.6/C-1-1,C-1-2")
public void testThemes() throws Exception {
if (checkHardwareTypeSkipTest(mDevice.executeShellCommand(HARDWARE_TYPE_CMD).trim())) {
- Log.logAndDisplay(LogLevel.INFO, LOG_TAG, "Skipped themes test for watch / TV");
+ Log.logAndDisplay(LogLevel.INFO, LOG_TAG, "Skipped themes test for watch / TV / automotive");
return;
}
@@ -290,6 +290,7 @@
private static boolean checkHardwareTypeSkipTest(String hardwareTypeString) {
return hardwareTypeString.contains("android.hardware.type.watch")
- || hardwareTypeString.contains("android.hardware.type.television");
+ || hardwareTypeString.contains("android.hardware.type.television")
+ || hardwareTypeString.contains("android.hardware.type.automotive");
}
}
diff --git a/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityMagnificationTest.java b/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityMagnificationTest.java
index 1abb2ab..dc4a1c9 100644
--- a/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityMagnificationTest.java
+++ b/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityMagnificationTest.java
@@ -22,6 +22,7 @@
import android.app.Instrumentation;
import android.content.Context;
import android.content.res.Resources;
+import android.graphics.Rect;
import android.graphics.Region;
import android.provider.Settings;
import android.test.InstrumentationTestCase;
@@ -84,13 +85,11 @@
public void testSetScaleAndCenter() {
final MagnificationController controller = mService.getMagnificationController();
- final WindowManager wm = (WindowManager) mInstrumentation.getContext().getSystemService(
- Context.WINDOW_SERVICE);
- final DisplayMetrics metrics = new DisplayMetrics();
- wm.getDefaultDisplay().getRealMetrics(metrics);
+ final Region region = controller.getMagnificationRegion();
+ final Rect bounds = region.getBounds();
final float scale = 2.0f;
- final float x = metrics.widthPixels / 4.0f;
- final float y = metrics.heightPixels / 4.0f;
+ final float x = bounds.left + (bounds.width() / 4.0f);
+ final float y = bounds.top + (bounds.height() / 4.0f);
final AtomicBoolean setScale = new AtomicBoolean();
final AtomicBoolean setCenter = new AtomicBoolean();
final AtomicBoolean result = new AtomicBoolean();
diff --git a/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityTextActionTest.java b/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityTextActionTest.java
index abc759c..7252fe0 100644
--- a/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityTextActionTest.java
+++ b/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityTextActionTest.java
@@ -248,8 +248,12 @@
}
// Scroll down one line
- final float oneLineDownY = locationsBeforeScroll[0].bottom;
- getInstrumentation().runOnMainSync(() -> editText.scrollTo(0, (int) oneLineDownY + 1));
+ getInstrumentation().runOnMainSync(() -> {
+ int[] viewPosition = new int[2];
+ editText.getLocationOnScreen(viewPosition);
+ final int oneLineDownY = (int) locationsBeforeScroll[0].bottom - viewPosition[1];
+ editText.scrollTo(0, oneLineDownY + 1);
+ });
assertTrue("Refresh failed", text.refreshWithExtraData(
EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY, getTextArgs));
diff --git a/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityVolumeTest.java b/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityVolumeTest.java
index b67fc28..3b0374f 100644
--- a/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityVolumeTest.java
+++ b/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityVolumeTest.java
@@ -40,10 +40,11 @@
mInstrumentation = InstrumentationRegistry.getInstrumentation();
mAudioManager =
(AudioManager) mInstrumentation.getContext().getSystemService(AUDIO_SERVICE);
- // TVs have a single volume
+ // TVs and fixed volume devices have a single volume
PackageManager pm = mInstrumentation.getContext().getPackageManager();
mSingleVolume = (pm != null) && (pm.hasSystemFeature(PackageManager.FEATURE_LEANBACK)
- || pm.hasSystemFeature(PackageManager.FEATURE_TELEVISION));
+ || pm.hasSystemFeature(PackageManager.FEATURE_TELEVISION))
+ || mAudioManager.isVolumeFixed();
}
@Test
diff --git a/tests/camera/src/android/hardware/camera2/cts/RobustnessTest.java b/tests/camera/src/android/hardware/camera2/cts/RobustnessTest.java
index 24cb6bd..5eed3e8 100644
--- a/tests/camera/src/android/hardware/camera2/cts/RobustnessTest.java
+++ b/tests/camera/src/android/hardware/camera2/cts/RobustnessTest.java
@@ -61,7 +61,7 @@
private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE);
private static final int CONFIGURE_TIMEOUT = 5000; //ms
- private static final int CAPTURE_TIMEOUT = 1000; //ms
+ private static final int CAPTURE_TIMEOUT = 1500; //ms
// For testTriggerInteractions
private static final int PREVIEW_WARMUP_FRAMES = 60;
diff --git a/tests/tests/dpi/src/android/dpi/cts/ConfigurationTest.java b/tests/tests/dpi/src/android/dpi/cts/ConfigurationTest.java
index 0b33f50..e79d10f 100644
--- a/tests/tests/dpi/src/android/dpi/cts/ConfigurationTest.java
+++ b/tests/tests/dpi/src/android/dpi/cts/ConfigurationTest.java
@@ -41,7 +41,7 @@
(WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
Display display = windowManager.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
- display.getMetrics(metrics);
+ display.getRealMetrics(metrics);
double xInches = (double) metrics.widthPixels / metrics.xdpi;
double yInches = (double) metrics.heightPixels / metrics.ydpi;
diff --git a/tests/tests/media/assets/audio_only/00.aac b/tests/tests/media/assets/audio_only/00.aac
new file mode 100644
index 0000000..1c620bf
--- /dev/null
+++ b/tests/tests/media/assets/audio_only/00.aac
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/00.key b/tests/tests/media/assets/audio_only/00.key
new file mode 100644
index 0000000..eb61918
--- /dev/null
+++ b/tests/tests/media/assets/audio_only/00.key
@@ -0,0 +1 @@
+ëÝ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
new file mode 100644
index 0000000..dc23c48
--- /dev/null
+++ b/tests/tests/media/assets/audio_only/01.aac
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/02.aac b/tests/tests/media/assets/audio_only/02.aac
new file mode 100644
index 0000000..1dd827d
--- /dev/null
+++ b/tests/tests/media/assets/audio_only/02.aac
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/03.aac b/tests/tests/media/assets/audio_only/03.aac
new file mode 100644
index 0000000..f6fd0c0
--- /dev/null
+++ b/tests/tests/media/assets/audio_only/03.aac
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/04.aac b/tests/tests/media/assets/audio_only/04.aac
new file mode 100644
index 0000000..60d0aef
--- /dev/null
+++ b/tests/tests/media/assets/audio_only/04.aac
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/05.aac b/tests/tests/media/assets/audio_only/05.aac
new file mode 100644
index 0000000..2875292
--- /dev/null
+++ b/tests/tests/media/assets/audio_only/05.aac
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/06.aac b/tests/tests/media/assets/audio_only/06.aac
new file mode 100644
index 0000000..dd0413f
--- /dev/null
+++ b/tests/tests/media/assets/audio_only/06.aac
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/07.aac b/tests/tests/media/assets/audio_only/07.aac
new file mode 100644
index 0000000..5d63cef
--- /dev/null
+++ b/tests/tests/media/assets/audio_only/07.aac
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/08.aac b/tests/tests/media/assets/audio_only/08.aac
new file mode 100644
index 0000000..402cd72
--- /dev/null
+++ b/tests/tests/media/assets/audio_only/08.aac
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/09.aac b/tests/tests/media/assets/audio_only/09.aac
new file mode 100644
index 0000000..587b910
--- /dev/null
+++ b/tests/tests/media/assets/audio_only/09.aac
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/10.aac b/tests/tests/media/assets/audio_only/10.aac
new file mode 100644
index 0000000..db8c5b8
--- /dev/null
+++ b/tests/tests/media/assets/audio_only/10.aac
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/11.aac b/tests/tests/media/assets/audio_only/11.aac
new file mode 100644
index 0000000..707dd38
--- /dev/null
+++ b/tests/tests/media/assets/audio_only/11.aac
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/12.aac b/tests/tests/media/assets/audio_only/12.aac
new file mode 100644
index 0000000..5ebe080
--- /dev/null
+++ b/tests/tests/media/assets/audio_only/12.aac
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/index.m3u8 b/tests/tests/media/assets/audio_only/index.m3u8
new file mode 100644
index 0000000..fedfafa
--- /dev/null
+++ b/tests/tests/media/assets/audio_only/index.m3u8
@@ -0,0 +1,31 @@
+#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/hls_variant/165340/00.ts b/tests/tests/media/assets/hls_variant/165340/00.ts
new file mode 100644
index 0000000..8a95fc5
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/00.ts
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
new file mode 100644
index 0000000..7983a01
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/01.ts
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
new file mode 100644
index 0000000..2582937
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/02.ts
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
new file mode 100644
index 0000000..4e4711e
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/03.ts
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
new file mode 100644
index 0000000..e210aac
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/04.ts
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
new file mode 100644
index 0000000..5d445bf
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/05.ts
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
new file mode 100644
index 0000000..e83d2a3
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/06.ts
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
new file mode 100644
index 0000000..37322c0
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/07.ts
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
new file mode 100644
index 0000000..25f9f00
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/08.ts
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
new file mode 100644
index 0000000..2debe48
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/09.ts
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
new file mode 100644
index 0000000..3eed736
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/10.ts
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
new file mode 100644
index 0000000..7ae79e9
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/11.ts
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
new file mode 100644
index 0000000..4153626
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/12.ts
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
new file mode 100644
index 0000000..027adf4
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/13.ts
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
new file mode 100644
index 0000000..ea7d0be
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/14.ts
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
new file mode 100644
index 0000000..48c92c9
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/15.ts
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
new file mode 100644
index 0000000..19f0ebd
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/16.ts
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
new file mode 100644
index 0000000..7d4897d
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/17.ts
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
new file mode 100644
index 0000000..47431d0
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/18.ts
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
new file mode 100644
index 0000000..9e98a4f
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/19.ts
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
new file mode 100644
index 0000000..e674296
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/20.ts
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
new file mode 100644
index 0000000..2affe9d
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/21.ts
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
new file mode 100644
index 0000000..0634296
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/22.ts
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
new file mode 100644
index 0000000..faf9ca8
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/23.ts
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
new file mode 100644
index 0000000..3b3f4d7
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/24.ts
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
new file mode 100644
index 0000000..f36f33d
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/165340/index.m3u8
@@ -0,0 +1,53 @@
+#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
new file mode 100644
index 0000000..aba6f79
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/00.ts
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
new file mode 100644
index 0000000..18c382b
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/01.ts
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
new file mode 100644
index 0000000..8b45649
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/02.ts
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
new file mode 100644
index 0000000..5a1dee6
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/03.ts
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
new file mode 100644
index 0000000..69c4dfa
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/04.ts
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
new file mode 100644
index 0000000..bd1e938
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/05.ts
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
new file mode 100644
index 0000000..dfdfe31
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/06.ts
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
new file mode 100644
index 0000000..be22e90
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/07.ts
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
new file mode 100644
index 0000000..a892318
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/08.ts
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
new file mode 100644
index 0000000..9a1e3c9
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/09.ts
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
new file mode 100644
index 0000000..528e424
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/10.ts
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
new file mode 100644
index 0000000..2ad52f9
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/11.ts
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
new file mode 100644
index 0000000..5275b47
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/12.ts
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
new file mode 100644
index 0000000..5894d31
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/13.ts
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
new file mode 100644
index 0000000..44f5200
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/14.ts
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
new file mode 100644
index 0000000..e548fb1
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/15.ts
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
new file mode 100644
index 0000000..9ad2c6a
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/16.ts
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
new file mode 100644
index 0000000..1cd735f
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/17.ts
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
new file mode 100644
index 0000000..a593dba
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/18.ts
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
new file mode 100644
index 0000000..3fb49cb
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/19.ts
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
new file mode 100644
index 0000000..7a586e7
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/20.ts
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
new file mode 100644
index 0000000..bd70554
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/21.ts
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
new file mode 100644
index 0000000..12ea80d
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/22.ts
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
new file mode 100644
index 0000000..c1b5be9
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/23.ts
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
new file mode 100644
index 0000000..76bd0b5
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/24.ts
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
new file mode 100644
index 0000000..f36f33d
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/1676816/index.m3u8
@@ -0,0 +1,53 @@
+#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
new file mode 100644
index 0000000..e26ad20
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/00.ts
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
new file mode 100644
index 0000000..fa5395d
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/01.ts
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
new file mode 100644
index 0000000..a924b05
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/02.ts
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
new file mode 100644
index 0000000..4136491
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/03.ts
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
new file mode 100644
index 0000000..cf03032
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/04.ts
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
new file mode 100644
index 0000000..25d127b
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/05.ts
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
new file mode 100644
index 0000000..f132be4
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/06.ts
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
new file mode 100644
index 0000000..b1e7f36
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/07.ts
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
new file mode 100644
index 0000000..bbeb4fd
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/08.ts
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
new file mode 100644
index 0000000..f444ab9
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/09.ts
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
new file mode 100644
index 0000000..910dd43
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/10.ts
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
new file mode 100644
index 0000000..892a6b3
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/11.ts
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
new file mode 100644
index 0000000..2a8bfeb
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/12.ts
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
new file mode 100644
index 0000000..bf9f1a4
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/13.ts
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
new file mode 100644
index 0000000..45c604c
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/14.ts
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
new file mode 100644
index 0000000..4d5de4f
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/15.ts
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
new file mode 100644
index 0000000..9551838
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/16.ts
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
new file mode 100644
index 0000000..dde4452
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/17.ts
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
new file mode 100644
index 0000000..c7b3919
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/18.ts
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
new file mode 100644
index 0000000..5aa3c84
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/19.ts
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
new file mode 100644
index 0000000..0d509bb
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/20.ts
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
new file mode 100644
index 0000000..252a953
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/21.ts
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
new file mode 100644
index 0000000..7098fdd
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/22.ts
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
new file mode 100644
index 0000000..69bd886
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/23.ts
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
new file mode 100644
index 0000000..0542cc2
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/24.ts
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
new file mode 100644
index 0000000..f36f33d
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/344388/index.m3u8
@@ -0,0 +1,53 @@
+#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
new file mode 100644
index 0000000..c7233c2
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/00.ts
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
new file mode 100644
index 0000000..4d092dd
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/01.ts
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
new file mode 100644
index 0000000..5b0322e
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/02.ts
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
new file mode 100644
index 0000000..5081ef0
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/03.ts
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
new file mode 100644
index 0000000..0f6f0fe
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/04.ts
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
new file mode 100644
index 0000000..e455dec
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/05.ts
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
new file mode 100644
index 0000000..14afcb9d
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/06.ts
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
new file mode 100644
index 0000000..6f23d02
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/07.ts
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
new file mode 100644
index 0000000..a3d8dfd
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/08.ts
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
new file mode 100644
index 0000000..87d6de1
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/09.ts
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
new file mode 100644
index 0000000..04ab37a
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/10.ts
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
new file mode 100644
index 0000000..1fa238b
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/11.ts
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
new file mode 100644
index 0000000..445b0b9
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/12.ts
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
new file mode 100644
index 0000000..6bcd81b
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/13.ts
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
new file mode 100644
index 0000000..f3f8e78
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/14.ts
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
new file mode 100644
index 0000000..6b12e72
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/15.ts
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
new file mode 100644
index 0000000..d95eeba
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/16.ts
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
new file mode 100644
index 0000000..141ae44
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/17.ts
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
new file mode 100644
index 0000000..fc52f1d
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/18.ts
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
new file mode 100644
index 0000000..077db9b
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/19.ts
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
new file mode 100644
index 0000000..4ffb301
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/20.ts
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
new file mode 100644
index 0000000..6072368
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/21.ts
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
new file mode 100644
index 0000000..5edc055
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/22.ts
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
new file mode 100644
index 0000000..7870e39
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/23.ts
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
new file mode 100644
index 0000000..f4fc858
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/24.ts
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
new file mode 100644
index 0000000..f36f33d
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/387360/index.m3u8
@@ -0,0 +1,53 @@
+#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
new file mode 100644
index 0000000..c544131
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/00.ts
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
new file mode 100644
index 0000000..11adb7a
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/01.ts
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
new file mode 100644
index 0000000..d5300f4
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/02.ts
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
new file mode 100644
index 0000000..8a3ce79
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/03.ts
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
new file mode 100644
index 0000000..94b1ced
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/04.ts
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
new file mode 100644
index 0000000..d44d4a6
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/05.ts
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
new file mode 100644
index 0000000..52455dd
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/06.ts
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
new file mode 100644
index 0000000..cea2858
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/07.ts
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
new file mode 100644
index 0000000..79a1ef1
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/08.ts
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
new file mode 100644
index 0000000..6e987f2
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/09.ts
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
new file mode 100644
index 0000000..c5f1af4
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/10.ts
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
new file mode 100644
index 0000000..1a96c19
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/11.ts
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
new file mode 100644
index 0000000..b6095bb
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/12.ts
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
new file mode 100644
index 0000000..b91b740
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/13.ts
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
new file mode 100644
index 0000000..d033f16
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/14.ts
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
new file mode 100644
index 0000000..f294842
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/15.ts
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
new file mode 100644
index 0000000..15a9e9e
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/16.ts
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
new file mode 100644
index 0000000..e024ce0
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/17.ts
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
new file mode 100644
index 0000000..9e7fea2
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/18.ts
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
new file mode 100644
index 0000000..4bb80bf
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/19.ts
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
new file mode 100644
index 0000000..591fda9
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/20.ts
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
new file mode 100644
index 0000000..a3cab10
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/21.ts
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
new file mode 100644
index 0000000..c60c3f8
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/22.ts
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
new file mode 100644
index 0000000..e60a254
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/23.ts
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
new file mode 100644
index 0000000..bc75f31
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/24.ts
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
new file mode 100644
index 0000000..f36f33d
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/765178/index.m3u8
@@ -0,0 +1,53 @@
+#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
new file mode 100644
index 0000000..2e94f5d
--- /dev/null
+++ b/tests/tests/media/assets/hls_variant/index.m3u8
@@ -0,0 +1,12 @@
+#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/unmuxed_1000k/00.ts b/tests/tests/media/assets/unmuxed_1000k/00.ts
new file mode 100644
index 0000000..ac6a7a0
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1000k/00.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1000k/01.key b/tests/tests/media/assets/unmuxed_1000k/01.key
new file mode 100644
index 0000000..a5207e8
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1000k/01.key
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1000k/01.ts b/tests/tests/media/assets/unmuxed_1000k/01.ts
new file mode 100644
index 0000000..14ac277
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1000k/01.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1000k/02.ts b/tests/tests/media/assets/unmuxed_1000k/02.ts
new file mode 100644
index 0000000..3810424
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1000k/02.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1000k/03.ts b/tests/tests/media/assets/unmuxed_1000k/03.ts
new file mode 100644
index 0000000..4c6da90
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1000k/03.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1000k/04.ts b/tests/tests/media/assets/unmuxed_1000k/04.ts
new file mode 100644
index 0000000..666a849
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1000k/04.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1000k/05.ts b/tests/tests/media/assets/unmuxed_1000k/05.ts
new file mode 100644
index 0000000..af09b5f
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1000k/05.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1000k/06.ts b/tests/tests/media/assets/unmuxed_1000k/06.ts
new file mode 100644
index 0000000..09cdd5b
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1000k/06.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1000k/07.ts b/tests/tests/media/assets/unmuxed_1000k/07.ts
new file mode 100644
index 0000000..562769d
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1000k/07.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1000k/08.ts b/tests/tests/media/assets/unmuxed_1000k/08.ts
new file mode 100644
index 0000000..a70bc37
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1000k/08.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1000k/09.ts b/tests/tests/media/assets/unmuxed_1000k/09.ts
new file mode 100644
index 0000000..fadc56d
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1000k/09.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1000k/10.ts b/tests/tests/media/assets/unmuxed_1000k/10.ts
new file mode 100644
index 0000000..c22f7d0
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1000k/10.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1000k/11.ts b/tests/tests/media/assets/unmuxed_1000k/11.ts
new file mode 100644
index 0000000..4716332
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1000k/11.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1000k/12.ts b/tests/tests/media/assets/unmuxed_1000k/12.ts
new file mode 100644
index 0000000..f9a30ce
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1000k/12.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1000k/index.m3u8 b/tests/tests/media/assets/unmuxed_1000k/index.m3u8
new file mode 100644
index 0000000..2746ec0
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1000k/index.m3u8
@@ -0,0 +1,31 @@
+#EXTM3U
+#EXT-X-VERSION:6
+#EXT-X-TARGETDURATION:12
+#EXT-X-PLAYLIST-TYPE:VOD
+#EXTINF:12,
+00.ts
+#EXT-X-KEY:METHOD=SAMPLE-AES,URI="01.key",IV=0x6F27287F6FF6B10A45F9033697703E26,KEYFORMAT="identity"
+#EXT-X-DISCONTINUITY
+#EXTINF:9,
+01.ts
+#EXTINF:9,
+02.ts
+#EXTINF:12,
+03.ts
+#EXTINF:9,
+04.ts
+#EXTINF:9,
+05.ts
+#EXTINF:12,
+06.ts
+#EXTINF:9,
+07.ts
+#EXTINF:9,
+08.ts
+#EXTINF:12,
+09.ts
+#EXTINF:9,
+10.ts
+#EXTINF:9,
+11.ts
+#EXT-X-ENDLIST
\ No newline at end of file
diff --git a/tests/tests/media/assets/unmuxed_1500k/00.key b/tests/tests/media/assets/unmuxed_1500k/00.key
new file mode 100644
index 0000000..eb61918
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1500k/00.key
@@ -0,0 +1 @@
+ëÝ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
new file mode 100644
index 0000000..9891dc6
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1500k/00.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/01.ts b/tests/tests/media/assets/unmuxed_1500k/01.ts
new file mode 100644
index 0000000..d374565
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1500k/01.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/02.ts b/tests/tests/media/assets/unmuxed_1500k/02.ts
new file mode 100644
index 0000000..6a6fbdb
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1500k/02.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/03.ts b/tests/tests/media/assets/unmuxed_1500k/03.ts
new file mode 100644
index 0000000..cba18a5
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1500k/03.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/04.ts b/tests/tests/media/assets/unmuxed_1500k/04.ts
new file mode 100644
index 0000000..bed2e63
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1500k/04.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/05.ts b/tests/tests/media/assets/unmuxed_1500k/05.ts
new file mode 100644
index 0000000..35504ca
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1500k/05.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/06.ts b/tests/tests/media/assets/unmuxed_1500k/06.ts
new file mode 100644
index 0000000..8456a79
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1500k/06.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/07.ts b/tests/tests/media/assets/unmuxed_1500k/07.ts
new file mode 100644
index 0000000..e19ec6b
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1500k/07.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/08.ts b/tests/tests/media/assets/unmuxed_1500k/08.ts
new file mode 100644
index 0000000..9a695cd
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1500k/08.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/09.ts b/tests/tests/media/assets/unmuxed_1500k/09.ts
new file mode 100644
index 0000000..eecdb09
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1500k/09.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/10.ts b/tests/tests/media/assets/unmuxed_1500k/10.ts
new file mode 100644
index 0000000..ce1383a
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1500k/10.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/11.ts b/tests/tests/media/assets/unmuxed_1500k/11.ts
new file mode 100644
index 0000000..99a9ba2
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1500k/11.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/12.ts b/tests/tests/media/assets/unmuxed_1500k/12.ts
new file mode 100644
index 0000000..e63f897
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1500k/12.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/13.ts b/tests/tests/media/assets/unmuxed_1500k/13.ts
new file mode 100644
index 0000000..50010e2
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1500k/13.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/14.ts b/tests/tests/media/assets/unmuxed_1500k/14.ts
new file mode 100644
index 0000000..8667a91
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1500k/14.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/15.ts b/tests/tests/media/assets/unmuxed_1500k/15.ts
new file mode 100644
index 0000000..124b1b5
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1500k/15.ts
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/index.m3u8 b/tests/tests/media/assets/unmuxed_1500k/index.m3u8
new file mode 100644
index 0000000..ee979a2
--- /dev/null
+++ b/tests/tests/media/assets/unmuxed_1500k/index.m3u8
@@ -0,0 +1,37 @@
+#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/src/android/media/cts/MediaPlayerTestBase.java b/tests/tests/media/src/android/media/cts/MediaPlayerTestBase.java
index ff8efc7..921db5a 100644
--- a/tests/tests/media/src/android/media/cts/MediaPlayerTestBase.java
+++ b/tests/tests/media/src/android/media/cts/MediaPlayerTestBase.java
@@ -234,6 +234,12 @@
playVideoWithRetries(uri, headers, cookies, null /* width */, null /* height */, playTime);
}
+ protected void playLiveAudioOnlyTest(
+ Uri uri, Map<String, String> headers, List<HttpCookie> cookies,
+ int playTime) throws Exception {
+ playVideoWithRetries(uri, headers, cookies, -1 /* width */, -1 /* height */, playTime);
+ }
+
protected void playVideoWithRetries(
Uri uri, Map<String, String> headers, List<HttpCookie> cookies,
Integer width, Integer height, int playTime) throws Exception {
diff --git a/tests/tests/media/src/android/media/cts/StreamingMediaPlayerTest.java b/tests/tests/media/src/android/media/cts/StreamingMediaPlayerTest.java
index b981a0b..80ec789 100644
--- a/tests/tests/media/src/android/media/cts/StreamingMediaPlayerTest.java
+++ b/tests/tests/media/src/android/media/cts/StreamingMediaPlayerTest.java
@@ -37,15 +37,23 @@
import com.android.compatibility.common.util.MediaUtils;
import java.io.IOException;
+import java.io.InterruptedIOException;
import java.net.HttpCookie;
+import java.net.Socket;
import java.util.concurrent.atomic.AtomicInteger;
+import org.apache.http.impl.DefaultHttpServerConnection;
+import org.apache.http.impl.io.SocketOutputBuffer;
+import org.apache.http.io.SessionOutputBuffer;
+import org.apache.http.params.HttpParams;
import java.util.HashMap;
import java.util.List;
+import java.util.Map;
/**
* Tests of MediaPlayer streaming capabilities.
*/
public class StreamingMediaPlayerTest extends MediaPlayerTestBase {
+
private static final String TAG = "StreamingMediaPlayerTest";
private static final String HTTP_H263_AMR_VIDEO_1_KEY =
@@ -61,6 +69,9 @@
private static final String HTTP_MPEG4_SP_AAC_VIDEO_2_KEY =
"streaming_media_player_test_http_mpeg4_sp_aac_video2";
private static final String MODULE_NAME = "CtsMediaTestCases";
+
+ private static final int LOCAL_HLS_BITS_PER_MS = 100 * 1000;
+
private DynamicConfigDeviceSide dynamicConfig;
private CtsTestServer mServer;
@@ -171,19 +182,15 @@
playVideoTest(urlString, 640, 360);
}
- // Streaming HLS video from YouTube
+ // Streaming HLS video downloaded from YouTube
public void testHLS() throws Exception {
if (!MediaUtils.checkDecoder(MediaFormat.MIMETYPE_VIDEO_AVC)) {
return; // skip
}
// Play stream for 60 seconds
- playLiveVideoTest("http://www.youtube.com/api/manifest/hls_variant/id/"
- + "0168724d02bd9945/itag/5/source/youtube/playlist_type/DVR/ip/"
- + "0.0.0.0/ipbits/0/expire/19000000000/sparams/ip,ipbits,expire"
- + ",id,itag,source,playlist_type/signature/773AB8ACC68A96E5AA48"
- + "1996AD6A1BBCB70DCB87.95733B544ACC5F01A1223A837D2CF04DF85A336"
- + "0/key/ik0/file/m3u8", 60 * 1000);
+ // limit rate to workaround multiplication overflow in framework
+ localHlsTest("hls_variant/index.m3u8", 60 * 1000, LOCAL_HLS_BITS_PER_MS, false /*isAudioOnly*/);
}
public void testHlsWithHeadersCookies() throws Exception {
@@ -191,14 +198,6 @@
return; // skip
}
- final Uri uri = Uri.parse(
- "http://www.youtube.com/api/manifest/hls_variant/id/"
- + "0168724d02bd9945/itag/5/source/youtube/playlist_type/DVR/ip/"
- + "0.0.0.0/ipbits/0/expire/19000000000/sparams/ip,ipbits,expire"
- + ",id,itag,source,playlist_type/signature/773AB8ACC68A96E5AA48"
- + "1996AD6A1BBCB70DCB87.95733B544ACC5F01A1223A837D2CF04DF85A336"
- + "0/key/ik0/file/m3u8");
-
// TODO: dummy values for headers/cookies till we find a server that actually needs them
HashMap<String, String> headers = new HashMap<>();
headers.put("header0", "value0");
@@ -218,7 +217,8 @@
cookies.add(cookie);
// Play stream for 60 seconds
- playLiveVideoTest(uri, headers, cookies, 60 * 1000);
+ // limit rate to workaround multiplication overflow in framework
+ localHlsTest("hls_variant/index.m3u8", 60 * 1000, LOCAL_HLS_BITS_PER_MS, false /*isAudioOnly*/);
}
public void testHlsSampleAes_bbb_audio_only_overridable() throws Exception {
@@ -226,16 +226,14 @@
return; // skip
}
- String defaultUrl = "http://storage.googleapis.com/wvmedia/cenc/hls/sample_aes/" +
- "bbb_1080p_30fps_11min/audio_only/prog_index.m3u8";
-
- // if url override provided
- String testUrl = (mInputUrl != null) ? mInputUrl : defaultUrl;
-
// Play stream for 60 seconds
- playLiveAudioOnlyTest(
- testUrl,
- 60 * 1000);
+ if (mInputUrl != null) {
+ // if url override provided
+ playLiveAudioOnlyTest(mInputUrl, 60 * 1000);
+ } else {
+ localHlsTest("audio_only/index.m3u8", 60 * 1000, -1, true /*isAudioOnly*/);
+ }
+
}
public void testHlsSampleAes_bbb_unmuxed_1500k() throws Exception {
@@ -255,10 +253,7 @@
// Play 1080p stream for 60 seconds if platform supports.
if (vcaps.areSizeAndRateSupported(1920 ,1080, 30)) {
- playLiveVideoTest(
- "http://storage.googleapis.com/wvmedia/cenc/hls/sample_aes/" +
- "bbb_1080p_30fps_11min/unmuxed_1500k/prog_index.m3u8",
- 60 * 1000);
+ localHlsTest("unmuxed_1500k/index.m3u8", 60 * 1000, -1, false /*isAudioOnly*/);
}
} catch (IllegalArgumentException e) {
}
@@ -272,10 +267,7 @@
}
// Play 480p stream for 60 seconds
- playLiveVideoTest(
- "https://storage.googleapis.com/wvmedia/cenc/hls/sample_aes/" +
- "bbb_480p_30fps/unmuxed_1000k/bbb_h264_main_480p_30fps_1000.m3u8",
- 60 * 1000);
+ localHlsTest("unmuxed_1000k/index.m3u8", 60 * 1000, -1, false /*isAudioOnly*/);
}
// Streaming audio from local HTTP server
@@ -493,21 +485,21 @@
if (!MediaUtils.checkDecoder(MediaFormat.MIMETYPE_VIDEO_AVC)) {
return; // skip
}
- localHlsTest("hls.m3u8", false, false);
+ localHlsTest("hls.m3u8", false, false, false /*isAudioOnly*/);
}
public void testPlayHlsStreamWithQueryString() throws Throwable {
if (!MediaUtils.checkDecoder(MediaFormat.MIMETYPE_VIDEO_AVC)) {
return; // skip
}
- localHlsTest("hls.m3u8", true, false);
+ localHlsTest("hls.m3u8", true, false, false /*isAudioOnly*/);
}
public void testPlayHlsStreamWithRedirect() throws Throwable {
if (!MediaUtils.checkDecoder(MediaFormat.MIMETYPE_VIDEO_AVC)) {
return; // skip
}
- localHlsTest("hls.m3u8", false, true);
+ localHlsTest("hls.m3u8", false, true, false /*isAudioOnly*/);
}
public void testPlayHlsStreamWithTimedId3() throws Throwable {
@@ -690,9 +682,29 @@
worker.quit();
}
- private void localHlsTest(final String name, boolean appendQueryString, boolean redirect)
- throws Throwable {
- mServer = new CtsTestServer(mContext);
+ private void localHlsTest(final String name, boolean appendQueryString,
+ boolean redirect, boolean isAudioOnly) throws Exception {
+ localHlsTest(name, null, null, appendQueryString, redirect, 10, -1, isAudioOnly);
+ }
+
+ private void localHlsTest(final String name, int playTime, int bitsPerMs, boolean isAudioOnly)
+ throws Exception {
+ localHlsTest(name, null, null, false, false, playTime, bitsPerMs, isAudioOnly);
+ }
+
+ private void localHlsTest(String name, Map<String, String> headers, List<HttpCookie> cookies,
+ boolean appendQueryString, boolean redirect, int playTime, int bitsPerMs,
+ boolean isAudioOnly) throws Exception {
+ if (bitsPerMs >= 0) {
+ mServer = new CtsTestServer(mContext) {
+ @Override
+ protected DefaultHttpServerConnection createHttpServerConnection() {
+ return new RateLimitHttpServerConnection(bitsPerMs);
+ }
+ };
+ } else {
+ mServer = new CtsTestServer(mContext);
+ }
try {
String stream_url = null;
if (redirect) {
@@ -703,10 +715,67 @@
if (appendQueryString) {
stream_url += "?foo=bar/baz";
}
-
- playLiveVideoTest(stream_url, 10);
+ if (isAudioOnly) {
+ playLiveAudioOnlyTest(Uri.parse(stream_url), headers, cookies, playTime);
+ } else {
+ playLiveVideoTest(Uri.parse(stream_url), headers, cookies, playTime);
+ }
} finally {
mServer.shutdown();
}
}
+
+ private static final class RateLimitHttpServerConnection extends DefaultHttpServerConnection {
+
+ private final int mBytesPerMs;
+ private int mBytesWritten;
+
+ public RateLimitHttpServerConnection(int bitsPerMs) {
+ mBytesPerMs = bitsPerMs / 8;
+ }
+
+ @Override
+ protected SessionOutputBuffer createHttpDataTransmitter(
+ Socket socket, int buffersize, HttpParams params) throws IOException {
+ return createSessionOutputBuffer(socket, buffersize, params);
+ }
+
+ SessionOutputBuffer createSessionOutputBuffer(
+ Socket socket, int buffersize, HttpParams params) throws IOException {
+ return new SocketOutputBuffer(socket, buffersize, params) {
+ @Override
+ public void write(int b) throws IOException {
+ write(new byte[] {(byte)b});
+ }
+
+ @Override
+ public void write(byte[] b) throws IOException {
+ write(b, 0, b.length);
+ }
+
+ @Override
+ public synchronized void write(byte[] b, int off, int len) throws IOException {
+ mBytesWritten += len;
+ if (mBytesWritten >= mBytesPerMs * 10) {
+ int r = mBytesWritten % mBytesPerMs;
+ int nano = 999999 * r / mBytesPerMs;
+ delay(mBytesWritten / mBytesPerMs, nano);
+ mBytesWritten = 0;
+ }
+ super.write(b, off, len);
+ }
+
+ private void delay(long millis, int nanos) throws IOException {
+ try {
+ Thread.sleep(millis, nanos);
+ flush();
+ } catch (InterruptedException e) {
+ throw new InterruptedIOException();
+ }
+ }
+
+ };
+ }
+ }
+
}
diff --git a/tests/tests/net/jni/NativeMultinetworkJni.c b/tests/tests/net/jni/NativeMultinetworkJni.c
index 9156504..c2dff8d 100644
--- a/tests/tests/net/jni/NativeMultinetworkJni.c
+++ b/tests/tests/net/jni/NativeMultinetworkJni.c
@@ -179,13 +179,17 @@
setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &timeo, sizeof(timeo));
// For reference see:
- // https://tools.ietf.org/html/draft-tsvwg-quic-protocol-01#section-6.1
- uint8_t quic_packet[] = {
- 0x0c, // public flags: 64bit conn ID, 8bit sequence number
+ // https://tools.ietf.org/html/draft-tsvwg-quic-protocol#section-6.1
+ uint8_t quic_packet[1200] = {
+ 0x0d, // public flags:
+ // - version present (0x01),
+ // - 64bit connection ID (0x0c),
+ // - 1 byte packet number (0x00)
0, 0, 0, 0, 0, 0, 0, 0, // 64bit connection ID
- 0x01, // sequence number
+ 0xaa, 0xda, 0xca, 0xaa, // reserved-space version number
+ 1, // 1 byte packet number
0x00, // private flags
- 0x07, // type: regular frame type "PING"
+ 0x07, // PING frame (cuz why not)
};
arc4random_buf(quic_packet + 1, 8); // random connection ID
@@ -213,7 +217,7 @@
i + 1, MAX_RETRIES, rcvd, errnum);
}
}
- if (rcvd < sent) {
+ if (rcvd < 9) {
ALOGD("QUIC UDP %s: sent=%zd but rcvd=%zd, errno=%d", kPort, sent, rcvd, errnum);
if (rcvd <= 0) {
ALOGD("Does this network block UDP port %s?", kPort);
@@ -229,8 +233,7 @@
return -EPROTO;
}
- // TODO: log, and compare to the IP address encoded in the
- // response, since this should be a public reset packet.
+ // TODO: Replace this quick 'n' dirty test with proper QUIC-capable code.
close(fd);
return 0;
diff --git a/tests/tests/security/Android.mk b/tests/tests/security/Android.mk
index b22f6c7..537a987 100644
--- a/tests/tests/security/Android.mk
+++ b/tests/tests/security/Android.mk
@@ -27,6 +27,7 @@
ctstestserver \
ctstestrunner \
compatibility-device-util \
+ compatibility-common-util-devicesidelib \
guava \
platform-test-annotations \
legacy-android-test
diff --git a/tests/tests/security/src/android/security/cts/StagefrightTest.java b/tests/tests/security/src/android/security/cts/StagefrightTest.java
index 6cc6988..72bdb3a 100644
--- a/tests/tests/security/src/android/security/cts/StagefrightTest.java
+++ b/tests/tests/security/src/android/security/cts/StagefrightTest.java
@@ -57,6 +57,7 @@
import java.util.HashMap;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
+import java.util.regex.Pattern;
import org.json.JSONArray;
import org.json.JSONException;
@@ -556,8 +557,23 @@
MediaPlayer.OnPreparedListener,
MediaPlayer.OnCompletionListener {
- private final String[] validProcessNames = {
- "mediaserver", "mediadrmserver", "media.extractor", "media.codec", "media.metrics"
+ private final Pattern[] validProcessPatterns = {
+ Pattern.compile("adsprpcd"),
+ Pattern.compile("android\\.hardware\\.cas@\\d+?\\.\\d+?-service"),
+ Pattern.compile("android\\.hardware\\.drm@\\d+?\\.\\d+?-service"),
+ Pattern.compile("android\\.hardware\\.drm@\\d+?\\.\\d+?-service\\.clearkey"),
+ Pattern.compile("android\\.hardware\\.drm@\\d+?\\.\\d+?-service\\.widevine"),
+ Pattern.compile("android\\.process\\.media"),
+ Pattern.compile("mediadrmserver"),
+ Pattern.compile("media\\.extractor"),
+ Pattern.compile("media\\.metrics"),
+ Pattern.compile("mediaserver"),
+ Pattern.compile("media\\.codec"),
+ Pattern.compile("media\\.swcodec"),
+ Pattern.compile("\\[?sdcard\\]?"), // name:/system/bin/sdcard, user:media_rw
+ // Match any vendor processes.
+ // It should only catch crashes that happen during the test.
+ Pattern.compile("vendor.*"),
};
@Override
@@ -605,7 +621,7 @@
if (crashes == null) {
Log.e(TAG, "Crash results not found for test " + getName());
return what;
- } else if (CrashUtils.detectCrash(validProcessNames, true, crashes)) {
+ } else if (CrashUtils.securityCrashDetected(crashes, true, validProcessPatterns)) {
return what;
} else {
Log.i(TAG, "Crash ignored due to no security crash found for test " +
diff --git a/tests/tests/telephony/src/android/telephony/cts/SmsUsageMonitorShortCodeTest.java b/tests/tests/telephony/src/android/telephony/cts/SmsUsageMonitorShortCodeTest.java
index 88475d1..6a36536 100644
--- a/tests/tests/telephony/src/android/telephony/cts/SmsUsageMonitorShortCodeTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/SmsUsageMonitorShortCodeTest.java
@@ -81,8 +81,8 @@
new ShortCodeTest("al", "654321", CATEGORY_NOT_SHORT_CODE),
new ShortCodeTest("am", "112", expectedReturnCode("112")),
- new ShortCodeTest("am", "101", CATEGORY_FREE_SHORT_CODE),
- new ShortCodeTest("am", "102", CATEGORY_FREE_SHORT_CODE),
+ //new ShortCodeTest("am", "101", CATEGORY_FREE_SHORT_CODE),
+ //new ShortCodeTest("am", "102", CATEGORY_FREE_SHORT_CODE),
new ShortCodeTest("am", "103", CATEGORY_FREE_SHORT_CODE),
new ShortCodeTest("am", "222", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
new ShortCodeTest("am", "1111", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
diff --git a/tests/tests/text/src/android/text/format/cts/TimeTest.java b/tests/tests/text/src/android/text/format/cts/TimeTest.java
index f43ad12..df93f34 100644
--- a/tests/tests/text/src/android/text/format/cts/TimeTest.java
+++ b/tests/tests/text/src/android/text/format/cts/TimeTest.java
@@ -2825,6 +2825,13 @@
Fields.verifyTimeEquals(expected, t);
}
+ @Test
+ public void test_bug118835133() {
+ Time t = new Time("Asia/Singapore");
+ Fields.set(t, 2018, 9, 30, 12, 48, 32, 0 /* isDst */, 0, 0, 0);
+ // With http://b/118835133 toMillis() returns -1.
+ assertEquals(1540874912000L, t.toMillis(true /* ignoreDst */));
+ }
private static void verifyNormalizeResult(boolean normalizeArgument, Time toNormalize,
Time expectedTime, long expectedTimeMillis) {
long actualTimeMillis = toNormalize.normalize(normalizeArgument /* ignore isDst */);
diff --git a/tests/tests/view/res/layout/view_layout.xml b/tests/tests/view/res/layout/view_layout.xml
index 6f886bb..fbdddc2 100644
--- a/tests/tests/view/res/layout/view_layout.xml
+++ b/tests/tests/view/res/layout/view_layout.xml
@@ -26,8 +26,8 @@
<android.view.cts.MockView
android:id="@+id/mock_view"
- android:layout_width="100dp"
- android:layout_height="75dp"/>
+ android:layout_width="75dp"
+ android:layout_height="100dp"/>
<android.view.cts.MockView
android:id="@+id/scroll_view"
diff --git a/tests/tests/view/src/android/view/cts/ViewTest.java b/tests/tests/view/src/android/view/cts/ViewTest.java
index 6625e0a..cdb2223 100644
--- a/tests/tests/view/src/android/view/cts/ViewTest.java
+++ b/tests/tests/view/src/android/view/cts/ViewTest.java
@@ -114,7 +114,9 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
+import java.util.concurrent.BlockingQueue;
import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -1822,8 +1824,8 @@
final MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
float density = view.getContext().getResources().getDisplayMetrics().density;
- int size1 = (int) (100 * density + 0.5);
- int size2 = (int) (75 * density + 0.5);
+ int size1 = (int) (75 * density + 0.5);
+ int size2 = (int) (100 * density + 0.5);
assertTrue(view.hasCalledOnMeasure());
assertEquals(size1, view.getMeasuredWidth());
@@ -2422,8 +2424,8 @@
Rect rect = new Rect();
float density = view.getContext().getResources().getDisplayMetrics().density;
- int size1 = (int) (100 * density + 0.5);
- int size2 = (int) (75 * density + 0.5);
+ int size1 = (int) (75 * density + 0.5);
+ int size2 = (int) (100 * density + 0.5);
assertTrue(view.getLocalVisibleRect(rect));
assertEquals(0, rect.left);
@@ -2776,6 +2778,92 @@
assertFalse(mockView1.hasCalledOnTouchEvent());
}
+ /**
+ * Ensure two MotionEvents are equal, for the purposes of this test only.
+ * Only compare actions, source, and times.
+ * Do not compare coordinates, because the injected event has coordinates relative to
+ * the screen, while the event received by view will be adjusted relative to the parent.
+ *
+ * Due to event batching, if two or more input events are injected / occur between two
+ * consecutive vsync's, they might end up getting combined into a single MotionEvent.
+ * It is caller's responsibility to ensure that the events were injected with a gap that's
+ * larger than time between two vsyncs, in order for this function to behave predictably.
+ *
+ * Recycle both MotionEvents.
+ */
+ private static void compareAndRecycleMotionEvents(MotionEvent event1, MotionEvent event2) {
+ if (event1 == null && event2 == null) {
+ return;
+ }
+
+ if (event1 == null) {
+ event2.recycle();
+ fail("Expected non-null event in first position");
+ }
+ if (event2 == null) {
+ event1.recycle();
+ fail("Expected non-null event in second position");
+ }
+
+ assertEquals(event1.getAction(), event2.getAction());
+ assertEquals(event1.getPointerCount(), event2.getPointerCount());
+ assertEquals(event1.getSource(), event2.getSource());
+ assertEquals(event1.getDownTime(), event2.getDownTime());
+ // If resampling occurs, the "real" (injected) events will become historical data,
+ // and resampled events will be inserted into MotionEvent and returned by the standard api.
+ // Since the injected event should contain no history, but the event received by
+ // the view might, we could distinguish them. But for simplicity, only require that
+ // the events are close in time if historical data is present.
+ if (event1.getHistorySize() == 0 && event2.getHistorySize() == 0) {
+ assertEquals(event1.getEventTime(), event2.getEventTime());
+ } else {
+ assertEquals(event1.getEventTime(), event2.getEventTime(), 20 /*delta*/);
+ }
+
+ event1.recycle();
+ event2.recycle();
+ }
+
+ @Test
+ public void testOnTouchListener() {
+ BlockingQueue<MotionEvent> events = new LinkedBlockingQueue<>();
+ class TestTouchListener implements View.OnTouchListener {
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+ events.add(MotionEvent.obtain(event));
+ return true;
+ }
+ }
+
+ // Inject some touch events
+ TestTouchListener listener = new TestTouchListener();
+ View view = mActivity.findViewById(R.id.mock_view);
+ view.setOnTouchListener(listener);
+
+ int[] xy = new int[2];
+ view.getLocationOnScreen(xy);
+
+ final int viewWidth = view.getWidth();
+ final int viewHeight = view.getHeight();
+ final float x = xy[0] + viewWidth / 2.0f;
+ final float y = xy[1] + viewHeight / 2.0f;
+
+ final long downTime = SystemClock.uptimeMillis();
+ MotionEvent downEvent =
+ MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_DOWN, x, y, 0);
+ downEvent.setSource(InputDevice.SOURCE_TOUCHSCREEN);
+ mInstrumentation.getUiAutomation().injectInputEvent(downEvent, true);
+ final long eventTime = SystemClock.uptimeMillis();
+ MotionEvent upEvent =
+ MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_UP, x, y, 0);
+ upEvent.setSource(InputDevice.SOURCE_TOUCHSCREEN);
+ mInstrumentation.getUiAutomation().injectInputEvent(upEvent, true);
+
+ compareAndRecycleMotionEvents(downEvent, events.poll());
+ compareAndRecycleMotionEvents(upEvent, events.poll());
+ assertTrue(events.isEmpty());
+ }
+
@Test
public void testInvalidate1() throws Throwable {
final MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java b/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
old mode 100644
new mode 100755
index 51e7d94..95c860e
--- a/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
@@ -1792,16 +1792,20 @@
assertEquals(
mOnUiThread.getHeight(),
mOnUiThread.getContentHeight() * mOnUiThread.getScale(),
- tolerance * mOnUiThread.getScale());
+ tolerance * Math.max(mOnUiThread.getScale(), 1.0f));
// Make pageHeight bigger than the larger dimension of the device, so the page is taller
// than viewport. Because when layout_height set to match_parent, getContentHeight() will
// give maximum value between the actual web content height and the viewport height. When
// viewport height is bigger, |extraSpace| below is not the extra space on the web page.
- // Note that we are passing physical pixels rather than CSS pixels here, since screen
- // density scale is generally greater than 1, it only makes the page content taller.
+ // Note that we are passing physical pixels rather than CSS pixels here, when screen density
+ // scale is lower than 1.0f, we need to scale it up.
DisplayMetrics metrics = mOnUiThread.getDisplayMetrics();
- final int pageHeight = Math.max(metrics.widthPixels, metrics.heightPixels);
+ final float scaleFactor = Math.max(1.0f, 1.0f / mOnUiThread.getScale());
+ final int pageHeight =
+ (int)(Math.ceil(Math.max(metrics.widthPixels, metrics.heightPixels)
+ * scaleFactor));
+
// set the margin to 0
final String p = "<p style=\"height:" + pageHeight
+ "px;margin:0px auto;\">Get the height of HTML content.</p>";
diff --git a/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java b/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java
index c25c620..2c483d7 100755
--- a/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java
+++ b/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java
@@ -635,6 +635,7 @@
public void testShowAtLocation() throws Throwable {
int[] popupContentViewInWindowXY = new int[2];
int[] popupContentViewOnScreenXY = new int[2];
+ Rect containingRect = new Rect();
mPopupWindow = createPopupWindow(createPopupContent(CONTENT_SIZE_DP, CONTENT_SIZE_DP));
// Do not attach within the decor; we will be measuring location
@@ -658,11 +659,12 @@
assertTrue(mPopupWindow.isShowing());
mPopupWindow.getContentView().getLocationInWindow(popupContentViewInWindowXY);
mPopupWindow.getContentView().getLocationOnScreen(popupContentViewOnScreenXY);
+ upperAnchor.getWindowDisplayFrame(containingRect);
assertTrue(popupContentViewInWindowXY[0] >= 0);
assertTrue(popupContentViewInWindowXY[1] >= 0);
- assertEquals(popupContentViewInWindowXY[0] + xOff, popupContentViewOnScreenXY[0]);
- assertEquals(popupContentViewInWindowXY[1] + yOff, popupContentViewOnScreenXY[1]);
+ assertEquals(containingRect.left + popupContentViewInWindowXY[0] + xOff, popupContentViewOnScreenXY[0]);
+ assertEquals(containingRect.top + popupContentViewInWindowXY[1] + yOff, popupContentViewOnScreenXY[1]);
dismissPopup();
}
@@ -943,6 +945,7 @@
int[] fstXY = new int[2];
int[] sndXY = new int[2];
int[] viewInWindowXY = new int[2];
+ Rect containingRect = new Rect();
final Point popupPos = new Point();
mActivityRule.runOnUiThread(() -> {
@@ -962,6 +965,7 @@
showPopup();
mPopupWindow.getContentView().getLocationInWindow(viewInWindowXY);
final View containerView = mActivity.findViewById(R.id.main_container);
+ containerView.getWindowDisplayFrame(containingRect);
// update if it is not shown
mActivityRule.runOnUiThread(() -> mPopupWindow.update(80, 80));
@@ -983,8 +987,8 @@
assertEquals(50, mPopupWindow.getHeight());
mPopupWindow.getContentView().getLocationOnScreen(fstXY);
- assertEquals(popupPos.x + viewInWindowXY[0], fstXY[0]);
- assertEquals(popupPos.y + viewInWindowXY[1], fstXY[1]);
+ assertEquals(containingRect.left + popupPos.x + viewInWindowXY[0], fstXY[0]);
+ assertEquals(containingRect.top + popupPos.y + viewInWindowXY[1], fstXY[1]);
popupPos.set(windowInsets.getStableInsetLeft() + 4, windowInsets.getStableInsetTop());
@@ -998,8 +1002,8 @@
assertEquals(50, mPopupWindow.getHeight());
mPopupWindow.getContentView().getLocationOnScreen(sndXY);
- assertEquals(popupPos.x + viewInWindowXY[0], sndXY[0]);
- assertEquals(popupPos.y + viewInWindowXY[1], sndXY[1]);
+ assertEquals(containingRect.left + popupPos.x + viewInWindowXY[0], sndXY[0]);
+ assertEquals(containingRect.top + popupPos.y + viewInWindowXY[1], sndXY[1]);
dismissPopup();
}
diff --git a/tools/cts-tradefed/Android.mk b/tools/cts-tradefed/Android.mk
index 50100ad..a84fb09 100644
--- a/tools/cts-tradefed/Android.mk
+++ b/tools/cts-tradefed/Android.mk
@@ -29,7 +29,7 @@
LOCAL_SUITE_TARGET_ARCH := $(TARGET_ARCH)
LOCAL_SUITE_NAME := CTS
LOCAL_SUITE_FULLNAME := "Compatibility Test Suite"
-LOCAL_SUITE_VERSION := 8.1_r16
+LOCAL_SUITE_VERSION := 8.1_r17
LOCAL_STATIC_JAVA_LIBRARIES += cts-tradefed-harness
LOCAL_MODULE := cts-tradefed