Gatling loadtest: cache auth tokens and reuse them.

This commit is contained in:
aforge
2020-12-03 00:23:53 +03:00
parent cfc68bad8f
commit 4f5ff5e917
2 changed files with 70 additions and 27 deletions

View File

@ -1,42 +1,84 @@
package tinode
import java.util.Base64
import java.util.concurrent.ConcurrentHashMap
import scala.collection.JavaConverters._
import scala.collection._
import scala.concurrent.duration._
import io.gatling.core.Predef._
import io.gatling.http.Predef._
class WS2 extends Simulation {
class Loadtest extends Simulation {
val httpProtocol = http
.baseUrl("http://localhost:6060")
.wsBaseUrl("ws://localhost:6060")
val feeder = csv("users.csv").random
val scn = scenario("WebSocket")
.exec(ws("Connect WS").connect("/v0/channels?apikey=AQEAAAABAAD_rAp4DJh05a1HAwFT3A6K"))
.exec(session => session.set("id", "Tinode_" + session.userId))
.pause(1)
.repeat(1, "i") {
exec {
ws("hi").sendText(
"""{"hi":{"id":"afabb3","ver":"0.16","ua":"Gatling-Loadtest/1.0; gatling/1.7.0"}}"""
)
}
// Auth tokens to share between sessions.
val tokenCache : concurrent.Map[String, String] = new ConcurrentHashMap() asScala
val loginBasic =
exec { session =>
val uname = session("username").as[String]
val password = session("password").as[String]
val secret = new String(java.util.Base64.getEncoder.encode((uname + ":" + password).getBytes()))
session.set("secret", secret)
}
.pause(1)
.feed(feeder)
.exec {
ws("login").sendText(
"""{"login":{"id":"afabb302","scheme":"basic","secret":"${secret}"}}"""
"""{"login":{"id":"${id}-login","scheme":"basic","secret":"${secret}"}}"""
)
.await(5 seconds)(
ws.checkTextMessage("login-ctrl")
.matching(jsonPath("$.ctrl").find.exists)
.check(jsonPath("$.ctrl.params.token").saveAs("token"))
)
}
.exec { session =>
val uname = session("username").as[String]
val token = session("token").as[String]
tokenCache.put(uname, token)
session
}
val loginToken =
exec { session =>
val uname = session("username").as[String]
val token = tokenCache.get(uname).getOrElse("")
session.set("token", token)
}
.exec {
ws("login-token").sendText(
"""{"login":{"id":"${id}-login2","scheme":"token","secret":"${token}"}}"""
)
.await(5 seconds)(
ws.checkTextMessage("login-ctrl")
.matching(jsonPath("$.ctrl").find.exists)
)
}
val scn = scenario("WebSocket")
.exec(ws("Connect WS").connect("/v0/channels?apikey=AQEAAAABAAD_rAp4DJh05a1HAwFT3A6K"))
.exec(session => session.set("id", "tn-" + session.userId))
.pause(1)
.exec {
ws("hi").sendText(
"""{"hi":{"id":"afabb3","ver":"0.16","ua":"Gatling-Loadtest/1.0; gatling/1.7.0"}}"""
)
}
.pause(1)
.feed(feeder)
.doIfOrElse({session =>
val uname = session("username").as[String]
val token = tokenCache.get(uname)
token == None
}) { loginBasic } { loginToken }
.exec {
ws("sub-me").sendText(
"""{"sub":{"id":"afbef03","topic":"me","get":{"what":"desc"}}}"""
"""{"sub":{"id":"{id}-sub-me","topic":"me","get":{"what":"desc"}}}"""
)
.await(5 seconds)(
ws.checkTextMessage("sub-me-desc")
@ -45,23 +87,18 @@ class WS2 extends Simulation {
}
.exec {
ws("get-subs").sendText(
"""{"get":{"id":"afbef04","topic":"me","what":"sub"}}"""
"""{"get":{"id":"${id}-get-subs","topic":"me","what":"sub"}}"""
)
.await(5 seconds)(
ws.checkTextMessage("subs3")
ws.checkTextMessage("save-subs")
.matching(jsonPath("$.meta.sub").find.exists)
.check(jsonPath("$.meta.sub[*].topic").findAll.saveAs("subs"))
)
}
.exec(session => {
val subs = session("subs").asOption[String]
println(subs.getOrElse("COULD NOT FIND topics"))
session
})
.foreach("${subs}", "sub") {
exec {
ws("sub-topic").sendText(
"""{"sub":{"id":"afn-${sub}","topic":"${sub}","get":{"what":"desc sub data del"}}}"""
"""{"sub":{"id":"${id}-sub-${sub}","topic":"${sub}","get":{"what":"desc sub data del"}}}"""
)
.await(5 seconds)(
ws.checkTextMessage("sub-topic-ctrl")
@ -71,7 +108,7 @@ class WS2 extends Simulation {
.repeat(3, "i") {
exec {
ws("pub-topic").sendText(
"""{"pub":{"id":"pub-${sub}-${i}","topic":"${sub}","content":"This is a Tsung test ${i}"}}"""
"""{"pub":{"id":"${id}-pub-${sub}-${i}","topic":"${sub}","content":"This is a Tsung test ${i}"}}"""
)
.await(5 seconds)(
ws.checkTextMessage("pub-topic-ctrl")
@ -81,7 +118,7 @@ class WS2 extends Simulation {
}
.exec {
ws("leave-topic").sendText(
"""{"leave":{"id":"leave-${sub}","topic":"${sub}"}}"""
"""{"leave":{"id":"${id}-leave-${sub}","topic":"${sub}"}}"""
)
.await(5 seconds)(
ws.checkTextMessage("sub-topic-ctrl")
@ -91,6 +128,5 @@ class WS2 extends Simulation {
}
.exec(ws("close-ws").close)
setUp(scn.inject(rampUsers(5) during (5 seconds))).protocols(httpProtocol)
setUp(scn.inject(rampUsers(5000) during (50 seconds))).protocols(httpProtocol)
}

7
loadtest/users.csv Normal file
View File

@ -0,0 +1,7 @@
username,password
alice,alice123
bob,bob123
carol,carol123
dave,dave123
eve,eve123
frank,frank123
1 username password
2 alice alice123
3 bob bob123
4 carol carol123
5 dave dave123
6 eve eve123
7 frank frank123