Skip to content
This repository has been archived by the owner on Jun 20, 2023. It is now read-only.

Commit

Permalink
Converted risk level transaction to task (EXPOSUREAPP-2842) (#1412)
Browse files Browse the repository at this point in the history
* converted risk level transaction to task

* simplified

* fixed config: timeout is now duration

* less is more

* arrangement + empty lines

* Added additional checks to notification of exposure/test-result to check for finished submission

Signed-off-by: Kolya Opahle <k.opahle@sap.com>

* submit risk level task requests

* - unreachable catch blocks

* housekeeping

* satisfied ktlint + detekt

* fixed flow: isRefreshing

* fixed flavour for testers

* refactored benchmark

* fixed package declaration

* unit tests

* fixed injection

* fixed tests

* comments from PR

* fixed injection

* fixed lint issues

* fixed another merge conflict

* - unused class

* map task factory

* fulfilled comment style wishes

* fixed tests suspended by changes from develop branch

* Update Corona-Warn-App/src/main/java/de/rki/coronawarnapp/risk/DefaultRiskLevels.kt

#1412 (comment)

Co-authored-by: Kolya Opahle <k.opahle@sap.com>

* changes from PR

* fixed a test

* show logs, ktlint issues

* made log tag non-nullable

* improvements from reviewers

* reduced static access

* Saint Pipeline, please give me the green light

* toString()

* ktlint + di

* fixed test

Co-authored-by: Kolya Opahle <k.opahle@sap.com>
Co-authored-by: harambasicluka <64483219+harambasicluka@users.noreply.github.com>
  • Loading branch information
3 people committed Nov 2, 2020
1 parent 5ddf30f commit 46aaaf1
Show file tree
Hide file tree
Showing 27 changed files with 638 additions and 1,488 deletions.
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
package de.rki.coronawarnapp
package de.rki.coronawarnapp.test

import android.content.Context
import android.text.format.Formatter
import de.rki.coronawarnapp.exception.ExceptionCategory
import de.rki.coronawarnapp.exception.TransactionException
import de.rki.coronawarnapp.exception.reporting.report
import de.rki.coronawarnapp.risk.RiskLevelTask
import de.rki.coronawarnapp.task.Task
import de.rki.coronawarnapp.task.common.DefaultTaskRequest
import de.rki.coronawarnapp.transaction.RetrieveDiagnosisKeysTransaction
import de.rki.coronawarnapp.transaction.RiskLevelTransaction
import de.rki.coronawarnapp.util.di.AppInjector
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.map
import timber.log.Timber
import kotlin.system.measureTimeMillis
import java.util.UUID

class RiskLevelAndKeyRetrievalBenchmark(
private val context: Context,
Expand All @@ -29,7 +33,7 @@ class RiskLevelAndKeyRetrievalBenchmark(
*/
suspend fun start(
callCount: Int,
callback: (resultInfo: String) -> Unit
onBenchmarkCompletedListener: OnBenchmarkCompletedListener
) {

var resultInfo = StringBuilder()
Expand All @@ -40,7 +44,7 @@ class RiskLevelAndKeyRetrievalBenchmark(
.append("Result: \n\n")
.append("#\t Combined \t Download \t Sub \t Risk \t File # \t F. size\n")

callback(resultInfo.toString())
onBenchmarkCompletedListener(resultInfo.toString())

repeat(callCount) { index ->

Expand Down Expand Up @@ -70,45 +74,58 @@ class RiskLevelAndKeyRetrievalBenchmark(
var calculationDuration: Long = -1
var calculationError = ""

try {
calculationDuration = measureKeyCalculation("#$index")
} catch (e: TransactionException) {
calculationError = e.message.toString()
}
measureKeyCalculation("#$index") {
if (it != null) calculationDuration = it

// build result entry for current iteration with all gathered data
resultInfo.append(
"${index + 1}. \t ${calculationDuration + keyFileDownloadDuration + apiSubmissionDuration} ms \t " +
// build result entry for current iteration with all gathered data
resultInfo.append(
"${index + 1}. \t ${calculationDuration + keyFileDownloadDuration + apiSubmissionDuration} ms \t " +
"$keyFileDownloadDuration ms " + "\t $apiSubmissionDuration ms" +
"\t $calculationDuration ms \t $keyFileCount \t " +
"${Formatter.formatFileSize(context, keyFilesSize)}\n"
)
)

if (keyRetrievalError.isNotEmpty()) {
resultInfo.append("Key Retrieval Error: $keyRetrievalError\n")
}
if (keyRetrievalError.isNotEmpty()) {
resultInfo.append("Key Retrieval Error: $keyRetrievalError\n")
}

if (calculationError.isNotEmpty()) {
resultInfo.append("Calculation Error: $calculationError\n")
}
if (calculationError.isNotEmpty()) {
resultInfo.append("Calculation Error: $calculationError\n")
}

callback(resultInfo.toString())
onBenchmarkCompletedListener(resultInfo.toString())
}
}
}

private suspend fun measureKeyCalculation(label: String): Long {
try {
Timber.v("MEASURE [Risk Level Calculation] $label started")
// start risk level calculation and get duration
return measureTimeMillis {
RiskLevelTransaction.start()
}.also {
Timber.v("MEASURE [Risk Level Calculation] $label finished")
private suspend fun measureKeyCalculation(label: String, callback: (Long?) -> Unit) {
val uuid = UUID.randomUUID()
val t0 = System.currentTimeMillis()
AppInjector.component.taskController.tasks
.map {
it
.map { taskInfo -> taskInfo.taskState }
.filter { taskState -> taskState.request.id == uuid && taskState.isFinished }
}
} catch (e: TransactionException) {
e.report(ExceptionCategory.INTERNAL)
throw e
}
.collect {
it.firstOrNull()?.also { state ->
Timber.v("MEASURE [Risk Level Calculation] $label finished")
callback.invoke(
if (state.error != null)
null
else
System.currentTimeMillis() - t0
)
}
}
Timber.v("MEASURE [Risk Level Calculation] $label started")
AppInjector.component.taskController.submit(
DefaultTaskRequest(
RiskLevelTask::class,
object : Task.Arguments {},
uuid
)
)
}

private suspend fun measureDiagnosticKeyRetrieval(
Expand Down Expand Up @@ -149,3 +166,5 @@ class RiskLevelAndKeyRetrievalBenchmark(
}
}
}

typealias OnBenchmarkCompletedListener = (resultInfo: String) -> Unit
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ import com.google.zxing.integration.android.IntentIntegrator
import com.google.zxing.integration.android.IntentResult
import com.google.zxing.qrcode.QRCodeWriter
import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.RiskLevelAndKeyRetrievalBenchmark
import de.rki.coronawarnapp.databinding.FragmentTestForAPIBinding
import de.rki.coronawarnapp.diagnosiskeys.server.LocationCode
import de.rki.coronawarnapp.exception.ExceptionCategory
Expand All @@ -52,6 +51,7 @@ import de.rki.coronawarnapp.storage.AppDatabase
import de.rki.coronawarnapp.storage.ExposureSummaryRepository
import de.rki.coronawarnapp.storage.LocalData
import de.rki.coronawarnapp.storage.tracing.TracingIntervalRepository
import de.rki.coronawarnapp.test.RiskLevelAndKeyRetrievalBenchmark
import de.rki.coronawarnapp.test.menu.ui.TestMenuItem
import de.rki.coronawarnapp.util.KeyFileHelper
import de.rki.coronawarnapp.util.di.AppInjector
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,13 @@ import com.google.android.gms.common.GoogleApiAvailability
import com.squareup.inject.assisted.AssistedInject
import de.rki.coronawarnapp.environment.EnvironmentSetup
import de.rki.coronawarnapp.environment.EnvironmentSetup.Type.Companion.toEnvironmentType
import de.rki.coronawarnapp.exception.ExceptionCategory
import de.rki.coronawarnapp.exception.TransactionException
import de.rki.coronawarnapp.exception.reporting.report
import de.rki.coronawarnapp.risk.RiskLevelTask
import de.rki.coronawarnapp.storage.LocalData
import de.rki.coronawarnapp.storage.TestSettings
import de.rki.coronawarnapp.task.TaskController
import de.rki.coronawarnapp.task.common.DefaultTaskRequest
import de.rki.coronawarnapp.test.api.ui.EnvironmentState.Companion.toEnvironmentState
import de.rki.coronawarnapp.test.api.ui.LoggerState.Companion.toLoggerState
import de.rki.coronawarnapp.transaction.RiskLevelTransaction
import de.rki.coronawarnapp.util.CWADebug
import de.rki.coronawarnapp.util.di.AppContext
import de.rki.coronawarnapp.util.ui.SingleLiveEvent
Expand All @@ -28,7 +27,8 @@ import java.io.File
class TestForApiFragmentViewModel @AssistedInject constructor(
@AppContext private val context: Context,
private val envSetup: EnvironmentSetup,
private val testSettings: TestSettings
private val testSettings: TestSettings,
private val taskController: TaskController
) : CWAViewModel() {

val debugOptionsState by smartLiveData {
Expand Down Expand Up @@ -80,13 +80,7 @@ class TestForApiFragmentViewModel @AssistedInject constructor(
}

fun calculateRiskLevelClicked() {
viewModelScope.launch {
try {
RiskLevelTransaction.start()
} catch (e: TransactionException) {
e.report(ExceptionCategory.INTERNAL)
}
}
taskController.submit(DefaultTaskRequest(RiskLevelTask::class))
}

val logShareEvent = SingleLiveEvent<File?>()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,18 @@ import de.rki.coronawarnapp.exception.ExceptionCategory
import de.rki.coronawarnapp.exception.reporting.report
import de.rki.coronawarnapp.nearby.ENFClient
import de.rki.coronawarnapp.nearby.InternalExposureNotificationClient
import de.rki.coronawarnapp.risk.DefaultRiskLevelCalculation
import de.rki.coronawarnapp.risk.RiskLevel
import de.rki.coronawarnapp.risk.RiskLevelTask
import de.rki.coronawarnapp.risk.RiskLevels
import de.rki.coronawarnapp.risk.TimeVariables
import de.rki.coronawarnapp.server.protocols.AppleLegacyKeyExchange
import de.rki.coronawarnapp.service.applicationconfiguration.ApplicationConfigurationService
import de.rki.coronawarnapp.storage.AppDatabase
import de.rki.coronawarnapp.storage.LocalData
import de.rki.coronawarnapp.storage.RiskLevelRepository
import de.rki.coronawarnapp.task.TaskController
import de.rki.coronawarnapp.task.common.DefaultTaskRequest
import de.rki.coronawarnapp.transaction.RetrieveDiagnosisKeysTransaction
import de.rki.coronawarnapp.transaction.RiskLevelTransaction
import de.rki.coronawarnapp.ui.tracing.card.TracingCardStateProvider
import de.rki.coronawarnapp.util.KeyFileHelper
import de.rki.coronawarnapp.util.coroutine.DispatcherProvider
Expand All @@ -49,6 +51,8 @@ class TestRiskLevelCalculationFragmentCWAViewModel @AssistedInject constructor(
@AppContext private val context: Context, // App context
dispatcherProvider: DispatcherProvider,
private val enfClient: ENFClient,
private val riskLevels: RiskLevels,
private val taskController: TaskController,
private val keyCacheRepository: KeyCacheRepository,
tracingCardStateProvider: TracingCardStateProvider
) : CWAViewModel(
Expand Down Expand Up @@ -82,13 +86,7 @@ class TestRiskLevelCalculationFragmentCWAViewModel @AssistedInject constructor(
}

fun calculateRiskLevel() {
viewModelScope.launch {
try {
RiskLevelTransaction.start()
} catch (e: Exception) {
e.report(ExceptionCategory.INTERNAL)
}
}
taskController.submit(DefaultTaskRequest(RiskLevelTask::class))
}

fun resetRiskLevel() {
Expand All @@ -110,7 +108,7 @@ class TestRiskLevelCalculationFragmentCWAViewModel @AssistedInject constructor(
e.report(ExceptionCategory.INTERNAL)
}
}
RiskLevelTransaction.start()
taskController.submit(DefaultTaskRequest(RiskLevelTask::class))
riskLevelResetEvent.postValue(Unit)
}
}
Expand All @@ -136,7 +134,7 @@ class TestRiskLevelCalculationFragmentCWAViewModel @AssistedInject constructor(
val appConfig =
ApplicationConfigurationService.asyncRetrieveApplicationConfiguration()

val riskLevelScore = DefaultRiskLevelCalculation().calculateRiskScore(
val riskLevelScore = riskLevels.calculateRiskScore(
appConfig.attenuationDuration,
exposureSummary
)
Expand Down Expand Up @@ -176,9 +174,9 @@ class TestRiskLevelCalculationFragmentCWAViewModel @AssistedInject constructor(
"Matched Key Count: ${exposureSummary.matchedKeyCount}\n" +
"Maximum Risk Score: ${exposureSummary.maximumRiskScore}\n" +
"Attenuation Durations: [${
exposureSummary.attenuationDurationsInMinutes?.get(
0
)
exposureSummary.attenuationDurationsInMinutes?.get(
0
)
}," +
"${exposureSummary.attenuationDurationsInMinutes?.get(1)}," +
"${exposureSummary.attenuationDurationsInMinutes?.get(2)}]\n" +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,42 +9,37 @@ import com.squareup.inject.assisted.Assisted
import com.squareup.inject.assisted.AssistedInject
import de.rki.coronawarnapp.exception.ExceptionCategory
import de.rki.coronawarnapp.exception.NoTokenException
import de.rki.coronawarnapp.exception.TransactionException
import de.rki.coronawarnapp.exception.reporting.report
import de.rki.coronawarnapp.risk.RiskLevelTask
import de.rki.coronawarnapp.storage.ExposureSummaryRepository
import de.rki.coronawarnapp.transaction.RiskLevelTransaction
import de.rki.coronawarnapp.task.TaskController
import de.rki.coronawarnapp.task.common.DefaultTaskRequest
import de.rki.coronawarnapp.util.worker.InjectedWorkerFactory
import timber.log.Timber

class ExposureStateUpdateWorker @AssistedInject constructor(
@Assisted val context: Context,
@Assisted workerParams: WorkerParameters
@Assisted workerParams: WorkerParameters,
private val taskController: TaskController
) : CoroutineWorker(context, workerParams) {
companion object {
private val TAG = ExposureStateUpdateWorker::class.simpleName
}

override suspend fun doWork(): Result {
try {
Timber.v("worker to persist exposure summary started")
val token = inputData.getString(ExposureNotificationClient.EXTRA_TOKEN)
?: throw NoTokenException(IllegalArgumentException("no token was found in the intent"))

Timber.v("valid token $token retrieved")

val exposureSummary = InternalExposureNotificationClient
.asyncGetExposureSummary(token)

ExposureSummaryRepository.getExposureSummaryRepository()
.insertExposureSummaryEntity(exposureSummary)
Timber.v("exposure summary state updated: $exposureSummary")

RiskLevelTransaction.start()
InternalExposureNotificationClient
.asyncGetExposureSummary(token).also {
ExposureSummaryRepository.getExposureSummaryRepository()
.insertExposureSummaryEntity(it)
Timber.v("exposure summary state updated: $it")
}

taskController.submit(DefaultTaskRequest(RiskLevelTask::class))
Timber.v("risk level calculation triggered")
} catch (e: ApiException) {
e.report(ExceptionCategory.EXPOSURENOTIFICATION)
} catch (e: TransactionException) {
e.report(ExceptionCategory.INTERNAL)
}

return Result.success()
Expand Down

This file was deleted.

0 comments on commit 46aaaf1

Please sign in to comment.