tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit c5cf2acb3a092bc98fd4a2a708724b5f72f12d77
parent 4c489df8910ed5392ddd38eb39618419af4b6815
Author: mike a. <mavduevskiy@mozilla.com>
Date:   Mon, 17 Nov 2025 23:23:05 +0000

Bug 2000337 - Improve SplashScreenManager tests r=android-reviewers,twhite

Differential Revision: https://phabricator.services.mozilla.com/D272741

Diffstat:
Mmobile/android/fenix/app/src/test/java/org/mozilla/fenix/splashscreen/SplashScreenManagerTest.kt | 178++++++++++++++++++++++---------------------------------------------------------
1 file changed, 48 insertions(+), 130 deletions(-)

diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/splashscreen/SplashScreenManagerTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/splashscreen/SplashScreenManagerTest.kt @@ -7,7 +7,10 @@ import androidx.core.splashscreen.SplashScreen import kotlinx.coroutines.delay import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.runTest -import org.junit.Assert +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner @@ -16,24 +19,21 @@ import org.robolectric.RobolectricTestRunner class SplashScreenManagerTest { @Test - fun `WHEN a user has already seen the splash screen THEN do not show splash screen`() = runTest { - val storage = object : SplashScreenStorage { - override var isFirstSplashScreenShown = true - } + fun `GIVEN splash screen already shown WHEN showSplashScreen is called THEN do not present splash screen`() = runTest { var result: SplashScreenManagerResult? = null val splashScreenManager = buildSplashScreen( - storage = storage, + isFirstSplashScreenShown = true, onSplashScreenFinished = { result = it }, ) - Assert.assertNull(result) + assertNull(result) splashScreenManager.showSplashScreen() - Assert.assertEquals(SplashScreenManagerResult.DidNotPresentSplashScreen, result) + assertEquals(SplashScreenManagerResult.DidNotPresentSplashScreen, result) } @Test - fun `WHEN the splash screen has not been shown yet THEN show the splash screen`() = runTest { + fun `GIVEN splash screen not yet shown WHEN showSplashScreen is called THEN present the splash screen`() = runTest { var splashScreenShown = false val splashScreenManager = buildSplashScreen( showSplashScreen = { _ -> splashScreenShown = true }, @@ -41,11 +41,11 @@ class SplashScreenManagerTest { splashScreenManager.showSplashScreen() - Assert.assertTrue(splashScreenShown) + assertTrue(splashScreenShown) } @Test - fun `WHEN a user has not seen the splash screen THEN show splash screen and update storage`() = runTest { + fun `GIVEN splash screen not yet shown WHEN showSplashScreen is called THEN present splash screen and update storage`() = runTest { var splashScreenShown = false val storage = object : SplashScreenStorage { override var isFirstSplashScreenShown = false @@ -55,161 +55,79 @@ class SplashScreenManagerTest { showSplashScreen = { _ -> splashScreenShown = true }, ) - Assert.assertFalse(splashScreenShown) - Assert.assertFalse(storage.isFirstSplashScreenShown) + assertFalse(splashScreenShown) + assertFalse(storage.isFirstSplashScreenShown) splashScreenManager.showSplashScreen() - Assert.assertTrue(splashScreenShown) - Assert.assertTrue(storage.isFirstSplashScreenShown) + assertTrue(splashScreenShown) + assertTrue(storage.isFirstSplashScreenShown) } @Test - fun `GIVEN an operation shorter than the splashscreen timeout WHEN splash screen is shown THEN we should get an operation completed result`() = runTest { - val operationTime = 400L - val splashScreenTimeout = 2_500L - val fastOperation = object : SplashScreenOperation { - override val type: String - get() = "so operation much fast" - override val dataFetched: Boolean - get() = false - - override suspend fun run() { - delay(operationTime) - } - - override fun dispose() {} - } + fun `GIVEN operation finishes before timeout WHEN showSplashScreen is called THEN return OperationFinished and dispose operation`() = runTest { + val operationTime = 100L + val splashScreenTimeout = 200L + val operation = MockedSplashScreenOperation(operationTime) var result: SplashScreenManagerResult? = null val splashScreenManager = buildSplashScreen( - splashScreenOperation = fastOperation, + splashScreenOperation = operation, splashScreenTimeout = splashScreenTimeout, onSplashScreenFinished = { result = it }, ) splashScreenManager.showSplashScreen() - Assert.assertNull(result) - this.testScheduler.advanceUntilIdle() - Assert.assertTrue(result is SplashScreenManagerResult.OperationFinished) + assertNull(result) + testScheduler.advanceUntilIdle() + assertTrue(operation.disposed) + assertTrue(result is SplashScreenManagerResult.OperationFinished) } @Test - fun `GIVEN a splash manager with an operation running longer than the splashscreen timeout WHEN splash screen is shown THEN we should get an timeout exceeded result`() = runTest { - val operationTime = 11_000L - val splashScreenTimeout = 2_500L - val slowOperation = object : SplashScreenOperation { - override val type: String - get() = "so slow much trouble" - override val dataFetched: Boolean - get() = false - - override suspend fun run() { - delay(operationTime) - } - - override fun dispose() {} - } + fun `WHEN operation completes THEN operation is disposed`() = runTest { + val operationTime = 100L + val splashScreenTimeout = 200L + val operation = MockedSplashScreenOperation(operationTime) var result: SplashScreenManagerResult? = null val splashScreenManager = buildSplashScreen( - splashScreenOperation = slowOperation, + splashScreenOperation = operation, splashScreenTimeout = splashScreenTimeout, onSplashScreenFinished = { result = it }, ) splashScreenManager.showSplashScreen() - Assert.assertNull(result) - this.testScheduler.advanceUntilIdle() - Assert.assertTrue(result is SplashScreenManagerResult.TimeoutExceeded) + assertNull(result) + testScheduler.advanceUntilIdle() + assertTrue(result is SplashScreenManagerResult.OperationFinished) + assertTrue(operation.disposed) } - @Test - fun `WHEN splash screen times out THEN the operation is disposed`() = runTest { - val operationTime = 11_000L - val splashScreenTimeout = 2_500L - val slowOperation = object : SplashScreenOperation { - var disposed: Boolean = false - override val type: String - get() = "so slow much trouble" - override val dataFetched: Boolean - get() = false - - override suspend fun run() { - delay(operationTime) - } - - override fun dispose() { - disposed = true - } - } - var result: SplashScreenManagerResult? = null - val splashScreenManager = buildSplashScreen( - splashScreenOperation = slowOperation, - splashScreenTimeout = splashScreenTimeout, - onSplashScreenFinished = { result = it }, - ) - - splashScreenManager.showSplashScreen() + internal class MockedSplashScreenOperation( + val operationTimeMillis: Long, + ) : SplashScreenOperation { + var disposed: Boolean = false + override val type: String + get() = "mock" + override val dataFetched: Boolean + get() = false - Assert.assertNull(result) - this.testScheduler.advanceUntilIdle() - Assert.assertTrue(result is SplashScreenManagerResult.TimeoutExceeded) - Assert.assertTrue(slowOperation.disposed) - } + override suspend fun run() = delay(operationTimeMillis) - @Test - fun `WHEN an operation finishes THEN the operation is disposed`() = runTest { - val operationTime = 400L - val splashScreenTimeout = 2_500L - val slowOperation = object : SplashScreenOperation { - var disposed: Boolean = false - override val type: String - get() = "so slow much trouble" - override val dataFetched: Boolean - get() = false - - override suspend fun run() { - delay(operationTime) - } - - override fun dispose() { - disposed = true - } + override fun dispose() { + disposed = true } - var result: SplashScreenManagerResult? = null - val splashScreenManager = buildSplashScreen( - splashScreenOperation = slowOperation, - splashScreenTimeout = splashScreenTimeout, - onSplashScreenFinished = { result = it }, - ) - - splashScreenManager.showSplashScreen() - - Assert.assertNull(result) - this.testScheduler.advanceUntilIdle() - Assert.assertTrue(result is SplashScreenManagerResult.OperationFinished) - Assert.assertTrue(slowOperation.disposed) } private fun TestScope.buildSplashScreen( - splashScreenOperation: SplashScreenOperation = object : SplashScreenOperation { - override val type: String - get() = "test" - override val dataFetched: Boolean - get() = false - - override suspend fun run() { - delay(2_400) - } - - override fun dispose() {} - }, - splashScreenTimeout: Long = 2_500, + splashScreenOperation: SplashScreenOperation = MockedSplashScreenOperation(100), + splashScreenTimeout: Long = 200, + isFirstSplashScreenShown: Boolean = false, showSplashScreen: (SplashScreen.KeepOnScreenCondition) -> Unit = { _ -> }, onSplashScreenFinished: (SplashScreenManagerResult) -> Unit = { _ -> }, storage: SplashScreenStorage = object : SplashScreenStorage { - override var isFirstSplashScreenShown = false + override var isFirstSplashScreenShown = isFirstSplashScreenShown }, ): SplashScreenManager { return SplashScreenManager(