Add tests for duplicate occupant-id handling

This commit is contained in:
Paweł Chmielowski
2025-04-16 11:39:30 +02:00
parent c98739d5b5
commit 602a42f5ce
8 changed files with 79 additions and 4 deletions
@@ -14,6 +14,7 @@ define_macro:
mod_muc:
db_type: internal
vcard: VCARD
mod_muc_occupantid: []
mod_offline:
db_type: internal
mod_privacy:
@@ -22,6 +22,7 @@ define_macro:
db_type: sql
ram_db_type: sql
vcard: VCARD
mod_muc_occupantid: []
mod_offline:
use_cache: true
db_type: sql
@@ -22,6 +22,7 @@ define_macro:
db_type: sql
ram_db_type: sql
vcard: VCARD
mod_muc_occupantid: []
mod_offline:
use_cache: true
db_type: sql
@@ -22,6 +22,7 @@ define_macro:
db_type: sql
ram_db_type: sql
vcard: VCARD
mod_muc_occupantid: []
mod_offline:
use_cache: true
db_type: sql
@@ -15,6 +15,7 @@ define_macro:
mod_muc:
db_type: internal
vcard: VCARD
mod_muc_occupantid: []
mod_offline:
db_type: internal
mod_privacy:
@@ -1,5 +1,8 @@
define_macro:
SQLITE_CONFIG:
auth_stored_password_types:
- plain
- scram_sha256
sql_type: sqlite
sql_pool_size: 1
auth_method: sql
@@ -17,6 +20,7 @@ define_macro:
db_type: sql
ram_db_type: sql
vcard: VCARD
mod_muc_occupantid: []
mod_offline:
db_type: sql
mod_privacy:
+1
View File
@@ -123,6 +123,7 @@ modules:
vcard: VCARD
mod_muc:
vcard: VCARD
mod_muc_occupantid: []
mod_muc_admin: []
mod_carboncopy: []
mod_jidprep: []
+69 -4
View File
@@ -304,7 +304,70 @@ master_slave_cases() ->
master_slave_test(config_allow_voice_requests),
master_slave_test(config_voice_request_interval),
master_slave_test(config_visitor_nickchange),
master_slave_test(join_conflict)]}.
master_slave_test(join_conflict),
master_slave_test(duplicate_occupantid)
]}.
duplicate_occupantid_master(Config) ->
Room = muc_room_jid(Config),
PeerJID = ?config(slave, Config),
PeerNick = ?config(slave_nick, Config),
PeerNickJID = jid:replace_resource(Room, PeerNick),
MyNick = ?config(nick, Config),
MyNickJID = jid:replace_resource(Room, MyNick),
ok = join_new(Config),
wait_for_slave(Config),
Pres = ?match(#presence{from = PeerNickJID, type = available} = Pres,
recv_presence(Config), Pres),
?match(#muc_user{items = [#muc_item{jid = PeerJID,
role = participant,
affiliation = none}]},
xmpp:get_subtag(Pres, #muc_user{})),
OccupantId = ?match([#occupant_id{id = Id}], xmpp:get_subtags(Pres, #occupant_id{}), Id),
Pres2 = ?match(#presence{from = PeerNickJID, type = available} = Pres2,
recv_presence(Config), Pres2),
?match([#occupant_id{id = OccupantId}], xmpp:get_subtags(Pres2, #occupant_id{})),
Body = xmpp:mk_text(<<"test-1">>),
Msg = ?match(#message{type = groupchat, from = PeerNickJID,
body = Body} = Msg, recv_message(Config), Msg),
?match([#occupant_id{id = OccupantId}], xmpp:get_subtags(Msg, #occupant_id{})),
recv_muc_presence(Config, PeerNickJID, unavailable),
ok = leave(Config),
disconnect(Config).
duplicate_occupantid_slave(Config) ->
Room = muc_room_jid(Config),
MyNick = ?config(slave_nick, Config),
MyNickJID = jid:replace_resource(Room, MyNick),
PeerNick = ?config(master_nick, Config),
PeerNickJID = jid:replace_resource(Room, PeerNick),
wait_for_master(Config),
send(Config, #presence{to = MyNickJID, sub_els = [#muc{}]}),
?match(#presence{from = Room, type = available}, recv_presence(Config)),
OccupantId = case recv_presence(Config) of
#presence{from = MyNickJID, type = available} = Pres ->
recv_muc_presence(Config, PeerNickJID, available),
?match([#occupant_id{id = Id}], xmpp:get_subtags(Pres, #occupant_id{}), Id);
#presence{from = PeerNickJID, type = available} ->
Pres2 = ?match(#presence{from = MyNickJID, type = available} = Pres2,
recv_presence(Config), Pres2),
?match([#occupant_id{id = Id}], xmpp:get_subtags(Pres2, #occupant_id{}), Id)
end,
?match(#message{type = groupchat, from = Room}, recv_message(Config)),
send(Config, #presence{to = Room, sub_els = [#occupant_id{id = <<"fake1">>},
#occupant_id{id = <<"fake2">>}]}),
Pres3 = ?match(#presence{from = MyNickJID, type = available} = Pres3,
recv_presence(Config), Pres3),
?match([#occupant_id{id = OccupantId}], xmpp:get_subtags(Pres3, #occupant_id{})),
Body = xmpp:mk_text(<<"test-1">>),
send(Config, #message{to = Room, type = groupchat, body = Body,
sub_els = [#occupant_id{id = <<"fake1">>},
#occupant_id{id = <<"fake2">>}]}),
Msg = ?match(#message{type = groupchat, from = MyNickJID,
body = Body} = Msg, recv_message(Config), Msg),
?match([#occupant_id{id = OccupantId}], xmpp:get_subtags(Msg, #occupant_id{})),
ok = leave(Config),
disconnect(Config).
join_conflict_master(Config) ->
ok = join_new(Config),
@@ -1628,7 +1691,7 @@ join(Config, Role, Aff) when is_atom(Role), is_atom(Aff) ->
join(Config, Role, #muc{} = SubEl) when is_atom(Role) ->
join(Config, Role, none, SubEl).
join(Config, Role, Aff, SubEl) ->
join(Config, Role, Aff, SubEls) when is_list(SubEls) ->
ct:comment("Joining existing room as ~s/~s", [Aff, Role]),
MyJID = my_jid(Config),
Room = muc_room_jid(Config),
@@ -1636,7 +1699,7 @@ join(Config, Role, Aff, SubEl) ->
MyNickJID = jid:replace_resource(Room, MyNick),
PeerNick = ?config(peer_nick, Config),
PeerNickJID = jid:replace_resource(Room, PeerNick),
send(Config, #presence{to = MyNickJID, sub_els = [SubEl]}),
send(Config, #presence{to = MyNickJID, sub_els = SubEls}),
case recv_presence(Config) of
#presence{type = error, from = MyNickJID} = Err ->
xmpp:get_subtag(Err, #stanza_error{});
@@ -1667,7 +1730,9 @@ join(Config, Role, Aff, SubEl) ->
{History, Subj} = recv_history_and_subject(Config),
{empty, History, Subj, Codes}
end
end.
end;
join(Config, Role, Aff, SubEl) ->
join(Config, Role, Aff, [SubEl]).
leave(Config) ->
leave(Config, muc_room_jid(Config)).