1 package com.android.launcher3.logging 2 3 import androidx.core.util.isEmpty 4 import androidx.test.annotation.UiThreadTest 5 import androidx.test.ext.junit.runners.AndroidJUnit4 6 import androidx.test.filters.SmallTest 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 [StartupLatencyLogger]. */ 13 @SmallTest 14 @RunWith(AndroidJUnit4::class) 15 class StartupLatencyLoggerTest { 16 17 private val underTest: StartupLatencyLogger = 18 StartupLatencyLogger(StatsLogManager.StatsLatencyLogger.LatencyType.COLD) 19 20 @Before setupnull21 fun setup() { 22 underTest.setIsInTest() 23 } 24 25 @Test 26 @UiThreadTest logTotalDurationStartnull27 fun logTotalDurationStart() { 28 underTest.logStart( 29 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, 30 100 31 ) 32 33 val startTime = 34 underTest.startTimeByEvent.get( 35 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION.id 36 ) 37 assertThat(startTime).isEqualTo(100) 38 assertThat(underTest.endTimeByEvent.isEmpty()).isTrue() 39 } 40 41 @Test 42 @UiThreadTest logTotalDurationEndnull43 fun logTotalDurationEnd() { 44 underTest.logStart( 45 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, 46 100 47 ) 48 49 underTest.logEnd( 50 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, 51 100 52 ) 53 54 val endTime = 55 underTest.endTimeByEvent.get( 56 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION.id 57 ) 58 assertThat(endTime).isEqualTo(100) 59 } 60 61 @Test 62 @UiThreadTest logStartOfOtherEvents_withoutLogStartOfTotalDuration_noOpnull63 fun logStartOfOtherEvents_withoutLogStartOfTotalDuration_noOp() { 64 underTest 65 .logStart( 66 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_ACTIVITY_ON_CREATE, 67 100 68 ) 69 .logStart( 70 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_VIEW_INFLATION, 71 101 72 ) 73 .logStart( 74 StatsLogManager.LauncherLatencyEvent 75 .LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_ASYNC, 76 102 77 ) 78 79 assertThat(underTest.startTimeByEvent.isEmpty()).isTrue() 80 } 81 82 @Test 83 @UiThreadTest logStartOfOtherEvents_afterLogStartOfTotalDuration_loggednull84 fun logStartOfOtherEvents_afterLogStartOfTotalDuration_logged() { 85 underTest.logStart( 86 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, 87 100 88 ) 89 90 underTest 91 .logStart( 92 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_ACTIVITY_ON_CREATE, 93 100 94 ) 95 .logStart( 96 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_VIEW_INFLATION, 97 101 98 ) 99 .logStart( 100 StatsLogManager.LauncherLatencyEvent 101 .LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_ASYNC, 102 102 103 ) 104 105 assertThat(underTest.startTimeByEvent.size()).isEqualTo(4) 106 } 107 108 @Test 109 @UiThreadTest logDuplicatedStartEvent_2ndEvent_notLoggednull110 fun logDuplicatedStartEvent_2ndEvent_notLogged() { 111 underTest.logStart( 112 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, 113 100 114 ) 115 116 underTest.logStart( 117 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, 118 101 119 ) 120 121 assertThat(underTest.startTimeByEvent.size()).isEqualTo(1) 122 assertThat( 123 underTest.startTimeByEvent.get( 124 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION.id 125 ) 126 ) 127 .isEqualTo(100) 128 } 129 130 @Test 131 @UiThreadTest loadStartOfWorkspace_thenEndWithAsync_logAsyncStartnull132 fun loadStartOfWorkspace_thenEndWithAsync_logAsyncStart() { 133 underTest 134 .logStart( 135 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, 136 100 137 ) 138 .logWorkspaceLoadStartTime(111) 139 140 underTest.logEnd( 141 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_ASYNC, 142 120 143 ) 144 145 assertThat(underTest.startTimeByEvent.size()).isEqualTo(2) 146 assertThat( 147 underTest.startTimeByEvent.get( 148 StatsLogManager.LauncherLatencyEvent 149 .LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_ASYNC 150 .id 151 ) 152 ) 153 .isEqualTo(111) 154 } 155 156 @Test 157 @UiThreadTest loadStartOfWorkspace_thenEndWithSync_logSyncStartnull158 fun loadStartOfWorkspace_thenEndWithSync_logSyncStart() { 159 underTest 160 .logStart( 161 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, 162 100 163 ) 164 .logWorkspaceLoadStartTime(111) 165 166 underTest.logEnd( 167 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_SYNC, 168 120 169 ) 170 171 assertThat(underTest.startTimeByEvent.size()).isEqualTo(2) 172 assertThat( 173 underTest.startTimeByEvent.get( 174 StatsLogManager.LauncherLatencyEvent 175 .LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_SYNC 176 .id 177 ) 178 ) 179 .isEqualTo(111) 180 } 181 182 @Test 183 @UiThreadTest loadStartOfWorkspaceLoadSync_thenAsync_asyncNotLoggednull184 fun loadStartOfWorkspaceLoadSync_thenAsync_asyncNotLogged() { 185 underTest 186 .logStart( 187 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, 188 100 189 ) 190 .logStart( 191 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_SYNC, 192 110 193 ) 194 195 underTest.logStart( 196 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_ASYNC, 197 111 198 ) 199 200 assertThat(underTest.startTimeByEvent.size()).isEqualTo(2) 201 assertThat( 202 underTest.startTimeByEvent.get( 203 StatsLogManager.LauncherLatencyEvent 204 .LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_SYNC 205 .id 206 ) 207 ) 208 .isEqualTo(110) 209 assertThat( 210 underTest.startTimeByEvent.get( 211 StatsLogManager.LauncherLatencyEvent 212 .LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_ASYNC 213 .id 214 ) 215 ) 216 .isEqualTo(0) 217 } 218 219 @Test 220 @UiThreadTest loadStartOfWorkspaceLoadAsync_thenSync_syncNotLoggednull221 fun loadStartOfWorkspaceLoadAsync_thenSync_syncNotLogged() { 222 underTest.logStart( 223 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, 224 100 225 ) 226 underTest.logStart( 227 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_ASYNC, 228 111 229 ) 230 231 underTest.logStart( 232 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_SYNC, 233 112 234 ) 235 236 assertThat(underTest.startTimeByEvent.size()).isEqualTo(2) 237 assertThat( 238 underTest.startTimeByEvent.get( 239 StatsLogManager.LauncherLatencyEvent 240 .LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_ASYNC 241 .id 242 ) 243 ) 244 .isEqualTo(111) 245 assertThat( 246 underTest.startTimeByEvent.get( 247 StatsLogManager.LauncherLatencyEvent 248 .LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_SYNC 249 .id 250 ) 251 ) 252 .isEqualTo(0) 253 } 254 255 @Test 256 @UiThreadTest logEndOfEvent_withoutStartEvent_notLoggednull257 fun logEndOfEvent_withoutStartEvent_notLogged() { 258 underTest.logStart( 259 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, 260 100 261 ) 262 263 underTest.logEnd( 264 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_SYNC, 265 120 266 ) 267 268 assertThat(underTest.endTimeByEvent.size()).isEqualTo(0) 269 assertThat( 270 underTest.endTimeByEvent.get( 271 StatsLogManager.LauncherLatencyEvent 272 .LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_SYNC 273 .id 274 ) 275 ) 276 .isEqualTo(0) 277 } 278 279 @Test 280 @UiThreadTest logEndOfEvent_afterEndOfTotalDuration_notLoggednull281 fun logEndOfEvent_afterEndOfTotalDuration_notLogged() { 282 underTest 283 .logStart( 284 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, 285 100 286 ) 287 .logEnd( 288 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, 289 120 290 ) 291 292 underTest.logEnd( 293 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_SYNC, 294 121 295 ) 296 297 assertThat(underTest.endTimeByEvent.size()).isEqualTo(1) 298 assertThat( 299 underTest.endTimeByEvent.get( 300 StatsLogManager.LauncherLatencyEvent 301 .LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_SYNC 302 .id 303 ) 304 ) 305 .isEqualTo(0) 306 } 307 308 @Test 309 @UiThreadTest logCardinality_setCardinalitynull310 fun logCardinality_setCardinality() { 311 underTest.logCardinality(-1) 312 underTest.logStart( 313 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, 314 100 315 ) 316 317 underTest.logCardinality(235) 318 319 assertThat(underTest.cardinality).isEqualTo(235) 320 } 321 322 @Test 323 @UiThreadTest reset_clearStatenull324 fun reset_clearState() { 325 underTest 326 .logStart( 327 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, 328 100 329 ) 330 .logStart( 331 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_ACTIVITY_ON_CREATE, 332 100 333 ) 334 .logStart( 335 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_VIEW_INFLATION, 336 110 337 ) 338 .logEnd( 339 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_VIEW_INFLATION, 340 115 341 ) 342 .logWorkspaceLoadStartTime(120) 343 .logCardinality(235) 344 .logEnd( 345 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_ACTIVITY_ON_CREATE, 346 100 347 ) 348 .logEnd( 349 StatsLogManager.LauncherLatencyEvent 350 .LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_ASYNC, 351 140 352 ) 353 .logEnd( 354 StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, 355 160 356 ) 357 assertThat(underTest.startTimeByEvent.size()).isEqualTo(4) 358 assertThat(underTest.endTimeByEvent.size()).isEqualTo(4) 359 assertThat(underTest.cardinality).isEqualTo(235) 360 361 underTest.reset() 362 363 assertThat(underTest.startTimeByEvent.isEmpty()).isTrue() 364 assertThat(underTest.endTimeByEvent.isEmpty()).isTrue() 365 assertThat(underTest.cardinality).isEqualTo(StartupLatencyLogger.UNSET_INT) 366 assertThat(underTest.workspaceLoadStartTime).isEqualTo(StartupLatencyLogger.UNSET_LONG) 367 } 368 } 369