Merge "HDMICEC: Add utility to invoke OTP on device"
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/voicemail/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/voicemail/OWNERS
new file mode 100644
index 0000000..541e891
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/voicemail/OWNERS
@@ -0,0 +1,2 @@
+# Bug component: 31245
+twyen@google.com
\ No newline at end of file
diff --git a/hostsidetests/deviceidle/src/com/android/cts/deviceidle/DeviceIdleWhitelistTest.java b/hostsidetests/deviceidle/src/com/android/cts/deviceidle/DeviceIdleWhitelistTest.java
index bdba196..def9d75 100644
--- a/hostsidetests/deviceidle/src/com/android/cts/deviceidle/DeviceIdleWhitelistTest.java
+++ b/hostsidetests/deviceidle/src/com/android/cts/deviceidle/DeviceIdleWhitelistTest.java
@@ -91,7 +91,9 @@
         final List<String> packages = new ArrayList<>();
         for (String line : output.split("\n")) {
             final int i = line.indexOf(',');
-            packages.add(line.substring(0, i));
+            if (i > 0) {
+                packages.add(line.substring(0, i));
+            }
         }
         return packages;
     }
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecStartupTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecStartupTest.java
index 06b62f9..4aad656 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecStartupTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecStartupTest.java
@@ -34,6 +34,7 @@
 import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableList;
 import javax.annotation.Nullable;
+import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.rules.RuleChain;
 import org.junit.runner.RunWith;
@@ -74,6 +75,7 @@
    * Tests that the device sends all the messages that should be sent on startup. It also ensures
    * that only the device only sends messages which are allowed by the spec.
    */
