Skip to content

Commit

Permalink
Remove conflicting FiniteDurationExpression implicits, close #4195
Browse files Browse the repository at this point in the history
Motivation:

In 3.7, we added some `Int => Expression[FiniteDuration]` implicits that in some cases take over the expected `Any => Expression[Any]`.

Modification:

Drop those implicits and add lots for overrides for during-like loops.

Result:

No more conflicts. Breaking binary change, can only be released in 3.8.
  • Loading branch information
slandelle committed Jan 21, 2022
1 parent 41cf0c0 commit 3b94af9
Show file tree
Hide file tree
Showing 5 changed files with 32 additions and 10 deletions.
5 changes: 0 additions & 5 deletions gatling-core/src/main/scala/io/gatling/core/Predef.scala
Expand Up @@ -19,7 +19,6 @@ package io.gatling.core
import scala.concurrent.duration._

import io.gatling.core.config.GatlingConfiguration
import io.gatling.core.session._

object Predef extends CoreDsl {

Expand Down Expand Up @@ -106,12 +105,8 @@ object Predef extends CoreDsl {
}

implicit def integerToFiniteDuration(i: Integer): FiniteDuration = intToFiniteDuration(i.toInt)
implicit def integerToFiniteDurationExpression(i: Integer): Expression[FiniteDuration] = intToFiniteDuration(i.toInt).expressionSuccess

implicit def intToFiniteDuration(i: Int): FiniteDuration = i.seconds
implicit def intToFiniteDurationExpression(i: Int): Expression[FiniteDuration] = i.seconds.expressionSuccess

implicit def jlongToFiniteDuration(i: java.lang.Long): FiniteDuration = i.toLong.seconds
implicit def jlongToFiniteDurationExpression(i: java.lang.Long): Expression[FiniteDuration] = i.toLong.seconds.expressionSuccess

}
Expand Up @@ -35,11 +35,6 @@ private[structure] trait Feeds[B] extends Execs[B] {
def feed(feederBuilder: FeederBuilder): B =
feed(feederBuilder, Feeds.OneExpression)

@deprecated("Feeding multiple records at once and translating names will be dropped in the next release", "3.7.0")
// we need this overload because Int => Expression[Int] and Int => Expression[FiniteDuration] suddenly conflict?!
def feed(feederBuilder: FeederBuilder, number: Int): B =
feed(feederBuilder, number.expressionSuccess)

/**
* Chain an action that will inject multiple data records into the virtual users' Session
*
Expand Down
30 changes: 30 additions & 0 deletions gatling-core/src/main/scala/io/gatling/core/structure/Loops.scala
Expand Up @@ -52,6 +52,16 @@ private[structure] trait Loops[B] extends Execs[B] {
)
}

// we need these overrides because we can't add an Int => Expression[FiniteDuration] that would clash with Int => Expression[Any]
def during(duration: FiniteDuration)(chain: ChainBuilder): B =
during(duration.expressionSuccess)(chain)
def during(duration: FiniteDuration, counterName: String)(chain: ChainBuilder): B =
during(duration.expressionSuccess, counterName)(chain)
def during(duration: FiniteDuration, exitASAP: Boolean)(chain: ChainBuilder): B =
during(duration.expressionSuccess, exitASAP = exitASAP)(chain)
def during(duration: FiniteDuration, counterName: String, exitASAP: Boolean)(chain: ChainBuilder): B =
during(duration.expressionSuccess, counterName, exitASAP)(chain)

@SuppressWarnings(Array("org.wartremover.warts.DefaultArguments"))
def during(duration: Expression[FiniteDuration], counterName: String = UUID.randomUUID.toString, exitASAP: Boolean = true)(chain: ChainBuilder): B =
clockBasedLoop(
Expand Down Expand Up @@ -87,6 +97,16 @@ private[structure] trait Loops[B] extends Execs[B] {
conditionValue <- condition(session)
} yield conditionValue && clock.nowMillis - session.loopTimestampValue(counterName) <= durationValue.toMillis

// we need these overrides because we can't add an Int => Expression[FiniteDuration] that would clash with Int => Expression[Any]
def asLongAsDuring(condition: Expression[Boolean], duration: FiniteDuration)(chain: ChainBuilder): B =
asLongAsDuring(condition, duration.expressionSuccess)(chain)
def asLongAsDuring(condition: Expression[Boolean], duration: FiniteDuration, counterName: String)(chain: ChainBuilder): B =
asLongAsDuring(condition, duration.expressionSuccess, counterName)(chain)
def asLongAsDuring(condition: Expression[Boolean], duration: FiniteDuration, exitASAP: Boolean)(chain: ChainBuilder): B =
asLongAsDuring(condition, duration.expressionSuccess, exitASAP = exitASAP)(chain)
def asLongAsDuring(condition: Expression[Boolean], duration: FiniteDuration, counterName: String, exitASAP: Boolean)(chain: ChainBuilder): B =
asLongAsDuring(condition, duration.expressionSuccess, counterName, exitASAP)(chain)

@SuppressWarnings(Array("org.wartremover.warts.DefaultArguments"))
def asLongAsDuring(
condition: Expression[Boolean],
Expand All @@ -96,6 +116,16 @@ private[structure] trait Loops[B] extends Execs[B] {
)(chain: ChainBuilder): B =
clockBasedLoop(continueCondition(condition, duration, counterName), chain, counterName, exitASAP, AsLongAsDuringLoopType)

// we need these overrides because we can't add an Int => Expression[FiniteDuration] that would clash with Int => Expression[Any]
def doWhileDuring(condition: Expression[Boolean], duration: FiniteDuration)(chain: ChainBuilder): B =
doWhileDuring(condition, duration.expressionSuccess)(chain)
def doWhileDuring(condition: Expression[Boolean], duration: FiniteDuration, counterName: String)(chain: ChainBuilder): B =
doWhileDuring(condition, duration.expressionSuccess, counterName)(chain)
def doWhileDuring(condition: Expression[Boolean], duration: FiniteDuration, exitASAP: Boolean)(chain: ChainBuilder): B =
doWhileDuring(condition, duration.expressionSuccess, exitASAP = exitASAP)(chain)
def doWhileDuring(condition: Expression[Boolean], duration: FiniteDuration, counterName: String, exitASAP: Boolean)(chain: ChainBuilder): B =
doWhileDuring(condition, duration.expressionSuccess, counterName, exitASAP)(chain)

@SuppressWarnings(Array("org.wartremover.warts.DefaultArguments"))
def doWhileDuring(
condition: Expression[Boolean],
Expand Down
Expand Up @@ -24,6 +24,7 @@ import io.gatling.http.check.sse.SseMessageCheck

trait SseAwaitActionBuilder[T] extends ActionBuilder {

// we need this override because we can't add an Int => Expression[FiniteDuration] that would clash with Int => Expression[Any]
def await(timeout: FiniteDuration)(checks: SseMessageCheck*): T =
await(timeout.expressionSuccess)(checks: _*)

Expand Down
Expand Up @@ -24,6 +24,7 @@ import io.gatling.http.check.ws.WsFrameCheck

trait WsAwaitActionBuilder[T] extends ActionBuilder {

// we need this override because we can't add an Int => Expression[FiniteDuration] that would clash with Int => Expression[Any]
def await(timeout: FiniteDuration)(checks: WsFrameCheck*): T =
await(timeout.expressionSuccess)(checks: _*)

Expand Down

0 comments on commit 3b94af9

Please sign in to comment.