diff options
Diffstat (limited to 'tests/src/com/android/loganalysis/parser/DmesgParserTest.java')
-rw-r--r-- | tests/src/com/android/loganalysis/parser/DmesgParserTest.java | 231 |
1 files changed, 151 insertions, 80 deletions
diff --git a/tests/src/com/android/loganalysis/parser/DmesgParserTest.java b/tests/src/com/android/loganalysis/parser/DmesgParserTest.java index 9374c41..de3850a 100644 --- a/tests/src/com/android/loganalysis/parser/DmesgParserTest.java +++ b/tests/src/com/android/loganalysis/parser/DmesgParserTest.java @@ -16,18 +16,16 @@ package com.android.loganalysis.parser; -import com.android.loganalysis.item.ServiceInfoItem; - +import com.android.loganalysis.item.DmesgActionInfoItem; +import com.android.loganalysis.item.DmesgServiceInfoItem; +import com.android.loganalysis.item.DmesgStageInfoItem; import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileWriter; +import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStreamReader; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; - import junit.framework.TestCase; /** @@ -37,140 +35,213 @@ public class DmesgParserTest extends TestCase { private static final String BOOT_ANIMATION = "bootanim"; private static final String NETD = "netd"; - private static final String DMESG_LOG = "dmesg_logs"; - - private File mTempFile = null; /** * Test for empty dmesg logs passed to the DmesgParser */ public void testEmptyDmesgLog() throws IOException { - List<String> lines = Arrays.asList(""); - File testFile = getTempFile(lines); - BufferedReader bufferedReader = new BufferedReader(readInputBuffer(testFile)); - List<ServiceInfoItem> serviceItems = (new DmesgParser()). - parseServiceInfo(bufferedReader); - assertEquals("Service info items list should be empty", 0, serviceItems.size()); - bufferedReader.close(); - testFile.delete(); + String[] lines = new String[] {""}; + try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader( + new ByteArrayInputStream(String.join("\n", lines).getBytes())))) { + DmesgParser dmesgParser = new DmesgParser(); + dmesgParser.parseInfo(bufferedReader); + assertEquals("Service info items list should be empty", 0, + dmesgParser.getServiceInfoItems().size()); + } + } + + /** + * Test for complete dmesg logs + */ + public void testCompleteDmesgLog() throws IOException { + String[] lines = new String[] { + "[ 22.962730] init: starting service 'bootanim'...", + "[ 23.252321] init: starting service 'netd'...", + "[ 29.331069] ipa-wan ipa_wwan_ioctl:1428 dev(rmnet_data0) register to IPA", + "[ 32.182592] ueventd: fixup /sys/devices/virtual/input/poll_delay 0 1004 660", + "[ 35.642666] SELinux: initialized (dev fuse, type fuse), uses genfs_contexts", + "[ 39.855818] init: Service 'bootanim' (pid 588) exited with status 0", + "[ 41.665818] init: init first stage started!", + "[ 42.425056] init: init second stage started!", + "[ 44.942872] init: processing action (early-init)", + "[ 47.233446] init: processing action (set_mmap_rnd_bits)", + "[ 47.240083] init: processing action (set_kptr_restrict)", + "[ 47.245778] init: processing action (keychord_init)", + "[ 52.361049] init: processing action (persist.sys.usb.config=* boot)", + "[ 52.361108] init: processing action (enable_property_trigger)", + "[ 52.361313] init: processing action (security.perf_harden=1)", + "[ 52.361495] init: processing action (ro.debuggable=1)", + "[ 52.962730] init: starting service 'bootanim'...", + "[ 59.331069] ipa-wan ipa_wwan_ioctl:1428 dev(rmnet_data0) register to IPA", + "[ 62.182592] ueventd: fixup /sys/devices/virtual/input/poll_delay 0 1004 660", + "[ 65.642666] SELinux: initialized (dev fuse, type fuse), uses genfs_contexts", + "[ 69.855818] init: Service 'bootanim' (pid 588) exited with status 0"}; + try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader( + new ByteArrayInputStream(String.join("\n", lines).getBytes())))) { + DmesgParser dmesgParser = new DmesgParser(); + dmesgParser.parseInfo(bufferedReader); + assertEquals("Service info items list size should be 2", 2, + dmesgParser.getServiceInfoItems().size()); + assertEquals("Stage info items list size should be 2", 2, + dmesgParser.getStageInfoItems().size()); + assertEquals("Action info items list size should be 5", 5, + dmesgParser.getActionInfoItems().size()); + } } /** * Test service which logs both the start and end time */ - public void testCompleteServiceInfo() throws IOException { - List<String> lines = Arrays.asList( + public void testCompleteServiceInfo() { + String[] lines = new String[] { "[ 22.962730] init: starting service 'bootanim'...", "[ 29.331069] ipa-wan ipa_wwan_ioctl:1428 dev(rmnet_data0) register to IPA", "[ 32.182592] ueventd: fixup /sys/devices/virtual/input/poll_delay 0 1004 660", "[ 35.642666] SELinux: initialized (dev fuse, type fuse), uses genfs_contexts", - "[ 39.855818] init: Service 'bootanim' (pid 588) exited with status 0"); - File testFile = getTempFile(lines); - BufferedReader bufferedReader = new BufferedReader(readInputBuffer(testFile)); - List<ServiceInfoItem> serviceInfoItems = (new DmesgParser()). - parseServiceInfo(bufferedReader); - assertEquals("There should be atleast one service info", 1, - serviceInfoItems.size()); + "[ 39.855818] init: Service 'bootanim' (pid 588) exited with status 0"}; + DmesgParser dmesgParser = new DmesgParser(); + for (String line : lines) { + dmesgParser.parseServiceInfo(line); + } + List<DmesgServiceInfoItem> serviceInfoItems = new ArrayList<>( + dmesgParser.getServiceInfoItems().values()); + assertEquals("There should be atleast one service info", 1, serviceInfoItems.size()); assertEquals("Service name is not boot anim", BOOT_ANIMATION, serviceInfoItems.get(0).getServiceName()); - assertEquals("Service start time is not correct", new Long(22962), serviceInfoItems.get(0) - .getStartTime()); + assertEquals("Service start time is not correct", new Long(22962), + serviceInfoItems.get(0) + .getStartTime()); assertEquals("Service end time is not correct", new Long(39855), serviceInfoItems.get(0) .getEndTime()); - assertEquals("Service duration is nott correct", new Long(16893), serviceInfoItems.get(0) - .getServiceDuration()); - bufferedReader.close(); - testFile.delete(); + assertEquals("Service duration is nott correct", new Long(16893), + serviceInfoItems.get(0) + .getServiceDuration()); } /** * Test service which logs only the start time */ - public void testStartServiceInfo() throws IOException { - List<String> lines = Arrays.asList( + public void testStartServiceInfo() { + String[] lines = new String[] { "[ 23.252321] init: starting service 'netd'...", "[ 29.331069] ipa-wan ipa_wwan_ioctl:1428 dev(rmnet_data0) register to IPA", "[ 32.182592] ueventd: fixup /sys/devices/virtual/input/poll_delay 0 1004 660", - "[ 35.642666] SELinux: initialized (dev fuse, type fuse), uses genfs_contexts"); - File testFile = getTempFile(lines); - BufferedReader bufferedReader = new BufferedReader(readInputBuffer(testFile)); - List<ServiceInfoItem> serviceInfoItems = (new DmesgParser()). - parseServiceInfo(bufferedReader); - assertEquals("There should be exactly one service info", 1, - serviceInfoItems.size()); - assertEquals("Service name is not netd", NETD, - serviceInfoItems.get(0).getServiceName()); - bufferedReader.close(); - testFile.delete(); + "[ 35.642666] SELinux: initialized (dev fuse, type fuse), uses genfs_contexts"}; + DmesgParser dmesgParser = new DmesgParser(); + for (String line : lines) { + dmesgParser.parseServiceInfo(line); + } + List<DmesgServiceInfoItem> serviceInfoItems = new ArrayList<>( + dmesgParser.getServiceInfoItems().values()); + assertEquals("There should be exactly one service info", 1, serviceInfoItems.size()); + assertEquals("Service name is not netd", NETD, serviceInfoItems.get(0).getServiceName()); } /** * Test multiple service info parsed correctly and stored in the same order logged in * the file. */ - public void testMultipleServiceInfo() throws IOException { - List<String> lines = Arrays.asList( + public void testMultipleServiceInfo() { + String[] lines = new String[] { "[ 22.962730] init: starting service 'bootanim'...", "[ 23.252321] init: starting service 'netd'...", "[ 29.331069] ipa-wan ipa_wwan_ioctl:1428 dev(rmnet_data0) register to IPA", "[ 32.182592] ueventd: fixup /sys/devices/virtual/inputpoll_delay 0 1004 660", "[ 35.642666] SELinux: initialized (dev fuse, type fuse), uses genfs_contexts", - "[ 39.855818] init: Service 'bootanim' (pid 588) exited with status 0"); - File testFile = getTempFile(lines); - BufferedReader bufferedReader = new BufferedReader(readInputBuffer(testFile)); - List<ServiceInfoItem> serviceInfoItems = (new DmesgParser()). - parseServiceInfo(bufferedReader); - assertEquals("There should be exactly two service info", 2, - serviceInfoItems.size()); + "[ 39.855818] init: Service 'bootanim' (pid 588) exited with status 0"}; + DmesgParser dmesgParser = new DmesgParser(); + for (String line : lines) { + dmesgParser.parseServiceInfo(line); + } + List<DmesgServiceInfoItem> serviceInfoItems = new ArrayList<>( + dmesgParser.getServiceInfoItems().values()); + assertEquals("There should be exactly two service info", 2, serviceInfoItems.size()); assertEquals("First service name is not boot anim", BOOT_ANIMATION, serviceInfoItems.get(0).getServiceName()); assertEquals("Second service name is not netd", NETD, serviceInfoItems.get(1).getServiceName()); - bufferedReader.close(); - testFile.delete(); } /** * Test invalid patterns on the start and exit service logs */ - public void testInvalidServiceLogs() throws IOException { + public void testInvalidServiceLogs() { // Added space at the end of the start and exit of service logs to make it invalid - List<String> lines = Arrays.asList( + String[] lines = new String[] { "[ 22.962730] init: starting service 'bootanim'... ", "[ 23.252321] init: starting service 'netd'... ", "[ 29.331069] ipa-wan ipa_wwan_ioctl:1428 dev(rmnet_data0) register to IPA", "[ 32.182592] ueventd: fixup /sys/devices/virtual/input/poll_delay 0 1004 660", "[ 35.642666] SELinux: initialized (dev fuse, type fuse), uses genfs_contexts", - "[ 39.855818] init: Service 'bootanim' (pid 588) exited with status 0 "); - File testFile = getTempFile(lines); - BufferedReader bufferedReader = new BufferedReader(readInputBuffer(testFile)); - List<ServiceInfoItem> serviceInfoItems = (new DmesgParser()). - parseServiceInfo(bufferedReader); - assertEquals("No service info should be available", 0, - serviceInfoItems.size()); - bufferedReader.close(); - testFile.delete(); + "[ 39.855818] init: Service 'bootanim' (pid 588) exited with status 0 "}; + DmesgParser dmesgParser = new DmesgParser(); + for (String line : lines) { + dmesgParser.parseServiceInfo(line); + } + List<DmesgServiceInfoItem> serviceInfoItems = new ArrayList<>( + dmesgParser.getServiceInfoItems().values()); + assertEquals("No service info should be available", 0, serviceInfoItems.size()); } /** - * Write list of strings to file and use it for testing. + * Test init stages' start time logs */ - public File getTempFile(List<String> sampleEventsLogs) throws IOException { - mTempFile = File.createTempFile(DMESG_LOG, ".txt"); - BufferedWriter out = new BufferedWriter(new FileWriter(mTempFile)); - for (String line : sampleEventsLogs) { - out.write(line); - out.newLine(); + public void testCompleteStageInfo() { + String[] lines = new String[] { + "[ 22.962730] init: starting service 'bootanim'...", + "[ 29.331069] ipa-wan ipa_wwan_ioctl:1428 dev(rmnet_data0) register to IPA", + "[ 32.182592] ueventd: fixup /sys/devices/virtual/input/poll_delay 0 1004 660", + "[ 35.642666] SELinux: initialized (dev fuse, type fuse), uses genfs_contexts", + "[ 39.855818] init: Service 'bootanim' (pid 588) exited with status 0", + "[ 41.665818] init: init first stage started!", + "[ 42.425056] init: init second stage started!"}; + DmesgStageInfoItem firstStageInfoItem = new DmesgStageInfoItem("first", + (long) (Double.parseDouble("41665.818"))); + DmesgStageInfoItem secondStageInfoItem = new DmesgStageInfoItem("second", + (long) (Double.parseDouble("42425.056"))); + DmesgParser dmesgParser = new DmesgParser(); + for (String line : lines) { + dmesgParser.parseStageInfo(line); } - out.close(); - return mTempFile; + List<DmesgStageInfoItem> stageInfoItems = dmesgParser.getStageInfoItems(); + assertEquals(2, stageInfoItems.size()); + assertEquals(Arrays.asList(firstStageInfoItem, secondStageInfoItem), stageInfoItems); } /** - * Reader to read the input from the given temp file + * Test processing action start time logs */ - public BufferedReader readInputBuffer(File tempFile) throws IOException { - return (new BufferedReader(new InputStreamReader(new FileInputStream(tempFile)))); + public void testCompleteActionInfo() { + String[] lines = new String[] { + "[ 14.942872] init: processing action (early-init)", + "[ 17.233446] init: processing action (set_mmap_rnd_bits)", + "[ 17.240083] init: processing action (set_kptr_restrict)", + "[ 17.245778] init: processing action (keychord_init)", + "[ 22.361049] init: processing action (persist.sys.usb.config=* boot)", + "[ 22.361108] init: processing action (enable_property_trigger)", + "[ 22.361313] init: processing action (security.perf_harden=1)", + "[ 22.361495] init: processing action (ro.debuggable=1)", + "[ 22.962730] init: starting service 'bootanim'...", + "[ 29.331069] ipa-wan ipa_wwan_ioctl:1428 dev(rmnet_data0) register to IPA", + "[ 32.182592] ueventd: fixup /sys/devices/virtual/input/poll_delay 0 1004 660", + "[ 35.642666] SELinux: initialized (dev fuse, type fuse), uses genfs_contexts", + "[ 39.855818] init: Service 'bootanim' (pid 588) exited with status 0"}; + List<DmesgActionInfoItem> expectedActionInfoItems = Arrays.asList( + new DmesgActionInfoItem("early-init", (long) (Double.parseDouble("14942.872"))), + new DmesgActionInfoItem("set_mmap_rnd_bits", + (long) (Double.parseDouble("17233.446"))), + new DmesgActionInfoItem("set_kptr_restrict", + (long) (Double.parseDouble("17240.083"))), + new DmesgActionInfoItem("keychord_init", (long) (Double.parseDouble("17245.778"))), + new DmesgActionInfoItem("enable_property_trigger", + (long) (Double.parseDouble("22361.108")))); + DmesgParser dmesgParser = new DmesgParser(); + for (String line : lines) { + dmesgParser.parseActionInfo(line); + } + List<DmesgActionInfoItem> actualActionInfoItems = dmesgParser.getActionInfoItems(); + assertEquals(5, actualActionInfoItems.size()); + assertEquals(expectedActionInfoItems, actualActionInfoItems); } } |