diff --git a/test/emqttd_access_control_tests.erl b/test/emqttd_access_control_tests.erl index 9bf3f4539..78796b6b1 100644 --- a/test/emqttd_access_control_tests.erl +++ b/test/emqttd_access_control_tests.erl @@ -22,79 +22,72 @@ -include_lib("eunit/include/eunit.hrl"). -reload_acl_test() -> - with_acl( - fun() -> - ?assertEqual([ok], emqttd_access_control:reload_acl()) - end). +-define(AC, emqttd_access_control). -register_mod_test() -> - with_acl( - fun() -> - emqttd_access_control:register_mod(acl, emqttd_acl_test_mod, []), - ?assertMatch([{emqttd_acl_test_mod, _, 0}, {emqttd_acl_internal, _, 0}], - emqttd_access_control:lookup_mods(acl)), - emqttd_access_control:register_mod(auth, emqttd_auth_anonymous_test_mod,[]), - emqttd_access_control:register_mod(auth, emqttd_auth_dashboard, [], 99), - ?assertMatch([{emqttd_auth_dashboard, _, 99}, - {emqttd_auth_anonymous_test_mod, _, 0}, - {emqttd_auth_anonymous, _, 0}], - emqttd_access_control:lookup_mods(auth)) - end). +acl_test_() -> + {foreach, + fun setup/0, + fun teardown/1, + [?_test(t_reload_acl()), + ?_test(t_register_mod()), + ?_test(t_unregister_mod()), + ?_test(t_check_acl()) + ]}. -unregister_mod_test() -> - with_acl( - fun() -> - emqttd_access_control:register_mod(acl, emqttd_acl_test_mod, []), - ?assertMatch([{emqttd_acl_test_mod, _, 0}, {emqttd_acl_internal, _, 0}], - emqttd_access_control:lookup_mods(acl)), - emqttd_access_control:unregister_mod(acl, emqttd_acl_test_mod), - timer:sleep(5), - ?assertMatch([{emqttd_acl_internal, _, 0}], emqttd_access_control:lookup_mods(acl)), - - emqttd_access_control:register_mod(auth, emqttd_auth_anonymous_test_mod,[]), - ?assertMatch([{emqttd_auth_anonymous_test_mod, _, 0}, {emqttd_auth_anonymous, _, 0}], - emqttd_access_control:lookup_mods(auth)), - - emqttd_access_control:unregister_mod(auth, emqttd_auth_anonymous_test_mod), - timer:sleep(5), - ?assertMatch([{emqttd_auth_anonymous, _, 0}], emqttd_access_control:lookup_mods(auth)) - end). - -check_acl_test() -> - with_acl( - fun() -> - User1 = #mqtt_client{client_id = <<"client1">>, username = <<"testuser">>}, - User2 = #mqtt_client{client_id = <<"client2">>, username = <<"xyz">>}, - ?assertEqual(allow, emqttd_access_control:check_acl(User1, subscribe, <<"users/testuser/1">>)), - ?assertEqual(allow, emqttd_access_control:check_acl(User1, subscribe, <<"clients/client1">>)), - ?assertEqual(deny, emqttd_access_control:check_acl(User1, subscribe, <<"clients/client1/x/y">>)), - ?assertEqual(allow, emqttd_access_control:check_acl(User1, publish, <<"users/testuser/1">>)), - ?assertEqual(allow, emqttd_access_control:check_acl(User1, subscribe, <<"a/b/c">>)), - ?assertEqual(deny, emqttd_access_control:check_acl(User2, subscribe, <<"a/b/c">>)) - end). - -with_acl(Fun) -> - process_flag(trap_exit, true), +setup() -> AclOpts = [ - {auth, [ - %% Authentication with username, password - %{username, []}, - %% Authentication with clientid - %{clientid, [{password, no}, {file, "etc/clients.config"}]}, - %% Allow all - {anonymous, []} - ]}, - %% ACL config - {acl, [ + {auth, [{anonymous, []}]}, + {acl, [ %% ACL config %% Internal ACL module - {internal, [{file, "../test/test_acl.config"}, {nomatch, allow}]} + {internal, [{file, "./testdata/test_acl.config"}, {nomatch, allow}]} ]} ], - %application:set_env(emqttd, access, AclOpts), - emqttd_access_control:start_link(AclOpts), - Fun(), - emqttd_access_control:stop(). + ?AC:start_link(AclOpts). + +teardown({ok, _Pid}) -> + ?AC:stop(). + +t_reload_acl() -> + ?assertEqual([ok], ?AC:reload_acl()). + +t_register_mod() -> + ?AC:register_mod(acl, emqttd_acl_test_mod, []), + ?assertMatch([{emqttd_acl_test_mod, _, 0}, + {emqttd_acl_internal, _, 0}], + ?AC:lookup_mods(acl)), + ?AC:register_mod(auth, emqttd_auth_anonymous_test_mod,[]), + ?AC:register_mod(auth, emqttd_auth_dashboard, [], 99), + ?assertMatch([{emqttd_auth_dashboard, _, 99}, + {emqttd_auth_anonymous_test_mod, _, 0}, + {emqttd_auth_anonymous, _, 0}], + ?AC:lookup_mods(auth)). + +t_unregister_mod() -> + ?AC:register_mod(acl, emqttd_acl_test_mod, []), + ?assertMatch([{emqttd_acl_test_mod, _, 0}, {emqttd_acl_internal, _, 0}], + ?AC:lookup_mods(acl)), + ?AC:unregister_mod(acl, emqttd_acl_test_mod), + timer:sleep(5), + ?assertMatch([{emqttd_acl_internal, _, 0}], ?AC:lookup_mods(acl)), + + ?AC:register_mod(auth, emqttd_auth_anonymous_test_mod,[]), + ?assertMatch([{emqttd_auth_anonymous_test_mod, _, 0}, + {emqttd_auth_anonymous, _, 0}], + ?AC:lookup_mods(auth)), + + ?AC:unregister_mod(auth, emqttd_auth_anonymous_test_mod), + timer:sleep(5), + ?assertMatch([{emqttd_auth_anonymous, _, 0}], ?AC:lookup_mods(auth)). + +t_check_acl() -> + User1 = #mqtt_client{client_id = <<"client1">>, username = <<"testuser">>}, + User2 = #mqtt_client{client_id = <<"client2">>, username = <<"xyz">>}, + ?assertEqual(allow, ?AC:check_acl(User1, subscribe, <<"users/testuser/1">>)), + ?assertEqual(allow, ?AC:check_acl(User1, subscribe, <<"clients/client1">>)), + ?assertEqual(deny, ?AC:check_acl(User1, subscribe, <<"clients/client1/x/y">>)), + ?assertEqual(allow, ?AC:check_acl(User1, publish, <<"users/testuser/1">>)), + ?assertEqual(allow, ?AC:check_acl(User1, subscribe, <<"a/b/c">>)), + ?assertEqual(deny, ?AC:check_acl(User2, subscribe, <<"a/b/c">>)). -endif. diff --git a/test/emqttd_access_rule_tests.erl b/test/emqttd_access_rule_tests.erl index 9a8cf09b7..fc42d2b5b 100644 --- a/test/emqttd_access_rule_tests.erl +++ b/test/emqttd_access_rule_tests.erl @@ -16,18 +16,18 @@ -module(emqttd_access_rule_tests). --import(emqttd_access_rule, [compile/1, match/3]). +-ifdef(TEST). -include("emqttd.hrl"). --ifdef(TEST). - -include_lib("eunit/include/eunit.hrl"). +-import(emqttd_access_rule, [compile/1, match/3]). + compile_test() -> ?assertMatch({allow, {'and', [{ipaddr, {"127.0.0.1", _I, _I}}, - {user, <<"user">>}]}, subscribe, [ [<<"$SYS">>, '#'], ['#'] ]}, + {user, <<"user">>}]}, subscribe, [ [<<"$SYS">>, '#'], ['#'] ]}, compile({allow, {'and', [{ipaddr, "127.0.0.1"}, {user, <<"user">>}]}, subscribe, ["$SYS/#", "#"]})), ?assertMatch({allow, {'or', [{ipaddr, {"127.0.0.1", _I, _I}}, {user, <<"user">>}]}, subscribe, [ [<<"$SYS">>, '#'], ['#'] ]}, diff --git a/test/emqttd_guid_tests.erl b/test/emqttd_guid_tests.erl index a55e0359e..a53f73959 100644 --- a/test/emqttd_guid_tests.erl +++ b/test/emqttd_guid_tests.erl @@ -24,7 +24,10 @@ gen_test() -> Guid1 = emqttd_guid:gen(), Guid2 = emqttd_guid:gen(), ?assertMatch(<<_:128>>, Guid1), - ?assertEqual(true, Guid2 >= Guid1). + ?assertEqual(true, Guid2 >= Guid1), + emqttd_guid:ts(r17), + {Ts, _, 0} = Tup = emqttd_guid:new(), + ?assertEqual(Ts, emqttd_guid:timestamp(emqttd_guid:bin(Tup))). -endif. diff --git a/test/emqttd_message_tests.erl b/test/emqttd_message_tests.erl new file mode 100644 index 000000000..81350bcbd --- /dev/null +++ b/test/emqttd_message_tests.erl @@ -0,0 +1,70 @@ +%%-------------------------------------------------------------------- +%% Copyright (c) 2012-2016 Feng Lee . +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%%-------------------------------------------------------------------- + +-module(emqttd_message_tests). + +-ifdef(TEST). + +-include("emqttd.hrl"). + +-include("emqttd_protocol.hrl"). + +-include_lib("eunit/include/eunit.hrl"). + +-define(M, emqttd_message). + +make_test() -> + Msg = ?M:make(<<"clientid">>, <<"topic">>, <<"payload">>), + ?assertEqual(0, Msg#mqtt_message.qos), + ?assertEqual(undefined, Msg#mqtt_message.msgid), + Msg1 = ?M:make(<<"clientid">>, qos2, <<"topic">>, <<"payload">>), + ?assert(is_binary(Msg1#mqtt_message.msgid)), + ?assertEqual(2, Msg1#mqtt_message.qos). + +from_packet_test() -> + Msg = ?M:from_packet(?PUBLISH_PACKET(1, <<"topic">>, 10, <<"payload">>)), + ?assertEqual(1, Msg#mqtt_message.qos), + ?assertEqual(10, Msg#mqtt_message.pktid), + ?assertEqual(<<"topic">>, Msg#mqtt_message.topic), + + WillMsg = ?M:from_packet(#mqtt_packet_connect{will_flag = true, + will_topic = <<"WillTopic">>, + will_msg = <<"WillMsg">>}), + ?assertEqual(<<"WillTopic">>, WillMsg#mqtt_message.topic), + ?assertEqual(<<"WillMsg">>, WillMsg#mqtt_message.payload), + + Msg2 = ?M:from_packet(<<"username">>, <<"clientid">>, + ?PUBLISH_PACKET(1, <<"topic">>, 20, <<"payload">>)), + ?assertEqual(<<"clientid">>, Msg2#mqtt_message.from), + ?assertEqual(<<"username">>, Msg2#mqtt_message.sender), + ?debugFmt("~s", [?M:format(Msg2)]). + +flag_test() -> + Pkt = ?PUBLISH_PACKET(1, <<"t">>, 2, <<"payload">>), + Msg2 = ?M:from_packet(<<"clientid">>, Pkt), + Msg3 = ?M:set_flag(retain, Msg2), + Msg4 = ?M:set_flag(dup, Msg3), + ?assert(Msg4#mqtt_message.dup), + ?assert(Msg4#mqtt_message.retain), + Msg5 = ?M:set_flag(Msg4), + Msg6 = ?M:unset_flag(dup, Msg5), + Msg7 = ?M:unset_flag(retain, Msg6), + ?assertNot(Msg7#mqtt_message.dup), + ?assertNot(Msg7#mqtt_message.retain), + ?M:unset_flag(Msg7), + ?M:to_packet(Msg7). + +-endif. diff --git a/test/emqttd_mod_subscription_tests.erl b/test/emqttd_mod_subscription_tests.erl index 766963dc2..0d8966d2b 100644 --- a/test/emqttd_mod_subscription_tests.erl +++ b/test/emqttd_mod_subscription_tests.erl @@ -16,17 +16,19 @@ -module(emqttd_mod_subscription_tests). --include("emqttd.hrl"). - -ifdef(TEST). +-include("emqttd.hrl"). + -include_lib("eunit/include/eunit.hrl"). -define(M, emqttd_mod_subscription). rep_test() -> - ?assertEqual(<<"topic/clientId">>, ?M:rep(<<"$c">>, <<"clientId">>, <<"topic/$c">>)), - ?assertEqual(<<"topic/username">>, ?M:rep(<<"$u">>, <<"username">>, <<"topic/$u">>)), + ?assertEqual(<<"topic/clientId">>, + ?M:rep(<<"$c">>, <<"clientId">>, <<"topic/$c">>)), + ?assertEqual(<<"topic/username">>, + ?M:rep(<<"$u">>, <<"username">>, <<"topic/$u">>)), ?assertEqual(<<"topic/username/clientId">>, ?M:rep(<<"$c">>, <<"clientId">>, ?M:rep(<<"$u">>, <<"username">>, <<"topic/$u/$c">>))). diff --git a/test/emqttd_mqueue_tests.erl b/test/emqttd_mqueue_tests.erl index 61cb06104..a8d6e1137 100644 --- a/test/emqttd_mqueue_tests.erl +++ b/test/emqttd_mqueue_tests.erl @@ -16,14 +16,14 @@ -module(emqttd_mqueue_tests). --include("emqttd.hrl"). - --define(Q, emqttd_mqueue). - -ifdef(TEST). +-include("emqttd.hrl"). + -include_lib("eunit/include/eunit.hrl"). +-define(Q, emqttd_mqueue). + in_test() -> Opts = [{max_length, 5}, {queue_qos0, true}], diff --git a/test/emqttd_node_tests.erl b/test/emqttd_node_tests.erl new file mode 100644 index 000000000..fd4ce590d --- /dev/null +++ b/test/emqttd_node_tests.erl @@ -0,0 +1,35 @@ +%%-------------------------------------------------------------------- +%% Copyright (c) 2016 Feng Lee . +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%%-------------------------------------------------------------------- + +-module(emqttd_node_tests). + +-author("Feng Lee "). + +-ifdef(TEST). + +-include_lib("eunit/include/eunit.hrl"). + +is_aliving_test() -> + ?debugFmt("Node: ~p~n", [node()]), + ?assert(emqttd_node:is_aliving(node())), + ?assertNot(emqttd_node:is_aliving('x@127.0.0.1')). + +parse_name_test() -> + ?assertEqual('a@127.0.0.1', emqttd_node:parse_name("a@127.0.0.1")), + ?assertEqual('b@127.0.0.1', emqttd_node:parse_name("b")). + +-endif. + diff --git a/test/emqttd_opts_tests.erl b/test/emqttd_opts_tests.erl index b154a84a4..989ad6bba 100644 --- a/test/emqttd_opts_tests.erl +++ b/test/emqttd_opts_tests.erl @@ -30,10 +30,11 @@ merge_test() -> Opts = emqttd_opts:merge(?SOCKOPTS, [raw, - {backlog, 1024}, - {nodelay, false}, - {max_clients, 1024}, - {acceptors, 16}]), + binary, + {backlog, 1024}, + {nodelay, false}, + {max_clients, 1024}, + {acceptors, 16}]), ?assertEqual(1024, proplists:get_value(backlog, Opts)), ?assertEqual(1024, proplists:get_value(max_clients, Opts)), ?assertEqual(lists:sort(Opts), [binary, raw, diff --git a/test/emqttd_packet_tests.erl b/test/emqttd_packet_tests.erl new file mode 100644 index 000000000..c45b4a6ff --- /dev/null +++ b/test/emqttd_packet_tests.erl @@ -0,0 +1,56 @@ +%%-------------------------------------------------------------------- +%% Copyright (c) 2012-2016 Feng Lee . +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%%-------------------------------------------------------------------- + +-module(emqttd_packet_tests). + +-ifdef(TEST). + +-include("emqttd_protocol.hrl"). + +-include_lib("eunit/include/eunit.hrl"). + +-define(P, emqttd_packet). + +protocol_name_test() -> + ?assertEqual(<<"MQIsdp">>, ?P:protocol_name(3)), + ?assertEqual(<<"MQTT">>, ?P:protocol_name(4)). + +type_name_test() -> + ?assertEqual( 'CONNECT', ?P:type_name(?CONNECT) ), + ?assertEqual( 'UNSUBSCRIBE', ?P:type_name(?UNSUBSCRIBE) ). + +connack_name_test() -> + ?assertEqual( 'CONNACK_ACCEPT', ?P:connack_name(?CONNACK_ACCEPT) ), + ?assertEqual( 'CONNACK_PROTO_VER', ?P:connack_name(?CONNACK_PROTO_VER) ), + ?assertEqual( 'CONNACK_INVALID_ID', ?P:connack_name(?CONNACK_INVALID_ID) ), + ?assertEqual( 'CONNACK_SERVER', ?P:connack_name(?CONNACK_SERVER) ), + ?assertEqual( 'CONNACK_CREDENTIALS', ?P:connack_name(?CONNACK_CREDENTIALS) ), + ?assertEqual( 'CONNACK_AUTH', ?P:connack_name(?CONNACK_AUTH) ). + +format_test() -> + ?debugFmt("~s", [?P:format(?CONNECT_PACKET(#mqtt_packet_connect{}))]), + ?debugFmt("~s", [?P:format(?CONNACK_PACKET(?CONNACK_SERVER))]), + ?debugFmt("~s", [?P:format(?PUBLISH_PACKET(?QOS_1, 1))]), + ?debugFmt("~s", [?P:format(?PUBLISH_PACKET(?QOS_2, <<"topic">>, 10, <<"payload">>))]), + ?debugFmt("~s", [?P:format(?PUBACK_PACKET(?PUBACK, 98))]), + ?debugFmt("~s", [?P:format(?PUBREL_PACKET(99))]), + ?debugFmt("~s", [?P:format(?SUBSCRIBE_PACKET(15, [{<<"topic">>, ?QOS0}, {<<"topic1">>, ?QOS1}]))]), + ?debugFmt("~s", [?P:format(?SUBACK_PACKET(40, [?QOS0, ?QOS1]))]), + ?debugFmt("~s", [?P:format(?UNSUBSCRIBE_PACKET(89, [<<"t">>, <<"t2">>]))]), + ?debugFmt("~s", [?P:format(?UNSUBACK_PACKET(90))]). + +-endif. + diff --git a/test/emqttd_retainer_tests.erl b/test/emqttd_retainer_tests.erl index ff175cf19..efb9103c5 100644 --- a/test/emqttd_retainer_tests.erl +++ b/test/emqttd_retainer_tests.erl @@ -16,15 +16,14 @@ -module(emqttd_retainer_tests). --include("emqttd.hrl"). - -ifdef(TEST). +-include("emqttd.hrl"). + -include_lib("eunit/include/eunit.hrl"). retain_test() -> mnesia:start(), - emqttd_retainer:mnesia(boot), - mnesia:stop(). + emqttd_retainer:mnesia(boot). -endif. diff --git a/test/emqttd_router_tests.erl b/test/emqttd_router_tests.erl index ed29ea103..956c86a4a 100644 --- a/test/emqttd_router_tests.erl +++ b/test/emqttd_router_tests.erl @@ -16,31 +16,35 @@ -module(emqttd_router_tests). --include("emqttd.hrl"). - -ifdef(TEST). +-include("emqttd.hrl"). + -include_lib("eunit/include/eunit.hrl"). -define(R, emqttd_router). route_test_() -> - {foreach, - fun setup/0, fun teardown/1, - [?_test(t_add_route()), - ?_test(t_add_routes()), - ?_test(t_delete_route()), - ?_test(t_delete_routes()), - ?_test(t_route()) - ]}. + {timeout, 60, + [{setup, + fun setup/0, + fun teardown/1, + [?_test(t_add_del_route()), + ?_test(t_add_del_routes()), + ?_test(t_route()) + ]} + ]}. setup() -> application:start(gproc), - ensure_tab(route, [public, named_table, duplicate_bag]), + application:start(mnesia), + emqttd_pubsub:create_table(topic, ram_copies), + emqttd_trie:mnesia(boot), + emqttd_pubsub_sup:create_tab(route), gproc_pool:new(router, hash, [{size, 2}]), lists:foreach(fun(I) -> gproc_pool:add_worker(router, {router, I}, I), - {ok, R} = ?R:start_link(router, I, fun(_) -> ok end, []) + {ok, R} = ?R:start_link(router, I, fun(_) -> ok end, [{route_aging, 2}]) end, [1, 2]). ensure_tab(Tab, Opts) -> @@ -54,18 +58,29 @@ teardown(_) -> ?R:stop(I), gproc_pool:remove_worker(router, {router, I}) end, [1, 2]), gproc_pool:delete(router), - ets:delete(route). + ets:delete(route), + application:stop(gproc). -t_add_route() -> +t_add_del_route() -> Self = self(), ?R:add_route(<<"topic1">>, Self), ?assert(?R:has_route(<<"topic1">>)), ?R:add_route(<<"topic2">>, Self), ?assert(?R:has_route(<<"topic2">>)), ?assertEqual([Self], ?R:lookup_routes(<<"topic1">>)), - ?assertEqual([Self], ?R:lookup_routes(<<"topic2">>)). + ?assertEqual([Self], ?R:lookup_routes(<<"topic2">>)), + %% Del topic1 + ?R:delete_route(<<"topic1">>, Self), + erlang:yield(), + timer:sleep(10), + ?assertNot(?R:has_route(<<"topic1">>)), + %% Del topic2 + ?R:delete_route(<<"topic2">>, Self), + erlang:yield(), + timer:sleep(10), + ?assertNot(?R:has_route(<<"topic2">>)). -t_add_routes() -> +t_add_del_routes() -> Self = self(), ?R:add_routes([], Self), ?R:add_routes([<<"t0">>], Self), @@ -73,29 +88,16 @@ t_add_routes() -> ?assert(?R:has_route(<<"t1">>)), ?assertEqual([Self], ?R:lookup_routes(<<"t1">>)), ?assertEqual([Self], ?R:lookup_routes(<<"t2">>)), - ?assertEqual([Self], ?R:lookup_routes(<<"t3">>)). + ?assertEqual([Self], ?R:lookup_routes(<<"t3">>)), -t_delete_route() -> - Self = self(), - ?R:add_routes([<<"t1">>,<<"t2">>,<<"t3">>], Self), - ?assert(?R:has_route(<<"t1">>)), - ?R:delete_route(<<"t2">>, Self), - erlang:yield(), - ?assertNot(?R:has_route(<<"t2">>)), - ?assert(?R:has_route(<<"t1">>)), - ?R:delete_route(<<"t3">>, Self), - erlang:yield(), - ?assertNot(?R:has_route(<<"t3">>)). - -t_delete_routes() -> - Self = self(), - ?R:add_routes([<<"t1">>,<<"t2">>,<<"t3">>], Self), ?R:delete_routes([<<"t3">>], Self), - erlang:yield(), %% for delete_routes is cast - ?assertNot(?R:has_route(<<"t3">>)), - ?R:delete_routes([<<"t1">>, <<"t2">>], Self), + ?R:delete_routes([<<"t0">>, <<"t1">>], Self), erlang:yield(), - ?assertNot(?R:has_route(<<"t2">>)). + timer:sleep(10), + ?assertNot(?R:has_route(<<"t0">>)), + ?assertNot(?R:has_route(<<"t1">>)), + ?assert(?R:has_route(<<"t2">>)), + ?assertNot(?R:has_route(<<"t3">>)). t_route() -> Self = self(), diff --git a/test/emqttd_serializer_tests.erl b/test/emqttd_serializer_tests.erl index 414cd0cce..98bb894f3 100644 --- a/test/emqttd_serializer_tests.erl +++ b/test/emqttd_serializer_tests.erl @@ -25,7 +25,15 @@ -import(emqttd_serializer, [serialize/1]). serialize_connect_test() -> - serialize(?CONNECT_PACKET(#mqtt_packet_connect{})). + serialize(?CONNECT_PACKET(#mqtt_packet_connect{})), + serialize(?CONNECT_PACKET(#mqtt_packet_connect{ + client_id = <<"clientId">>, + will_qos = ?QOS1, + will_flag = true, + will_retain = true, + will_topic = <<"will">>, + will_msg = <<"haha">>, + clean_sess = true})). serialize_connack_test() -> ConnAck = #mqtt_packet{header = #mqtt_packet_header{type = ?CONNACK}, @@ -34,7 +42,8 @@ serialize_connack_test() -> serialize_publish_test() -> serialize(?PUBLISH_PACKET(?QOS_0, <<"Topic">>, undefined, <<"Payload">>)), - serialize(?PUBLISH_PACKET(?QOS_1, <<"Topic">>, 938, <<"Payload">>)). + serialize(?PUBLISH_PACKET(?QOS_1, <<"Topic">>, 938, <<"Payload">>)), + serialize(?PUBLISH_PACKET(?QOS_2, <<"Topic">>, 99, long_payload())). serialize_puback_test() -> serialize(?PUBACK_PACKET(?PUBACK, 10384)). @@ -64,5 +73,8 @@ serialize_pingresp_test() -> serialize_disconnect_test() -> serialize(?PACKET(?DISCONNECT)). +long_payload() -> + iolist_to_binary(["payload." || _I <- lists:seq(1, 100)]). + -endif. diff --git a/test/emqttd_tests.erl b/test/emqttd_tests.erl index 535543e3a..5c4f6fd1f 100644 --- a/test/emqttd_tests.erl +++ b/test/emqttd_tests.erl @@ -20,5 +20,12 @@ -include_lib("eunit/include/eunit.hrl"). +start_stop_test() -> + application:start(lager), + application:ensure_all_started(emqttd), + application:stop(emqttd), + application:stop(esockd), + application:stop(gproc). + -endif. diff --git a/test/emqttd_time_tests.erl b/test/emqttd_time_tests.erl index 7e33d19db..4469a546a 100644 --- a/test/emqttd_time_tests.erl +++ b/test/emqttd_time_tests.erl @@ -20,7 +20,7 @@ -include_lib("eunit/include/eunit.hrl"). -test_() -> +all_test() -> emqttd_time:seed(), emqttd_time:now_to_secs(), emqttd_time:now_to_ms(). diff --git a/test/emqttd_topic_tests.erl b/test/emqttd_topic_tests.erl index 57e6ef25b..8125b4bf2 100644 --- a/test/emqttd_topic_tests.erl +++ b/test/emqttd_topic_tests.erl @@ -20,9 +20,10 @@ -include_lib("eunit/include/eunit.hrl"). --import(emqttd_topic, [validate/1, wildcard/1, match/2, triples/1, words/1]). +-import(emqttd_topic, [validate/1, wildcard/1, match/2, triples/1, words/1, + join/1, feed_var/3, is_queue/1, systop/1]). --define(N, 100000). +-define(N, 10000). validate_test() -> ?assert( validate({filter, <<"sport/tennis/#">>}) ), @@ -30,6 +31,8 @@ validate_test() -> ?assert( validate({filter, <<"/a/b">>}) ), ?assert( validate({filter, <<"/+/x">>}) ), ?assert( validate({filter, <<"/a/b/c/#">>}) ), + ?assert( validate({filter, <<"x">>}) ), + ?assertNot( validate({name, <<>>}) ), ?assertNot( validate({filter, <<"a/#/c">>}) ), ?assertNot( validate({filter, <<"sport/tennis#">>}) ), ?assertNot( validate({filter, <<"sport/tennis/#/ranking">>}) ). @@ -51,7 +54,16 @@ match_test() -> %% paho test ?assert( match(<<"Topic/C">>, <<"+/+">>) ), ?assert( match(<<"TopicA/B">>, <<"+/+">>) ), - ?assert( match(<<"TopicA/C">>, <<"+/+">>) ). + ?assert( match(<<"TopicA/C">>, <<"+/+">>) ), + + ?assert( match(<<"abc">>, <<"+">>) ), + ?assert( match(<<"a/b/c">>, <<"a/b/c">>) ), + ?assertNot( match(<<"a/b/c">>, <<"a/c/d">>) ), + ?assertNot( match(<<"$shared/x/y">>, <<"+">>) ), + ?assertNot( match(<<"$shared/x/y">>, <<"+/x/y">>) ), + ?assertNot( match(<<"$shared/x/y">>, <<"#">>) ), + ?assertNot( match(<<"$shared/x/y">>, <<"+/+/#">>) ), + ?assertNot( match(<<"house/1/sensor/0">>, <<"house/+">>) ). sigle_level_match_test() -> ?assert( match(<<"sport/tennis/player1">>, <<"sport/tennis/+">>) ), @@ -103,6 +115,7 @@ type_test() -> ?assertEqual(true, wildcard(<<"/a/b/#">>)). words_test() -> + ?assertEqual(['', <<"a">>, '+', '#'], words(<<"/a/+/#">>) ), ?assertMatch(['', <<"abkc">>, <<"19383">>, '+', <<"akakdkkdkak">>, '#'], words(<<"/abkc/19383/+/akakdkkdkak/#">>)), {Time, _} = timer:tc(fun() -> [words(<<"/abkc/19383/+/akakdkkdkak/#">>) || _I <- lists:seq(1, ?N)] @@ -114,11 +127,32 @@ words_test() -> ?debugFmt("Time for binary:split: ~p(micro)", [Time2/?N]), ok. +is_queue_test() -> + ?assert( is_queue(<<"$Q/queue">>) ), + ?assert( is_queue(<<"$q/queue">>) ), + ?assertNot( is_queue(<<"xyz/queue">>) ). + +systop_test() -> + ?assertEqual( iolist_to_binary(["$SYS/brokers/", atom_to_list(node()), "/xyz"]), systop('xyz') ), + ?assertEqual( iolist_to_binary(["$SYS/brokers/", atom_to_list(node()), "/abc"]), systop(<<"abc">>) ). + feed_var_test() -> - ?assertEqual(<<"$Q/client/clientId">>, emqttd_topic:feed_var(<<"$c">>, <<"clientId">>, <<"$Q/client/$c">>)). + ?assertEqual(<<"$Q/client/clientId">>, feed_var(<<"$c">>, <<"clientId">>, <<"$Q/client/$c">>)), + ?assertEqual(<<"username/test/client/x">>, + feed_var(<<"%u">>, <<"test">>, <<"username/%u/client/x">>)), + ?assertEqual(<<"username/test/client/clientId">>, + feed_var(<<"%c">>, <<"clientId">>, <<"username/test/client/%c">>)). join_test() -> - ?assertEqual(<<"/ab/cd/ef/">>, emqttd_topic:join(words(<<"/ab/cd/ef/">>))), - ?assertEqual(<<"ab/+/#">>, emqttd_topic:join(words(<<"ab/+/#">>))). + ?assertEqual(<<"/ab/cd/ef/">>, join(words(<<"/ab/cd/ef/">>))), + ?assertEqual(<<"ab/+/#">>, join(words(<<"ab/+/#">>))), + ?assertEqual( <<"x/y/z/+">>, join([<<"x">>, <<"y">>, <<"z">>, '+']) ), + ?assertEqual( <<>>, join([]) ), + ?assertEqual( <<"x">>, join([<<"x">>]) ), + ?assertEqual( <<"#">>, join(['#']) ), + ?assertEqual( <<"+//#">>, join(['+', '', '#']) ). + +long_topic() -> + iolist_to_binary([[integer_to_list(I), "/"] || I <- lists:seq(0, 10000)]). -endif. diff --git a/test/test_acl.config b/test/test_acl.config deleted file mode 100644 index 4a2c6ea44..000000000 --- a/test/test_acl.config +++ /dev/null @@ -1,16 +0,0 @@ -{allow, {ipaddr, "127.0.0.1"}, subscribe, ["$SYS/#", "#"]}. - -{allow, {user, "testuser"}, subscribe, ["a/b/c", "d/e/f/#"]}. - -{allow, {user, "admin"}, pubsub, ["a/b/c", "d/e/f/#"]}. - -{allow, {client, "testClient"}, subscribe, ["testTopics/testClient"]}. - -{allow, all, subscribe, ["clients/$c"]}. - -{allow, all, pubsub, ["users/$u/#"]}. - -{deny, all, subscribe, ["$SYS/#", "#"]}. - -{deny, all}. -