+  @Ignore("b/149519706")
   @Test
   public void cectVerifyStartupMessages() throws Exception {
     ITestDevice device = getDevice();
diff --git a/tests/JobScheduler/JobTestApp/src/android/jobscheduler/cts/jobtestapp/TestActivity.java b/tests/JobScheduler/JobTestApp/src/android/jobscheduler/cts/jobtestapp/TestActivity.java
index 0368f05..1bb500da 100644
--- a/tests/JobScheduler/JobTestApp/src/android/jobscheduler/cts/jobtestapp/TestActivity.java
+++ b/tests/JobScheduler/JobTestApp/src/android/jobscheduler/cts/jobtestapp/TestActivity.java
@@ -27,7 +27,7 @@
 import android.util.Log;
 
 /**
- * Just a dummy activity to keep the test app process in the foreground state when desired.
+ * Just a no-op activity to keep the test app process in the foreground state when desired.
  */
 public class TestActivity extends Activity {
     private static final String TAG = TestActivity.class.getSimpleName();
diff --git a/tests/JobSchedulerSharedUid/JobSharedUidTestApp/src/android/jobscheduler/cts/jobtestapp/TestActivity.java b/tests/JobSchedulerSharedUid/JobSharedUidTestApp/src/android/jobscheduler/cts/jobtestapp/TestActivity.java
index 77107c2..595f6a6 100644
--- a/tests/JobSchedulerSharedUid/JobSharedUidTestApp/src/android/jobscheduler/cts/jobtestapp/TestActivity.java
+++ b/tests/JobSchedulerSharedUid/JobSharedUidTestApp/src/android/jobscheduler/cts/jobtestapp/TestActivity.java
@@ -27,7 +27,7 @@
 import android.util.Log;
 
 /**
- * Just a dummy activity to keep the test app process in the foreground state when desired.
+ * Just a no-op activity to keep the test app process in the foreground state when desired.
  */
 public class TestActivity extends Activity {
     private static final String TAG = TestActivity.class.getSimpleName();
diff --git a/tests/contentcaptureservice/src/android/contentcaptureservice/cts/unit/ViewNodeTest.java b/tests/contentcaptureservice/src/android/contentcaptureservice/cts/unit/ViewNodeTest.java
index 5ece59f..4a78e61 100644
--- a/tests/contentcaptureservice/src/android/contentcaptureservice/cts/unit/ViewNodeTest.java
+++ b/tests/contentcaptureservice/src/android/contentcaptureservice/cts/unit/ViewNodeTest.java
@@ -133,7 +133,7 @@
 
         ViewStructureImpl structure = new ViewStructureImpl(view);
         ViewNode node = structure.getNode();
-        assertThat(node.getAutofillId()).isEqualTo(initialId); // sanity check
+        assertThat(node.getAutofillId()).isEqualTo(initialId); // confidence check
 
         assertThrows(NullPointerException.class, () -> structure.setAutofillId(null));
         assertThat(node.getAutofillId()).isEqualTo(initialId); // invariant
@@ -156,7 +156,7 @@
     public void testValidProperties_throughParcel() {
         ViewStructureImpl structure = newSimpleStructure();
         final ViewNode node = structure.getNode();
-        assertSimpleNode(node); // sanity check
+        assertSimpleNode(node); // confidence check
 
         final ViewNode clone = cloneThroughParcel(node);
         assertSimpleNode(clone);
@@ -173,7 +173,7 @@
     public void testComplexText_throughParcel() {
         ViewStructureImpl structure = newStructureWithComplexText();
         final ViewNode node = structure.getNode();
-        assertNodeWithComplexText(node); // sanity check
+        assertNodeWithComplexText(node); // confidence check
 
         ViewNode clone = cloneThroughParcel(node);
         assertNodeWithComplexText(clone);
@@ -401,7 +401,7 @@
 
         try {
             // Write to parcel
-            parcel.setDataPosition(0); // Sanity / paranoid check
+            parcel.setDataPosition(0); // Confidence check
             ViewNode.writeToParcel(parcel, node, 0);
 
             // Read from parcel
diff --git a/tests/inputmethod/src/android/view/inputmethod/cts/BaseInputConnectionTest.java b/tests/inputmethod/src/android/view/inputmethod/cts/BaseInputConnectionTest.java
index 8d9890d..9530c2d 100644
--- a/tests/inputmethod/src/android/view/inputmethod/cts/BaseInputConnectionTest.java
+++ b/tests/inputmethod/src/android/view/inputmethod/cts/BaseInputConnectionTest.java
@@ -117,7 +117,7 @@
         assertNotNull(text);
         assertEquals(0, text.length());
 
-        // Test commitText, not dummy mode
+        // Test commitText, not default fake mode
         CharSequence str = "TestCommit ";
         Editable inputText = Editable.Factory.getInstance().newEditable(str);
         connection.commitText(inputText, inputText.length());
@@ -160,7 +160,7 @@
         Editable inputText = Editable.Factory.getInstance().newEditable(str);
         connection.commitText(inputText, inputText.length());
         final Editable text = connection.getEditable();
-        // Test finishComposingText, not dummy mode
+        // Test finishComposingText, not default fake mode
         BaseInputConnection.setComposingSpans(text);
         assertTrue(BaseInputConnection.getComposingSpanStart(text) > -1);
         assertTrue(BaseInputConnection.getComposingSpanEnd(text) > -1);
diff --git a/tests/media/AndroidTest.xml b/tests/media/AndroidTest.xml
index a618ac0..5ff8efb 100644
--- a/tests/media/AndroidTest.xml
+++ b/tests/media/AndroidTest.xml
@@ -25,7 +25,7 @@
     </target_preparer>
     <target_preparer class="com.android.compatibility.common.tradefed.targetprep.MediaPreparer">
         <option name="push-all" value="true" />
-        <option name="media-folder-name" value="CtsMediaV2TestCases-1.2" />
+        <option name="media-folder-name" value="CtsMediaV2TestCases-1.3" />
         <option name="dynamic-config-module" value="CtsMediaV2TestCases" />
     </target_preparer>
     <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
diff --git a/tests/media/DynamicConfig.xml b/tests/media/DynamicConfig.xml
index 384d3d7..3f1e626 100644
--- a/tests/media/DynamicConfig.xml
+++ b/tests/media/DynamicConfig.xml
@@ -1,6 +1,6 @@
 <dynamicConfig>
     <entry key="media_files_url">
-      <value>https://storage.googleapis.com/android_media/cts/tests/media/CtsMediaV2TestCases-1.2.zip</value>
+      <value>https://storage.googleapis.com/android_media/cts/tests/media/CtsMediaV2TestCases-1.3.zip</value>
     </entry>
 </dynamicConfig>
 
diff --git a/tests/media/src/android/mediav2/cts/CodecDecoderExtTest.java b/tests/media/src/android/mediav2/cts/CodecDecoderExtTest.java
index 51a83ef..0f7fe55 100644
--- a/tests/media/src/android/mediav2/cts/CodecDecoderExtTest.java
+++ b/tests/media/src/android/mediav2/cts/CodecDecoderExtTest.java
@@ -49,6 +49,9 @@
 
     @Parameterized.Parameters(name = "{index}({0})")
     public static Collection<Object[]> input() {
+        final boolean isEncoder = false;
+        final boolean needAudio = false;
+        final boolean needVideo = true;
         final List<Object[]> exhaustiveArgsList = Arrays.asList(new Object[][]{
                 {MediaFormat.MIMETYPE_VIDEO_VP9,
                         //show and no-show frames are sent as separate inputs
@@ -66,19 +69,7 @@
                         //show and no-show frames are sent as one input
                         "bbb_512x288_30fps_1mbps_mpeg2_interlaced_nob_2fields.mp4"},
         });
-
-        Set<String> list = new HashSet<>();
-        if (isHandheld() || isTv() || isAutomotive()) {
-            // sec 2.2.2, 2.3.2, 2.5.2
-            list.add(MediaFormat.MIMETYPE_VIDEO_VP9);
-        }
-        if (isTv()) {
-            // sec 2.3.2
-            list.add(MediaFormat.MIMETYPE_VIDEO_MPEG2);
-        }
-        ArrayList<String> cddRequiredMimeList = new ArrayList<>(list);
-
-        return prepareParamList(cddRequiredMimeList, exhaustiveArgsList, false);
+        return prepareParamList(exhaustiveArgsList, isEncoder, needAudio, needVideo, false);
     }
 
     /**
diff --git a/tests/media/src/android/mediav2/cts/CodecDecoderSurfaceTest.java b/tests/media/src/android/mediav2/cts/CodecDecoderSurfaceTest.java
index 096b5c1..c0aeaf4 100644
--- a/tests/media/src/android/mediav2/cts/CodecDecoderSurfaceTest.java
+++ b/tests/media/src/android/mediav2/cts/CodecDecoderSurfaceTest.java
@@ -38,9 +38,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Set;
 
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
@@ -128,25 +126,9 @@
 
     @Parameterized.Parameters(name = "{index}({0})")
     public static Collection<Object[]> input() {
-        Set<String> list = new HashSet<>();
-        if (isHandheld() || isTv() || isAutomotive()) {
-            // sec 2.2.2, 2.3.2, 2.5.2
-            list.add(MediaFormat.MIMETYPE_VIDEO_AVC);
-            list.add(MediaFormat.MIMETYPE_VIDEO_MPEG4);
-            list.add(MediaFormat.MIMETYPE_VIDEO_H263);
-            list.add(MediaFormat.MIMETYPE_VIDEO_VP8);
-            list.add(MediaFormat.MIMETYPE_VIDEO_VP9);
-        }
-        if (isHandheld()) {
-            // sec 2.2.2
-            list.add(MediaFormat.MIMETYPE_VIDEO_HEVC);
-        }
-        if (isTv()) {
-            // sec 2.3.2
-            list.add(MediaFormat.MIMETYPE_VIDEO_HEVC);
-            list.add(MediaFormat.MIMETYPE_VIDEO_MPEG2);
-        }
-        ArrayList<String> cddRequiredMimeList = new ArrayList<>(list);
+        final boolean isEncoder = false;
+        final boolean needAudio = false;
+        final boolean needVideo = true;
         final List<Object[]> exhaustiveArgsList = Arrays.asList(new Object[][]{
                 {MediaFormat.MIMETYPE_VIDEO_MPEG2, "bbb_340x280_768kbps_30fps_mpeg2.mp4",
                         "bbb_520x390_1mbps_30fps_mpeg2.mp4"},
@@ -180,7 +162,7 @@
                 {MediaFormat.MIMETYPE_VIDEO_AV1, "bbb_340x280_768kbps_30fps_av1.mp4",
                         "bbb_520x390_1mbps_30fps_av1.mp4"},
         });
-        return prepareParamList(cddRequiredMimeList, exhaustiveArgsList, false);
+        return prepareParamList(exhaustiveArgsList, isEncoder, needAudio, needVideo, true);
     }
 
     /**
diff --git a/tests/media/src/android/mediav2/cts/CodecDecoderTest.java b/tests/media/src/android/mediav2/cts/CodecDecoderTest.java
index 30ddd29..81216ec 100644
--- a/tests/media/src/android/mediav2/cts/CodecDecoderTest.java
+++ b/tests/media/src/android/mediav2/cts/CodecDecoderTest.java
@@ -41,9 +41,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Set;
 
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
@@ -125,37 +123,9 @@
 
     @Parameterized.Parameters(name = "{index}({0})")
     public static Collection<Object[]> input() {
-        Set<String> list = new HashSet<>();
-        if (hasAudioOutput()) {
-            // sec 5.1.2
-            list.add(MediaFormat.MIMETYPE_AUDIO_AAC);
-            list.add(MediaFormat.MIMETYPE_AUDIO_FLAC);
-            list.add(MediaFormat.MIMETYPE_AUDIO_MPEG);
-            list.add(MediaFormat.MIMETYPE_AUDIO_VORBIS);
-            list.add(MediaFormat.MIMETYPE_AUDIO_RAW);
-            list.add(MediaFormat.MIMETYPE_AUDIO_OPUS);
-        }
-        if (isHandheld() || isTv() || isAutomotive()) {
-            // sec 2.2.2, 2.3.2, 2.5.2
-            list.add(MediaFormat.MIMETYPE_AUDIO_AAC);
-            list.add(MediaFormat.MIMETYPE_VIDEO_AVC);
-            list.add(MediaFormat.MIMETYPE_VIDEO_MPEG4);
-            list.add(MediaFormat.MIMETYPE_VIDEO_H263);
-            list.add(MediaFormat.MIMETYPE_VIDEO_VP8);
-            list.add(MediaFormat.MIMETYPE_VIDEO_VP9);
-        }
-        if (isHandheld()) {
-            // sec 2.2.2
-            list.add(MediaFormat.MIMETYPE_AUDIO_AMR_NB);
-            list.add(MediaFormat.MIMETYPE_AUDIO_AMR_WB);
-            list.add(MediaFormat.MIMETYPE_VIDEO_HEVC);
-        }
-        if (isTv()) {
-            // sec 2.3.2
-            list.add(MediaFormat.MIMETYPE_VIDEO_HEVC);
-            list.add(MediaFormat.MIMETYPE_VIDEO_MPEG2);
-        }
-        ArrayList<String> cddRequiredMimeList = new ArrayList<>(list);
+        final boolean isEncoder = false;
+        final boolean needAudio = true;
+        final boolean needVideo = true;
         final List<Object[]> exhaustiveArgsList = Arrays.asList(new Object[][]{
                 {MediaFormat.MIMETYPE_AUDIO_MPEG, "bbb_1ch_8kHz_lame_cbr.mp3",
                         "bbb_1ch_8kHz_s16le.raw", "bbb_2ch_44kHz_lame_vbr.mp3",
@@ -220,7 +190,7 @@
                 {MediaFormat.MIMETYPE_VIDEO_AV1, "bbb_340x280_768kbps_30fps_av1.mp4", null,
                         "bbb_520x390_1mbps_30fps_av1.mp4", -1.0f},
         });
-        return prepareParamList(cddRequiredMimeList, exhaustiveArgsList, false);
+        return prepareParamList(exhaustiveArgsList, isEncoder, needAudio, needVideo, true);
     }
 
     /**
diff --git a/tests/media/src/android/mediav2/cts/CodecEncoderSurfaceTest.java b/tests/media/src/android/mediav2/cts/CodecEncoderSurfaceTest.java
index f2501c0..7a9fde1 100644
--- a/tests/media/src/android/mediav2/cts/CodecEncoderSurfaceTest.java
+++ b/tests/media/src/android/mediav2/cts/CodecEncoderSurfaceTest.java
@@ -22,7 +22,6 @@
 import android.media.MediaExtractor;
 import android.media.MediaFormat;
 import android.media.MediaMuxer;
-import android.os.Build;
 import android.util.Log;
 import android.util.Pair;
 import android.view.Surface;
@@ -38,9 +37,9 @@
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
-import java.util.Map;
 
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
@@ -99,13 +98,10 @@
 
     @Parameterized.Parameters(name = "{index}({0})")
     public static Collection<Object[]> input() {
-        ArrayList<String> cddRequiredMimeList = new ArrayList<>();
-        if (CodecTestBase.isHandheld() || CodecTestBase.isTv() || CodecTestBase.isAutomotive()) {
-            // sec 2.2.2, 2.3.2, 2.5.2
-            cddRequiredMimeList.add(MediaFormat.MIMETYPE_VIDEO_AVC);
-            cddRequiredMimeList.add(MediaFormat.MIMETYPE_VIDEO_VP8);
-        }
-        final Object[][] exhaustiveArgsList = new Object[][]{
+        final boolean isEncoder = true;
+        final boolean needAudio = false;
+        final boolean needVideo = true;
+        final List<Object[]> exhaustiveArgsList = Arrays.asList(new Object[][]{
                 // Video - CodecMime, test file, bit rate, frame rate
                 {MediaFormat.MIMETYPE_VIDEO_H263, "bbb_176x144_128kbps_15fps_h263.3gp", 128000, 15},
                 {MediaFormat.MIMETYPE_VIDEO_MPEG4, "bbb_128x96_64kbps_12fps_mpeg4.mp4", 64000, 12},
@@ -114,60 +110,9 @@
                 {MediaFormat.MIMETYPE_VIDEO_VP8, "bbb_cif_768kbps_30fps_avc.mp4", 512000, 30},
                 {MediaFormat.MIMETYPE_VIDEO_VP9, "bbb_cif_768kbps_30fps_avc.mp4", 512000, 30},
                 {MediaFormat.MIMETYPE_VIDEO_AV1, "bbb_cif_768kbps_30fps_avc.mp4", 512000, 30},
-        };
-        ArrayList<String> mimes = new ArrayList<>();
-        if (CodecTestBase.codecSelKeys.contains(CodecTestBase.CODEC_SEL_VALUE)) {
-            MediaCodecList codecList = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
-            MediaCodecInfo[] codecInfos = codecList.getCodecInfos();
-            for (MediaCodecInfo codecInfo : codecInfos) {
-                if (!codecInfo.isEncoder()) continue;
-                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && codecInfo.isAlias()) continue;
-                String[] types = codecInfo.getSupportedTypes();
-                for (String type : types) {
-                    if (!mimes.contains(type) && type.startsWith("video/")) {
-                        mimes.add(type);
-                    }
-                }
-            }
-            // TODO(b/154423708): add checks for video o/p port and display length >= 2.5"
-            /* sec 5.2: device implementations include an embedded screen display with the diagonal
-            length of at least 2.5inches or include a video output port or declare the support of a
-            camera */
-            if (CodecTestBase.hasCamera() && !mimes.contains(MediaFormat.MIMETYPE_VIDEO_AVC) &&
-                    !mimes.contains(MediaFormat.MIMETYPE_VIDEO_VP8)) {
-                fail("device must support at least one of VP8 or AVC video encoders");
-            }
-            for (String mime : cddRequiredMimeList) {
-                if (!mimes.contains(mime)) {
-                    fail("no codec found for mime " + mime + " as required by cdd");
-                }
-            }
-        } else {
-            for (Map.Entry<String, String> entry : CodecTestBase.codecSelKeyMimeMap.entrySet()) {
-                String key = entry.getKey();
-                String value = entry.getValue();
-                if (CodecTestBase.codecSelKeys.contains(key) && !mimes.contains(value)) {
-                    mimes.add(value);
-                }
-            }
-        }
-        final List<Object[]> argsList = new ArrayList<>();
-        for (String mime : mimes) {
-            boolean miss = true;
-            for (Object[] arg : exhaustiveArgsList) {
-                if (mime.equals(arg[0])) {
-                    argsList.add(arg);
-                    miss = false;
-                }
-            }
-            if (miss) {
-                if (cddRequiredMimeList.contains(mime)) {
-                    fail("no test vectors for required mimetype " + mime);
-                }
-                Log.w(LOG_TAG, "no test vectors available for optional mime type " + mime);
-            }
-        }
-        return argsList;
+        });
+        return CodecTestBase.prepareParamList(exhaustiveArgsList, isEncoder, needAudio, needVideo,
+                true);
     }
 
     private boolean hasSeenError() {
diff --git a/tests/media/src/android/mediav2/cts/CodecEncoderTest.java b/tests/media/src/android/mediav2/cts/CodecEncoderTest.java
index 2d9da22..38eea01 100644
--- a/tests/media/src/android/mediav2/cts/CodecEncoderTest.java
+++ b/tests/media/src/android/mediav2/cts/CodecEncoderTest.java
@@ -35,9 +35,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Set;
 
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
@@ -159,26 +157,9 @@
 
     @Parameterized.Parameters(name = "{index}({0})")
     public static Collection<Object[]> input() {
-        Set<String> list = new HashSet<>();
-        if (hasMicrophone()) {
-            // sec 5.1.1
-            // TODO(b/154423550)
-            // list.add(MediaFormat.MIMETYPE_AUDIO_RAW);
-            list.add(MediaFormat.MIMETYPE_AUDIO_FLAC);
-            list.add(MediaFormat.MIMETYPE_AUDIO_OPUS);
-        }
-        if (isHandheld() || isTv() || isAutomotive()) {
-            // sec 2.2.2, 2.3.2, 2.5.2
-            list.add(MediaFormat.MIMETYPE_AUDIO_AAC);
-            list.add(MediaFormat.MIMETYPE_VIDEO_AVC);
-            list.add(MediaFormat.MIMETYPE_VIDEO_VP8);
-        }
-        if (isHandheld()) {
-            // sec 2.2.2
-            list.add(MediaFormat.MIMETYPE_AUDIO_AMR_NB);
-            list.add(MediaFormat.MIMETYPE_AUDIO_AMR_WB);
-        }
-        ArrayList<String> cddRequiredMimeList = new ArrayList<>(list);
+        final boolean isEncoder = true;
+        final boolean needAudio = true;
+        final boolean needVideo = true;
         final List<Object[]> exhaustiveArgsList = Arrays.asList(new Object[][]{
                 // Audio - CodecMime, arrays of bit-rates, sample rates, channel counts
                 {MediaFormat.MIMETYPE_AUDIO_AAC, new int[]{64000, 128000}, new int[]{8000, 11025,
@@ -208,7 +189,7 @@
                 {MediaFormat.MIMETYPE_VIDEO_AV1, new int[]{256000, 512000}, new int[]{176, 352,
                         352, 480}, new int[]{144, 240, 288, 360}},
         });
-        return prepareParamList(cddRequiredMimeList, exhaustiveArgsList, true);
+        return prepareParamList(exhaustiveArgsList, isEncoder, needAudio, needVideo, true);
     }
 
     private void setUpParams(int limit) {
diff --git a/tests/media/src/android/mediav2/cts/CodecTestBase.java b/tests/media/src/android/mediav2/cts/CodecTestBase.java
index a47ede1..9d37910 100644
--- a/tests/media/src/android/mediav2/cts/CodecTestBase.java
+++ b/tests/media/src/android/mediav2/cts/CodecTestBase.java
@@ -44,9 +44,11 @@
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.locks.Condition;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
@@ -533,8 +535,82 @@
                 !isAutomotive();
     }
 
-    static List<Object[]> prepareParamList(ArrayList<String> cddRequiredMimeList,
-            List<Object[]> exhaustiveArgsList, boolean isEncoder) {
+    static boolean hasDecoder(String mime) {
+        return CodecTestBase.selectCodecs(mime, null, null, false).size() != 0;
+    }
+
+    static ArrayList<String> prepareRequiredArgsList(boolean isEncoder, boolean needAudio,
+            boolean needVideo) {
+        Set<String> list = new HashSet<>();
+        if (!isEncoder) {
+            if (hasAudioOutput() && needAudio) {
+                // sec 5.1.2
+                list.add(MediaFormat.MIMETYPE_AUDIO_AAC);
+                list.add(MediaFormat.MIMETYPE_AUDIO_FLAC);
+                list.add(MediaFormat.MIMETYPE_AUDIO_MPEG);
+                list.add(MediaFormat.MIMETYPE_AUDIO_VORBIS);
+                list.add(MediaFormat.MIMETYPE_AUDIO_RAW);
+                list.add(MediaFormat.MIMETYPE_AUDIO_OPUS);
+            }
+            if (isHandheld() || isTv() || isAutomotive()) {
+                // sec 2.2.2, 2.3.2, 2.5.2
+                if (needAudio) {
+                    list.add(MediaFormat.MIMETYPE_AUDIO_AAC);
+                }
+                if (needVideo) {
+                    list.add(MediaFormat.MIMETYPE_VIDEO_AVC);
+                    list.add(MediaFormat.MIMETYPE_VIDEO_MPEG4);
+                    list.add(MediaFormat.MIMETYPE_VIDEO_H263);
+                    list.add(MediaFormat.MIMETYPE_VIDEO_VP8);
+                    list.add(MediaFormat.MIMETYPE_VIDEO_VP9);
+                }
+            }
+            if (isHandheld()) {
+                // sec 2.2.2
+                if (needAudio) {
+                    list.add(MediaFormat.MIMETYPE_AUDIO_AMR_NB);
+                    list.add(MediaFormat.MIMETYPE_AUDIO_AMR_WB);
+                }
+                if (needVideo) {
+                    list.add(MediaFormat.MIMETYPE_VIDEO_HEVC);
+                }
+            }
+            if (isTv() && needVideo) {
+                // sec 2.3.2
+                list.add(MediaFormat.MIMETYPE_VIDEO_HEVC);
+                list.add(MediaFormat.MIMETYPE_VIDEO_MPEG2);
+            }
+        } else {
+            if (hasMicrophone() && needAudio) {
+                // sec 5.1.1
+                // TODO(b/154423550)
+                // list.add(MediaFormat.MIMETYPE_AUDIO_RAW);
+                list.add(MediaFormat.MIMETYPE_AUDIO_FLAC);
+                list.add(MediaFormat.MIMETYPE_AUDIO_OPUS);
+            }
+            if (isHandheld() || isTv() || isAutomotive()) {
+                // sec 2.2.2, 2.3.2, 2.5.2
+                if (needAudio) {
+                    list.add(MediaFormat.MIMETYPE_AUDIO_AAC);
+                }
+                if (needVideo) {
+                    list.add(MediaFormat.MIMETYPE_VIDEO_AVC);
+                    list.add(MediaFormat.MIMETYPE_VIDEO_VP8);
+                }
+            }
+            if (isHandheld() && needAudio) {
+                // sec 2.2.2
+                list.add(MediaFormat.MIMETYPE_AUDIO_AMR_NB);
+                list.add(MediaFormat.MIMETYPE_AUDIO_AMR_WB);
+            }
+        }
+        return new ArrayList<>(list);
+    }
+
+    static List<Object[]> prepareParamList(List<Object[]> exhaustiveArgsList, boolean isEncoder,
+            boolean needAudio, boolean needVideo, boolean mustTestRequiredArgsList) {
+        ArrayList<String> cddRequiredMimeList =
+                prepareRequiredArgsList(isEncoder, needAudio, needVideo);
         ArrayList<String> mimes = new ArrayList<>();
         if (codecSelKeys.contains(CODEC_SEL_VALUE)) {
             MediaCodecList codecList = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
@@ -544,6 +620,8 @@
                 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && codecInfo.isAlias()) continue;
                 String[] types = codecInfo.getSupportedTypes();
                 for (String type : types) {
+                    if (!needAudio && type.startsWith("audio/")) continue;
+                    if (!needVideo && type.startsWith("video/")) continue;
                     if (!mimes.contains(type)) {
                         mimes.add(type);
                     }
@@ -553,7 +631,8 @@
             /* sec 5.2: device implementations include an embedded screen display with the
             diagonal length of at least 2.5inches or include a video output port or declare the
             support of a camera */
-            if (isEncoder && hasCamera() && !mimes.contains(MediaFormat.MIMETYPE_VIDEO_AVC) &&
+            if (isEncoder && hasCamera() && needVideo &&
+                    !mimes.contains(MediaFormat.MIMETYPE_VIDEO_AVC) &&
                     !mimes.contains(MediaFormat.MIMETYPE_VIDEO_VP8)) {
                 fail("device must support at least one of VP8 or AVC video encoders");
             }
@@ -578,7 +657,7 @@
                     miss = false;
                 }
             }
-            if (miss) {
+            if (miss && mustTestRequiredArgsList) {
                 if (cddRequiredMimeList.contains(mime)) {
                     fail("no test vectors for required mimetype " + mime);
                 }
diff --git a/tests/media/src/android/mediav2/cts/EncoderColorAspectsTest.java b/tests/media/src/android/mediav2/cts/EncoderColorAspectsTest.java
index 24ef99f..dabb07e 100644
--- a/tests/media/src/android/mediav2/cts/EncoderColorAspectsTest.java
+++ b/tests/media/src/android/mediav2/cts/EncoderColorAspectsTest.java
@@ -108,34 +108,27 @@
 
     @Parameterized.Parameters(name = "{index}({0}{3}{4}{5})")
     public static Collection<Object[]> input() {
-        ArrayList<String> testMimeList = new ArrayList<>();
-        testMimeList.add(MediaFormat.MIMETYPE_VIDEO_AVC);
-        testMimeList.add(MediaFormat.MIMETYPE_VIDEO_HEVC);
-        testMimeList.add(MediaFormat.MIMETYPE_VIDEO_VP8);
-        testMimeList.add(MediaFormat.MIMETYPE_VIDEO_VP9);
-        ArrayList<String> mimes = new ArrayList<>();
-        if (CodecTestBase.codecSelKeys.contains(CodecTestBase.CODEC_SEL_VALUE)) {
-            MediaCodecList codecList = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
-            MediaCodecInfo[] codecInfos = codecList.getCodecInfos();
-            for (MediaCodecInfo codecInfo : codecInfos) {
-                if (!codecInfo.isEncoder()) continue;
-                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && codecInfo.isAlias()) continue;
-                String[] types = codecInfo.getSupportedTypes();
-                for (String type : types) {
-                    if (testMimeList.contains(type) && !mimes.contains(type)) {
-                        mimes.add(type);
-                    }
-                }
-            }
-        }
-        int[] ranges =
-                {-1, UNSPECIFIED, MediaFormat.COLOR_RANGE_FULL, MediaFormat.COLOR_RANGE_LIMITED};
-        int[] standards =
-                {-1, UNSPECIFIED, MediaFormat.COLOR_STANDARD_BT709,
-                        MediaFormat.COLOR_STANDARD_BT601_PAL,
-                        MediaFormat.COLOR_STANDARD_BT601_NTSC, MediaFormat.COLOR_STANDARD_BT2020};
-        int[] transfers =
-                {-1, UNSPECIFIED, MediaFormat.COLOR_TRANSFER_LINEAR, MediaFormat.COLOR_TRANSFER_SDR_VIDEO};
+        final boolean isEncoder = true;
+        final boolean needAudio = false;
+        final boolean needVideo = true;
+        String[] mimes = {MediaFormat.MIMETYPE_VIDEO_AVC,
+                MediaFormat.MIMETYPE_VIDEO_HEVC,
+                MediaFormat.MIMETYPE_VIDEO_VP8,
+                MediaFormat.MIMETYPE_VIDEO_VP9};
+        int[] ranges = {-1,
+                UNSPECIFIED,
+                MediaFormat.COLOR_RANGE_FULL,
+                MediaFormat.COLOR_RANGE_LIMITED};
+        int[] standards = {-1,
+                UNSPECIFIED,
+                MediaFormat.COLOR_STANDARD_BT709,
+                MediaFormat.COLOR_STANDARD_BT601_PAL,
+                MediaFormat.COLOR_STANDARD_BT601_NTSC,
+                MediaFormat.COLOR_STANDARD_BT2020};
+        int[] transfers = {-1,
+                UNSPECIFIED,
+                MediaFormat.COLOR_TRANSFER_LINEAR,
+                MediaFormat.COLOR_TRANSFER_SDR_VIDEO};
         // TODO: COLOR_TRANSFER_ST2084, COLOR_TRANSFER_HLG are for 10 bit and above. Should these
         //  be tested as well?
         List<Object[]> exhaustiveArgsList = new ArrayList<>();
@@ -150,7 +143,8 @@
                 }
             }
         }
-        return exhaustiveArgsList;
+        return CodecTestBase
+                .prepareParamList(exhaustiveArgsList, isEncoder, needAudio, needVideo, false);
     }
 
     @SmallTest
diff --git a/tests/media/src/android/mediav2/cts/EncoderProfileLevelTest.java b/tests/media/src/android/mediav2/cts/EncoderProfileLevelTest.java
index d0e4030..f3e9ad7 100644
--- a/tests/media/src/android/mediav2/cts/EncoderProfileLevelTest.java
+++ b/tests/media/src/android/mediav2/cts/EncoderProfileLevelTest.java
@@ -74,13 +74,9 @@
 
     @Parameterized.Parameters(name = "{index}({0})")
     public static Collection<Object[]> input() {
-        ArrayList<String> cddRequiredMimeList = new ArrayList<>();
-        if (isHandheld() || isTv() || isAutomotive()) {
-            // sec 2.2.2, 2.3.2, 2.5.2
-            cddRequiredMimeList.add(MediaFormat.MIMETYPE_AUDIO_AAC);
-            cddRequiredMimeList.add(MediaFormat.MIMETYPE_VIDEO_AVC);
-            cddRequiredMimeList.add(MediaFormat.MIMETYPE_VIDEO_VP8);
-        }
+        final boolean isEncoder = true;
+        final boolean needAudio = true;
+        final boolean needVideo = true;
         final List<Object[]> exhaustiveArgsList = Arrays.asList(new Object[][]{
                 // Audio - CodecMime, bit-rate, sample rate, channel count
                 {MediaFormat.MIMETYPE_AUDIO_AAC, 64000, 48000, 1, -1},
@@ -193,7 +189,7 @@
                 {MediaFormat.MIMETYPE_VIDEO_VP8, 512000, 176, 144, 20},
                 {MediaFormat.MIMETYPE_VIDEO_VP8, 512000, 480, 360, 20},
         });
-        return prepareParamList(cddRequiredMimeList, exhaustiveArgsList, true);
+        return prepareParamList(exhaustiveArgsList, isEncoder, needAudio, needVideo, false);
     }
 
     static {
diff --git a/tests/media/src/android/mediav2/cts/ExtractorTest.java b/tests/media/src/android/mediav2/cts/ExtractorTest.java
index cbfc9c6..282f3f9 100644
--- a/tests/media/src/android/mediav2/cts/ExtractorTest.java
+++ b/tests/media/src/android/mediav2/cts/ExtractorTest.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.content.res.AssetFileDescriptor;
 import android.media.MediaCodec;
+import android.media.MediaCodecInfo;
 import android.media.MediaDataSource;
 import android.media.MediaExtractor;
 import android.media.MediaFormat;
@@ -53,6 +54,8 @@
 import java.util.List;
 import java.util.Random;
 
+import static android.mediav2.cts.CodecTestBase.hasDecoder;
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 import static org.junit.Assume.assumeTrue;
@@ -1125,4 +1128,236 @@
             }
         }
     }
+
+    /**
+     * Test if extractor populates key-value pairs correctly
+     */
+    @RunWith(Parameterized.class)
+    public static class ValidateKeyValuePairs {
+        private static final String mInpPrefix = WorkDir.getMediaDirString();
+        private final String mMime;
+        private final String[] mInpFiles;
+        private final int mProfile;
+        private final int mLevel;
+        private final int mWR;
+        private final int mHCh;
+
+        public ValidateKeyValuePairs(String mime, String[] inpFiles, int profile, int level, int wr,
+                int hCh) {
+            mMime = mime;
+            mInpFiles = inpFiles;
+            mProfile = profile;
+            mLevel = level;
+            mWR = wr;
+            mHCh = hCh;
+        }
+
+        @Parameterized.Parameters(name = "{index}({0})")
+        public static Collection<Object[]> input() {
+            // mime, clips, profile, level, width/sample rate, height/channel count
+            List<Object[]> exhaustiveArgsList = new ArrayList<>();
+
+            if (hasDecoder(MediaFormat.MIMETYPE_VIDEO_MPEG2)) {
+                // profile and level constraints as per sec 2.3.2 of cdd
+                /* TODO(b/159582475)
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_MPEG2, new String[]{
+                        "bbb_1920x1080_mpeg2_main_high.mp4",
+                        "bbb_1920x1080_mpeg2_main_high.mkv"},
+                        MediaCodecInfo.CodecProfileLevel.MPEG2ProfileMain,
+                        MediaCodecInfo.CodecProfileLevel.MPEG2LevelHL, 1920, 1080});*/
+            }
+
+            if (hasDecoder(MediaFormat.MIMETYPE_VIDEO_AVC)) {
+                // profile and level constraints as per sec 2.3.2 of cdd
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_AVC, new String[]{
+                        "bbb_1920x1080_avc_baseline_l42.mp4",
+                        "bbb_1920x1080_avc_baseline_l42.mkv",
+                        "bbb_1920x1080_avc_baseline_l42.3gp"},
+                        MediaCodecInfo.CodecProfileLevel.AVCProfileConstrainedBaseline,
+                        MediaCodecInfo.CodecProfileLevel.AVCLevel42, 1920, 1080});
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_AVC, new String[]{
+                        "bbb_1920x1080_avc_main_l42.mp4",
+                        "bbb_1920x1080_avc_main_l42.mkv",
+                        "bbb_1920x1080_avc_main_l42.3gp"},
+                        MediaCodecInfo.CodecProfileLevel.AVCProfileMain,
+                        MediaCodecInfo.CodecProfileLevel.AVCLevel42, 1920, 1080});
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_AVC, new String[]{
+                        "bbb_1920x1080_avc_high_l42.mp4",
+                        "bbb_1920x1080_avc_high_l42.mkv",
+                        "bbb_1920x1080_avc_high_l42.3gp"},
+                        MediaCodecInfo.CodecProfileLevel.AVCProfileHigh,
+                        MediaCodecInfo.CodecProfileLevel.AVCLevel42, 1920, 1080});
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_AVC, new String[]{
+                        "video_dovi_1920x1080_60fps_dvav_09.mp4"},
+                        MediaCodecInfo.CodecProfileLevel.AVCProfileHigh,
+                        MediaCodecInfo.CodecProfileLevel.AVCLevel42, 1920, 1080});
+                // profile/level constraints for avc as per sec 5.3.4 of cdd
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_AVC, new String[]{
+                        "bbb_1920x1080_avc_baseline_l40.mp4",
+                        "bbb_1920x1080_avc_baseline_l40.mkv",
+                        "bbb_1920x1080_avc_baseline_l40.3gp"},
+                        MediaCodecInfo.CodecProfileLevel.AVCProfileConstrainedBaseline,
+                        MediaCodecInfo.CodecProfileLevel.AVCLevel4, 1920, 1080});
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_AVC, new String[]{
+                        "bbb_1920x1080_avc_main_l40.mp4",
+                        "bbb_1920x1080_avc_main_l40.mkv",
+                        "bbb_1920x1080_avc_main_l40.3gp"},
+                        MediaCodecInfo.CodecProfileLevel.AVCProfileMain,
+                        MediaCodecInfo.CodecProfileLevel.AVCLevel4, 1920, 1080});
+            }
+
+            if (hasDecoder(MediaFormat.MIMETYPE_VIDEO_HEVC)) {
+                // profile and level constraints as per sec 2.3.2 of cdd
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_HEVC, new String[]{
+                        "bbb_1920x1080_hevc_main_l41.mp4",
+                        "bbb_1920x1080_hevc_main_l41.mkv"},
+                        MediaCodecInfo.CodecProfileLevel.HEVCProfileMain,
+                        MediaCodecInfo.CodecProfileLevel.HEVCMainTierLevel41, 1920, 1080});
+                // profile/level constraints for hevc as per sec 5.3.5 of cdd
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_HEVC, new String[]{
+                        "bbb_1920x1080_hevc_main_l40.mp4",
+                        "bbb_1920x1080_hevc_main_l40.mkv"},
+                        MediaCodecInfo.CodecProfileLevel.HEVCProfileMain,
+                        MediaCodecInfo.CodecProfileLevel.HEVCMainTierLevel4, 1920, 1080});
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_HEVC, new String[]{
+                        "video_dovi_1920x1080_30fps_dvhe_04.mp4"},
+                        MediaCodecInfo.CodecProfileLevel.HEVCProfileMain10,
+                        MediaCodecInfo.CodecProfileLevel.HEVCMainTierLevel4, 1920, 1080});
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_HEVC, new String[]{
+                        "video_dovi_1920x1080_60fps_dvhe_08.mp4"},
+                        MediaCodecInfo.CodecProfileLevel.HEVCProfileMain10,
+                        MediaCodecInfo.CodecProfileLevel.HEVCMainTierLevel41, 1920, 1080});
+            }
+
+            if (hasDecoder(MediaFormat.MIMETYPE_VIDEO_VP9)) {
+                // profile and level constraints as per sec 2.3.2 of cdd
+                /* TODO(b/159582475)
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_VP9, new String[]{
+                        "bbb_1920x1080_vp9_main_l41.webm",
+                        "bbb_1920x1080_vp9_main_l41.mkv"},
+                        MediaCodecInfo.CodecProfileLevel.VP9Profile0,
+                        MediaCodecInfo.CodecProfileLevel.VP9Level41, 1920, 1080});*/
+                // profile/level constraints for vp9 as per sec 5.3.6 of cdd
+                /* TODO(b/159582475)
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_VP9, new String[]{
+                        "bbb_1920x1080_vp9_main_l40.webm",
+                        "bbb_1920x1080_vp9_main_l40.mkv"},
+                        MediaCodecInfo.CodecProfileLevel.VP9Profile0,
+                        MediaCodecInfo.CodecProfileLevel.VP9Level4, 1920, 1080});*/
+            }
+
+            if (hasDecoder(MediaFormat.MIMETYPE_VIDEO_H263)) {
+                // profile/level constraints for h263 as per sec 5.3.2 of cdd
+                /* TODO(b/159582475)
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_H263, new String[]{
+                        "bbb_352x288_384kbps_30fps_h263_baseline_l3.3gp",
+                        "bbb_352x288_384kbps_30fps_h263_baseline_l3.mp4",
+                        "bbb_352x288_384kbps_30fps_h263_baseline_l3.mkv"},
+                        MediaCodecInfo.CodecProfileLevel.H263ProfileBaseline,
+                        MediaCodecInfo.CodecProfileLevel.H263Level30, 352, 288});*/
+            }
+
+            if (hasDecoder(MediaFormat.MIMETYPE_VIDEO_MPEG4)) {
+                // profile/level constraints for mpeg4 as per sec 5.3.3 of cdd
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_MPEG4, new String[]{
+                        "bbb_352x288_384kbps_30fps_mpeg4_simple_l3.mp4",
+                        "bbb_352x288_384kbps_30fps_mpeg4_simple_l3.3gp",
+                        "bbb_352x288_384kbps_30fps_mpeg4_simple_l3.mkv"},
+                        MediaCodecInfo.CodecProfileLevel.MPEG4ProfileSimple,
+                        MediaCodecInfo.CodecProfileLevel.MPEG4Level3, 352, 288});
+            }
+
+            if (hasDecoder(MediaFormat.MIMETYPE_AUDIO_AAC)) {
+                // profile and level constraints for devices that have audio output as per sec 2.2.2,
+                // sec 2.3.2, sec 2.5.2, sec 5.1.2 of cdd
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_AUDIO_AAC, new String[]{
+                        "bbb_stereo_44kHz_192kbps_aac_lc.mp4",
+                        "bbb_stereo_44kHz_192kbps_aac_lc.3gp",
+                        "bbb_stereo_44kHz_192kbps_aac_lc.mkv"},
+                        MediaCodecInfo.CodecProfileLevel.AACObjectLC, 0, 44100, 2});
+                /* TODO(b/159582475)
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_AUDIO_AAC, new String[]{
+                        "bbb_stereo_44kHz_192kbps_aac_he.mp4",
+                        "bbb_stereo_44kHz_192kbps_aac_he.3gp",
+                        "bbb_stereo_44kHz_192kbps_aac_he.mkv"},
+                        MediaCodecInfo.CodecProfileLevel.AACObjectHE, 0, 44100, 2});*/
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_AUDIO_AAC, new String[] {
+                        "bbb_stereo_44kHz_192kbps_aac_eld.mp4",
+                        "bbb_stereo_44kHz_192kbps_aac_eld.3gp",
+                        "bbb_stereo_44kHz_192kbps_aac_eld.mkv"},
+                        MediaCodecInfo.CodecProfileLevel.AACObjectELD, 0, 44100, 2});
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_AUDIO_AAC, new String[]{
+                        "bbb_stereo_44kHz_192kbps_aac_ld.mp4",
+                        "bbb_stereo_44kHz_192kbps_aac_ld.3gp",
+                        "bbb_stereo_44kHz_192kbps_aac_ld.mkv"},
+                        MediaCodecInfo.CodecProfileLevel.AACObjectLD, 0, 44100, 2});
+                /*TODO(b/159582475)
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_AUDIO_AAC, new String[]{
+                        "bbb_stereo_44kHz_192kbps_aac_hev2.mp4",
+                        "bbb_stereo_44kHz_192kbps_aac_hev2.3gp",
+                        "bbb_stereo_44kHz_192kbps_aac_hev2.mkv"},
+                        MediaCodecInfo.CodecProfileLevel.AACObjectHE_PS, 0, 44100, 2});*/
+            }
+
+            // Miscellaneous
+            if (hasDecoder(MediaFormat.MIMETYPE_VIDEO_DOLBY_VISION)) {
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_DOLBY_VISION,
+                        new String[]{"video_dovi_1920x1080_30fps_dvhe_04.mp4"},
+                        MediaCodecInfo.CodecProfileLevel.DolbyVisionProfileDvheDtr,
+                        MediaCodecInfo.CodecProfileLevel.DolbyVisionLevelFhd30, 1920, 1080});
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_DOLBY_VISION,
+                        new String[]{"video_dovi_1920x1080_60fps_dvhe_05.mp4"},
+                        MediaCodecInfo.CodecProfileLevel.DolbyVisionProfileDvheStn,
+                        MediaCodecInfo.CodecProfileLevel.DolbyVisionLevelFhd60, 1920, 1080});
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_DOLBY_VISION,
+                        new String[]{"video_dovi_1920x1080_60fps_dvhe_08.mp4"},
+                        MediaCodecInfo.CodecProfileLevel.DolbyVisionProfileDvheSt,
+                        MediaCodecInfo.CodecProfileLevel.DolbyVisionLevelFhd60, 1920, 1080});
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_DOLBY_VISION,
+                        new String[]{"video_dovi_1920x1080_60fps_dvav_09.mp4"},
+                        MediaCodecInfo.CodecProfileLevel.DolbyVisionProfileDvavSe,
+                        MediaCodecInfo.CodecProfileLevel.DolbyVisionLevelFhd60, 1920, 1080});
+            }
+
+            return exhaustiveArgsList;
+        }
+
+        @Test
+        public void validateKeyValuePairs() throws IOException {
+            for (String file : mInpFiles) {
+                MediaFormat format = null;
+                MediaExtractor extractor = new MediaExtractor();
+                extractor.setDataSource(mInpPrefix + file);
+                for (int trackID = 0; trackID < extractor.getTrackCount(); trackID++) {
+                    MediaFormat fmt = extractor.getTrackFormat(trackID);
+                    if (mMime.equalsIgnoreCase(fmt.getString(MediaFormat.KEY_MIME))) {
+                        format = fmt;
+                        break;
+                    }
+                }
+                extractor.release();
+                assertTrue(format != null);
+                if (mMime.equals(MediaFormat.MIMETYPE_AUDIO_AAC)) {
+                    assertTrue(format.containsKey(MediaFormat.KEY_AAC_PROFILE) ||
+                            format.containsKey(MediaFormat.KEY_PROFILE));
+                    if (format.containsKey(MediaFormat.KEY_AAC_PROFILE)) {
+                        assertEquals(mProfile, format.getInteger(MediaFormat.KEY_AAC_PROFILE));
+                    }
+                    if (format.containsKey(MediaFormat.KEY_PROFILE)) {
+                        assertEquals(mProfile, format.getInteger(MediaFormat.KEY_PROFILE));
+                    }
+                } else {
+                    assertEquals(mProfile, format.getInteger(MediaFormat.KEY_PROFILE));
+                    assertEquals(mLevel, format.getInteger(MediaFormat.KEY_LEVEL));
+                }
+                if (mMime.startsWith("audio/")) {
+                    assertEquals(mWR, format.getInteger(MediaFormat.KEY_SAMPLE_RATE));
+                    assertEquals(mHCh, format.getInteger(MediaFormat.KEY_CHANNEL_COUNT));
+                } else if (mMime.startsWith("video/")) {
+                    assertEquals(mWR, format.getInteger(MediaFormat.KEY_WIDTH));
+                    assertEquals(mHCh, format.getInteger(MediaFormat.KEY_HEIGHT));
+                }
+            }
+        }
+    }
 }
