Files
2020-11-15 00:59:13 +03:00

137 lines
5.9 KiB
XML

<?xml version="1.0"?>
<!DOCTYPE tsung SYSTEM "/usr/local/share/tsung/tsung-1.0.dtd" []>
<tsung loglevel="notice" version="1.0" dumptraffic="false">
<clients>
<client host="localhost" use_controller_vm="true" maxusers="40000" />
</clients>
<servers>
<server host="127.0.0.1" port="6060" type="tcp" />
</servers>
<load>
<arrivalphase phase="1" duration="120" unit="second">
<users maxnumber="40000" arrivalrate="50" unit="second" />
</arrivalphase>
</load>
<sessions>
<session name="websocket" probability="100" type="ts_websocket">
<setdynvars sourcetype="random_string" length="4">
<var name="baseid" />
</setdynvars>
<request subst="true">
<websocket type="connect" path="/v0/channels?apikey=AQEAAAABAAD_rAp4DJh05a1HAwFT3A6K">
<!--http_header name="X-Tinode-APIKey" value="AQEAAAABAAD_rAp4DJh05a1HAwFT3A6K"/-->
</websocket>
</request>
<request subst="true">
<websocket type="message">{"hi":{"id":"%%_baseid%%01","ver":"0.15","ua":"Tsung-Loadtest/1.0; tsung/1.7.0"}}</websocket>
</request>
<!-- Randomly pick a user. -->
<setdynvars sourcetype="eval"
code='fun({Pid, DynVars}) ->
tinode:rand_user_secret({Pid, DynVars})
end.'>
<var name="secret" />
</setdynvars>
<!-- Read auth token from the cache. -->
<setdynvars sourcetype="eval"
code='fun({Pid, DynVars}) ->
{ok, Secret} = ts_dynvars:lookup(secret, DynVars),
tinode:read_token(Secret)
end.'>
<var name="token" />
</setdynvars>
<!-- Token present. Authenticate with it. -->
<if var="token" neq="">
<request subst="true">
<match do="abort" when="nomatch">{"ctrl":.*"code":200.*}</match>
<websocket type="message">{"login":{"id":"%%_baseid%%02","scheme":"token","secret":"%%_token%%"}}</websocket>
</request>
</if>
<!-- else log in with user name and password. -->
<if var="token" eq="">
<request subst="true">
<match do="abort" when="nomatch">{"ctrl":.*"code":200.*}</match>
<dyn_variable name="token" re='^{"ctrl":.*"token":"([-A-Za-z0-9+\/=]+={0,3})".*}$'/>
<websocket type="message">{"login":{"id":"%%_baseid%%02","scheme":"basic","secret":"%%_secret%%"}}</websocket>
</request>
<!-- Save token in the cache. -->
<setdynvars sourcetype="eval"
code='fun({_, DynVars}) ->
{ok, Token} = ts_dynvars:lookup(token, DynVars),
{ok, Secret} = ts_dynvars:lookup(secret, DynVars),
tinode:cache_token(Secret, Token)
end.'>
<var name="dummy" />
</setdynvars>
</if>
<request subst="true">
<websocket type="message" frame="text">{"sub":{"id":"%%_baseid%%03","topic":"me","get":{"what":"desc"}}}</websocket>
</request>
<thinktime value="3" random="true"></thinktime>
<request subst="true">
<!--
Response looks like:
{"meta":{"id":"106691","topic":"me","ts":"2018-07-25T18:14:24.433Z","sub":[
{"updated":"2018-07-16T01:29:25.016Z","acs":{"given":47,"want":47,"mode":47},"topic":"grpOZcxbbwE7Hc","touched":"2018-07-16T17:32:12.48Z","seq":3},{"updated":"2018-07-16T01:35:25.016Z","acs":{"given":47,"want":47,"mode":47},"topic":"grpz6jDYiygVkI","touched":"2018-07-16T17:30:32.165Z","seq":22},{"updated":"2018-07-16T02:05:25.019Z","acs":{"given":47,"want":47,"mode":47},"topic":"grp8efPpvZoUQ4","touched":"2018-07-16T17:24:34.946Z","seq":1},{"updated":"2018-07-15T17:23:25.002Z","acs":{"given":31,"want":31,"mode":31},"topic":"usrlF7rSfaEx9c","touched":"2018-07-16T17:28:42.07Z","seq":9},{"updated":"2018-07-15T23:23:25.008Z","acs":{"given":16,"want":31,"mode":16},"topic":"usrddg3AFqzeEQ"},{"updated":"2018-07-15T23:53:25.009Z","acs":{"given":31,"want":31,"mode":31},"topic":"usrR6qq94MxLZ0","touched":"2018-07-16T17:30:03.93Z","seq":11},{"updated":"2018-07-15T23:56:25.01Z","acs":{"given":31,"want":31,"mode":31},"topic":"usriUhihEisbH8","touched":"2018-07-16T17:26:20.401Z","seq":9}]}}
-->
<dyn_variable name="subs" jsonpath="meta.sub[*].topic"/>
<websocket type="message" frame="text">{"get":{"id":"%%_baseid%%04","topic":"me","what":"sub"}}</websocket>
</request>
<setdynvars sourcetype="eval"
code="fun({Pid,DynVars})->
{ok,Subs}=ts_dynvars:lookup(subs,DynVars),
tinode:shuffle(Subs) end.">
<var name="shuffled_subs" />
</setdynvars>
<!-- main loop -->
<for from="1" to="100" incr="1" var="ctr">
<!-- Iterate over subscriptions -->
<foreach name="topicx" in="shuffled_subs">
<thinktime value="1" random="true"></thinktime>
<request subst="true">
<dyn_variable name="code" jsonpath="ctrl.code"/>
<websocket type="message" frame="text">{"sub":{"id":"%%_baseid%%%%_topicx%%%%_ctr%%","topic":"%%_topicx%%","get":{"what":"desc sub data del"}}}</websocket>
</request>
<if var="code" eq="200">
<for from="1" to="50" incr="1" var="counter">
<thinktime min="2" max="10" random="true"></thinktime>
<request subst="true">
<websocket type="message" frame="text">{"pub":{"id":"%%_baseid%%%%_topicx%%%%_ctr%%%%_counter%%","topic":"%%_topicx%%","content":"This is a Tsung test %%_baseid%% %%_counter%%"}}</websocket>
</request>
</for>
</if>
<request subst="true">
<websocket type="message" frame="text">{"leave":{"id":"%%_baseid%%%%_topicx%%%%_ctr%%","topic":"%%_topicx%%"}}</websocket>
</request>
</foreach>
</for>
<!-- end main loop -->
<request>
<websocket type="close"></websocket>
</request>
</session>
</sessions>
</tsung>