Merge "Battery drain investigator"
diff --git a/src/com/android/loganalysis/parser/KernelLogParser.java b/src/com/android/loganalysis/parser/KernelLogParser.java
index 741c261..b4b3b21 100644
--- a/src/com/android/loganalysis/parser/KernelLogParser.java
+++ b/src/com/android/loganalysis/parser/KernelLogParser.java
@@ -34,6 +34,7 @@
public static final String KERNEL_RESET = "KERNEL_RESET";
public static final String KERNEL_ERROR = "KERNEL_ERROR";
public static final String SELINUX_DENIAL = "SELINUX_DENIAL";
+ public static final String NORMAL_REBOOT = "NORMAL_REBOOT";
/**
* Matches: [ 0.000000] Message<br />
@@ -57,6 +58,7 @@
private LogPatternUtil mPatternUtil = new LogPatternUtil();
private LogTailUtil mPreambleUtil = new LogTailUtil(500, 50, 50);
+ private boolean mRebootReasonFound = false;
public KernelLogParser() {
initPatterns();
@@ -85,6 +87,7 @@
*/
@Override
public KernelLogItem parse(List<String> lines) {
+ mRebootReasonFound = false;
for (String line : lines) {
parseLine(line);
}
@@ -132,6 +135,14 @@
return;
}
+ if (category.equals(KERNEL_RESET) || category.equals(NORMAL_REBOOT)) {
+ mRebootReasonFound = true;
+ }
+
+ if (category.equals(NORMAL_REBOOT)) {
+ return;
+ }
+
MiscKernelLogItem kernelLogItem;
if (category.equals(SELINUX_DENIAL)) {
SELinuxItem selinuxItem = new SELinuxItem();
@@ -159,6 +170,14 @@
}
mKernelLog.setStartTime(mStartTime);
mKernelLog.setStopTime(mStopTime);
+
+ if (!mRebootReasonFound) {
+ MiscKernelLogItem unknownReset = new MiscKernelLogItem();
+ unknownReset.setEventTime(mStopTime);
+ unknownReset.setPreamble(mPreambleUtil.getLastTail());
+ unknownReset.setCategory(KERNEL_RESET);
+ mKernelLog.addEvent(unknownReset);
+ }
}
private void initPatterns() {
@@ -181,9 +200,17 @@
"Last boot reason: " + BAD_BOOTREASONS,
"Last reset was system watchdog timer reset.*",
};
+ final String[] goodSignatures = {
+ "Restarting system.*",
+ "Power down.*",
+ "Last boot reason: (?:PowerKey|normal|recovery|reboot)",
+ };
for (String pattern : kernelResets) {
mPatternUtil.addPattern(Pattern.compile(pattern), KERNEL_RESET);
}
+ for (String pattern : goodSignatures) {
+ mPatternUtil.addPattern(Pattern.compile(pattern), NORMAL_REBOOT);
+ }
mPatternUtil.addPattern(Pattern.compile("Internal error:.*"), KERNEL_ERROR);
diff --git a/tests/src/com/android/loganalysis/parser/KernelLogParserTest.java b/tests/src/com/android/loganalysis/parser/KernelLogParserTest.java
index 890a196..0f554ec 100644
--- a/tests/src/com/android/loganalysis/parser/KernelLogParserTest.java
+++ b/tests/src/com/android/loganalysis/parser/KernelLogParserTest.java
@@ -96,6 +96,40 @@
}
/**
+ * Test that unknown last boot reasons are parsed.
+ */
+ public void testParseUnknownLastMessage() {
+ List<String> lines = Arrays.asList(
+ "[ 0.000000] Start",
+ "[ 2.000000] End",
+ "Last boot reason: unknown failure");
+
+ KernelLogItem kernelLog = new KernelLogParser().parse(lines);
+ assertNotNull(kernelLog);
+ assertEquals(0.0, kernelLog.getStartTime(), 0.0000005);
+ assertEquals(2.0, kernelLog.getStopTime(), 0.0000005);
+ assertEquals(1, kernelLog.getEvents().size());
+ assertEquals(1, kernelLog.getMiscEvents(KernelLogParser.KERNEL_RESET).size());
+
+ MiscKernelLogItem item = kernelLog.getMiscEvents(KernelLogParser.KERNEL_RESET).get(0);
+ assertEquals(2.0, item.getEventTime(), 0.0000005);
+ assertEquals("[ 0.000000] Start\n[ 2.000000] End", item.getPreamble());
+ }
+
+ public void testParseKnownGoodLastMessage() {
+ List<String> lines = Arrays.asList(
+ "[ 0.000000] Start",
+ "[ 2.000000] End",
+ "Last boot reason: reboot");
+
+ KernelLogItem kernelLog = new KernelLogParser().parse(lines);
+ assertNotNull(kernelLog);
+ assertEquals(0.0, kernelLog.getStartTime(), 0.0000005);
+ assertEquals(2.0, kernelLog.getStopTime(), 0.0000005);
+ assertEquals(0, kernelLog.getEvents().size());
+ }
+
+ /**
* Test that reset reasons don't crash if times are set.
*/
public void testNoPreviousLogs() {
@@ -183,7 +217,7 @@
assertNotNull(kernelLog);
assertEquals(0.0, kernelLog.getStartTime(), 0.0000005);
assertEquals(43.399164, kernelLog.getStopTime(), 0.0000005);
- assertEquals(1, kernelLog.getEvents().size());
+ assertEquals(2, kernelLog.getEvents().size());
assertEquals(1, kernelLog.getMiscEvents(KernelLogParser.SELINUX_DENIAL).size());
assertEquals(1, kernelLog.getSELinuxEvents().size());