You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
iceraven-browser/app/src/test/java/org/mozilla/fenix/telemetry/TelemetryLifecycleObserverT...

125 lines
4.2 KiB
Kotlin

/* 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.telemetry
import androidx.test.core.app.ApplicationProvider
import io.mockk.mockk
import mozilla.components.browser.session.engine.EngineMiddleware
import mozilla.components.browser.state.action.EngineAction
import mozilla.components.browser.state.state.BrowserState
import mozilla.components.browser.state.state.createTab
import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.service.glean.testing.GleanTestRule
import mozilla.components.support.base.android.Clock
import mozilla.components.support.test.ext.joinBlocking
import org.junit.After
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.GleanMetrics.EngineTab as EngineMetrics
@RunWith(FenixRobolectricTestRunner::class)
class TelemetryLifecycleObserverTest {
@get:Rule
val gleanRule = GleanTestRule(ApplicationProvider.getApplicationContext())
private val clock = FakeClock()
@Before
fun setUp() {
Clock.delegate = clock
}
@After
fun tearDown() {
Clock.reset()
}
@Test
fun `resume without a pause does not record any metrics`() {
val store = BrowserStore()
val observer = TelemetryLifecycleObserver(store)
observer.onResume()
assertFalse(EngineMetrics.foregroundMetrics.testHasValue())
}
@Test
fun `resume after pause records metrics`() {
val store = BrowserStore()
val observer = TelemetryLifecycleObserver(store)
observer.onPause()
clock.elapsedTime = 550
observer.onResume()
assertTrue(EngineMetrics.foregroundMetrics.testHasValue())
val metrics = EngineMetrics.foregroundMetrics.testGetValue()
assertEquals(1, metrics.size)
val metric = metrics[0]
assertNotNull(metric.extra)
assertEquals("550", metric.extra!!["time_in_background"])
}
@Test
fun `resume records expected values`() {
val store = BrowserStore(
initialState = BrowserState(
tabs = listOf(
createTab("https://www.mozilla.org", id = "mozilla", engineSession = mockk(relaxed = true)),
createTab("https://news.google.com", id = "news"),
createTab("https://theverge.com", id = "theverge", engineSession = mockk(relaxed = true)),
createTab("https://www.google.com", id = "google", engineSession = mockk(relaxed = true)),
createTab("https://getpocket.com", id = "pocket", crashed = true)
)
),
middleware = EngineMiddleware.create(engine = mockk(), sessionLookup = { null })
)
val observer = TelemetryLifecycleObserver(store)
clock.elapsedTime = 120
observer.onPause()
store.dispatch(
EngineAction.KillEngineSessionAction("theverge")
).joinBlocking()
store.dispatch(
EngineAction.SuspendEngineSessionAction("mozilla")
).joinBlocking()
clock.elapsedTime = 10340
observer.onResume()
assertTrue(EngineMetrics.foregroundMetrics.testHasValue())
val metrics = EngineMetrics.foregroundMetrics.testGetValue()
assertEquals(1, metrics.size)
val metric = metrics[0]
assertNotNull(metric.extra)
assertEquals("10220", metric.extra!!["time_in_background"])
assertEquals("3", metric.extra!!["background_active_tabs"])
assertEquals("1", metric.extra!!["background_crashed_tabs"])
assertEquals("5", metric.extra!!["background_total_tabs"])
assertEquals("1", metric.extra!!["foreground_active_tabs"])
assertEquals("1", metric.extra!!["foreground_crashed_tabs"])
assertEquals("5", metric.extra!!["foreground_total_tabs"])
}
}