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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
%%%-------------------------------------------------------------------
%%% @author Evgeny Khramtsov <ekhramtsov@process-one.net>
%%% @copyright (C) 2016, Evgeny Khramtsov
%%% @doc
%%%
%%% @end
%%% Created : 16 Nov 2016 by Evgeny Khramtsov <ekhramtsov@process-one.net>
%%%-------------------------------------------------------------------
-module(mix_tests).
%% API
-compile(export_all).
-import(suite, [mix_jid/1, mix_room_jid/1, my_jid/1, is_feature_advertised/3,
disconnect/1, send_recv/2, recv_message/1, send/2,
put_event/2, get_event/1]).
-include("suite.hrl").
%%%===================================================================
%%% API
%%%===================================================================
%%%===================================================================
%%% Single user tests
%%%===================================================================
single_cases() ->
{mix_single, [sequence],
[single_test(feature_enabled)]}.
feature_enabled(Config) ->
MIX = mix_jid(Config),
ct:comment("Checking if ~s is set", [?NS_MIX_0]),
true = is_feature_advertised(Config, ?NS_MIX_0, MIX),
disconnect(Config).
%%%===================================================================
%%% Master-slave tests
%%%===================================================================
master_slave_cases() ->
{mix_master_slave, [sequence],
[master_slave_test(all)]}.
all_master(Config) ->
MIX = mix_jid(Config),
Room = mix_room_jid(Config),
MyJID = my_jid(Config),
MyBareJID = jid:remove_resource(MyJID),
#iq{type = result,
sub_els =
[#disco_info{
identities = [#identity{category = <<"conference">>,
type = <<"text">>}],
xdata = [#xdata{type = result, fields = XFields}]}]} =
send_recv(Config, #iq{type = get, to = MIX, sub_els = [#disco_info{}]}),
true = lists:any(
fun(#xdata_field{var = <<"FORM_TYPE">>,
values = [?NS_MIX_SERVICEINFO_0]}) -> true;
(_) -> false
end, XFields),
%% Joining
Nodes = [?NS_MIX_NODES_MESSAGES, ?NS_MIX_NODES_PRESENCE,
?NS_MIX_NODES_PARTICIPANTS, ?NS_MIX_NODES_SUBJECT,
?NS_MIX_NODES_CONFIG],
#iq{type = result,
sub_els = [#mix_join{subscribe = Nodes, jid = MyBareJID}]} =
send_recv(Config, #iq{type = set, to = Room,
sub_els = [#mix_join{subscribe = Nodes}]}),
#message{from = Room,
sub_els =
[#ps_event{
items = #ps_items{
node = ?NS_MIX_NODES_PARTICIPANTS,
items = [#ps_item{
id = ParticipantID,
xml_els = [PXML]}]}}]} =
recv_message(Config),
#mix_participant{jid = MyBareJID} = xmpp:decode(PXML),
%% Coming online
PresenceID = randoms:get_string(),
Presence = xmpp:encode(#presence{}),
#iq{type = result,
sub_els =
[#pubsub{
publish = #ps_publish{
node = ?NS_MIX_NODES_PRESENCE,
items = [#ps_item{id = PresenceID}]}}]} =
send_recv(
Config,
#iq{type = set, to = Room,
sub_els =
[#pubsub{
publish = #ps_publish{
node = ?NS_MIX_NODES_PRESENCE,
items = [#ps_item{
id = PresenceID,
xml_els = [Presence]}]}}]}),
#message{from = Room,
sub_els =
[#ps_event{
items = #ps_items{
node = ?NS_MIX_NODES_PRESENCE,
items = [#ps_item{
id = PresenceID,
xml_els = [Presence]}]}}]} =
recv_message(Config),
%% Coming offline
send(Config, #presence{type = unavailable, to = Room}),
%% Receiving presence retract event
#message{from = Room,
sub_els = [#ps_event{
items = #ps_items{
node = ?NS_MIX_NODES_PRESENCE,
retract = PresenceID}}]} =
recv_message(Config),
%% Leaving
#iq{type = result, sub_els = []} =
send_recv(Config, #iq{type = set, to = Room, sub_els = [#mix_leave{}]}),
#message{from = Room,
sub_els =
[#ps_event{
items = #ps_items{
node = ?NS_MIX_NODES_PARTICIPANTS,
retract = ParticipantID}}]} =
recv_message(Config),
put_event(Config, disconnect),
disconnect(Config).
all_slave(Config) ->
disconnect = get_event(Config),
disconnect(Config).
%%%===================================================================
%%% Internal functions
%%%===================================================================
single_test(T) ->
list_to_atom("mix_" ++ atom_to_list(T)).
master_slave_test(T) ->
{list_to_atom("mix_" ++ atom_to_list(T)), [parallel],
[list_to_atom("mix_" ++ atom_to_list(T) ++ "_master"),
list_to_atom("mix_" ++ atom_to_list(T) ++ "_slave")]}.
|