diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/acl_test.exs | 389 | ||||
-rw-r--r-- | test/ejabberd_SUITE.erl | 35 | ||||
-rw-r--r-- | test/ejabberd_SUITE_data/ca.key | 50 | ||||
-rw-r--r-- | test/ejabberd_SUITE_data/ca.pem | 34 | ||||
-rw-r--r-- | test/ejabberd_SUITE_data/cert.pem | 80 | ||||
-rw-r--r-- | test/ejabberd_SUITE_data/ejabberd.yml | 2 | ||||
-rwxr-xr-x | test/ejabberd_SUITE_data/gencerts.sh | 2 | ||||
-rw-r--r-- | test/ejabberd_SUITE_data/self-signed-cert.pem | 80 | ||||
-rw-r--r-- | test/ejabberd_admin_test.exs | 88 | ||||
-rw-r--r-- | test/ejabberd_auth_mock.exs | 74 | ||||
-rw-r--r-- | test/ejabberd_hooks_test.exs | 203 | ||||
-rw-r--r-- | test/ejabberd_oauth_mock.exs | 50 | ||||
-rw-r--r-- | test/ejabberd_sm_mock.exs | 121 | ||||
-rw-r--r-- | test/elixir_SUITE.erl | 119 | ||||
-rw-r--r-- | test/jid_test.exs | 45 | ||||
-rw-r--r-- | test/mix_tests.erl | 154 | ||||
-rw-r--r-- | test/mod_admin_extra_test.exs | 374 | ||||
-rw-r--r-- | test/mod_http_api_mock_test.exs | 270 | ||||
-rw-r--r-- | test/mod_http_api_test.exs | 127 | ||||
-rw-r--r-- | test/mod_last_mock.exs | 79 | ||||
-rw-r--r-- | test/mod_roster_mock.exs | 159 | ||||
-rw-r--r-- | test/private_tests.erl | 105 | ||||
-rw-r--r-- | test/suite.erl | 7 | ||||
-rw-r--r-- | test/suite.hrl | 6 | ||||
-rw-r--r-- | test/test_helper.exs | 7 |
25 files changed, 243 insertions, 2417 deletions
diff --git a/test/acl_test.exs b/test/acl_test.exs deleted file mode 100644 index ee2b37ab9..000000000 --- a/test/acl_test.exs +++ /dev/null @@ -1,389 +0,0 @@ -# ---------------------------------------------------------------------- -# -# ejabberd, Copyright (C) 2002-2017 ProcessOne -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -# -# ---------------------------------------------------------------------- - -defmodule ACLTest do - @author "mremond@process-one.net" - - use ExUnit.Case, async: false - - setup_all do - :ok = :mnesia.start - :ejabberd_mnesia.start - :jid.start - :ejabberd_hooks.start_link - :stringprep.start - :ok = :ejabberd_config.start(["domain1", "domain2"], []) - {:ok, _} = :acl.start_link - :ok - end - - setup do - :acl.clear - end - - test "access rule match with user part ACL" do - :acl.add(:global, :basic_acl_1, {:user, "test1"}) - :acl.add(:global, :basic_acl_1, {:user, "test2"}) - :acl.add_access(:global, :basic_rule_1, [{:allow, [{:acl, :basic_acl_1}]}]) - # JID can only be passes as jid record. - # => TODO: Support passing JID as binary. - assert :acl.match_rule(:global, :basic_rule_1, :jid.from_string("test1@domain1")) == :allow - assert :acl.match_rule(:global, :basic_rule_1, :jid.from_string("test1@domain2")) == :allow - assert :acl.match_rule(:global, :basic_rule_1, :jid.from_string("test2@domain1")) == :allow - assert :acl.match_rule(:global, :basic_rule_1, :jid.from_string("test2@domain2")) == :allow - # We match on user part only for local domain. As an implicit rule remote domain are not matched - assert :acl.match_rule(:global, :basic_rule_1, :jid.from_string("test1@otherdomain")) == :deny - assert :acl.match_rule(:global, :basic_rule_1, :jid.from_string("test2@otherdomain")) == :deny - assert :acl.match_rule(:global, :basic_rule_1, :jid.from_string("test11@domain1")) == :deny - - :acl.add(:global, :basic_acl_2, {:user, {"test2", "domain1"}}) - :acl.add_access(:global, :basic_rule_2, [{:allow, [{:acl, :basic_acl_2}]}]) - assert :acl.match_rule(:global, :basic_rule_2, :jid.from_string("test2@domain1")) == :allow - assert :acl.match_rule(:global, :basic_rule_2, :jid.from_string("test2@domain2")) == :deny - assert :acl.match_rule(:global, :basic_rule_2, :jid.from_string("test2@otherdomain")) == :deny - assert :acl.match_rule(:global, :basic_rule_2, {127,0,0,1}) == :deny - end - - test "IP based ACL" do - :acl.add(:global, :ip_acl_1, {:ip, "127.0.0.0/24"}) - :acl.add_access(:global, :ip_rule_1, [{:allow, [{:acl, :ip_acl_1}]}]) - # IP must be expressed as a tuple when calling match rule - assert :acl.match_rule(:global, :ip_rule_1, {127,0,0,1}) == :allow - assert :acl.match_rule(:global, :ip_rule_1, {127,0,1,1}) == :deny - assert :acl.match_rule(:global, :ip_rule_1, :jid.from_string("test1@domain1")) == :deny - end - - test "Access rule are evaluated sequentially" do - :acl.add(:global, :user_acl_1, {:user, {"test1", "domain2"}}) - :acl.add(:global, :user_acl_2, {:user, "test1"}) - :acl.add_access(:global, :user_rule_1, [{:deny, [{:acl, :user_acl_1}]}, {:allow, [{:acl, :user_acl_2}]}]) - assert :acl.match_rule(:global, :user_rule_1, :jid.from_string("test1@domain1")) == :allow - assert :acl.match_rule(:global, :user_rule_1, :jid.from_string("test1@domain2")) == :deny - end - - # Access rules are sometimes used to provide values (i.e.: max_s2s_connections, max_user_sessions) - test "Access rules providing values" do - :acl.add(:global, :user_acl, {:user_regexp, ""}) - :acl.add(:global, :admin_acl, {:user, "admin"}) - :acl.add_access(:global, :value_rule_1, [{10, [{:acl, :admin_acl}]}, {5, [{:acl, :user_acl}]}]) - assert :acl.match_rule(:global, :value_rule_1, :jid.from_string("test1@domain1")) == 5 - assert :acl.match_rule(:global, :value_rule_1, :jid.from_string("admin@domain1")) == 10 - - # If we have no match, :deny is still the default value - # => TODO maybe we should have a match rule which allow passing custom default value ? - assert :acl.match_rule(:global, :value_rule_1, :jid.from_string("user@otherdomain")) == :deny - end - - - # At the moment IP and user rules to no go well together: There is - # no way to combine IP and user restrictions. - # => TODO we need to implement access rules that implement both and will deny the access - # if either IP or user returns deny - test "mixing IP and user access rules" do - :acl.add(:global, :user_acl_1, {:user, "test1"}) - :acl.add(:global, :ip_acl_1, {:ip, "127.0.0.0/24"}) - :acl.add_access(:global, :mixed_rule_1, [{:allow, [{:acl, :user_acl_1}]}, {:allow, [{:acl, :ip_acl_1}]}]) - assert :acl.match_rule(:global, :mixed_rule_1, :jid.from_string("test1@domain1")) == :allow - assert :acl.match_rule(:global, :mixed_rule_1, {127,0,0,1}) == :allow - - :acl.add_access(:global, :mixed_rule_2, [{:deny, [{:acl, :user_acl_1}]}, {:allow, [{:acl, :ip_acl_1}]}]) - assert :acl.match_rule(:global, :mixed_rule_2, :jid.from_string("test1@domain1")) == :deny - assert :acl.match_rule(:global, :mixed_rule_2, {127,0,0,1}) == :allow - end - - test "access_matches works with predefined access rules" do - :acl.add(:global, :user_acl_2, {:user, "user"}) - :acl.add_access(:global, :user_rule_2, [{:allow, [{:acl, :user_acl_2}]}, {:deny, [:all]}]) - - assert :acl.access_matches(:user_rule_2, %{usr: {"user", "domain1", ""}, ip: {127,0,0,1}}, :global) == :allow - assert :acl.access_matches(:user_rule_2, %{usr: {"user2", "domain1", ""}, ip: {127,0,0,1}}, :global) == :deny - end - - test "access_matches rule all always matches" do - assert :acl.access_matches(:all, %{}, :global) == :allow - assert :acl.access_matches(:all, %{usr: {"user", "domain1", ""}, ip: {127,0,0,1}}, :global) == :allow - end - - test "access_matches rule none never matches" do - assert :acl.access_matches(:none, %{}, :global) == :deny - assert :acl.access_matches(:none, %{usr: {"user", "domain1", ""}, ip: {127,0,0,1}}, :global) == :deny - end - - test "access_matches with not existing rule never matches" do - assert :acl.access_matches(:bleble, %{}, :global) == :deny - assert :acl.access_matches(:bleble, %{usr: {"user", "domain1", ""}, ip: {127,0,0,1}}, :global) == :deny - end - - test "access_matches works with inlined access rules" do - :acl.add(:global, :user_acl_3, {:user, "user"}) - - assert :acl.access_matches([{:allow, [{:acl, :user_acl_3}]}, {:deny, [:all]}], - %{usr: {"user", "domain1", ""}, ip: {127,0,0,1}}, :global) == :allow - assert :acl.access_matches([{:allow, [{:acl, :user_acl_3}]}, {:deny, [:all]}], - %{usr: {"user2", "domain1", ""}, ip: {127,0,0,1}}, :global) == :deny - end - - test "access_matches allow to have acl rules inlined" do - assert :acl.access_matches([{:allow, [{:user, "user"}]}, {:deny, [:all]}], - %{usr: {"user", "domain1", ""}, ip: {127,0,0,1}}, :global) == :allow - assert :acl.access_matches([{:allow, [{:user, "user"}]}, {:deny, [:all]}], - %{usr: {"user2", "domain1", ""}, ip: {127,0,0,1}}, :global) == :deny - end - - test "access_matches test have implicit deny at end" do - assert :acl.access_matches([{:allow, [{:user, "user"}]}], - %{usr: {"user", "domain1", ""}, ip: {127,0,0,1}}, :global) == :allow - assert :acl.access_matches([{:allow, [{:user, "user"}]}], - %{usr: {"user2", "domain1", ""}, ip: {127,0,0,1}}, :global) == :deny - end - - test "access_matches requires that all subrules match" do - rules = [{:allow, [{:user, "user"}, {:ip, {{127,0,0,1}, 32}}]}] - assert :acl.access_matches(rules, %{usr: {"user", "domain1", ""}, ip: {127,0,0,1}}, :global) == :allow - assert :acl.access_matches(rules, %{usr: {"user", "domain1", ""}, ip: {127,0,0,2}}, :global) == :deny - assert :acl.access_matches(rules, %{usr: {"user2", "domain1", ""}, ip: {127,0,0,1}}, :global) == :deny - end - - test "access_matches rules are matched in order" do - rules = [{:allow, [{:user, "user"}]}, {:deny, [{:user, "user2"}]}, {:allow, [{:user_regexp, "user"}]}] - assert :acl.access_matches(rules, %{usr: {"user", "domain1", ""}, ip: {127,0,0,1}}, :global) == :allow - assert :acl.access_matches(rules, %{usr: {"user2", "domain1", ""}, ip: {127,0,0,1}}, :global) == :deny - assert :acl.access_matches(rules, %{usr: {"user22", "domain1", ""}, ip: {127,0,0,1}}, :global) == :allow - end - - test "access_matches rules that require ip but no one is provided don't crash" do - rules = [{:allow, [{:ip, {{127,0,0,1}, 32}}]}, - {:allow, [{:user, "user"}]}, - {:allow, [{:user, "user2"}, {:ip, {{127,0,0,1}, 32}}]}] - assert :acl.access_matches(rules, %{usr: {"user", "domain1", ""}}, :global) == :allow - assert :acl.access_matches(rules, %{usr: {"user2", "domain1", ""}}, :global) == :deny - end - - test "access_matches rules that require usr but no one is provided don't crash" do - rules = [{:allow, [{:ip, {{127,0,0,1}, 32}}]}, - {:allow, [{:user, "user"}]}, - {:allow, [{:user, "user2"}, {:ip, {{127,0,0,2}, 32}}]}] - assert :acl.access_matches(rules, %{ip: {127,0,0,1}}, :global) == :allow - assert :acl.access_matches(rules, %{ip: {127,0,0,2}}, :global) == :deny - end - - test "access_matches rules with all always matches" do - rules = [{:allow, [:all]}, {:deny, {:user, "user"}}] - assert :acl.access_matches(rules, %{}, :global) == :allow - assert :acl.access_matches(rules, %{usr: {"user", "domain1", ""}, ip: {127,0,0,1}}, :global) == :allow - end - - test "access_matches rules with {acl, all} always matches" do - rules = [{:allow, [{:acl, :all}]}, {:deny, {:user, "user"}}] - assert :acl.access_matches(rules, %{}, :global) == :allow - assert :acl.access_matches(rules, %{usr: {"user", "domain1", ""}, ip: {127,0,0,1}}, :global) == :allow - end - - test "access_matches rules with none never matches" do - rules = [{:allow, [:none]}, {:deny, [:all]}] - assert :acl.access_matches(rules, %{}, :global) == :deny - assert :acl.access_matches(rules, %{usr: {"user", "domain1", ""}, ip: {127,0,0,1}}, :global) == :deny - end - - test "access_matches with no rules never matches" do - assert :acl.access_matches([], %{}, :global) == :deny - assert :acl.access_matches([], %{usr: {"user", "domain1", ""}, ip: {127,0,0,1}}, :global) == :deny - end - - test "access_matches ip rule accepts {ip, port}" do - rules = [{:allow, [{:ip, {{127,0,0,1}, 32}}]}] - assert :acl.access_matches(rules, %{ip: {{127,0,0,1}, 5000}}, :global) == :allow - assert :acl.access_matches(rules, %{ip: {{127,0,0,2}, 5000}}, :global) == :deny - end - - test "access_matches user rule works" do - rules = [{:allow, [{:user, "user1"}]}] - assert :acl.access_matches(rules, %{usr: {"user1", "domain1", ""}}, :global) == :allow - assert :acl.access_matches(rules, %{usr: {"user2", "domain1", ""}}, :global) == :deny - assert :acl.access_matches(rules, %{usr: {"user1", "domain3", ""}}, :global) == :deny - end - - test "access_matches 2 arg user rule works" do - rules = [{:allow, [{:user, {"user1", "server1"}}]}] - assert :acl.access_matches(rules, %{usr: {"user1", "server1", ""}}, :global) == :allow - assert :acl.access_matches(rules, %{usr: {"user1", "server2", ""}}, :global) == :deny - assert :acl.access_matches(rules, %{usr: {"user2", "server1", ""}}, :global) == :deny - assert :acl.access_matches(rules, %{usr: {"user2", "server2", ""}}, :global) == :deny - end - - test "access_matches server rule works" do - rules = [{:allow, [{:server, "server1"}]}] - assert :acl.access_matches(rules, %{usr: {"user", "server1", ""}}, :global) == :allow - assert :acl.access_matches(rules, %{usr: {"user", "server2", ""}}, :global) == :deny - end - - test "access_matches resource rule works" do - rules = [{:allow, [{:resource, "res1"}]}] - assert :acl.access_matches(rules, %{usr: {"user", "domain1", "res1"}}, :global) == :allow - assert :acl.access_matches(rules, %{usr: {"user", "domain1", "res2"}}, :global) == :deny - assert :acl.access_matches(rules, %{usr: {"user", "domain3", "res1"}}, :global) == :allow - end - - test "access_matches user_regexp rule works" do - rules = [{:allow, [{:user_regexp, "user[0-9]"}]}] - assert :acl.access_matches(rules, %{usr: {"user1", "domain1", "res1"}}, :global) == :allow - assert :acl.access_matches(rules, %{usr: {"userA", "domain1", "res1"}}, :global) == :deny - assert :acl.access_matches(rules, %{usr: {"user1", "domain3", "res1"}}, :global) == :deny - end - - test "access_matches 2 arg user_regexp rule works" do - rules = [{:allow, [{:user_regexp, {"user[0-9]", "server1"}}]}] - assert :acl.access_matches(rules, %{usr: {"user1", "server1", "res1"}}, :global) == :allow - assert :acl.access_matches(rules, %{usr: {"userA", "server1", "res1"}}, :global) == :deny - assert :acl.access_matches(rules, %{usr: {"user1", "server2", "res1"}}, :global) == :deny - end - - test "access_matches server_regexp rule works" do - rules = [{:allow, [{:server_regexp, "server[0-9]"}]}] - assert :acl.access_matches(rules, %{usr: {"user", "server1", ""}}, :global) == :allow - assert :acl.access_matches(rules, %{usr: {"user", "serverA", ""}}, :global) == :deny - end - - test "access_matches resource_regexp rule works" do - rules = [{:allow, [{:resource_regexp, "res[0-9]"}]}] - assert :acl.access_matches(rules, %{usr: {"user", "domain1", "res1"}}, :global) == :allow - assert :acl.access_matches(rules, %{usr: {"user", "domain1", "resA"}}, :global) == :deny - assert :acl.access_matches(rules, %{usr: {"user", "domain3", "res1"}}, :global) == :allow - end - - test "access_matches node_regexp rule works" do - rules = [{:allow, [{:node_regexp, {"user[0-9]", "server[0-9]"}}]}] - assert :acl.access_matches(rules, %{usr: {"user1", "server1", "res1"}}, :global) == :allow - assert :acl.access_matches(rules, %{usr: {"userA", "server1", "res1"}}, :global) == :deny - assert :acl.access_matches(rules, %{usr: {"user1", "serverA", "res1"}}, :global) == :deny - assert :acl.access_matches(rules, %{usr: {"userA", "serverA", "res1"}}, :global) == :deny - end - - test "access_matches user_glob rule works" do - rules = [{:allow, [{:user_glob, "user?"}]}] - assert :acl.access_matches(rules, %{usr: {"user1", "domain1", "res1"}}, :global) == :allow - assert :acl.access_matches(rules, %{usr: {"user11", "domain1", "res1"}}, :global) == :deny - assert :acl.access_matches(rules, %{usr: {"user1", "domain3", "res1"}}, :global) == :deny - end - - test "access_matches 2 arg user_glob rule works" do - rules = [{:allow, [{:user_glob, {"user?", "server1"}}]}] - assert :acl.access_matches(rules, %{usr: {"user1", "server1", "res1"}}, :global) == :allow - assert :acl.access_matches(rules, %{usr: {"user11", "server1", "res1"}}, :global) == :deny - assert :acl.access_matches(rules, %{usr: {"user1", "server2", "res1"}}, :global) == :deny - end - - test "access_matches server_glob rule works" do - rules = [{:allow, [{:server_glob, "server?"}]}] - assert :acl.access_matches(rules, %{usr: {"user", "server1", ""}}, :global) == :allow - assert :acl.access_matches(rules, %{usr: {"user", "server11", ""}}, :global) == :deny - end - - test "access_matches resource_glob rule works" do - rules = [{:allow, [{:resource_glob, "res?"}]}] - assert :acl.access_matches(rules, %{usr: {"user", "domain1", "res1"}}, :global) == :allow - assert :acl.access_matches(rules, %{usr: {"user", "domain1", "res11"}}, :global) == :deny - assert :acl.access_matches(rules, %{usr: {"user", "domain3", "res1"}}, :global) == :allow - end - - test "access_matches node_glob rule works" do - rules = [{:allow, [{:node_glob, {"user?", "server?"}}]}] - assert :acl.access_matches(rules, %{usr: {"user1", "server1", "res1"}}, :global) == :allow - assert :acl.access_matches(rules, %{usr: {"user11", "server1", "res1"}}, :global) == :deny - assert :acl.access_matches(rules, %{usr: {"user1", "server11", "res1"}}, :global) == :deny - assert :acl.access_matches(rules, %{usr: {"user11", "server11", "res1"}}, :global) == :deny - end - - test "transform_access_rules_config expands allow rule" do - assert :acl.transform_access_rules_config([:allow]) == [{:allow, [:all]}] - end - - test "transform_access_rules_config expands deny rule" do - assert :acl.transform_access_rules_config([:deny]) == [{:deny, [:all]}] - end - - test "transform_access_rules_config expands <integer> rule" do - assert :acl.transform_access_rules_config([100]) == [{100, [:all]}] - end - - test "transform_access_rules_config expands <shaper_name> rule" do - assert :acl.transform_access_rules_config([:fast]) == [{:fast, [:all]}] - end - - test "transform_access_rules_config expands allow: <acl_name> rule" do - assert :acl.transform_access_rules_config([{:allow, :test1}]) == [{:allow, [{:acl, :test1}]}] - end - - test "transform_access_rules_config expands deny: <acl_name> rule" do - assert :acl.transform_access_rules_config([{:deny, :test1}]) == [{:deny, [{:acl, :test1}]}] - end - - test "transform_access_rules_config expands integer: <acl_name> rule" do - assert :acl.transform_access_rules_config([{100, :test1}]) == [{100, [{:acl, :test1}]}] - end - - test "transform_access_rules_config expands <shaper_name>: <acl_name> rule" do - assert :acl.transform_access_rules_config([{:fast, :test1}]) == [{:fast, [{:acl, :test1}]}] - end - - test "transform_access_rules_config expands allow rule (no list)" do - assert :acl.transform_access_rules_config(:allow) == [{:allow, [:all]}] - end - - test "transform_access_rules_config expands deny rule (no list)" do - assert :acl.transform_access_rules_config(:deny) == [{:deny, [:all]}] - end - - test "transform_access_rules_config expands <integer> rule (no list)" do - assert :acl.transform_access_rules_config(100) == [{100, [:all]}] - end - - test "transform_access_rules_config expands <shaper_name> rule (no list)" do - assert :acl.transform_access_rules_config(:fast) == [{:fast, [:all]}] - end - - test "access_rules_validator works with <AccessName>" do - assert :acl.access_rules_validator(:my_access) == :my_access - end - - test "shapes_rules_validator works with <AccessName>" do - assert :acl.shaper_rules_validator(:my_access) == :my_access - end - - ## Checking ACL on both user pattern and IP - ## ======================================== - - # Typical example is mod_register - - # Deprecated approach - test "module can test both IP and user through two independent :acl.match_rule check (deprecated)" do - :acl.add(:global, :user_acl, {:user, {"test1", "domain1"}}) - :acl.add(:global, :ip_acl, {:ip, "127.0.0.0/24"}) - :acl.add_access(:global, :user_rule, [{:allow, [{:acl, :user_acl}]}]) - :acl.add_access(:global, :ip_rule, [{:allow, [{:acl, :ip_acl}]}]) - - # acl module in 16.03 is not able to provide a function for compound result: - assert :acl.match_rule(:global, :user_rule, :jid.from_string("test1@domain1")) == :allow - assert :acl.match_rule(:global, :ip_rule, {127,0,0,1}) == :allow - assert :acl.match_rule(:global, :user_rule, :jid.from_string("test2@domain1")) == :deny - assert :acl.match_rule(:global, :ip_rule, {127,0,1,1}) == :deny - end - -end diff --git a/test/ejabberd_SUITE.erl b/test/ejabberd_SUITE.erl index 553eae1e4..1d8de7b8e 100644 --- a/test/ejabberd_SUITE.erl +++ b/test/ejabberd_SUITE.erl @@ -401,7 +401,7 @@ db_tests(riak) -> presence_broadcast, last, roster_tests:single_cases(), - private, + %%private_tests:single_cases(), privacy_tests:single_cases(), vcard_tests:single_cases(), muc_tests:single_cases(), @@ -424,7 +424,7 @@ db_tests(DB) when DB == mnesia; DB == redis -> presence_broadcast, last, roster_tests:single_cases(), - private, + private_tests:single_cases(), privacy_tests:single_cases(), vcard_tests:single_cases(), pubsub_tests:single_cases(), @@ -455,7 +455,7 @@ db_tests(_) -> presence_broadcast, last, roster_tests:single_cases(), - private, + private_tests:single_cases(), privacy_tests:single_cases(), vcard_tests:single_cases(), pubsub_tests:single_cases(), @@ -602,7 +602,7 @@ test_connect_bad_ns_stream(Config) -> test_connect_bad_lang(Config) -> Lang = iolist_to_binary(lists:duplicate(36, $x)), Config0 = init_stream(set_opt(lang, Lang, Config)), - ?recv1(#stream_error{reason = 'policy-violation'}), + ?recv1(#stream_error{reason = 'invalid-xml'}), ?recv1({xmlstreamend, <<"stream:stream">>}), close_socket(Config0). @@ -978,33 +978,6 @@ disco(Config) -> end, Items), disconnect(Config). -private(Config) -> - Conference = #bookmark_conference{name = <<"Some name">>, - autojoin = true, - jid = jid:make( - <<"some">>, - <<"some.conference.org">>, - <<>>)}, - Storage = #bookmark_storage{conference = [Conference]}, - StorageXMLOut = xmpp:encode(Storage), - WrongEl = #xmlel{name = <<"wrong">>}, - #iq{type = error} = - send_recv(Config, #iq{type = get, - sub_els = [#private{sub_els = [WrongEl]}]}), - #iq{type = result, sub_els = []} = - send_recv( - Config, #iq{type = set, - sub_els = [#private{sub_els = [WrongEl, StorageXMLOut]}]}), - #iq{type = result, - sub_els = [#private{sub_els = [StorageXMLIn]}]} = - send_recv( - Config, - #iq{type = get, - sub_els = [#private{sub_els = [xmpp:encode( - #bookmark_storage{})]}]}), - Storage = xmpp:decode(StorageXMLIn), - disconnect(Config). - last(Config) -> true = is_feature_advertised(Config, ?NS_LAST), #iq{type = result, sub_els = [#last{}]} = diff --git a/test/ejabberd_SUITE_data/ca.key b/test/ejabberd_SUITE_data/ca.key index d68386a90..cc59087c6 100644 --- a/test/ejabberd_SUITE_data/ca.key +++ b/test/ejabberd_SUITE_data/ca.key @@ -1,27 +1,27 @@ -----BEGIN RSA PRIVATE KEY----- -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 -----END RSA PRIVATE KEY----- diff --git a/test/ejabberd_SUITE_data/ca.pem b/test/ejabberd_SUITE_data/ca.pem index 4c8e13072..089238d62 100644 --- a/test/ejabberd_SUITE_data/ca.pem +++ b/test/ejabberd_SUITE_data/ca.pem @@ -1,21 +1,21 @@ -----BEGIN CERTIFICATE----- -MIIDazCCAlOgAwIBAgIUa9rEblUCcNwodsydB2e1nKlFVNswDQYJKoZIhvcNAQEL +MIIDazCCAlOgAwIBAgIUUynLQejEU8NykU/YNfL1dyC7vxcwDQYJKoZIhvcNAQEL BQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM -GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0xODA4MjQwOTMwNTZaFw0xODA5 -MjMwOTMwNTZaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw +GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0xODA5MjQxMzE4MjRaFw00NjAy +MDkxMzE4MjRaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQC1zqtXOntX3E8xkIUtJHRAELTIqXgrqKtGaSI5f51T -4eVJw30IZeGvjhO1Hig/ksig6YIeoXx0aj9L5wNqEEkCsbjz9qZlhSBdtArCnbvB -wLnZC9pBWl/Fm0G4SLx90387WuDCC8W9NLqNEK4hFIrb7SgJltVAcK/TctQQSTuU -ANbBmjpp3eFUNCql1FqDM8HeOTfBRcu/lx8dvDH72JPW29O0fUuDNfIt5J7YCCiS -X/mfw/4VCoPYop3yVqX10NESmOFgeZ71vlB3ObwX+JDGsDmzimW17V8h4F0l1xNI -h92f7UAbHHgi3OTz5KzifoH43yV1g7+YRU/LjW9XV9IJAgMBAAGjUzBRMB0GA1Ud -DgQWBBSFGsmx8f2Jkv9ns8Jew5Hs0x6AQTAfBgNVHSMEGDAWgBSFGsmx8f2Jkv9n -s8Jew5Hs0x6AQTAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQCZ -/E+LQUDn1dUgXkQvwtr4LKoJgwrLDycROKcXCM88z73QjAXCXgUtSAbhV8ZcsakL -v5XO3ytu//iHYLUVcT72eN24H8P7jUYV8egmceep1PXUPNl6ukYSs4SAlx9YIxSI -b8CqySYypCztk5aStR51schM6PjDY09UT+x74BtSme3tcUPYBJ1j382zQOp7jBc6 -bW/vL9ouonrfO7GlADwBi7K8y3eaTampIkrogh0YTreDVvz7266CmeCCuaJGNs3C -NNyWBliI0zqpyfU+7uVD5wgBS6ncz9eZcsFpOrh+H1ZpcRLaaYkjf0znYGbLCFuP -w7NWOLnq2KH+n2g5M5nw +AQUAA4IBDwAwggEKAoIBAQDlbFaRIsreJp2nLa/nsVVzukrfTtpYdCqKuD6rk+t5 +EHWcuyuhb5Npd+AHkHX8ZMVK2dJuZzOqmS5bKLiEgH1nMzraRa46lk/HT7DmEfHv +dVbGmytiBoGShCyfwEXzg9+ZEM0bvpM5py6gvN6qc3V15YOA4ZD1rtl6w5Au5kE8 +XqjKx8o6kBHTfl9AzpdppHxOLoqjncOQLPDwyLJKsAck6SDGGZfXX6FQyOV1YISJ +GzVUv+CuiVqOp7cH7C7RR2idn9BR5WTgpGcMgAglIrDxeaBwHigjlxSucOc6a/bv +zhGAlmxnG4YXR7mbPm/wGpeoqIXAf8IPWKdSkwDz0wBNAgMBAAGjUzBRMB0GA1Ud +DgQWBBQGU3AZGF8ahVEnpfHB5ETAW5uIBzAfBgNVHSMEGDAWgBQGU3AZGF8ahVEn +pfHB5ETAW5uIBzAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAK +jIEjOh7k1xaEMBygQob9XGLmyLgmw1GEvWx7wiDpcdHXuAH9mLC4NPNSjOXPNK2V +u4dh1KHy1z+dHJbt2apXejxtiwlcMWmPDF2EtKjstUN+KXecG7vjReArs71T9ir/ +7Xfwfg6TKD3H7efYFJaBb7d/lyneNP1Ive/rkRsGqCglkoX4ajcAm7MLkkFD8TCP +NqFc7SdA4OsaeYiUmjnyTUDbKgG0bDAXymhsUzd6Pa9kKQx+dH4GPiCoNoypCXD7 +RZSlETNGZ0vdxCjpdvT4eYxSIalG4rAU85turqPF/ovdzUzb72Sta0L5Hrf0rLa/ +um3+Xel8qI+p3kErAG2v -----END CERTIFICATE----- diff --git a/test/ejabberd_SUITE_data/cert.pem b/test/ejabberd_SUITE_data/cert.pem index 7e110f0a2..7b82b3ca7 100644 --- a/test/ejabberd_SUITE_data/cert.pem +++ b/test/ejabberd_SUITE_data/cert.pem @@ -1,54 +1,54 @@ -----BEGIN CERTIFICATE----- MIIEjTCCA3WgAwIBAgIBATANBgkqhkiG9w0BAQsFADBFMQswCQYDVQQGEwJBVTET MBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQ -dHkgTHRkMB4XDTE4MDgyNDA5MzA1NloXDTQ2MDEwOTA5MzA1NlowWTELMAkGA1UE +dHkgTHRkMB4XDTE4MDkyNDEzMTgyNFoXDTQ2MDIwOTEzMTgyNFowWTELMAkGA1UE BhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNVBAoTGEludGVybmV0IFdp ZGdpdHMgUHR5IEx0ZDESMBAGA1UEAxMJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEAwLATNFRSFKTfWd0HHoX4uw9lWw5uuq/bAIx9yYKY -TaOr/tQKgzS2EXSnvMngrywJlP1HUzLrp3WNR0CiPIQ0YfeAP3xiSrotEWObRb/0 -YwOZhCbOi0WpWPgZh3ct/XaEHhbnKYtblya1wVrCN/yur3ck+ru4Mka2lfxouKF9 -y8kZn2qF0CEbR/bbJiOy0Cr+q+LCIOiD+iwKHhju6ks+OqmFwXhglE62b7yKZtcu -SddnsimF6n0VXkS2Vm5Kg901Sed7QPtVR6EtIBh7WiwU6iLoOofFjOg3B7v3K8hX -66Scj5V/mz++m2W9BTqkoYRmszPHXnFeF8ZhAzc2ncUWrQIDAQABo4IBcjCCAW4w +AQEFAAOCAQ8AMIIBCgKCAQEA1oQMN4MZ/wEf4SM7chwHZ+ymQ5Knt45VZ0jmgpnK +Fx0p+eJoNegvvwY/80NWTmcgbGnqruJiOh5AEUNDtCD5G/70oz2WHgZBZkuLsopE +a/2sDmwxvUbv1f/mD8iHcDaWUvKAy4TUHFeHDQL28HJom9E7bgYadeuhebwZcsbu +lPFePw+fWM7jLWxkMYClfsdzsBrgerbZVPnAuj77cGXZSQ6p96jOPiJ/mjOVCwWJ +tdlqwme2AC4AwKYdWzc3Ysw8lES/ubMa+lP1Eh9aI8edpHIlC5nYNLVTWa4Xw6Ct +AvqzKtNNJzwypbR3fcDXaWvvO3GY3wOHVC/wyCsL8SXc7QIDAQABo4IBcjCCAW4w CQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2Vy -dGlmaWNhdGUwHQYDVR0OBBYEFEM665UV1uNuXuoj2Lq4YvUig8fMMB8GA1UdIwQY -MBaAFIUaybHx/YmS/2ezwl7DkezTHoBBMDMGA1UdHwQsMCowKKAmoCSGImh0dHA6 +dGlmaWNhdGUwHQYDVR0OBBYEFFvDi47v5xJKOsgQo8MP4JzY6cC/MB8GA1UdIwQY +MBaAFAZTcBkYXxqFUSel8cHkRMBbm4gHMDMGA1UdHwQsMCowKKAmoCSGImh0dHA6 Ly9sb2NhbGhvc3Q6NTI4MC9kYXRhL2NybC5kZXIwNgYIKwYBBQUHAQEEKjAoMCYG CCsGAQUFBzABhhpodHRwOi8vbG9jYWxob3N0OjUyODAvb2NzcDALBgNVHQ8EBAMC BeAwJwYDVR0lBCAwHgYIKwYBBQUHAwkGCCsGAQUFBwMBBggrBgEFBQcDAjBQBgNV HREESTBHggsqLmxvY2FsaG9zdKA4BggrBgEFBQcIBaAsDCp0ZXN0X3NpbmdsZSEj JCVeKigpYH4rLTtfPVtde318XEBsb2NhbGhvc3QwDQYJKoZIhvcNAQELBQADggEB -AGYMvXw1GZak2blxC2gr7p68MTjrPYAs26yKDuLR0Wpg1wMgnAelsMPrjjuSxWQX -MlVFW1FD7OPIsgxgCZaOJiITEK6TgPa+XsSZa4H2o9fpIUd9Dy18sxJIjEpQMYa3 -L5Uq5tMTlxK9tovH3wNbdnW24MZ0nlWP/uzspbXqk7F/C6AbLX6tHLfJhcpyg94Z -UY/pZG9IP6MME784eEubP5I0mxSM2JN5JiPKsk14/a4veUBJXq+vcMVCfuxNCWVA -RRk9MJ9U31W3D6G8Y7Es53I2mmEHoN1mFHKmW3El3gtXJ7aUenQP0ayGTXlnFuGd -fPrgVCvv3ykkKd6cizhB1O8= +AEW8qvdyBMOSjCwJ1G178xsxf8Adw/9QN2ftBGKCo1C3YtmP5CvipChq5FTrOvRz +XjoQxbKhlqEumkZQkfmLiM/DLbkFeNqGWpuy14lkyIPUknaLKNCJX++pXsJrPLGR +btWnlB0cb+pLIB/UkG8OIpW07pNOZxHdHoHInRMMs89kgsmhIpn5OamzPWK/bqTB +YjAPIdmdkYk9oxWfgjpJ4BG2PbGS6CnjA29j7vebuQ4ebVpFBMI9w77PY3NcuMK7 +ML6MV6ez/+nPpz+E4zRxsVxmVAbSaiFDW3G3efAybDeT5QW1x/oJm2SpsJNIGHcp +RecYNo9esOTG+Bg6wypg4WA= -----END CERTIFICATE----- -----BEGIN RSA PRIVATE KEY----- -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 -----END RSA PRIVATE KEY----- diff --git a/test/ejabberd_SUITE_data/ejabberd.yml b/test/ejabberd_SUITE_data/ejabberd.yml index 51cb85a5a..e720ac103 100644 --- a/test/ejabberd_SUITE_data/ejabberd.yml +++ b/test/ejabberd_SUITE_data/ejabberd.yml @@ -525,6 +525,8 @@ shaper: fast: 50000 normal: 10000 +new_sql_schema: @@new_schema@@ + api_permissions: "public commands": who: all diff --git a/test/ejabberd_SUITE_data/gencerts.sh b/test/ejabberd_SUITE_data/gencerts.sh index b4dd8aa94..6975fe422 100755 --- a/test/ejabberd_SUITE_data/gencerts.sh +++ b/test/ejabberd_SUITE_data/gencerts.sh @@ -7,7 +7,7 @@ touch ssl/index.txt echo 01 > ssl/serial echo 1000 > ssl/crlnumber openssl genrsa -out ca.key 2048 -openssl req -new -x509 -key ca.key -out ca.pem -batch +openssl req -new -days 10000 -x509 -key ca.key -out ca.pem -batch openssl genrsa -out ssl/client.key openssl req -new -key ssl/client.key -out ssl/client.csr -config openssl.cnf -batch -subj /C=AU/ST=Some-State/O=Internet\ Widgits\ Pty\ Ltd/CN=localhost openssl ca -keyfile ca.key -cert ca.pem -in ssl/client.csr -out ssl/client.crt -config openssl.cnf -days 10000 -batch -notext -policy policy_anything diff --git a/test/ejabberd_SUITE_data/self-signed-cert.pem b/test/ejabberd_SUITE_data/self-signed-cert.pem index adc7c631b..29fc38d36 100644 --- a/test/ejabberd_SUITE_data/self-signed-cert.pem +++ b/test/ejabberd_SUITE_data/self-signed-cert.pem @@ -1,47 +1,47 @@ -----BEGIN CERTIFICATE----- -MIIDOTCCAiECFDJe+zeyS7+WcT5pKRNIHFM6CeVSMA0GCSqGSIb3DQEBCwUAMFkx +MIIDOTCCAiECFHMoNo36Xx0BWkzS8nwvCPGnHnHRMA0GCSqGSIb3DQEBCwUAMFkx CzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRl -cm5ldCBXaWRnaXRzIFB0eSBMdGQxEjAQBgNVBAMMCWxvY2FsaG9zdDAeFw0xODA4 -MjQwOTMwNTZaFw00NjAxMDkwOTMwNTZaMFkxCzAJBgNVBAYTAkFVMRMwEQYDVQQI +cm5ldCBXaWRnaXRzIFB0eSBMdGQxEjAQBgNVBAMMCWxvY2FsaG9zdDAeFw0xODA5 +MjQxMzE4MjRaFw00NjAyMDkxMzE4MjRaMFkxCzAJBgNVBAYTAkFVMRMwEQYDVQQI DApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQx EjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAMCwEzRUUhSk31ndBx6F+LsPZVsObrqv2wCMfcmCmE2jq/7UCoM0thF0p7zJ -4K8sCZT9R1My66d1jUdAojyENGH3gD98Ykq6LRFjm0W/9GMDmYQmzotFqVj4GYd3 -Lf12hB4W5ymLW5cmtcFawjf8rq93JPq7uDJGtpX8aLihfcvJGZ9qhdAhG0f22yYj -stAq/qviwiDog/osCh4Y7upLPjqphcF4YJROtm+8imbXLknXZ7Iphep9FV5EtlZu -SoPdNUnne0D7VUehLSAYe1osFOoi6DqHxYzoNwe79yvIV+uknI+Vf5s/vptlvQU6 -pKGEZrMzx15xXhfGYQM3Np3FFq0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAdOPI -8g9eI8d6Op86mOxKVIoqTjrQM3Edtbox/So0J4OyKMqw7TM34l2b+1PE0VrrJiHv -i69O3oN+ZajdmdE8LmfWLCXVRZk1hx4d0JKVzitV9ZX3tcws34AqL8cBSvUIPizo -lEZ7XO6K+7ylt7IkDklnTln02Z2wuW26+TvKQkNC+mpPTput1ypWTTkUApiA2S91 -LGtymTAlixgXbgHhARlMnCHwPwmK+W5yR0HNT0OC0fVzF+rUUnGFh3WcJ3rjUY7b -ZGP0V8lndZDz20rpsoSd4sx1W1HZFsX8R7goq7MK6va2IlRFh3kXsY/fD6C7+/Vm -J56LwRdbLd7fG95akw== +ggEBANaEDDeDGf8BH+EjO3IcB2fspkOSp7eOVWdI5oKZyhcdKfniaDXoL78GP/ND +Vk5nIGxp6q7iYjoeQBFDQ7Qg+Rv+9KM9lh4GQWZLi7KKRGv9rA5sMb1G79X/5g/I +h3A2llLygMuE1BxXhw0C9vByaJvRO24GGnXroXm8GXLG7pTxXj8Pn1jO4y1sZDGA +pX7Hc7Aa4Hq22VT5wLo++3Bl2UkOqfeozj4if5ozlQsFibXZasJntgAuAMCmHVs3 +N2LMPJREv7mzGvpT9RIfWiPHnaRyJQuZ2DS1U1muF8OgrQL6syrTTSc8MqW0d33A +12lr7ztxmN8Dh1Qv8MgrC/El3O0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAhM+Q +qt4IlM1SMb74L5GO2JKGVSUbZmaFJEZcjlrcHkw+Tfc5SMxaj7JpTPg7OGNY1L/3 +HnUDdaDRZ5xVOxUF7gTBWDAgkO7En5YfvvEYXUYUk7wwpFrqUqQpluqQIxr+Zf6l +pZFLhKIANa4wayKtZ9v4uBtRjnm9Hj7gQHeWN9sueIq7d4HO5lubYlzu1+6qeP+L +M0ciNhsUPypCwVcLPB+1Eo925QBwAhXsvPD9yKFQg1M7XxcJSy0w3DwWQsTTsEbk +8c/vIF/IhkOJHQDTKa+VSJM+hZgmx/PsyVdbWRSCAusiZpjHKhzzTCNEloGp/Vbm +5y/OeAK2TGPTg9I91w== -----END CERTIFICATE----- -----BEGIN RSA PRIVATE KEY----- -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 -----END RSA PRIVATE KEY----- diff --git a/test/ejabberd_admin_test.exs b/test/ejabberd_admin_test.exs deleted file mode 100644 index 1090eff17..000000000 --- a/test/ejabberd_admin_test.exs +++ /dev/null @@ -1,88 +0,0 @@ -# ---------------------------------------------------------------------- -# -# ejabberd, Copyright (C) 2002-2017 ProcessOne -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -# -# ---------------------------------------------------------------------- - -defmodule EjabberdAdminTest do - use ExUnit.Case, async: false - - @author "jsautret@process-one.net" - - setup_all do - :mnesia.start - :ejabberd_mnesia.start - # For some myterious reason, :ejabberd_commands.init mays - # sometimes fails if module is not loaded before - :ejabberd_config.start(["domain"], []) - {:module, :ejabberd_commands} = Code.ensure_loaded(:ejabberd_commands) - :ejabberd_hooks.start_link - {:ok, _} = :acl.start_link - {:ok, _} = :ejabberd_access_permissions.start_link() - :ejabberd_commands.start_link - :ejabberd_admin.start_link - :ok - end - - setup do - :ok - end - - test "Logvel can be set and retrieved" do - :ejabberd_logger.start() - - assert :lager == call_command(:set_loglevel, [1]) - assert {1, :critical, 'Critical'} == - call_command(:get_loglevel, []) - - assert :lager == call_command(:set_loglevel, [2]) - assert {2, :error, 'Error'} == - call_command(:get_loglevel, []) - - assert :lager == call_command(:set_loglevel, [3]) - assert {3, :warning, 'Warning'} == - call_command(:get_loglevel, []) - -# assert {:wrong_loglevel, 6} == -# catch_throw call_command(:set_loglevel, [6]) -# assert {3, :warning, 'Warning'} == -# call_command(:get_loglevel, []) - - assert :lager == call_command(:set_loglevel, [4]) - assert {4, :info, 'Info'} == - call_command(:get_loglevel, []) - - assert :lager == call_command(:set_loglevel, [5]) - assert {5, :debug, 'Debug'} == - call_command(:get_loglevel, []) - - assert :lager == call_command(:set_loglevel, [0]) - assert {0, :no_log, 'No log'} == - call_command(:get_loglevel, []) - - end - - defp call_command(name, args) do - :ejabberd_commands.execute_command2(name, args, %{:caller_module => :ejabberd_ctl}) - end - - test "command status works with ejabberd stopped" do - assert :ejabberd_not_running == - elem(call_command(:status, []), 0) - end - -end diff --git a/test/ejabberd_auth_mock.exs b/test/ejabberd_auth_mock.exs deleted file mode 100644 index 10daf03dc..000000000 --- a/test/ejabberd_auth_mock.exs +++ /dev/null @@ -1,74 +0,0 @@ -# ---------------------------------------------------------------------- -# -# ejabberd, Copyright (C) 2002-2017 ProcessOne -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -# -# ---------------------------------------------------------------------- - -defmodule EjabberdAuthMock do - - @author "jsautret@process-one.net" - @agent __MODULE__ - - def init do - try do - Agent.stop(@agent) - catch - :exit, _e -> :ok - end - - {:ok, _pid} = Agent.start_link(fn -> %{} end, name: @agent) - - mock(:ejabberd_auth, :user_exists, - fn (user, domain) -> - Agent.get(@agent, fn users -> Map.get(users, {user, domain}) end) != nil - end) - mock(:ejabberd_auth, :get_password_s, - fn (user, domain) -> - Agent.get(@agent, fn users -> Map.get(users, {user, domain}, "") end ) - end) - mock(:ejabberd_auth, :check_password, - fn (user, _authzid, domain, password) -> - Agent.get(@agent, fn users -> - Map.get(users, {user, domain}) end) == password - end) - mock(:ejabberd_auth, :set_password, - fn (user, domain, password) -> - Agent.update(@agent, fn users -> - Map.put(users, {user, domain}, password) end) - end) - end - - def create_user(user, domain, password) do - Agent.update(@agent, fn users -> Map.put(users, {user, domain}, password) end) - end - - #################################################################### - # Helpers - #################################################################### - - # TODO refactor: Move to ejabberd_test_mock - def mock(module, function, fun) do - try do - :meck.new(module) - catch - :error, {:already_started, _pid} -> :ok - end - - :meck.expect(module, function, fun) - end - -end diff --git a/test/ejabberd_hooks_test.exs b/test/ejabberd_hooks_test.exs deleted file mode 100644 index 90624147c..000000000 --- a/test/ejabberd_hooks_test.exs +++ /dev/null @@ -1,203 +0,0 @@ -# ---------------------------------------------------------------------- -# -# ejabberd, Copyright (C) 2002-2017 ProcessOne -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -# -# ---------------------------------------------------------------------- - -# Notes on the tests: -# -# This test suite will print out errors in logs for tests: -# -# test "Error in run_fold is ignored" -# test "Throw in run_fold is ignored" -# test "Exit in run_fold is ignored" -# -# Those tests are not failing and we can safely ignore those errors in -# log as we are exercising hook handler recovery from that situation. - -defmodule EjabberdHooksTest do - use ExUnit.Case, async: false - - @author "mremond@process-one.net" - @host <<"domain.net">> - @self __MODULE__ - - setup_all do - {:ok, _pid} = :ejabberd_hooks.start_link - :ok - end - - setup do - :meck.unload - :true = :ejabberd_hooks.delete_all_hooks - :ok - end - - test "An anonymous function can be added as a hook" do - hookname = :test_fun_hook - :ok = :ejabberd_hooks.add(hookname, @host, fn _ -> :ok end, 50) - [{50, :undefined, _}] = :ejabberd_hooks.get_handlers(hookname, @host) - end - - test "A module function can be added as a hook" do - hookname = :test_mod_hook - callback = :hook_callback - :ok = :ejabberd_hooks.add(hookname, @host, @self, callback, 40) - [{40, @self, _callback}] = :ejabberd_hooks.get_handlers(hookname, @host) - end - - test "An anonymous function can be removed from hook handlers" do - hookname = :test_fun_hook - anon_fun = fn _ -> :ok end - :ok = :ejabberd_hooks.add(hookname, @host, anon_fun, 50) - :ok = :ejabberd_hooks.delete(hookname, @host, anon_fun, 50) - [] = :ejabberd_hooks.get_handlers(hookname, @host) - end - - test "An module function can be removed from hook handlers" do - hookname = :test_mod_hook - callback = :hook_callback - :ok = :ejabberd_hooks.add(hookname, @host, @self, callback, 40) - :ok = :ejabberd_hooks.delete(hookname, @host, @self, callback, 40) - [] = :ejabberd_hooks.get_handlers(hookname, @host) - # TODO: Check that removed function is not call anymore - end - - test "'Run hook' call registered handler once" do - test_result = :hook_result - run_hook([], fn -> test_result end, test_result) - end - - test "'Run hook' can call registered handler with parameters" do - test_result = :hook_result_with_params - run_hook([:hook_params], fn _ -> test_result end, test_result) - end - - # TODO test "Several handlers are run in order by hook" - - test "Hook run chain is stopped when handler return 'stop'" do - # setup test - hookname = :test_mod_hook - modulename = :hook_module - mock(modulename, :hook_callback1, fn _ -> :stop end) - mock(modulename, :hook_callback2, fn _ -> :end_result end) - - :ok = :ejabberd_hooks.add(hookname, @host, modulename, :hook_callback1, 40) - :ok = :ejabberd_hooks.add(hookname, @host, modulename, :hook_callback1, 50) - - :ok = :ejabberd_hooks.run(hookname, @host, [:hook_params]) - # callback2 is never run: - [{_pid, {^modulename, _callback, [:hook_params]}, :stop}] = :meck.history(modulename) - end - - test "Run fold hooks accumulate state in correct order through handlers" do - # setup test - hookname = :test_mod_hook - modulename = :hook_module - mock(modulename, :hook_callback1, fn(list, user) -> [user|list] end) - mock(modulename, :hook_callback2, fn(list, _user) -> ["jid2"|list] end) - - :ok = :ejabberd_hooks.add(hookname, @host, modulename, :hook_callback1, 40) - :ok = :ejabberd_hooks.add(hookname, @host, modulename, :hook_callback2, 50) - - ["jid2", "jid1"] = :ejabberd_hooks.run_fold(hookname, @host, [], ["jid1"]) - end - - test "Hook run_fold are executed based on priority order, not registration order" do - # setup test - hookname = :test_mod_hook - modulename = :hook_module - mock(modulename, :hook_callback1, fn(_acc) -> :first end) - mock(modulename, :hook_callback2, fn(_acc) -> :second end) - - :ok = :ejabberd_hooks.add(hookname, @host, modulename, :hook_callback2, 50) - :ok = :ejabberd_hooks.add(hookname, @host, modulename, :hook_callback1, 40) - - :second = :ejabberd_hooks.run_fold(hookname, @host, :started, []) - # Both module have been called: - 2 = length(:meck.history(modulename)) - end - - # TODO: Test with ability to stop and return a value - test "Hook run_fold chain is stopped when handler return 'stop'" do - # setup test - hookname = :test_mod_hook - modulename = :hook_module - mock(modulename, :hook_callback1, fn(_acc) -> :stop end) - mock(modulename, :hook_callback2, fn(_acc) -> :executed end) - - :ok = :ejabberd_hooks.add(hookname, @host, modulename, :hook_callback1, 40) - :ok = :ejabberd_hooks.add(hookname, @host, modulename, :hook_callback2, 50) - - :stopped = :ejabberd_hooks.run_fold(hookname, @host, :started, []) - # Only one module has been called - [{_pid, {^modulename, :hook_callback1, [:started]}, :stop}] = :meck.history(modulename) - end - - test "Error in run_fold is ignored" do - run_fold_crash(fn(_acc) -> raise "crashed" end) - end - - test "Throw in run_fold is ignored" do - run_fold_crash(fn(_acc) -> throw :crashed end) - end - - test "Exit in run_fold is ignored" do - run_fold_crash(fn(_acc) -> exit :crashed end) - end - - # test for run hook with various number of params - def run_hook(params, fun, result) do - # setup test - hookname = :test_mod_hook - modulename = :hook_module - callback = :hook_callback - mock(modulename, callback, fun) - - # Then check - :ok = :ejabberd_hooks.add(hookname, @host, modulename, callback, 40) - :ok = :ejabberd_hooks.run(hookname, @host, params) - [{_pid, {^modulename, ^callback, ^params}, ^result}] = :meck.history(modulename) - end - - def run_fold_crash(crash_fun) do - # setup test - hookname = :test_mod_hook - modulename = :hook_module - mock(modulename, :hook_callback1, crash_fun) - mock(modulename, :hook_callback2, fn(_acc) -> :final end) - - :ok = :ejabberd_hooks.add(hookname, @host, modulename, :hook_callback1, 40) - :ok = :ejabberd_hooks.add(hookname, @host, modulename, :hook_callback2, 50) - - :final = :ejabberd_hooks.run_fold(hookname, @host, :started, []) - # Both handlers were called - 2 = length(:meck.history(modulename)) - end - - # TODO refactor: Move to ejabberd_test_mock - def mock(module, function, fun) do - try do - :meck.new(module, [:non_strict]) - catch - :error, {:already_started, _pid} -> :ok - end - - :meck.expect(module, function, fun) - end - -end diff --git a/test/ejabberd_oauth_mock.exs b/test/ejabberd_oauth_mock.exs deleted file mode 100644 index 8f1f11843..000000000 --- a/test/ejabberd_oauth_mock.exs +++ /dev/null @@ -1,50 +0,0 @@ -# ---------------------------------------------------------------------- -# -# ejabberd, Copyright (C) 2002-2017 ProcessOne -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -# -# ---------------------------------------------------------------------- - -defmodule EjabberdOauthMock do - - @author "jsautret@process-one.net" - - def init() do - :mnesia.start - :mnesia.create_table(:oauth_token, - [ram_copies: [node], - attributes: [:oauth_token, :us, :scope, :expire]]) - :application.start(:cache_tab) - :cache_tab.new(:oauth_token, - [{:max_size, 1000}, {:life_time, 3600}]) - end - - def get_token(user, domain, command, expiration \\ 3600) do - now = {megasecs, secs, _} = :os.timestamp - expire = 1000000 * megasecs + secs + expiration - :random.seed now - token = to_string :random.uniform(100000000) - - {:ok, _} = :ejabberd_oauth.associate_access_token(token, - [{"resource_owner", - {:user, user, domain}}, - {"scope", [to_string command]}, - {"expiry_time", expire}], - []) - token - end - -end diff --git a/test/ejabberd_sm_mock.exs b/test/ejabberd_sm_mock.exs deleted file mode 100644 index 9ac739ba5..000000000 --- a/test/ejabberd_sm_mock.exs +++ /dev/null @@ -1,121 +0,0 @@ -# ---------------------------------------------------------------------- -# -# ejabberd, Copyright (C) 2002-2017 ProcessOne -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -# -# ---------------------------------------------------------------------- - -defmodule EjabberdSmMock do - @author "jsautret@process-one.net" - - require Record - Record.defrecord :session, Record.extract(:session, from_lib: "ejabberd/include/ejabberd_sm.hrl") - Record.defrecord :jid, Record.extract(:jid, from_lib: "xmpp/include/jid.hrl") - - @agent __MODULE__ - - def init do - ModLastMock.init - - try do - Agent.stop(@agent) - catch - :exit, _e -> :ok - end - - {:ok, _pid} = Agent.start_link(fn -> [] end, name: @agent) - - mock(:ejabberd_sm, :get_user_resources, - fn (user, domain) -> for s <- get_sessions(user, domain), do: s.resource end) - - mock(:ejabberd_sm, :route, - fn (to, {:exit, _reason}) -> - user = jid(to, :user) - domain = jid(to, :server) - resource = jid(to, :resource) - disconnect_resource(user, domain, resource) - :ok - (_, _) -> :ok - end) - - end - - def connect_resource(user, domain, resource, - opts \\ [priority: 1, conn: :c2s]) do - Agent.update(@agent, fn sessions -> - session = %{user: user, domain: domain, resource: resource, - timestamp: :os.timestamp, pid: self, node: node, - auth_module: :ejabberd_auth, ip: :undefined, - priority: opts[:priority], conn: opts[:conn]} - [session | sessions] - end) - end - - def disconnect_resource(user, domain, resource) do - disconnect_resource(user, domain, resource, ModLastMock.now) - end - - def disconnect_resource(user, domain, resource, timestamp) do - Agent.update(@agent, fn sessions -> - for s <- sessions, - s.user != user or s.domain != domain or s.resource != resource, do: s - end) - ModLastMock.set_last user, domain, "", timestamp - end - - def get_sessions() do - Agent.get(@agent, fn sessions -> sessions end) - end - - def get_sessions(user, domain) do - Agent.get(@agent, fn sessions -> - for s <- sessions, s.user == user, s.domain == domain, do: s - end) - end - - def get_session(user, domain, resource) do - Agent.get(@agent, fn sessions -> - for s <- sessions, - s.user == user, s.domain == domain, s.resource == resource, do: s - end) - end - - def to_record(s) do - session(usr: {s.user, s.domain, s.ressource}, - us: {s.user, s.domain}, - sid: {s.timestamp, s.pid}, - priority: s.priority, - info: [conn: s.conn, ip: s.ip, node: s.node, - oor: false, auth_module: s.auth_module]) - end - - #################################################################### - # Helpers - #################################################################### - - - # TODO refactor: Move to ejabberd_test_mock - def mock(module, function, fun) do - try do - :meck.new(module) - catch - :error, {:already_started, _pid} -> :ok - end - - :meck.expect(module, function, fun) - end - -end diff --git a/test/elixir_SUITE.erl b/test/elixir_SUITE.erl deleted file mode 100644 index b869e00f7..000000000 --- a/test/elixir_SUITE.erl +++ /dev/null @@ -1,119 +0,0 @@ -%%%------------------------------------------------------------------- -%%% Author : Mickael Remond <mremond@process-one.net> -%%% Created : 19 Feb 2015 by Mickael Remond <mremond@process-one.net> -%%% -%%% -%%% ejabberd, Copyright (C) 2002-2017 ProcessOne -%%% -%%% This program is free software; you can redistribute it and/or -%%% modify it under the terms of the GNU General Public License as -%%% published by the Free Software Foundation; either version 2 of the -%%% License, or (at your option) any later version. -%%% -%%% This program is distributed in the hope that it will be useful, -%%% but WITHOUT ANY WARRANTY; without even the implied warranty of -%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -%%% General Public License for more details. -%%% -%%% You should have received a copy of the GNU General Public License along -%%% with this program; if not, write to the Free Software Foundation, Inc., -%%% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -%%% -%%%---------------------------------------------------------------------- - -%%% This is a common test wrapper to run our ejabberd tests written in -%%% Elixir from standard common test code. -%%% -%%% Example: Is run with: -%%% ./rebar skip_deps=true ct suites=elixir -%%% or from ejabber overall test suite: -%%% make quicktest - --module(elixir_SUITE). - --compile(export_all). - -init_per_suite(Config) -> - suite:setup_ejabberd_lib_path(Config), - check_meck(), - code:add_pathz(filename:join(test_dir(), "../include")), - Config. - -end_per_suite(_Config) -> - ok. - -init_per_testcase(_TestCase, Config) -> - process_flag(error_handler, ?MODULE), - Config. - -all() -> - case is_elixir_available() of - true -> - Dir = test_dir(), - filelib:fold_files(Dir, ".*test\.exs$", false, - fun(Filename, Acc) -> [list_to_atom(filename:basename(Filename)) | Acc] end, - []); - false -> - [] - end. - -check_meck() -> - case catch meck:module_info(module) of - meck -> - ok; - {'EXIT',{undef, _}} -> - ct:print("meck is not available. Please make sure you configured ejabberd with --enable-elixir --enable-tools"), - ok - end. - -is_elixir_available() -> - case catch elixir:module_info() of - {'EXIT',{undef,_}} -> - ct:print("ejabberd has not been build with Elixir support, skipping Elixir tests."), - false; - ModInfo when is_list(ModInfo) -> - true - end. - -undefined_function(?MODULE, Func, Args) -> - case lists:suffix(".exs", atom_to_list(Func)) of - true -> - run_elixir_test(Func); - false -> - error_handler:undefined_function(?MODULE, Func, Args) - end; -undefined_function(Module, Func, Args) -> - error_handler:undefined_function(Module, Func,Args). - -run_elixir_test(Func) -> - %% Elixir tests can be tagged as follow to be ignored (place before test start) - %% @tag pending: true - 'Elixir.ExUnit':start([{exclude, [{pending, true}]}, - {formatters, - ['Elixir.ExUnit.CLIFormatter', - 'Elixir.ExUnit.CTFormatter']}, - {autorun, false}]), - - filelib:fold_files(test_dir(), ".*mock\.exs\$", true, - fun (File, N) -> - 'Elixir.Code':load_file(list_to_binary(File)), - N+1 - end, 0), - - 'Elixir.Code':load_file(list_to_binary(filename:join(test_dir(), atom_to_list(Func)))), - %% I did not use map syntax, so that this file can still be build under R16 - catch 'Elixir.ExUnit.Server':cases_loaded(), - ResultMap = 'Elixir.ExUnit':run(), - case maps:find(failures, ResultMap) of - {ok, 0} -> - %% Zero failures - ok; - {ok, Failures} -> - ct:print("Tests failed in module '~s': ~.10B failures.~nSee logs for details", [Func, Failures]), - ct:fail(elixir_test_failure), - error - end. - -test_dir() -> - {ok, CWD} = file:get_cwd(), - filename:join(CWD, "../../test"). diff --git a/test/jid_test.exs b/test/jid_test.exs deleted file mode 100644 index aa3563bea..000000000 --- a/test/jid_test.exs +++ /dev/null @@ -1,45 +0,0 @@ -# ---------------------------------------------------------------------- -# -# ejabberd, Copyright (C) 2002-2017 ProcessOne -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -# -# ---------------------------------------------------------------------- - -defmodule JidTest do - @author "mremond@process-one.net" - - use ExUnit.Case, async: true - - require Record - Record.defrecord :jid, Record.extract(:jid, from_lib: "xmpp/include/jid.hrl") - - setup_all do - :stringprep.start - :jid.start - :ok - end - - test "create a jid from a binary" do - jid = :jid.from_string("test@localhost/resource") - assert jid(jid, :user) == "test" - assert jid(jid, :server) == "localhost" - assert jid(jid, :resource) == "resource" - end - - test "Check that sending a list to from_string/1 does not crash the jid process" do - {:error, :need_jid_as_binary} = :jid.from_string('test@localhost/resource') - end -end diff --git a/test/mix_tests.erl b/test/mix_tests.erl deleted file mode 100644 index 864150661..000000000 --- a/test/mix_tests.erl +++ /dev/null @@ -1,154 +0,0 @@ -%%%------------------------------------------------------------------- -%%% Author : Evgeny Khramtsov <ekhramtsov@process-one.net> -%%% Created : 16 Nov 2016 by Evgeny Khramtsov <ekhramtsov@process-one.net> -%%% -%%% -%%% ejabberd, Copyright (C) 2002-2017 ProcessOne -%%% -%%% This program is free software; you can redistribute it and/or -%%% modify it under the terms of the GNU General Public License as -%%% published by the Free Software Foundation; either version 2 of the -%%% License, or (at your option) any later version. -%%% -%%% This program is distributed in the hope that it will be useful, -%%% but WITHOUT ANY WARRANTY; without even the implied warranty of -%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -%%% General Public License for more details. -%%% -%%% You should have received a copy of the GNU General Public License along -%%% with this program; if not, write to the Free Software Foundation, Inc., -%%% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -%%% -%%%---------------------------------------------------------------------- - --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, - sub_els = [PXML]}]}}]} = - recv_message(Config), - #mix_participant{jid = MyBareJID} = xmpp:decode(PXML), - %% Coming online - PresenceID = p1_rand: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, - sub_els = [Presence]}]}}]}), - #message{from = Room, - sub_els = - [#ps_event{ - items = #ps_items{ - node = ?NS_MIX_NODES_PRESENCE, - items = [#ps_item{ - id = PresenceID, - sub_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")]}. diff --git a/test/mod_admin_extra_test.exs b/test/mod_admin_extra_test.exs deleted file mode 100644 index 7b1bc21de..000000000 --- a/test/mod_admin_extra_test.exs +++ /dev/null @@ -1,374 +0,0 @@ -# ---------------------------------------------------------------------- -# -# ejabberd, Copyright (C) 2002-2017 ProcessOne -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -# -# ---------------------------------------------------------------------- - -defmodule EjabberdModAdminExtraTest do - use ExUnit.Case, async: false - - require EjabberdAuthMock - require EjabberdSmMock - require ModLastMock - require ModRosterMock - - @author "jsautret@process-one.net" - - @user "user" - @domain "domain" - @password "password" - @resource "resource" - - require Record - Record.defrecord :jid, Record.extract(:jid, from_lib: "xmpp/include/jid.hrl") - - setup_all do - try do - :jid.start - :stringprep.start - :mnesia.start - :ejabberd_mnesia.start - :p1_sha.load_nif - :ejabberd_hooks.start_link - rescue - _ -> :ok - end - :ok = :ejabberd_config.start(["domain"], []) - :gen_mod.start_link - :acl.start_link - :ejabberd_access_permissions.start_link() - :ejabberd_commands.start_link - :mod_admin_extra.start(@domain, []) - :ejabberd_hooks.start_link - :ok - end - - setup do - :meck.unload - EjabberdAuthMock.init - EjabberdSmMock.init - ModRosterMock.init(@domain, :mod_admin_extra) - :ok - end - - ###################### Accounts - test "check_account works" do - EjabberdAuthMock.create_user @user, @domain, @password - - assert call_command(:check_account, [@user, @domain]) - refute call_command(:check_account, [@user, "bad_domain"]) - refute call_command(:check_account, ["bad_user", @domain]) - - assert :meck.validate :ejabberd_auth - end - - test "check_password works" do - - EjabberdAuthMock.create_user @user, @domain, @password - - assert call_command(:check_password, - [@user, @domain, @password]) - refute call_command(:check_password, - [@user, @domain, "bad_password"]) - refute call_command(:check_password, - [@user, "bad_domain", @password]) - refute call_command(:check_password, - ["bad_user", @domain, @password]) - - assert :meck.validate :ejabberd_auth - - end - - test "check_password_hash works" do - - EjabberdAuthMock.create_user @user, @domain, @password - hash = "5F4DCC3B5AA765D61D8327DEB882CF99" # echo -n password|md5 - - assert call_command(:check_password_hash, - [@user, @domain, hash, "md5"]) - refute call_command(:check_password_hash, - [@user, @domain, "bad_hash", "md5"]) - refute call_command(:check_password_hash, - [@user, "bad_domain", hash, "md5"]) - refute call_command(:check_password_hash, - ["bad_user", @domain, hash, "md5"]) - - hash = "5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8" # echo -n password|shasum - assert call_command(:check_password_hash, - [@user, @domain, hash, "sha"]) - - assert :unkown_hash_method == - catch_throw call_command(:check_password_hash, - [@user, @domain, hash, "bad_method"]) - - assert :meck.validate :ejabberd_auth - - end - - test "set_password works" do - EjabberdAuthMock.create_user @user, @domain, @password - - assert call_command(:change_password, - [@user, @domain, "new_password"]) - refute call_command(:check_password, - [@user, @domain, @password]) - assert call_command(:check_password, - [@user, @domain, "new_password"]) - assert {:not_found, 'unknown_user'} == - catch_throw call_command(:change_password, - ["bad_user", @domain, - @password]) - assert :meck.validate :ejabberd_auth - end - - ###################### Sessions - - test "num_resources works" do - assert 0 == call_command(:num_resources, - [@user, @domain]) - - EjabberdSmMock.connect_resource @user, @domain, @resource - assert 1 == call_command(:num_resources, - [@user, @domain]) - - EjabberdSmMock.connect_resource @user, @domain, @resource<>"2" - assert 2 == call_command(:num_resources, - [@user, @domain]) - - EjabberdSmMock.connect_resource @user<>"1", @domain, @resource - assert 2 == call_command(:num_resources, - [@user, @domain]) - - EjabberdSmMock.disconnect_resource @user, @domain, @resource - assert 1 == call_command(:num_resources, - [@user, @domain]) - - assert :meck.validate :ejabberd_sm - end - - test "resource_num works" do - EjabberdSmMock.connect_resource @user, @domain, @resource<>"3" - EjabberdSmMock.connect_resource @user, @domain, @resource<>"2" - EjabberdSmMock.connect_resource @user, @domain, @resource<>"1" - - assert :bad_argument == - elem(catch_throw(call_command(:resource_num, - [@user, @domain, 0])), 0) - assert @resource<>"1" == - call_command(:resource_num, [@user, @domain, 1]) - assert @resource<>"3" == - call_command(:resource_num, [@user, @domain, 3]) - assert :bad_argument == - elem(catch_throw(call_command(:resource_num, - [@user, @domain, 4])), 0) - assert :meck.validate :ejabberd_sm - end - - test "kick_session works" do - EjabberdSmMock.connect_resource @user, @domain, @resource<>"1" - EjabberdSmMock.connect_resource @user, @domain, @resource<>"2" - EjabberdSmMock.connect_resource @user, @domain, @resource<>"3" - - assert 3 == length EjabberdSmMock.get_sessions @user, @domain - assert 1 == length EjabberdSmMock.get_session @user, @domain, @resource<>"2" - - assert :ok == - call_command(:kick_session, - [@user, @domain, - @resource<>"2", "kick"]) - - assert 2 == length EjabberdSmMock.get_sessions @user, @domain - assert 0 == length EjabberdSmMock.get_session @user, @domain, @resource<>"2" - - assert :meck.validate :ejabberd_sm - end - - ###################### Last - - test "get_last works" do - - assert {_, 'NOT FOUND'} = - call_command(:get_last, [@user, @domain]) - - EjabberdSmMock.connect_resource @user, @domain, @resource<>"1" - EjabberdSmMock.connect_resource @user, @domain, @resource<>"2" - - assert {_, 'ONLINE'} = - call_command(:get_last, [@user, @domain]) - - EjabberdSmMock.disconnect_resource @user, @domain, @resource<>"1" - - assert {_, 'ONLINE'} = - call_command(:get_last, [@user, @domain]) - - now = {megasecs, secs, _microsecs} = :os.timestamp - timestamp = megasecs * 1000000 + secs - EjabberdSmMock.disconnect_resource(@user, @domain, @resource<>"2", - timestamp) - {{year, month, day}, {hour, minute, second}} = :calendar.now_to_universal_time now - result = IO.iodata_to_binary(:io_lib.format( - "~w-~.2.0w-~.2.0wT~.2.0w:~.2.0w:~.2.0wZ", - [year, month, day, hour, minute, second])) - assert {result, ""} == - call_command(:get_last, [@user, @domain]) - - assert :meck.validate :mod_last - end - - ###################### Roster - - @tag :skip - test "add_rosteritem and delete_rosteritem work" do - # Connect user - # Add user1 & user2 to user's roster - # Remove user1 & user2 from user's roster - - EjabberdSmMock.connect_resource @user, @domain, @resource - - assert [] == ModRosterMock.get_roster(@user, @domain) - - assert :ok == - call_command(:add_rosteritem, [@user, @domain, - @user<>"1", @domain, - "nick1", - "group1", - "both"]) - # Check that user1 is the only item of the user's roster - result = ModRosterMock.get_roster(@user, @domain) - assert 1 == length result - [{{@user, @domain, jid}, opts}] = result - assert @user<>"1@"<>@domain == jid - assert "nick1" == opts.nick - assert ["group1"] == opts.groups - assert :both == opts.subs - - # Check that the item roster user1 was pushed with subscription - # 'both' to user online ressource - jid = :jlib.make_jid(@user, @domain, @resource) - assert 1 == - :meck.num_calls(:ejabberd_sm, :route, - [jid, - {:item, {@user<>"1", @domain, ""}, :both}]) - - assert :ok == - call_command(:add_rosteritem, [@user, @domain, - @user<>"2", @domain, - "nick2", - "group2", - "both"]) - result = ModRosterMock.get_roster(@user, @domain) - assert 2 == length result - - - # Check that the item roster user2 was pushed with subscription - # 'both' to user online ressource - assert 1 == - :meck.num_calls(:ejabberd_sm, :route, - [jid, - {:item, {@user<>"2", @domain, ""}, :both}]) - - - call_command(:delete_rosteritem, [@user, @domain, - @user<>"1", @domain]) - result = ModRosterMock.get_roster(@user, @domain) - assert 1 == length result - [{{@user, @domain, jid}, opts}] = result - assert @user<>"2@"<>@domain == jid - assert "nick2" == opts.nick - assert ["group2"] == opts.groups - assert :both == opts.subs - - # Check that the item roster user1 was pushed with subscription - # 'none' to user online ressource - jid = :jlib.make_jid(@user, @domain, @resource) - assert 1 == - :meck.num_calls(:ejabberd_sm, :route, - [jid, - {:item, {@user<>"1", @domain, ""}, :none}]) - - call_command(:delete_rosteritem, [@user, @domain, - @user<>"2", @domain]) - - # Check that the item roster user2 was pushed with subscription - # 'none' to user online ressource - assert 1 == - :meck.num_calls(:ejabberd_sm, :route, - [jid, - {:item, {@user<>"2", @domain, ""}, :none}]) - - # Check that nothing else was pushed to user resource - jid = jid(user: @user, server: @domain, resource: :_, - luser: @user, lserver: @domain, lresource: :_) - assert 4 == - :meck.num_calls(:ejabberd_sm, :route, - [jid, - {:item, :_, :_}]) - - assert [] == ModRosterMock.get_roster(@user, @domain) - assert :meck.validate :ejabberd_sm - - end - - @tag :skip - test "get_roster works" do - assert [] == ModRosterMock.get_roster(@user, @domain) - assert [] == call_command(:get_roster, [@user, @domain], - :admin) - - assert :ok == - call_command(:add_rosteritem, [@user, @domain, - @user<>"1", @domain, - "nick1", - "group1", - "both"]) - assert [{@user<>"1@"<>@domain, "", 'both', 'none', "group1"}] == - call_command(:get_roster, [@user, @domain], :admin) - assert :ok == - call_command(:add_rosteritem, [@user, @domain, - @user<>"2", @domain, - "nick2", - "group2", - "none"]) - result = call_command(:get_roster, [@user, @domain], :admin) - assert 2 == length result - assert Enum.member?(result, {@user<>"1@"<>@domain, "", 'both', 'none', "group1"}) - assert Enum.member?(result, {@user<>"2@"<>@domain, "", 'none', 'none', "group2"}) - - end - - defp call_command(name, args) do - :ejabberd_commands.execute_command2(name, args, %{:caller_module => :ejabberd_ctl}) - end - - defp call_command(name, args, mode) do - call_command(name, args) - end - -# kick_user command is defined in ejabberd_sm, move to extra? -# test "kick_user works" do -# assert 0 == call_command(:num_resources, -# [@user, @domain]) -# EjabberdSmMock.connect_resource(@user, @domain, @resource<>"1") -# EjabberdSmMock.connect_resource(@user, @domain, @resource<>"2") -# assert 2 == -# call_command(:kick_user, [@user, @domain]) -# assert 0 == call_command(:num_resources, -# [@user, @domain]) -# assert :meck.validate :ejabberd_sm -# end - -end diff --git a/test/mod_http_api_mock_test.exs b/test/mod_http_api_mock_test.exs deleted file mode 100644 index ceda2bb0f..000000000 --- a/test/mod_http_api_mock_test.exs +++ /dev/null @@ -1,270 +0,0 @@ -# ---------------------------------------------------------------------- -# -# ejabberd, Copyright (C) 2002-2017 ProcessOne -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -# -# ---------------------------------------------------------------------- - -defmodule ModHttpApiMockTest do - use ExUnit.Case, async: false - - @author "jsautret@process-one.net" - - # Admin user - @admin "admin" - @adminpass "adminpass" - # Non admin user - @user "user" - @userpass "userpass" - # XMPP domain - @domain "domain" - # mocked command - @command "command_test" - @acommand String.to_atom(@command) - # default API version - @version 0 - - require Record - Record.defrecord :request, Record.extract(:request, from_lib: "ejabberd/include/ejabberd_http.hrl") - - setup_all do - try do - :jid.start - :mnesia.start - :ejabberd_mnesia.start - :stringprep.start - :ejabberd_hooks.start_link - :ejabberd_config.start([@domain], []) - {:ok, _} = :ejabberd_access_permissions.start_link() - :ejabberd_commands.start_link - rescue - _ -> :ok - end - :mod_http_api.start(@domain, []) - EjabberdOauthMock.init - :ok - end - - setup do - :meck.unload - :meck.new :ejabberd_commands - :meck.new(:acl, [:passthrough]) # Need to fake acl to allow oauth - EjabberdAuthMock.init - :ok - end - - test "HTTP GET simple command call with Basic Auth" do - EjabberdAuthMock.create_user @user, @domain, @userpass - - # Mock a simple command() -> :ok - :meck.expect(:ejabberd_commands, :get_command_format, - fn (@acommand, %{usr: {@user, @domain, _}}, @version) -> - {[], {:res, :rescode}} - end) - :meck.expect(:ejabberd_commands, :get_exposed_commands, - fn () -> [@acommand] end) - :meck.expect(:ejabberd_commands, :execute_command2, - fn (@acommand, [], %{usr: {@user, @domain, _}}, @version) -> - :ok - end) - - :ejabberd_config.add_local_option(:commands, [[{:add_commands, [@acommand]}]]) - - # Correct Basic Auth call - req = request(method: :GET, - path: ["api", @command], - q: [nokey: ""], - # Basic auth - auth: {@user<>"@"<>@domain, @userpass}, - ip: {{127,0,0,1},60000}, - host: @domain) - result = :mod_http_api.process([@command], req) - - # history = :meck.history(:ejabberd_commands) - - assert 200 == elem(result, 0) # HTTP code - assert "0" == elem(result, 2) # command result - - # Bad password - req = request(method: :GET, - path: ["api", @command], - q: [nokey: ""], - # Basic auth - auth: {@user<>"@"<>@domain, @userpass<>"bad"}, - ip: {{127,0,0,1},60000}, - host: @domain) - result = :mod_http_api.process([@command], req) - assert 401 == elem(result, 0) # HTTP code - - # Check that the command was executed only once - assert 1 == - :meck.num_calls(:ejabberd_commands, :execute_command2, :_) - - assert :meck.validate :ejabberd_auth - assert :meck.validate :ejabberd_commands - end - - test "HTTP GET simple command call with OAuth" do - EjabberdAuthMock.create_user @user, @domain, @userpass - - # Mock a simple command() -> :ok - :meck.expect(:ejabberd_commands, :get_command_format, - fn (@acommand, %{usr: {@user, @domain, _}}, @version) -> - {[], {:res, :rescode}} - end) - :meck.expect(:ejabberd_commands, :get_exposed_commands, - fn () -> [@acommand] end) - :meck.expect(:ejabberd_commands, :execute_command2, - fn (@acommand, [], %{usr: {@user, @domain, _}, oauth_scope: ["ejabberd:user"]}, @version) -> - :ok - (@acommand, [], %{usr: {@user, @domain, _}, oauth_scope: [@command]}, @version) -> - :ok - (@acommand, [], %{usr: {@user, @domain, _}, oauth_scope: _}, @version) -> - throw({:error, :access_rules_unauthorized}) - end) - - - # Correct OAuth call using specific scope - token = EjabberdOauthMock.get_token @user, @domain, @command - req = request(method: :GET, - path: ["api", @command], - q: [nokey: ""], - # OAuth - auth: {:oauth, token, []}, - ip: {{127,0,0,1},60000}, - host: @domain) - result = :mod_http_api.process([@command], req) - assert 200 == elem(result, 0) # HTTP code - assert "0" == elem(result, 2) # command result - - # Correct OAuth call using specific ejabberd:user scope - token = EjabberdOauthMock.get_token @user, @domain, "ejabberd:user" - req = request(method: :GET, - path: ["api", @command], - q: [nokey: ""], - # OAuth - auth: {:oauth, token, []}, - ip: {{127,0,0,1},60000}, - host: @domain) - result = :mod_http_api.process([@command], req) - assert 200 == elem(result, 0) # HTTP code - assert "0" == elem(result, 2) # command result - - # Wrong OAuth token - req = request(method: :GET, - path: ["api", @command], - q: [nokey: ""], - # OAuth - auth: {:oauth, "bad"<>token, []}, - ip: {{127,0,0,1},60000}, - host: @domain) - result = :mod_http_api.process([@command], req) - assert 401 == elem(result, 0) # HTTP code - - # Expired OAuth token - token = EjabberdOauthMock.get_token @user, @domain, @command, 1 - :timer.sleep 1500 - req = request(method: :GET, - path: ["api", @command], - q: [nokey: ""], - # OAuth - auth: {:oauth, token, []}, - ip: {{127,0,0,1},60000}, - host: @domain) - result = :mod_http_api.process([@command], req) - assert 401 == elem(result, 0) # HTTP code - - # Wrong OAuth scope - token = EjabberdOauthMock.get_token @user, @domain, "bad_command" - :timer.sleep 1500 - req = request(method: :GET, - path: ["api", @command], - q: [nokey: ""], - # OAuth - auth: {:oauth, token, []}, - ip: {{127,0,0,1},60000}, - host: @domain) - result = :mod_http_api.process([@command], req) - assert 403 == elem(result, 0) # HTTP code - - # Check that the command was executed twice - assert 3 == - :meck.num_calls(:ejabberd_commands, :execute_command2, :_) - - assert :meck.validate :ejabberd_auth - #assert :meck.validate :ejabberd_commands - #assert :ok = :meck.history(:ejabberd_commands) - end - - test "Request oauth token, resource owner password credentials" do - EjabberdAuthMock.create_user @user, @domain, @userpass - :application.set_env(:oauth2, :backend, :ejabberd_oauth) - :application.start(:oauth2) - - # Mock a simple command() -> :ok - :meck.expect(:ejabberd_commands, :get_command_format, - fn (@acommand, {@user, @domain, {:oauth, _token}, false}, @version) -> - {[], {:res, :rescode}} - end) - :meck.expect(:ejabberd_commands, :get_exposed_commands, - fn () -> [@acommand] end) - - #Mock acl to allow oauth authorizations - :meck.expect(:acl, :match_rule, fn(_Server, _Access, _Jid) -> :allow end) - - - # Correct password - req = request(method: :POST, - path: ["oauth", "token"], - q: [{"grant_type", "password"}, {"scope", @command}, {"username", @user<>"@"<>@domain}, {"ttl", "4000"}, {"password", @userpass}], - ip: {{127,0,0,1},60000}, - host: @domain) - result = :ejabberd_oauth.process([], req) - assert 200 = elem(result, 0) #http code - {kv} = :jiffy.decode(elem(result,2)) - assert {_, "bearer"} = List.keyfind(kv, "token_type", 0) - assert {_, @command} = List.keyfind(kv, "scope", 0) - assert {_, 4000} = List.keyfind(kv, "expires_in", 0) - {"access_token", _token} = List.keyfind(kv, "access_token", 0) - - #missing grant_type - req = request(method: :POST, - path: ["oauth", "token"], - q: [{"scope", @command}, {"username", @user<>"@"<>@domain}, {"password", @userpass}], - ip: {{127,0,0,1},60000}, - host: @domain) - result = :ejabberd_oauth.process([], req) - assert 400 = elem(result, 0) #http code - {kv} = :jiffy.decode(elem(result,2)) - assert {_, "unsupported_grant_type"} = List.keyfind(kv, "error", 0) - - - # incorrect user/pass - req = request(method: :POST, - path: ["oauth", "token"], - q: [{"grant_type", "password"}, {"scope", @command}, {"username", @user<>"@"<>@domain}, {"password", @userpass<>"aa"}], - ip: {{127,0,0,1},60000}, - host: @domain) - result = :ejabberd_oauth.process([], req) - assert 400 = elem(result, 0) #http code - {kv} = :jiffy.decode(elem(result,2)) - assert {_, "invalid_grant"} = List.keyfind(kv, "error", 0) - - assert :meck.validate :ejabberd_auth - assert :meck.validate :ejabberd_commands - end - -end diff --git a/test/mod_http_api_test.exs b/test/mod_http_api_test.exs deleted file mode 100644 index 29405a3ec..000000000 --- a/test/mod_http_api_test.exs +++ /dev/null @@ -1,127 +0,0 @@ -# ---------------------------------------------------------------------- -# -# ejabberd, Copyright (C) 2002-2017 ProcessOne -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -# -# ---------------------------------------------------------------------- - -defmodule ModHttpApiTest do - @author "mremond@process-one.net" - - use ExUnit.Case, async: true - - require Record - Record.defrecord :request, Record.extract(:request, from_lib: "ejabberd/include/ejabberd_http.hrl") - Record.defrecord :ejabberd_commands, Record.extract(:ejabberd_commands, from_lib: "ejabberd/include/ejabberd_commands.hrl") - - setup_all do - :ok = :mnesia.start - :ejabberd_mnesia.start - :stringprep.start - :ejabberd_hooks.start_link - :ok = :ejabberd_config.start(["localhost"], []) - :acl.start_link - {:ok, _} = :ejabberd_access_permissions.start_link() - {:ok, _} = :ejabberd_commands.start_link - :ok = :ejabberd_commands.register_commands(cmds) - on_exit fn -> - :meck.unload - unregister_commands(cmds) end - end - - test "We can expose several commands to API at a time" do - setup_mocks() - assert :ok == :ejabberd_commands.expose_commands([:open_cmd, :user_cmd]) - commands = :ejabberd_commands.get_exposed_commands() - assert Enum.member?(commands, :open_cmd) - assert Enum.member?(commands, :user_cmd) - end - -# test "We can call open commands without authentication" do -# setup_mocks() -# :ejabberd_commands.expose_commands([:open_cmd]) -# request = request(method: :POST, ip: {{127,0,0,1},50000}, data: "[]") -# {200, _, _} = :mod_http_api.process(["open_cmd"], request) -# end - - # This related to the commands config file option - test "Attempting to access a command that is not exposed as HTTP API returns 403" do - setup_mocks() - assert :ok == :ejabberd_commands.expose_commands([]) - request = request(method: :POST, ip: {{127,0,0,1},50000}, data: "[]") - {403, _, _} = :mod_http_api.process(["open_cmd"], request) - end - - test "Call to user, admin or restricted commands without authentication are rejected" do - setup_mocks() - assert :ok == :ejabberd_commands.expose_commands([:user_cmd, :admin_cmd, :restricted]) - request = request(method: :POST, ip: {{127,0,0,1},50000}, data: "[]") - {403, _, _} = :mod_http_api.process(["user_cmd"], request) - {403, _, _} = :mod_http_api.process(["admin_cmd"], request) - {403, _, _} = :mod_http_api.process(["restricted_cmd"], request) - end - - @tag pending: true - test "If admin_ip_access is enabled, we can call restricted API without authentication from that IP" do - setup_mocks() - end - - # Define a set of test commands that we expose through API - # We define one for each policy type - defp cmds do - [:open, :user, :admin, :restricted] - |> Enum.map(&({&1, String.to_atom(to_string(&1) <> "_cmd")})) - |> Enum.map(fn({cmd_type, cmd}) -> - ejabberd_commands(name: cmd, tags: [:test], - policy: cmd_type, - module: __MODULE__, - function: cmd, - args: [], - result: {:res, :rescode}) - end) - end - - def open_cmd, do: :ok - def user_cmd(_, _), do: :ok - def admin_cmd, do: :ok - def restricted_cmd, do: :ok - - defp setup_mocks() do - :meck.unload - mock(:gen_mod, :get_module_opt, - fn (_server, :mod_http_api, _admin_ip_access, _, _) -> - [{:allow, [{:ip, {{127,0,0,2}, 32}}]}] - end) - end - - defp mock(module, function, fun) do - try do - :meck.new(module) - catch - :error, {:already_started, _pid} -> :ok - end - :meck.expect(module, function, fun) - end - - defp unregister_commands(commands) do - try do - :ejabberd_commands.unregister_commands(commands) - catch - _,_ -> :ok - end - end - -end diff --git a/test/mod_last_mock.exs b/test/mod_last_mock.exs deleted file mode 100644 index 25f2bd473..000000000 --- a/test/mod_last_mock.exs +++ /dev/null @@ -1,79 +0,0 @@ -# ---------------------------------------------------------------------- -# -# ejabberd, Copyright (C) 2002-2017 ProcessOne -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -# -# ---------------------------------------------------------------------- - -defmodule ModLastMock do - - require Record - Record.defrecord :session, Record.extract(:session, from_lib: "ejabberd/include/ejabberd_sm.hrl") - Record.defrecord :jid, Record.extract(:jid, from_lib: "xmpp/include/jid.hrl") - - @author "jsautret@process-one.net" - @agent __MODULE__ - - def init do - try do - Agent.stop(@agent) - catch - :exit, _e -> :ok - end - - {:ok, _pid} = Agent.start_link(fn -> %{} end, name: @agent) - - mock(:mod_last, :get_last_info, - fn (user, domain) -> - Agent.get(@agent, fn last -> - case Map.get(last, {user, domain}, :not_found) do - {ts, status} -> {:ok, ts, status} - result -> result - end - end) - end) - end - - def set_last(user, domain, status) do - set_last(user, domain, status, now) - end - - def set_last(user, domain, status, timestamp) do - Agent.update(@agent, fn last -> - Map.put(last, {user, domain}, {timestamp, status}) - end) - end - - #################################################################### - # Helpers - #################################################################### - def now() do - {megasecs, secs, _microsecs} = :os.timestamp - megasecs * 1000000 + secs - end - - # TODO refactor: Move to ejabberd_test_mock - def mock(module, function, fun) do - try do - :meck.new(module) - catch - :error, {:already_started, _pid} -> :ok - end - - :meck.expect(module, function, fun) - end - -end diff --git a/test/mod_roster_mock.exs b/test/mod_roster_mock.exs deleted file mode 100644 index 70f273898..000000000 --- a/test/mod_roster_mock.exs +++ /dev/null @@ -1,159 +0,0 @@ -# ---------------------------------------------------------------------- -# -# ejabberd, Copyright (C) 2002-2017 ProcessOne -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -# -# ---------------------------------------------------------------------- - -defmodule ModRosterMock do - @author "jsautret@process-one.net" - - require Record - Record.defrecord :roster, Record.extract(:roster, from_lib: "ejabberd/include/mod_roster.hrl") - Record.defrecord :roster_version, Record.extract(:roster_version, from_lib: "ejabberd/include/mod_roster.hrl") - - @agent __MODULE__ - - def init(domain, module) do - try do - Agent.stop(@agent) - catch - :exit, _e -> :ok - end - - {:ok, _pid} = Agent.start_link(fn -> %{} end, name: @agent) - - mock_with_meck - - :ejabberd_mnesia.create(:mod_roster_mnesia, :roster, - [ram_copies: [node()], - attributes: Keyword.keys(roster(roster())), - index: [:us]]) - :ejabberd_mnesia.create(:mod_roster_mnesia, :roster_version, - [ram_copies: [node()], - attributes: Keyword.keys(roster_version(roster_version()))]) - #:mod_roster.stop(domain) - :gen_mod.start_module(domain, :mod_roster) - end - - def mock_with_meck do -# mock(:gen_mod, :db_type, -# fn (_server, :mod_roster_mnesia) -> -# :mnesia -# end) -# -# mock(:mnesia, :transaction, -# fn (_server, function) -> -# {:atomic, function.()} -# end) -# -# mock(:mnesia, :write, -# fn (Item) -> -# throw Item -# {:atomic, :ok} -# end) - - mock(:mod_roster_mnesia, :init, - fn (_server, _opts) -> - :ok - end) - mock(:mod_roster_mnesia, :transaction, - fn (_server, function) -> - {:atomic, function.()} - end) - - mock(:mod_roster_mnesia, :update_roster_t, - fn (user, domain, {u, d, _r}, item) -> - add_roster_item(user, domain, u<>"@"<>d, - roster(item, :name), - roster(item, :subscription), - roster(item, :groups), - roster(item, :ask), - roster(item, :askmessage)) - end) - - mock(:mod_roster_mnesia, :invalidate_roster_cache, - fn (_user, _server) -> - :ok - end) - - end - - def add_roster_item(user, domain, jid, nick, subs \\ :none, groups \\ [], - ask \\ :none, askmessage \\ "") - when is_binary(user) and byte_size(user) > 0 - and is_binary(domain) and byte_size(domain) > 0 - and is_binary(jid) and byte_size(jid) > 0 - and is_binary(nick) - and is_atom(subs) - and is_list(groups) - and is_atom(ask) - and is_binary(askmessage) - do - Agent.update(@agent, fn roster -> - Map.put(roster, {user, domain, jid}, %{nick: nick, - subs: subs, groups: groups, - ask: ask, askmessage: askmessage}) - end) - end - - def remove_roster_item(user, domain, jid) do - Agent.update(@agent, fn roster -> - Map.delete(roster, {user, domain, jid}) - end) - end - - def get_rosters() do - Agent.get(@agent, fn roster -> roster end) - end - - def get_roster(user, domain) do - Agent.get(@agent, fn roster -> - for {u, d, jid} <- Map.keys(roster), u == user, d == domain, - do: {{u, d, jid}, Map.fetch!(roster, {u, d, jid})} - end) - end - - def to_record({{user, domain, jid}, r}) do - roster(usj: {user, domain, jid}, - us: {user, domain}, - jid: :jid.from_string(jid), - subscription: r.subs, - ask: r.ask, - groups: r.groups, - askmessage: r.askmessage - ) - end - def to_records(rosters) do - for item <- rosters, do: to_record(item) - end - -#################################################################### -# Helpers -#################################################################### - - # TODO refactor: Move to ejabberd_test_mock - def mock(module, function, fun) do - try do - :meck.new(module, [:non_strict, :passthrough, :unstick]) - catch - :error, {:already_started, _pid} -> :ok - end - - :meck.expect(module, function, fun) - end - -end diff --git a/test/private_tests.erl b/test/private_tests.erl new file mode 100644 index 000000000..506608670 --- /dev/null +++ b/test/private_tests.erl @@ -0,0 +1,105 @@ +%%%------------------------------------------------------------------- +%%% Author : Evgeny Khramtsov <ekhramtsov@process-one.net> +%%% Created : 23 Nov 2018 by Evgeny Khramtsov <ekhramtsov@process-one.net> +%%% +%%% +%%% ejabberd, Copyright (C) 2002-2018 ProcessOne +%%% +%%% This program is free software; you can redistribute it and/or +%%% modify it under the terms of the GNU General Public License as +%%% published by the Free Software Foundation; either version 2 of the +%%% License, or (at your option) any later version. +%%% +%%% This program is distributed in the hope that it will be useful, +%%% but WITHOUT ANY WARRANTY; without even the implied warranty of +%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%%% General Public License for more details. +%%% +%%% You should have received a copy of the GNU General Public License along +%%% with this program; if not, write to the Free Software Foundation, Inc., +%%% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +%%% +%%%------------------------------------------------------------------- +-module(private_tests). + +%% API +-compile(export_all). +-import(suite, [my_jid/1, is_feature_advertised/3, + send_recv/2, disconnect/1]). + +-include("suite.hrl"). + +%%%=================================================================== +%%% API +%%%=================================================================== +%%%=================================================================== +%%% Single user tests +%%%=================================================================== +single_cases() -> + {private_single, [sequence], + [single_test(test_features), + single_test(test_no_namespace), + single_test(test_set_get), + single_test(test_published)]}. + +test_features(Config) -> + MyJID = my_jid(Config), + true = is_feature_advertised(Config, ?NS_BOOKMARKS_CONVERSION_0, + jid:remove_resource(MyJID)), + disconnect(Config). + +test_no_namespace(Config) -> + WrongEl = #xmlel{name = <<"wrong">>}, + #iq{type = error} = + send_recv(Config, #iq{type = get, + sub_els = [#private{sub_els = [WrongEl]}]}), + disconnect(Config). + +test_set_get(Config) -> + Storage = bookmark_storage(), + StorageXMLOut = xmpp:encode(Storage), + #iq{type = result, sub_els = []} = + send_recv( + Config, #iq{type = set, + sub_els = [#private{sub_els = [StorageXMLOut]}]}), + #iq{type = result, + sub_els = [#private{sub_els = [StorageXMLIn]}]} = + send_recv( + Config, + #iq{type = get, + sub_els = [#private{sub_els = [xmpp:encode( + #bookmark_storage{})]}]}), + Storage = xmpp:decode(StorageXMLIn), + disconnect(Config). + +test_published(Config) -> + Storage = bookmark_storage(), + Node = xmpp:get_ns(Storage), + #iq{type = result, + sub_els = [#pubsub{items = #ps_items{node = Node, items = Items}}]} = + send_recv( + Config, + #iq{type = get, + sub_els = [#pubsub{items = #ps_items{node = Node}}]}), + [#ps_item{sub_els = [StorageXMLIn]}] = Items, + Storage = xmpp:decode(StorageXMLIn), + #iq{type = result, sub_els = []} = + send_recv(Config, + #iq{type = set, + sub_els = [#pubsub_owner{delete = {Node, <<>>}}]}), + disconnect(Config). + +%%%=================================================================== +%%% Internal functions +%%%=================================================================== +single_test(T) -> + list_to_atom("private_" ++ atom_to_list(T)). + +conference_bookmark() -> + #bookmark_conference{ + name = <<"Some name">>, + autojoin = true, + jid = jid:make(<<"some">>, <<"some.conference.org">>)}. + +bookmark_storage() -> + #bookmark_storage{conference = [conference_bookmark()]}. diff --git a/test/suite.erl b/test/suite.erl index efe587253..62c394a55 100644 --- a/test/suite.erl +++ b/test/suite.erl @@ -55,6 +55,7 @@ init_config(Config) -> CfgContent = process_config_tpl(CfgContentTpl, [ {c2s_port, 5222}, {loglevel, 4}, + {new_schema, false}, {s2s_port, 5269}, {component_port, 5270}, {web_port, 5280}, @@ -471,7 +472,9 @@ wait_auth_SASL_result(Config, ShouldFail) -> NS = if Type == client -> ?NS_CLIENT; Type == server -> ?NS_SERVER end, - receive #stream_start{xmlns = NS, version = {1,0}} -> ok end, + Config2 = receive #stream_start{id = ID, xmlns = NS, version = {1,0}} -> + set_opt(stream_id, ID, Config) + end, receive #stream_features{sub_els = Fs} -> if Type == client -> #xmpp_session{optional = true} = @@ -488,7 +491,7 @@ wait_auth_SASL_result(Config, ShouldFail) -> set_opt(rosterver, true, ConfigAcc); (_, ConfigAcc) -> ConfigAcc - end, Config, Fs) + end, Config2, Fs) end; #sasl_challenge{text = ClientIn} -> {Response, SASL} = (?config(sasl, Config))(ClientIn), diff --git a/test/suite.hrl b/test/suite.hrl index adc14e93a..b2515d8ce 100644 --- a/test/suite.hrl +++ b/test/suite.hrl @@ -66,12 +66,14 @@ end)()). -define(match(Pattern, Result), + (fun() -> case Result of Pattern -> - Pattern; + ok; Mismatch -> suite:match_failure([Mismatch], [??Pattern]) - end). + end + end)()). -define(COMMON_VHOST, <<"localhost">>). -define(MNESIA_VHOST, <<"mnesia.localhost">>). diff --git a/test/test_helper.exs b/test/test_helper.exs deleted file mode 100644 index 454f2338a..000000000 --- a/test/test_helper.exs +++ /dev/null @@ -1,7 +0,0 @@ -Code.require_file "ejabberd_auth_mock.exs", __DIR__ -Code.require_file "ejabberd_oauth_mock.exs", __DIR__ -Code.require_file "ejabberd_sm_mock.exs", __DIR__ -Code.require_file "mod_last_mock.exs", __DIR__ -Code.require_file "mod_roster_mock.exs", __DIR__ - -ExUnit.start |