Add utility methods to Crash Parser

Also update the filtering implementation to be cleaner and easier to read.

* add process name to Crash.java
* detect crashes on process regex instead of thread name
* add the crash blob string to Crash.java
* add matchSecurityCrashes() to CrashUtils.java
* use BigInteger instead of long to correctly compare 64-bit addresses
* update unit tests

Bug: 133329166
Test: cts/run_unit_tests.sh

Change-Id: I904f82a3a2c3467c603d7bad19606280312a5e45
Merged-In: I904f82a3a2c3467c603d7bad19606280312a5e45
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 768d07b..c8a7dfe 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
@@ -34,6 +34,7 @@
 import java.nio.file.Path;
 import java.nio.file.attribute.PosixFilePermissions;
 import java.util.regex.Matcher;
+import java.util.List;
 import java.util.ArrayList;
 
 /**
@@ -45,7 +46,7 @@
     private BackgroundDeviceAction mBackgroundThread;
 
     /** Uploads the current buffer of Crashes to the phone under the current test name. */
-    private static void upload(ITestDevice device, String testname, ArrayList<Crash> crashes) {
+    private static void upload(ITestDevice device, String testname, List<Crash> crashes) {
         try {
             if (testname == null) {
                 CLog.logAndDisplay(LogLevel.ERROR, "Attempted upload with no test name");
@@ -113,7 +114,7 @@
     private class CrashReporterReceiver extends MultiLineReceiver {
 
         private String mTestName;
-        private ArrayList<Crash> mCrashes;
+        private List<Crash> mCrashes;
         private StringBuilder mLogcatChunk;
         private ITestDevice mDevice;
 
diff --git a/common/util/src/com/android/compatibility/common/util/Crash.java b/common/util/src/com/android/compatibility/common/util/Crash.java
index 190ec39..0c55400 100644
--- a/common/util/src/com/android/compatibility/common/util/Crash.java
+++ b/common/util/src/com/android/compatibility/common/util/Crash.java
@@ -16,28 +16,39 @@
 
 package com.android.compatibility.common.util;
 
-import java.util.Objects;
-import java.io.Serializable;
 import javax.annotation.Nullable;
+import java.io.Serializable;
+import java.util.Objects;
+import java.math.BigInteger;
 
 public class Crash implements Serializable {
 
     public static final long serialVersionUID = 42L;
+
     public final int pid;
     public final int tid;
-    @Nullable
-    public final String name;
-    @Nullable
-    public final Long faultAddress;
-    @Nullable
+    public final String threadName;
+    public final String process;
+    @Nullable // the fault address is not always present in the log
+    public final BigInteger faultAddress;
     public final String signal;
+    @Nullable
+    public final String crashString;
 
-    public Crash(int pid, int tid, String name, Long faultAddress, String signal) {
+    public Crash(int pid, int tid, String threadName, String process,
+            BigInteger faultAddress, String signal) {
+        this(pid, tid, threadName, process, faultAddress, signal, null);
+    }
+
+    public Crash(int pid, int tid, String threadName, String process,
+            BigInteger faultAddress, String signal, String crashString) {
         this.pid = pid;
         this.tid = tid;
-        this.name = name;
+        this.threadName = threadName;
+        this.process = process;
         this.faultAddress = faultAddress;
         this.signal = signal;
+        this.crashString = crashString;
     }
 
     @Override
@@ -45,8 +56,10 @@
         return "Crash{" +
             "pid=" + pid +
             ", tid=" + tid +
-            ", name=" + name +
-            ", faultAddress=" + faultAddress +
+            ", threadName=" + threadName +
+            ", process=" + process +
+            ", faultAddress=" +
+                    (faultAddress == null ? "--------" : "0x" + faultAddress.toString(16)) +
             ", signal=" + signal +
             '}';
     }
@@ -62,13 +75,14 @@
         Crash crash = (Crash) object;
         return pid == crash.pid &&
             tid == crash.tid &&
-            Objects.equals(name, crash.name) &&
+            Objects.equals(threadName, crash.threadName) &&
+            Objects.equals(process, crash.process) &&
             Objects.equals(faultAddress, crash.faultAddress) &&
             Objects.equals(signal, crash.signal);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(pid, tid, name, faultAddress, signal);
+        return Objects.hash(pid, tid, threadName, process, faultAddress, signal);
     }
-}
\ No newline at end of file
+}
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 715e43d..93d2d2d 100644
--- a/common/util/src/com/android/compatibility/common/util/CrashUtils.java
+++ b/common/util/src/com/android/compatibility/common/util/CrashUtils.java
@@ -16,15 +16,23 @@
 
 package com.android.compatibility.common.util;
 
+import java.io.File;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
+import java.util.Set;
+import java.util.HashSet;
+import java.util.stream.Stream;
+import java.util.stream.Collectors;
+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 long MIN_CRASH_ADDR = 0x8000;
+    public static final BigInteger MIN_CRASH_ADDR = new BigInteger("8000", 16);
+
     // Matches the end of a crash
     public static final Pattern sEndofCrashPattern =
             Pattern.compile("DEBUG\\s+?:\\s+?backtrace:");
@@ -52,42 +60,62 @@
             Pattern.compile("(?i)Abort message.*?CHECK_");
 
     /**
+     * returns true if the signal is a segmentation fault or bus error.
+     */
+    public static boolean isSecuritySignal(Crash c) {
+        return c.signal.toLowerCase().matches("sig(segv|bus)");
+    }
+
+    /**
+     * returns the filename of the process.
+     * e.g. "/system/bin/mediaserver" returns "mediaserver"
+     */
+    public static String getProcessFileName(Crash c) {
+        return new File(c.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, List<Crash> crashes) {
-        for (Crash crash : crashes) {
-            if (!crash.signal.toLowerCase().matches("sig(segv|bus)")) {
-                continue;
-            }
+    public static boolean securityCrashDetected(
+            List<Crash> crashes, boolean checkMinAddr, Pattern... processPatterns) {
+        return !matchSecurityCrashes(crashes, checkMinAddr, processPatterns).isEmpty();
+    }
 
-            if (checkMinAddr) {
-                if (crash.faultAddress != null && crash.faultAddress < MIN_CRASH_ADDR) {
-                    continue;
-                }
-            }
+    /**
+     * 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 List<Crash> matchSecurityCrashes(
+            List<Crash> crashes, boolean checkMinAddr, Pattern... processPatterns) {
+        return crashes.stream()
+            .filter(c -> matchesAny(getProcessFileName(c), processPatterns))
+            .filter(c -> isSecuritySignal(c))
+            .filter(c -> !checkMinAddr
+                    || c.faultAddress == null || c.faultAddress.compareTo(MIN_CRASH_ADDR) >= 0)
+            .collect(Collectors.toList());
+    }
 
-            boolean foundProcess = false;
-            for (String process : processNames) {
-                if (crash.name.equals(process)) {
-                    foundProcess = true;
-                    break;
-                }
+    /**
+     * 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;
             }
-
-            if (!foundProcess) {
-                continue;
-            }
-
-            return true; // crash detected
         }
-
         return false;
     }
 
@@ -97,26 +125,28 @@
      * @param input logs to scan through
      * @return List of all crashes as Crash objects
      */
-    public static ArrayList<Crash> getAllCrashes(String input) {
-        ArrayList<Crash> crashes = new ArrayList<>();
+    public static List<Crash> getAllCrashes(String input) {
+        List<Crash> crashes = new ArrayList<>();
         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);
@@ -125,13 +155,12 @@
                 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()) {
-                crashes.add(new Crash(pid, tid, name, faultAddress, signal));
+                crashes.add(new Crash(pid, tid, name, process, faultAddress, signal, crashStr));
             }
         }
 
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 431571eb..6a2ab6e 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
@@ -25,6 +25,8 @@
 import java.io.InputStreamReader;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.regex.Pattern;
+import java.math.BigInteger;
 
 import junit.framework.TestCase;
 
@@ -60,52 +62,67 @@
     @Test
     public void testGetAllCrashes() throws Exception {
         List<Crash> expectedResults = new ArrayList<>();
-        expectedResults.add(new Crash(11071, 11189, "AudioOut_D", 3912761344L, "SIGSEGV"));
-        expectedResults.add(new Crash(12736, 12761, "Binder:12736_2", 0L, "SIGSEGV"));
-        expectedResults.add(new Crash(26201, 26227, "Binder:26201_3", 0L, "SIGSEGV"));
-        expectedResults.add(new Crash(26246, 26282, "Binder:26246_5", 0L, "SIGSEGV"));
-        expectedResults.add(new Crash(245, 245, "installd", null, "SIGABRT"));
-        expectedResults.add(new Crash(6371, 8072, "media.codec", 3976200192L, "SIGSEGV"));
-        expectedResults.add(new Crash(8373, 8414, "loo", null, "SIGABRT"));
+        expectedResults.add(new Crash(11071, 11189, "AudioOut_D", "/system/bin/audioserver",
+                new BigInteger("e9380000", 16), "SIGSEGV"));
+        expectedResults.add(new Crash(12736, 12761, "Binder:12736_2", "/system/bin/audioserver",
+                new BigInteger("0", 16), "SIGSEGV"));
+        expectedResults.add(new Crash(26201, 26227, "Binder:26201_3", "/system/bin/audioserver",
+                new BigInteger("0", 16), "SIGSEGV"));
+        expectedResults.add(new Crash(26246, 26282, "Binder:26246_5", "/system/bin/audioserver",
+                new BigInteger("0", 16), "SIGSEGV"));
+        expectedResults.add(new Crash(245, 245, "installd", "/system/bin/installd",
+                null, "SIGABRT"));
+        expectedResults.add(new Crash(6371, 8072, "media.codec", "omx@1.0-service",
+                new BigInteger("ed000000", 16), "SIGSEGV"));
+        expectedResults.add(new Crash(8373, 8414, "loo", "com.android.bluetooth",
+                null, "SIGABRT"));
+        expectedResults.add(new Crash(11071, 11189, "synthetic_thread", "synthetic_process_0",
+                new BigInteger("e9380000", 16), "SIGSEGV"));
+        expectedResults.add(new Crash(12736, 12761, "synthetic_thread", "synthetic_process_1",
+                new BigInteger("0", 16), "SIGSEGV"));
 
         assertEquals(expectedResults, mCrashes);
     }
 
     @Test
     public void testValidCrash() throws Exception {
-        assertTrue(CrashUtils.detectCrash(new String[]{"AudioOut_D"}, true, mCrashes));
+        assertTrue(CrashUtils.securityCrashDetected(mCrashes, true,
+                Pattern.compile("synthetic_process_0")));
     }
 
     @Test
     public void testMissingName() throws Exception {
-        assertFalse(CrashUtils.detectCrash(new String[]{""}, true, mCrashes));
+        assertFalse(CrashUtils.securityCrashDetected(mCrashes, true,
+                Pattern.compile("")));
     }
 
     @Test
     public void testSIGABRT() throws Exception {
-        assertFalse(CrashUtils.detectCrash(new String[]{"installd"}, true, mCrashes));
+        assertFalse(CrashUtils.securityCrashDetected(mCrashes, true,
+                Pattern.compile("installd")));
     }
 
     @Test
     public void testFaultAddressBelowMin() throws Exception {
-        assertFalse(
-            CrashUtils.detectCrash(new String[]{"Binder:12736_2"}, true, mCrashes));
+        assertFalse(CrashUtils.securityCrashDetected(mCrashes, true,
+                Pattern.compile("synthetic_process_1")));
     }
 
     @Test
     public void testIgnoreMinAddressCheck() throws Exception {
-        assertTrue(
-            CrashUtils.detectCrash(new String[]{"Binder:12736_2"}, false, mCrashes));
+        assertTrue(CrashUtils.securityCrashDetected(mCrashes, false,
+                Pattern.compile("synthetic_process_1")));
     }
 
     @Test
     public void testBadAbortMessage() throws Exception {
-        assertFalse(CrashUtils.detectCrash(new String[]{"generic"}, true, mCrashes));
+        assertFalse(CrashUtils.securityCrashDetected(mCrashes, true,
+                Pattern.compile("generic")));
     }
 
     @Test
     public void testGoodAndBadCrashes() throws Exception {
-        assertTrue(
-            CrashUtils.detectCrash(new String[]{"AudioOut_D", "generic"}, true, mCrashes));
+        assertTrue(CrashUtils.securityCrashDetected(mCrashes, true,
+                Pattern.compile("synthetic_process_0"), Pattern.compile("generic")));
     }
-}
\ No newline at end of file
+}