Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit 18548227 authored by Ricki Hirner's avatar Ricki Hirner
Browse files

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

* RefreshCollectionsWorkerTest: wait for completion of enqueue

* Work may have finished already
parent 787e1a68
Loading
Loading
Loading
Loading
+7 −12
Original line number Diff line number Diff line
@@ -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
+12 −6
Original line number Diff line number Diff line
@@ -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()

            return Pair(
                name,
                WorkManager.getInstance(context).enqueueUniqueWork(
                    name,
                    ExistingWorkPolicy.KEEP,    // if refresh is already running, just continue that one
                    workRequest
                )
            return name
            )
        }

        /**