[components] For https://github.com/mozilla-mobile/android-components/issues/11670: Use shadowOf(getMainLooper()).idle() to execute all posted tasks.

This is needed due to the new default Looper Mode - PAUSED in Robolectric.
This commit is contained in:
mcarare
2022-03-03 17:22:29 +02:00
committed by mergify[bot]
parent 42d0c1243e
commit 33d5df7988
33 changed files with 339 additions and 4 deletions

View File

@@ -5,6 +5,7 @@
package mozilla.components.browser.domains
import android.content.Context
import android.os.Looper.getMainLooper
import androidx.test.ext.junit.runners.AndroidJUnit4
import kotlinx.coroutines.Dispatchers
import mozilla.components.browser.domains.autocomplete.BaseDomainAutocompleteProvider
@@ -17,6 +18,7 @@ import org.junit.Assert.assertNull
import org.junit.Assert.assertTrue
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.Shadows.shadowOf
@RunWith(AndroidJUnit4::class)
class BaseDomainAutocompleteProviderTest {
@@ -60,6 +62,7 @@ class BaseDomainAutocompleteProviderTest {
val domainsCount = domains.size
val provider = createAndInitProvider(testContext, list) { domains }
shadowOf(getMainLooper()).idle()
assertCompletion(provider, list, domainsCount, "m", "m", "mozilla.org", "http://mozilla.org")
assertCompletion(provider, list, domainsCount, "moz", "moz", "mozilla.org", "http://mozilla.org")
@@ -83,6 +86,7 @@ class BaseDomainAutocompleteProviderTest {
val domainsCount = domains.size
val provider = createAndInitProvider(testContext, list) { domains }
shadowOf(getMainLooper()).idle()
assertCompletion(provider, list, domainsCount, "m", "m", "mozilla.org", "http://mozilla.org")
assertCompletion(provider, list, domainsCount, "moz", "moz", "mozilla.org", "http://mozilla.org")

View File

@@ -7,6 +7,7 @@ package mozilla.components.browser.engine.gecko
import android.content.Intent
import android.graphics.Color
import android.os.Handler
import android.os.Looper.getMainLooper
import android.os.Message
import android.view.WindowManager
import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -89,6 +90,7 @@ import org.mozilla.geckoview.WebRequestError.ERROR_CATEGORY_UNKNOWN
import org.mozilla.geckoview.WebRequestError.ERROR_MALFORMED_URI
import org.mozilla.geckoview.WebRequestError.ERROR_UNKNOWN
import org.mozilla.geckoview.WebResponse
import org.robolectric.Shadows.shadowOf
import java.security.Principal
import java.security.cert.X509Certificate
@@ -1291,6 +1293,7 @@ class GeckoEngineSessionTest {
val policy = TrackingProtectionPolicy.recommended()
session.updateTrackingProtection(policy)
shadowOf(getMainLooper()).idle()
verify(session).updateContentBlocking(policy)
assertTrue(session.etpEnabled!!)
@@ -1420,16 +1423,19 @@ class GeckoEngineSessionTest {
session.updateTrackingProtection(policy)
observers.forEach { session.register(it) }
shadowOf(getMainLooper()).idle()
observers.forEach {
verify(it).onTrackerBlockingEnabledChange(true)
}
observers.forEach { session.unregister(it) }
shadowOf(getMainLooper()).idle()
session.updateTrackingProtection(TrackingProtectionPolicy.none())
observers.forEach { session.register(it) }
shadowOf(getMainLooper()).idle()
observers.forEach {
verify(it).onTrackerBlockingEnabledChange(false)
@@ -2169,6 +2175,7 @@ class GeckoEngineSessionTest {
})
engineSession.findAll("mozilla")
shadowOf(getMainLooper()).idle()
assertEquals("mozilla", findObserved)
assertTrue(findResultObserved)
@@ -2200,10 +2207,14 @@ class GeckoEngineSessionTest {
})
engineSession.findNext(true)
shadowOf(getMainLooper()).idle()
assertTrue(findResultObserved)
verify(sessionFinder).find(null, 0)
engineSession.findNext(false)
shadowOf(getMainLooper()).idle()
assertTrue(findResultObserved)
verify(sessionFinder).find(null, GeckoSession.FINDER_FIND_BACKWARDS)
}

View File

@@ -7,6 +7,7 @@ package mozilla.components.browser.engine.gecko
import android.app.Activity
import android.content.Context
import android.graphics.Color
import android.os.Looper.getMainLooper
import androidx.test.ext.junit.runners.AndroidJUnit4
import mozilla.components.browser.engine.gecko.ext.getAntiTrackingPolicy
import mozilla.components.browser.engine.gecko.mediaquery.toGeckoValue
@@ -77,6 +78,7 @@ import org.mozilla.geckoview.WebExtension.InstallException.ErrorCodes.ERROR_USER
import org.mozilla.geckoview.WebExtensionController
import org.mozilla.geckoview.WebPushController
import org.robolectric.Robolectric
import org.robolectric.Shadows.shadowOf
import java.io.IOException
import org.mozilla.geckoview.WebExtension as GeckoWebExtension
@@ -698,6 +700,8 @@ class GeckoEngineTest {
)
result.complete(mockNativeWebExtension(extId, extUrl))
shadowOf(getMainLooper()).idle()
val extUrlCaptor = argumentCaptor<String>()
val extIdCaptor = argumentCaptor<String>()
verify(extensionController).ensureBuiltIn(extUrlCaptor.capture(), extIdCaptor.capture())
@@ -730,6 +734,8 @@ class GeckoEngineTest {
)
result.complete(mockNativeWebExtension(extId, extUrl))
shadowOf(getMainLooper()).idle()
val extCaptor = argumentCaptor<String>()
verify(extensionController).install(extCaptor.capture())
assertEquals(extUrl, extCaptor.value)
@@ -759,6 +765,8 @@ class GeckoEngineTest {
}
result.completeExceptionally(expected)
shadowOf(getMainLooper()).idle()
assertTrue(onErrorCalled)
assertEquals(expected, throwable)
}
@@ -785,6 +793,8 @@ class GeckoEngineTest {
}
result.completeExceptionally(expected)
shadowOf(getMainLooper()).idle()
assertTrue(onErrorCalled)
assertEquals(expected, throwable)
}
@@ -816,6 +826,9 @@ class GeckoEngineTest {
onError = { _, _ -> onErrorCalled = true }
)
result.complete(null)
shadowOf(getMainLooper()).idle()
verify(webExtensionsDelegate).onUninstalled(ext)
val extCaptor = argumentCaptor<GeckoWebExtension>()
@@ -855,6 +868,9 @@ class GeckoEngineTest {
throwable = e
}
result.completeExceptionally(expected)
shadowOf(getMainLooper()).idle()
verify(webExtensionsDelegate, never()).onUninstalled(ext)
assertTrue(onErrorCalled)
@@ -878,6 +894,8 @@ class GeckoEngineTest {
engine.installWebExtension(extId, extUrl)
result.complete(mockNativeWebExtension(extId, extUrl))
shadowOf(getMainLooper()).idle()
val extCaptor = argumentCaptor<WebExtension>()
verify(webExtensionsDelegate).onInstalled(extCaptor.capture())
assertEquals(extId, extCaptor.value.id)
@@ -901,6 +919,8 @@ class GeckoEngineTest {
engine.installWebExtension(extId, extUrl)
result.complete(mockNativeWebExtension(extId, extUrl))
shadowOf(getMainLooper()).idle()
val extCaptor = argumentCaptor<WebExtension>()
verify(webExtensionsDelegate).onInstalled(extCaptor.capture())
assertEquals(extId, extCaptor.value.id)
@@ -1034,6 +1054,8 @@ class GeckoEngineTest {
val extension = mockNativeWebExtension(extId, extUrl)
result.complete(extension)
shadowOf(getMainLooper()).idle()
val actionDelegateCaptor = argumentCaptor<org.mozilla.geckoview.WebExtension.ActionDelegate>()
verify(extension).setActionDelegate(actionDelegateCaptor.capture())
@@ -1068,6 +1090,8 @@ class GeckoEngineTest {
val extension = mockNativeWebExtension(extId, extUrl)
result.complete(extension)
shadowOf(getMainLooper()).idle()
val actionDelegateCaptor = argumentCaptor<org.mozilla.geckoview.WebExtension.ActionDelegate>()
verify(extension).setActionDelegate(actionDelegateCaptor.capture())
@@ -1102,6 +1126,8 @@ class GeckoEngineTest {
val extension = mockNativeWebExtension(extId, extUrl)
result.complete(extension)
shadowOf(getMainLooper()).idle()
val tabDelegateCaptor = argumentCaptor<org.mozilla.geckoview.WebExtension.TabDelegate>()
verify(extension).tabDelegate = tabDelegateCaptor.capture()
@@ -1132,6 +1158,8 @@ class GeckoEngineTest {
val extension = mockNativeWebExtension(extId, extUrl)
result.complete(extension)
shadowOf(getMainLooper()).idle()
val actionDelegateCaptor = argumentCaptor<org.mozilla.geckoview.WebExtension.ActionDelegate>()
verify(extension).setActionDelegate(actionDelegateCaptor.capture())
@@ -1166,6 +1194,8 @@ class GeckoEngineTest {
val extension = mockNativeWebExtension(extId, extUrl)
result.complete(extension)
shadowOf(getMainLooper()).idle()
val actionDelegateCaptor = argumentCaptor<org.mozilla.geckoview.WebExtension.ActionDelegate>()
verify(extension).setActionDelegate(actionDelegateCaptor.capture())
@@ -1200,6 +1230,8 @@ class GeckoEngineTest {
val extension = mockNativeWebExtension(extId, extUrl)
result.complete(extension)
shadowOf(getMainLooper()).idle()
val tabDelegateCaptor = argumentCaptor<org.mozilla.geckoview.WebExtension.TabDelegate>()
verify(extension).tabDelegate = tabDelegateCaptor.capture()
@@ -1256,6 +1288,8 @@ class GeckoEngineTest {
)
updateExtensionResult.complete(updatedExtension)
shadowOf(getMainLooper()).idle()
assertFalse(onErrorCalled)
assertNotNull(result)
}
@@ -1319,6 +1353,8 @@ class GeckoEngineTest {
)
updateExtensionResult.completeExceptionally(expected)
shadowOf(getMainLooper()).idle()
assertSame(expected, throwable!!.cause)
assertNull(result)
}
@@ -1347,6 +1383,9 @@ class GeckoEngineTest {
)
updateExtensionResult.completeExceptionally(exception)
shadowOf(getMainLooper()).idle()
throwable!!
}
@@ -1398,6 +1437,8 @@ class GeckoEngineTest {
)
installedExtensionResult.complete(installedExtensions)
shadowOf(getMainLooper()).idle()
assertFalse(onErrorCalled)
assertNotNull(extensions)
}
@@ -1422,6 +1463,8 @@ class GeckoEngineTest {
)
installedExtensionResult.completeExceptionally(expected)
shadowOf(getMainLooper()).idle()
assertSame(expected, throwable)
assertNull(extensions)
}
@@ -1454,6 +1497,8 @@ class GeckoEngineTest {
)
enableExtensionResult.complete(enabledExtension)
shadowOf(getMainLooper()).idle()
assertFalse(onErrorCalled)
assertNotNull(result)
verify(webExtensionsDelegate).onEnabled(result!!)
@@ -1487,6 +1532,8 @@ class GeckoEngineTest {
)
enableExtensionResult.completeExceptionally(expected)
shadowOf(getMainLooper()).idle()
assertSame(expected, throwable)
assertNull(result)
verify(webExtensionsDelegate, never()).onEnabled(any())
@@ -1520,6 +1567,8 @@ class GeckoEngineTest {
)
disableExtensionResult.complete(disabledExtension)
shadowOf(getMainLooper()).idle()
assertFalse(onErrorCalled)
assertNotNull(result)
verify(webExtensionsDelegate).onDisabled(result!!)
@@ -1553,6 +1602,8 @@ class GeckoEngineTest {
)
disableExtensionResult.completeExceptionally(expected)
shadowOf(getMainLooper()).idle()
assertSame(expected, throwable)
assertNull(result)
verify(webExtensionsDelegate, never()).onEnabled(any())
@@ -1587,6 +1638,8 @@ class GeckoEngineTest {
)
allowedInPrivateBrowsingExtensionResult.complete(allowedInPrivateBrowsing)
shadowOf(getMainLooper()).idle()
assertFalse(onErrorCalled)
assertNotNull(result)
verify(webExtensionsDelegate).onAllowedInPrivateBrowsingChanged(result!!)
@@ -1621,6 +1674,8 @@ class GeckoEngineTest {
)
allowedInPrivateBrowsingExtensionResult.completeExceptionally(expected)
shadowOf(getMainLooper()).idle()
assertSame(expected, throwable)
assertNull(result)
verify(webExtensionsDelegate, never()).onAllowedInPrivateBrowsingChanged(any())
@@ -1654,6 +1709,9 @@ class GeckoEngineTest {
val engine = GeckoEngine(context, runtime = runtime)
engine.clearData(data = Engine.BrowsingData.all(), onSuccess = { onSuccessCalled = true })
shadowOf(getMainLooper()).idle()
assertTrue(onSuccessCalled)
}
@@ -1679,6 +1737,9 @@ class GeckoEngineTest {
throwable = it
}
)
shadowOf(getMainLooper()).idle()
assertTrue(onErrorCalled)
assertSame(exception, throwable)
}
@@ -1702,6 +1763,9 @@ class GeckoEngineTest {
val engine = GeckoEngine(context, runtime = runtime)
engine.clearData(data = Engine.BrowsingData.all(), host = "mozilla.org", onSuccess = { onSuccessCalled = true })
shadowOf(getMainLooper()).idle()
assertTrue(onSuccessCalled)
}
@@ -1732,6 +1796,9 @@ class GeckoEngineTest {
throwable = it
}
)
shadowOf(getMainLooper()).idle()
assertTrue(onErrorCalled)
assertSame(exception, throwable)
}
@@ -1781,6 +1848,8 @@ class GeckoEngineTest {
logEntriesResult.complete(createDummyLogEntryList())
shadowOf(getMainLooper()).idle()
val trackerLog = trackersLog!!.first()
assertTrue(trackerLog.cookiesHasBeenBlocked)
assertEquals("www.tracker.com", trackerLog.url)
@@ -1810,6 +1879,8 @@ class GeckoEngineTest {
onError = { onErrorCalled = true }
)
shadowOf(getMainLooper()).idle()
assertTrue(onErrorCalled)
}
@@ -1839,6 +1910,8 @@ class GeckoEngineTest {
logEntriesResult.complete(createShimmedEntryList())
shadowOf(getMainLooper()).idle()
val trackerLog = trackersLog!!.first()
assertEquals("www.tracker.com", trackerLog.url)
assertTrue(trackerLog.blockedCategories.contains(TrackingCategory.SCRIPTS_AND_SUB_RESOURCES))
@@ -1867,6 +1940,8 @@ class GeckoEngineTest {
engine.getTrackersLog(mockSession, onSuccess = { trackersLog = it })
logEntriesResult.complete(createSocialTrackersLogEntryList())
shadowOf(getMainLooper()).idle()
var trackerLog = trackersLog!!.first()
assertTrue(trackerLog.cookiesHasBeenBlocked)
assertEquals("www.tracker.com", trackerLog.url)
@@ -1936,6 +2011,8 @@ class GeckoEngineTest {
)
logEntriesResult.complete(createDummyLogEntryList())
shadowOf(getMainLooper()).idle()
val trackerLog = trackersLog!![1]
assertTrue(trackerLog.loadedCategories.contains(TrackingCategory.SCRIPTS_AND_SUB_RESOURCES))
}

View File

@@ -8,6 +8,7 @@ import android.app.Activity
import android.content.Context
import android.graphics.Bitmap
import android.graphics.Color
import android.os.Looper.getMainLooper
import android.view.View
import androidx.test.ext.junit.runners.AndroidJUnit4
import mozilla.components.browser.engine.gecko.GeckoEngineView.Companion.DARK_COVER
@@ -32,6 +33,7 @@ import org.mockito.Mockito.verify
import org.mozilla.geckoview.GeckoResult
import org.mozilla.geckoview.GeckoSession
import org.robolectric.Robolectric.buildActivity
import org.robolectric.Shadows.shadowOf
@RunWith(AndroidJUnit4::class)
class GeckoEngineViewTest {
@@ -73,6 +75,8 @@ class GeckoEngineViewTest {
}
verify(mockGeckoView).capturePixels()
geckoResult.complete(mock())
shadowOf(getMainLooper()).idle()
assertNotNull(thumbnail)
geckoResult = GeckoResult()
@@ -83,6 +87,8 @@ class GeckoEngineViewTest {
thumbnail = it
}
geckoResult.completeExceptionally(mock())
shadowOf(getMainLooper()).idle()
assertNull(thumbnail)
// Test GeckoView throwing an exception

View File

@@ -3,6 +3,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package mozilla.components.browser.engine.gecko
import android.os.Looper.getMainLooper
import androidx.test.ext.junit.runners.AndroidJUnit4
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
@@ -30,6 +31,7 @@ import org.mozilla.geckoview.GeckoSession.PermissionDelegate.ContentPermission.V
import org.mozilla.geckoview.GeckoSession.PermissionDelegate.ContentPermission.VALUE_DENY
import org.mozilla.geckoview.GeckoSession.PermissionDelegate.PERMISSION_TRACKING
import org.mozilla.geckoview.StorageController
import org.robolectric.Shadows.shadowOf
@RunWith(AndroidJUnit4::class)
class GeckoTrackingProtectionExceptionStorageTest {
@@ -169,6 +171,7 @@ class GeckoTrackingProtectionExceptionStorageTest {
storage.remove("https://example.com/")
geckoResult.complete(listOf(contentPermission))
shadowOf(getMainLooper()).idle()
verify(storageController).setPermission(contentPermission, VALUE_DENY)
}
@@ -196,6 +199,7 @@ class GeckoTrackingProtectionExceptionStorageTest {
storage.removeAll(listOf(session))
geckoResult.complete(listOf(contentPermission))
shadowOf(getMainLooper()).idle()
verify(storageController).setPermission(contentPermission, VALUE_DENY)
assertFalse(excludedOnTrackingProtection)
@@ -217,6 +221,7 @@ class GeckoTrackingProtectionExceptionStorageTest {
}
geckoResult.complete(listOf(contentPermission))
shadowOf(getMainLooper()).idle()
assertTrue(exceptionList!!.isNotEmpty())
val exception = exceptionList!!.first() as GeckoTrackingProtectionException
@@ -246,6 +251,7 @@ class GeckoTrackingProtectionExceptionStorageTest {
}
geckoResult.complete(listOf(contentPermission))
shadowOf(getMainLooper()).idle()
assertTrue(containsException)

View File

@@ -6,6 +6,7 @@ package mozilla.components.browser.engine.gecko
import android.app.Activity
import android.content.Context
import android.os.Looper.getMainLooper
import android.view.MotionEvent
import android.view.MotionEvent.ACTION_CANCEL
import android.view.MotionEvent.ACTION_DOWN
@@ -30,6 +31,7 @@ import org.mockito.Mockito.times
import org.mockito.Mockito.verify
import org.mozilla.geckoview.PanZoomController.INPUT_RESULT_HANDLED
import org.robolectric.Robolectric.buildActivity
import org.robolectric.Shadows.shadowOf
@RunWith(AndroidJUnit4::class)
class NestedGeckoViewTest {
@@ -83,6 +85,7 @@ class NestedGeckoViewTest {
nestedWebView.childHelper = mockChildHelper
nestedWebView.onTouchEvent(downEvent)
shadowOf(getMainLooper()).idle()
// We pass a deep copy to `updateInputResult`.
// Can't easily check for equality, `eventTime` should be good enough.

View File

@@ -5,6 +5,7 @@
package mozilla.components.browser.engine.gecko.prompt
import android.net.Uri
import android.os.Looper.getMainLooper
import androidx.test.ext.junit.runners.AndroidJUnit4
import mozilla.components.browser.engine.gecko.GeckoEngineSession
import mozilla.components.browser.engine.gecko.ext.toAutocompleteCreditCard
@@ -51,6 +52,7 @@ import org.mozilla.geckoview.GeckoSession.PromptDelegate.DateTimePrompt.Type.WEE
import org.mozilla.geckoview.GeckoSession.PromptDelegate.FilePrompt.Capture.ANY
import org.mozilla.geckoview.GeckoSession.PromptDelegate.FilePrompt.Capture.NONE
import org.mozilla.geckoview.GeckoSession.PromptDelegate.FilePrompt.Capture.USER
import org.robolectric.Shadows.shadowOf
import java.io.FileInputStream
import java.security.InvalidParameterException
import java.util.Calendar
@@ -106,11 +108,13 @@ class GeckoPromptDelegateTest {
val request = promptRequestSingleChoice as SingleChoice
request.onConfirm(request.choices.first())
shadowOf(getMainLooper()).idle()
assertTrue(confirmWasCalled)
whenever(geckoPrompt.isComplete).thenReturn(true)
confirmWasCalled = false
request.onConfirm(request.choices.first())
shadowOf(getMainLooper()).idle()
assertFalse(confirmWasCalled)
}
@@ -143,11 +147,13 @@ class GeckoPromptDelegateTest {
assertTrue(promptRequestSingleChoice is MultipleChoice)
(promptRequestSingleChoice as MultipleChoice).onConfirm(arrayOf())
shadowOf(getMainLooper()).idle()
assertTrue(confirmWasCalled)
whenever(geckoPrompt.isComplete).thenReturn(true)
confirmWasCalled = false
(promptRequestSingleChoice as MultipleChoice).onConfirm(arrayOf())
shadowOf(getMainLooper()).idle()
assertFalse(confirmWasCalled)
}
@@ -181,11 +187,13 @@ class GeckoPromptDelegateTest {
val request = promptRequestSingleChoice as PromptRequest.MenuChoice
request.onConfirm(request.choices.first())
shadowOf(getMainLooper()).idle()
assertTrue(confirmWasCalled)
whenever(geckoPrompt.isComplete).thenReturn(true)
confirmWasCalled = false
request.onConfirm(request.choices.first())
shadowOf(getMainLooper()).idle()
assertFalse(confirmWasCalled)
}
@@ -222,6 +230,7 @@ class GeckoPromptDelegateTest {
assertTrue(alertRequest is PromptRequest.Alert)
(alertRequest as PromptRequest.Alert).onDismiss()
shadowOf(getMainLooper()).idle()
assertTrue(dismissWasCalled)
assertEquals((alertRequest as PromptRequest.Alert).title, "title")
@@ -319,8 +328,13 @@ class GeckoPromptDelegateTest {
geckoResult!!.accept {
confirmCalled = true
}
shadowOf(getMainLooper()).idle()
assertTrue(dateRequest is PromptRequest.TimeSelection)
(dateRequest as PromptRequest.TimeSelection).onConfirm(Date())
shadowOf(getMainLooper()).idle()
assertTrue(confirmCalled)
assertEquals((dateRequest as PromptRequest.TimeSelection).title, "title")
}
@@ -377,8 +391,11 @@ class GeckoPromptDelegateTest {
confirmCalled = true
}
shadowOf(getMainLooper()).idle()
assertTrue(dateRequest is PromptRequest.TimeSelection)
(dateRequest as PromptRequest.TimeSelection).onConfirm(Date())
shadowOf(getMainLooper()).idle()
assertTrue(confirmCalled)
assertEquals((dateRequest as PromptRequest.TimeSelection).title, "title")
}
@@ -438,6 +455,7 @@ class GeckoPromptDelegateTest {
assertTrue(dateRequest is PromptRequest.TimeSelection)
(dateRequest as PromptRequest.TimeSelection).onConfirm(Date())
shadowOf(getMainLooper()).idle()
assertTrue(confirmCalled)
assertEquals((dateRequest as PromptRequest.TimeSelection).title, "title")
}
@@ -497,6 +515,8 @@ class GeckoPromptDelegateTest {
assertTrue(dateRequest is PromptRequest.TimeSelection)
(dateRequest as PromptRequest.TimeSelection).onConfirm(Date())
shadowOf(getMainLooper()).idle()
assertTrue(confirmCalled)
assertEquals((dateRequest as PromptRequest.TimeSelection).title, "title")
}
@@ -596,11 +616,15 @@ class GeckoPromptDelegateTest {
}
filePickerRequest.onSingleFileSelected(context, mockUri)
shadowOf(getMainLooper()).idle()
assertTrue(onSingleFileSelectedWasCalled)
whenever(geckoPrompt.isComplete).thenReturn(true)
onSingleFileSelectedWasCalled = false
filePickerRequest.onSingleFileSelected(context, mockUri)
shadowOf(getMainLooper()).idle()
assertFalse(onSingleFileSelectedWasCalled)
geckoPrompt = geckoFilePrompt(type = GECKO_PROMPT_FILE_TYPE.MULTIPLE, capture = ANY)
@@ -610,6 +634,8 @@ class GeckoPromptDelegateTest {
}
filePickerRequest.onMultipleFilesSelected(context, arrayOf(mockUri))
shadowOf(getMainLooper()).idle()
assertTrue(onMultipleFilesSelectedWasCalled)
geckoPrompt = geckoFilePrompt(type = GECKO_PROMPT_FILE_TYPE.SINGLE, capture = NONE)
@@ -619,6 +645,8 @@ class GeckoPromptDelegateTest {
}
filePickerRequest.onDismiss()
shadowOf(getMainLooper()).idle()
assertTrue(onDismissWasCalled)
assertTrue(filePickerRequest.mimeTypes.isEmpty())
@@ -664,6 +692,8 @@ class GeckoPromptDelegateTest {
}
loginSaveRequest.onDismiss()
shadowOf(getMainLooper()).idle()
assertTrue(onDismissWasCalled)
val geckoPrompt = geckoLoginSavePrompt(arrayOf(saveOption))
@@ -674,12 +704,15 @@ class GeckoPromptDelegateTest {
}
loginSaveRequest.onConfirm(entry)
shadowOf(getMainLooper()).idle()
assertTrue(onLoginSaved)
whenever(geckoPrompt.isComplete).thenReturn(true)
onLoginSaved = false
loginSaveRequest.onConfirm(entry)
shadowOf(getMainLooper()).idle()
assertFalse(onLoginSaved)
}
@@ -737,6 +770,7 @@ class GeckoPromptDelegateTest {
}
loginSelectRequest.onDismiss()
shadowOf(getMainLooper()).idle()
assertTrue(onDismissWasCalled)
val geckoPrompt = geckoLoginSelectPrompt(arrayOf(loginSelectOption, secondLoginSelectOption))
@@ -750,11 +784,14 @@ class GeckoPromptDelegateTest {
}
loginSelectRequest.onConfirm(login)
shadowOf(getMainLooper()).idle()
assertTrue(onLoginSelected)
whenever(geckoPrompt.isComplete).thenReturn(true)
onLoginSelected = false
loginSelectRequest.onConfirm(login)
shadowOf(getMainLooper()).idle()
assertFalse(onLoginSelected)
}
@@ -845,6 +882,7 @@ class GeckoPromptDelegateTest {
}
selectCreditCardPrompt.onDismiss()
shadowOf(getMainLooper()).idle()
assertTrue(onDismissWasCalled)
val geckoPrompt =
@@ -856,6 +894,7 @@ class GeckoPromptDelegateTest {
}
selectCreditCardPrompt.onConfirm(creditCard1)
shadowOf(getMainLooper()).idle()
assertTrue(onConfirmWasCalled)
@@ -952,11 +991,13 @@ class GeckoPromptDelegateTest {
with(colorRequest) {
assertEquals(defaultColor, "#e66465")
onConfirm("#f6b73c")
shadowOf(getMainLooper()).idle()
assertTrue(onConfirmWasCalled)
whenever(geckoPrompt.isComplete).thenReturn(true)
onConfirmWasCalled = false
onConfirm("#f6b73c")
shadowOf(getMainLooper()).idle()
assertFalse(onConfirmWasCalled)
}
@@ -966,6 +1007,7 @@ class GeckoPromptDelegateTest {
}
colorRequest.onDismiss()
shadowOf(getMainLooper()).idle()
assertTrue(onDismissWasCalled)
with(colorRequest) {
@@ -999,6 +1041,7 @@ class GeckoPromptDelegateTest {
assertEquals(inputValue, "defaultValue")
onDismiss()
shadowOf(getMainLooper()).idle()
assertTrue(dismissWasCalled)
}
@@ -1009,11 +1052,13 @@ class GeckoPromptDelegateTest {
}
request.onConfirm(true, "newInput")
shadowOf(getMainLooper()).idle()
assertTrue(confirmWasCalled)
whenever(geckoPrompt.isComplete).thenReturn(true)
confirmWasCalled = false
request.onConfirm(true, "newInput")
shadowOf(getMainLooper()).idle()
assertFalse(confirmWasCalled)
}
@@ -1141,11 +1186,13 @@ class GeckoPromptDelegateTest {
assertEquals(data.url, "https://example.com")
onSuccess()
shadowOf(getMainLooper()).idle()
assertTrue(onSuccessWasCalled)
whenever(geckoPrompt.isComplete).thenReturn(true)
onSuccessWasCalled = false
onSuccess()
shadowOf(getMainLooper()).idle()
assertFalse(onSuccessWasCalled)
}
@@ -1156,11 +1203,13 @@ class GeckoPromptDelegateTest {
}
request!!.onFailure()
shadowOf(getMainLooper()).idle()
assertTrue(onFailureWasCalled)
whenever(geckoPrompt.isComplete).thenReturn(true)
onFailureWasCalled = false
request!!.onFailure()
shadowOf(getMainLooper()).idle()
assertFalse(onFailureWasCalled)
@@ -1171,6 +1220,7 @@ class GeckoPromptDelegateTest {
}
request!!.onDismiss()
shadowOf(getMainLooper()).idle()
assertTrue(onDismissWasCalled)
}
@@ -1204,11 +1254,13 @@ class GeckoPromptDelegateTest {
assertEquals(message, "message")
onConfirmPositiveButton(false)
shadowOf(getMainLooper()).idle()
assertTrue(onPositiveButtonWasCalled)
whenever(geckoPrompt.isComplete).thenReturn(true)
onPositiveButtonWasCalled = false
onConfirmPositiveButton(false)
shadowOf(getMainLooper()).idle()
assertFalse(onPositiveButtonWasCalled)
}
@@ -1220,6 +1272,7 @@ class GeckoPromptDelegateTest {
}
request.onConfirmNeutralButton(false)
shadowOf(getMainLooper()).idle()
assertTrue(onNeutralButtonWasCalled)
geckoPrompt = geckoButtonPrompt()
@@ -1229,11 +1282,13 @@ class GeckoPromptDelegateTest {
}
request.onConfirmNegativeButton(false)
shadowOf(getMainLooper()).idle()
assertTrue(onNegativeButtonWasCalled)
whenever(geckoPrompt.isComplete).thenReturn(true)
onNegativeButtonWasCalled = false
request.onConfirmNegativeButton(false)
shadowOf(getMainLooper()).idle()
assertFalse(onNegativeButtonWasCalled)
@@ -1243,6 +1298,7 @@ class GeckoPromptDelegateTest {
}
request.onDismiss()
shadowOf(getMainLooper()).idle()
assertTrue(dismissWasCalled)
}
@@ -1267,11 +1323,13 @@ class GeckoPromptDelegateTest {
onPositiveButtonWasCalled = true
}
request.onConfirm()
shadowOf(getMainLooper()).idle()
assertTrue(onPositiveButtonWasCalled)
whenever(geckoPrompt.isComplete).thenReturn(true)
onPositiveButtonWasCalled = false
request.onConfirm()
shadowOf(getMainLooper()).idle()
assertFalse(onPositiveButtonWasCalled)
@@ -1281,11 +1339,13 @@ class GeckoPromptDelegateTest {
onNegativeButtonWasCalled = true
}
request.onDismiss()
shadowOf(getMainLooper()).idle()
assertTrue(onNegativeButtonWasCalled)
whenever(geckoPrompt.isComplete).thenReturn(true)
onNegativeButtonWasCalled = false
request.onDismiss()
shadowOf(getMainLooper()).idle()
assertFalse(onNegativeButtonWasCalled)
}

View File

@@ -6,6 +6,7 @@ package mozilla.components.browser.icons
import android.graphics.Bitmap
import android.graphics.drawable.Drawable
import android.os.Looper.getMainLooper
import android.widget.ImageView
import androidx.test.ext.junit.runners.AndroidJUnit4
import kotlinx.coroutines.CompletableDeferred
@@ -35,6 +36,7 @@ import org.mockito.Mockito.doReturn
import org.mockito.Mockito.never
import org.mockito.Mockito.spy
import org.mockito.Mockito.verify
import org.robolectric.Shadows.shadowOf
import java.io.OutputStream
@RunWith(AndroidJUnit4::class)
@@ -223,6 +225,7 @@ class BrowserIconsTest {
verify(view, never()).setImageBitmap(any())
result.complete(mockedIcon)
shadowOf(getMainLooper()).idle()
job.joinBlocking()
verify(view).setImageBitmap(mockedBitmap)
@@ -247,6 +250,7 @@ class BrowserIconsTest {
verify(view).setImageDrawable(placeholder)
result.cancel()
shadowOf(getMainLooper()).idle()
job.joinBlocking()
verify(view).setImageDrawable(error)

View File

@@ -4,6 +4,7 @@
package mozilla.components.feature.accounts.push
import android.os.Looper.getMainLooper
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
import mozilla.components.concept.base.crash.CrashReporting
@@ -28,6 +29,7 @@ import org.mockito.Mockito.reset
import org.mockito.Mockito.verify
import org.mockito.Mockito.verifyNoMoreInteractions
import org.robolectric.RobolectricTestRunner
import org.robolectric.Shadows.shadowOf
@RunWith(RobolectricTestRunner::class)
class AccountObserverTest {
@@ -63,12 +65,14 @@ class AccountObserverTest {
`when`(lifecycleOwner.lifecycle).thenReturn(lifecycle)
observer.onAuthenticated(account, AuthType.Existing)
shadowOf(getMainLooper()).idle()
verify(constellation).registerDeviceObserver(any(), eq(lifecycleOwner), anyBoolean())
reset(constellation)
observer.onAuthenticated(account, AuthType.Recovered)
shadowOf(getMainLooper()).idle()
verify(constellation).registerDeviceObserver(any(), eq(lifecycleOwner), anyBoolean())
}

View File

@@ -5,6 +5,7 @@
package mozilla.components.feature.accounts
import android.content.Context
import android.os.Looper.getMainLooper
import androidx.test.ext.junit.runners.AndroidJUnit4
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.runBlocking
@@ -34,6 +35,7 @@ import org.mockito.ArgumentMatchers.anyString
import org.mockito.Mockito.`when`
import org.mockito.Mockito.never
import org.mockito.Mockito.verify
import org.robolectric.Shadows.shadowOf
import org.robolectric.annotation.Config
import kotlin.coroutines.CoroutineContext
@@ -183,6 +185,9 @@ class FirefoxAccountsAuthFeatureTest {
RequestInterceptor.InterceptionResponse.Url(redirectUrl),
feature.interceptor.onLoadRequest(mock(), "https://accounts.firefox.com/oauth/success/123/?code=testCode1&state=testState1", null, false, false, false, false, false)
)
shadowOf(getMainLooper()).idle()
verify(manager).finishAuthentication(
FxaAuthData(authType = AuthType.OtherExternal(null), code = "testCode1", state = "testState1")
)
@@ -192,6 +197,9 @@ class FirefoxAccountsAuthFeatureTest {
RequestInterceptor.InterceptionResponse.Url(redirectUrl),
feature.interceptor.onLoadRequest(mock(), "https://accounts.firefox.com/oauth/success/123/?code=testCode2&state=testState2&action=signin", null, false, false, false, false, false)
)
shadowOf(getMainLooper()).idle()
verify(manager).finishAuthentication(
FxaAuthData(authType = AuthType.Signin, code = "testCode2", state = "testState2")
)
@@ -201,6 +209,9 @@ class FirefoxAccountsAuthFeatureTest {
RequestInterceptor.InterceptionResponse.Url(redirectUrl),
feature.interceptor.onLoadRequest(mock(), "https://accounts.firefox.com/oauth/success/123/?code=testCode3&state=testState3&action=signup", null, false, false, false, false, false)
)
shadowOf(getMainLooper()).idle()
verify(manager).finishAuthentication(
FxaAuthData(authType = AuthType.Signup, code = "testCode3", state = "testState3")
)
@@ -210,6 +221,9 @@ class FirefoxAccountsAuthFeatureTest {
RequestInterceptor.InterceptionResponse.Url(redirectUrl),
feature.interceptor.onLoadRequest(mock(), "https://accounts.firefox.com/oauth/success/123/?code=testCode4&state=testState4&action=pairing", null, false, false, false, false, false)
)
shadowOf(getMainLooper()).idle()
verify(manager).finishAuthentication(
FxaAuthData(authType = AuthType.Pairing, code = "testCode4", state = "testState4")
)
@@ -219,6 +233,9 @@ class FirefoxAccountsAuthFeatureTest {
RequestInterceptor.InterceptionResponse.Url(redirectUrl),
feature.interceptor.onLoadRequest(mock(), "https://accounts.firefox.com/oauth/success/123/?code=testCode5&state=testState5&action=someNewActionType", null, false, false, false, false, false)
)
shadowOf(getMainLooper()).idle()
verify(manager).finishAuthentication(
FxaAuthData(authType = AuthType.OtherExternal("someNewActionType"), code = "testCode5", state = "testState5")
)

View File

@@ -4,6 +4,7 @@
package mozilla.components.feature.accounts
import android.os.Looper.getMainLooper
import androidx.test.ext.junit.runners.AndroidJUnit4
import kotlinx.coroutines.runBlocking
import mozilla.components.browser.state.state.BrowserState
@@ -42,6 +43,7 @@ import org.mockito.Mockito.never
import org.mockito.Mockito.spy
import org.mockito.Mockito.times
import org.mockito.Mockito.verify
import org.robolectric.Shadows.shadowOf
@RunWith(AndroidJUnit4::class)
class FxaWebChannelFeatureTest {
@@ -165,6 +167,8 @@ class FxaWebChannelFeatureTest {
webchannelFeature.extensionController = controller
webchannelFeature.start()
shadowOf(getMainLooper()).idle()
verify(controller).registerContentMessageHandler(eq(engineSession), any(), any())
}
@@ -178,6 +182,7 @@ class FxaWebChannelFeatureTest {
val webchannelFeature = prepareFeatureForTest(ext, port, engineSession, expectedEngines)
whenever(port.senderUrl()).thenReturn("https://bar.foo/email")
webchannelFeature.start()
shadowOf(getMainLooper()).idle()
verify(ext).registerContentMessageHandler(
eq(engineSession),
@@ -213,6 +218,7 @@ class FxaWebChannelFeatureTest {
setOf(FxaCapability.CHOOSE_WHAT_TO_SYNC)
)
webchannelFeature.start()
shadowOf(getMainLooper()).idle()
verify(ext).registerContentMessageHandler(
eq(engineSession),
@@ -246,6 +252,7 @@ class FxaWebChannelFeatureTest {
val responseToTheWebChannel = argumentCaptor<JSONObject>()
val webchannelFeature = prepareFeatureForTest(ext, port, engineSession, expectedEngines)
webchannelFeature.start()
shadowOf(getMainLooper()).idle()
verify(ext).registerContentMessageHandler(
eq(engineSession),
@@ -285,6 +292,7 @@ class FxaWebChannelFeatureTest {
val responseToTheWebChannel = argumentCaptor<JSONObject>()
val webchannelFeature = prepareFeatureForTest(ext, port, engineSession, expectedEngines)
webchannelFeature.start()
shadowOf(getMainLooper()).idle()
verify(ext).registerContentMessageHandler(
eq(engineSession),
@@ -337,6 +345,7 @@ class FxaWebChannelFeatureTest {
val webchannelFeature = prepareFeatureForTest(ext, port, engineSession, expectedEngines, emptySet(), accountManager)
webchannelFeature.start()
shadowOf(getMainLooper()).idle()
verify(ext).registerContentMessageHandler(
eq(engineSession),
@@ -392,6 +401,7 @@ class FxaWebChannelFeatureTest {
val webchannelFeature = prepareFeatureForTest(ext, port, engineSession, expectedEngines, emptySet(), accountManager)
webchannelFeature.start()
shadowOf(getMainLooper()).idle()
verify(ext).registerContentMessageHandler(
eq(engineSession),
@@ -446,6 +456,8 @@ class FxaWebChannelFeatureTest {
val webchannelFeature = prepareFeatureForTest(ext, port, engineSession, expectedEngines, emptySet(), accountManager)
webchannelFeature.start()
shadowOf(getMainLooper()).idle()
verify(ext).registerContentMessageHandler(
eq(engineSession),
eq(FxaWebChannelFeature.WEB_CHANNEL_MESSAGING_ID),
@@ -492,6 +504,7 @@ class FxaWebChannelFeatureTest {
val webchannelFeature = prepareFeatureForTest(ext, port, engineSession, expectedEngines, emptySet(), accountManager)
webchannelFeature.start()
shadowOf(getMainLooper()).idle()
verify(ext).registerContentMessageHandler(
eq(engineSession),
@@ -538,6 +551,7 @@ class FxaWebChannelFeatureTest {
val webchannelFeature = prepareFeatureForTest(ext, port, engineSession, null, emptySet(), accountManager)
webchannelFeature.start()
shadowOf(getMainLooper()).idle()
verify(ext).registerContentMessageHandler(
eq(engineSession),
@@ -578,6 +592,7 @@ class FxaWebChannelFeatureTest {
val webchannelFeature = prepareFeatureForTest(ext, port, engineSession, null, emptySet(), accountManager)
webchannelFeature.start()
shadowOf(getMainLooper()).idle()
verify(ext).registerContentMessageHandler(
eq(engineSession),
@@ -610,6 +625,7 @@ class FxaWebChannelFeatureTest {
val webchannelFeature = prepareFeatureForTest(ext, port, engineSession, null, emptySet(), accountManager)
webchannelFeature.start()
shadowOf(getMainLooper()).idle()
verify(ext).registerContentMessageHandler(
eq(engineSession),
@@ -644,6 +660,7 @@ class FxaWebChannelFeatureTest {
val webchannelFeature = prepareFeatureForTest(ext, port, engineSession, expectedEngines, emptySet(), accountManager)
webchannelFeature.start()
shadowOf(getMainLooper()).idle()
verify(ext).registerContentMessageHandler(
eq(engineSession),
@@ -757,6 +774,8 @@ class FxaWebChannelFeatureTest {
state = state,
declinedEngines = declined ?: emptySet()
)
shadowOf(getMainLooper()).idle()
verify(accountManager).finishAuthentication(expectedAuthData)
}

View File

@@ -4,6 +4,7 @@
package mozilla.components.feature.app.links
import android.os.Looper.getMainLooper
import android.widget.Button
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentTransaction
@@ -17,6 +18,7 @@ import org.junit.runner.RunWith
import org.mockito.Mockito.doNothing
import org.mockito.Mockito.doReturn
import org.mockito.Mockito.spy
import org.robolectric.Shadows.shadowOf
@RunWith(AndroidJUnit4::class)
class SimpleRedirectDialogFragmentTest {
@@ -46,6 +48,8 @@ class SimpleRedirectDialogFragmentTest {
val confirmButton = dialog.findViewById<Button>(android.R.id.button1)
confirmButton?.performClick()
shadowOf(getMainLooper()).idle()
assertTrue(onConfirmCalled)
assertFalse(onCancelCalled)
}
@@ -74,6 +78,8 @@ class SimpleRedirectDialogFragmentTest {
val confirmButton = dialog.findViewById<Button>(android.R.id.button2)
confirmButton?.performClick()
shadowOf(getMainLooper()).idle()
assertFalse(onConfirmCalled)
assertTrue(onCancelCalled)
}

View File

@@ -10,6 +10,7 @@ import android.app.DownloadManager.ACTION_DOWNLOAD_COMPLETE
import android.app.DownloadManager.Request
import android.content.Intent
import android.os.Build
import android.os.Looper.getMainLooper
import androidx.test.ext.junit.runners.AndroidJUnit4
import mozilla.components.browser.state.state.content.DownloadState
import mozilla.components.browser.state.store.BrowserStore
@@ -29,6 +30,7 @@ import org.mockito.Mockito.doReturn
import org.mockito.Mockito.spy
import org.mockito.Mockito.verify
import org.mockito.Mockito.verifyNoInteractions
import org.robolectric.Shadows.shadowOf
@RunWith(AndroidJUnit4::class)
class AndroidDownloadManagerTest {
@@ -67,6 +69,7 @@ class AndroidDownloadManagerTest {
assertEquals(download.copy(id = id), store.state.downloads[id])
notifyDownloadCompleted(id)
shadowOf(getMainLooper()).idle()
assertTrue(downloadCompleted)
}
@@ -78,13 +81,14 @@ class AndroidDownloadManagerTest {
grantPermissions()
val id = downloadManager.download(download)!!
store.waitUntilIdle()
notifyDownloadFailed(id)
shadowOf(getMainLooper()).idle()
assertTrue(downloadStopped)
downloadStopped = false
downloadManager.tryAgain(id)
notifyDownloadCompleted(id)
shadowOf(getMainLooper()).idle()
assertTrue(downloadStopped)
}
@@ -131,7 +135,6 @@ class AndroidDownloadManagerTest {
downloadWithFileName,
cookie = "yummy_cookie=choco"
)!!
store.waitUntilIdle()
downloadManager.onDownloadStopped = { _, _, status ->
downloadStatus = status
@@ -139,6 +142,7 @@ class AndroidDownloadManagerTest {
}
notifyDownloadCompleted(id)
shadowOf(getMainLooper()).idle()
assertTrue(downloadCompleted)
assertEquals(DownloadState.Status.COMPLETED, downloadStatus)
@@ -162,7 +166,7 @@ class AndroidDownloadManagerTest {
assertEquals(downloadWithFileName.copy(id = id), store.state.downloads[id])
notifyDownloadCompleted(id)
store.waitUntilIdle()
shadowOf(getMainLooper()).idle()
assertEquals(DownloadState.Status.COMPLETED, downloadStatus)
}

View File

@@ -12,6 +12,7 @@ import android.app.DownloadManager.EXTRA_DOWNLOAD_ID
import android.content.Context
import android.content.Intent
import android.os.Build
import android.os.Looper.getMainLooper
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import androidx.test.ext.junit.runners.AndroidJUnit4
import mozilla.components.browser.state.state.content.DownloadState
@@ -35,6 +36,7 @@ import org.mockito.Mockito.doReturn
import org.mockito.Mockito.never
import org.mockito.Mockito.spy
import org.mockito.Mockito.verify
import org.robolectric.Shadows.shadowOf
@RunWith(AndroidJUnit4::class)
class FetchDownloadManagerTest {
@@ -79,6 +81,8 @@ class FetchDownloadManagerTest {
assertEquals(download, store.state.downloads[download.id])
notifyDownloadCompleted(id)
shadowOf(getMainLooper()).idle()
assertTrue(downloadStopped)
}
@@ -95,12 +99,15 @@ class FetchDownloadManagerTest {
val id = downloadManager.download(download)!!
store.waitUntilIdle()
notifyDownloadFailed(id)
shadowOf(getMainLooper()).idle()
assertTrue(downloadStopped)
downloadStopped = false
downloadManager.tryAgain(id)
verify(context).startService(any())
notifyDownloadCompleted(id)
shadowOf(getMainLooper()).idle()
assertTrue(downloadStopped)
}
@@ -178,6 +185,8 @@ class FetchDownloadManagerTest {
store.waitUntilIdle()
notifyDownloadCompleted(id)
shadowOf(getMainLooper()).idle()
assertTrue(downloadStopped)
assertEquals(DownloadState.Status.COMPLETED, downloadStatus)
}
@@ -200,6 +209,8 @@ class FetchDownloadManagerTest {
assertEquals(downloadWithFileName, store.state.downloads[downloadWithFileName.id])
notifyDownloadCompleted(id)
shadowOf(getMainLooper()).idle()
store.waitUntilIdle()
assertEquals(DownloadState.Status.COMPLETED, downloadStatus)
}
@@ -224,6 +235,7 @@ class FetchDownloadManagerTest {
val id = downloadManager.download(downloadWithFileName)!!
store.waitUntilIdle()
notifyDownloadCompleted(id)
shadowOf(getMainLooper()).idle()
assertTrue(downloadStopped)
assertEquals("5MB.zip", downloadName)

View File

@@ -5,6 +5,7 @@
package mozilla.components.feature.prompts.dialog
import android.content.DialogInterface.BUTTON_POSITIVE
import android.os.Looper.getMainLooper
import android.widget.CheckBox
import android.widget.TextView
import androidx.appcompat.app.AlertDialog
@@ -26,6 +27,7 @@ import org.mockito.Mockito.doReturn
import org.mockito.Mockito.spy
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations.openMocks
import org.robolectric.Shadows.shadowOf
@RunWith(AndroidJUnit4::class)
class AlertDialogFragmentTest {
@@ -99,6 +101,7 @@ class AlertDialogFragmentTest {
val positiveButton = (dialog as AlertDialog).getButton(BUTTON_POSITIVE)
positiveButton.performClick()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onCancel("sessionId", "uid")
}
@@ -122,6 +125,7 @@ class AlertDialogFragmentTest {
val positiveButton = (dialog as AlertDialog).getButton(BUTTON_POSITIVE)
positiveButton.performClick()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onConfirm("sessionId", "uid", true)
}

View File

@@ -5,6 +5,7 @@
package mozilla.components.feature.prompts.dialog
import android.content.DialogInterface
import android.os.Looper.getMainLooper
import android.view.View.GONE
import android.widget.TextView
import androidx.appcompat.app.AlertDialog
@@ -21,6 +22,7 @@ import org.mockito.Mockito.doReturn
import org.mockito.Mockito.spy
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations.openMocks
import org.robolectric.Shadows.shadowOf
@RunWith(AndroidJUnit4::class)
class AuthenticationDialogFragmentTest {
@@ -164,6 +166,7 @@ class AuthenticationDialogFragmentTest {
val positiveButton = (dialog as AlertDialog).getButton(DialogInterface.BUTTON_POSITIVE)
positiveButton.performClick()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onConfirm("sessionId", "uid", "username" to "password")
}

View File

@@ -6,6 +6,7 @@ package mozilla.components.feature.prompts.dialog
import android.content.DialogInterface.BUTTON_NEGATIVE
import android.content.DialogInterface.BUTTON_POSITIVE
import android.os.Looper.getMainLooper
import android.os.Parcelable
import android.view.LayoutInflater
import android.widget.LinearLayout
@@ -45,6 +46,7 @@ import org.mockito.Mockito.spy
import org.mockito.Mockito.times
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations.openMocks
import org.robolectric.Shadows.shadowOf
@RunWith(AndroidJUnit4::class)
class ChoiceDialogFragmentTest {
@@ -318,9 +320,11 @@ class ChoiceDialogFragmentTest {
adapter.bindViewHolder(holder, 0)
holder.itemView.performClick()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onConfirm("sessionId", "uid", choices.first())
dialog.dismiss()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onCancel("sessionId", "uid")
}
@@ -346,9 +350,13 @@ class ChoiceDialogFragmentTest {
adapter.bindViewHolder(holder, 0)
holder.itemView.performClick()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onConfirm("sessionId", "uid", choices.first())
dialog.dismiss()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onCancel("sessionId", "uid")
}
@@ -378,11 +386,13 @@ class ChoiceDialogFragmentTest {
val positiveButton = (dialog as AlertDialog).getButton(BUTTON_POSITIVE)
positiveButton.performClick()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onConfirm("sessionId", "uid", fragment.mapSelectChoice.keys.toTypedArray())
val negativeButton = dialog.getButton(BUTTON_NEGATIVE)
negativeButton.performClick()
shadowOf(getMainLooper()).idle()
verify(mockFeature, times(2)).onCancel("sessionId", "uid")
}
@@ -416,6 +426,7 @@ class ChoiceDialogFragmentTest {
val positiveButton = (dialog as AlertDialog).getButton(BUTTON_POSITIVE)
positiveButton.performClick()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onConfirm("sessionId", "uid", fragment.mapSelectChoice.keys.toTypedArray())
}

View File

@@ -5,6 +5,7 @@
package mozilla.components.feature.prompts.dialog
import android.content.DialogInterface
import android.os.Looper.getMainLooper
import android.widget.LinearLayout
import android.widget.TextView
import androidx.appcompat.app.AlertDialog
@@ -23,6 +24,7 @@ import org.mockito.Mockito.doReturn
import org.mockito.Mockito.spy
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations.openMocks
import org.robolectric.Shadows.shadowOf
@RunWith(AndroidJUnit4::class)
class ColorPickerDialogFragmentTest {
@@ -70,6 +72,7 @@ class ColorPickerDialogFragmentTest {
val positiveButton = (dialog as AlertDialog).getButton(DialogInterface.BUTTON_POSITIVE)
positiveButton.performClick()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onConfirm("sessionId", "uid", "#4f4663")
}
@@ -90,6 +93,7 @@ class ColorPickerDialogFragmentTest {
val negativeButton = (dialog as AlertDialog).getButton(DialogInterface.BUTTON_NEGATIVE)
negativeButton.performClick()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onCancel("sessionId", "uid")
}

View File

@@ -5,6 +5,7 @@
package mozilla.components.feature.prompts.dialog
import android.content.DialogInterface
import android.os.Looper.getMainLooper
import android.widget.TextView
import androidx.appcompat.app.AlertDialog
import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -21,6 +22,7 @@ import org.mockito.Mockito.doReturn
import org.mockito.Mockito.spy
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations.openMocks
import org.robolectric.Shadows.shadowOf
@RunWith(AndroidJUnit4::class)
class ConfirmDialogFragmentTest {
@@ -81,6 +83,7 @@ class ConfirmDialogFragmentTest {
val positiveButton = (dialog as AlertDialog).getButton(DialogInterface.BUTTON_POSITIVE)
positiveButton.performClick()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onConfirm("sessionId", "uid", false)
}
@@ -97,6 +100,7 @@ class ConfirmDialogFragmentTest {
val negativeButton = (dialog as AlertDialog).getButton(DialogInterface.BUTTON_NEGATIVE)
negativeButton.performClick()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onCancel("sessionId", "uid", false)
}

View File

@@ -6,6 +6,7 @@ package mozilla.components.feature.prompts.dialog
import android.content.DialogInterface
import android.content.DialogInterface.BUTTON_POSITIVE
import android.os.Looper.getMainLooper
import android.widget.CheckBox
import android.widget.TextView
import androidx.appcompat.app.AlertDialog
@@ -26,6 +27,7 @@ import org.mockito.Mockito.doReturn
import org.mockito.Mockito.spy
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations.openMocks
import org.robolectric.Shadows.shadowOf
@RunWith(AndroidJUnit4::class)
class MultiButtonDialogFragmentTest {
@@ -134,6 +136,7 @@ class MultiButtonDialogFragmentTest {
val positiveButton = (dialog as AlertDialog).getButton(BUTTON_POSITIVE)
positiveButton.performClick()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onConfirm("sessionId", "uid", false to MultiButtonDialogFragment.ButtonType.POSITIVE)
}
@@ -162,6 +165,7 @@ class MultiButtonDialogFragmentTest {
val negativeButton = (dialog as AlertDialog).getButton(DialogInterface.BUTTON_NEGATIVE)
negativeButton.performClick()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onConfirm("sessionId", "uid", false to MultiButtonDialogFragment.ButtonType.NEGATIVE)
}
@@ -190,6 +194,7 @@ class MultiButtonDialogFragmentTest {
val neutralButton = (dialog as AlertDialog).getButton(DialogInterface.BUTTON_NEUTRAL)
neutralButton.performClick()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onConfirm("sessionId", "uid", false to MultiButtonDialogFragment.ButtonType.NEUTRAL)
}
@@ -222,6 +227,7 @@ class MultiButtonDialogFragmentTest {
val positiveButton = (dialog as AlertDialog).getButton(BUTTON_POSITIVE)
positiveButton.performClick()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onConfirm("sessionId", "uid", true to MultiButtonDialogFragment.ButtonType.POSITIVE)
}

View File

@@ -5,6 +5,7 @@
package mozilla.components.feature.prompts.dialog
import android.content.DialogInterface.BUTTON_POSITIVE
import android.os.Looper.getMainLooper
import android.widget.CheckBox
import android.widget.TextView
import androidx.appcompat.app.AlertDialog
@@ -24,6 +25,7 @@ import org.mockito.Mockito.doReturn
import org.mockito.Mockito.spy
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations
import org.robolectric.Shadows.shadowOf
@RunWith(AndroidJUnit4::class)
class TextPromptDialogFragmentTest {
@@ -107,6 +109,7 @@ class TextPromptDialogFragmentTest {
val positiveButton = (dialog as AlertDialog).getButton(BUTTON_POSITIVE)
positiveButton.performClick()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onConfirm("sessionId", "uid", false to "defaultValue")
}
@@ -131,6 +134,7 @@ class TextPromptDialogFragmentTest {
val positiveButton = (dialog as AlertDialog).getButton(BUTTON_POSITIVE)
positiveButton.performClick()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onConfirm("sessionId", "uid", true to "defaultValue")
}

View File

@@ -10,6 +10,7 @@ import android.app.TimePickerDialog
import android.content.DialogInterface.BUTTON_NEUTRAL
import android.content.DialogInterface.BUTTON_POSITIVE
import android.os.Build.VERSION_CODES.LOLLIPOP
import android.os.Looper.getMainLooper
import android.widget.DatePicker
import android.widget.NumberPicker
import android.widget.TimePicker
@@ -37,6 +38,7 @@ import org.mockito.Mockito.doReturn
import org.mockito.Mockito.spy
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations.openMocks
import org.robolectric.Shadows.shadowOf
import org.robolectric.annotation.Config
import java.util.Calendar
import java.util.Date
@@ -90,10 +92,14 @@ class TimePickerDialogFragmentTest {
val positiveButton = (dialog as AlertDialog).getButton(BUTTON_POSITIVE)
positiveButton.performClick()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onConfirm(eq("sessionId"), eq("uid"), any())
val neutralButton = dialog.getButton(BUTTON_NEUTRAL)
neutralButton.performClick()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onClear("sessionId", "uid")
}

View File

@@ -6,6 +6,7 @@ package mozilla.components.feature.pwa.feature
import android.app.Activity
import android.content.pm.ActivityInfo
import android.os.Looper.getMainLooper
import android.view.View
import android.view.Window
import android.view.WindowManager
@@ -24,6 +25,7 @@ import org.mockito.Mockito.`when`
import org.mockito.Mockito.never
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations.openMocks
import org.robolectric.Shadows.shadowOf
@RunWith(AndroidJUnit4::class)
class WebAppActivityFeatureTest {
@@ -83,6 +85,7 @@ class WebAppActivityFeatureTest {
`when`(icons.loadIcon(any())).thenReturn(CompletableDeferred(icon))
WebAppActivityFeature(activity, icons, manifest).onResume(mock())
shadowOf(getMainLooper()).idle()
verify(activity).setTaskDescription(any())
}

View File

@@ -12,6 +12,7 @@ import android.hardware.camera2.CameraManager
import android.hardware.camera2.params.SessionConfiguration
import android.media.Image
import android.os.Build
import android.os.Looper.getMainLooper
import android.util.Size
import android.view.Display
import android.view.Surface
@@ -49,6 +50,7 @@ import org.mockito.Mockito.never
import org.mockito.Mockito.spy
import org.mockito.Mockito.times
import org.mockito.Mockito.verify
import org.robolectric.Shadows.shadowOf
import org.robolectric.annotation.Config
import java.nio.ByteBuffer
@@ -61,6 +63,7 @@ class QrFragmentTest {
val qrFragment = spy(QrFragment.newInstance(scanCompleteListener))
qrFragment.scanCompleteListener?.onScanComplete("result")
shadowOf(getMainLooper()).idle()
verify(scanCompleteListener).onScanComplete("result")
}
@@ -203,6 +206,7 @@ class QrFragmentTest {
QrFragment.qrState = QrFragment.STATE_DECODE_PROGRESS
qrFragment.tryScanningSource(source)
shadowOf(getMainLooper()).idle()
verify(listener).onScanComplete(eq("qrcode-result"))
assertEquals(QrFragment.STATE_QRCODE_EXIST, QrFragment.qrState)

View File

@@ -4,6 +4,7 @@
package mozilla.components.feature.session
import android.os.Looper.getMainLooper
import android.view.View
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.google.android.material.appbar.AppBarLayout
@@ -21,6 +22,7 @@ import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mockito.any
import org.mockito.Mockito.verify
import org.robolectric.Shadows.shadowOf
@RunWith(AndroidJUnit4::class)
class CoordinateScrollingFeatureTest {
@@ -51,6 +53,7 @@ class CoordinateScrollingFeatureTest {
@Test
fun `when session loading StateChanged and engine canScrollVertically is false must remove scrollFlags`() {
scrollFeature.start()
shadowOf(getMainLooper()).idle()
store.dispatch(ContentAction.UpdateLoadingStateAction("mozilla", true)).joinBlocking()
@@ -63,6 +66,7 @@ class CoordinateScrollingFeatureTest {
whenever(mockEngineView.canScrollVerticallyDown()).thenReturn(true)
scrollFeature.start()
shadowOf(getMainLooper()).idle()
store.dispatch(ContentAction.UpdateLoadingStateAction("mozilla", true)).joinBlocking()
@@ -75,6 +79,7 @@ class CoordinateScrollingFeatureTest {
whenever(mockEngineView.canScrollVerticallyDown()).thenReturn(true)
scrollFeature = CoordinateScrollingFeature(store, mockEngineView, mockView, 12)
scrollFeature.start()
shadowOf(getMainLooper()).idle()
store.dispatch(ContentAction.UpdateLoadingStateAction("mozilla", true)).joinBlocking()

View File

@@ -4,6 +4,7 @@
package mozilla.components.feature.sitepermissions
import android.os.Looper.getMainLooper
import androidx.paging.DataSource
import androidx.room.DatabaseConfiguration
import androidx.room.InvalidationTracker
@@ -38,6 +39,7 @@ import org.junit.runner.RunWith
import org.mockito.Mockito.doReturn
import org.mockito.Mockito.spy
import org.mockito.Mockito.verify
import org.robolectric.Shadows.shadowOf
@RunWith(AndroidJUnit4::class)
class OnDiskSitePermissionsStorageTest {
@@ -71,6 +73,7 @@ class OnDiskSitePermissionsStorageTest {
val sitePermissions = createNewSitePermission()
storage.update(sitePermissions)
shadowOf(getMainLooper()).idle()
verify(mockDAO).update(any())
verify(mockDataCleanable).clearData(BrowsingData.select(BrowsingData.PERMISSIONS), sitePermissions.origin)
@@ -108,6 +111,8 @@ class OnDiskSitePermissionsStorageTest {
storage.remove(sitePermissions)
shadowOf(getMainLooper()).idle()
verify(mockDAO).deleteSitePermissions(any())
verify(mockDataCleanable).clearData(BrowsingData.select(BrowsingData.PERMISSIONS), sitePermissions.origin)
}
@@ -115,6 +120,7 @@ class OnDiskSitePermissionsStorageTest {
@Test
fun `remove all SitePermissions`() = runBlockingTest {
storage.removeAll()
shadowOf(getMainLooper()).idle()
verify(mockDAO).deleteAllSitePermissions()
verify(mockDataCleanable).clearData(BrowsingData.select(BrowsingData.PERMISSIONS))

View File

@@ -5,6 +5,7 @@
package mozilla.components.feature.syncedtabs.presenter
import android.content.Context
import android.os.Looper.getMainLooper
import androidx.lifecycle.LifecycleOwner
import androidx.test.ext.junit.runners.AndroidJUnit4
import kotlinx.coroutines.test.runBlockingTest
@@ -20,6 +21,7 @@ import org.junit.runner.RunWith
import org.mockito.Mockito.`when`
import org.mockito.Mockito.verify
import org.mockito.Mockito.verifyNoInteractions
import org.robolectric.Shadows.shadowOf
@RunWith(AndroidJUnit4::class)
class DefaultPresenterTest {
@@ -135,6 +137,7 @@ class DefaultPresenterTest {
)
presenter.accountObserver.onLoggedOut()
shadowOf(getMainLooper()).idle()
verify(view).onError(ErrorType.SYNC_UNAVAILABLE)
}
@@ -150,6 +153,7 @@ class DefaultPresenterTest {
)
presenter.accountObserver.onAuthenticated(mock(), mock())
shadowOf(getMainLooper()).idle()
verify(controller).refreshSyncedTabs()
}
@@ -165,6 +169,7 @@ class DefaultPresenterTest {
)
presenter.accountObserver.onAuthenticationProblems()
shadowOf(getMainLooper()).idle()
verify(view).onError(ErrorType.SYNC_NEEDS_REAUTHENTICATION)
}

View File

@@ -4,6 +4,7 @@
package mozilla.components.feature.toolbar
import android.os.Looper.getMainLooper
import androidx.test.ext.junit.runners.AndroidJUnit4
import kotlinx.coroutines.isActive
import mozilla.components.browser.state.action.ContentAction
@@ -24,6 +25,7 @@ import org.mockito.Mockito.never
import org.mockito.Mockito.spy
import org.mockito.Mockito.times
import org.mockito.Mockito.verify
import org.robolectric.Shadows.shadowOf
@RunWith(AndroidJUnit4::class)
class ToolbarBehaviorControllerTest {
@@ -45,6 +47,7 @@ class ToolbarBehaviorControllerTest {
assertNull(controller.updatesScope)
controller.start()
shadowOf(getMainLooper()).idle()
assertNotNull(controller.updatesScope)
verify(customTabContent, times(3)).loading
@@ -68,6 +71,7 @@ class ToolbarBehaviorControllerTest {
assertNull(controller.updatesScope)
controller.start()
shadowOf(getMainLooper()).idle()
assertNotNull(controller.updatesScope)
verify(customTabContent, never()).loading
@@ -86,6 +90,7 @@ class ToolbarBehaviorControllerTest {
val controller = spy(ToolbarBehaviorController(mock(), store))
controller.start()
shadowOf(getMainLooper()).idle()
verify(controller).disableScrolling()
}
@@ -102,6 +107,7 @@ class ToolbarBehaviorControllerTest {
val controller = spy(ToolbarBehaviorController(mock(), store))
controller.start()
shadowOf(getMainLooper()).idle()
verify(controller).enableScrolling()
}
@@ -111,6 +117,7 @@ class ToolbarBehaviorControllerTest {
val controller = spy(ToolbarBehaviorController(mock(), BrowserStore(BrowserState())))
controller.start()
shadowOf(getMainLooper()).idle()
assertTrue(controller.updatesScope!!.isActive)
controller.stop()
@@ -151,6 +158,7 @@ class ToolbarBehaviorControllerTest {
val controller = spy(ToolbarBehaviorController(mock(), store))
controller.start()
shadowOf(getMainLooper()).idle()
verify(controller).expandToolbar()
verify(store).dispatch(ContentAction.UpdateExpandedToolbarStateAction("123", false))
@@ -168,6 +176,7 @@ class ToolbarBehaviorControllerTest {
val controller = spy(ToolbarBehaviorController(mock(), store))
controller.start()
shadowOf(getMainLooper()).idle()
verify(controller, never()).expandToolbar()
}

View File

@@ -5,6 +5,8 @@
package mozilla.components.lib.state.ext
import android.app.Activity
import android.os.Looper
import android.os.Looper.getMainLooper
import android.view.View
import android.view.WindowManager
import androidx.lifecycle.Lifecycle
@@ -35,6 +37,7 @@ import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.Robolectric
import org.robolectric.Shadows.shadowOf
import java.util.concurrent.CountDownLatch
import java.util.concurrent.TimeUnit
@@ -485,6 +488,7 @@ class StoreExtensionsKtTest {
val activity = Robolectric.buildActivity(Activity::class.java).create().get()
val view = View(testContext)
activity.windowManager.addView(view, WindowManager.LayoutParams(100, 100))
shadowOf(getMainLooper()).idle()
assertTrue(view.isAttachedToWindow)
@@ -502,6 +506,7 @@ class StoreExtensionsKtTest {
assertTrue(stateObserved)
activity.windowManager.removeView(view)
shadowOf(getMainLooper()).idle()
assertFalse(view.isAttachedToWindow)
stateObserved = false
@@ -530,6 +535,7 @@ class StoreExtensionsKtTest {
assertFalse(stateObserved)
activity.windowManager.addView(view, WindowManager.LayoutParams(100, 100))
shadowOf(Looper.getMainLooper()).idle()
assertTrue(view.isAttachedToWindow)
assertTrue(stateObserved)
@@ -542,6 +548,8 @@ class StoreExtensionsKtTest {
assertTrue(stateObserved)
activity.windowManager.removeView(view)
shadowOf(Looper.getMainLooper()).idle()
assertFalse(view.isAttachedToWindow)
stateObserved = false

View File

@@ -5,6 +5,7 @@
package mozilla.components.support.base.dialog
import android.content.DialogInterface.BUTTON_POSITIVE
import android.os.Looper.getMainLooper
import android.widget.TextView
import androidx.appcompat.app.AlertDialog
import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -18,6 +19,7 @@ import org.mockito.Mockito.doNothing
import org.mockito.Mockito.doReturn
import org.mockito.Mockito.spy
import org.mockito.Mockito.verify
import org.robolectric.Shadows.shadowOf
@RunWith(AndroidJUnit4::class)
class DeniedPermissionDialogFragmentTest {
@@ -58,6 +60,8 @@ class DeniedPermissionDialogFragmentTest {
val positiveButton = (dialog as AlertDialog).getButton(BUTTON_POSITIVE)
positiveButton.performClick()
shadowOf(getMainLooper()).idle()
verify(fragment).openSettingsPage()
}
}

View File

@@ -7,6 +7,7 @@ package mozilla.components.support.base.feature
import android.app.Activity
import android.app.Activity.RESULT_OK
import android.content.Intent
import android.os.Looper.getMainLooper
import android.view.View
import android.view.WindowManager
import androidx.lifecycle.Lifecycle
@@ -26,6 +27,7 @@ import org.mockito.Mockito.reset
import org.mockito.Mockito.spy
import org.mockito.Mockito.verify
import org.robolectric.Robolectric
import org.robolectric.Shadows.shadowOf
@RunWith(AndroidJUnit4::class)
class ViewBoundFeatureWrapperTest {
@@ -161,6 +163,7 @@ class ViewBoundFeatureWrapperTest {
val activity = Robolectric.buildActivity(Activity::class.java).create().get()
val view = View(activity)
activity.windowManager.addView(view, WindowManager.LayoutParams(100, 100))
shadowOf(getMainLooper()).idle()
assertTrue(view.isAttachedToWindow)
@@ -175,6 +178,7 @@ class ViewBoundFeatureWrapperTest {
verify(wrapper, never()).clear()
activity.windowManager.removeView(view)
shadowOf(getMainLooper()).idle()
verify(wrapper).clear()
}

View File

@@ -5,6 +5,7 @@
package mozilla.components.support.base.observer
import android.app.Activity
import android.os.Looper.getMainLooper
import android.view.View
import android.view.WindowManager
import androidx.lifecycle.Lifecycle
@@ -25,6 +26,7 @@ import org.mockito.Mockito.spy
import org.mockito.Mockito.times
import org.mockito.Mockito.verify
import org.robolectric.Robolectric
import org.robolectric.Shadows.shadowOf
@RunWith(AndroidJUnit4::class)
class ObserverRegistryTest {
@@ -227,6 +229,7 @@ class ObserverRegistryTest {
registry.register(observer3, MockedLifecycleOwner(Lifecycle.State.CREATED))
registry.register(observer4, view)
activity.windowManager.addView(view, WindowManager.LayoutParams(100, 100))
shadowOf(getMainLooper()).idle()
assertFalse(observer1.notified)
assertFalse(observer2.notified)
@@ -352,6 +355,7 @@ class ObserverRegistryTest {
assertFalse(observer.notified)
activity.windowManager.addView(view, WindowManager.LayoutParams(100, 100))
shadowOf(getMainLooper()).idle()
assertTrue(view.isAttachedToWindow)
registry.notifyObservers {
@@ -366,6 +370,7 @@ class ObserverRegistryTest {
val activity = Robolectric.buildActivity(Activity::class.java).create().get()
val view = View(testContext)
activity.windowManager.addView(view, WindowManager.LayoutParams(100, 100))
shadowOf(getMainLooper()).idle()
val registry = ObserverRegistry<TestObserver>()
val observer = TestObserver()
@@ -385,6 +390,8 @@ class ObserverRegistryTest {
observer.notified = false
activity.windowManager.removeView(view)
shadowOf(getMainLooper()).idle()
assertFalse(view.isAttachedToWindow)
registry.notifyObservers {

View File

@@ -7,6 +7,7 @@ package mozilla.components.support.ktx.android.view
import android.app.Activity
import android.content.Context
import android.os.Build
import android.os.Looper.getMainLooper
import android.view.View
import android.view.WindowManager
import android.view.inputmethod.InputMethodManager
@@ -37,6 +38,7 @@ import org.mockito.Mockito.never
import org.mockito.Mockito.spy
import org.mockito.Mockito.verify
import org.robolectric.Robolectric
import org.robolectric.Shadows.shadowOf
import org.robolectric.annotation.Config
import org.robolectric.shadows.ShadowLooper
import java.util.concurrent.CountDownLatch
@@ -148,6 +150,7 @@ class ViewTest {
val activity = Robolectric.buildActivity(Activity::class.java).create().get()
val view = View(testContext)
activity.windowManager.addView(view, WindowManager.LayoutParams(100, 100))
shadowOf(getMainLooper()).idle()
assertTrue(view.isAttachedToWindow)
@@ -169,6 +172,7 @@ class ViewTest {
val activity = Robolectric.buildActivity(Activity::class.java).create().get()
val view = View(testContext)
activity.windowManager.addView(view, WindowManager.LayoutParams(100, 100))
shadowOf(getMainLooper()).idle()
val scope = view.toScope()
@@ -176,6 +180,7 @@ class ViewTest {
assertTrue(scope.isActive)
activity.windowManager.removeView(view)
shadowOf(getMainLooper()).idle()
assertFalse(view.isAttachedToWindow)
assertFalse(scope.isActive)