[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 package mozilla.components.browser.domains
import android.content.Context import android.content.Context
import android.os.Looper.getMainLooper
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import mozilla.components.browser.domains.autocomplete.BaseDomainAutocompleteProvider import mozilla.components.browser.domains.autocomplete.BaseDomainAutocompleteProvider
@@ -17,6 +18,7 @@ import org.junit.Assert.assertNull
import org.junit.Assert.assertTrue import org.junit.Assert.assertTrue
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.robolectric.Shadows.shadowOf
@RunWith(AndroidJUnit4::class) @RunWith(AndroidJUnit4::class)
class BaseDomainAutocompleteProviderTest { class BaseDomainAutocompleteProviderTest {
@@ -60,6 +62,7 @@ class BaseDomainAutocompleteProviderTest {
val domainsCount = domains.size val domainsCount = domains.size
val provider = createAndInitProvider(testContext, list) { domains } val provider = createAndInitProvider(testContext, list) { domains }
shadowOf(getMainLooper()).idle()
assertCompletion(provider, list, domainsCount, "m", "m", "mozilla.org", "http://mozilla.org") assertCompletion(provider, list, domainsCount, "m", "m", "mozilla.org", "http://mozilla.org")
assertCompletion(provider, list, domainsCount, "moz", "moz", "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 domainsCount = domains.size
val provider = createAndInitProvider(testContext, list) { domains } val provider = createAndInitProvider(testContext, list) { domains }
shadowOf(getMainLooper()).idle()
assertCompletion(provider, list, domainsCount, "m", "m", "mozilla.org", "http://mozilla.org") assertCompletion(provider, list, domainsCount, "m", "m", "mozilla.org", "http://mozilla.org")
assertCompletion(provider, list, domainsCount, "moz", "moz", "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.content.Intent
import android.graphics.Color import android.graphics.Color
import android.os.Handler import android.os.Handler
import android.os.Looper.getMainLooper
import android.os.Message import android.os.Message
import android.view.WindowManager import android.view.WindowManager
import androidx.test.ext.junit.runners.AndroidJUnit4 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_MALFORMED_URI
import org.mozilla.geckoview.WebRequestError.ERROR_UNKNOWN import org.mozilla.geckoview.WebRequestError.ERROR_UNKNOWN
import org.mozilla.geckoview.WebResponse import org.mozilla.geckoview.WebResponse
import org.robolectric.Shadows.shadowOf
import java.security.Principal import java.security.Principal
import java.security.cert.X509Certificate import java.security.cert.X509Certificate
@@ -1291,6 +1293,7 @@ class GeckoEngineSessionTest {
val policy = TrackingProtectionPolicy.recommended() val policy = TrackingProtectionPolicy.recommended()
session.updateTrackingProtection(policy) session.updateTrackingProtection(policy)
shadowOf(getMainLooper()).idle()
verify(session).updateContentBlocking(policy) verify(session).updateContentBlocking(policy)
assertTrue(session.etpEnabled!!) assertTrue(session.etpEnabled!!)
@@ -1420,16 +1423,19 @@ class GeckoEngineSessionTest {
session.updateTrackingProtection(policy) session.updateTrackingProtection(policy)
observers.forEach { session.register(it) } observers.forEach { session.register(it) }
shadowOf(getMainLooper()).idle()
observers.forEach { observers.forEach {
verify(it).onTrackerBlockingEnabledChange(true) verify(it).onTrackerBlockingEnabledChange(true)
} }
observers.forEach { session.unregister(it) } observers.forEach { session.unregister(it) }
shadowOf(getMainLooper()).idle()
session.updateTrackingProtection(TrackingProtectionPolicy.none()) session.updateTrackingProtection(TrackingProtectionPolicy.none())
observers.forEach { session.register(it) } observers.forEach { session.register(it) }
shadowOf(getMainLooper()).idle()
observers.forEach { observers.forEach {
verify(it).onTrackerBlockingEnabledChange(false) verify(it).onTrackerBlockingEnabledChange(false)
@@ -2169,6 +2175,7 @@ class GeckoEngineSessionTest {
}) })
engineSession.findAll("mozilla") engineSession.findAll("mozilla")
shadowOf(getMainLooper()).idle()
assertEquals("mozilla", findObserved) assertEquals("mozilla", findObserved)
assertTrue(findResultObserved) assertTrue(findResultObserved)
@@ -2200,10 +2207,14 @@ class GeckoEngineSessionTest {
}) })
engineSession.findNext(true) engineSession.findNext(true)
shadowOf(getMainLooper()).idle()
assertTrue(findResultObserved) assertTrue(findResultObserved)
verify(sessionFinder).find(null, 0) verify(sessionFinder).find(null, 0)
engineSession.findNext(false) engineSession.findNext(false)
shadowOf(getMainLooper()).idle()
assertTrue(findResultObserved) assertTrue(findResultObserved)
verify(sessionFinder).find(null, GeckoSession.FINDER_FIND_BACKWARDS) 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.app.Activity
import android.content.Context import android.content.Context
import android.graphics.Color import android.graphics.Color
import android.os.Looper.getMainLooper
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
import mozilla.components.browser.engine.gecko.ext.getAntiTrackingPolicy import mozilla.components.browser.engine.gecko.ext.getAntiTrackingPolicy
import mozilla.components.browser.engine.gecko.mediaquery.toGeckoValue 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.WebExtensionController
import org.mozilla.geckoview.WebPushController import org.mozilla.geckoview.WebPushController
import org.robolectric.Robolectric import org.robolectric.Robolectric
import org.robolectric.Shadows.shadowOf
import java.io.IOException import java.io.IOException
import org.mozilla.geckoview.WebExtension as GeckoWebExtension import org.mozilla.geckoview.WebExtension as GeckoWebExtension
@@ -698,6 +700,8 @@ class GeckoEngineTest {
) )
result.complete(mockNativeWebExtension(extId, extUrl)) result.complete(mockNativeWebExtension(extId, extUrl))
shadowOf(getMainLooper()).idle()
val extUrlCaptor = argumentCaptor<String>() val extUrlCaptor = argumentCaptor<String>()
val extIdCaptor = argumentCaptor<String>() val extIdCaptor = argumentCaptor<String>()
verify(extensionController).ensureBuiltIn(extUrlCaptor.capture(), extIdCaptor.capture()) verify(extensionController).ensureBuiltIn(extUrlCaptor.capture(), extIdCaptor.capture())
@@ -730,6 +734,8 @@ class GeckoEngineTest {
) )
result.complete(mockNativeWebExtension(extId, extUrl)) result.complete(mockNativeWebExtension(extId, extUrl))
shadowOf(getMainLooper()).idle()
val extCaptor = argumentCaptor<String>() val extCaptor = argumentCaptor<String>()
verify(extensionController).install(extCaptor.capture()) verify(extensionController).install(extCaptor.capture())
assertEquals(extUrl, extCaptor.value) assertEquals(extUrl, extCaptor.value)
@@ -759,6 +765,8 @@ class GeckoEngineTest {
} }
result.completeExceptionally(expected) result.completeExceptionally(expected)
shadowOf(getMainLooper()).idle()
assertTrue(onErrorCalled) assertTrue(onErrorCalled)
assertEquals(expected, throwable) assertEquals(expected, throwable)
} }
@@ -785,6 +793,8 @@ class GeckoEngineTest {
} }
result.completeExceptionally(expected) result.completeExceptionally(expected)
shadowOf(getMainLooper()).idle()
assertTrue(onErrorCalled) assertTrue(onErrorCalled)
assertEquals(expected, throwable) assertEquals(expected, throwable)
} }
@@ -816,6 +826,9 @@ class GeckoEngineTest {
onError = { _, _ -> onErrorCalled = true } onError = { _, _ -> onErrorCalled = true }
) )
result.complete(null) result.complete(null)
shadowOf(getMainLooper()).idle()
verify(webExtensionsDelegate).onUninstalled(ext) verify(webExtensionsDelegate).onUninstalled(ext)
val extCaptor = argumentCaptor<GeckoWebExtension>() val extCaptor = argumentCaptor<GeckoWebExtension>()
@@ -855,6 +868,9 @@ class GeckoEngineTest {
throwable = e throwable = e
} }
result.completeExceptionally(expected) result.completeExceptionally(expected)
shadowOf(getMainLooper()).idle()
verify(webExtensionsDelegate, never()).onUninstalled(ext) verify(webExtensionsDelegate, never()).onUninstalled(ext)
assertTrue(onErrorCalled) assertTrue(onErrorCalled)
@@ -878,6 +894,8 @@ class GeckoEngineTest {
engine.installWebExtension(extId, extUrl) engine.installWebExtension(extId, extUrl)
result.complete(mockNativeWebExtension(extId, extUrl)) result.complete(mockNativeWebExtension(extId, extUrl))
shadowOf(getMainLooper()).idle()
val extCaptor = argumentCaptor<WebExtension>() val extCaptor = argumentCaptor<WebExtension>()
verify(webExtensionsDelegate).onInstalled(extCaptor.capture()) verify(webExtensionsDelegate).onInstalled(extCaptor.capture())
assertEquals(extId, extCaptor.value.id) assertEquals(extId, extCaptor.value.id)
@@ -901,6 +919,8 @@ class GeckoEngineTest {
engine.installWebExtension(extId, extUrl) engine.installWebExtension(extId, extUrl)
result.complete(mockNativeWebExtension(extId, extUrl)) result.complete(mockNativeWebExtension(extId, extUrl))
shadowOf(getMainLooper()).idle()
val extCaptor = argumentCaptor<WebExtension>() val extCaptor = argumentCaptor<WebExtension>()
verify(webExtensionsDelegate).onInstalled(extCaptor.capture()) verify(webExtensionsDelegate).onInstalled(extCaptor.capture())
assertEquals(extId, extCaptor.value.id) assertEquals(extId, extCaptor.value.id)
@@ -1034,6 +1054,8 @@ class GeckoEngineTest {
val extension = mockNativeWebExtension(extId, extUrl) val extension = mockNativeWebExtension(extId, extUrl)
result.complete(extension) result.complete(extension)
shadowOf(getMainLooper()).idle()
val actionDelegateCaptor = argumentCaptor<org.mozilla.geckoview.WebExtension.ActionDelegate>() val actionDelegateCaptor = argumentCaptor<org.mozilla.geckoview.WebExtension.ActionDelegate>()
verify(extension).setActionDelegate(actionDelegateCaptor.capture()) verify(extension).setActionDelegate(actionDelegateCaptor.capture())
@@ -1068,6 +1090,8 @@ class GeckoEngineTest {
val extension = mockNativeWebExtension(extId, extUrl) val extension = mockNativeWebExtension(extId, extUrl)
result.complete(extension) result.complete(extension)
shadowOf(getMainLooper()).idle()
val actionDelegateCaptor = argumentCaptor<org.mozilla.geckoview.WebExtension.ActionDelegate>() val actionDelegateCaptor = argumentCaptor<org.mozilla.geckoview.WebExtension.ActionDelegate>()
verify(extension).setActionDelegate(actionDelegateCaptor.capture()) verify(extension).setActionDelegate(actionDelegateCaptor.capture())
@@ -1102,6 +1126,8 @@ class GeckoEngineTest {
val extension = mockNativeWebExtension(extId, extUrl) val extension = mockNativeWebExtension(extId, extUrl)
result.complete(extension) result.complete(extension)
shadowOf(getMainLooper()).idle()
val tabDelegateCaptor = argumentCaptor<org.mozilla.geckoview.WebExtension.TabDelegate>() val tabDelegateCaptor = argumentCaptor<org.mozilla.geckoview.WebExtension.TabDelegate>()
verify(extension).tabDelegate = tabDelegateCaptor.capture() verify(extension).tabDelegate = tabDelegateCaptor.capture()
@@ -1132,6 +1158,8 @@ class GeckoEngineTest {
val extension = mockNativeWebExtension(extId, extUrl) val extension = mockNativeWebExtension(extId, extUrl)
result.complete(extension) result.complete(extension)
shadowOf(getMainLooper()).idle()
val actionDelegateCaptor = argumentCaptor<org.mozilla.geckoview.WebExtension.ActionDelegate>() val actionDelegateCaptor = argumentCaptor<org.mozilla.geckoview.WebExtension.ActionDelegate>()
verify(extension).setActionDelegate(actionDelegateCaptor.capture()) verify(extension).setActionDelegate(actionDelegateCaptor.capture())
@@ -1166,6 +1194,8 @@ class GeckoEngineTest {
val extension = mockNativeWebExtension(extId, extUrl) val extension = mockNativeWebExtension(extId, extUrl)
result.complete(extension) result.complete(extension)
shadowOf(getMainLooper()).idle()
val actionDelegateCaptor = argumentCaptor<org.mozilla.geckoview.WebExtension.ActionDelegate>() val actionDelegateCaptor = argumentCaptor<org.mozilla.geckoview.WebExtension.ActionDelegate>()
verify(extension).setActionDelegate(actionDelegateCaptor.capture()) verify(extension).setActionDelegate(actionDelegateCaptor.capture())
@@ -1200,6 +1230,8 @@ class GeckoEngineTest {
val extension = mockNativeWebExtension(extId, extUrl) val extension = mockNativeWebExtension(extId, extUrl)
result.complete(extension) result.complete(extension)
shadowOf(getMainLooper()).idle()
val tabDelegateCaptor = argumentCaptor<org.mozilla.geckoview.WebExtension.TabDelegate>() val tabDelegateCaptor = argumentCaptor<org.mozilla.geckoview.WebExtension.TabDelegate>()
verify(extension).tabDelegate = tabDelegateCaptor.capture() verify(extension).tabDelegate = tabDelegateCaptor.capture()
@@ -1256,6 +1288,8 @@ class GeckoEngineTest {
) )
updateExtensionResult.complete(updatedExtension) updateExtensionResult.complete(updatedExtension)
shadowOf(getMainLooper()).idle()
assertFalse(onErrorCalled) assertFalse(onErrorCalled)
assertNotNull(result) assertNotNull(result)
} }
@@ -1319,6 +1353,8 @@ class GeckoEngineTest {
) )
updateExtensionResult.completeExceptionally(expected) updateExtensionResult.completeExceptionally(expected)
shadowOf(getMainLooper()).idle()
assertSame(expected, throwable!!.cause) assertSame(expected, throwable!!.cause)
assertNull(result) assertNull(result)
} }
@@ -1347,6 +1383,9 @@ class GeckoEngineTest {
) )
updateExtensionResult.completeExceptionally(exception) updateExtensionResult.completeExceptionally(exception)
shadowOf(getMainLooper()).idle()
throwable!! throwable!!
} }
@@ -1398,6 +1437,8 @@ class GeckoEngineTest {
) )
installedExtensionResult.complete(installedExtensions) installedExtensionResult.complete(installedExtensions)
shadowOf(getMainLooper()).idle()
assertFalse(onErrorCalled) assertFalse(onErrorCalled)
assertNotNull(extensions) assertNotNull(extensions)
} }
@@ -1422,6 +1463,8 @@ class GeckoEngineTest {
) )
installedExtensionResult.completeExceptionally(expected) installedExtensionResult.completeExceptionally(expected)
shadowOf(getMainLooper()).idle()
assertSame(expected, throwable) assertSame(expected, throwable)
assertNull(extensions) assertNull(extensions)
} }
@@ -1454,6 +1497,8 @@ class GeckoEngineTest {
) )
enableExtensionResult.complete(enabledExtension) enableExtensionResult.complete(enabledExtension)
shadowOf(getMainLooper()).idle()
assertFalse(onErrorCalled) assertFalse(onErrorCalled)
assertNotNull(result) assertNotNull(result)
verify(webExtensionsDelegate).onEnabled(result!!) verify(webExtensionsDelegate).onEnabled(result!!)
@@ -1487,6 +1532,8 @@ class GeckoEngineTest {
) )
enableExtensionResult.completeExceptionally(expected) enableExtensionResult.completeExceptionally(expected)
shadowOf(getMainLooper()).idle()
assertSame(expected, throwable) assertSame(expected, throwable)
assertNull(result) assertNull(result)
verify(webExtensionsDelegate, never()).onEnabled(any()) verify(webExtensionsDelegate, never()).onEnabled(any())
@@ -1520,6 +1567,8 @@ class GeckoEngineTest {
) )
disableExtensionResult.complete(disabledExtension) disableExtensionResult.complete(disabledExtension)
shadowOf(getMainLooper()).idle()
assertFalse(onErrorCalled) assertFalse(onErrorCalled)
assertNotNull(result) assertNotNull(result)
verify(webExtensionsDelegate).onDisabled(result!!) verify(webExtensionsDelegate).onDisabled(result!!)
@@ -1553,6 +1602,8 @@ class GeckoEngineTest {
) )
disableExtensionResult.completeExceptionally(expected) disableExtensionResult.completeExceptionally(expected)
shadowOf(getMainLooper()).idle()
assertSame(expected, throwable) assertSame(expected, throwable)
assertNull(result) assertNull(result)
verify(webExtensionsDelegate, never()).onEnabled(any()) verify(webExtensionsDelegate, never()).onEnabled(any())
@@ -1587,6 +1638,8 @@ class GeckoEngineTest {
) )
allowedInPrivateBrowsingExtensionResult.complete(allowedInPrivateBrowsing) allowedInPrivateBrowsingExtensionResult.complete(allowedInPrivateBrowsing)
shadowOf(getMainLooper()).idle()
assertFalse(onErrorCalled) assertFalse(onErrorCalled)
assertNotNull(result) assertNotNull(result)
verify(webExtensionsDelegate).onAllowedInPrivateBrowsingChanged(result!!) verify(webExtensionsDelegate).onAllowedInPrivateBrowsingChanged(result!!)
@@ -1621,6 +1674,8 @@ class GeckoEngineTest {
) )
allowedInPrivateBrowsingExtensionResult.completeExceptionally(expected) allowedInPrivateBrowsingExtensionResult.completeExceptionally(expected)
shadowOf(getMainLooper()).idle()
assertSame(expected, throwable) assertSame(expected, throwable)
assertNull(result) assertNull(result)
verify(webExtensionsDelegate, never()).onAllowedInPrivateBrowsingChanged(any()) verify(webExtensionsDelegate, never()).onAllowedInPrivateBrowsingChanged(any())
@@ -1654,6 +1709,9 @@ class GeckoEngineTest {
val engine = GeckoEngine(context, runtime = runtime) val engine = GeckoEngine(context, runtime = runtime)
engine.clearData(data = Engine.BrowsingData.all(), onSuccess = { onSuccessCalled = true }) engine.clearData(data = Engine.BrowsingData.all(), onSuccess = { onSuccessCalled = true })
shadowOf(getMainLooper()).idle()
assertTrue(onSuccessCalled) assertTrue(onSuccessCalled)
} }
@@ -1679,6 +1737,9 @@ class GeckoEngineTest {
throwable = it throwable = it
} }
) )
shadowOf(getMainLooper()).idle()
assertTrue(onErrorCalled) assertTrue(onErrorCalled)
assertSame(exception, throwable) assertSame(exception, throwable)
} }
@@ -1702,6 +1763,9 @@ class GeckoEngineTest {
val engine = GeckoEngine(context, runtime = runtime) val engine = GeckoEngine(context, runtime = runtime)
engine.clearData(data = Engine.BrowsingData.all(), host = "mozilla.org", onSuccess = { onSuccessCalled = true }) engine.clearData(data = Engine.BrowsingData.all(), host = "mozilla.org", onSuccess = { onSuccessCalled = true })
shadowOf(getMainLooper()).idle()
assertTrue(onSuccessCalled) assertTrue(onSuccessCalled)
} }
@@ -1732,6 +1796,9 @@ class GeckoEngineTest {
throwable = it throwable = it
} }
) )
shadowOf(getMainLooper()).idle()
assertTrue(onErrorCalled) assertTrue(onErrorCalled)
assertSame(exception, throwable) assertSame(exception, throwable)
} }
@@ -1781,6 +1848,8 @@ class GeckoEngineTest {
logEntriesResult.complete(createDummyLogEntryList()) logEntriesResult.complete(createDummyLogEntryList())
shadowOf(getMainLooper()).idle()
val trackerLog = trackersLog!!.first() val trackerLog = trackersLog!!.first()
assertTrue(trackerLog.cookiesHasBeenBlocked) assertTrue(trackerLog.cookiesHasBeenBlocked)
assertEquals("www.tracker.com", trackerLog.url) assertEquals("www.tracker.com", trackerLog.url)
@@ -1810,6 +1879,8 @@ class GeckoEngineTest {
onError = { onErrorCalled = true } onError = { onErrorCalled = true }
) )
shadowOf(getMainLooper()).idle()
assertTrue(onErrorCalled) assertTrue(onErrorCalled)
} }
@@ -1839,6 +1910,8 @@ class GeckoEngineTest {
logEntriesResult.complete(createShimmedEntryList()) logEntriesResult.complete(createShimmedEntryList())
shadowOf(getMainLooper()).idle()
val trackerLog = trackersLog!!.first() val trackerLog = trackersLog!!.first()
assertEquals("www.tracker.com", trackerLog.url) assertEquals("www.tracker.com", trackerLog.url)
assertTrue(trackerLog.blockedCategories.contains(TrackingCategory.SCRIPTS_AND_SUB_RESOURCES)) assertTrue(trackerLog.blockedCategories.contains(TrackingCategory.SCRIPTS_AND_SUB_RESOURCES))
@@ -1867,6 +1940,8 @@ class GeckoEngineTest {
engine.getTrackersLog(mockSession, onSuccess = { trackersLog = it }) engine.getTrackersLog(mockSession, onSuccess = { trackersLog = it })
logEntriesResult.complete(createSocialTrackersLogEntryList()) logEntriesResult.complete(createSocialTrackersLogEntryList())
shadowOf(getMainLooper()).idle()
var trackerLog = trackersLog!!.first() var trackerLog = trackersLog!!.first()
assertTrue(trackerLog.cookiesHasBeenBlocked) assertTrue(trackerLog.cookiesHasBeenBlocked)
assertEquals("www.tracker.com", trackerLog.url) assertEquals("www.tracker.com", trackerLog.url)
@@ -1936,6 +2011,8 @@ class GeckoEngineTest {
) )
logEntriesResult.complete(createDummyLogEntryList()) logEntriesResult.complete(createDummyLogEntryList())
shadowOf(getMainLooper()).idle()
val trackerLog = trackersLog!![1] val trackerLog = trackersLog!![1]
assertTrue(trackerLog.loadedCategories.contains(TrackingCategory.SCRIPTS_AND_SUB_RESOURCES)) 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.content.Context
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.Color import android.graphics.Color
import android.os.Looper.getMainLooper
import android.view.View import android.view.View
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
import mozilla.components.browser.engine.gecko.GeckoEngineView.Companion.DARK_COVER 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.GeckoResult
import org.mozilla.geckoview.GeckoSession import org.mozilla.geckoview.GeckoSession
import org.robolectric.Robolectric.buildActivity import org.robolectric.Robolectric.buildActivity
import org.robolectric.Shadows.shadowOf
@RunWith(AndroidJUnit4::class) @RunWith(AndroidJUnit4::class)
class GeckoEngineViewTest { class GeckoEngineViewTest {
@@ -73,6 +75,8 @@ class GeckoEngineViewTest {
} }
verify(mockGeckoView).capturePixels() verify(mockGeckoView).capturePixels()
geckoResult.complete(mock()) geckoResult.complete(mock())
shadowOf(getMainLooper()).idle()
assertNotNull(thumbnail) assertNotNull(thumbnail)
geckoResult = GeckoResult() geckoResult = GeckoResult()
@@ -83,6 +87,8 @@ class GeckoEngineViewTest {
thumbnail = it thumbnail = it
} }
geckoResult.completeExceptionally(mock()) geckoResult.completeExceptionally(mock())
shadowOf(getMainLooper()).idle()
assertNull(thumbnail) assertNull(thumbnail)
// Test GeckoView throwing an exception // Test GeckoView throwing an exception

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -5,6 +5,7 @@
package mozilla.components.feature.accounts package mozilla.components.feature.accounts
import android.content.Context import android.content.Context
import android.os.Looper.getMainLooper
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
@@ -34,6 +35,7 @@ import org.mockito.ArgumentMatchers.anyString
import org.mockito.Mockito.`when` import org.mockito.Mockito.`when`
import org.mockito.Mockito.never import org.mockito.Mockito.never
import org.mockito.Mockito.verify import org.mockito.Mockito.verify
import org.robolectric.Shadows.shadowOf
import org.robolectric.annotation.Config import org.robolectric.annotation.Config
import kotlin.coroutines.CoroutineContext import kotlin.coroutines.CoroutineContext
@@ -183,6 +185,9 @@ class FirefoxAccountsAuthFeatureTest {
RequestInterceptor.InterceptionResponse.Url(redirectUrl), 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) 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( verify(manager).finishAuthentication(
FxaAuthData(authType = AuthType.OtherExternal(null), code = "testCode1", state = "testState1") FxaAuthData(authType = AuthType.OtherExternal(null), code = "testCode1", state = "testState1")
) )
@@ -192,6 +197,9 @@ class FirefoxAccountsAuthFeatureTest {
RequestInterceptor.InterceptionResponse.Url(redirectUrl), 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) 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( verify(manager).finishAuthentication(
FxaAuthData(authType = AuthType.Signin, code = "testCode2", state = "testState2") FxaAuthData(authType = AuthType.Signin, code = "testCode2", state = "testState2")
) )
@@ -201,6 +209,9 @@ class FirefoxAccountsAuthFeatureTest {
RequestInterceptor.InterceptionResponse.Url(redirectUrl), 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) 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( verify(manager).finishAuthentication(
FxaAuthData(authType = AuthType.Signup, code = "testCode3", state = "testState3") FxaAuthData(authType = AuthType.Signup, code = "testCode3", state = "testState3")
) )
@@ -210,6 +221,9 @@ class FirefoxAccountsAuthFeatureTest {
RequestInterceptor.InterceptionResponse.Url(redirectUrl), 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) 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( verify(manager).finishAuthentication(
FxaAuthData(authType = AuthType.Pairing, code = "testCode4", state = "testState4") FxaAuthData(authType = AuthType.Pairing, code = "testCode4", state = "testState4")
) )
@@ -219,6 +233,9 @@ class FirefoxAccountsAuthFeatureTest {
RequestInterceptor.InterceptionResponse.Url(redirectUrl), 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) 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( verify(manager).finishAuthentication(
FxaAuthData(authType = AuthType.OtherExternal("someNewActionType"), code = "testCode5", state = "testState5") FxaAuthData(authType = AuthType.OtherExternal("someNewActionType"), code = "testCode5", state = "testState5")
) )

View File

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

View File

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

View File

@@ -10,6 +10,7 @@ import android.app.DownloadManager.ACTION_DOWNLOAD_COMPLETE
import android.app.DownloadManager.Request import android.app.DownloadManager.Request
import android.content.Intent import android.content.Intent
import android.os.Build import android.os.Build
import android.os.Looper.getMainLooper
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
import mozilla.components.browser.state.state.content.DownloadState import mozilla.components.browser.state.state.content.DownloadState
import mozilla.components.browser.state.store.BrowserStore 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.spy
import org.mockito.Mockito.verify import org.mockito.Mockito.verify
import org.mockito.Mockito.verifyNoInteractions import org.mockito.Mockito.verifyNoInteractions
import org.robolectric.Shadows.shadowOf
@RunWith(AndroidJUnit4::class) @RunWith(AndroidJUnit4::class)
class AndroidDownloadManagerTest { class AndroidDownloadManagerTest {
@@ -67,6 +69,7 @@ class AndroidDownloadManagerTest {
assertEquals(download.copy(id = id), store.state.downloads[id]) assertEquals(download.copy(id = id), store.state.downloads[id])
notifyDownloadCompleted(id) notifyDownloadCompleted(id)
shadowOf(getMainLooper()).idle()
assertTrue(downloadCompleted) assertTrue(downloadCompleted)
} }
@@ -78,13 +81,14 @@ class AndroidDownloadManagerTest {
grantPermissions() grantPermissions()
val id = downloadManager.download(download)!! val id = downloadManager.download(download)!!
store.waitUntilIdle()
notifyDownloadFailed(id) notifyDownloadFailed(id)
shadowOf(getMainLooper()).idle()
assertTrue(downloadStopped) assertTrue(downloadStopped)
downloadStopped = false downloadStopped = false
downloadManager.tryAgain(id) downloadManager.tryAgain(id)
notifyDownloadCompleted(id) notifyDownloadCompleted(id)
shadowOf(getMainLooper()).idle()
assertTrue(downloadStopped) assertTrue(downloadStopped)
} }
@@ -131,7 +135,6 @@ class AndroidDownloadManagerTest {
downloadWithFileName, downloadWithFileName,
cookie = "yummy_cookie=choco" cookie = "yummy_cookie=choco"
)!! )!!
store.waitUntilIdle()
downloadManager.onDownloadStopped = { _, _, status -> downloadManager.onDownloadStopped = { _, _, status ->
downloadStatus = status downloadStatus = status
@@ -139,6 +142,7 @@ class AndroidDownloadManagerTest {
} }
notifyDownloadCompleted(id) notifyDownloadCompleted(id)
shadowOf(getMainLooper()).idle()
assertTrue(downloadCompleted) assertTrue(downloadCompleted)
assertEquals(DownloadState.Status.COMPLETED, downloadStatus) assertEquals(DownloadState.Status.COMPLETED, downloadStatus)
@@ -162,7 +166,7 @@ class AndroidDownloadManagerTest {
assertEquals(downloadWithFileName.copy(id = id), store.state.downloads[id]) assertEquals(downloadWithFileName.copy(id = id), store.state.downloads[id])
notifyDownloadCompleted(id) notifyDownloadCompleted(id)
store.waitUntilIdle() shadowOf(getMainLooper()).idle()
assertEquals(DownloadState.Status.COMPLETED, downloadStatus) 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.Context
import android.content.Intent import android.content.Intent
import android.os.Build import android.os.Build
import android.os.Looper.getMainLooper
import androidx.localbroadcastmanager.content.LocalBroadcastManager import androidx.localbroadcastmanager.content.LocalBroadcastManager
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
import mozilla.components.browser.state.state.content.DownloadState 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.never
import org.mockito.Mockito.spy import org.mockito.Mockito.spy
import org.mockito.Mockito.verify import org.mockito.Mockito.verify
import org.robolectric.Shadows.shadowOf
@RunWith(AndroidJUnit4::class) @RunWith(AndroidJUnit4::class)
class FetchDownloadManagerTest { class FetchDownloadManagerTest {
@@ -79,6 +81,8 @@ class FetchDownloadManagerTest {
assertEquals(download, store.state.downloads[download.id]) assertEquals(download, store.state.downloads[download.id])
notifyDownloadCompleted(id) notifyDownloadCompleted(id)
shadowOf(getMainLooper()).idle()
assertTrue(downloadStopped) assertTrue(downloadStopped)
} }
@@ -95,12 +99,15 @@ class FetchDownloadManagerTest {
val id = downloadManager.download(download)!! val id = downloadManager.download(download)!!
store.waitUntilIdle() store.waitUntilIdle()
notifyDownloadFailed(id) notifyDownloadFailed(id)
shadowOf(getMainLooper()).idle()
assertTrue(downloadStopped) assertTrue(downloadStopped)
downloadStopped = false downloadStopped = false
downloadManager.tryAgain(id) downloadManager.tryAgain(id)
verify(context).startService(any()) verify(context).startService(any())
notifyDownloadCompleted(id) notifyDownloadCompleted(id)
shadowOf(getMainLooper()).idle()
assertTrue(downloadStopped) assertTrue(downloadStopped)
} }
@@ -178,6 +185,8 @@ class FetchDownloadManagerTest {
store.waitUntilIdle() store.waitUntilIdle()
notifyDownloadCompleted(id) notifyDownloadCompleted(id)
shadowOf(getMainLooper()).idle()
assertTrue(downloadStopped) assertTrue(downloadStopped)
assertEquals(DownloadState.Status.COMPLETED, downloadStatus) assertEquals(DownloadState.Status.COMPLETED, downloadStatus)
} }
@@ -200,6 +209,8 @@ class FetchDownloadManagerTest {
assertEquals(downloadWithFileName, store.state.downloads[downloadWithFileName.id]) assertEquals(downloadWithFileName, store.state.downloads[downloadWithFileName.id])
notifyDownloadCompleted(id) notifyDownloadCompleted(id)
shadowOf(getMainLooper()).idle()
store.waitUntilIdle() store.waitUntilIdle()
assertEquals(DownloadState.Status.COMPLETED, downloadStatus) assertEquals(DownloadState.Status.COMPLETED, downloadStatus)
} }
@@ -224,6 +235,7 @@ class FetchDownloadManagerTest {
val id = downloadManager.download(downloadWithFileName)!! val id = downloadManager.download(downloadWithFileName)!!
store.waitUntilIdle() store.waitUntilIdle()
notifyDownloadCompleted(id) notifyDownloadCompleted(id)
shadowOf(getMainLooper()).idle()
assertTrue(downloadStopped) assertTrue(downloadStopped)
assertEquals("5MB.zip", downloadName) assertEquals("5MB.zip", downloadName)

View File

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

View File

@@ -5,6 +5,7 @@
package mozilla.components.feature.prompts.dialog package mozilla.components.feature.prompts.dialog
import android.content.DialogInterface import android.content.DialogInterface
import android.os.Looper.getMainLooper
import android.view.View.GONE import android.view.View.GONE
import android.widget.TextView import android.widget.TextView
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
@@ -21,6 +22,7 @@ import org.mockito.Mockito.doReturn
import org.mockito.Mockito.spy import org.mockito.Mockito.spy
import org.mockito.Mockito.verify import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations.openMocks import org.mockito.MockitoAnnotations.openMocks
import org.robolectric.Shadows.shadowOf
@RunWith(AndroidJUnit4::class) @RunWith(AndroidJUnit4::class)
class AuthenticationDialogFragmentTest { class AuthenticationDialogFragmentTest {
@@ -164,6 +166,7 @@ class AuthenticationDialogFragmentTest {
val positiveButton = (dialog as AlertDialog).getButton(DialogInterface.BUTTON_POSITIVE) val positiveButton = (dialog as AlertDialog).getButton(DialogInterface.BUTTON_POSITIVE)
positiveButton.performClick() positiveButton.performClick()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onConfirm("sessionId", "uid", "username" to "password") 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_NEGATIVE
import android.content.DialogInterface.BUTTON_POSITIVE import android.content.DialogInterface.BUTTON_POSITIVE
import android.os.Looper.getMainLooper
import android.os.Parcelable import android.os.Parcelable
import android.view.LayoutInflater import android.view.LayoutInflater
import android.widget.LinearLayout import android.widget.LinearLayout
@@ -45,6 +46,7 @@ import org.mockito.Mockito.spy
import org.mockito.Mockito.times import org.mockito.Mockito.times
import org.mockito.Mockito.verify import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations.openMocks import org.mockito.MockitoAnnotations.openMocks
import org.robolectric.Shadows.shadowOf
@RunWith(AndroidJUnit4::class) @RunWith(AndroidJUnit4::class)
class ChoiceDialogFragmentTest { class ChoiceDialogFragmentTest {
@@ -318,9 +320,11 @@ class ChoiceDialogFragmentTest {
adapter.bindViewHolder(holder, 0) adapter.bindViewHolder(holder, 0)
holder.itemView.performClick() holder.itemView.performClick()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onConfirm("sessionId", "uid", choices.first()) verify(mockFeature).onConfirm("sessionId", "uid", choices.first())
dialog.dismiss() dialog.dismiss()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onCancel("sessionId", "uid") verify(mockFeature).onCancel("sessionId", "uid")
} }
@@ -346,9 +350,13 @@ class ChoiceDialogFragmentTest {
adapter.bindViewHolder(holder, 0) adapter.bindViewHolder(holder, 0)
holder.itemView.performClick() holder.itemView.performClick()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onConfirm("sessionId", "uid", choices.first()) verify(mockFeature).onConfirm("sessionId", "uid", choices.first())
dialog.dismiss() dialog.dismiss()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onCancel("sessionId", "uid") verify(mockFeature).onCancel("sessionId", "uid")
} }
@@ -378,11 +386,13 @@ class ChoiceDialogFragmentTest {
val positiveButton = (dialog as AlertDialog).getButton(BUTTON_POSITIVE) val positiveButton = (dialog as AlertDialog).getButton(BUTTON_POSITIVE)
positiveButton.performClick() positiveButton.performClick()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onConfirm("sessionId", "uid", fragment.mapSelectChoice.keys.toTypedArray()) verify(mockFeature).onConfirm("sessionId", "uid", fragment.mapSelectChoice.keys.toTypedArray())
val negativeButton = dialog.getButton(BUTTON_NEGATIVE) val negativeButton = dialog.getButton(BUTTON_NEGATIVE)
negativeButton.performClick() negativeButton.performClick()
shadowOf(getMainLooper()).idle()
verify(mockFeature, times(2)).onCancel("sessionId", "uid") verify(mockFeature, times(2)).onCancel("sessionId", "uid")
} }
@@ -416,6 +426,7 @@ class ChoiceDialogFragmentTest {
val positiveButton = (dialog as AlertDialog).getButton(BUTTON_POSITIVE) val positiveButton = (dialog as AlertDialog).getButton(BUTTON_POSITIVE)
positiveButton.performClick() positiveButton.performClick()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onConfirm("sessionId", "uid", fragment.mapSelectChoice.keys.toTypedArray()) verify(mockFeature).onConfirm("sessionId", "uid", fragment.mapSelectChoice.keys.toTypedArray())
} }

View File

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

View File

@@ -5,6 +5,7 @@
package mozilla.components.feature.prompts.dialog package mozilla.components.feature.prompts.dialog
import android.content.DialogInterface import android.content.DialogInterface
import android.os.Looper.getMainLooper
import android.widget.TextView import android.widget.TextView
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.test.ext.junit.runners.AndroidJUnit4 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.spy
import org.mockito.Mockito.verify import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations.openMocks import org.mockito.MockitoAnnotations.openMocks
import org.robolectric.Shadows.shadowOf
@RunWith(AndroidJUnit4::class) @RunWith(AndroidJUnit4::class)
class ConfirmDialogFragmentTest { class ConfirmDialogFragmentTest {
@@ -81,6 +83,7 @@ class ConfirmDialogFragmentTest {
val positiveButton = (dialog as AlertDialog).getButton(DialogInterface.BUTTON_POSITIVE) val positiveButton = (dialog as AlertDialog).getButton(DialogInterface.BUTTON_POSITIVE)
positiveButton.performClick() positiveButton.performClick()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onConfirm("sessionId", "uid", false) verify(mockFeature).onConfirm("sessionId", "uid", false)
} }
@@ -97,6 +100,7 @@ class ConfirmDialogFragmentTest {
val negativeButton = (dialog as AlertDialog).getButton(DialogInterface.BUTTON_NEGATIVE) val negativeButton = (dialog as AlertDialog).getButton(DialogInterface.BUTTON_NEGATIVE)
negativeButton.performClick() negativeButton.performClick()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onCancel("sessionId", "uid", false) 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
import android.content.DialogInterface.BUTTON_POSITIVE import android.content.DialogInterface.BUTTON_POSITIVE
import android.os.Looper.getMainLooper
import android.widget.CheckBox import android.widget.CheckBox
import android.widget.TextView import android.widget.TextView
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
@@ -26,6 +27,7 @@ import org.mockito.Mockito.doReturn
import org.mockito.Mockito.spy import org.mockito.Mockito.spy
import org.mockito.Mockito.verify import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations.openMocks import org.mockito.MockitoAnnotations.openMocks
import org.robolectric.Shadows.shadowOf
@RunWith(AndroidJUnit4::class) @RunWith(AndroidJUnit4::class)
class MultiButtonDialogFragmentTest { class MultiButtonDialogFragmentTest {
@@ -134,6 +136,7 @@ class MultiButtonDialogFragmentTest {
val positiveButton = (dialog as AlertDialog).getButton(BUTTON_POSITIVE) val positiveButton = (dialog as AlertDialog).getButton(BUTTON_POSITIVE)
positiveButton.performClick() positiveButton.performClick()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onConfirm("sessionId", "uid", false to MultiButtonDialogFragment.ButtonType.POSITIVE) 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) val negativeButton = (dialog as AlertDialog).getButton(DialogInterface.BUTTON_NEGATIVE)
negativeButton.performClick() negativeButton.performClick()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onConfirm("sessionId", "uid", false to MultiButtonDialogFragment.ButtonType.NEGATIVE) 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) val neutralButton = (dialog as AlertDialog).getButton(DialogInterface.BUTTON_NEUTRAL)
neutralButton.performClick() neutralButton.performClick()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onConfirm("sessionId", "uid", false to MultiButtonDialogFragment.ButtonType.NEUTRAL) verify(mockFeature).onConfirm("sessionId", "uid", false to MultiButtonDialogFragment.ButtonType.NEUTRAL)
} }
@@ -222,6 +227,7 @@ class MultiButtonDialogFragmentTest {
val positiveButton = (dialog as AlertDialog).getButton(BUTTON_POSITIVE) val positiveButton = (dialog as AlertDialog).getButton(BUTTON_POSITIVE)
positiveButton.performClick() positiveButton.performClick()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onConfirm("sessionId", "uid", true to MultiButtonDialogFragment.ButtonType.POSITIVE) verify(mockFeature).onConfirm("sessionId", "uid", true to MultiButtonDialogFragment.ButtonType.POSITIVE)
} }

View File

@@ -5,6 +5,7 @@
package mozilla.components.feature.prompts.dialog package mozilla.components.feature.prompts.dialog
import android.content.DialogInterface.BUTTON_POSITIVE import android.content.DialogInterface.BUTTON_POSITIVE
import android.os.Looper.getMainLooper
import android.widget.CheckBox import android.widget.CheckBox
import android.widget.TextView import android.widget.TextView
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
@@ -24,6 +25,7 @@ import org.mockito.Mockito.doReturn
import org.mockito.Mockito.spy import org.mockito.Mockito.spy
import org.mockito.Mockito.verify import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations import org.mockito.MockitoAnnotations
import org.robolectric.Shadows.shadowOf
@RunWith(AndroidJUnit4::class) @RunWith(AndroidJUnit4::class)
class TextPromptDialogFragmentTest { class TextPromptDialogFragmentTest {
@@ -107,6 +109,7 @@ class TextPromptDialogFragmentTest {
val positiveButton = (dialog as AlertDialog).getButton(BUTTON_POSITIVE) val positiveButton = (dialog as AlertDialog).getButton(BUTTON_POSITIVE)
positiveButton.performClick() positiveButton.performClick()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onConfirm("sessionId", "uid", false to "defaultValue") verify(mockFeature).onConfirm("sessionId", "uid", false to "defaultValue")
} }
@@ -131,6 +134,7 @@ class TextPromptDialogFragmentTest {
val positiveButton = (dialog as AlertDialog).getButton(BUTTON_POSITIVE) val positiveButton = (dialog as AlertDialog).getButton(BUTTON_POSITIVE)
positiveButton.performClick() positiveButton.performClick()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onConfirm("sessionId", "uid", true to "defaultValue") 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_NEUTRAL
import android.content.DialogInterface.BUTTON_POSITIVE import android.content.DialogInterface.BUTTON_POSITIVE
import android.os.Build.VERSION_CODES.LOLLIPOP import android.os.Build.VERSION_CODES.LOLLIPOP
import android.os.Looper.getMainLooper
import android.widget.DatePicker import android.widget.DatePicker
import android.widget.NumberPicker import android.widget.NumberPicker
import android.widget.TimePicker import android.widget.TimePicker
@@ -37,6 +38,7 @@ import org.mockito.Mockito.doReturn
import org.mockito.Mockito.spy import org.mockito.Mockito.spy
import org.mockito.Mockito.verify import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations.openMocks import org.mockito.MockitoAnnotations.openMocks
import org.robolectric.Shadows.shadowOf
import org.robolectric.annotation.Config import org.robolectric.annotation.Config
import java.util.Calendar import java.util.Calendar
import java.util.Date import java.util.Date
@@ -90,10 +92,14 @@ class TimePickerDialogFragmentTest {
val positiveButton = (dialog as AlertDialog).getButton(BUTTON_POSITIVE) val positiveButton = (dialog as AlertDialog).getButton(BUTTON_POSITIVE)
positiveButton.performClick() positiveButton.performClick()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onConfirm(eq("sessionId"), eq("uid"), any()) verify(mockFeature).onConfirm(eq("sessionId"), eq("uid"), any())
val neutralButton = dialog.getButton(BUTTON_NEUTRAL) val neutralButton = dialog.getButton(BUTTON_NEUTRAL)
neutralButton.performClick() neutralButton.performClick()
shadowOf(getMainLooper()).idle()
verify(mockFeature).onClear("sessionId", "uid") verify(mockFeature).onClear("sessionId", "uid")
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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