Separate kernel and partial wakelock parsing

In some bugreports kernel wakelock section is missing. This prevents
parsing of partial wakelock as well. So this fix is to separate kernel
and partial wakelock parsing

Change-Id: I196dcd9438976cb5d3fcd3b0a81839903aebac15
diff --git a/src/com/android/loganalysis/parser/BatteryStatsDetailedInfoParser.java b/src/com/android/loganalysis/parser/BatteryStatsDetailedInfoParser.java
index b800371..85188a4 100644
--- a/src/com/android/loganalysis/parser/BatteryStatsDetailedInfoParser.java
+++ b/src/com/android/loganalysis/parser/BatteryStatsDetailedInfoParser.java
@@ -34,7 +34,8 @@
 public class BatteryStatsDetailedInfoParser extends AbstractSectionParser {
 
     private static final String BATTERY_USAGE_SECTION_REGEX = "^\\s*Estimated power use \\(mAh\\):$";
-    private static final String WAKELOCK_SECTION_REGEX = "^\\s*All kernel wake locks:$";
+    private static final String KERNEL_WAKELOCK_SECTION_REGEX = "^\\s*All kernel wake locks:$";
+    private static final String PARTIAL_WAKELOCK_SECTION_REGEX = "^\\s*All partial wake locks:$";
     private static final String INTERRUPT_SECTION_REGEX = "^\\s*All wakeup reasons:$";
     private static final String PROCESS_USAGE_SECTION_REGEX = "^\\s*0:$";
 
@@ -127,7 +128,8 @@
     protected void setup() {
         setParser(mBatteryTimeParser);
         addSectionParser(mBatteryUsageParser, BATTERY_USAGE_SECTION_REGEX);
-        addSectionParser(mWakelockParser, WAKELOCK_SECTION_REGEX);
+        addSectionParser(mWakelockParser, KERNEL_WAKELOCK_SECTION_REGEX);
+        addSectionParser(mWakelockParser, PARTIAL_WAKELOCK_SECTION_REGEX);
         addSectionParser(mInterruptParser, INTERRUPT_SECTION_REGEX);
         addSectionParser(mProcessUsageParser, PROCESS_USAGE_SECTION_REGEX);
     }
diff --git a/src/com/android/loganalysis/parser/WakelockParser.java b/src/com/android/loganalysis/parser/WakelockParser.java
index 91652f7..a7db455 100644
--- a/src/com/android/loganalysis/parser/WakelockParser.java
+++ b/src/com/android/loganalysis/parser/WakelockParser.java
@@ -28,9 +28,6 @@
  */
 public class WakelockParser implements IParser {
 
-    private static final Pattern PARTIAL_WAKE_LOCK_START_PAT = Pattern.compile(
-            "^\\s*All partial wake locks:$");
-
     private static final String WAKE_LOCK_PAT_SUFFIX =
             "(?:(\\d+)d)?\\s?(?:(\\d+)h)?\\s?(?:(\\d+)m)?\\s?(?:(\\d+)s)?\\s?(?:(\\d+)ms)?"
             + "\\s?\\((\\d+) times\\) realtime";
@@ -57,21 +54,14 @@
      */
     @Override
     public WakelockItem parse(List<String> lines) {
-        boolean inPartialWakeLock = false;
         Matcher m = null;
         int wakelockCounter = 0;
         for (String line : lines) {
             if ("".equals(line.trim())) {
-                if (inPartialWakeLock) {
-                    // Done with parsing wakelock sections
-                    break;
-                } else {
-                    // Done with parsing kernel wakelocks and continue with
-                    // partial wakelock
-                    wakelockCounter = 0;
-                    continue;
-                }
+                // Done with wakelock parsing
+                break;
             }
+
             m = KERNEL_WAKE_LOCK_PAT.matcher(line);
             if (m.matches()) {
                 if (wakelockCounter < TOP_WAKELOCK_COUNT &&
@@ -81,11 +71,6 @@
                 }
                 continue;
             }
-            m = PARTIAL_WAKE_LOCK_START_PAT.matcher(line);
-            if (m.matches()) {
-                inPartialWakeLock = true;
-                continue;
-            }
             m = PARTIAL_WAKE_LOCK_PAT.matcher(line);
             if (m.matches() && wakelockCounter < TOP_WAKELOCK_COUNT) {
                 parsePartialWakeLock(line, WakeLockCategory.PARTIAL_WAKELOCK);
diff --git a/tests/src/com/android/loganalysis/parser/BugreportParserTest.java b/tests/src/com/android/loganalysis/parser/BugreportParserTest.java
index ea7537f..b36e834 100644
--- a/tests/src/com/android/loganalysis/parser/BugreportParserTest.java
+++ b/tests/src/com/android/loganalysis/parser/BugreportParserTest.java
@@ -124,7 +124,7 @@
                 "          +45s702ms (2) 001 80080000 volt=4187",
                 "          +1m15s525ms (2) 001 80080000 temp=299 volt=4155",
                 "Statistics since last charged:",
-                "  Time on battery: 1h 5m 2s 4ms (9%) realtime, 1h 5m 2s 4ms (9%) uptime", 
+                "  Time on battery: 1h 5m 2s 4ms (9%) realtime, 1h 5m 2s 4ms (9%) uptime",
                 " Time on battery screen off: 1h 4m 5s 8ms (9%) realtime, 1h 4m 5s 8ms (9%) uptime",
                 " All kernel wake locks:",
                 " Kernel Wake lock PowerManagerService.WakeLocks: 5m 10s 6ms (2 times) realtime",
@@ -133,8 +133,9 @@
                 "  All partial wake locks:",
                 "  Wake lock 1001 ProxyController: 1h 4m 47s 565ms (4 times) realtime",
                 "  Wake lock 1013 AudioMix: 1s 979ms (3 times) realtime",
+                "",
                 "  All wakeup reasons:",
-                "  Wakeup reason 2:bcmsdh_sdmmc:2:qcom,smd:2:msmgio: 1m 5s 4ms (2 times) realtime", 
+                "  Wakeup reason 2:bcmsdh_sdmmc:2:qcom,smd:2:msmgio: 1m 5s 4ms (2 times) realtime",
                 "  Wakeup reason 2:qcom,smd-rpm:2:fc4c.qcom,spmi: 7m 1s 914ms (7 times) realtime",
                 "");
 
diff --git a/tests/src/com/android/loganalysis/parser/WakelockParserTest.java b/tests/src/com/android/loganalysis/parser/WakelockParserTest.java
index bed831b..735362f 100644
--- a/tests/src/com/android/loganalysis/parser/WakelockParserTest.java
+++ b/tests/src/com/android/loganalysis/parser/WakelockParserTest.java
@@ -31,7 +31,7 @@
     /**
      * Test that normal input is parsed.
      */
-    public void testWakelockParser() {
+    public void testKernelWakelockParser() {
         List<String> inputBlock = Arrays.asList(
                " All kernel wake locks:",
                " Kernel Wake lock PowerManagerService.WakeLocks: 1h 3m 50s 5ms (8 times) realtime",
@@ -40,14 +40,8 @@
                " Kernel Wake lock wlan_rx_wake: 3m 19s 887ms (225 times) realtime",
                " Kernel Wake lock wlan_tx_wake: 2m 19s 887ms (225 times) realtime",
                " Kernel Wake lock tx_wake: 1m 19s 887ms (225 times) realtime",
-               " ",
-               " All partial wake locks:",
-               " Wake lock u0a7 NlpWakeLock: 8m 13s 203ms (1479 times) realtime",
-               " Wake lock u0a7 NlpCollectorWakeLock: 6m 29s 18ms (238 times) realtime",
-               " Wake lock u0a7 GCM_CONN_ALARM: 6m 8s 587ms (239 times) realtime",
-               " Wake lock 1000 *alarm*: 5m 11s 316ms (1469 times) realtime",
-               " Wake lock u10 xxx: 4m 11s 316ms (1469 times) realtime",
-               " Wake lock u30 cst: 2m 11s 316ms (1469 times) realtime");
+               " "
+              );
 
         WakelockItem wakelock = new WakelockParser().parse(inputBlock);
 
@@ -59,6 +53,20 @@
                 get(0).getHeldTime());
         assertEquals(2399, wakelock.getWakeLocks(WakeLockCategory.KERNEL_WAKELOCK).
                 get(0).getLockedCount());
+    }
+
+    public void testPartialWakelockParser() {
+        List<String> inputBlock = Arrays.asList(
+                " All partial wake locks:",
+                " Wake lock u0a7 NlpWakeLock: 8m 13s 203ms (1479 times) realtime",
+                " Wake lock u0a7 NlpCollectorWakeLock: 6m 29s 18ms (238 times) realtime",
+                " Wake lock u0a7 GCM_CONN_ALARM: 6m 8s 587ms (239 times) realtime",
+                " Wake lock 1000 *alarm*: 5m 11s 316ms (1469 times) realtime",
+                " Wake lock u10 xxx: 4m 11s 316ms (1469 times) realtime",
+                " Wake lock u30 cst: 2m 11s 316ms (1469 times) realtime",
+                "");
+
+        WakelockItem wakelock = new WakelockParser().parse(inputBlock);
 
         assertEquals(WakelockParser.TOP_WAKELOCK_COUNT,
                 wakelock.getWakeLocks(WakeLockCategory.PARTIAL_WAKELOCK).size());
@@ -71,5 +79,24 @@
         assertEquals(1479, wakelock.getWakeLocks(WakeLockCategory.PARTIAL_WAKELOCK).
                 get(0).getLockedCount());
     }
+
+    public void testInvalidInputWakelockParser() {
+        List<String> inputBlock = Arrays.asList(
+             " lock PowerManagerService.WakeLocks: 1h 3m 50s 5ms (8 times) realtime",
+             " lock event0-2656 : 3m 49s 268ms (2399 times) realtime",
+             " lock wlan_wd_wake: 3m 34s 639ms (1751 times) realtime",
+             " lock wlan_rx_wake: 3m 19s 887ms (225 times) realtime",
+             " wlan_tx_wake: 2m 19s 887ms (225 times) realtime",
+             " tx_wake: 1m 19s 887ms (225 times) realtime",
+             " "
+            );
+
+        WakelockItem wakelock = new WakelockParser().parse(inputBlock);
+
+        assertEquals(0,
+                wakelock.getWakeLocks(WakeLockCategory.KERNEL_WAKELOCK).size());
+        assertEquals(0,
+                wakelock.getWakeLocks(WakeLockCategory.PARTIAL_WAKELOCK).size());
+    }
 }