summaryrefslogtreecommitdiffhomepage
path: root/android/src
diff options
context:
space:
mode:
authorAleksandr Granin <aleksandr@mullvad.net>2021-03-29 18:51:33 +0200
committerAleksandr Granin <aleksandr@mullvad.net>2021-04-01 13:30:37 +0200
commit1b7ad5b6b57fca6508b022e455a8f8a10f7f1f1d (patch)
tree7afc6eb6d61296891d4c39c63c7bd1048a69eb50 /android/src
parent99a40bc34d559cbb0bf936ad510b97095a02d062 (diff)
downloadmullvadvpn-1b7ad5b6b57fca6508b022e455a8f8a10f7f1f1d.tar.xz
mullvadvpn-1b7ad5b6b57fca6508b022e455a8f8a10f7f1f1d.zip
Add test timeout limit
Diffstat (limited to 'android/src')
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsProvider.kt2
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/SplitTunnelingViewModel.kt11
-rw-r--r--android/src/test/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsProviderTest.kt2
-rw-r--r--android/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/SplitTunnelingViewModelTest.kt82
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),