For #8621 - fix intermittent test failures
parent
621da0c4c1
commit
9a8b800a76
|
@ -8,6 +8,7 @@ import androidx.annotation.UiThread
|
|||
import androidx.lifecycle.Lifecycle
|
||||
import androidx.lifecycle.LifecycleObserver
|
||||
import androidx.lifecycle.OnLifecycleEvent
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.GlobalScope
|
||||
import kotlinx.coroutines.launch
|
||||
import mozilla.components.service.glean.private.NoReasonCodes
|
||||
|
@ -75,12 +76,13 @@ object StartupTimeline {
|
|||
*/
|
||||
internal class StartupHomeActivityLifecycleObserver(
|
||||
private val frameworkStartMeasurement: StartupFrameworkStartMeasurement,
|
||||
private val startupTimeline: PingType<NoReasonCodes> = Pings.startupTimeline
|
||||
private val startupTimeline: PingType<NoReasonCodes> = Pings.startupTimeline,
|
||||
private val scope: CoroutineScope = GlobalScope
|
||||
) : LifecycleObserver {
|
||||
|
||||
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
|
||||
fun onStop() {
|
||||
GlobalScope.launch { // use background thread due to expensive metrics.
|
||||
scope.launch { // use background thread due to expensive metrics.
|
||||
// Ensure any last metrics are set before submission.
|
||||
frameworkStartMeasurement.setExpensiveMetric()
|
||||
|
||||
|
|
|
@ -8,7 +8,6 @@ import android.content.Context
|
|||
import androidx.annotation.VisibleForTesting
|
||||
import androidx.navigation.NavController
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import mozilla.components.browser.session.Session
|
||||
import mozilla.components.feature.session.SessionUseCases.ReloadUrlUseCase
|
||||
|
@ -54,7 +53,7 @@ interface QuickSettingsController {
|
|||
* @param context [Context] used for various Android interactions.
|
||||
* @param quickSettingsStore [QuickSettingsFragmentStore] holding the State for all Views displayed
|
||||
* in this Controller's Fragment.
|
||||
* @param coroutineScope [CoroutineScope] used for structed concurrency.
|
||||
* @param ioScope [CoroutineScope] with an IO dispatcher used for structured concurrency.
|
||||
* @param navController NavController] used for navigation.
|
||||
* @param session [Session]? current browser state.
|
||||
* @param sitePermissions [SitePermissions]? list of website permissions and their status.
|
||||
|
@ -71,7 +70,7 @@ interface QuickSettingsController {
|
|||
class DefaultQuickSettingsController(
|
||||
private val context: Context,
|
||||
private val quickSettingsStore: QuickSettingsFragmentStore,
|
||||
private val coroutineScope: CoroutineScope,
|
||||
private val ioScope: CoroutineScope,
|
||||
private val navController: NavController,
|
||||
private val session: Session?,
|
||||
private var sitePermissions: SitePermissions?,
|
||||
|
@ -143,7 +142,7 @@ class DefaultQuickSettingsController(
|
|||
*/
|
||||
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
|
||||
fun handlePermissionsChange(updatedPermissions: SitePermissions) {
|
||||
coroutineScope.launch(Dispatchers.IO) {
|
||||
ioScope.launch {
|
||||
permissionStorage.updateSitePermissions(updatedPermissions)
|
||||
reload(session)
|
||||
}
|
||||
|
|
|
@ -27,7 +27,9 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior
|
|||
import com.google.android.material.bottomsheet.BottomSheetDialog
|
||||
import kotlinx.android.synthetic.main.fragment_quick_settings_dialog_sheet.*
|
||||
import kotlinx.android.synthetic.main.fragment_quick_settings_dialog_sheet.view.*
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||
import kotlinx.coroutines.plus
|
||||
import mozilla.components.lib.state.ext.consumeFrom
|
||||
import org.mozilla.fenix.BuildConfig
|
||||
import org.mozilla.fenix.HomeActivity
|
||||
|
@ -75,7 +77,7 @@ class QuickSettingsSheetDialogFragment : AppCompatDialogFragment() {
|
|||
quickSettingsController = DefaultQuickSettingsController(
|
||||
context = context,
|
||||
quickSettingsStore = quickSettingsStore,
|
||||
coroutineScope = viewLifecycleOwner.lifecycleScope,
|
||||
ioScope = viewLifecycleOwner.lifecycleScope + Dispatchers.IO,
|
||||
navController = findNavController(),
|
||||
session = context.components.core.sessionManager.findSessionById(args.sessionId),
|
||||
sitePermissions = args.sitePermissions,
|
||||
|
|
|
@ -17,19 +17,19 @@ import org.junit.Test
|
|||
@ExperimentalCoroutinesApi
|
||||
class StartupHomeActivityLifecycleObserverTest {
|
||||
|
||||
private lateinit var observer: StartupHomeActivityLifecycleObserver
|
||||
@MockK(relaxed = true) private lateinit var frameworkStartMeasurement: StartupFrameworkStartMeasurement
|
||||
@MockK(relaxed = true) private lateinit var startupTimeline: PingType<NoReasonCodes>
|
||||
|
||||
@Before
|
||||
fun setUp() {
|
||||
MockKAnnotations.init(this)
|
||||
observer = StartupHomeActivityLifecycleObserver(frameworkStartMeasurement, startupTimeline)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `WHEN onStop is called THEN the metrics are set and the ping is submitted`() = runBlockingTest {
|
||||
val observer = StartupHomeActivityLifecycleObserver(frameworkStartMeasurement, startupTimeline, this)
|
||||
observer.onStop()
|
||||
|
||||
verifySequence {
|
||||
frameworkStartMeasurement.setExpensiveMetric()
|
||||
startupTimeline.submit()
|
||||
|
|
|
@ -6,7 +6,6 @@ package org.mozilla.fenix.settings.quicksettings
|
|||
|
||||
import androidx.navigation.NavController
|
||||
import androidx.navigation.NavDirections
|
||||
import io.mockk.MockKMatcherScope
|
||||
import io.mockk.Runs
|
||||
import io.mockk.every
|
||||
import io.mockk.just
|
||||
|
@ -53,7 +52,7 @@ class DefaultQuickSettingsControllerTest {
|
|||
private val controller = spyk(DefaultQuickSettingsController(
|
||||
context = context,
|
||||
quickSettingsStore = store,
|
||||
coroutineScope = coroutinesScope,
|
||||
ioScope = coroutinesScope,
|
||||
navController = navController,
|
||||
session = browserSession,
|
||||
sitePermissions = sitePermissions,
|
||||
|
@ -85,7 +84,7 @@ class DefaultQuickSettingsControllerTest {
|
|||
controller.handlePermissionToggled(websitePermission)
|
||||
|
||||
verify {
|
||||
controller.handleAndroidPermissionRequest(eqArray(cameraFeature.androidPermissionsList))
|
||||
controller.handleAndroidPermissionRequest(cameraFeature.androidPermissionsList)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -117,7 +116,7 @@ class DefaultQuickSettingsControllerTest {
|
|||
val invalidSitePermissionsController = DefaultQuickSettingsController(
|
||||
context = context,
|
||||
quickSettingsStore = store,
|
||||
coroutineScope = coroutinesScope,
|
||||
ioScope = coroutinesScope,
|
||||
navController = navController,
|
||||
session = browserSession,
|
||||
sitePermissions = null,
|
||||
|
@ -166,7 +165,7 @@ class DefaultQuickSettingsControllerTest {
|
|||
|
||||
controller.handleAndroidPermissionRequest(testPermissions)
|
||||
|
||||
verify { requestPermissions(eqArray(testPermissions)) }
|
||||
verify { requestPermissions(testPermissions) }
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -175,13 +174,11 @@ class DefaultQuickSettingsControllerTest {
|
|||
val testPermissions = mockk<SitePermissions>()
|
||||
|
||||
controller.handlePermissionsChange(testPermissions)
|
||||
advanceUntilIdle()
|
||||
|
||||
verifyOrder {
|
||||
permissionStorage.updateSitePermissions(testPermissions)
|
||||
reload(browserSession)
|
||||
}
|
||||
}
|
||||
|
||||
private inline fun <reified T> MockKMatcherScope.eqArray(value: Array<T>): Array<T> =
|
||||
match { it contentEquals value }
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue