Skip to content

Commit 1d703e6

Browse files
author
aforge
committed
Implement token authentication in loadtest.
1 parent fec808f commit 1d703e6

File tree

3 files changed

+61
-5
lines changed

3 files changed

+61
-5
lines changed

loadtest/tinode.beam

552 Bytes
Binary file not shown.

loadtest/tinode.erl

+17-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
%% directory.
66

77
-module(tinode).
8-
-export([rand_user_secret/1, shuffle/1]).
8+
-export([rand_user_secret/1, shuffle/1, cache_token/2, read_token/1]).
99

1010
%% Produces a secret for use in basic login.
1111
rand_user_secret({Pid, DynData}) ->
@@ -27,3 +27,19 @@ get_rand_secret() ->
2727
shuffle(L) ->
2828
RandomList=[{rand:uniform(), X} || X <- L],
2929
[X || {_,X} <- lists:sort(RandomList)].
30+
31+
%% Reads previously cached token for the specified user.
32+
read_token(Uid) ->
33+
{ok, LogDir} = application:get_env(tsung_controller, log_dir_real),
34+
case file:read_file(filename:join(LogDir, Uid)) of
35+
{ok, Data} -> string:trim(Data);
36+
{error, _} -> ""
37+
end.
38+
39+
%% Saves auth token for the specified user in the log directory.
40+
cache_token(Uid, Token) ->
41+
{ok, LogDir} = application:get_env(tsung_controller, log_dir_real),
42+
{ok, File} = file:open(filename:join(LogDir, Uid), [write]),
43+
file:write(File, Token),
44+
file:close(File),
45+
ok.

loadtest/tsung.xml

+44-4
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
<load>
1313
<arrivalphase phase="1" duration="120" unit="second">
14-
<users maxnumber="100" arrivalrate="1" unit="second" />
14+
<users maxnumber="1500" arrivalrate="10" unit="second" />
1515
</arrivalphase>
1616
</load>
1717

@@ -31,9 +31,49 @@
3131
<websocket type="message">{"hi":{"id":"%%_baseid%%01","ver":"0.15","ua":"Tsung-Loadtest/1.0; tsung/1.7.0"}}</websocket>
3232
</request>
3333

34-
<request subst="true">
35-
<websocket type="message">{"login":{"id":"%%_baseid%%02","scheme":"basic","secret":"%%tinode:rand_user_secret%%"}}</websocket>
36-
</request>
34+
<!-- Randomly pick a user. -->
35+
<setdynvars sourcetype="eval"
36+
code='fun({Pid, DynVars}) ->
37+
tinode:rand_user_secret({Pid, DynVars})
38+
end.'>
39+
<var name="secret" />
40+
</setdynvars>
41+
42+
<!-- Read auth token from the cache. -->
43+
<setdynvars sourcetype="eval"
44+
code='fun({Pid, DynVars}) ->
45+
{ok, Secret} = ts_dynvars:lookup(secret, DynVars),
46+
tinode:read_token(Secret)
47+
end.'>
48+
<var name="token" />
49+
</setdynvars>
50+
51+
<!-- Token present. Authenticate with it. -->
52+
<if var="token" neq="">
53+
<request subst="true">
54+
<match do="abort" when="nomatch">{"ctrl":.*"code":200.*}</match>
55+
<websocket type="message">{"login":{"id":"%%_baseid%%02","scheme":"token","secret":"%%_token%%"}}</websocket>
56+
</request>
57+
</if>
58+
59+
<!-- else log in with user name and password. -->
60+
<if var="token" eq="">
61+
<request subst="true">
62+
<match do="abort" when="nomatch">{"ctrl":.*"code":200.*}</match>
63+
<dyn_variable name="token" re='^{"ctrl":.*"token":"([-A-Za-z0-9+\/=]+={0,3})".*}$'/>
64+
<websocket type="message">{"login":{"id":"%%_baseid%%02","scheme":"basic","secret":"%%_secret%%"}}</websocket>
65+
</request>
66+
67+
<!-- Save token in the cache. -->
68+
<setdynvars sourcetype="eval"
69+
code='fun({_, DynVars}) ->
70+
{ok, Token} = ts_dynvars:lookup(token, DynVars),
71+
{ok, Secret} = ts_dynvars:lookup(secret, DynVars),
72+
tinode:cache_token(Secret, Token)
73+
end.'>
74+
<var name="dummy" />
75+
</setdynvars>
76+
</if>
3777

3878
<request subst="true">
3979
<websocket type="message" frame="text">{"sub":{"id":"%%_baseid%%03","topic":"me","get":{"what":"desc"}}}</websocket>

0 commit comments

Comments
 (0)