-
Notifications
You must be signed in to change notification settings - Fork 24
Expand file tree
/
Copy pathdummy_helper.erl
More file actions
88 lines (78 loc) · 3.41 KB
/
Copy pathdummy_helper.erl
File metadata and controls
88 lines (78 loc) · 3.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
-module(dummy_helper).
-include_lib("stdlib/include/assert.hrl").
-required_variable(#{name => dummy_var,
description => "dummy_var",
default_value => default_value}).
-define(comment(U), io_lib:format("Condition failed with last users distribution ~n~p", [U])).
%% amoc_dist testing function
-export([test_amoc_dist/0]).
test_amoc_dist() ->
try
Master = amoc_cluster:master_node(),
Slaves = amoc_cluster:slave_nodes(),
%% check the status of the nodes
?assertEqual(disabled, get_status(Master)),
[ ?assertMatch({running, #{scenario := dummy_scenario}}, get_status(Node)) || Node <- Slaves],
%% check user ids, users have all been started at the first two nodes
{N1, Max1, Nodes1, Ids1, Users1} = get_users_info(Slaves),
?assert(N1 > 0),
?assertEqual(N1, Max1, ?comment(Users1)),
?assertEqual(Ids1, lists:seq(1, N1), ?comment(Users1)),
[AddedNode] = Slaves -- Nodes1,
%% add 20 users
add_and_wait(Master, 20),
{N2, Max2, Nodes2, Ids2, Users2} = get_users_info(Slaves),
?assertEqual(N2, Max2, ?comment(Users2)),
?assertEqual(Ids2, lists:seq(1, N2), ?comment(Users2)),
?assertEqual([AddedNode], Nodes2 -- Nodes1, ?comment(Users2)),
?assertEqual(N2, N1 + 20, ?comment(Users2)),
%% remove 10 users
remove_and_wait(Master, 10),
{N3, _Max3, Nodes3, _Ids3, Users3} = get_users_info(Slaves),
?assertEqual(N2 - 10, N3, ?comment(Users3)),
?assertEqual(Nodes2, Nodes3, ?comment(Users3)),
%% try to remove N3 users
Ret = remove_and_wait(Master, N3),
RemovedN = lists:sum([N || {_, N} <- Ret]),
{N4, _Max4, Nodes4, Ids4, Users4} = get_users_info(Slaves),
?assertEqual(N3 - RemovedN, N4, ?comment(Users4)),
?assertEqual(Nodes1, Nodes4, ?comment(Users4)),
?assert(RemovedN < N3),
%% add 20 users
add_and_wait(Master, 20),
{N5, Max5, Nodes5, Ids5, Users5} = get_users_info(Slaves),
?assertEqual(Nodes2, Nodes5, ?comment(Users5)),
?assertEqual(Max5, Max2 + 20, ?comment(Users5)),
?assertEqual(N5, N4 + 20, ?comment(Users5)),
?assertEqual(Ids5 -- Ids4, lists:seq(Max2 + 1, Max5), ?comment(Users5)),
%% terminate scenario
stop(Master),
[ ?assertEqual({finished, dummy_scenario}, get_status(Node)) || Node <- Slaves],
%% return expected value
amoc_dist_works_as_expected
catch
C:E:S ->
{C, E, S}
end.
get_users_info(SlaveNodes) ->
Distrib = [ {Node, erpc:call(Node, amoc_users_sup, get_all_children, [])} || Node <- SlaveNodes ],
Ids = lists:usort([Id || {_Node, Users} <- Distrib, {_, Id} <- Users]),
Nodes = lists:usort([Node || {Node, Users} <- Distrib, [] =/= Users]),
N = length(Ids),
MaxId = lists:max(Ids),
%% logger:error(#{n => N, max_id => MaxId, nodes => Nodes, ids => Ids, distrib => Distrib}),
{N, MaxId, Nodes, Ids, Distrib}.
add_and_wait(Master, Num) ->
{ok, Ret} = erpc:call(Master, amoc_dist, add, [Num]),
timer:sleep(3000),
Ret.
remove_and_wait(Master, Num) ->
{ok, Ret} = erpc:call(Master, amoc_dist, remove, [Num, true]),
timer:sleep(3000),
Ret.
stop(Master) ->
{ok, Ret} = erpc:call(Master, amoc_dist, stop, []),
timer:sleep(3000),
Ret.
get_status(Node) ->
erpc:call(Node, amoc_controller, get_status, []).