diff options
| author | Aleksandr Granin <aleksandr@mullvad.net> | 2021-03-29 18:51:33 +0200 |
|---|---|---|
| committer | Aleksandr Granin <aleksandr@mullvad.net> | 2021-04-01 13:30:37 +0200 |
| commit | 1b7ad5b6b57fca6508b022e455a8f8a10f7f1f1d (patch) | |
| tree | 7afc6eb6d61296891d4c39c63c7bd1048a69eb50 /android/src | |
| parent | 99a40bc34d559cbb0bf936ad510b97095a02d062 (diff) | |
| download | mullvadvpn-1b7ad5b6b57fca6508b022e455a8f8a10f7f1f1d.tar.xz mullvadvpn-1b7ad5b6b57fca6508b022e455a8f8a10f7f1f1d.zip | |
Add test timeout limit
Diffstat (limited to 'android/src')
4 files changed, 50 insertions, 47 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsProvider.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsProvider.kt index 92af83aea3..182d6608fd 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsProvider.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsProvider.kt @@ -16,7 +16,7 @@ class ApplicationsProvider( !isSelfApplication(appInfo.packageName) } - fun getAppsListAsync(): Deferred<List<AppData>> = CompletableDeferred( + fun getAppsList(): Deferred<List<AppData>> = CompletableDeferred( packageManager.getInstalledApplications(PackageManager.GET_META_DATA) .asSequence() .filter(applicationFilterPredicate) diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/SplitTunnelingViewModel.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/SplitTunnelingViewModel.kt index c2b95b9c2a..9ce3254f63 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/SplitTunnelingViewModel.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/SplitTunnelingViewModel.kt @@ -4,7 +4,7 @@ import androidx.annotation.StringRes import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import kotlinx.coroutines.CompletableDeferred -import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.SharingStarted @@ -22,7 +22,8 @@ import net.mullvad.mullvadvpn.service.SplitTunneling class SplitTunnelingViewModel( private val appsProvider: ApplicationsProvider, - private val splitTunneling: SplitTunneling + private val splitTunneling: SplitTunneling, + dispatcher: CoroutineDispatcher ) : ViewModel() { private val listItemsSink = MutableSharedFlow<List<ListItemData>>(replay = 1) // read-only public view @@ -39,14 +40,14 @@ class SplitTunnelingViewModel( ) init { - viewModelScope.launch(Dispatchers.Default) { + viewModelScope.launch(dispatcher) { listItemsSink.emit(defaultListItems + createDivider(0) + createProgressItem()) // this will be removed after changes on native to ignore enable parameter if (!splitTunneling.enabled) splitTunneling.enabled = true fetchData() } - viewModelScope.launch(Dispatchers.Default) { + viewModelScope.launch(dispatcher) { intentFlow.shareIn(viewModelScope, SharingStarted.WhileSubscribed()) .collect(::handleIntents) } @@ -90,7 +91,7 @@ class SplitTunnelingViewModel( } private suspend fun fetchData() { - appsProvider.getAppsListAsync().await() + appsProvider.getAppsList().await() .partition { app -> splitTunneling.excludedAppList.contains(app.packageName) } .let { (excludedAppsList, notExcludedAppsList) -> // TODO: remove potential package names from splitTunneling list diff --git a/android/src/test/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsProviderTest.kt b/android/src/test/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsProviderTest.kt index 21ea736ee3..93aee6d897 100644 --- a/android/src/test/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsProviderTest.kt +++ b/android/src/test/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsProviderTest.kt @@ -40,7 +40,7 @@ class ApplicationsProviderTest { createApplicationInfo(selfPackageName, internet = true, launch = true) ) - val result = testSubject.getAppsListAsync().await() + val result = testSubject.getAppsList().await() val expected = listOf( AppData(launchWithInternetPackageName, 0, launchWithInternetPackageName) ) diff --git a/android/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/SplitTunnelingViewModelTest.kt b/android/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/SplitTunnelingViewModelTest.kt index c0e447e5a0..903ae9f874 100644 --- a/android/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/SplitTunnelingViewModelTest.kt +++ b/android/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/SplitTunnelingViewModelTest.kt @@ -10,12 +10,12 @@ import io.mockk.mockk import io.mockk.unmockkAll import io.mockk.verify import io.mockk.verifyAll +import java.util.concurrent.TimeUnit import kotlinx.coroutines.CompletableDeferred -import kotlinx.coroutines.async import kotlinx.coroutines.cancel -import kotlinx.coroutines.flow.drop import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.test.runBlockingTest import net.mullvad.mullvadvpn.R import net.mullvad.mullvadvpn.TestCoroutineRule import net.mullvad.mullvadvpn.applist.AppData @@ -29,10 +29,14 @@ import org.junit.After import org.junit.Before import org.junit.Rule import org.junit.Test +import org.junit.rules.Timeout class SplitTunnelingViewModelTest { @get:Rule val testCoroutineRule = TestCoroutineRule() + + @get:Rule + val timeout = Timeout(3000L, TimeUnit.MILLISECONDS) private val mockedApplicationsProvider = mockk<ApplicationsProvider>() private val mockedSplitTunneling = mockk<SplitTunneling>() private val appsProviderDeferred = CompletableDeferred<List<AppData>>() @@ -41,12 +45,12 @@ class SplitTunnelingViewModelTest { @Before fun setup() { every { mockedSplitTunneling.enabled } returns true - coEvery { mockedApplicationsProvider.getAppsListAsync() } returns appsProviderDeferred + coEvery { mockedApplicationsProvider.getAppsList() } returns appsProviderDeferred testSubject = SplitTunnelingViewModel( mockedApplicationsProvider, - mockedSplitTunneling + mockedSplitTunneling, + testCoroutineRule.testDispatcher ) - Thread.sleep(50) } @After @@ -56,42 +60,43 @@ class SplitTunnelingViewModelTest { } @Test - fun test_has_progress_on_start() = runBlocking { - val actualList: List<ListItemData> = testSubject.listItems.first() - val initialExpectedList = listOf( - createTextItem(R.string.split_tunneling_description), - createDivider(0), createProgressItem() - ) + fun test_has_progress_on_start() { + runBlocking(testCoroutineRule.testDispatcher) { + val actualList: List<ListItemData> = testSubject.listItems.first() - assertLists(initialExpectedList, actualList) + val initialExpectedList = listOf( + createTextItem(R.string.split_tunneling_description), + createDivider(0), createProgressItem() + ) - verify(exactly = 1) { - mockedApplicationsProvider.getAppsListAsync() + assertLists(initialExpectedList, actualList) + + verify(exactly = 1) { + mockedApplicationsProvider.getAppsList() + } } } @Test - fun test_empty_app_list() = runBlocking { - val flow = testSubject.listItems - async { - testSubject.processIntent(ViewIntent.ViewIsReady) - appsProviderDeferred.complete(emptyList()) - } - val actualList = flow.drop(1).first() + fun test_empty_app_list() = runBlockingTest(testCoroutineRule.testDispatcher) { + testCoroutineRule.testDispatcher.advanceUntilIdle() + appsProviderDeferred.complete(emptyList()) + testSubject.processIntent(ViewIntent.ViewIsReady) + val actualList = testSubject.listItems.first() val expectedList = listOf(createTextItem(R.string.split_tunneling_description)) assertLists(expectedList, actualList) } @Test - fun test_apps_list_delivered() = runBlocking { + fun test_apps_list_delivered() = runBlockingTest(testCoroutineRule.testDispatcher) { val appExcluded = AppData("test.excluded", 0, "testName1") val appNotExcluded = AppData("test.not.excluded", 0, "testName2") every { mockedSplitTunneling.excludedAppList } returns listOf(appExcluded.packageName) - testSubject.processIntent(ViewIntent.ViewIsReady) appsProviderDeferred.complete(listOf(appExcluded, appNotExcluded)) + testSubject.processIntent(ViewIntent.ViewIsReady) - val actualList = testSubject.listItems.drop(1).first() + val actualList = testSubject.listItems.first() val expectedList = listOf( createTextItem(R.string.split_tunneling_description), createDivider(0), @@ -108,20 +113,20 @@ class SplitTunnelingViewModelTest { mockedSplitTunneling.excludedAppList mockedSplitTunneling.excludedAppList } + + testSubject.viewModelScope.coroutineContext.cancel() } @Test - fun test_remove_app_from_excluded() = runBlocking { - val flow = testSubject.listItems.drop(1) + fun test_remove_app_from_excluded() = runBlockingTest(testCoroutineRule.testDispatcher) { val app = AppData("test", 0, "testName") every { mockedSplitTunneling.excludedAppList } returns listOf(app.packageName) every { mockedSplitTunneling.includeApp(app.packageName) } just Runs - async { - testSubject.processIntent(ViewIntent.ViewIsReady) - appsProviderDeferred.complete(listOf(app)) - } - val listBeforeAction = flow.first() + appsProviderDeferred.complete(listOf(app)) + testSubject.processIntent(ViewIntent.ViewIsReady) + + val listBeforeAction = testSubject.listItems.first() val expectedListBeforeAction = listOf( createTextItem(R.string.split_tunneling_description), createDivider(0), @@ -134,7 +139,7 @@ class SplitTunnelingViewModelTest { val item = listBeforeAction.first { it.identifier == app.packageName } testSubject.processIntent(ViewIntent.ChangeApplicationGroup(item)) - val itemsAfterAction = flow.first() + val itemsAfterAction = testSubject.listItems.first() val expectedList = listOf( createTextItem(R.string.split_tunneling_description), createDivider(1), @@ -152,17 +157,14 @@ class SplitTunnelingViewModelTest { } @Test - fun test_add_app_to_excluded() = runBlocking { - val flow = testSubject.listItems.drop(1) + fun test_add_app_to_excluded() = runBlockingTest(testCoroutineRule.testDispatcher) { val app = AppData("test", 0, "testName") every { mockedSplitTunneling.excludedAppList } returns emptyList() every { mockedSplitTunneling.excludeApp(app.packageName) } just Runs - async { - testSubject.processIntent(ViewIntent.ViewIsReady) - appsProviderDeferred.complete(listOf(app)) - } + testSubject.processIntent(ViewIntent.ViewIsReady) + appsProviderDeferred.complete(listOf(app)) - val listBeforeAction = flow.first() + val listBeforeAction = testSubject.listItems.first() val expectedListBeforeAction = listOf( createTextItem(R.string.split_tunneling_description), createDivider(1), @@ -175,7 +177,7 @@ class SplitTunnelingViewModelTest { val item = listBeforeAction.first { it.identifier == app.packageName } testSubject.processIntent(ViewIntent.ChangeApplicationGroup(item)) - val itemsAfterAction = flow.first() + val itemsAfterAction = testSubject.listItems.first() val expectedList = listOf( createTextItem(R.string.split_tunneling_description), createDivider(0), |
