summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxim Siniavine <siniavine@google.com>2015-03-30 16:08:36 -0700
committerMaxim Siniavine <siniavine@google.com>2015-03-30 16:08:36 -0700
commitce2941c2e70b3444824f0cfe2883f4b77ad93542 (patch)
treecbdbe8e688a0a72b52fc997ece5f0326972fec98
parent3c61512f540ec74f0ebda2567725b445f7c873f5 (diff)
downloadloganalysis-ce2941c2e70b3444824f0cfe2883f4b77ad93542.tar.gz
Generate a kernel reset event if reboot reson could not be determined.
BUG: 19963847 Change-Id: I9e380ecba32313e1f423b5af192acf0010487730
-rw-r--r--src/com/android/loganalysis/parser/KernelLogParser.java27
-rw-r--r--tests/src/com/android/loganalysis/parser/KernelLogParserTest.java36
2 files changed, 62 insertions, 1 deletions
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 class KernelLogParser implements IParser {
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 @@ public class KernelLogParser implements IParser {
private LogPatternUtil mPatternUtil = new LogPatternUtil();
private LogTailUtil mPreambleUtil = new LogTailUtil(500, 50, 50);
+ private boolean mRebootReasonFound = false;
public KernelLogParser() {
initPatterns();
@@ -85,6 +87,7 @@ public class KernelLogParser implements IParser {
*/
@Override
public KernelLogItem parse(List<String> lines) {
+ mRebootReasonFound = false;
for (String line : lines) {
parseLine(line);
}
@@ -132,6 +135,14 @@ public class KernelLogParser implements IParser {
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 @@ public class KernelLogParser implements IParser {
}
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 @@ public class KernelLogParser implements IParser {
"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 @@ public class KernelLogParserTest extends TestCase {
}
/**
+ * 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 @@ public class KernelLogParserTest extends TestCase {
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());