Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -33,7 +34,11 @@ internal class StoreUserLocationIntoCurrentSessionWorkerTest {
coEvery { eventRepository.getCurrentSessionScope() } returns createSessionScope()

worker = StoreUserLocationIntoCurrentSessionWorker(
mockk(relaxed = true),
mockk(relaxed = true) {
every { getSystemService<PowerManager>(any()) } returns mockk {
every { isIgnoringBatteryOptimizations(any()) } returns true
}
},
mockk(relaxed = true),
eventRepository,
locationManager,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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 =
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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
Expand Down Expand Up @@ -53,6 +55,10 @@ class RealmToRoomMigrationWorkerTest {
@Before
fun setUp() {
MockKAnnotations.init(this)

every { appContext.getSystemService<PowerManager>(any()) } returns mockk {
every { isIgnoringBatteryOptimizations(any()) } returns true
}
}

@Test
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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
Expand Down Expand Up @@ -68,7 +65,11 @@ internal class CommCareEventSyncDownloaderWorkerTest {
MockKAnnotations.init(this, relaxed = true)

eventDownSyncDownloaderWorker = CommCareEventSyncDownloaderWorker(
mockk(relaxed = true),
mockk(relaxed = true) {
every { getSystemService<PowerManager>(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()),
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -75,7 +76,11 @@ internal class SimprintsEventDownSyncDownloaderWorkerTest {
MockKAnnotations.init(this, relaxed = true)

eventDownSyncDownloaderWorker = SimprintsEventDownSyncDownloaderWorker(
mockk(relaxed = true),
mockk(relaxed = true) {
every { getSystemService<PowerManager>(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()),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,18 @@
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
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
Expand Down Expand Up @@ -89,7 +87,11 @@ internal class EventEndSyncReporterWorkerTest {
downScopeId: String?,
upScopeId: String?,
) = EventEndSyncReporterWorker(
mockk(relaxed = true),
mockk(relaxed = true) {
every { getSystemService<PowerManager>(any()) } returns mockk {
every { isIgnoringBatteryOptimizations(any()) } returns true
}
},
mockk(relaxed = true) {
every { inputData } returns workDataOf(
SYNC_ID_TO_MARK_AS_COMPLETED to syncId,
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -20,7 +21,11 @@ class EventStartSyncReporterWorkerTest {
val testCoroutineRule = TestCoroutineRule()

private val startSyncReportWorker = EventStartSyncReporterWorker(
mockk(relaxed = true),
mockk(relaxed = true) {
every { getSystemService<PowerManager>(any()) } returns mockk {
every { isIgnoringBatteryOptimizations(any()) } returns true
}
},
mockk(relaxed = true) {
every { inputData } returns INPUT_DATA
},
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -163,8 +164,9 @@ internal class EventSyncMasterWorkerTest {
dispatcher = testCoroutineRule.testCoroutineDispatcher,
securityManager = securityManager,
eventRepository = eventRepository,
)
),
)

coEvery { masterWorker["showProgressNotification"]() } returns Unit
}

Expand Down Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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
Expand Down Expand Up @@ -255,7 +252,11 @@ internal class EventUpSyncUploaderWorkerTest {
scope: String?,
eventScopeId: String? = "scopeId",
): EventUpSyncUploaderWorker = TestListenableWorkerBuilder<EventUpSyncUploaderWorker>(
mockk(),
mockk(relaxed = true) {
every { getSystemService<PowerManager>(any()) } returns mockk {
every { isIgnoringBatteryOptimizations(any()) } returns true
}
},
workDataOf(
INPUT_UP_SYNC to scope,
INPUT_EVENT_UP_SYNC_SCOPE_ID to eventScopeId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)

Expand Down Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -73,15 +75,15 @@ 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) {
// Do not upload next image if coroutine is being cancelled
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]
Expand All @@ -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
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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
Expand Down Expand Up @@ -39,7 +41,11 @@ class DeviceConfigDownSyncWorkerTest {
MockKAnnotations.init(this, relaxed = true)

deviceConfigWorker = DeviceConfigDownSyncWorker(
context = mockk(),
context = mockk(relaxed = true) {
every { getSystemService<PowerManager>(any()) } returns mockk {
every { isIgnoringBatteryOptimizations(any()) } returns true
}
},
params = mockk(relaxed = true),
configManager = configManager,
logoutUseCase = logoutUseCase,
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -48,7 +49,11 @@ class ProjectConfigDownSyncWorkerTest {
MockKAnnotations.init(this, relaxed = true)

projectConfigDownSyncWorker = ProjectConfigDownSyncWorker(
context = mockk(),
context = mockk(relaxed = true) {
every { getSystemService<PowerManager>(any()) } returns mockk {
every { isIgnoringBatteryOptimizations(any()) } returns true
}
},
params = mockk(relaxed = true),
authStore = authStore,
configManager = configManager,
Expand Down
Loading