All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ru.fix.corounit.allure.Allure.kt Maven / Gradle / Ivy

package ru.fix.corounit.allure

import kotlinx.coroutines.CoroutineScope
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.InvocationKind
import kotlin.contracts.contract
import kotlin.reflect.KClass

inline fun  createStepClassInstance(vararg args: Any?): T =
        createStepClassInstance(T::class, *args)

fun  createStepClassInstance(clazz: KClass, vararg args: Any?): T =
        AllureAspect.newAspectedInstanceViaSubtyping(clazz, *args)

suspend operator fun String.invoke(stepBody: suspend CoroutineScope.()->Unit) {
    AllureStep.fromCurrentCoroutineContext().step(this, stepBody)
}

suspend operator fun String.invoke(assertion: Boolean) {
    AllureStep.fromCurrentCoroutineContext().step(this, assertion)
}

@UseExperimental(ExperimentalContracts::class)
suspend fun  repeatUntilSuccess(timeout: Int = 15_000,
                                   delay: Int = 1_000,
                                   block: suspend ()->T):T {
    contract {
        callsInPlace(block, InvocationKind.AT_LEAST_ONCE)
    }

    var result: T? = null

    AllureStep.fromCurrentCoroutineContext().step(
            "repeat until success, at most ${java.time.Duration.ofMillis(timeout.toLong())}") {
        val start = System.currentTimeMillis()
        fun isTimeOut() = System.currentTimeMillis() > start + timeout

        var iteration = 0
        while (true) {
            try {
                iteration++
                AllureStep.fromCurrentCoroutineContext().step("iteration $iteration"){
                    result = block()
                }
                break
            } catch (thr: Throwable) {
                if (isTimeOut()) {
                    throw thr
                } else {
                    kotlinx.coroutines.delay(delay.toLong())
                    continue
                }
            }
        }
    }
    return result as T
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy