diff --git a/src/gen_mod.erl b/src/gen_mod.erl index 6804d4785..5aeb1df25 100644 --- a/src/gen_mod.erl +++ b/src/gen_mod.erl @@ -308,14 +308,15 @@ store_options(Host, Module, Opts, Order) -> -spec update_module_opts(binary(), module(), opts()) -> ok | {ok, pid()} | error. update_module_opts(Host, Module, NewValues) -> case ets:lookup(ejabberd_modules, {Module, Host}) of - #ejabberd_module{opts = Opts, order = Order} -> + [#ejabberd_module{opts = Opts, order = Order}] -> NewOpts = lists:foldl( fun({K, _} = KV, Acc) -> lists:keystore(K, 1, Acc, KV) end, Opts, NewValues), reload_module(Host, Module, NewOpts, Opts, Order); - _ -> - error + Other -> + ?WARNING_MSG("Unable to update module opts: (~p, ~p) -> ~p", + [Host, Module, Other]) end. maybe_halt_ejabberd() -> diff --git a/test/offline_tests.erl b/test/offline_tests.erl index d86cc36b9..f18fc54f7 100644 --- a/test/offline_tests.erl +++ b/test/offline_tests.erl @@ -175,16 +175,20 @@ flex_slave(Config) -> 0 = get_number(Config), clean(disconnect(Config)). -offline_from_mam_master(Config) -> +from_mam_master(Config) -> + C2 = lists:keystore(mam_enabled, 1, Config, {mam_enabled, true}), + C3 = send_all_master(C2), + lists:keydelete(mam_enabled, 1, C3). + +from_mam_slave(Config) -> Server = ?config(server, Config), gen_mod:update_module_opts(Server, mod_offline, [{use_mam_for_storage, true}]), - send_all_master(Config), + ok = mam_tests:set_default(Config, always), + C2 = lists:keystore(mam_enabled, 1, Config, {mam_enabled, true}), + C3 = send_all_slave(C2), gen_mod:update_module_opts(Server, mod_offline, [{use_mam_for_storage, false}]), - wait_for_slave(Config). - -offline_from_mam_slave(Config) -> - send_all_slave(Config), - wait_for_master(Config). + C4 = lists:keydelete(mam_enabled, 1, C3), + mam_tests:clean(C4). send_all_master(Config) -> wait_for_slave(Config), @@ -196,9 +200,11 @@ send_all_master(Config) -> send(Config, Msg#message{to = BarePeer}), Acc; (Msg, Acc) -> - I = send(Config, Msg#message{to = BarePeer}), - case xmpp:get_subtag(Msg, #xevent{}) of - #xevent{offline = true, id = undefined} -> + I = send(Config, Msg#message{to = BarePeer}), + case {xmpp:get_subtag(Msg, #offline{}), xmpp:get_subtag(Msg, #xevent{})} of + {#offline{}, _} -> + ok; + {_, #xevent{offline = true, id = undefined}} -> ct:comment("Receiving event-reply for:~n~s", [xmpp:pp(Msg)]), #message{} = Reply = recv_message(Config), @@ -222,6 +228,8 @@ send_all_master(Config) -> send_all_slave(Config) -> ServerJID = server_jid(Config), Peer = ?config(peer, Config), + #presence{} = send_recv(Config, #presence{}), + send(Config, #presence{type = unavailable}), wait_for_master(Config), peer_down = get_event(Config), #presence{} = send_recv(Config, #presence{}), @@ -422,12 +430,14 @@ message_iterator(Config) -> Body <- [[], xmpp:mk_text(<<"body">>)], Subject <- [[], xmpp:mk_text(<<"subject">>)], Els <- AllEls], + MamEnabled = ?config(mam_enabled, Config) == true, lists:partition( fun(#message{type = error}) -> true; (#message{type = groupchat}) -> false; - (#message{sub_els = [#offline{}|_]}) -> false; - (#message{sub_els = [_, #xevent{id = I}]}) when I /= undefined -> false; - (#message{sub_els = [#xevent{id = I}]}) when I /= undefined -> false; + (#message{sub_els = [#hint{type = store}|_]}) when MamEnabled -> true; + (#message{sub_els = [#offline{}|_]}) when not MamEnabled -> false; + (#message{sub_els = [_, #xevent{id = I}]}) when I /= undefined, not MamEnabled -> false; + (#message{sub_els = [#xevent{id = I}]}) when I /= undefined, not MamEnabled -> false; (#message{sub_els = [#hint{type = store}|_]}) -> true; (#message{sub_els = [#hint{type = 'no-store'}|_]}) -> false; (#message{body = [], subject = []}) -> false;