diff --git a/tests/media/src/android/mediav2/cts/WorkDir.java b/tests/media/src/android/mediav2/cts/WorkDir.java
index a5e635c..7192c5c 100644
--- a/tests/media/src/android/mediav2/cts/WorkDir.java
+++ b/tests/media/src/android/mediav2/cts/WorkDir.java
@@ -40,7 +40,7 @@
             // user has specified the mediaDirString via instrumentation-arg
             return mediaDirString + ((mediaDirString.endsWith("/")) ? "" : "/");
         } else {
-            return (getTopDirString() + "test/CtsMediaV2TestCases-1.2/");
+            return (getTopDirString() + "test/CtsMediaV2TestCases-1.3/");
         }
     }
 }
\ No newline at end of file
diff --git a/tests/tests/nativemidi/jni/native-lib.cpp b/tests/tests/nativemidi/jni/native-lib.cpp
index f482eee..5a2f0ca 100644
--- a/tests/tests/nativemidi/jni/native-lib.cpp
+++ b/tests/tests/nativemidi/jni/native-lib.cpp
@@ -278,6 +278,8 @@
 
 JNIEXPORT jlong JNICALL Java_android_nativemidi_cts_NativeMidiEchoTest_allocTestContext(
         JNIEnv* env, jclass) {
+    __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "allocTestContext()");
+
     TestContext* context = new TestContext;
     if (!context->initN(env)) {
         delete context;
@@ -289,6 +291,7 @@
 
 JNIEXPORT void JNICALL Java_android_nativemidi_cts_NativeMidiEchoTest_freeTestContext(
         JNIEnv*, jclass, jlong context) {
+    __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "freeTestContext()");
     delete (TestContext*)context;
 }
 
