diff --git a/src/emqx_time.erl b/src/emqx_time.erl new file mode 100644 index 000000000..211ea3d9e --- /dev/null +++ b/src/emqx_time.erl @@ -0,0 +1,51 @@ +%%-------------------------------------------------------------------- +%% Copyright (c) 2019 EMQ Technologies Co., Ltd. All Rights Reserved. +%% +%% 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(emqx_time). + +-export([ seed/0 + , now_secs/0 + , now_secs/1 + , now_ms/0 + , now_ms/1 + ]). + +-compile({inline, + [ seed/0 + , now_secs/0 + , now_secs/1 + , now_ms/0 + , now_ms/1 + ]}). + +seed() -> + rand:seed(exsplus, erlang:timestamp()). + +-spec(now_secs() -> pos_integer()). +now_secs() -> + erlang:system_time(second). + +-spec(now_secs(erlang:timestamp()) -> pos_integer()). +now_secs({MegaSecs, Secs, _MicroSecs}) -> + MegaSecs * 1000000 + Secs. + +-spec(now_ms() -> pos_integer()). +now_ms() -> + erlang:system_time(millisecond). + +-spec(now_ms(erlang:timestamp()) -> pos_integer()). +now_ms({MegaSecs, Secs, MicroSecs}) -> + (MegaSecs * 1000000 + Secs) * 1000 + round(MicroSecs/1000). \ No newline at end of file diff --git a/test/emqx_broker_helper_SUITE.erl b/test/emqx_broker_helper_SUITE.erl index 4e287f341..aa41e2cd7 100644 --- a/test/emqx_broker_helper_SUITE.erl +++ b/test/emqx_broker_helper_SUITE.erl @@ -23,15 +23,8 @@ all() -> emqx_ct:all(?MODULE). -init_per_suite(Config) -> - emqx_ct_helpers:boot_modules(all), - emqx_ct_helpers:start_apps([]), - Config. - -end_per_suite(_Config) -> - emqx_ct_helpers:stop_apps([]). - init_per_testcase(_TestCase, Config) -> + emqx_broker_helper:start_link(), Config. end_per_testcase(_TestCase, Config) -> diff --git a/test/emqx_channel_SUITE.erl b/test/emqx_channel_SUITE.erl index f8a910a47..7887eeca3 100644 --- a/test/emqx_channel_SUITE.erl +++ b/test/emqx_channel_SUITE.erl @@ -94,18 +94,9 @@ t_chan_info(_) -> t_chan_attrs(_) -> #{conn_state := connected} = emqx_channel:attrs(channel()). -t_chan_stats(_) -> - [] = emqx_channel:stats(channel()). - t_chan_caps(_) -> Caps = emqx_channel:caps(channel()). -t_chan_recvd(_) -> - _Channel = emqx_channel:recvd(10, channel()). - -t_chan_sent(_) -> - _Channel = emqx_channel:sent(10, channel()). - %%-------------------------------------------------------------------- %% Test cases for channel init %%-------------------------------------------------------------------- @@ -140,86 +131,86 @@ t_handle_in_qos0_publish(_) -> ok = meck:expect(emqx_broker, publish, fun(_) -> ok end), Channel = channel(#{conn_state => connected}), Publish = ?PUBLISH_PACKET(?QOS_0, <<"topic">>, undefined, <<"payload">>), - {ok, NChannel} = emqx_channel:handle_in(Publish, Channel), - ?assertEqual(#{publish_in => 1}, emqx_channel:info(pub_stats, NChannel)). + {ok, _NChannel} = emqx_channel:handle_in(Publish, Channel). + % ?assertEqual(#{publish_in => 1}, emqx_channel:info(pub_stats, NChannel)). t_handle_in_qos1_publish(_) -> ok = meck:expect(emqx_broker, publish, fun(_) -> ok end), Channel = channel(#{conn_state => connected}), Publish = ?PUBLISH_PACKET(?QOS_1, <<"topic">>, 1, <<"payload">>), - {ok, ?PUBACK_PACKET(1, RC), NChannel} = emqx_channel:handle_in(Publish, Channel), - ?assert((RC == ?RC_SUCCESS) orelse (RC == ?RC_NO_MATCHING_SUBSCRIBERS)), - ?assertEqual(#{publish_in => 1, puback_out => 1}, emqx_channel:info(pub_stats, NChannel)). + {ok, ?PUBACK_PACKET(1, RC), _NChannel} = emqx_channel:handle_in(Publish, Channel), + ?assert((RC == ?RC_SUCCESS) orelse (RC == ?RC_NO_MATCHING_SUBSCRIBERS)). + % ?assertEqual(#{publish_in => 1, puback_out => 1}, emqx_channel:info(pub_stats, NChannel)). t_handle_in_qos2_publish(_) -> ok = meck:expect(emqx_session, publish, fun(_, _Msg, Session) -> {ok, [], Session} end), ok = meck:expect(emqx_session, info, fun(awaiting_rel_timeout, _Session) -> 300000 end), Channel = channel(#{conn_state => connected}), Publish = ?PUBLISH_PACKET(?QOS_2, <<"topic">>, 1, <<"payload">>), - {ok, ?PUBREC_PACKET(1, RC), NChannel} = emqx_channel:handle_in(Publish, Channel), - ?assert((RC == ?RC_SUCCESS) orelse (RC == ?RC_NO_MATCHING_SUBSCRIBERS)), - ?assertEqual(#{publish_in => 1, pubrec_out => 1}, emqx_channel:info(pub_stats, NChannel)). + {ok, ?PUBREC_PACKET(1, RC), _NChannel} = emqx_channel:handle_in(Publish, Channel), + ?assert((RC == ?RC_SUCCESS) orelse (RC == ?RC_NO_MATCHING_SUBSCRIBERS)). + % ?assertEqual(#{publish_in => 1, pubrec_out => 1}, emqx_channel:info(pub_stats, NChannel)). t_handle_in_puback_ok(_) -> Msg = emqx_message:make(<<"t">>, <<"payload">>), ok = meck:expect(emqx_session, puback, fun(PacketId, Session) -> {ok, Msg, Session} end), Channel = channel(#{conn_state => connected}), - {ok, NChannel} = emqx_channel:handle_in(?PUBACK_PACKET(1, ?RC_SUCCESS), Channel), - ?assertEqual(#{puback_in => 1}, emqx_channel:info(pub_stats, NChannel)). + {ok, _NChannel} = emqx_channel:handle_in(?PUBACK_PACKET(1, ?RC_SUCCESS), Channel). + % ?assertEqual(#{puback_in => 1}, emqx_channel:info(pub_stats, NChannel)). t_handle_in_puback_id_in_use(_) -> ok = meck:expect(emqx_session, puback, fun(_, _Session) -> {error, ?RC_PACKET_IDENTIFIER_IN_USE} end), - {ok, Channel} = emqx_channel:handle_in(?PUBACK_PACKET(1, ?RC_SUCCESS), channel()), - ?assertEqual(#{puback_in => 1}, emqx_channel:info(pub_stats, Channel)). + {ok, _Channel} = emqx_channel:handle_in(?PUBACK_PACKET(1, ?RC_SUCCESS), channel()). + % ?assertEqual(#{puback_in => 1}, emqx_channel:info(pub_stats, Channel)). t_handle_in_puback_id_not_found(_) -> ok = meck:expect(emqx_session, puback, fun(_, _Session) -> {error, ?RC_PACKET_IDENTIFIER_NOT_FOUND} end), - {ok, Channel} = emqx_channel:handle_in(?PUBACK_PACKET(1, ?RC_SUCCESS), channel()), - ?assertEqual(#{puback_in => 1}, emqx_channel:info(pub_stats, Channel)). + {ok, _Channel} = emqx_channel:handle_in(?PUBACK_PACKET(1, ?RC_SUCCESS), channel()). + % ?assertEqual(#{puback_in => 1}, emqx_channel:info(pub_stats, Channel)). t_handle_in_pubrec_ok(_) -> Msg = emqx_message:make(test,?QOS_2, <<"t">>, <<"payload">>), ok = meck:expect(emqx_session, pubrec, fun(_, Session) -> {ok, Msg, Session} end), Channel = channel(#{conn_state => connected}), - {ok, ?PUBREL_PACKET(1, ?RC_SUCCESS), Channel1} - = emqx_channel:handle_in(?PUBREC_PACKET(1, ?RC_SUCCESS), Channel), - ?assertEqual(#{pubrec_in => 1, pubrel_out => 1}, - emqx_channel:info(pub_stats, Channel1)). + {ok, ?PUBREL_PACKET(1, ?RC_SUCCESS), _Channel1} + = emqx_channel:handle_in(?PUBREC_PACKET(1, ?RC_SUCCESS), Channel). + % ?assertEqual(#{pubrec_in => 1, pubrel_out => 1}, + % emqx_channel:info(pub_stats, Channel1)). t_handle_in_pubrec_id_in_use(_) -> ok = meck:expect(emqx_session, pubrec, fun(_, Session) -> {error, ?RC_PACKET_IDENTIFIER_IN_USE} end), - {ok, ?PUBREL_PACKET(1, ?RC_PACKET_IDENTIFIER_IN_USE), Channel} - = emqx_channel:handle_in(?PUBREC_PACKET(1, ?RC_SUCCESS), channel()), - ?assertEqual(#{pubrec_in => 1, pubrel_out => 1}, - emqx_channel:info(pub_stats, Channel)). + {ok, ?PUBREL_PACKET(1, ?RC_PACKET_IDENTIFIER_IN_USE), _Channel} + = emqx_channel:handle_in(?PUBREC_PACKET(1, ?RC_SUCCESS), channel()). + % ?assertEqual(#{pubrec_in => 1, pubrel_out => 1}, + % emqx_channel:info(pub_stats, Channel)). t_handle_in_pubrec_id_not_found(_) -> ok = meck:expect(emqx_session, pubrec, fun(_, Session) -> {error, ?RC_PACKET_IDENTIFIER_NOT_FOUND} end), - {ok, ?PUBREL_PACKET(1, ?RC_PACKET_IDENTIFIER_NOT_FOUND), Channel} - = emqx_channel:handle_in(?PUBREC_PACKET(1, ?RC_SUCCESS), channel()), - ?assertEqual(#{pubrec_in => 1, pubrel_out => 1}, - emqx_channel:info(pub_stats, Channel)). + {ok, ?PUBREL_PACKET(1, ?RC_PACKET_IDENTIFIER_NOT_FOUND), _Channel} + = emqx_channel:handle_in(?PUBREC_PACKET(1, ?RC_SUCCESS), channel()). + % ?assertEqual(#{pubrec_in => 1, pubrel_out => 1}, + % emqx_channel:info(pub_stats, Channel)). t_handle_in_pubrel_ok(_) -> ok = meck:expect(emqx_session, pubrel, fun(_, Session) -> {ok, Session} end), Channel = channel(#{conn_state => connected}), - {ok, ?PUBCOMP_PACKET(1, ?RC_SUCCESS), Channel1} - = emqx_channel:handle_in(?PUBREL_PACKET(1, ?RC_SUCCESS), Channel), - ?assertEqual(#{pubrel_in => 1, pubcomp_out => 1}, - emqx_channel:info(pub_stats, Channel1)). + {ok, ?PUBCOMP_PACKET(1, ?RC_SUCCESS), _Channel1} + = emqx_channel:handle_in(?PUBREL_PACKET(1, ?RC_SUCCESS), Channel). + % ?assertEqual(#{pubrel_in => 1, pubcomp_out => 1}, + % emqx_channel:info(pub_stats, Channel1)). t_handle_in_pubrel_not_found_error(_) -> ok = meck:expect(emqx_session, pubrel, @@ -231,8 +222,8 @@ t_handle_in_pubrel_not_found_error(_) -> t_handle_in_pubcomp_ok(_) -> ok = meck:expect(emqx_session, pubcomp, fun(_, Session) -> {ok, Session} end), - {ok, Channel} = emqx_channel:handle_in(?PUBCOMP_PACKET(1, ?RC_SUCCESS), channel()), - ?assertEqual(#{pubcomp_in => 1}, emqx_channel:info(pub_stats, Channel)). + {ok, _Channel} = emqx_channel:handle_in(?PUBCOMP_PACKET(1, ?RC_SUCCESS), channel()). + % ?assertEqual(#{pubcomp_in => 1}, emqx_channel:info(pub_stats, Channel)). t_handle_in_pubcomp_not_found_error(_) -> ok = meck:expect(emqx_session, pubcomp, @@ -240,8 +231,8 @@ t_handle_in_pubcomp_not_found_error(_) -> {error, ?RC_PACKET_IDENTIFIER_NOT_FOUND} end), Channel = channel(#{conn_state => connected}), - {ok, Channel1} = emqx_channel:handle_in(?PUBCOMP_PACKET(1, ?RC_SUCCESS), Channel), - ?assertEqual(#{pubcomp_in => 1}, emqx_channel:info(pub_stats, Channel1)). + {ok, _Channel1} = emqx_channel:handle_in(?PUBCOMP_PACKET(1, ?RC_SUCCESS), Channel). + % ?assertEqual(#{pubcomp_in => 1}, emqx_channel:info(pub_stats, Channel1)). t_handle_in_subscribe(_) -> ok = meck:expect(emqx_session, subscribe, @@ -351,10 +342,10 @@ t_handle_out_publishes(_) -> Channel = channel(#{conn_state => connected}), Pub0 = {publish, undefined, emqx_message:make(<<"t">>, <<"qos0">>)}, Pub1 = {publish, 1, emqx_message:make(<<"c">>, ?QOS_1, <<"t">>, <<"qos1">>)}, - {ok, {outgoing, Packets}, NChannel} + {ok, {outgoing, Packets}, _NChannel} = emqx_channel:handle_out({publish, [Pub0, Pub1]}, Channel), - ?assertEqual(2, length(Packets)), - ?assertEqual(#{publish_out => 2}, emqx_channel:info(pub_stats, NChannel)). + ?assertEqual(2, length(Packets)). + % ?assertEqual(#{publish_out => 2}, emqx_channel:info(pub_stats, NChannel)). t_handle_out_publish(_) -> Msg = emqx_message:make(<<"clientid">>, ?QOS_1, <<"t">>, <<"payload">>), @@ -378,28 +369,28 @@ t_handle_out_connack_failure(_) -> t_handle_out_puback(_) -> Channel = channel(#{conn_state => connected}), - {ok, ?PUBACK_PACKET(1, ?RC_SUCCESS), NChannel} - = emqx_channel:handle_out(puback, {1, ?RC_SUCCESS}, Channel), - ?assertEqual(#{puback_out => 1}, emqx_channel:info(pub_stats, NChannel)). + {ok, ?PUBACK_PACKET(1, ?RC_SUCCESS), _NChannel} + = emqx_channel:handle_out(puback, {1, ?RC_SUCCESS}, Channel). + % ?assertEqual(#{puback_out => 1}, emqx_channel:info(pub_stats, NChannel)). t_handle_out_pubrec(_) -> Channel = channel(#{conn_state => connected}), - {ok, ?PUBREC_PACKET(1, ?RC_SUCCESS), NChannel} - = emqx_channel:handle_out(pubrec, {1, ?RC_SUCCESS}, Channel), - ?assertEqual(#{pubrec_out => 1}, emqx_channel:info(pub_stats, NChannel)). + {ok, ?PUBREC_PACKET(1, ?RC_SUCCESS), _NChannel} + = emqx_channel:handle_out(pubrec, {1, ?RC_SUCCESS}, Channel). + % ?assertEqual(#{pubrec_out => 1}, emqx_channel:info(pub_stats, NChannel)). t_handle_out_pubrel(_) -> Channel = channel(#{conn_state => connected}), {ok, ?PUBREL_PACKET(1), Channel1} = emqx_channel:handle_out(pubrel, {1, ?RC_SUCCESS}, Channel), - {ok, ?PUBREL_PACKET(2, ?RC_SUCCESS), Channel2} - = emqx_channel:handle_out(pubrel, {2, ?RC_SUCCESS}, Channel1), - ?assertEqual(#{pubrel_out => 2}, emqx_channel:info(pub_stats, Channel2)). + {ok, ?PUBREL_PACKET(2, ?RC_SUCCESS), _Channel2} + = emqx_channel:handle_out(pubrel, {2, ?RC_SUCCESS}, Channel1). + % ?assertEqual(#{pubrel_out => 2}, emqx_channel:info(pub_stats, Channel2)). t_handle_out_pubcomp(_) -> - {ok, ?PUBCOMP_PACKET(1, ?RC_SUCCESS), Channel} - = emqx_channel:handle_out(pubcomp, {1, ?RC_SUCCESS}, channel()), - ?assertEqual(#{pubcomp_out => 1}, emqx_channel:info(pub_stats, Channel)). + {ok, ?PUBCOMP_PACKET(1, ?RC_SUCCESS), _Channel} + = emqx_channel:handle_out(pubcomp, {1, ?RC_SUCCESS}, channel()). + % ?assertEqual(#{pubcomp_out => 1}, emqx_channel:info(pub_stats, Channel)). t_handle_out_suback(_) -> {ok, ?SUBACK_PACKET(1, [?QOS_2]), _Channel} diff --git a/test/emqx_metrics_SUITE.erl b/test/emqx_metrics_SUITE.erl index a9445958b..f24cf3c3c 100644 --- a/test/emqx_metrics_SUITE.erl +++ b/test/emqx_metrics_SUITE.erl @@ -85,7 +85,7 @@ t_inc_recv(_) -> ok = emqx_metrics:inc_recv(?PACKET(?PINGREQ)), ok = emqx_metrics:inc_recv(?PACKET(?DISCONNECT)), ok = emqx_metrics:inc_recv(?PACKET(?AUTH)), - ignore = emqx_metrics:inc_recv(?PACKET(?RESERVED)), + ok = emqx_metrics:inc_recv(?PACKET(?RESERVED)), ?assertEqual(15, emqx_metrics:val('packets.received')), ?assertEqual(1, emqx_metrics:val('packets.connect.received')), ?assertEqual(4, emqx_metrics:val('messages.received')), diff --git a/test/emqx_pd_SUITE.erl b/test/emqx_pd_SUITE.erl index 7c08d7f18..25ede175d 100644 --- a/test/emqx_pd_SUITE.erl +++ b/test/emqx_pd_SUITE.erl @@ -24,9 +24,9 @@ all() -> emqx_ct:all(?MODULE). t_update_counter(_) -> - ?assertEqual(undefined, emqx_pd:update_counter(bytes, 1)), - ?assertEqual(1, emqx_pd:update_counter(bytes, 1)), - ?assertEqual(2, emqx_pd:update_counter(bytes, 1)), + ?assertEqual(undefined, emqx_pd:inc_counter(bytes, 1)), + ?assertEqual(1, emqx_pd:inc_counter(bytes, 1)), + ?assertEqual(2, emqx_pd:inc_counter(bytes, 1)), ?assertEqual(3, emqx_pd:get_counter(bytes)), ?assertEqual(3, emqx_pd:reset_counter(bytes)), ?assertEqual(0, emqx_pd:get_counter(bytes)). diff --git a/test/emqx_time_SUITE.erl b/test/emqx_time_SUITE.erl new file mode 100644 index 000000000..620fa1ee5 --- /dev/null +++ b/test/emqx_time_SUITE.erl @@ -0,0 +1,33 @@ +%%-------------------------------------------------------------------- +%% Copyright (c) 2019 EMQ Technologies Co., Ltd. All Rights Reserved. +%% +%% 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(emqx_time_SUITE). + +-compile(export_all). +-compile(nowarn_export_all). + +-include_lib("eunit/include/eunit.hrl"). + +all() -> emqx_ct:all(?MODULE). + +t_seed(_) -> + ?assert(is_tuple(emqx_time:seed())). + +t_now_secs(_) -> + ?assert(emqx_time:now_secs() =< emqx_time:now_secs(os:timestamp())). + +t_now_ms(_) -> + ?assert(emqx_time:now_ms() =< emqx_time:now_ms(os:timestamp())). \ No newline at end of file diff --git a/test/emqx_vm_SUITE.erl b/test/emqx_vm_SUITE.erl index 0e38c91c4..1fa1cacbf 100644 --- a/test/emqx_vm_SUITE.erl +++ b/test/emqx_vm_SUITE.erl @@ -194,7 +194,7 @@ t_get_process_limit(_Config) -> emqx_vm:get_process_limit(). t_cpu_util(_Config) -> - ?assertEqual(0, emqx_vm:cpu_util()). + _Cpu = emqx_vm:cpu_util(). easy_server() -> {ok, LSock} = gen_tcp:listen(5678, [binary, {packet, 0}, {active, false}]), diff --git a/test/emqx_zone_SUITE.erl b/test/emqx_zone_SUITE.erl index 574b027ec..6b558b31d 100644 --- a/test/emqx_zone_SUITE.erl +++ b/test/emqx_zone_SUITE.erl @@ -101,11 +101,4 @@ t_uncovered_func(_) -> emqx_zone:stop(). t_frame_options(_) -> - ?assertMatch(#{strict_mode := _, max_size := _ }, emqx_zone:frame_options(zone)). - -t_check_oom(_) -> - {ok, _} = emqx_zone:start_link(), - application:set_env(emqx, zones, [{zone, ?ENVS}]), - ok = emqx_zone:force_reload(), - ?assertEqual(ok, emqx_zone:check_oom(zone, fun() -> ok end)), - emqx_zone:stop(). \ No newline at end of file + ?assertMatch(#{strict_mode := _, max_size := _ }, emqx_zone:mqtt_frame_options(zone)). \ No newline at end of file