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.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()

View File

@ -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)
}

View File

@ -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,

View File

@ -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()

View File

@ -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 }
}