@@ -469,6 +472,11 @@
 
     // __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "++++ startReadingMidi()");
     TestContext* context = (TestContext*)ctx;
+    if (context == nullptr) {
+        __android_log_print(ANDROID_LOG_INFO, LOG_TAG,
+                "Test Context is null in  startReadingMidi()");
+        return AMEDIA_ERROR_INVALID_OBJECT;
+    }
 
     AMidiOutputPort* outputPort;
     media_status_t status = AMidiOutputPort_open(context->nativeDevice, portNumber, &outputPort);
@@ -494,6 +502,11 @@
 
     // __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "++++ stopReadingMidi()");
     TestContext* context = (TestContext*)ctx;
+    if (context == nullptr) {
+        __android_log_print(ANDROID_LOG_INFO, LOG_TAG,
+                "Test Context is null in  stopReadingMidi()");
+        return AMEDIA_ERROR_INVALID_OBJECT;
+    }
     context->mReading = false;
 
     context->mReadThread->join();
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java b/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
index 3c99a2a..c0b75e6 100755
--- a/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
@@ -2441,6 +2441,17 @@
         assertEquals(kRequest, (long) WebkitUtils.waitForFuture(visualStateFuture));
     }
 
+    private static boolean setSafeBrowsingAllowlistSync(List<String> allowlist) {
+        final SettableFuture<Boolean> safeBrowsingAllowlistFuture = SettableFuture.create();
+        WebView.setSafeBrowsingWhitelist(allowlist, new ValueCallback<Boolean>() {
+            @Override
+            public void onReceiveValue(Boolean success) {
+                safeBrowsingAllowlistFuture.set(success);
+            }
+        });
+        return WebkitUtils.waitForFuture(safeBrowsingAllowlistFuture);
+    }
+
     /**
      * This should remain functionally equivalent to
      * androidx.webkit.WebViewCompatTest#testSetSafeBrowsingAllowlistWithMalformedList.
@@ -2455,14 +2466,7 @@
         List allowlist = new ArrayList<String>();
         // Protocols are not supported in the allowlist
         allowlist.add("http://google.com");
-        final SettableFuture<Boolean> safeBrowsingAllowlistFuture = SettableFuture.create();
-        WebView.setSafeBrowsingWhitelist(allowlist, new ValueCallback<Boolean>() {
-            @Override
-            public void onReceiveValue(Boolean success) {
-                safeBrowsingAllowlistFuture.set(success);
-            }
-        });
-        assertFalse(WebkitUtils.waitForFuture(safeBrowsingAllowlistFuture));
+        assertFalse("Malformed list entry should fail", setSafeBrowsingAllowlistSync(allowlist));
     }
 
     /**
@@ -2478,14 +2482,7 @@
 
         List allowlist = new ArrayList<String>();
         allowlist.add("safe-browsing");
-        final SettableFuture<Boolean> safeBrowsingAllowlistFuture = SettableFuture.create();
-        WebView.setSafeBrowsingWhitelist(allowlist, new ValueCallback<Boolean>() {
-            @Override
-            public void onReceiveValue(Boolean success) {
-                safeBrowsingAllowlistFuture.set(success);
-            }
-        });
-        assertTrue(WebkitUtils.waitForFuture(safeBrowsingAllowlistFuture));
+        assertTrue("Valid allowlist should be successful", setSafeBrowsingAllowlistSync(allowlist));
 
         final SettableFuture<Void> pageFinishedFuture = SettableFuture.create();
         mOnUiThread.setWebViewClient(new WebViewClient() {