Websocket - always getting timeout with wsAwait

Hi,

we really struggle accomplishing our first successful message receive with Gatling talking to a server side receiving Websocket / STOMP in a Spring Boot application.

The test scenario looks like this:


val httpConf = http
  .baseURL(s"https://${targetHost}:8443")
  .wsBaseURL(s"wss://${targetHost}:8443")

val getLoggedInUser =
  """|SEND
     >destination:/app/core/security/getUser
     >content-length:82
     >
     >{"header":{"id":"1","businessCaseId":"bic1","sentAt":"2017-03-21T12:28:38+01:00"}}\u0000""".stripMargin

val scn = scenario("test1")
  .exec(ws("connect to websocket").open("/wdp3websocketendpoint/websocket"))
  .exec(ws("getLoggedInUser").sendText(getLoggedInUser).check(wsAwait.within(5 second).until(1)))

setUp(scn.inject(atOnceUsers(1)).protocols(httpConf))

and running this scenario always ends up in “Check failed: Timeout” message. Examining the server logs I see the request message received on Websocket and the response message getting sent there too but Gatling doesn’t seem to pick up anything on the channel.

What could be missing here?

Thanks in advance,
K

Replying to my own question, we were lacking a few necessary steps indeed. As the server side tries to use the STOMP protocol, we needed to send Websocket messages for Stomp CONNECT and SUBSCRIBE commands in order to receive valid response messages to sent requests.

Hope it helps someone - and sorry for the noise.

K

Hi,

I am facing the same problem. I am not familiar enough with STOMP protocol, so could you explain more how you did it?

Thanks and regards.

Nice to meet some people dealing with this protocol too =)

Here are some docs about the protocol: https://stomp.github.io

That’s how I’m working with it:

  1. Open websocket connection
  2. Send CONNECT frame. It should look something like this: val connectFrame = “[“CONNECT\naccept-version:1.1,1.0\nheart-beat:0,0\n\n\u0000”]”
  3. Wait for connected response: frame will contain something like "“CONNECTED\nversion:1.1\nheart-beat:0,0…”
  4. First of all you need to find out what destinations your app has and subscribe to ones you want to listen to. Subscription frame looks like this: val subscr = “[“SUBSCRIBE\nid:sub-1\ndestination:/some/destination\n\n\u0000”]”, where sub-1 is an index of you subscription that you can later use to unsubscribe.
  5. Now you can send messages and receive responses. SEND frames should include a content-length header if a body is present, make sure to calculate it properly.

If you deal with some web app, it is a good idea to explore websocket frames in browser. In Chrome developer tools: Network, filter by WS and see frames tab for your connection, they are all displayed fine.

Hope this helps.

Hi and nice to meet you too,
Also thanks for your quick reply.

I have another problem that I cannot open even open web-socket connection This is how I try to do it:

exec(ws("Connect WS")
  .open("/async/results")
  .basicAuth("[mohammad.morshedian@kpit.com](mailto:mohammad.morshedian@kpit.com)", "123456")
)

and I have configured http as follow:

Not sure if .basicAuth() can be used for websocket connections in Gatling. You can try to pass username and password as a part of url string OR send login and password in CONNECT frame headers (depending on implementation you’re dealing with).
And yes, status you are expecting is 101.

As for spring boot configs, I’m not familiar with it.