Script not running doIf conditional

Hi. I’m fairly new to Gatling and Scala.

I’ve created a script that sends an application request, and then checks the response. Occasionally, the response code is 404, so in that situation, I want the script to pause for a while, then try again.

But it’s not going into the doIf statement when a 404 is returned, and I can’t figure out why. Can anyone help?

This is the script - scn1 isn’t shown, and deals with getting authorization. The problem is with scn2, and the .doIf(statusCheckResponseCode.equals(404))

`
object ApplicationRequest {

val sendApplicationRequest = exec(http(“Application Request”)
.post("/requestUrl")
.header(“Authorization”, “Bearer ${authorizationToken}”)
.header(“Accept”, “application/hal+json”)
.body(ElFileBody(“payload.json”)).asJSON
.check(status.is(201).saveAs(“requestStatusCode”), jsonPath("$._links.status.href").saveAs(“statusUrl”))
)

val checkApplicationRequestReceived = exec(http(“Check Status”)
.get("${statusUrl}")
.header(“Authorization”, “Bearer ${authorizationToken}”)
.check(status.is(200).saveAs(“statusCheckResponseCode”), jsonPath("$.status").is(“IN_PROGRESS”))
)
}

val scn2 = scenario(“application_request”)
.forever(
pace(FiniteDuration(20, TimeUnit.SECONDS))
.exec(.set(“authorizationToken”, authorizationToken))
.feed(titleNumbers)
.exec(ApplicationRequest.sendApplicationRequest
.pause(FiniteDuration(10, TimeUnit.SECONDS))
.exec(ApplicationRequest.checkApplicationRequestReceived)
.exec(
.set(“statusCheckResponseCode”, statusCheckResponseCode))
.doIf(statusCheckResponseCode.equals(404)) {
exec(
pause(FiniteDuration(120, TimeUnit.SECONDS))
.exec(ApplicationRequest.checkApplicationRequestReceived)
)
}
)
.exec { session =>
println(session)
session
}
)

setUp(scn1.inject(atOnceUsers(1)).protocols(httpConf),
scn2.inject(nothingFor(FiniteDuration(10, TimeUnit.SECONDS)), atOnceUsers(1), rampUsers(5) over FiniteDuration(30, TimeUnit.SECONDS)).protocols(httpConf))
.assertions(forAll.failedRequests.count.lessThan(1))
.maxDuration(FiniteDuration(testRunDurationInSecs.toLong, TimeUnit.SECONDS))
`

The answer to this is to capture your http response code:
.check(status.in(200, 206, 401).saveAs(“httpReturnCode”))

Then:
.doIf(session => session(“httpReturnCode”).as[String] == 401){

exec(…)
}

Cheers,

Steve Wainwright

Actually, httpReturnCode would be an Int, not a String