RefreshCollectionsWorkerTest: wait for completion of enqueue (bitfireAT/davx5#486)

* RefreshCollectionsWorkerTest: wait for completion of enqueue

* Work may have finished already
This commit is contained in:
Ricki Hirner 2023-12-04 15:32:33 +01:00
parent 787e1a687f
commit 1854822757
No known key found for this signature in database
GPG key ID: 79A019FCAAEDD3AA
2 changed files with 19 additions and 18 deletions

View file

@ -11,9 +11,10 @@ import androidx.hilt.work.HiltWorkerFactory
import androidx.test.platform.app.InstrumentationRegistry
import androidx.work.Configuration
import androidx.work.WorkManager
import androidx.work.await
import androidx.work.testing.WorkManagerTestInitHelper
import at.bitfire.davdroid.network.HttpClient
import at.bitfire.davdroid.TestUtils.workScheduledOrRunning
import at.bitfire.davdroid.TestUtils.workScheduledOrRunningOrSuccessful
import at.bitfire.davdroid.db.AppDatabase
import at.bitfire.davdroid.db.Collection
import at.bitfire.davdroid.db.Credentials
@ -21,6 +22,7 @@ import at.bitfire.davdroid.db.HomeSet
import at.bitfire.davdroid.db.Principal
import at.bitfire.davdroid.db.Service
import at.bitfire.davdroid.log.Logger
import at.bitfire.davdroid.network.HttpClient
import at.bitfire.davdroid.settings.Settings
import at.bitfire.davdroid.settings.SettingsManager
import at.bitfire.davdroid.ui.NotificationUtils
@ -29,6 +31,7 @@ import dagger.hilt.android.testing.HiltAndroidRule
import dagger.hilt.android.testing.HiltAndroidTest
import io.mockk.every
import io.mockk.mockk
import kotlinx.coroutines.runBlocking
import okhttp3.mockwebserver.Dispatcher
import okhttp3.mockwebserver.MockResponse
import okhttp3.mockwebserver.MockWebServer
@ -128,18 +131,10 @@ class RefreshCollectionsWorkerTest {
@Test
fun testRefreshCollections_enqueuesWorker() {
val service = createTestService(Service.TYPE_CALDAV)!!
val workerName = RefreshCollectionsWorker.enqueue(context, service.id)
assertTrue(workScheduledOrRunning(context, workerName))
}
@Test
fun testOnStopped_stopsRefreshThread() {
val service = createTestService(Service.TYPE_CALDAV)!!
val workerName = RefreshCollectionsWorker.enqueue(context, service.id)
WorkManager.getInstance(context).cancelUniqueWork(workerName)
assertFalse(workScheduledOrRunning(context, workerName))
// here we should test whether stopping the work really interrupts the refresh thread
val (workerName, enqueueOp) = RefreshCollectionsWorker.enqueue(context, service.id)
enqueueOp.result.get()
assertTrue(workScheduledOrRunningOrSuccessful(context, workerName))
}
@Test

View file

@ -17,6 +17,7 @@ import androidx.work.Data
import androidx.work.ExistingWorkPolicy
import androidx.work.ForegroundInfo
import androidx.work.OneTimeWorkRequestBuilder
import androidx.work.Operation
import androidx.work.OutOfQuotaPolicy
import androidx.work.WorkInfo
import androidx.work.WorkManager
@ -127,11 +128,14 @@ class RefreshCollectionsWorker @AssistedInject constructor(
* a [RefreshCollectionsWorker].
*
* @param serviceId serviceId which is to be refreshed
* @return workerName name of the worker started
* @return Pair with
*
* 1. worker name,
* 2. operation of [WorkManager.enqueueUniqueWork] (can be used to wait for completion)
*
* @throws IllegalArgumentException when there's no service with this ID
*/
fun enqueue(context: Context, serviceId: Long): String {
fun enqueue(context: Context, serviceId: Long): Pair<String, Operation> {
val name = workerName(serviceId)
val arguments = Data.Builder()
.putLong(ARG_SERVICE_ID, serviceId)
@ -142,12 +146,14 @@ class RefreshCollectionsWorker @AssistedInject constructor(
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
.build()
WorkManager.getInstance(context).enqueueUniqueWork(
return Pair(
name,
ExistingWorkPolicy.KEEP, // if refresh is already running, just continue that one
workRequest
WorkManager.getInstance(context).enqueueUniqueWork(
name,
ExistingWorkPolicy.KEEP, // if refresh is already running, just continue that one
workRequest
)
)
return name
}
/**