1 package com.android.launcher3.logging 2 3 import androidx.core.util.isEmpty 4 import androidx.test.annotation.UiThreadTest 5 import androidx.test.filters.SmallTest 6 import com.android.launcher3.util.LauncherMultivalentJUnit 7 import com.google.common.truth.Truth.assertThat 8 import org.junit.Before 9 import org.junit.Test 10 import org.junit.runner.RunWith 11 12 /** Unit test for [ColdRebootStartupLatencyLogger]. */ 13 @SmallTest 14 @RunWith(LauncherMultivalentJUnit::class) 15 class StartupLatencyLoggerTest { 16 17 private val underTest = ColdRebootStartupLatencyLogger() 18 19 @Before setupnull20 fun setup() { 21 underTest.setIsInTest() 22 } 23 24 @Test 25 @UiThreadTest logTotalDurationStartnull26 fun logTotalDurationStart() { 27 underTest.logStart( 28 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, 29 100 30 ) 31 32 val startTime = 33 underTest.startTimeByEvent.get( 34 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION.id 35 ) 36 assertThat(startTime).isEqualTo(100) 37 assertThat(underTest.endTimeByEvent.isEmpty()).isTrue() 38 } 39 40 @Test 41 @UiThreadTest logTotalDurationEndnull42 fun logTotalDurationEnd() { 43 underTest.logStart( 44 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, 45 100 46 ) 47 48 underTest.logEnd( 49 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, 50 100 51 ) 52 53 val endTime = 54 underTest.endTimeByEvent.get( 55 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION.id 56 ) 57 assertThat(endTime).isEqualTo(100) 58 } 59 60 @Test 61 @UiThreadTest logStartOfOtherEvents_withoutLogStartOfTotalDuration_noOpnull62 fun logStartOfOtherEvents_withoutLogStartOfTotalDuration_noOp() { 63 underTest 64 .logStart( 65 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_ACTIVITY_ON_CREATE, 66 100 67 ) 68 .logStart( 69 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_VIEW_INFLATION, 70 101 71 ) 72 .logStart( 73 StatsLogManager.LauncherLatencyEvent 74 .LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_ASYNC, 75 102 76 ) 77 78 assertThat(underTest.startTimeByEvent.isEmpty()).isTrue() 79 } 80 81 @Test 82 @UiThreadTest logStartOfOtherEvents_afterLogStartOfTotalDuration_loggednull83 fun logStartOfOtherEvents_afterLogStartOfTotalDuration_logged() { 84 underTest.logStart( 85 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, 86 100 87 ) 88 89 underTest 90 .logStart( 91 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_ACTIVITY_ON_CREATE, 92 100 93 ) 94 .logStart( 95 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_VIEW_INFLATION, 96 101 97 ) 98 .logStart( 99 StatsLogManager.LauncherLatencyEvent 100 .LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_ASYNC, 101 102 102 ) 103 104 assertThat(underTest.startTimeByEvent.size()).isEqualTo(4) 105 } 106 107 @Test 108 @UiThreadTest logDuplicatedStartEvent_2ndEvent_notLoggednull109 fun logDuplicatedStartEvent_2ndEvent_notLogged() { 110 underTest.logStart( 111 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, 112 100 113 ) 114 115 underTest.logStart( 116 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, 117 101 118 ) 119 120 assertThat(underTest.startTimeByEvent.size()).isEqualTo(1) 121 assertThat( 122 underTest.startTimeByEvent.get( 123 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION.id 124 ) 125 ) 126 .isEqualTo(100) 127 } 128 129 @Test 130 @UiThreadTest loadStartOfWorkspace_thenEndWithAsync_logAsyncStartnull131 fun loadStartOfWorkspace_thenEndWithAsync_logAsyncStart() { 132 underTest 133 .logStart( 134 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, 135 100 136 ) 137 .logWorkspaceLoadStartTime(111) 138 139 underTest.logEnd( 140 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_ASYNC, 141 120 142 ) 143 144 assertThat(underTest.startTimeByEvent.size()).isEqualTo(2) 145 assertThat( 146 underTest.startTimeByEvent.get( 147 StatsLogManager.LauncherLatencyEvent 148 .LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_ASYNC 149 .id 150 ) 151 ) 152 .isEqualTo(111) 153 } 154 155 @Test 156 @UiThreadTest logEndOfEvent_withoutStartEvent_notLoggednull157 fun logEndOfEvent_withoutStartEvent_notLogged() { 158 underTest.logStart( 159 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, 160 100 161 ) 162 163 underTest.logEnd( 164 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_ASYNC, 165 120 166 ) 167 168 assertThat(underTest.endTimeByEvent.size()).isEqualTo(0) 169 assertThat( 170 underTest.endTimeByEvent.get( 171 StatsLogManager.LauncherLatencyEvent 172 .LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_ASYNC 173 .id 174 ) 175 ) 176 .isEqualTo(0) 177 } 178 179 @Test 180 @UiThreadTest logEndOfEvent_afterEndOfTotalDuration_notLoggednull181 fun logEndOfEvent_afterEndOfTotalDuration_notLogged() { 182 underTest 183 .logStart( 184 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, 185 100 186 ) 187 .logEnd( 188 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, 189 120 190 ) 191 192 underTest.logEnd( 193 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_ASYNC, 194 121 195 ) 196 197 assertThat(underTest.endTimeByEvent.size()).isEqualTo(1) 198 assertThat( 199 underTest.endTimeByEvent.get( 200 StatsLogManager.LauncherLatencyEvent 201 .LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_ASYNC 202 .id 203 ) 204 ) 205 .isEqualTo(0) 206 } 207 208 @Test 209 @UiThreadTest logCardinality_setCardinalitynull210 fun logCardinality_setCardinality() { 211 underTest.logCardinality(-1) 212 underTest.logStart( 213 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, 214 100 215 ) 216 217 underTest.logCardinality(235) 218 219 assertThat(underTest.cardinality).isEqualTo(235) 220 } 221 222 @Test 223 @UiThreadTest reset_clearStatenull224 fun reset_clearState() { 225 underTest 226 .logStart( 227 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, 228 100 229 ) 230 .logStart( 231 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_ACTIVITY_ON_CREATE, 232 100 233 ) 234 .logStart( 235 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_VIEW_INFLATION, 236 110 237 ) 238 .logEnd( 239 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_VIEW_INFLATION, 240 115 241 ) 242 .logWorkspaceLoadStartTime(120) 243 .logCardinality(235) 244 .logEnd( 245 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_ACTIVITY_ON_CREATE, 246 100 247 ) 248 .logEnd( 249 StatsLogManager.LauncherLatencyEvent 250 .LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_ASYNC, 251 140 252 ) 253 .logEnd( 254 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, 255 160 256 ) 257 assertThat(underTest.startTimeByEvent.size()).isEqualTo(4) 258 assertThat(underTest.endTimeByEvent.size()).isEqualTo(4) 259 assertThat(underTest.cardinality).isEqualTo(235) 260 assertThat(underTest.isTornDown).isFalse() 261 262 underTest.reset() 263 264 assertThat(underTest.startTimeByEvent.isEmpty()).isTrue() 265 assertThat(underTest.endTimeByEvent.isEmpty()).isTrue() 266 assertThat(underTest.cardinality).isEqualTo(ColdRebootStartupLatencyLogger.UNSET_INT) 267 assertThat(underTest.workspaceLoadStartTime) 268 .isEqualTo(ColdRebootStartupLatencyLogger.UNSET_LONG) 269 assertThat(underTest.isTornDown).isTrue() 270 } 271 272 @Test 273 @UiThreadTest tornDown_rejectLogsnull274 fun tornDown_rejectLogs() { 275 underTest.reset() 276 277 underTest 278 .logStart( 279 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, 280 100 281 ) 282 .logEnd( 283 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, 284 200 285 ) 286 .logCardinality(123) 287 assertThat(underTest.startTimeByEvent.isEmpty()).isTrue() 288 assertThat(underTest.endTimeByEvent.isEmpty()).isTrue() 289 assertThat(underTest.cardinality).isEqualTo(ColdRebootStartupLatencyLogger.UNSET_INT) 290 } 291 } 292