1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.loganalysis.parser; 18 19 import com.android.loganalysis.item.LatencyItem; 20 import com.android.loganalysis.item.TransitionDelayItem; 21 22 import junit.framework.TestCase; 23 24 import java.io.BufferedReader; 25 import java.io.BufferedWriter; 26 import java.io.File; 27 import java.io.FileInputStream; 28 import java.io.FileWriter; 29 import java.io.IOException; 30 import java.io.InputStreamReader; 31 import java.util.Arrays; 32 import java.util.List; 33 34 /** 35 * Unit tests for {@link EventsLogParser}. 36 */ 37 public class EventsLogParserTest extends TestCase { 38 39 private File mTempFile = null; 40 41 @Override tearDown()42 protected void tearDown() throws Exception { 43 mTempFile.delete(); 44 } 45 46 /** 47 * Test for empty events logs passed to the transition delay parser 48 */ testEmptyEventsLog()49 public void testEmptyEventsLog() throws IOException { 50 List<String> lines = Arrays.asList(""); 51 List<TransitionDelayItem> transitionItems = (new EventsLogParser()). 52 parseTransitionDelayInfo(readInputBuffer(getTempFile(lines))); 53 assertEquals("Transition Delay items list should be empty", 0,transitionItems.size()); 54 } 55 56 /** 57 * Test for no transition delay info in the events log 58 */ testNoTransitionDelayInfo()59 public void testNoTransitionDelayInfo() throws IOException { 60 List<String> lines = Arrays 61 .asList( 62 "08-25 12:56:15.850 1152 8968 I am_focused_stack: [0,0,1,appDied setFocusedActivity]", 63 "08-25 12:56:15.850 1152 8968 I wm_task_moved: [6,1,1]", 64 "08-25 12:56:15.852 1152 8968 I am_focused_activity: [0,com.google.android.apps.nexuslauncher/.NexusLauncherActivity,appDied]", 65 "08-25 12:56:15.852 1152 8968 I wm_task_removed: [27,removeTask]", 66 "08-25 12:56:15.852 1152 8968 I wm_stack_removed: 1"); 67 List<TransitionDelayItem> transitionItems = (new EventsLogParser()). 68 parseTransitionDelayInfo(readInputBuffer(getTempFile(lines))); 69 assertEquals("Transition Delay items list should be empty", 0, 70 transitionItems.size()); 71 } 72 73 /** 74 * Test for Cold launch transition delay and starting window delay info 75 */ testValidColdTransitionDelay()76 public void testValidColdTransitionDelay() throws IOException { 77 List<String> lines = Arrays 78 .asList("09-18 23:56:19.376 1140 1221 I sysui_multi_action: [319,51,321,50,322,190,325,670,757,761,758,7,759,1,806,com.google.android.calculator,871,com.android.calculator2.Calculator,904,com.google.android.apps.nexuslauncher,905,0,945,41]", 79 "09-18 23:56:19.376 1140 1221 I sysui_multi_action: [319,51,321,50,322,190,325,670,757,761,758,7,759,1,806,com.google.android.calculator,871,com.android.calculator2.Calculator,905,0,945,41]"); 80 List<TransitionDelayItem> transitionItems = (new EventsLogParser()). 81 parseTransitionDelayInfo(readInputBuffer(getTempFile(lines))); 82 assertEquals("Startinng Window Delay items list should have two item", 2, 83 transitionItems.size()); 84 assertEquals("Component name not parsed correctly", 85 "com.google.android.calculator/com.android.calculator2.Calculator", 86 transitionItems.get(0).getComponentName()); 87 assertEquals("Transition delay is not parsed correctly", Long.valueOf(51), 88 transitionItems.get(0).getTransitionDelay()); 89 assertEquals("Starting window delay is not parsed correctly", Long.valueOf(50), 90 transitionItems.get(0).getStartingWindowDelay()); 91 assertEquals("Date and time is not parsed correctly", "09-18 23:56:19.376", 92 transitionItems.get(0).getDateTime()); 93 } 94 95 /** 96 * Test for Hot launch transition delay and starting window delay info 97 */ testValidHotTransitionDelay()98 public void testValidHotTransitionDelay() throws IOException { 99 List<String> lines = Arrays 100 .asList("09-18 23:56:19.376 1140 1221 I sysui_multi_action: [319,51,321,50,322,190,325,670,757,761,758,7,759,1,806,com.google.android.calculator,871,com.android.calculator2.Calculator,904,com.google.android.apps.nexuslauncher,905,0]", 101 "09-18 23:56:19.376 1140 1221 I sysui_multi_action: [319,51,321,50,322,190,325,670,757,761,758,7,759,1,806,com.google.android.calculator,871,com.android.calculator2.Calculator,905,0]", 102 "09-19 02:26:30.182 1143 1196 I sysui_multi_action: [319,87,322,75,325,212,757,761,758,9,759,2,806,com.google.android.apps.nexuslauncher,871,com.google.android.apps.nexuslauncher.NexusLauncherActivity,904,com.google.android.apps.nexuslauncher,905,0]", 103 "09-19 02:26:30.182 1143 1196 I sysui_multi_action: [319,87,322,75,325,212,757,761,758,9,759,2,806,com.google.android.apps.nexuslauncher,871,com.google.android.apps.nexuslauncher.NexusLauncherActivity,905,0]"); 104 List<TransitionDelayItem> transitionItems = (new EventsLogParser()). 105 parseTransitionDelayInfo(readInputBuffer(getTempFile(lines))); 106 assertEquals("Transition Delay items list should have four item", 4, 107 transitionItems.size()); 108 assertEquals("Component name not parsed correctly", 109 "com.google.android.calculator/com.android.calculator2.Calculator", 110 transitionItems.get(0).getComponentName()); 111 assertEquals("Transition delay is not parsed correctly", Long.valueOf(51), 112 transitionItems.get(0).getTransitionDelay()); 113 assertEquals("Date is not parsed correctly", "09-18 23:56:19.376", 114 transitionItems.get(0).getDateTime()); 115 } 116 117 /** 118 * Test for same app transition delay items order after parsing from the events log 119 */ testTransitionDelayOrder()120 public void testTransitionDelayOrder() throws IOException { 121 List<String> lines = Arrays 122 .asList("09-18 23:56:19.376 1140 1221 I sysui_multi_action: [319,51,321,59,322,190,325,670,757,761,758,7,759,1,806,com.google.android.calculator,871,com.android.calculator2.Calculator,904,com.google.android.apps.nexuslauncher,905,0,945,41]", 123 "09-18 23:59:18.380 1140 1221 I sysui_multi_action: [319,55,321,65,322,190,325,670,757,761,758,7,759,1,806,com.google.android.calculator,871,com.android.calculator2.Calculator,905,0,945,41]"); 124 List<TransitionDelayItem> transitionItems = (new EventsLogParser()). 125 parseTransitionDelayInfo(readInputBuffer(getTempFile(lines))); 126 assertEquals("Transition Delay items list should have two items", 2, 127 transitionItems.size()); 128 assertEquals("Transition delay for the first item is not set correct", Long.valueOf(59), 129 transitionItems.get(0).getStartingWindowDelay()); 130 assertEquals("Transition delay for the second item is not set correct", Long.valueOf(65), 131 transitionItems.get(1).getStartingWindowDelay()); 132 } 133 134 /** 135 * Test for two different different apps transition delay items 136 */ testDifferentAppTransitionDelay()137 public void testDifferentAppTransitionDelay() throws IOException { 138 List<String> lines = Arrays 139 .asList("09-18 23:56:19.376 1140 1221 I sysui_multi_action: [319,51,321,50,322,190,325,670,757,761,758,7,759,1,806,com.google.android.calculator,871,com.android.calculator2.Calculator,904,com.google.android.apps.nexuslauncher,905,0]", 140 "09-19 02:26:30.182 1143 1196 I sysui_multi_action: [319,87,322,75,325,212,757,761,758,9,759,2,806,com.google.android.apps.nexuslauncher,871,com.google.android.apps.nexuslauncher.NexusLauncherActivity,904,com.google.android.apps.nexuslauncher,905,0]"); 141 List<TransitionDelayItem> transitionItems = (new EventsLogParser()). 142 parseTransitionDelayInfo(readInputBuffer(getTempFile(lines))); 143 assertEquals("Transition Delay items list should have two items", 2, 144 transitionItems.size()); 145 assertEquals("Calculator is not the first transition delay item", 146 "com.google.android.calculator/com.android.calculator2.Calculator", 147 transitionItems.get(0).getComponentName()); 148 assertEquals("Maps is not the second transition delay item", 149 "com.google.android.apps.nexuslauncher/" 150 + "com.google.android.apps.nexuslauncher.NexusLauncherActivity", 151 transitionItems.get(1).getComponentName()); 152 } 153 154 /** 155 * Test for invalid transition delay items pattern having different code. 156 */ testInvalidTransitionPattern()157 public void testInvalidTransitionPattern() throws IOException { 158 List<String> lines = Arrays 159 .asList("01-02 08:11:58.691 934 986 I sysui_multi_action: a[319,48,322,82,325,84088,757,761,758,9,759,4,807,com.google.android.calculator,871,com.android.calculator2.Calculator,905,0]", 160 "01-02 08:12:03.639 934 970 I sysui_multi_action: [757,803,799,window_time_0,802,5]", 161 "01-02 08:12:10.849 934 986 I sysui_multi_action: 319,42,321,59,322,208,325,84100,757,761,758,9,759,4,806,com.google.android.apps.maps,871,com.google.android.maps.MapsActivity,905,0]", 162 "01-02 08:12:16.895 1446 1446 I sysui_multi_action: [757,803,799,overview_trigger_nav_btn,802,1]", 163 "01-02 08:12:16.895 1446 1446 I sysui_multi_action: [757,803,799,overview_source_app,802,1]", 164 "01-02 08:12:16.895 1446 1446 I sysui_multi_action: [757,804,799,overview_source_app_index,801,8,802,1]"); 165 List<TransitionDelayItem> transitionItems = (new EventsLogParser()). 166 parseTransitionDelayInfo(readInputBuffer(getTempFile(lines))); 167 assertEquals("Transition Delay items list should be empty", 0, 168 transitionItems.size()); 169 } 170 171 /** 172 * Test for valid latency item 173 */ testValidLatencyInfo()174 public void testValidLatencyInfo() throws IOException { 175 List<String> lines = Arrays 176 .asList("08-25 13:01:19.412 1152 9031 I am_restart_activity: [com.google.android.gm/.ConversationListActivityGmail,0,85290699,38]", 177 "08-25 13:01:19.437 1152 1226 I sysui_action: [321,85]", 178 "08-25 13:01:19.437 1152 1226 I sysui_action: [320,1]", 179 "08-25 13:01:19.437 1152 1226 I sysui_action: [319,85]", 180 "08-25 12:56:15.850 1152 8968 I am_focused_stack: [0,0,1,appDied setFocusedActivity]", 181 "09-19 11:53:16.893 1080 1160 I sysui_latency: [1,50]"); 182 List<LatencyItem> latencyItems = (new EventsLogParser()). 183 parseLatencyInfo(readInputBuffer(getTempFile(lines))); 184 assertEquals("One latency item should present in the list", 1, latencyItems.size()); 185 assertEquals("Action Id is not correct", 1, latencyItems.get(0).getActionId()); 186 assertEquals("Delay is not correct", 50L, latencyItems.get(0).getDelay()); 187 } 188 189 /** 190 * Test for empty delay info 191 */ testInvalidLatencyInfo()192 public void testInvalidLatencyInfo() throws IOException { 193 List<String> lines = Arrays 194 .asList("08-25 13:01:19.412 1152 9031 I am_restart_activity: [com.google.android.gm/.ConversationListActivityGmail,0,85290699,38]", 195 "08-25 13:01:19.437 1152 1226 I sysui_action: [321,85]", 196 "08-25 13:01:19.437 1152 1226 I sysui_action: [320,1]", 197 "08-25 13:01:19.437 1152 1226 I sysui_action: [319,85]", 198 "08-25 12:56:15.850 1152 8968 I am_focused_stack: [0,0,1,appDied setFocusedActivity]", 199 "09-19 11:53:16.893 1080 1160 I sysui_latency: [1]"); 200 List<LatencyItem> latencyItems = (new EventsLogParser()). 201 parseLatencyInfo(readInputBuffer(getTempFile(lines))); 202 assertEquals("Latency items list should be empty", 0, latencyItems.size()); 203 } 204 205 /** 206 * Test for empty latency info 207 */ testEmptyLatencyInfo()208 public void testEmptyLatencyInfo() throws IOException { 209 List<String> lines = Arrays 210 .asList("08-25 13:01:19.412 1152 9031 I am_restart_activity: [com.google.android.gm/.ConversationListActivityGmail,0,85290699,38]", 211 "08-25 13:01:19.437 1152 1226 I sysui_action: [321,85]", 212 "08-25 13:01:19.437 1152 1226 I sysui_action: [320,1]", 213 "08-25 13:01:19.437 1152 1226 I sysui_action: [319,85]", 214 "08-25 12:56:15.850 1152 8968 I am_focused_stack: [0,0,1,appDied setFocusedActivity]", 215 "09-19 11:53:16.893 1080 1160 I sysui_latency: []"); 216 List<LatencyItem> latencyItems = (new EventsLogParser()). 217 parseLatencyInfo(readInputBuffer(getTempFile(lines))); 218 assertEquals("Latency items list should be empty", 0, latencyItems.size()); 219 } 220 221 222 /** 223 * Test for order of the latency items 224 */ testLatencyInfoOrder()225 public void testLatencyInfoOrder() throws IOException { 226 List<String> lines = Arrays 227 .asList("09-19 11:53:16.893 1080 1160 I sysui_latency: [1,50]", 228 "08-25 13:01:19.437 1152 1226 I sysui_action: [321,85]", 229 "08-25 13:01:19.437 1152 1226 I sysui_action: [320,1]", 230 "08-25 13:01:19.437 1152 1226 I sysui_action: [319,85]", 231 "08-25 12:56:15.850 1152 8968 I am_focused_stack: [0,0,1,appDied setFocusedActivity]", 232 "09-19 11:53:16.893 1080 1160 I sysui_latency: [2,100]"); 233 List<LatencyItem> latencyItems = (new EventsLogParser()). 234 parseLatencyInfo(readInputBuffer(getTempFile(lines))); 235 assertEquals("Latency list should have 2 items", 2, latencyItems.size()); 236 assertEquals("First latency id is not 1", 1, latencyItems.get(0).getActionId()); 237 assertEquals("Second latency id is not 2", 2, latencyItems.get(1).getActionId()); 238 } 239 240 /** 241 * Write list of strings to file and use it for testing. 242 */ getTempFile(List<String> sampleEventsLogs)243 public File getTempFile(List<String> sampleEventsLogs) throws IOException { 244 mTempFile = File.createTempFile("events_logcat", ".txt"); 245 BufferedWriter out = new BufferedWriter(new FileWriter(mTempFile)); 246 for (String line : sampleEventsLogs) { 247 out.write(line); 248 out.newLine(); 249 } 250 out.close(); 251 return mTempFile; 252 } 253 254 /** 255 * Reader to read the input from the given temp file 256 */ readInputBuffer(File tempFile)257 public BufferedReader readInputBuffer(File tempFile) throws IOException { 258 return (new BufferedReader(new InputStreamReader(new FileInputStream(tempFile)))); 259 } 260 261 }