From 9e22030a3f62ebb1149ce4ad7a2d6d96ae732d3d Mon Sep 17 00:00:00 2001 From: Sergejs Luhmirins Date: Mon, 6 Oct 2025 14:55:23 +0300 Subject: [PATCH 1/3] Restore battery optimisation check for the service notification --- .../com/simprints/core/workers/SimCoroutineWorker.kt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/infra/core/src/main/java/com/simprints/core/workers/SimCoroutineWorker.kt b/infra/core/src/main/java/com/simprints/core/workers/SimCoroutineWorker.kt index 1c95968046..1fa629a9a5 100644 --- a/infra/core/src/main/java/com/simprints/core/workers/SimCoroutineWorker.kt +++ b/infra/core/src/main/java/com/simprints/core/workers/SimCoroutineWorker.kt @@ -7,6 +7,7 @@ import android.app.NotificationManager import android.content.Context import android.content.pm.ServiceInfo import android.os.Build +import android.os.PowerManager import androidx.core.app.NotificationCompat import androidx.work.CoroutineWorker import androidx.work.Data @@ -58,6 +59,9 @@ abstract class SimCoroutineWorker( protected suspend fun showProgressNotification() { try { + if (isFollowingBatteryOptimizations(context)) { + return + } setForeground(getForegroundInfo()) } catch (setForegroundException: Throwable) { // Setting foreground (showing the notification) may be restricted by the system @@ -120,6 +124,11 @@ abstract class SimCoroutineWorker( } } + private fun isFollowingBatteryOptimizations(context: Context): Boolean = context + .getSystemService(PowerManager::class.java) + .isIgnoringBatteryOptimizations(context.packageName) + .not() + private companion object { private const val WORKER_FOREGROUND_NOTIFICATION_ID = 2 private const val WORKER_FOREGROUND_NOTIFICATION_CHANNEL_ID = From 7d45c4052d2f5673e4a1165e998a5a80a34874f6 Mon Sep 17 00:00:00 2001 From: Sergejs Luhmirins Date: Mon, 6 Oct 2025 14:57:37 +0300 Subject: [PATCH 2/3] Improve sample upload logging to get more context of upload run --- .../images/remote/firebase/FirebaseSampleUploader.kt | 6 ++++-- .../images/remote/signedurl/SignedUrlSampleUploader.kt | 10 ++++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/infra/images/src/main/java/com/simprints/infra/images/remote/firebase/FirebaseSampleUploader.kt b/infra/images/src/main/java/com/simprints/infra/images/remote/firebase/FirebaseSampleUploader.kt index 82276db1e3..9017636d1b 100644 --- a/infra/images/src/main/java/com/simprints/infra/images/remote/firebase/FirebaseSampleUploader.kt +++ b/infra/images/src/main/java/com/simprints/infra/images/remote/firebase/FirebaseSampleUploader.kt @@ -43,7 +43,7 @@ internal class FirebaseSampleUploader @Inject constructor( } var allImagesUploaded = true - Simber.i("Starting sample upload to Firebase storage") + Simber.i("Starting sample upload to Firebase storage", tag = SAMPLE_UPLOAD) val bucketUrl = configManager.getProject(projectId).imageBucket val rootRef = FirebaseStorage .getInstance(firebaseApp, bucketUrl) @@ -52,6 +52,8 @@ internal class FirebaseSampleUploader @Inject constructor( val urlRequestScope = eventRepository.createEventScope(type = EventScopeType.SAMPLE_UP_SYNC) val sampleReferences = localDataSource.listImages(projectId) + Simber.i("Images to upload ${sampleReferences.size}", tag = SAMPLE_UPLOAD) + sampleReferences.forEachIndexed { index, imageRef -> Simber.i("Reading sample file: ${imageRef.relativePath.parts.last()}", tag = SAMPLE_UPLOAD) @@ -84,7 +86,7 @@ internal class FirebaseSampleUploader @Inject constructor( } } catch (t: Throwable) { allImagesUploaded = false - Simber.e("Failed to upload images", t, tag = SYNC) + Simber.e("Failed to upload images", t, tag = SAMPLE_UPLOAD) } } eventRepository.closeEventScope(urlRequestScope, EventScopeEndCause.WORKFLOW_ENDED) diff --git a/infra/images/src/main/java/com/simprints/infra/images/remote/signedurl/SignedUrlSampleUploader.kt b/infra/images/src/main/java/com/simprints/infra/images/remote/signedurl/SignedUrlSampleUploader.kt index 9bbe229ed6..10649e8e5d 100644 --- a/infra/images/src/main/java/com/simprints/infra/images/remote/signedurl/SignedUrlSampleUploader.kt +++ b/infra/images/src/main/java/com/simprints/infra/images/remote/signedurl/SignedUrlSampleUploader.kt @@ -33,7 +33,7 @@ internal class SignedUrlSampleUploader @Inject constructor( val batchSize = getBatchSize() val urlRequestScope = eventRepository.createEventScope(type = EventScopeType.SAMPLE_UP_SYNC) - Simber.i("Starting image upload in batches of $batchSize (Scope ID: ${urlRequestScope.id}") + Simber.i("Starting image upload in batches of $batchSize (Scope ID: ${urlRequestScope.id})", tag = SAMPLE_UPLOAD) var sampleIndex = 0 var samplesSize = 0 val sampleReferenceBatches = localDataSource @@ -44,6 +44,8 @@ internal class SignedUrlSampleUploader @Inject constructor( // cases where there are large amounts of files and the coroutine is being interrupted, // even if the result is that some requested batches are not at max size. .chunked(batchSize) + Simber.i("Images to upload: $samplesSize", tag = SAMPLE_UPLOAD) + for (batch in sampleReferenceBatches) { if (!coroutineContext.isActive) { // Do not process next batch if coroutine is being cancelled @@ -73,7 +75,7 @@ internal class SignedUrlSampleUploader @Inject constructor( // Fetch upload urls for each image val sampleIdToUrlMap = fetchUploadUrlsPerSample(projectId, batchUploadData) - Simber.i("${sampleIdToUrlMap.size} signed URLs fetched") + Simber.i("${sampleIdToUrlMap.size} signed URLs fetched", tag = SAMPLE_UPLOAD) for (sample in batchUploadData) { if (!coroutineContext.isActive) { @@ -81,7 +83,7 @@ internal class SignedUrlSampleUploader @Inject constructor( allImagesUploaded = false break } - Simber.i("Uploading ${sample.sampleId}") + Simber.i("Uploading ${sample.sampleId}", tag = SAMPLE_UPLOAD) progressCallback?.invoke(sampleIndex++, samplesSize) val url = sampleIdToUrlMap[sample.sampleId] @@ -96,7 +98,7 @@ internal class SignedUrlSampleUploader @Inject constructor( if (success) { localDataSource.deleteImage(sample.imageRef) metadataStore.deleteMetadata(sample.imageRef.relativePath) - Simber.i("Uploaded ${sample.sampleId} successfully") + Simber.i("Uploaded ${sample.sampleId} successfully", tag = SAMPLE_UPLOAD) } else { allImagesUploaded = false } From 47aeb87926de56871d8edf4f00e937f51b4a945e Mon Sep 17 00:00:00 2001 From: Sergejs Luhmirins Date: Mon, 6 Oct 2025 15:24:22 +0300 Subject: [PATCH 3/3] Fix worker tests --- ...serLocationIntoCurrentSessionWorkerTest.kt | 7 ++++++- .../RealmToRoomMigrationWorkerTest.kt | 6 ++++++ .../CommCareEventSyncDownloaderWorkerTest.kt | 17 +++++++++-------- ...printsEventDownSyncDownloaderWorkerTest.kt | 7 ++++++- .../master/EventEndSyncReporterWorkerTest.kt | 14 ++++++++------ .../EventStartSyncReporterWorkerTest.kt | 7 ++++++- .../sync/master/EventSyncMasterWorkerTest.kt | 11 ++++++++--- .../workers/EventUpSyncUploaderWorkerTest.kt | 17 +++++++++-------- .../worker/DeviceConfigDownSyncWorkerTest.kt | 8 +++++++- .../worker/ProjectConfigDownSyncWorkerTest.kt | 7 ++++++- .../enrolments/EnrolmentRecordWorkerTest.kt | 7 ++++++- .../infra/sync/files/FileUpSyncWorkerTest.kt | 19 +++++++++++++------ .../firmware/FirmwareFileUpdateWorkerTest.kt | 8 +++++++- 13 files changed, 97 insertions(+), 38 deletions(-) diff --git a/feature/setup/src/test/java/com/simprints/feature/setup/location/StoreUserLocationIntoCurrentSessionWorkerTest.kt b/feature/setup/src/test/java/com/simprints/feature/setup/location/StoreUserLocationIntoCurrentSessionWorkerTest.kt index 3178bcf052..6a0f9dc67f 100644 --- a/feature/setup/src/test/java/com/simprints/feature/setup/location/StoreUserLocationIntoCurrentSessionWorkerTest.kt +++ b/feature/setup/src/test/java/com/simprints/feature/setup/location/StoreUserLocationIntoCurrentSessionWorkerTest.kt @@ -1,5 +1,6 @@ package com.simprints.feature.setup.location +import android.os.PowerManager import com.simprints.infra.events.sampledata.createSessionScope import com.simprints.infra.events.session.SessionEventRepository import com.simprints.testtools.common.coroutines.TestCoroutineRule @@ -33,7 +34,11 @@ internal class StoreUserLocationIntoCurrentSessionWorkerTest { coEvery { eventRepository.getCurrentSessionScope() } returns createSessionScope() worker = StoreUserLocationIntoCurrentSessionWorker( - mockk(relaxed = true), + mockk(relaxed = true) { + every { getSystemService(any()) } returns mockk { + every { isIgnoringBatteryOptimizations(any()) } returns true + } + }, mockk(relaxed = true), eventRepository, locationManager, diff --git a/infra/enrolment-records/repository/src/test/java/com/simprints/infra/enrolment/records/repository/local/migration/RealmToRoomMigrationWorkerTest.kt b/infra/enrolment-records/repository/src/test/java/com/simprints/infra/enrolment/records/repository/local/migration/RealmToRoomMigrationWorkerTest.kt index cf34308977..c9d4160ef6 100644 --- a/infra/enrolment-records/repository/src/test/java/com/simprints/infra/enrolment/records/repository/local/migration/RealmToRoomMigrationWorkerTest.kt +++ b/infra/enrolment-records/repository/src/test/java/com/simprints/infra/enrolment/records/repository/local/migration/RealmToRoomMigrationWorkerTest.kt @@ -1,6 +1,7 @@ package com.simprints.infra.enrolment.records.repository.local.migration import android.content.Context +import android.os.PowerManager import androidx.work.ListenableWorker.Result import androidx.work.WorkerParameters import com.google.common.truth.Truth.assertThat @@ -13,6 +14,7 @@ import io.mockk.MockKAnnotations import io.mockk.Runs import io.mockk.coEvery import io.mockk.coVerify +import io.mockk.every import io.mockk.impl.annotations.InjectMockKs import io.mockk.impl.annotations.MockK import io.mockk.just @@ -53,6 +55,10 @@ class RealmToRoomMigrationWorkerTest { @Before fun setUp() { MockKAnnotations.init(this) + + every { appContext.getSystemService(any()) } returns mockk { + every { isIgnoringBatteryOptimizations(any()) } returns true + } } @Test diff --git a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/workers/CommCareEventSyncDownloaderWorkerTest.kt b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/workers/CommCareEventSyncDownloaderWorkerTest.kt index fbdc370549..48c3ef4bb3 100644 --- a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/workers/CommCareEventSyncDownloaderWorkerTest.kt +++ b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/workers/CommCareEventSyncDownloaderWorkerTest.kt @@ -1,12 +1,13 @@ package com.simprints.infra.eventsync.sync.down.workers -import androidx.test.ext.junit.runners.AndroidJUnit4 +import android.os.PowerManager +import androidx.test.ext.junit.runners.* import androidx.work.ListenableWorker import androidx.work.WorkInfo import androidx.work.WorkInfo.State.RUNNING import androidx.work.WorkInfo.State.SUCCEEDED import androidx.work.workDataOf -import com.google.common.truth.Truth.assertThat +import com.google.common.truth.Truth.* import com.simprints.core.tools.json.JsonHelper import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.enrolment.records.repository.local.migration.RealmToRoomMigrationFlagsStore @@ -22,12 +23,8 @@ import com.simprints.infra.eventsync.sync.down.workers.BaseEventDownSyncDownload import com.simprints.infra.eventsync.sync.down.workers.BaseEventDownSyncDownloaderWorker.Companion.OUTPUT_DOWN_SYNC import com.simprints.infra.eventsync.sync.down.workers.BaseEventDownSyncDownloaderWorker.Companion.PROGRESS_DOWN_SYNC import com.simprints.testtools.common.coroutines.TestCoroutineRule -import io.mockk.MockKAnnotations -import io.mockk.coEvery -import io.mockk.coVerify -import io.mockk.every +import io.mockk.* import io.mockk.impl.annotations.MockK -import io.mockk.mockk import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Rule @@ -68,7 +65,11 @@ internal class CommCareEventSyncDownloaderWorkerTest { MockKAnnotations.init(this, relaxed = true) eventDownSyncDownloaderWorker = CommCareEventSyncDownloaderWorker( - mockk(relaxed = true), + mockk(relaxed = true) { + every { getSystemService(any()) } returns mockk { + every { isIgnoringBatteryOptimizations(any()) } returns true + } + }, mockk(relaxed = true) { every { inputData } returns workDataOf( INPUT_DOWN_SYNC_OPS to JsonHelper.toJson(projectDownSyncScope.operations.first()), diff --git a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/workers/SimprintsEventDownSyncDownloaderWorkerTest.kt b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/workers/SimprintsEventDownSyncDownloaderWorkerTest.kt index d56304da6d..ad960f1cf8 100644 --- a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/workers/SimprintsEventDownSyncDownloaderWorkerTest.kt +++ b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/workers/SimprintsEventDownSyncDownloaderWorkerTest.kt @@ -1,5 +1,6 @@ package com.simprints.infra.eventsync.sync.down.workers +import android.os.PowerManager import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.work.ListenableWorker import androidx.work.WorkInfo @@ -75,7 +76,11 @@ internal class SimprintsEventDownSyncDownloaderWorkerTest { MockKAnnotations.init(this, relaxed = true) eventDownSyncDownloaderWorker = SimprintsEventDownSyncDownloaderWorker( - mockk(relaxed = true), + mockk(relaxed = true) { + every { getSystemService(any()) } returns mockk { + every { isIgnoringBatteryOptimizations(any()) } returns true + } + }, mockk(relaxed = true) { every { inputData } returns workDataOf( INPUT_DOWN_SYNC_OPS to JsonHelper.toJson(projectDownSyncScope.operations.first()), diff --git a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/master/EventEndSyncReporterWorkerTest.kt b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/master/EventEndSyncReporterWorkerTest.kt index 6d1e6b2479..518be080d7 100644 --- a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/master/EventEndSyncReporterWorkerTest.kt +++ b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/master/EventEndSyncReporterWorkerTest.kt @@ -1,8 +1,9 @@ package com.simprints.infra.eventsync.sync.master +import android.os.PowerManager import androidx.work.ListenableWorker import androidx.work.workDataOf -import com.google.common.truth.Truth.assertThat +import com.google.common.truth.Truth.* import com.simprints.core.tools.time.TimeHelper import com.simprints.core.tools.time.Timestamp import com.simprints.infra.events.EventRepository @@ -10,11 +11,8 @@ import com.simprints.infra.eventsync.sync.common.EventSyncCache import com.simprints.infra.eventsync.sync.master.EventEndSyncReporterWorker.Companion.EVENT_DOWN_SYNC_SCOPE_TO_CLOSE import com.simprints.infra.eventsync.sync.master.EventEndSyncReporterWorker.Companion.SYNC_ID_TO_MARK_AS_COMPLETED import com.simprints.testtools.common.coroutines.TestCoroutineRule -import io.mockk.MockKAnnotations -import io.mockk.coVerify -import io.mockk.every +import io.mockk.* import io.mockk.impl.annotations.MockK -import io.mockk.mockk import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Rule @@ -89,7 +87,11 @@ internal class EventEndSyncReporterWorkerTest { downScopeId: String?, upScopeId: String?, ) = EventEndSyncReporterWorker( - mockk(relaxed = true), + mockk(relaxed = true) { + every { getSystemService(any()) } returns mockk { + every { isIgnoringBatteryOptimizations(any()) } returns true + } + }, mockk(relaxed = true) { every { inputData } returns workDataOf( SYNC_ID_TO_MARK_AS_COMPLETED to syncId, diff --git a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/master/EventStartSyncReporterWorkerTest.kt b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/master/EventStartSyncReporterWorkerTest.kt index 7d273b5632..59c2f8674b 100644 --- a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/master/EventStartSyncReporterWorkerTest.kt +++ b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/master/EventStartSyncReporterWorkerTest.kt @@ -1,5 +1,6 @@ package com.simprints.infra.eventsync.sync.master +import android.os.PowerManager import androidx.work.ListenableWorker import androidx.work.workDataOf import com.google.common.truth.Truth.assertThat @@ -20,7 +21,11 @@ class EventStartSyncReporterWorkerTest { val testCoroutineRule = TestCoroutineRule() private val startSyncReportWorker = EventStartSyncReporterWorker( - mockk(relaxed = true), + mockk(relaxed = true) { + every { getSystemService(any()) } returns mockk { + every { isIgnoringBatteryOptimizations(any()) } returns true + } + }, mockk(relaxed = true) { every { inputData } returns INPUT_DATA }, diff --git a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/master/EventSyncMasterWorkerTest.kt b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/master/EventSyncMasterWorkerTest.kt index bb2b1b5c3d..cdf71375df 100644 --- a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/master/EventSyncMasterWorkerTest.kt +++ b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/master/EventSyncMasterWorkerTest.kt @@ -1,6 +1,7 @@ package com.simprints.infra.eventsync.sync.master import android.content.Context +import android.os.PowerManager import androidx.test.core.app.ApplicationProvider.* import androidx.test.ext.junit.runners.* import androidx.work.Configuration @@ -163,8 +164,9 @@ internal class EventSyncMasterWorkerTest { dispatcher = testCoroutineRule.testCoroutineDispatcher, securityManager = securityManager, eventRepository = eventRepository, - ) + ), ) + coEvery { masterWorker["showProgressNotification"]() } returns Unit } @@ -383,8 +385,11 @@ internal class EventSyncMasterWorkerTest { private fun canDownSyncFromCommCare(should: Boolean) { every { synchronizationConfiguration.down.simprints } returns null every { synchronizationConfiguration.down.commCare } returns - if (should) DownSynchronizationConfiguration.CommCareDownSynchronizationConfiguration - else null + if (should) { + DownSynchronizationConfiguration.CommCareDownSynchronizationConfiguration + } else { + null + } } private fun canUpSync(should: Boolean) { diff --git a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/up/workers/EventUpSyncUploaderWorkerTest.kt b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/up/workers/EventUpSyncUploaderWorkerTest.kt index ae452479ba..0f29d6813a 100644 --- a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/up/workers/EventUpSyncUploaderWorkerTest.kt +++ b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/up/workers/EventUpSyncUploaderWorkerTest.kt @@ -1,14 +1,15 @@ package com.simprints.infra.eventsync.sync.up.workers import android.content.Context +import android.os.PowerManager import androidx.arch.core.executor.testing.InstantTaskExecutorRule -import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.ext.junit.runners.* import androidx.work.ListenableWorker import androidx.work.WorkerFactory import androidx.work.WorkerParameters import androidx.work.testing.TestListenableWorkerBuilder import androidx.work.workDataOf -import com.google.common.truth.Truth.assertThat +import com.google.common.truth.Truth.* import com.simprints.core.tools.json.JsonHelper import com.simprints.infra.authstore.AuthStore import com.simprints.infra.authstore.exceptions.RemoteDbNotSignedInException @@ -28,12 +29,8 @@ import com.simprints.infra.eventsync.sync.up.workers.EventUpSyncUploaderWorker.C import com.simprints.infra.network.exceptions.BackendMaintenanceException import com.simprints.infra.network.exceptions.SyncCloudIntegrationException import com.simprints.testtools.common.coroutines.TestCoroutineRule -import io.mockk.MockKAnnotations -import io.mockk.coEvery -import io.mockk.coVerify -import io.mockk.every +import io.mockk.* import io.mockk.impl.annotations.MockK -import io.mockk.mockk import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.test.runTest @@ -255,7 +252,11 @@ internal class EventUpSyncUploaderWorkerTest { scope: String?, eventScopeId: String? = "scopeId", ): EventUpSyncUploaderWorker = TestListenableWorkerBuilder( - mockk(), + mockk(relaxed = true) { + every { getSystemService(any()) } returns mockk { + every { isIgnoringBatteryOptimizations(any()) } returns true + } + }, workDataOf( INPUT_UP_SYNC to scope, INPUT_EVENT_UP_SYNC_SCOPE_ID to eventScopeId, diff --git a/infra/sync/src/test/java/com/simprints/infra/sync/config/worker/DeviceConfigDownSyncWorkerTest.kt b/infra/sync/src/test/java/com/simprints/infra/sync/config/worker/DeviceConfigDownSyncWorkerTest.kt index 434b61f6c3..46fb5f60df 100644 --- a/infra/sync/src/test/java/com/simprints/infra/sync/config/worker/DeviceConfigDownSyncWorkerTest.kt +++ b/infra/sync/src/test/java/com/simprints/infra/sync/config/worker/DeviceConfigDownSyncWorkerTest.kt @@ -1,5 +1,6 @@ package com.simprints.infra.sync.config.worker +import android.os.PowerManager import androidx.work.ListenableWorker import com.google.common.truth.Truth.assertThat import com.simprints.infra.config.store.models.DeviceState @@ -11,6 +12,7 @@ import com.simprints.testtools.common.coroutines.TestCoroutineRule import io.mockk.MockKAnnotations import io.mockk.coEvery import io.mockk.coVerify +import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.mockk import io.mockk.verify @@ -39,7 +41,11 @@ class DeviceConfigDownSyncWorkerTest { MockKAnnotations.init(this, relaxed = true) deviceConfigWorker = DeviceConfigDownSyncWorker( - context = mockk(), + context = mockk(relaxed = true) { + every { getSystemService(any()) } returns mockk { + every { isIgnoringBatteryOptimizations(any()) } returns true + } + }, params = mockk(relaxed = true), configManager = configManager, logoutUseCase = logoutUseCase, diff --git a/infra/sync/src/test/java/com/simprints/infra/sync/config/worker/ProjectConfigDownSyncWorkerTest.kt b/infra/sync/src/test/java/com/simprints/infra/sync/config/worker/ProjectConfigDownSyncWorkerTest.kt index 5f6b048477..81c5f6ac1d 100644 --- a/infra/sync/src/test/java/com/simprints/infra/sync/config/worker/ProjectConfigDownSyncWorkerTest.kt +++ b/infra/sync/src/test/java/com/simprints/infra/sync/config/worker/ProjectConfigDownSyncWorkerTest.kt @@ -1,5 +1,6 @@ package com.simprints.infra.sync.config.worker +import android.os.PowerManager import androidx.work.ListenableWorker import com.google.common.truth.Truth.assertThat import com.simprints.infra.authstore.AuthStore @@ -48,7 +49,11 @@ class ProjectConfigDownSyncWorkerTest { MockKAnnotations.init(this, relaxed = true) projectConfigDownSyncWorker = ProjectConfigDownSyncWorker( - context = mockk(), + context = mockk(relaxed = true) { + every { getSystemService(any()) } returns mockk { + every { isIgnoringBatteryOptimizations(any()) } returns true + } + }, params = mockk(relaxed = true), authStore = authStore, configManager = configManager, diff --git a/infra/sync/src/test/java/com/simprints/infra/sync/enrolments/EnrolmentRecordWorkerTest.kt b/infra/sync/src/test/java/com/simprints/infra/sync/enrolments/EnrolmentRecordWorkerTest.kt index c9a47c6558..6936f2922c 100644 --- a/infra/sync/src/test/java/com/simprints/infra/sync/enrolments/EnrolmentRecordWorkerTest.kt +++ b/infra/sync/src/test/java/com/simprints/infra/sync/enrolments/EnrolmentRecordWorkerTest.kt @@ -1,5 +1,6 @@ package com.simprints.infra.sync.enrolments +import android.os.PowerManager import androidx.work.WorkerParameters import androidx.work.workDataOf import com.google.common.truth.Truth.assertThat @@ -31,7 +32,11 @@ class EnrolmentRecordWorkerTest { ) } private val worker = EnrolmentRecordWorker( - mockk(relaxed = true), + mockk(relaxed = true) { + every { getSystemService(any()) } returns mockk { + every { isIgnoringBatteryOptimizations(any()) } returns true + } + }, params, repository, configManager, diff --git a/infra/sync/src/test/java/com/simprints/infra/sync/files/FileUpSyncWorkerTest.kt b/infra/sync/src/test/java/com/simprints/infra/sync/files/FileUpSyncWorkerTest.kt index bc7ae66401..f6a66c7a0b 100644 --- a/infra/sync/src/test/java/com/simprints/infra/sync/files/FileUpSyncWorkerTest.kt +++ b/infra/sync/src/test/java/com/simprints/infra/sync/files/FileUpSyncWorkerTest.kt @@ -1,5 +1,6 @@ package com.simprints.infra.sync.files +import android.os.PowerManager import androidx.work.ListenableWorker.Result import com.google.common.truth.Truth import com.simprints.fingerprint.infra.imagedistortionconfig.ImageDistortionConfigRepo @@ -46,7 +47,11 @@ class FileUpSyncWorkerTest { every { authStore.signedInProjectId } returns PROJECT_ID fileUpSyncWorker = FileUpSyncWorker( - mockk(relaxed = true), + mockk(relaxed = true) { + every { getSystemService(any()) } returns mockk { + every { isIgnoringBatteryOptimizations(any()) } returns true + } + }, mockk(relaxed = true), imageRepository, imageDistortionConfigRepo, @@ -162,10 +167,12 @@ class FileUpSyncWorkerTest { // Then coVerify(exactly = 1) { imageRepository.uploadStoredImagesAndDelete(PROJECT_ID, any()) } - Truth.assertThat(progressValues).containsExactly( - 2 to 10, - 5 to 10, - 10 to 10, - ).inOrder() + Truth + .assertThat(progressValues) + .containsExactly( + 2 to 10, + 5 to 10, + 10 to 10, + ).inOrder() } } diff --git a/infra/sync/src/test/java/com/simprints/infra/sync/firmware/FirmwareFileUpdateWorkerTest.kt b/infra/sync/src/test/java/com/simprints/infra/sync/firmware/FirmwareFileUpdateWorkerTest.kt index ff589eb701..1ce795a329 100644 --- a/infra/sync/src/test/java/com/simprints/infra/sync/firmware/FirmwareFileUpdateWorkerTest.kt +++ b/infra/sync/src/test/java/com/simprints/infra/sync/firmware/FirmwareFileUpdateWorkerTest.kt @@ -1,5 +1,6 @@ package com.simprints.infra.sync.firmware +import android.os.PowerManager import androidx.work.ListenableWorker.Result.Retry import androidx.work.ListenableWorker.Result.Success import com.google.common.truth.Truth.assertThat @@ -8,6 +9,7 @@ import com.simprints.testtools.common.coroutines.TestCoroutineRule import io.mockk.MockKAnnotations import io.mockk.coEvery import io.mockk.coJustRun +import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.mockk import kotlinx.coroutines.test.runTest @@ -30,7 +32,11 @@ class FirmwareFileUpdateWorkerTest { MockKAnnotations.init(this, relaxed = true) worker = FirmwareFileUpdateWorker( - mockk(relaxed = true), + mockk(relaxed = true) { + every { getSystemService(any()) } returns mockk { + every { isIgnoringBatteryOptimizations(any()) } returns true + } + }, mockk(relaxed = true), firmwareRepository, testCoroutineRule.testCoroutineDispatcher,