From e2932b6e403c75299e518e646750dae4d1d01079 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chrz=C4=85szcz?= Date: Thu, 13 Jun 2024 14:37:51 +0200 Subject: [PATCH 01/10] Instrument user registration --- src/auth/ejabberd_auth.erl | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/auth/ejabberd_auth.erl b/src/auth/ejabberd_auth.erl index 040dd46b811..eb007617b67 100644 --- a/src/auth/ejabberd_auth.erl +++ b/src/auth/ejabberd_auth.erl @@ -64,9 +64,12 @@ -export([remove_domain/3]). -export([on_does_user_exist/3]). +%% Exported for tests +-export([instrumentation/1]). + -ignore_xref([ auth_methods/1, auth_modules/1, check_password/4, get_vh_registered_users/2, - get_vh_registered_users_number/2, start/1, stop/1]). + get_vh_registered_users_number/2, start/1, stop/1, instrumentation/1]). -include("mongoose.hrl"). -include("jlib.hrl"). @@ -97,20 +100,20 @@ start() -> lists:foreach(fun start/1, ?ALL_HOST_TYPES). --spec start(HostType :: mongooseim:host_type()) -> 'ok'. +-spec start(mongooseim:host_type()) -> ok. start(HostType) -> ensure_metrics(HostType), + mongoose_instrument:set_up(instrumentation(HostType)), F = fun(Mod) -> mongoose_gen_auth:start(Mod, HostType) end, call_auth_modules_for_host_type(HostType, F, #{op => map}), - gen_hook:add_handlers(hooks(HostType)), - ok. + gen_hook:add_handlers(hooks(HostType)). --spec stop(HostType :: mongooseim:host_type()) -> 'ok'. +-spec stop(mongooseim:host_type()) -> ok. stop(HostType) -> gen_hook:delete_handlers(hooks(HostType)), F = fun(Mod) -> mongoose_gen_auth:stop(Mod, HostType) end, call_auth_modules_for_host_type(HostType, F, #{op => map}), - ok. + mongoose_instrument:tear_down(instrumentation(HostType)). -spec hooks(mongooseim:host_type()) -> gen_hook:hook_list(). hooks(HostType) -> @@ -229,6 +232,8 @@ do_try_register_if_does_not_exist(_, JID, Password) -> F = fun(HostType, Mod) -> case mongoose_gen_auth:try_register(Mod, HostType, LUser, LServer, Password) of ok -> + mongoose_instrument:execute(auth_register_user, #{host_type => HostType}, + #{count => 1, user => LUser, server => LServer}), mongoose_hooks:register_user(HostType, LServer, LUser), {stop, ok}; {error, _Error} -> @@ -381,6 +386,8 @@ remove_user(#jid{luser = LUser, lserver = LServer}) -> true -> case call_auth_modules_for_domain(LServer, F, #{default => {error, not_allowed}}) of {ok, HostType} -> + mongoose_instrument:execute(auth_unregister_user, #{host_type => HostType}, + #{count => 1, user => LUser, server => LServer}), Acc = mongoose_acc:new(#{location => ?LOCATION, host_type => HostType, lserver => LServer, @@ -593,3 +600,10 @@ is_user_number_below_limit(Domain) -> {error, not_found} -> true end. + +-spec instrumentation(mongooseim:host_type()) -> [mongoose_instrument:spec()]. +instrumentation(HostType) -> + [{auth_register_user, #{host_type => HostType}, + #{metrics => #{count => spiral}}}, + {auth_unregister_user, #{host_type => HostType}, + #{metrics => #{count => spiral}}}]. From 50db67824ae0ee5b8afaca865a5d117895e0f6c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chrz=C4=85szcz?= Date: Thu, 13 Jun 2024 14:38:27 +0200 Subject: [PATCH 02/10] Add instrumentation to mongoose_gen_auth --- src/auth/mongoose_gen_auth.erl | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/auth/mongoose_gen_auth.erl b/src/auth/mongoose_gen_auth.erl index 948816c1fc0..5d3f788317b 100644 --- a/src/auth/mongoose_gen_auth.erl +++ b/src/auth/mongoose_gen_auth.erl @@ -91,6 +91,8 @@ -callback supported_features() -> [Feature::atom()]. +-callback instrumentation(mongooseim:host_type()) -> [mongoose_instrument:spec()]. + %% Implementation of check_password callbacks is required %% for the corresponding check_password interfaces of ejabberd_auth module. %% @@ -119,6 +121,7 @@ remove_user/3, remove_domain/2, supported_features/0, + instrumentation/1, check_password/4, check_password/6]). @@ -128,11 +131,23 @@ -spec start(ejabberd_auth:authmodule(), mongooseim:host_type()) -> ok. start(Mod, HostType) -> + case mongoose_lib:is_exported(Mod, instrumentation, 1) of + true -> + mongoose_instrument:set_up(Mod:instrumentation(HostType)); + false -> + ok + end, Mod:start(HostType). -spec stop(ejabberd_auth:authmodule(), mongooseim:host_type()) -> ok. stop(Mod, HostType) -> - Mod:stop(HostType). + Mod:stop(HostType), + case mongoose_lib:is_exported(Mod, instrumentation, 1) of + true -> + mongoose_instrument:tear_down(Mod:instrumentation(HostType)); + false -> + ok + end. -spec config_spec(ejabberd_auth:authmodule()) -> mongoose_config_spec:config_section(). config_spec(Mod) -> From 387cf7e39a974d8de4af80a37af098344178b928 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chrz=C4=85szcz?= Date: Thu, 13 Jun 2024 14:38:38 +0200 Subject: [PATCH 03/10] Instrument anonymous user registration - 'register' used the hook-related metric; - 'unregister' didn't have any metrics. --- src/auth/ejabberd_auth_anonymous.erl | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/auth/ejabberd_auth_anonymous.erl b/src/auth/ejabberd_auth_anonymous.erl index 88fddb9f542..e43446f158f 100644 --- a/src/auth/ejabberd_auth_anonymous.erl +++ b/src/auth/ejabberd_auth_anonymous.erl @@ -44,7 +44,8 @@ does_user_exist/3, supports_sasl_module/2, get_registered_users/3, - supported_features/0 + supported_features/0, + instrumentation/1 ]). %% Internal @@ -129,6 +130,8 @@ register_connection(Acc, #{host_type := HostType}) when AuthModule =:= ejabberd_auth_anonymous; % login_anon AuthModule =:= cyrsasl_anonymous -> % sasl_anon + mongoose_instrument:execute(auth_anonymous_register_user, #{host_type => HostType}, + #{count => 1, user => LUser, server => LServer}), mongoose_hooks:register_user(HostType, LServer, LUser), US = {LUser, LServer}, ejabberd_auth_anonymous_backend:add_connection(HostType, SID, US), @@ -141,7 +144,10 @@ register_connection(Acc, _Params, _Extra) -> Acc :: mongoose_acc:t(), Params :: map(), Extra :: map(). -unregister_connection(Acc, #{sid := SID, jid := #jid{luser = LUser, lserver = LServer}}, #{host_type := HostType}) -> +unregister_connection(Acc, #{sid := SID, jid := #jid{luser = LUser, lserver = LServer}}, + #{host_type := HostType}) -> + mongoose_instrument:execute(auth_anonymous_unregister_user, #{host_type => HostType}, + #{count => 1, user => LUser, server => LServer}), purge_hook(does_anonymous_user_exist(HostType, LUser, LServer), HostType, LUser, LServer), remove_connection(HostType, SID, LUser, LServer), {ok, Acc}. @@ -280,3 +286,10 @@ anonymous_protocol(HostType) -> -spec supported_features() -> [atom()]. supported_features() -> [dynamic_domains]. + +-spec instrumentation(mongooseim:host_type()) -> [mongoose_instrument:spec()]. +instrumentation(HostType) -> + [{auth_anonymous_register_user, #{host_type => HostType}, + #{metrics => #{count => spiral}}}, + {auth_anonymous_unregister_user, #{host_type => HostType}, + #{metrics => #{count => spiral}}}]. From f84f6e0b9d48a8e57936014907f052a9ec2faa6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chrz=C4=85szcz?= Date: Thu, 13 Jun 2024 14:42:50 +0200 Subject: [PATCH 04/10] Don't instrument the anonymous_purge hook It already has the 'auth_anonymous_unregister_user' event. --- src/instrument/mongoose_instrument_hooks.erl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/instrument/mongoose_instrument_hooks.erl b/src/instrument/mongoose_instrument_hooks.erl index dbf7a310da8..f18a1db1dc4 100644 --- a/src/instrument/mongoose_instrument_hooks.erl +++ b/src/instrument/mongoose_instrument_hooks.erl @@ -80,6 +80,7 @@ is_instrumented(roster_set) -> false; is_instrumented(roster_push) -> false; is_instrumented(register_user) -> false; is_instrumented(remove_user) -> false; +is_instrumented(anonymous_purge) -> false; is_instrumented(privacy_iq_get) -> false; is_instrumented(privacy_iq_set) -> false; is_instrumented(privacy_check_packet) -> false; From ba8f64fd1b81fec0ee8b2257dd7820a7c7ebef11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chrz=C4=85szcz?= Date: Thu, 13 Jun 2024 14:45:25 +0200 Subject: [PATCH 05/10] Remove metric handlers, for which there is new instrumentation Note: no hooks are removed - even for remove_user, which has no handlers now. The hook seems to be useful not only for instrumentation. --- src/metrics/mongoose_metrics_hooks.erl | 30 ++------------------------ 1 file changed, 2 insertions(+), 28 deletions(-) diff --git a/src/metrics/mongoose_metrics_hooks.erl b/src/metrics/mongoose_metrics_hooks.erl index 673f06e9897..b02566dda8e 100644 --- a/src/metrics/mongoose_metrics_hooks.erl +++ b/src/metrics/mongoose_metrics_hooks.erl @@ -22,9 +22,7 @@ user_open_session/3, xmpp_bounce_message/3, xmpp_stanza_dropped/3, - xmpp_send_element/3, - register_user/3, - remove_user/3 + xmpp_send_element/3 ]). %%------------------- @@ -39,9 +37,7 @@ get_hooks(HostType) -> {auth_failed, HostType, fun ?MODULE:auth_failed/3, #{}, 50}, {xmpp_stanza_dropped, HostType, fun ?MODULE:xmpp_stanza_dropped/3, #{}, 50}, {xmpp_bounce_message, HostType, fun ?MODULE:xmpp_bounce_message/3, #{}, 50}, - {xmpp_send_element, HostType, fun ?MODULE:xmpp_send_element/3, #{}, 50}, - {register_user, HostType, fun ?MODULE:register_user/3, #{}, 50}, - {remove_user, HostType, fun ?MODULE:remove_user/3, #{}, 50} + {xmpp_send_element, HostType, fun ?MODULE:xmpp_send_element/3, #{}, 50} | c2s_hooks(HostType)]. -spec c2s_hooks(mongooseim:host_type()) -> gen_hook:hook_list(mongoose_c2s_hooks:fn()). @@ -159,25 +155,3 @@ user_open_session(Acc, _Params, #{host_type := HostType}) -> mongoose_metrics:update(HostType, xmppStanzaCount, 1), mongoose_metrics:update(HostType, xmppIqSent, 1), {ok, Acc}. - -%% Register - -%% #rh --spec register_user(Acc, Params, Extra) -> {ok, Acc} when - Acc :: any(), - Params :: #{jid := jid:jid()}, - Extra :: map(). -register_user(Acc, #{jid := #jid{lserver = LServer}}, _) -> - {ok, HostType} = mongoose_domain_api:get_host_type(LServer), - mongoose_metrics:update(HostType, modRegisterCount, 1), - {ok, Acc}. - --spec remove_user(Acc, Params, Extra) -> {ok, Acc} when - Acc :: mongoose_acc:t(), - Params :: map(), - Extra :: #{host_type := mongooseim:host_type()}. -remove_user(Acc, _, #{host_type := HostType}) -> - mongoose_metrics:update(HostType, modUnregisterCount, 1), - {ok, Acc}. - -%%% vim: set sts=4 ts=4 sw=4 et filetype=erlang foldmarker=%%%',%%%. foldmethod=marker: From d9c5061381431ff3e0838d5889e9406f54a49ad4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chrz=C4=85szcz?= Date: Thu, 13 Jun 2024 14:47:14 +0200 Subject: [PATCH 06/10] Set up auth instrumentation in cleanup test --- test/mongoose_cleanup_SUITE.erl | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/mongoose_cleanup_SUITE.erl b/test/mongoose_cleanup_SUITE.erl index 903d6d0ae7c..0ceea127c02 100644 --- a/test/mongoose_cleanup_SUITE.erl +++ b/test/mongoose_cleanup_SUITE.erl @@ -74,11 +74,16 @@ end_per_group(Group, Config) -> init_per_testcase(s2s, Config) -> mongoose_config:set_opt(s2s_backend, ?config(backend, Config)), Config; +init_per_testcase(auth_anonymous, Config) -> + mongoose_gen_auth:start(ejabberd_auth_anonymous, ?HOST), + Config; init_per_testcase(TestCase, Config) -> start_component_if_needed(?config(needs_component, Config)), start_modules(TestCase, Config), Config. +end_per_testcase(auth_anonymous, _Config) -> + mongoose_gen_auth:stop(ejabberd_auth_anonymous, ?HOST); end_per_testcase(TestCase, Config) -> stop_modules(TestCase, Config), stop_component_if_needed(?config(needs_component, Config)). @@ -169,7 +174,6 @@ notify_self_hook_for_host_type(Acc, #{node := Node}, #{self := Self, host_type : auth_anonymous(_Config) -> HostType = ?HOST, {U, S, R, JID, SID} = get_fake_session(), - ejabberd_auth_anonymous:start(HostType), Info = #{auth_module => cyrsasl_anonymous}, ejabberd_auth_anonymous:register_connection(#{}, #{sid => SID, jid => JID, info => Info}, From e20de881ccc0a0f72a811e725319a2e3a2845938 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chrz=C4=85szcz?= Date: Fri, 14 Jun 2024 13:02:00 +0200 Subject: [PATCH 07/10] Test registration events in accounts_SUITE --- big_tests/tests/accounts_SUITE.erl | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/big_tests/tests/accounts_SUITE.erl b/big_tests/tests/accounts_SUITE.erl index 19d22390f58..0aed0ecffc1 100644 --- a/big_tests/tests/accounts_SUITE.erl +++ b/big_tests/tests/accounts_SUITE.erl @@ -1,13 +1,10 @@ -module(accounts_SUITE). -compile([export_all, nowarn_export_all]). --include_lib("escalus/include/escalus.hrl"). -include_lib("escalus/include/escalus_xmlns.hrl"). - --include_lib("common_test/include/ct.hrl"). -include_lib("eunit/include/eunit.hrl"). - -include_lib("exml/include/exml.hrl"). +-include_lib("jid/include/jid.hrl"). -import(distributed_helper, [mim/0, require_rpc_nodes/1, @@ -37,6 +34,7 @@ all() -> groups() -> [{register, [parallel], [register, + unregister, already_registered, registration_conflict, check_unregistered]}, @@ -68,13 +66,15 @@ change_password_tests() -> %%-------------------------------------------------------------------- init_per_suite(Config1) -> + instrument_helper:start(instrument_helper:declared_events(ejabberd_auth)), ok = dynamic_modules:ensure_modules(host_type(), required_modules()), Config2 = [{mod_register_options, mod_register_options()} | Config1], escalus:init_per_suite([{escalus_user_db, xmpp} | Config2]). end_per_suite(Config) -> escalus_fresh:clean(), - escalus:end_per_suite(Config). + escalus:end_per_suite(Config), + instrument_helper:stop(). required_modules() -> [{mod_register, mod_register_options()}]. @@ -178,7 +178,15 @@ end_per_testcase(CaseName, Config) -> register(Config) -> [{Name1, _UserSpec1}, {Name2, _UserSpec2}] = escalus_users:get_users([alice, bob]), - escalus_fresh:create_users(Config, escalus:get_users([Name1, Name2])). + Config1 = escalus_fresh:create_users(Config, escalus:get_users([Name1, Name2])), + assert_event(auth_register_user, escalus_users:get_jid(Config1, Name1)), + assert_event(auth_register_user, escalus_users:get_jid(Config1, Name2)). + +unregister(Config) -> + UserSpec = escalus_fresh:freshen_spec(Config, alice), + escalus_users:create_user(Config, {alice, UserSpec}), + escalus_users:delete_user(Config, {alice, UserSpec}), + assert_event(auth_unregister_user, escalus_users:get_jid(Config, UserSpec)). already_registered(Config) -> escalus_fresh:story(Config, [{alice, 1}], fun(Alice) -> @@ -444,3 +452,10 @@ enable_watcher(Config, Watcher) -> disable_watcher(Config) -> restore_mod_register_options(Config). + +%% Instrumentation events + +assert_event(EventName, BinJid) -> + #jid{luser = LUser, lserver = LServer} = jid:from_binary(BinJid), + instrument_helper:assert(EventName, #{host_type => host_type()}, + fun(M) -> M =:= #{count => 1, user => LUser, server => LServer} end). From 8af75afaa94221bb89070f118ebc8055952810a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chrz=C4=85szcz?= Date: Fri, 14 Jun 2024 13:01:22 +0200 Subject: [PATCH 08/10] Add anonymous_host_type - to be used in anonymous_SUIE --- big_tests/dynamic_domains.config | 1 + big_tests/test.config | 1 + big_tests/tests/domain_helper.erl | 6 ++++++ 3 files changed, 8 insertions(+) diff --git a/big_tests/dynamic_domains.config b/big_tests/dynamic_domains.config index 1092938d655..a8a0162094b 100644 --- a/big_tests/dynamic_domains.config +++ b/big_tests/dynamic_domains.config @@ -6,6 +6,7 @@ {host_type, <<"test type">>}, {secondary_domain, <<"domain.example.org">>}, {secondary_host_type, <<"test type">>}, + {anonymous_host_type, <<"anonymous">>}, {dynamic_domains, [{<<"test type">>, [<<"domain.example.com">>, <<"domain.example.org">>]}, {<<"anonymous">>, [<<"anonymous.example.com">>]}]}, {muc_service, <<"groupchats.domain.example.com">>}, diff --git a/big_tests/test.config b/big_tests/test.config index f225416a9cf..c7bf3ae4c97 100644 --- a/big_tests/test.config +++ b/big_tests/test.config @@ -24,6 +24,7 @@ {secondary_domain, <<"localhost.bis">>}, {reloaded_domain, <<"sogndal">>}, {secondary_host_type, <<"localhost.bis">>}, + {anonymous_host_type, <<"anonymous.localhost">>}, {muc_service, <<"muc.localhost">>}, {muc_service_pattern, <<"muc.@HOST@">>}, {muc_light_service, <<"muclight.localhost">>}, diff --git a/big_tests/tests/domain_helper.erl b/big_tests/tests/domain_helper.erl index 96b64d92c16..23cd7ed6889 100644 --- a/big_tests/tests/domain_helper.erl +++ b/big_tests/tests/domain_helper.erl @@ -41,6 +41,12 @@ secondary_host_type() -> secondary_host_type(NodeKey) -> get_or_fail({hosts, NodeKey, secondary_host_type}). +anonymous_host_type() -> + anonymous_host_type(mim). + +anonymous_host_type(NodeKey) -> + get_or_fail({hosts, NodeKey, anonymous_host_type}). + make_metrics_prefix(HostType) -> metrics_helper:make_host_type_name(HostType). From 6b90c51dbb63cd5d14a5c775a1809d4f7d3e0805 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chrz=C4=85szcz?= Date: Fri, 14 Jun 2024 13:02:42 +0200 Subject: [PATCH 09/10] Test registration events in anonymous_SUITE --- big_tests/tests/anonymous_SUITE.erl | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/big_tests/tests/anonymous_SUITE.erl b/big_tests/tests/anonymous_SUITE.erl index d3e9c852fd9..45b087abf84 100644 --- a/big_tests/tests/anonymous_SUITE.erl +++ b/big_tests/tests/anonymous_SUITE.erl @@ -45,10 +45,12 @@ suite() -> %% Init & teardown %%-------------------------------------------------------------------- init_per_suite(Config) -> + instrument_helper:start(declared_events()), escalus:init_per_suite(Config). end_per_suite(Config) -> - escalus:end_per_suite(Config). + escalus:end_per_suite(Config), + instrument_helper:stop(). init_per_testcase(CaseName, Config0) -> NewUsers = escalus_ct:get_config(escalus_anon_users), @@ -67,23 +69,27 @@ end_per_testcase(CaseName, Config) -> connection_is_registered_with_sasl_anon(Config) -> escalus:story(Config, [{jon, 1}], fun(Jon) -> JID = jid:from_binary(escalus_client:short_jid(Jon)), + assert_event(auth_anonymous_register_user, JID), OrigName = escalus_users:get_username(Config, jon), ?assertNotEqual(OrigName, JID#jid.luser), F = fun() -> rpc(mim(), ejabberd_auth, does_user_exist, [JID]) end, true = F(), escalus_connection:kill(Jon), - mongoose_helper:wait_until(F, false) + mongoose_helper:wait_until(F, false), + assert_event(auth_anonymous_unregister_user, JID) end). connection_is_registered_with_login(Config) -> escalus:story(Config, [{anna, 1}], fun(Anna) -> JID = jid:from_binary(escalus_client:short_jid(Anna)), + assert_event(auth_anonymous_register_user, JID), OrigName = escalus_users:get_username(Config, anna), ?assertEqual(OrigName, JID#jid.luser), F = fun() -> rpc(mim(), ejabberd_auth, does_user_exist, [JID]) end, true = F(), escalus_connection:kill(Anna), - mongoose_helper:wait_until(F, false) + mongoose_helper:wait_until(F, false), + assert_event(auth_anonymous_register_user, JID) end). messages_story(Config) -> @@ -94,3 +100,15 @@ messages_story(Config) -> %% Below's dirty, but there is no other easy way... escalus_assert:is_chat_message(<<"Hi!">>, Stanza) end). + +%% Helpers + +declared_events() -> + instrument_helper:declared_events(ejabberd_auth_anonymous, [host_type()]). + +host_type() -> + domain_helper:anonymous_host_type(). + +assert_event(EventName, #jid{luser = LUser, lserver = LServer}) -> + instrument_helper:assert(EventName, #{host_type => host_type()}, + fun(M) -> M =:= #{count => 1, user => LUser, server => LServer} end). From d2ab907f8c10a5593cf416f4e9dfe240945e928a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chrz=C4=85szcz?= Date: Fri, 14 Jun 2024 13:03:12 +0200 Subject: [PATCH 10/10] Remove registration metrics tests They are now covered by the events checked in accounts_SUITE --- big_tests/tests/metrics_register_SUITE.erl | 117 --------------------- 1 file changed, 117 deletions(-) delete mode 100644 big_tests/tests/metrics_register_SUITE.erl diff --git a/big_tests/tests/metrics_register_SUITE.erl b/big_tests/tests/metrics_register_SUITE.erl deleted file mode 100644 index 3a77c876a57..00000000000 --- a/big_tests/tests/metrics_register_SUITE.erl +++ /dev/null @@ -1,117 +0,0 @@ -%%============================================================================== -%% Copyright 2013 Erlang Solutions Ltd. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -%%============================================================================== - --module(metrics_register_SUITE). --compile([export_all, nowarn_export_all]). - --include_lib("escalus/include/escalus.hrl"). --include_lib("common_test/include/ct.hrl"). - --define(WAIT_TIME, 500). --define(RT_WAIT_TIME, 60000). - --import(distributed_helper, [mim/0, - require_rpc_nodes/1, - rpc/4]). - --import(metrics_helper, [assert_counter/2, - get_counter_value/1]). - --import(domain_helper, [host_type/0]). - -%%-------------------------------------------------------------------- -%% Suite configuration -%%-------------------------------------------------------------------- - -all() -> - [{group, registration}]. - -groups() -> - [{registration, [sequence], [register, - unregister]}]. - -suite() -> - require_rpc_nodes([mim]) ++ escalus:suite(). - -%%-------------------------------------------------------------------- -%% Init & teardown -%%-------------------------------------------------------------------- - -init_per_suite(Config) -> - escalus:init_per_suite(Config). - -end_per_suite(Config) -> - escalus:end_per_suite(Config). - -init_per_group(_GroupName, Config) -> - Config. - -end_per_group(_GroupName, _Config) -> - ok. - -init_per_testcase(unregister, Config) -> - Alice = escalus_users:get_user_by_name(alice), - escalus_users:create_user(Config, Alice), - Config; -init_per_testcase(registered_users, Config) -> - case rpc(mim(), mongoose_config, get_opt, [[{auth, host_type()}, methods], []]) of - [external] -> - {skip, "counter not supported with ejabberd_auth_external"}; - [anonymous] -> - {skip, "counter not supported with anonymous authentication"}; - _ -> - Config - end; -init_per_testcase(_CaseName, Config) -> - Config. - -end_per_testcase(unregister, _Config) -> - ok; -end_per_testcase(_CaseName, Config) -> - Alice = escalus_users:get_user_by_name(alice), - escalus_users:delete_user(Config, Alice). - -%%-------------------------------------------------------------------- -%% Registration tests -%%-------------------------------------------------------------------- - -register(Config) -> - {value, Registrations} = get_counter_value(modRegisterCount), - - Alice = escalus_users:get_user_by_name(alice), - escalus_users:create_user(Config, Alice), - wait_for_registrations(Registrations + 1). - -unregister(Config) -> - {value, Deregistrations} = get_counter_value(modUnregisterCount), - - Alice = escalus_users:get_user_by_name(alice), - escalus_users:delete_user(Config, Alice), - wait_for_deregistrations(Deregistrations + 1). - -%%-------------------------------------------------------------------- -%% Helpers -%%-------------------------------------------------------------------- - -wait_for_registrations(Count) -> - mongoose_helper:wait_until(fun() -> assert_counter(Count, modRegisterCount) end, - {value, Count}, - #{name => assert_counter}). - -wait_for_deregistrations(Count) -> - mongoose_helper:wait_until(fun() -> assert_counter(Count, modUnregisterCount) end, - {value, Count}, - #{name => assert_counter}).