Loading app/src/main/java/foundation/e/apps/install/workmanager/AppInstallProcessor.kt +2 −1 Original line number Diff line number Diff line Loading @@ -162,7 +162,8 @@ class AppInstallProcessor @Inject constructor( } } private suspend fun waitForTaskCompletionOrCancelOnTimeout( @VisibleForTesting suspend fun waitForTaskCompletionOrCancelOnTimeout( workManager: WorkManager = WorkManager.getInstance(context), timeout: Duration = INSTALL_TASK_TIMEOUT, workId: UUID Loading app/src/test/java/foundation/e/apps/installProcessor/AppInstallProcessorTest.kt +69 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,8 @@ import android.net.ConnectivityManager import android.net.Network import android.net.NetworkCapabilities import androidx.arch.core.executor.testing.InstantTaskExecutorRule import androidx.work.WorkInfo import androidx.work.WorkManager import foundation.e.apps.data.ResultSupreme import foundation.e.apps.data.enums.Status import foundation.e.apps.data.fdroid.FDroidRepository Loading @@ -42,10 +44,14 @@ import foundation.e.apps.utils.StorageComputer import foundation.e.apps.util.MainCoroutineRule import io.mockk.coEvery import io.mockk.coVerify import io.mockk.every import io.mockk.mockk import io.mockk.mockkObject import io.mockk.unmockkObject import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.test.runTest import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue Loading @@ -57,6 +63,9 @@ import org.mockito.Mockito import org.mockito.MockitoAnnotations import org.mockito.kotlin.mock import org.mockito.kotlin.whenever import java.time.Duration import java.util.UUID import io.mockk.verify @OptIn(ExperimentalCoroutinesApi::class) class AppInstallProcessorTest { Loading Loading @@ -370,6 +379,66 @@ class AppInstallProcessorTest { } } @Test fun waitForTaskCompletionOrCancelOnTimeout_returnsTrueWhenWorkSucceeds() = runTest { val workManager = mockk<WorkManager>() val workId = UUID.randomUUID() val workInfo = mockk<WorkInfo>() every { workInfo.state } returns WorkInfo.State.SUCCEEDED every { workManager.getWorkInfoByIdFlow(workId) } returns flowOf(workInfo) val result = appInstallProcessor.waitForTaskCompletionOrCancelOnTimeout( workManager = workManager, timeout = Duration.ofMillis(100), workId = workId ) assertTrue(result) verify(exactly = 0) { workManager.cancelWorkById(workId) } } @Test fun waitForTaskCompletionOrCancelOnTimeout_returnsFalseWhenWorkFailed() = runTest { val workManager = mockk<WorkManager>() val workId = UUID.randomUUID() val workInfo = mockk<WorkInfo>() every { workInfo.state } returns WorkInfo.State.FAILED every { workManager.getWorkInfoByIdFlow(workId) } returns flowOf(workInfo) val result = appInstallProcessor.waitForTaskCompletionOrCancelOnTimeout( workManager = workManager, timeout = Duration.ofMillis(100), workId = workId ) assertEquals(false, result) verify(exactly = 0) { workManager.cancelWorkById(workId) } } @Test fun waitForTaskCompletionOrCancelOnTimeout_cancelsWorkOnTimeout() = runTest { val workManager = mockk<WorkManager>(relaxed = true) val workId = UUID.randomUUID() val workInfo = mockk<WorkInfo>() every { workInfo.state } returns WorkInfo.State.RUNNING every { workManager.getWorkInfoByIdFlow(workId) } returns flow { emit(workInfo) awaitCancellation() } val result = appInstallProcessor.waitForTaskCompletionOrCancelOnTimeout( workManager = workManager, timeout = Duration.ofMillis(1), workId = workId ) assertEquals(false, result) verify { workManager.cancelWorkById(workId) } } private suspend fun runProcessInstall(appInstall: AppInstall): AppInstall? { appInstallProcessor.processInstall(appInstall.id, false) { // _ignored_ Loading Loading
app/src/main/java/foundation/e/apps/install/workmanager/AppInstallProcessor.kt +2 −1 Original line number Diff line number Diff line Loading @@ -162,7 +162,8 @@ class AppInstallProcessor @Inject constructor( } } private suspend fun waitForTaskCompletionOrCancelOnTimeout( @VisibleForTesting suspend fun waitForTaskCompletionOrCancelOnTimeout( workManager: WorkManager = WorkManager.getInstance(context), timeout: Duration = INSTALL_TASK_TIMEOUT, workId: UUID Loading
app/src/test/java/foundation/e/apps/installProcessor/AppInstallProcessorTest.kt +69 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,8 @@ import android.net.ConnectivityManager import android.net.Network import android.net.NetworkCapabilities import androidx.arch.core.executor.testing.InstantTaskExecutorRule import androidx.work.WorkInfo import androidx.work.WorkManager import foundation.e.apps.data.ResultSupreme import foundation.e.apps.data.enums.Status import foundation.e.apps.data.fdroid.FDroidRepository Loading @@ -42,10 +44,14 @@ import foundation.e.apps.utils.StorageComputer import foundation.e.apps.util.MainCoroutineRule import io.mockk.coEvery import io.mockk.coVerify import io.mockk.every import io.mockk.mockk import io.mockk.mockkObject import io.mockk.unmockkObject import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.test.runTest import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue Loading @@ -57,6 +63,9 @@ import org.mockito.Mockito import org.mockito.MockitoAnnotations import org.mockito.kotlin.mock import org.mockito.kotlin.whenever import java.time.Duration import java.util.UUID import io.mockk.verify @OptIn(ExperimentalCoroutinesApi::class) class AppInstallProcessorTest { Loading Loading @@ -370,6 +379,66 @@ class AppInstallProcessorTest { } } @Test fun waitForTaskCompletionOrCancelOnTimeout_returnsTrueWhenWorkSucceeds() = runTest { val workManager = mockk<WorkManager>() val workId = UUID.randomUUID() val workInfo = mockk<WorkInfo>() every { workInfo.state } returns WorkInfo.State.SUCCEEDED every { workManager.getWorkInfoByIdFlow(workId) } returns flowOf(workInfo) val result = appInstallProcessor.waitForTaskCompletionOrCancelOnTimeout( workManager = workManager, timeout = Duration.ofMillis(100), workId = workId ) assertTrue(result) verify(exactly = 0) { workManager.cancelWorkById(workId) } } @Test fun waitForTaskCompletionOrCancelOnTimeout_returnsFalseWhenWorkFailed() = runTest { val workManager = mockk<WorkManager>() val workId = UUID.randomUUID() val workInfo = mockk<WorkInfo>() every { workInfo.state } returns WorkInfo.State.FAILED every { workManager.getWorkInfoByIdFlow(workId) } returns flowOf(workInfo) val result = appInstallProcessor.waitForTaskCompletionOrCancelOnTimeout( workManager = workManager, timeout = Duration.ofMillis(100), workId = workId ) assertEquals(false, result) verify(exactly = 0) { workManager.cancelWorkById(workId) } } @Test fun waitForTaskCompletionOrCancelOnTimeout_cancelsWorkOnTimeout() = runTest { val workManager = mockk<WorkManager>(relaxed = true) val workId = UUID.randomUUID() val workInfo = mockk<WorkInfo>() every { workInfo.state } returns WorkInfo.State.RUNNING every { workManager.getWorkInfoByIdFlow(workId) } returns flow { emit(workInfo) awaitCancellation() } val result = appInstallProcessor.waitForTaskCompletionOrCancelOnTimeout( workManager = workManager, timeout = Duration.ofMillis(1), workId = workId ) assertEquals(false, result) verify { workManager.cancelWorkById(workId) } } private suspend fun runProcessInstall(appInstall: AppInstall): AppInstall? { appInstallProcessor.processInstall(appInstall.id, false) { // _ignored_ Loading