[fenix] Test that 'baseline' pings are sent by Fenix
This is an initial instrumented test for Fenix that checks if a 'baseline' ping is generated when going to background.pull/600/head
parent
f55a5464db
commit
b0cd0692ed
@ -0,0 +1,107 @@
|
||||
/* 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.glean
|
||||
|
||||
import androidx.test.core.app.ApplicationProvider
|
||||
import androidx.test.platform.app.InstrumentationRegistry
|
||||
import androidx.test.rule.ActivityTestRule
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||
import org.junit.Assert.assertEquals
|
||||
|
||||
import org.junit.Rule
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import androidx.test.uiautomator.UiDevice
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.GlobalScope
|
||||
import kotlinx.coroutines.launch
|
||||
import mozilla.components.service.glean.Glean
|
||||
import mozilla.components.service.glean.config.Configuration
|
||||
import mozilla.components.service.glean.testing.GleanTestLocalServer
|
||||
import org.json.JSONObject
|
||||
import org.junit.Assert.assertFalse
|
||||
import org.junit.Assert.assertTrue
|
||||
import org.junit.BeforeClass
|
||||
import org.mozilla.fenix.HomeActivity
|
||||
import org.mozilla.fenix.helpers.HomeActivityTestRule
|
||||
import org.mozilla.fenix.helpers.MockWebServerHelper
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
||||
@RunWith(AndroidJUnit4::class)
|
||||
class BaselinePingTest {
|
||||
private val server = MockWebServerHelper.createAlwaysOkMockWebServer()
|
||||
|
||||
@get:Rule
|
||||
val activityRule: ActivityTestRule<HomeActivity> = HomeActivityTestRule()
|
||||
|
||||
@get:Rule
|
||||
val gleanRule = GleanTestLocalServer(ApplicationProvider.getApplicationContext(), server.port)
|
||||
|
||||
companion object {
|
||||
@BeforeClass
|
||||
@JvmStatic
|
||||
fun setupOnce() {
|
||||
// Fenix does not initialize the Glean SDK in tests/debug builds, but this test
|
||||
// requires Glean to be initialized so we need to do it manually. Additionally,
|
||||
// we need to do this on the main thread, as the Glean SDK requires it.
|
||||
GlobalScope.launch(Dispatchers.Main.immediate) {
|
||||
Glean.initialize(
|
||||
ApplicationProvider.getApplicationContext(),
|
||||
true,
|
||||
Configuration()
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun waitForPingContent(
|
||||
pingName: String,
|
||||
maxAttempts: Int = 3
|
||||
): JSONObject? {
|
||||
var attempts = 0
|
||||
do {
|
||||
attempts += 1
|
||||
val request = server.takeRequest(20L, TimeUnit.SECONDS)
|
||||
val docType = request.path.split("/")[3]
|
||||
if (pingName == docType) {
|
||||
return JSONObject(request.body.readUtf8())
|
||||
}
|
||||
} while (attempts < maxAttempts)
|
||||
|
||||
return null
|
||||
}
|
||||
|
||||
@Test
|
||||
fun validateBaselinePing() {
|
||||
// Wait for the app to be idle/ready.
|
||||
InstrumentationRegistry.getInstrumentation().waitForIdleSync()
|
||||
val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
|
||||
device.waitForIdle()
|
||||
|
||||
// Wait for 1 second: this should guarantee we have some valid duration in the
|
||||
// ping.
|
||||
Thread.sleep(1000)
|
||||
|
||||
// Move it to background.
|
||||
device.pressHome()
|
||||
|
||||
// Validate the received data.
|
||||
val baselinePing = waitForPingContent("baseline")!!
|
||||
assertEquals("baseline", baselinePing.getJSONObject("ping_info")["ping_type"])
|
||||
|
||||
val metrics = baselinePing.getJSONObject("metrics")
|
||||
|
||||
// Make sure we have a 'duration' field with a reasonable value: it should be >= 1, since
|
||||
// we slept for 1000ms.
|
||||
val timespans = metrics.getJSONObject("timespan")
|
||||
assertTrue(timespans.getJSONObject("glean.baseline.duration").getLong("value") >= 1L)
|
||||
|
||||
// Make sure there's no errors.
|
||||
val errors = metrics.optJSONObject("labeled_counter")?.keys()
|
||||
errors?.forEach {
|
||||
assertFalse(it.startsWith("glean.error."))
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue