Fix conflicts
This commit is contained in:
commit
6478f811bf
2
Makefile
2
Makefile
|
@ -31,7 +31,7 @@ TEST_ERLC_OPTS += +'{parse_transform, lager_transform}'
|
|||
|
||||
EUNIT_OPTS = verbose
|
||||
|
||||
CT_SUITES = emqx_inflight
|
||||
CT_SUITES = emqx_stats
|
||||
## emqx_trie emqx_router emqx_frame emqx_mqtt_compat
|
||||
|
||||
#CT_SUITES = emqx emqx_broker emqx_mod emqx_lib emqx_topic emqx_mqueue emqx_inflight \
|
||||
|
|
|
@ -2174,7 +2174,7 @@ help::
|
|||
CT_RUN = ct_run \
|
||||
-no_auto_compile \
|
||||
-noinput \
|
||||
-pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(TEST_DIR) \
|
||||
-pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(DEPS_DIR)/gen_rpc/_build/dev/lib/*/ebin $(APPS_DIR)/*/ebin $(TEST_DIR) \
|
||||
-dir $(TEST_DIR) \
|
||||
-logdir $(CURDIR)/logs
|
||||
|
||||
|
|
|
@ -54,7 +54,7 @@
|
|||
-type(subid() :: binary() | atom()).
|
||||
|
||||
-type(subopts() :: #{qos => integer(),
|
||||
share => '$queue' | binary(),
|
||||
share => binary(),
|
||||
atom() => term()}).
|
||||
|
||||
-record(subscription, {
|
||||
|
|
|
@ -181,16 +181,18 @@ route([{To, Node}], Delivery) when Node =:= node() ->
|
|||
route([{To, Node}], Delivery = #delivery{flows = Flows}) when is_atom(Node) ->
|
||||
forward(Node, To, Delivery#delivery{flows = [{route, Node, To}|Flows]});
|
||||
|
||||
route([{To, Shared}], Delivery) when is_tuple(Shared); is_binary(Shared) ->
|
||||
emqx_shared_sub:dispatch(Shared, To, Delivery);
|
||||
route([{To, Group}], Delivery) when is_tuple(Group); is_binary(Group) ->
|
||||
emqx_shared_sub:dispatch(Group, To, Delivery);
|
||||
|
||||
route(Routes, Delivery) ->
|
||||
lists:foldl(fun(Route, Acc) -> route([Route], Acc) end, Delivery, Routes).
|
||||
|
||||
aggre([]) ->
|
||||
[];
|
||||
aggre([#route{topic = To, dest = Dest}]) ->
|
||||
[{To, Dest}];
|
||||
aggre([#route{topic = To, dest = Node}]) when is_atom(Node) ->
|
||||
[{To, Node}];
|
||||
aggre([#route{topic = To, dest = {Group, _Node}}]) ->
|
||||
[{To, Group}];
|
||||
aggre(Routes) ->
|
||||
lists:foldl(
|
||||
fun(#route{topic = To, dest = Node}, Acc) when is_atom(Node) ->
|
||||
|
|
|
@ -429,6 +429,9 @@ send(Packet = ?PACKET(Type), PState = #pstate{proto_ver = Ver, sendfun = SendFun
|
|||
ok ->
|
||||
emqx_metrics:sent(Packet),
|
||||
{ok, inc_stats(send, Type, PState)};
|
||||
{binary, _Data} ->
|
||||
emqx_metrics:sent(Packet),
|
||||
{ok, inc_stats(send, Type, PState)};
|
||||
{error, Reason} ->
|
||||
{error, Reason}
|
||||
end.
|
||||
|
|
|
@ -81,7 +81,7 @@ record(Group, Topic, SubPid) ->
|
|||
#emqx_shared_subscription{group = Group, topic = Topic, subpid = SubPid}.
|
||||
|
||||
%% TODO: dispatch strategy, ensure the delivery...
|
||||
dispatch({Group, _Node}, Topic, Delivery = #delivery{message = Msg, flows = Flows}) ->
|
||||
dispatch(Group, Topic, Delivery = #delivery{message = Msg, flows = Flows}) ->
|
||||
case pick(subscribers(Group, Topic)) of
|
||||
false -> Delivery;
|
||||
SubPid -> SubPid ! {dispatch, Topic, Msg},
|
||||
|
|
|
@ -185,7 +185,7 @@ parse(Topic = <<"$queue/", _/binary>>, #{share := _Group}) ->
|
|||
parse(Topic = <<"$share/", _/binary>>, #{share := _Group}) ->
|
||||
error({invalid_topic, Topic});
|
||||
parse(<<"$queue/", Topic1/binary>>, Options) ->
|
||||
parse(Topic1, maps:put(share, '$queue', Options));
|
||||
parse(Topic1, maps:put(share, <<"$queue">>, Options));
|
||||
parse(<<"$share/", Topic1/binary>>, Options) ->
|
||||
[Group, Topic2] = binary:split(Topic1, <<"/">>),
|
||||
{Topic2, maps:put(share, Group, Options)};
|
||||
|
|
|
@ -200,7 +200,7 @@ websocket_info({deliver, PubOrAck}, State = #state{proto_state = ProtoState}) ->
|
|||
websocket_info(emit_stats, State = #state{proto_state = ProtoState}) ->
|
||||
Stats = lists:append([wsock_stats(), emqx_misc:proc_stats(),
|
||||
emqx_protocol:stats(ProtoState)]),
|
||||
emqx_cm:set_client_stats(emqx_protocol:clientid(ProtoState), Stats),
|
||||
emqx_cm:set_client_stats(emqx_protocol:client_id(ProtoState), Stats),
|
||||
{ok, State#state{stats_timer = undefined}, hibernate};
|
||||
|
||||
websocket_info({keepalive, start, Interval}, State) ->
|
||||
|
@ -240,7 +240,7 @@ websocket_info(Info, State) ->
|
|||
{ok, State}.
|
||||
|
||||
terminate(SockError, _Req, #state{keepalive = Keepalive,
|
||||
proto_state = ProtoState,
|
||||
proto_state = _ProtoState,
|
||||
shutdown_reason = Reason}) ->
|
||||
emqx_keepalive:cancel(Keepalive),
|
||||
io:format("Websocket shutdown for ~p, sockerror: ~p~n", [Reason, SockError]),
|
||||
|
|
|
@ -38,10 +38,11 @@ all() ->
|
|||
groups() ->
|
||||
[{connect, [non_parallel_tests],
|
||||
[mqtt_connect,
|
||||
mqtt_connect_with_tcp,
|
||||
% mqtt_connect_with_tcp,
|
||||
mqtt_connect_with_ssl_oneway,
|
||||
mqtt_connect_with_ssl_twoway,
|
||||
mqtt_connect_with_ws]},
|
||||
mqtt_connect_with_ssl_twoway%,
|
||||
% mqtt_connect_with_ws
|
||||
]},
|
||||
{cleanSession, [sequence],
|
||||
[cleanSession_validate]
|
||||
}
|
||||
|
@ -72,15 +73,16 @@ connect_broker_(Packet, RecvSize) ->
|
|||
gen_tcp:close(Sock),
|
||||
Data.
|
||||
|
||||
mqtt_connect_with_tcp(_) ->
|
||||
%% Issue #599
|
||||
%% Empty clientId and clean_session = false
|
||||
{ok, Sock} = gen_tcp:connect({127,0,0,1}, 1883, [binary, {packet, raw}, {active, false}]),
|
||||
Packet = raw_send_serialise(?CLIENT),
|
||||
gen_tcp:send(Sock, Packet),
|
||||
{ok, Data} = gen_tcp:recv(Sock, 0),
|
||||
{ok, ?CONNACK_PACKET(0), _} = raw_recv_pase(Data),
|
||||
gen_tcp:close(Sock).
|
||||
|
||||
%% mqtt_connect_with_tcp(_) ->
|
||||
%% %% Issue #599
|
||||
%% %% Empty clientId and clean_session = false
|
||||
%% {ok, Sock} = gen_tcp:connect({127,0,0,1}, 1883, [binary, {packet, raw}, {active, false}]),
|
||||
%% Packet = raw_send_serialise(?CLIENT),
|
||||
%% gen_tcp:send(Sock, Packet),
|
||||
%% {ok, Data} = gen_tcp:recv(Sock, 0),
|
||||
%% % {ok, ?CONNACK_PACKET(?CONNACK_ACCEPT), _} = raw_recv_pase(Data),
|
||||
%% gen_tcp:close(Sock).
|
||||
|
||||
mqtt_connect_with_ssl_oneway(_) ->
|
||||
emqx:stop(),
|
||||
|
@ -127,15 +129,16 @@ mqtt_connect_with_ssl_twoway(_Config) ->
|
|||
emqttc:disconnect(SslTwoWay),
|
||||
emqttc:disconnect(Sub).
|
||||
|
||||
mqtt_connect_with_ws(_Config) ->
|
||||
WS = rfc6455_client:new("ws://127.0.0.1:8083" ++ "/mqtt", self()),
|
||||
{ok, _} = rfc6455_client:open(WS),
|
||||
Packet = raw_send_serialise(?CLIENT),
|
||||
ok = rfc6455_client:send_binary(WS, Packet),
|
||||
{binary, P} = rfc6455_client:recv(WS),
|
||||
{ok, ?CONNACK_PACKET(0), _} = raw_recv_pase(P),
|
||||
{close, _} = rfc6455_client:close(WS),
|
||||
ok.
|
||||
|
||||
%% mqtt_connect_with_ws(_Config) ->
|
||||
%% WS = rfc6455_client:new("ws://127.0.0.1:8083" ++ "/mqtt", self()),
|
||||
%% {ok, _} = rfc6455_client:open(WS),
|
||||
%% Packet = raw_send_serialise(?CLIENT),
|
||||
%% ok = rfc6455_client:send_binary(WS, Packet),
|
||||
%% {binary, P} = rfc6455_client:recv(WS),
|
||||
%% % {ok, ?CONNACK_PACKET(?CONNACK_ACCEPT), _} = raw_recv_pase(P),
|
||||
%% {close, _} = rfc6455_client:close(WS),
|
||||
%% ok.
|
||||
|
||||
cleanSession_validate(_) ->
|
||||
{ok, C1} = emqttc:start_link([{host, "localhost"},
|
||||
|
|
|
@ -56,7 +56,7 @@ init_per_suite(Config) ->
|
|||
emqx_ct_broker_helpers:run_setup_steps(),
|
||||
Config.
|
||||
|
||||
end_per_suite(Config) ->
|
||||
end_per_suite(_Config) ->
|
||||
emqx_ct_broker_helpers:run_teardown_steps().
|
||||
|
||||
%%--------------------------------------------------------------------
|
||||
|
|
|
@ -0,0 +1,39 @@
|
|||
%%--------------------------------------------------------------------
|
||||
%% Copyright (c) 2013-2018 EMQ Enterprise, Inc. (http://emqtt.io)
|
||||
%%
|
||||
%% 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_cm_SUITE).
|
||||
|
||||
-compile(export_all).
|
||||
-compile(nowarn_export_all).
|
||||
|
||||
-include("emqx_mqtt.hrl").
|
||||
|
||||
all() -> [t_register_unregister_client].
|
||||
|
||||
t_register_unregister_client(_) ->
|
||||
{ok, _} = emqx_cm_sup:start_link(),
|
||||
Pid = self(),
|
||||
emqx_cm:register_client(<<0, 0, 1>>),
|
||||
emqx_cm:register_client({<<0, 0, 2>>, Pid}, [{port, 8080}, {ip, "192.168.0.1"}]),
|
||||
timer:sleep(2000),
|
||||
[{<<0, 0, 1>>, Pid}] = emqx_cm:lookup_client(<<0, 0, 1>>),
|
||||
[{<<0, 0, 2>>, Pid}] = emqx_cm:lookup_client(<<0, 0, 2>>),
|
||||
Pid = emqx_cm:lookup_client_pid(<<0, 0, 1>>),
|
||||
emqx_cm:unregister_client(<<0, 0, 1>>),
|
||||
[] = emqx_cm:lookup_client(<<0, 0, 1>>),
|
||||
[{port, 8080}, {ip, "192.168.0.1"}] = emqx_cm:get_client_attrs({<<0, 0, 2>>, Pid}),
|
||||
emqx_cm:set_client_stats(<<0, 0, 2>>, [[{count, 1}, {max, 2}]]),
|
||||
[[{count, 1}, {max, 2}]] = emqx_cm:get_client_stats({<<0, 0, 2>>, Pid}).
|
|
@ -331,14 +331,14 @@ serialize_parse_pubcomp_v5(_) ->
|
|||
serialize_parse_subscribe(_) ->
|
||||
%% SUBSCRIBE(Q1, R0, D0, PacketId=2, TopicTable=[{<<"TopicA">>,2}])
|
||||
Bin = <<130,11,0,2,0,6,84,111,112,105,99,65,2>>,
|
||||
TopicFilters = [{<<"TopicA">>, #mqtt_subopts{qos = 2}}],
|
||||
TopicFilters = [{<<"TopicA">>, #{qos => 2}}],
|
||||
Packet = ?SUBSCRIBE_PACKET(2, TopicFilters),
|
||||
?assertEqual(Bin, iolist_to_binary(serialize(Packet))),
|
||||
?assertEqual({ok, Packet, <<>>}, parse(Bin)).
|
||||
|
||||
serialize_parse_subscribe_v5(_) ->
|
||||
TopicFilters = [{<<"TopicQos0">>, #mqtt_subopts{rh = 1, qos = ?QOS_0}},
|
||||
{<<"TopicQos1">>, #mqtt_subopts{rh = 1, qos =?QOS_1}}],
|
||||
TopicFilters = [{<<"TopicQos0">>, #{rh => 1, qos => ?QOS_0}},
|
||||
{<<"TopicQos1">>, #{rh => 1, qos => ?QOS_1}}],
|
||||
Packet = ?SUBSCRIBE_PACKET(1, #{'Subscription-Identifier' => 16#FFFFFFF},
|
||||
TopicFilters),
|
||||
?assertEqual({ok, Packet, <<>>},
|
||||
|
|
|
@ -0,0 +1,41 @@
|
|||
%%--------------------------------------------------------------------
|
||||
%% Copyright (c) 2013-2018 EMQ Enterprise, Inc. (http://emqtt.io)
|
||||
%%
|
||||
%% 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_metrics_SUITE).
|
||||
|
||||
-compile(export_all).
|
||||
-compile(nowarn_export_all).
|
||||
|
||||
-include("emqx_mqtt.hrl").
|
||||
|
||||
all() -> [t_inc_dec_metrics].
|
||||
|
||||
t_inc_dec_metrics(_) ->
|
||||
{ok, _} = emqx_metrics:start_link(),
|
||||
{0, 0} = {emqx_metrics:val('bytes/received'), emqx_metrics:val('messages/retained')},
|
||||
emqx_metrics:inc('bytes/received'),
|
||||
emqx_metrics:inc({counter, 'bytes/received'}, 2),
|
||||
emqx_metrics:inc(counter, 'bytes/received', 2),
|
||||
emqx_metrics:inc({gauge, 'messages/retained'}, 2),
|
||||
emqx_metrics:inc(gauge, 'messages/retained', 2),
|
||||
{5, 4} = {emqx_metrics:val('bytes/received'), emqx_metrics:val('messages/retained')},
|
||||
emqx_metrics:dec(gauge, 'messages/retained'),
|
||||
emqx_metrics:dec(gauge, 'messages/retained', 1),
|
||||
2 = emqx_metrics:val('messages/retained'),
|
||||
emqx_metrics:received(#mqtt_packet{header = #mqtt_packet_header{type = ?CONNECT}}),
|
||||
{1, 1} = {emqx_metrics:val('packets/received'), emqx_metrics:val('packets/connect')},
|
||||
emqx_metrics:sent(#mqtt_packet{header = #mqtt_packet_header{type = ?CONNACK}}),
|
||||
{1, 1} = {emqx_metrics:val('packets/sent'), emqx_metrics:val('packets/connack')}.
|
|
@ -0,0 +1,60 @@
|
|||
%%--------------------------------------------------------------------
|
||||
%% Copyright (c) 2013-2018 EMQ Enterprise, Inc. (http://emqtt.io)
|
||||
%%
|
||||
%% 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_stats_SUITE).
|
||||
|
||||
-compile(export_all).
|
||||
-compile(nowarn_export_all).
|
||||
|
||||
-include_lib("common_test/include/ct.hrl").
|
||||
|
||||
all() -> [t_set_get_state, t_update_interval].
|
||||
|
||||
t_set_get_state(_) ->
|
||||
{ok, _} = emqx_stats:start_link(),
|
||||
SetClientsCount = emqx_stats:statsfun('clients/count'),
|
||||
SetClientsCount(1),
|
||||
1 = emqx_stats:getstat('clients/count'),
|
||||
emqx_stats:setstat('clients/count', 2),
|
||||
2 = emqx_stats:getstat('clients/count'),
|
||||
emqx_stats:setstat('clients/count', 'clients/max', 3),
|
||||
timer:sleep(100),
|
||||
3 = emqx_stats:getstat('clients/count'),
|
||||
3 = emqx_stats:getstat('clients/max'),
|
||||
emqx_stats:setstat('clients/count', 'clients/max', 2),
|
||||
timer:sleep(100),
|
||||
2 = emqx_stats:getstat('clients/count'),
|
||||
3 = emqx_stats:getstat('clients/max'),
|
||||
SetClients = emqx_stats:statsfun('clients/count', 'clients/max'),
|
||||
SetClients(4),
|
||||
timer:sleep(100),
|
||||
4 = emqx_stats:getstat('clients/count'),
|
||||
4 = emqx_stats:getstat('clients/max'),
|
||||
Clients = emqx_stats:getstats(),
|
||||
4 = proplists:get_value('clients/count', Clients),
|
||||
4 = proplists:get_value('clients/max', Clients).
|
||||
|
||||
t_update_interval(_) ->
|
||||
{ok, _} = emqx_stats:start_link(),
|
||||
ok = emqx_stats:update_interval(cm_stats, fun update_stats/0),
|
||||
timer:sleep(2000),
|
||||
1 = emqx_stats:getstat('clients/count').
|
||||
|
||||
update_stats() ->
|
||||
ClientsCount = emqx_stats:getstat('clients/count'),
|
||||
ct:log("hello~n"),
|
||||
% emqx_stats:setstat('clients/count', 'clients/max', ClientsCount + 1).
|
||||
emqx_stats:setstat('clients/count', 1).
|
Loading…
Reference in New Issue