From eef080a46cc535277e386b6a2f43ee06cbbc2453 Mon Sep 17 00:00:00 2001 From: Michael Comella Date: Fri, 6 Dec 2019 11:24:20 -0800 Subject: [PATCH] For perf-frontend-issues#33: Add HotStartPerformanceMonitorTest. We really don't want our startup tests to subtlely change so I thought it was worth writing some quick tests. --- .../fenix/perf/HotStartPerformanceMonitor.kt | 11 +++-- .../perf/HotStartPerformanceMonitorTest.kt | 43 +++++++++++++++++++ 2 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 app/src/test/java/org/mozilla/fenix/perf/HotStartPerformanceMonitorTest.kt diff --git a/app/src/main/java/org/mozilla/fenix/perf/HotStartPerformanceMonitor.kt b/app/src/main/java/org/mozilla/fenix/perf/HotStartPerformanceMonitor.kt index 8e1577af5..df4e130d8 100644 --- a/app/src/main/java/org/mozilla/fenix/perf/HotStartPerformanceMonitor.kt +++ b/app/src/main/java/org/mozilla/fenix/perf/HotStartPerformanceMonitor.kt @@ -22,19 +22,22 @@ import android.util.Log * To see logs from this class, the user must enable VERBOSE logging for the appropriate tag: * adb shell setprop log.tag.FenixPerf VERBOSE */ -class HotStartPerformanceMonitor { +class HotStartPerformanceMonitor( + private val log: (String) -> Unit = { Log.v(Performance.TAG, it) }, // android log to minimize overhead. + private val getElapsedRealtime: () -> Long = { SystemClock.elapsedRealtime() } +) { private var onRestartMillis: Long = -1 fun onRestartFirstMethodCall() { - onRestartMillis = SystemClock.elapsedRealtime() + onRestartMillis = getElapsedRealtime() } fun onPostResumeFinalMethodCall() { // If onRestart was never called, this is not a hot start: ignore it. if (onRestartMillis >= 0) { - val elapsedMillis = SystemClock.elapsedRealtime() - onRestartMillis - Log.v(Performance.TAG, "hot start: $elapsedMillis") // android log to minimize overhead. + val elapsedMillis = getElapsedRealtime() - onRestartMillis + log("hot start: $elapsedMillis") } } } diff --git a/app/src/test/java/org/mozilla/fenix/perf/HotStartPerformanceMonitorTest.kt b/app/src/test/java/org/mozilla/fenix/perf/HotStartPerformanceMonitorTest.kt new file mode 100644 index 000000000..bba5e462d --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/perf/HotStartPerformanceMonitorTest.kt @@ -0,0 +1,43 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.perf + +import io.mockk.Called +import io.mockk.MockKAnnotations +import io.mockk.impl.annotations.MockK +import io.mockk.verify +import org.junit.Before +import org.junit.Test + +class HotStartPerformanceMonitorTest { + + private lateinit var monitor: HotStartPerformanceMonitor + + @MockK(relaxed = true) private lateinit var log: (String) -> Unit + private var elapsedRealtime = 0L + + @Before + fun setUp() { + MockKAnnotations.init(this) + monitor = HotStartPerformanceMonitor(log, getElapsedRealtime = { elapsedRealtime }) + } + + @Test + fun `WHEN onRestart is not called but onPostResume is called THEN we do not log`() { + monitor.onPostResumeFinalMethodCall() + verify { log.invoke(any()) wasNot Called } + } + + @Test + fun `WHEN onRestart then onPostResume is called THEN we log the elapsed time`() { + elapsedRealtime = 10 + monitor.onRestartFirstMethodCall() + + elapsedRealtime = 100 + monitor.onPostResumeFinalMethodCall() + + verify { log.invoke("hot start: 90") } // fragile but it's not worth the time to make robust. + } +}