1
0
Fork 0

For #8621 - fix intermittent test failures

master
Tiger Oakes 2020-06-16 09:06:59 -07:00 committed by Emily Kager
parent 621da0c4c1
commit 9a8b800a76
5 changed files with 17 additions and 17 deletions

View File

@ -8,6 +8,7 @@ import androidx.annotation.UiThread
import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.OnLifecycleEvent import androidx.lifecycle.OnLifecycleEvent
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import mozilla.components.service.glean.private.NoReasonCodes import mozilla.components.service.glean.private.NoReasonCodes
@ -75,12 +76,13 @@ object StartupTimeline {
*/ */
internal class StartupHomeActivityLifecycleObserver( internal class StartupHomeActivityLifecycleObserver(
private val frameworkStartMeasurement: StartupFrameworkStartMeasurement, private val frameworkStartMeasurement: StartupFrameworkStartMeasurement,
private val startupTimeline: PingType<NoReasonCodes> = Pings.startupTimeline private val startupTimeline: PingType<NoReasonCodes> = Pings.startupTimeline,
private val scope: CoroutineScope = GlobalScope
) : LifecycleObserver { ) : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_STOP) @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onStop() { 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. // Ensure any last metrics are set before submission.
frameworkStartMeasurement.setExpensiveMetric() frameworkStartMeasurement.setExpensiveMetric()

View File

@ -8,7 +8,6 @@ import android.content.Context
import androidx.annotation.VisibleForTesting import androidx.annotation.VisibleForTesting
import androidx.navigation.NavController import androidx.navigation.NavController
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import mozilla.components.browser.session.Session import mozilla.components.browser.session.Session
import mozilla.components.feature.session.SessionUseCases.ReloadUrlUseCase import mozilla.components.feature.session.SessionUseCases.ReloadUrlUseCase
@ -54,7 +53,7 @@ interface QuickSettingsController {
* @param context [Context] used for various Android interactions. * @param context [Context] used for various Android interactions.
* @param quickSettingsStore [QuickSettingsFragmentStore] holding the State for all Views displayed * @param quickSettingsStore [QuickSettingsFragmentStore] holding the State for all Views displayed
* in this Controller's Fragment. * 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 navController NavController] used for navigation.
* @param session [Session]? current browser state. * @param session [Session]? current browser state.
* @param sitePermissions [SitePermissions]? list of website permissions and their status. * @param sitePermissions [SitePermissions]? list of website permissions and their status.
@ -71,7 +70,7 @@ interface QuickSettingsController {
class DefaultQuickSettingsController( class DefaultQuickSettingsController(
private val context: Context, private val context: Context,
private val quickSettingsStore: QuickSettingsFragmentStore, private val quickSettingsStore: QuickSettingsFragmentStore,
private val coroutineScope: CoroutineScope, private val ioScope: CoroutineScope,
private val navController: NavController, private val navController: NavController,
private val session: Session?, private val session: Session?,
private var sitePermissions: SitePermissions?, private var sitePermissions: SitePermissions?,
@ -143,7 +142,7 @@ class DefaultQuickSettingsController(
*/ */
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
fun handlePermissionsChange(updatedPermissions: SitePermissions) { fun handlePermissionsChange(updatedPermissions: SitePermissions) {
coroutineScope.launch(Dispatchers.IO) { ioScope.launch {
permissionStorage.updateSitePermissions(updatedPermissions) permissionStorage.updateSitePermissions(updatedPermissions)
reload(session) reload(session)
} }

View File

@ -27,7 +27,9 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog 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.*
import kotlinx.android.synthetic.main.fragment_quick_settings_dialog_sheet.view.* import kotlinx.android.synthetic.main.fragment_quick_settings_dialog_sheet.view.*
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.plus
import mozilla.components.lib.state.ext.consumeFrom import mozilla.components.lib.state.ext.consumeFrom
import org.mozilla.fenix.BuildConfig import org.mozilla.fenix.BuildConfig
import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.HomeActivity
@ -75,7 +77,7 @@ class QuickSettingsSheetDialogFragment : AppCompatDialogFragment() {
quickSettingsController = DefaultQuickSettingsController( quickSettingsController = DefaultQuickSettingsController(
context = context, context = context,
quickSettingsStore = quickSettingsStore, quickSettingsStore = quickSettingsStore,
coroutineScope = viewLifecycleOwner.lifecycleScope, ioScope = viewLifecycleOwner.lifecycleScope + Dispatchers.IO,
navController = findNavController(), navController = findNavController(),
session = context.components.core.sessionManager.findSessionById(args.sessionId), session = context.components.core.sessionManager.findSessionById(args.sessionId),
sitePermissions = args.sitePermissions, sitePermissions = args.sitePermissions,

View File

@ -17,19 +17,19 @@ import org.junit.Test
@ExperimentalCoroutinesApi @ExperimentalCoroutinesApi
class StartupHomeActivityLifecycleObserverTest { class StartupHomeActivityLifecycleObserverTest {
private lateinit var observer: StartupHomeActivityLifecycleObserver
@MockK(relaxed = true) private lateinit var frameworkStartMeasurement: StartupFrameworkStartMeasurement @MockK(relaxed = true) private lateinit var frameworkStartMeasurement: StartupFrameworkStartMeasurement
@MockK(relaxed = true) private lateinit var startupTimeline: PingType<NoReasonCodes> @MockK(relaxed = true) private lateinit var startupTimeline: PingType<NoReasonCodes>
@Before @Before
fun setUp() { fun setUp() {
MockKAnnotations.init(this) MockKAnnotations.init(this)
observer = StartupHomeActivityLifecycleObserver(frameworkStartMeasurement, startupTimeline)
} }
@Test @Test
fun `WHEN onStop is called THEN the metrics are set and the ping is submitted`() = runBlockingTest { fun `WHEN onStop is called THEN the metrics are set and the ping is submitted`() = runBlockingTest {
val observer = StartupHomeActivityLifecycleObserver(frameworkStartMeasurement, startupTimeline, this)
observer.onStop() observer.onStop()
verifySequence { verifySequence {
frameworkStartMeasurement.setExpensiveMetric() frameworkStartMeasurement.setExpensiveMetric()
startupTimeline.submit() startupTimeline.submit()

View File

@ -6,7 +6,6 @@ package org.mozilla.fenix.settings.quicksettings
import androidx.navigation.NavController import androidx.navigation.NavController
import androidx.navigation.NavDirections import androidx.navigation.NavDirections
import io.mockk.MockKMatcherScope
import io.mockk.Runs import io.mockk.Runs
import io.mockk.every import io.mockk.every
import io.mockk.just import io.mockk.just
@ -53,7 +52,7 @@ class DefaultQuickSettingsControllerTest {
private val controller = spyk(DefaultQuickSettingsController( private val controller = spyk(DefaultQuickSettingsController(
context = context, context = context,
quickSettingsStore = store, quickSettingsStore = store,
coroutineScope = coroutinesScope, ioScope = coroutinesScope,
navController = navController, navController = navController,
session = browserSession, session = browserSession,
sitePermissions = sitePermissions, sitePermissions = sitePermissions,
@ -85,7 +84,7 @@ class DefaultQuickSettingsControllerTest {
controller.handlePermissionToggled(websitePermission) controller.handlePermissionToggled(websitePermission)
verify { verify {
controller.handleAndroidPermissionRequest(eqArray(cameraFeature.androidPermissionsList)) controller.handleAndroidPermissionRequest(cameraFeature.androidPermissionsList)
} }
} }
@ -117,7 +116,7 @@ class DefaultQuickSettingsControllerTest {
val invalidSitePermissionsController = DefaultQuickSettingsController( val invalidSitePermissionsController = DefaultQuickSettingsController(
context = context, context = context,
quickSettingsStore = store, quickSettingsStore = store,
coroutineScope = coroutinesScope, ioScope = coroutinesScope,
navController = navController, navController = navController,
session = browserSession, session = browserSession,
sitePermissions = null, sitePermissions = null,
@ -166,7 +165,7 @@ class DefaultQuickSettingsControllerTest {
controller.handleAndroidPermissionRequest(testPermissions) controller.handleAndroidPermissionRequest(testPermissions)
verify { requestPermissions(eqArray(testPermissions)) } verify { requestPermissions(testPermissions) }
} }
@Test @Test
@ -175,13 +174,11 @@ class DefaultQuickSettingsControllerTest {
val testPermissions = mockk<SitePermissions>() val testPermissions = mockk<SitePermissions>()
controller.handlePermissionsChange(testPermissions) controller.handlePermissionsChange(testPermissions)
advanceUntilIdle()
verifyOrder { verifyOrder {
permissionStorage.updateSitePermissions(testPermissions) permissionStorage.updateSitePermissions(testPermissions)
reload(browserSession) reload(browserSession)
} }
} }
private inline fun <reified T> MockKMatcherScope.eqArray(value: Array<T>): Array<T> =
match { it contentEquals value }
} }