Add retry for viewsTest
This commit is contained in:
@@ -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)
|
||||
|
||||
41
src/main/kotlin/fr/dcproject/common/utils/retry.kt
Normal file
41
src/main/kotlin/fr/dcproject/common/utils/retry.kt
Normal file
@@ -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 <T> 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
|
||||
}
|
||||
@@ -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,9 +79,8 @@ 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)
|
||||
|
||||
@@ -87,3 +90,4 @@ class ViewTest {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user