| /* |
| * Copyright (C) 2018 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| * use this file except in compliance with the License. You may obtain a copy of |
| * the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| * License for the specific language governing permissions and limitations under |
| * the License. |
| */ |
| |
| package android.security.cts; |
| |
| import com.android.tradefed.device.ITestDevice; |
| import com.android.tradefed.log.LogUtil.CLog; |
| import android.platform.test.annotations.SecurityTest; |
| import java.util.regex.Pattern; |
| |
| @SecurityTest |
| public class TestMediaCodec extends SecurityTestCase { |
| |
| final static int TIMEOUT_SEC = 9 * 60; |
| final static String RESOURCE_ROOT = "/"; |
| final static String TMP_FILE_PATH = "/data/local/tmp/"; |
| final static String HEVCDEC_BINARY = "testhevcdec"; |
| final static String AVCDEC_BINARY = "testavcdec"; |
| final static String MPEG2DEC_BINARY = "testmpeg2dec"; |
| |
| /*********************************************************** |
| To prevent merge conflicts, add HEVC decoder tests for N |
| below this comment, before any existing test methods |
| ***********************************************************/ |
| |
| @SecurityTest |
| public void testPocBug_73965867() throws Exception { |
| String inputFiles[] = {"bug_73965867.hevc"}; |
| runHevcDecodeTest(inputFiles, |
| "-i " + TMP_FILE_PATH + "bug_73965867.hevc", getDevice(), null); |
| } |
| |
| @SecurityTest |
| public void testPocBug_64380202() throws Exception { |
| String inputFiles[] = {"bug_64380202.hevc"}; |
| runHevcDecodeTest(inputFiles, "--input " + TMP_FILE_PATH |
| + "bug_64380202.hevc --num_frames -1 --num_cores 4", |
| getDevice(), null); |
| } |
| |
| @SecurityTest |
| public void testPocBug_64380403() throws Exception { |
| String inputFiles[] = {"bug_64380403.hevc"}; |
| runHevcDecodeTest(inputFiles, "--input " + TMP_FILE_PATH |
| + "bug_64380403.hevc --num_frames -1 --num_cores 4", |
| getDevice(), null); |
| } |
| |
| /*********************************************************** |
| To prevent merge conflicts, add HEVC decoder tests for O |
| below this comment, before any existing test methods |
| ***********************************************************/ |
| |
| |
| /*********************************************************** |
| To prevent merge conflicts, add AVC decoder tests for N |
| below this comment, before any existing test methods |
| ***********************************************************/ |
| |
| @SecurityTest |
| public void testPocBug_33621215() throws Exception { |
| String inputFiles[] = {"bug_33621215.h264"}; |
| runAvcDecodeTest(inputFiles, |
| "--input " + TMP_FILE_PATH |
| + "bug_33621215.h264 --output /dev/null", |
| getDevice(), null); |
| } |
| |
| /*********************************************************** |
| To prevent merge conflicts, add AVC decoder tests for O |
| below this comment, before any existing test methods |
| ***********************************************************/ |
| |
| |
| /*********************************************************** |
| To prevent merge conflicts, add MPEG2 decoder tests for N |
| below this comment, before any existing test methods |
| ***********************************************************/ |
| |
| @SecurityTest |
| public void testPocBug_34203195() throws Exception { |
| String inputFiles[] = {"bug_34203195.m2v"}; |
| runMpeg2DecodeTest(inputFiles, |
| "--input " + TMP_FILE_PATH + "bug_34203195.m2v --num_cores 2 " |
| + "--output /dev/null --num_frames -1", |
| getDevice(), null); |
| } |
| |
| @SecurityTest |
| public void testPocBug_37561455() throws Exception { |
| String inputFiles[] = {"bug_37561455.m2v"}; |
| runMpeg2DecodeTest(inputFiles, |
| "--input " + TMP_FILE_PATH |
| + "bug_37561455.m2v --output /dev/null --num_frames -1", |
| getDevice(), null); |
| } |
| |
| @SecurityTest |
| public void testPocBug_63316255() throws Exception { |
| String inputFiles[] = {"bug_63316255.m2v"}; |
| runMpeg2DecodeTest(inputFiles, |
| "--input " + TMP_FILE_PATH + "bug_63316255.m2v --num_frames -1", |
| getDevice(), null); |
| } |
| |
| /*********************************************************** |
| To prevent merge conflicts, add MPEG2 decoder tests for O |
| below this comment, before any existing test methods |
| ***********************************************************/ |
| |
| |
| /** |
| * Calls runDecodeTest with HEVC decoder binary name as argument |
| * |
| * @param inputFiles files required as input |
| * @param arguments arguments for running the binary |
| * @param device device to be run on |
| * @param errPattern error patterns to be checked for |
| */ |
| public static void runHevcDecodeTest(String inputFiles[], String arguments, |
| ITestDevice device, String errPattern[]) throws Exception { |
| runDecodeTest(HEVCDEC_BINARY, inputFiles, arguments, device, errPattern); |
| } |
| |
| /** |
| * Calls runDecodeTest with MPEG2 decoder binary name as argument |
| * |
| * @param inputFiles files required as input |
| * @param arguments arguments for running the binary |
| * @param device device to be run on |
| * @param errPattern error patterns to be checked for |
| */ |
| public static void runMpeg2DecodeTest(String inputFiles[], String arguments, |
| ITestDevice device, String errPattern[]) throws Exception { |
| runDecodeTest(MPEG2DEC_BINARY, inputFiles, arguments, device, errPattern); |
| } |
| |
| /** |
| * Calls runDecodeTest with AVC decoder binary name as argument |
| * |
| * @param inputFiles files required as input |
| * @param arguments arguments for running the binary |
| * @param device device to be run on |
| * @param errPattern error patterns to be checked for |
| */ |
| public static void runAvcDecodeTest(String inputFiles[], String arguments, |
| ITestDevice device, String errPattern[]) throws Exception { |
| runDecodeTest(AVCDEC_BINARY, inputFiles, arguments, device, errPattern); |
| } |
| |
| /** |
| * Checks for linker errors |
| * |
| * @param binaryName name of the decoder binary |
| * @param logcat String to be parsed |
| */ |
| public static boolean isLinkerErrorPresent(String binaryName, String logcat) |
| throws Exception { |
| return Pattern.compile(".*CANNOT LINK EXECUTABLE \"" |
| + TMP_FILE_PATH + binaryName + "\".*", |
| Pattern.MULTILINE).matcher(logcat).find(); |
| } |
| |
| /** |
| * Checks for codec crash |
| * |
| * @param binaryName Name of the decoder binary |
| * @param errPattern error patterns to be checked for |
| * @param logcat String to be parsed |
| */ |
| public static void checkCodecCrash(String binaryName, String errPattern[], |
| String logcat) throws Exception { |
| String genericCrashPattern[] = { |
| ".*name: " + binaryName + " >>> " + TMP_FILE_PATH + binaryName |
| + " <<<.*SIGABRT.*", |
| ".*name: " + binaryName + " >>> " + TMP_FILE_PATH + binaryName |
| + " <<<.*SIGSEGV.*"}; |
| AdbUtils.checkCrash(genericCrashPattern, logcat); |
| if (errPattern != null) { |
| AdbUtils.checkCrash(errPattern, logcat); |
| } |
| } |
| |
| /** |
| * Pushes input files, runs the PoC and checks for crash and hang |
| * |
| * @param binaryName name of the decoder binary |
| * @param inputFiles files required as input |
| * @param arguments arguments for running the binary |
| * @param device device to be run on |
| * @param errPattern error patterns to be checked for |
| */ |
| public static void runDecodeTest(String binaryName, String inputFiles[], |
| String arguments, ITestDevice device, String errPattern[]) |
| throws Exception { |
| if (inputFiles != null) { |
| for (int i = 0; i < inputFiles.length; i++) { |
| AdbUtils.pushResource(RESOURCE_ROOT + inputFiles[i], |
| TMP_FILE_PATH + inputFiles[i], device); |
| } |
| } |
| AdbUtils.runCommandLine("logcat -c", device); |
| AdbUtils.runWithTimeoutDeleteFiles(new Runnable() { |
| @Override |
| public void run() { |
| try { |
| AdbUtils.runPocNoOutput(binaryName, device, |
| TIMEOUT_SEC + 30, arguments); |
| } catch (Exception e) { |
| CLog.w("Exception: " + e.getMessage()); |
| } |
| } |
| }, TIMEOUT_SEC * 1000, device, inputFiles); |
| String logcatOut = AdbUtils.runCommandLine("logcat -d", device); |
| boolean linkerErrorFound = isLinkerErrorPresent(binaryName, logcatOut); |
| if (linkerErrorFound != true) { |
| checkCodecCrash(binaryName, errPattern, logcatOut); |
| } |
| } |
| } |