From b1ad29c3ad566e54dd09919f6b1a47d1b8d3e6e9 Mon Sep 17 00:00:00 2001 From: Mikhail Uvarov Date: Thu, 29 Apr 2021 14:54:49 +0200 Subject: [PATCH 1/5] Reorder fields in i_muc_light_blocking index --- doc/migrations/4.2.0_4.3.0.md | 30 +++++++++++++++++++++++++++++- priv/mssql2012.sql | 2 +- priv/mysql.sql | 2 +- priv/pg.sql | 2 +- 4 files changed, 32 insertions(+), 4 deletions(-) diff --git a/doc/migrations/4.2.0_4.3.0.md b/doc/migrations/4.2.0_4.3.0.md index a05a1a374ea..763f7a7eaff 100644 --- a/doc/migrations/4.2.0_4.3.0.md +++ b/doc/migrations/4.2.0_4.3.0.md @@ -31,7 +31,7 @@ ALTER TABLE inbox ADD PRIMARY KEY USING BTREE(lserver, luser, remote_bare_jid); COMMIT; CREATE INDEX i_inbox_timestamp ON inbox(lserver, luser, timestamp); -DROP INDEX i_inbox; +DROP INDEX i_inbox ON inbox; ``` For MSSQL: @@ -50,3 +50,31 @@ ALTER TABLE inbox ADD CONSTRAINT PK_inbox PRIMARY KEY CLUSTERED( lserver ASC, luser ASC, remote_bare_jid ASC); GO ``` + +### MUC-light indexes + +Order of fields in `i_muc_light_blocking` has changed. + +For Postgres: + +```sql +CREATE INDEX i_muc_light_blocking_su ON muc_light_blocking (lserver, luser); +DROP INDEX i_muc_light_blocking; +``` + +For MySQL: + +```sql +CREATE INDEX i_muc_light_blocking_su USING BTREE ON muc_light_blocking (lserver, luser); +DROP INDEX i_muc_light_blocking ON muc_light_blocking;; +``` + +For MSSQL: + +```sql +CREATE INDEX i_muc_light_blocking_su ON muc_light_blocking (lserver, luser); +GO + +DROP INDEX i_muc_light_blocking ON muc_light_blocking; +GO +``` diff --git a/priv/mssql2012.sql b/priv/mssql2012.sql index 658a47814ad..81488ad16da 100644 --- a/priv/mssql2012.sql +++ b/priv/mssql2012.sql @@ -471,7 +471,7 @@ CREATE TABLE dbo.muc_light_blocking( ) GO -CREATE INDEX i_muc_light_blocking ON muc_light_blocking(luser, lserver); +CREATE INDEX i_muc_light_blocking_su ON muc_light_blocking(lserver, luser); GO -- luser, lserver and remote_bare_jid have 250 characters in MySQL diff --git a/priv/mysql.sql b/priv/mysql.sql index 02f44e58212..6402f2f1949 100644 --- a/priv/mysql.sql +++ b/priv/mysql.sql @@ -353,7 +353,7 @@ CREATE TABLE muc_light_blocking( ) CHARACTER SET utf8mb4 ROW_FORMAT=DYNAMIC; -CREATE INDEX i_muc_light_blocking USING HASH ON muc_light_blocking(luser, lserver); +CREATE INDEX i_muc_light_blocking_su USING BTREE ON muc_light_blocking(lserver, luser); CREATE TABLE muc_rooms( id SERIAL, diff --git a/priv/pg.sql b/priv/pg.sql index 0df7b367a02..56f22f9acd9 100644 --- a/priv/pg.sql +++ b/priv/pg.sql @@ -337,7 +337,7 @@ CREATE TABLE muc_light_blocking( who VARCHAR(500) NOT NULL ); -CREATE INDEX i_muc_light_blocking ON muc_light_blocking (luser, lserver); +CREATE INDEX i_muc_light_blocking_su ON muc_light_blocking (lserver, luser); CREATE TABLE inbox ( luser VARCHAR(250) NOT NULL, From a5f610faef7a16f65e64997faedb884bc1459d05 Mon Sep 17 00:00:00 2001 From: Mikhail Uvarov Date: Thu, 29 Apr 2021 16:34:46 +0200 Subject: [PATCH 2/5] Handle remove_domain in muc_light --- big_tests/tests/domain_removal_SUITE.erl | 29 ++++++++- src/muc_light/mod_muc_light.erl | 14 ++++- src/muc_light/mod_muc_light_db.erl | 3 + src/muc_light/mod_muc_light_db_mnesia.erl | 5 ++ src/muc_light/mod_muc_light_db_rdbms.erl | 71 ++++++++++++++++++----- 5 files changed, 105 insertions(+), 17 deletions(-) diff --git a/big_tests/tests/domain_removal_SUITE.erl b/big_tests/tests/domain_removal_SUITE.erl index 2366bb853f5..14b7e3aa233 100644 --- a/big_tests/tests/domain_removal_SUITE.erl +++ b/big_tests/tests/domain_removal_SUITE.erl @@ -12,7 +12,8 @@ -export([mam_pm_removal/1, mam_muc_removal/1, - inbox_removal/1]). + inbox_removal/1, + muc_light_removal/1]). -import(distributed_helper, [mim/0, rpc/4]). @@ -24,13 +25,15 @@ all() -> [{group, mam_removal}, - {group, inbox_removal}]. + {group, inbox_removal}, + {group, muc_light_removal}]. groups() -> [ {mam_removal, [], [mam_pm_removal, mam_muc_removal]}, - {inbox_removal, [], [inbox_removal]} + {inbox_removal, [], [inbox_removal]}, + {muc_light_removal, [], [muc_light_removal]} ]. domain() -> @@ -71,6 +74,8 @@ group_to_modules(mam_removal) -> MH = muc_light_helper:muc_host(), [{mod_mam_meta, [{backend, rdbms}, {pm, []}, {muc, [{host, MH}]}]}, {mod_muc_light, []}]; +group_to_modules(muc_light_removal) -> + [{mod_muc_light, [{backend, rdbms}]}]; group_to_modules(inbox_removal) -> [{mod_inbox, []}]. @@ -126,5 +131,23 @@ inbox_removal(Config) -> inbox_helper:get_inbox(Bob, #{count => 0, unread_messages => 0, active_conversations => 0}) end). +muc_light_removal(Config0) -> + F = fun(Config, Alice) -> + Room = muc_helper:fresh_room_name(), + MucHost = muc_light_helper:muc_host(), + muc_light_helper:create_room(Room, MucHost, alice, + [alice], Config, muc_light_helper:ver(1)), + RoomAddr = <>, + escalus:send(Alice, escalus_stanza:groupchat_to(RoomAddr, <<"text">>)), + escalus:wait_for_stanza(Alice), + {ok, _RoomConfig, _AffUsers, _Version} = get_room_info(Room, MucHost), + run_remove_domain(), + {error, not_exists} = get_room_info(Room, MucHost) + end, + escalus_fresh:story_with_config(Config0, [{alice, 1}], F). + run_remove_domain() -> rpc(mim(), mongoose_hooks, remove_domain, [domain(), domain()]). + +get_room_info(RoomU, RoomS) -> + rpc(mim(), mod_muc_light_db_backend, get_info, [{RoomU, RoomS}]). diff --git a/src/muc_light/mod_muc_light.erl b/src/muc_light/mod_muc_light.erl index bb62db275c8..d81e6d75627 100644 --- a/src/muc_light/mod_muc_light.erl +++ b/src/muc_light/mod_muc_light.erl @@ -45,6 +45,7 @@ -export([prevent_service_unavailable/4, get_muc_service/5, remove_user/3, + remove_domain/3, add_rooms_to_roster/2, process_iq_get/5, process_iq_set/4, @@ -149,7 +150,8 @@ start(Host, Opts) -> true -> ejabberd_hooks:add(roster_get, Host, ?MODULE, add_rooms_to_roster, 50) end, - TrackedDBFuns = [create_room, destroy_room, room_exists, get_user_rooms, remove_user, + TrackedDBFuns = [create_room, destroy_room, room_exists, get_user_rooms, + remove_user, remove_domain, get_config, set_config, get_blocking, set_blocking, get_aff_users, modify_aff_users], gen_mod:start_backend_module(mod_muc_light_db, Opts, TrackedDBFuns), @@ -252,6 +254,7 @@ hooks(Host, MUCHost) -> {offline_groupchat_message_hook, Host, ?MODULE, prevent_service_unavailable, 90}, {remove_user, Host, ?MODULE, remove_user, 50}, + {remove_domain, Host, ?MODULE, remove_domain, 50}, {disco_local_items, Host, ?MODULE, get_muc_service, 50}]. %%==================================================================== @@ -363,6 +366,15 @@ remove_user(Acc, User, Server) -> Acc end. +-spec remove_domain(mongoose_hooks:simple_acc(), + mongooseim:host_type(), jid:lserver()) -> + mongoose_hooks:simple_acc(). +remove_domain(Acc, HostType, Domain) -> + MUCHost = gen_mod:get_module_opt_subhost(Domain, ?MODULE, default_host()), +?LOG_ERROR(#{what => remove_domain_muc, host_type => HostType, domain => Domain}), + mod_muc_light_db_backend:remove_domain(HostType, MUCHost, Domain), + Acc. + -spec add_rooms_to_roster(Acc :: mongoose_acc:t(), UserJID :: jid:jid()) -> mongoose_acc:t(). add_rooms_to_roster(Acc, UserJID) -> UserUS = jid:to_lus(UserJID), diff --git a/src/muc_light/mod_muc_light_db.erl b/src/muc_light/mod_muc_light_db.erl index d6a86f5d961..fc05f4047aa 100644 --- a/src/muc_light/mod_muc_light_db.erl +++ b/src/muc_light/mod_muc_light_db.erl @@ -50,6 +50,9 @@ -callback remove_user(UserUS :: jid:simple_bare_jid(), Version :: binary()) -> remove_user_return() | {error, term()}. +-callback remove_domain(mongooseim:host_type(), jid:lserver(), jid:lserver()) -> + ok. + %% ------------------------ Configuration manipulation ------------------------ -callback get_config(RoomUS :: jid:simple_bare_jid()) -> diff --git a/src/muc_light/mod_muc_light_db_mnesia.erl b/src/muc_light/mod_muc_light_db_mnesia.erl index 54bd01d0a30..3286eceb91e 100644 --- a/src/muc_light/mod_muc_light_db_mnesia.erl +++ b/src/muc_light/mod_muc_light_db_mnesia.erl @@ -34,6 +34,7 @@ get_user_rooms/2, get_user_rooms_count/2, remove_user/2, + remove_domain/3, get_config/1, set_config/3, @@ -131,6 +132,10 @@ remove_user(UserUS, Version) -> {atomic, Res} = mnesia:transaction(fun remove_user_transaction/2, [UserUS, Version]), Res. +-spec remove_domain(mongooseim:host_type(), jid:lserver(), jid:lserver()) -> ok. +remove_domain(_HostType, _RoomS, _LServer) -> + ok. + %% ------------------------ Configuration manipulation ------------------------ -spec get_config(RoomUS :: jid:simple_bare_jid()) -> diff --git a/src/muc_light/mod_muc_light_db_rdbms.erl b/src/muc_light/mod_muc_light_db_rdbms.erl index ff90bf56a91..d343dc83c34 100644 --- a/src/muc_light/mod_muc_light_db_rdbms.erl +++ b/src/muc_light/mod_muc_light_db_rdbms.erl @@ -34,6 +34,7 @@ get_user_rooms/2, get_user_rooms_count/2, remove_user/2, + remove_domain/3, get_config/1, set_config/3, @@ -67,8 +68,8 @@ %% ------------------------ Backend start/stop ------------------------ -spec start(Host :: jid:server(), MUCHost :: jid:server()) -> ok. -start(Host, _MUCHost) -> - prepare_queries(Host), +start(_Host, _MUCHost) -> + prepare_queries(), ok. -spec stop(Host :: jid:server(), MUCHost :: jid:server()) -> ok. @@ -77,15 +78,16 @@ stop(_Host, _MUCHost) -> %% ------------------------ SQL ------------------------------------------- -prepare_queries(Host) -> - prepare_cleaning_queries(Host), - prepare_room_queries(Host), - prepare_affiliation_queries(Host), - prepare_config_queries(Host), - prepare_blocking_queries(Host), +prepare_queries() -> + prepare_cleaning_queries(), + prepare_room_queries(), + prepare_affiliation_queries(), + prepare_config_queries(), + prepare_blocking_queries(), + prepare_domain_removal_queries(), ok. -prepare_cleaning_queries(_Host) -> +prepare_cleaning_queries() -> mongoose_rdbms:prepare(muc_light_config_delete_all, muc_light_config, [], <<"DELETE FROM muc_light_config">>), mongoose_rdbms:prepare(muc_light_occupants_delete_all, muc_light_occupants, [], @@ -96,7 +98,7 @@ prepare_cleaning_queries(_Host) -> <<"DELETE FROM muc_light_blocking">>), ok. -prepare_room_queries(_Host) -> +prepare_room_queries() -> %% Returns maximum 1 record mongoose_rdbms:prepare(muc_light_select_room_id, muc_light_rooms, [luser, lserver], @@ -133,7 +135,7 @@ prepare_room_queries(_Host) -> " WHERE o.luser = ? AND o.lserver = ?">>), ok. -prepare_affiliation_queries(_Host) -> +prepare_affiliation_queries() -> %% This query uses multiple tables %% Also returns a room version mongoose_rdbms:prepare(muc_light_select_affs_by_us, muc_light_rooms, @@ -164,7 +166,7 @@ prepare_affiliation_queries(_Host) -> "WHERE room_id = ? AND luser = ? AND lserver = ?">>), ok. -prepare_config_queries(_Host) -> +prepare_config_queries() -> mongoose_rdbms:prepare(muc_light_select_config_by_room_id, muc_light_config, [room_id], <<"SELECT opt, val FROM muc_light_config WHERE room_id = ?">>), @@ -188,7 +190,7 @@ prepare_config_queries(_Host) -> <<"DELETE FROM muc_light_config WHERE room_id = ?">>), ok. -prepare_blocking_queries(_Host) -> +prepare_blocking_queries() -> mongoose_rdbms:prepare(muc_light_select_blocking, muc_light_blocking, [luser, lserver], <<"SELECT what, who FROM muc_light_blocking " @@ -218,6 +220,31 @@ prepare_blocking_queries(_Host) -> " WHERE luser = ? AND lserver = ?">>), ok. +prepare_domain_removal_queries() -> + %% RoomS argument + mongoose_rdbms:prepare(muc_light_occupants_remove_room_domain, muc_light_occupants, + ['muc_light_rooms.lserver'], + <<"DELETE FROM muc_light_occupants WHERE room_id IN " + "(SELECT id FROM muc_light_rooms WHERE lserver = ?)">>), + %% User's LServer argument + mongoose_rdbms:prepare(muc_light_occupants_remove_user_domain, muc_light_occupants, + [lserver], + <<"DELETE FROM muc_light_occupants WHERE lserver = ?">>), + %% RoomS argument + mongoose_rdbms:prepare(muc_light_config_remove_room_domain, muc_light_config, + ['muc_light_rooms.lserver'], + <<"DELETE FROM muc_light_config WHERE room_id IN " + "(SELECT id FROM muc_light_rooms WHERE lserver = ?)">>), + %% User's LServer argument + mongoose_rdbms:prepare(muc_light_blocking_remove_user_domain, muc_light_blocking, + [lserver], + <<"DELETE FROM muc_light_blocking WHERE lserver = ?">>), + %% RoomS argument + mongoose_rdbms:prepare(muc_light_rooms_remove_room_domain, muc_light_rooms, + [lserver], + <<"DELETE FROM muc_light_rooms WHERE lserver = ?">>), + ok. + %% ------------------------ Room SQL functions ------------------------ select_room_id(MainHost, RoomU, RoomS) -> @@ -427,6 +454,24 @@ remove_user({_, UserS} = UserUS, Version) -> {atomic, Res} = mongoose_rdbms:sql_transaction(UserS, F), Res. +-spec remove_domain(mongooseim:host_type(), jid:lserver(), jid:lserver()) -> ok. +remove_domain(HostType, RoomS, LServer) -> + F = fun() -> + mongoose_rdbms:execute_successfully( + HostType, muc_light_occupants_remove_room_domain, [RoomS]), + mongoose_rdbms:execute_successfully( + HostType, muc_light_occupants_remove_user_domain, [LServer]), + mongoose_rdbms:execute_successfully( + HostType, muc_light_config_remove_room_domain, [RoomS]), + mongoose_rdbms:execute_successfully( + HostType, muc_light_blocking_remove_user_domain, [LServer]), + mongoose_rdbms:execute_successfully( + HostType, muc_light_rooms_remove_room_domain, [RoomS]), + ok + end, + {atomic, ok} = mongoose_rdbms:sql_transaction(HostType, F), + ok. + %% ------------------------ Configuration manipulation ------------------------ -spec get_config(RoomUS :: jid:simple_bare_jid()) -> From 8e5b4463f1ef3d01330514fae3f44162096d91dc Mon Sep 17 00:00:00 2001 From: Mikhail Uvarov Date: Mon, 3 May 2021 23:51:22 +0200 Subject: [PATCH 3/5] Fix duplicate insert in muc-light tests --- big_tests/tests/domain_removal_SUITE.erl | 4 ++-- big_tests/tests/muc_light_helper.erl | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/big_tests/tests/domain_removal_SUITE.erl b/big_tests/tests/domain_removal_SUITE.erl index 14b7e3aa233..ffcb1d6c024 100644 --- a/big_tests/tests/domain_removal_SUITE.erl +++ b/big_tests/tests/domain_removal_SUITE.erl @@ -110,7 +110,7 @@ mam_muc_removal(Config0) -> Room = muc_helper:fresh_room_name(), MucHost = muc_light_helper:muc_host(), muc_light_helper:create_room(Room, MucHost, alice, - [alice], Config, muc_light_helper:ver(1)), + [], Config, muc_light_helper:ver(1)), RoomAddr = <>, escalus:send(Alice, escalus_stanza:groupchat_to(RoomAddr, <<"text">>)), escalus:wait_for_stanza(Alice), @@ -136,7 +136,7 @@ muc_light_removal(Config0) -> Room = muc_helper:fresh_room_name(), MucHost = muc_light_helper:muc_host(), muc_light_helper:create_room(Room, MucHost, alice, - [alice], Config, muc_light_helper:ver(1)), + [], Config, muc_light_helper:ver(1)), RoomAddr = <>, escalus:send(Alice, escalus_stanza:groupchat_to(RoomAddr, <<"text">>)), escalus:wait_for_stanza(Alice), diff --git a/big_tests/tests/muc_light_helper.erl b/big_tests/tests/muc_light_helper.erl index 64a5a04bb21..c1e747b7700 100644 --- a/big_tests/tests/muc_light_helper.erl +++ b/big_tests/tests/muc_light_helper.erl @@ -27,6 +27,7 @@ create_room(RoomU, MUCHost, Owner, Members, Config, Version) -> RoomUS = {RoomU, MUCHost}, AffUsers = [{to_lus(Owner, Config), owner} | [ {to_lus(Member, Config), member} || Member <- Members ]], + assert_no_aff_duplicates(AffUsers), AffUsersSort = lists:sort(AffUsers), {ok, _RoomUS} = rpc(mim(), mod_muc_light_db_backend, create_room, [RoomUS, DefaultConfig, AffUsersSort, Version]). @@ -257,3 +258,12 @@ ver(Int) -> set_mod_config(K, V, Host) -> true = rpc(mim(), gen_mod, set_module_opt_by_subhost, [Host, mod_muc_light, K, V]). +assert_no_aff_duplicates(AffUsers) -> + Users = [US || {US, _} <- AffUsers], + case lists:sort(Users) =:= lists:usort(Users) of + true -> + ok; + false -> + ct:fail(#{what => assert_no_aff_duplicates, + aff_users => AffUsers}) + end. From f786e9417365430adf7d1146c25cb9e0ac82c7bc Mon Sep 17 00:00:00 2001 From: Mikhail Uvarov Date: Tue, 4 May 2021 10:56:43 +0200 Subject: [PATCH 4/5] Move stanza_blocking_set/1 into muc_light_helper module --- big_tests/tests/muc_light_SUITE.erl | 14 +++----------- big_tests/tests/muc_light_helper.erl | 11 +++++++++++ 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/big_tests/tests/muc_light_SUITE.erl b/big_tests/tests/muc_light_SUITE.erl index 582091b07fd..f520ed7287f 100644 --- a/big_tests/tests/muc_light_SUITE.erl +++ b/big_tests/tests/muc_light_SUITE.erl @@ -88,7 +88,8 @@ stanza_aff_set/2, default_config/0, user_leave/3, - set_mod_config/3 + set_mod_config/3, + stanza_blocking_set/1 ]). -include("muc_light.hrl"). @@ -103,7 +104,7 @@ -type ct_aff_user() :: {EscalusClient :: escalus:client(), Aff :: atom()}. -type ct_aff_users() :: [ct_aff_user()]. --type ct_block_item() :: {What :: atom(), Action :: atom(), Who :: binary()}. +-type ct_block_item() :: muc_light_helper:ct_block_item(). -type verify_fun() :: muc_helper:verify_fun(). -type xmlel() :: exml:element(). @@ -952,15 +953,6 @@ stanza_aff_get(Room, Ver) -> %% IQ setters %%-------------------------------------------------------------------- --spec stanza_blocking_set(BlocklistChanges :: [ct_block_item()]) -> xmlel(). -stanza_blocking_set(BlocklistChanges) -> - Items = [#xmlel{ name = list_to_binary(atom_to_list(What)), - attrs = [{<<"action">>, list_to_binary(atom_to_list(Action))}], - children = [#xmlcdata{ content = Who }] } - || {What, Action, Who} <- BlocklistChanges], - escalus_stanza:to(escalus_stanza:iq_set(?NS_MUC_LIGHT_BLOCKING, Items), ?MUCHOST). - - -spec stanza_destroy_room(Room :: binary()) -> xmlel(). stanza_destroy_room(Room) -> escalus_stanza:to(escalus_stanza:iq_set(?NS_MUC_LIGHT_DESTROY, []), room_bin_jid(Room)). diff --git a/big_tests/tests/muc_light_helper.erl b/big_tests/tests/muc_light_helper.erl index c1e747b7700..340a667d5df 100644 --- a/big_tests/tests/muc_light_helper.erl +++ b/big_tests/tests/muc_light_helper.erl @@ -13,6 +13,9 @@ -type ct_aff_user() :: {EscalusClient :: escalus:client(), Aff :: atom()}. -type ct_aff_users() :: [ct_aff_user()]. +-type ct_block_item() :: {What :: atom(), Action :: atom(), Who :: binary()}. + +-export_type([ct_block_item/0]). -spec room_bin_jid(Room :: binary()) -> binary(). room_bin_jid(Room) -> @@ -267,3 +270,11 @@ assert_no_aff_duplicates(AffUsers) -> ct:fail(#{what => assert_no_aff_duplicates, aff_users => AffUsers}) end. + +-spec stanza_blocking_set(BlocklistChanges :: [ct_block_item()]) -> exml:element(). +stanza_blocking_set(BlocklistChanges) -> + Items = [#xmlel{ name = list_to_binary(atom_to_list(What)), + attrs = [{<<"action">>, list_to_binary(atom_to_list(Action))}], + children = [#xmlcdata{ content = Who }] } + || {What, Action, Who} <- BlocklistChanges], + escalus_stanza:to(escalus_stanza:iq_set(?NS_MUC_LIGHT_BLOCKING, Items), muc_host()). From bce86cfb89345672fba02a68f508b548dabaf2df Mon Sep 17 00:00:00 2001 From: Mikhail Uvarov Date: Tue, 4 May 2021 10:57:25 +0200 Subject: [PATCH 5/5] Test removal from all MUC light tables --- big_tests/tests/domain_removal_SUITE.erl | 55 ++++++++++++++++++++++-- src/muc_light/mod_muc_light_db_rdbms.erl | 6 ++- 2 files changed, 57 insertions(+), 4 deletions(-) diff --git a/big_tests/tests/domain_removal_SUITE.erl b/big_tests/tests/domain_removal_SUITE.erl index ffcb1d6c024..d895c140f5e 100644 --- a/big_tests/tests/domain_removal_SUITE.erl +++ b/big_tests/tests/domain_removal_SUITE.erl @@ -13,7 +13,8 @@ -export([mam_pm_removal/1, mam_muc_removal/1, inbox_removal/1, - muc_light_removal/1]). + muc_light_removal/1, + muc_light_blocking_removal/1]). -import(distributed_helper, [mim/0, rpc/4]). @@ -33,7 +34,8 @@ groups() -> {mam_removal, [], [mam_pm_removal, mam_muc_removal]}, {inbox_removal, [], [inbox_removal]}, - {muc_light_removal, [], [muc_light_removal]} + {muc_light_removal, [], [muc_light_removal, + muc_light_blocking_removal]} ]. domain() -> @@ -133,6 +135,7 @@ inbox_removal(Config) -> muc_light_removal(Config0) -> F = fun(Config, Alice) -> + %% GIVEN a room Room = muc_helper:fresh_room_name(), MucHost = muc_light_helper:muc_host(), muc_light_helper:create_room(Room, MucHost, alice, @@ -140,14 +143,60 @@ muc_light_removal(Config0) -> RoomAddr = <>, escalus:send(Alice, escalus_stanza:groupchat_to(RoomAddr, <<"text">>)), escalus:wait_for_stanza(Alice), + RoomID = select_room_id(domain(), Room, MucHost), + {selected, [_]} = select_affs_by_room_id(domain(), RoomID), + {selected, [_|_]} = select_config_by_room_id(domain(), RoomID), {ok, _RoomConfig, _AffUsers, _Version} = get_room_info(Room, MucHost), + %% WHEN domain hook called run_remove_domain(), - {error, not_exists} = get_room_info(Room, MucHost) + %% THEN Room info not available + {error, not_exists} = get_room_info(Room, MucHost), + %% THEN Tables are empty + {selected, []} = select_affs_by_room_id(domain(), RoomID), + {selected, []} = select_config_by_room_id(domain(), RoomID) end, escalus_fresh:story_with_config(Config0, [{alice, 1}], F). +muc_light_blocking_removal(Config0) -> + F = fun(Config, Alice, Bob) -> + %% GIVEN a room + Room = muc_helper:fresh_room_name(), + MucHost = muc_light_helper:muc_host(), + muc_light_helper:create_room(Room, MucHost, alice, + [], Config, muc_light_helper:ver(1)), + block_muclight_user(Bob, Alice), + [_] = get_blocking(Bob, MucHost), + %% WHEN domain hook called + run_remove_domain(), + [] = get_blocking(Bob, MucHost) + end, + escalus_fresh:story_with_config(Config0, [{alice, 1}, {bob, 1}], F). + run_remove_domain() -> rpc(mim(), mongoose_hooks, remove_domain, [domain(), domain()]). get_room_info(RoomU, RoomS) -> rpc(mim(), mod_muc_light_db_backend, get_info, [{RoomU, RoomS}]). + +select_room_id(MainHost, RoomU, RoomS) -> + {selected, [{DbRoomID}]} = + rpc(mim(), mod_muc_light_db_rdbms, select_room_id, [MainHost, RoomU, RoomS]), + rpc(mim(), mongoose_rdbms, result_to_integer, [DbRoomID]). + +select_affs_by_room_id(MainHost, RoomID) -> + rpc(mim(), mod_muc_light_db_rdbms, select_affs_by_room_id, [MainHost, RoomID]). + +select_config_by_room_id(MainHost, RoomID) -> + rpc(mim(), mod_muc_light_db_rdbms, select_config_by_room_id, [MainHost, RoomID]). + +get_blocking(User, MUCServer) -> + Jid = jid:from_binary(escalus_client:short_jid(User)), + {LUser, LServer, _} = jid:to_lower(Jid), + rpc(mim(), mod_muc_light_db_rdbms, get_blocking, [{LUser, LServer}, MUCServer]). + +block_muclight_user(Bob, Alice) -> + %% Bob blocks Alice + AliceJIDBin = escalus_client:short_jid(Alice), + BlocklistChange = [{user, deny, AliceJIDBin}], + escalus:send(Bob, muc_light_helper:stanza_blocking_set(BlocklistChange)), + escalus:assert(is_iq_result, escalus:wait_for_stanza(Bob)). diff --git a/src/muc_light/mod_muc_light_db_rdbms.erl b/src/muc_light/mod_muc_light_db_rdbms.erl index d343dc83c34..921c7db0687 100644 --- a/src/muc_light/mod_muc_light_db_rdbms.erl +++ b/src/muc_light/mod_muc_light_db_rdbms.erl @@ -52,9 +52,13 @@ %% Extra API for testing -export([ - force_clear/0 + force_clear/0, + select_room_id/3, + select_affs_by_room_id/2, + select_config_by_room_id/2 ]). + -type room_id() :: non_neg_integer(). -include("mongoose.hrl").