From 543f3fb9bbaeaa5b2456949ac3d6d31aa44d8570 Mon Sep 17 00:00:00 2001 From: Fabrice Lecomte Date: Fri, 16 Apr 2021 02:30:58 +0200 Subject: [PATCH] Add retry for viewsTest --- build.gradle.kts | 6 +++ .../kotlin/fr/dcproject/common/utils/retry.kt | 41 +++++++++++++++++++ src/test/kotlin/functional/ViewTest.kt | 20 +++++---- 3 files changed, 59 insertions(+), 8 deletions(-) create mode 100644 src/main/kotlin/fr/dcproject/common/utils/retry.kt diff --git a/build.gradle.kts b/build.gradle.kts index c293ef2..9364b49 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -374,6 +374,12 @@ tasks.register("testWorkgroup", Test::class) { includeTags("workgroup") } } +tasks.register("testViews", Test::class) { + group = "tests" + useJUnitPlatform { + includeTags("view") + } +} dependencyCheck { formats = listOf(ReportGenerator.Format.HTML, ReportGenerator.Format.XML) diff --git a/src/main/kotlin/fr/dcproject/common/utils/retry.kt b/src/main/kotlin/fr/dcproject/common/utils/retry.kt new file mode 100644 index 0000000..2ccbb93 --- /dev/null +++ b/src/main/kotlin/fr/dcproject/common/utils/retry.kt @@ -0,0 +1,41 @@ +package fr.dcproject.common.utils + +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import kotlin.time.Duration +import kotlin.time.ExperimentalTime + +@ExperimentalTime +fun retry(numOfRetries: Int, duration: Duration = Duration.ZERO, block: (RetryContext) -> T): T { + val logger: Logger = LoggerFactory.getLogger("fr.dcproject.utils.retry") + var throwable: Throwable? = null + for (attempt in 1..numOfRetries) { + val context = RetryContext() + try { + val output = block(context) + if (context.hasStop()) { + break + } + return output + } catch (e: Throwable) { + throwable = e + logger.debug("Failed attempt $attempt / $numOfRetries. Wait ${duration.inSeconds} seconds") + Thread.sleep(duration.inMilliseconds.toLong()) + } finally { + if (context.hasStop()) { + break + } + } + } + throw throwable!! +} + +class RetryContext() { + var stoped = false + + fun stop() { + stoped = true + } + + fun hasStop(): Boolean = stoped +} diff --git a/src/test/kotlin/functional/ViewTest.kt b/src/test/kotlin/functional/ViewTest.kt index d8a74d7..5e8df91 100644 --- a/src/test/kotlin/functional/ViewTest.kt +++ b/src/test/kotlin/functional/ViewTest.kt @@ -2,6 +2,7 @@ package functional import fr.dcproject.application.Env.TEST import fr.dcproject.application.module +import fr.dcproject.common.utils.retry import fr.dcproject.component.article.database.ArticleForView import fr.dcproject.component.article.database.ArticleViewRepository import fr.dcproject.component.auth.database.UserCreator @@ -20,6 +21,8 @@ import org.junit.jupiter.api.TestInstance import org.junit.jupiter.api.TestInstance.Lifecycle.PER_CLASS import org.koin.ktor.ext.get import java.util.UUID +import kotlin.time.ExperimentalTime +import kotlin.time.seconds @KtorExperimentalLocationsAPI @KtorExperimentalAPI @@ -27,6 +30,7 @@ import java.util.UUID @TestInstance(PER_CLASS) @Tags(Tag("functional"), Tag("view")) class ViewTest { + @ExperimentalTime @Test fun `test View Article`() { val article = ArticleForView( @@ -75,15 +79,15 @@ class ViewTest { article ) - /* Sleep because ES is not sync ! */ - Thread.sleep(1000) + /* Retry because ES is not sync ! */ + retry(10, 0.3.seconds) { + /* Get view */ + val afterView = viewRepository.getViewsCount(article) - /* Get view */ - val afterView = viewRepository.getViewsCount(article) - - /* Check if view has increment */ - afterView.total `should be equal to` startView.total + 4 - afterView.unique `should be equal to` startView.unique + 3 + /* Check if view has increment */ + afterView.total `should be equal to` startView.total + 4 + afterView.unique `should be equal to` startView.unique + 3 + } } } }