From ab51d8ab8efaef579e5b9e9ba80d87dbccfb1f13 Mon Sep 17 00:00:00 2001 From: firest Date: Wed, 23 Mar 2022 14:19:00 +0800 Subject: [PATCH] fix(coap): trigger disconnect logic when the client manually disconnected --- .../src/coap/emqx_coap_channel.erl | 3 +- apps/emqx_gateway/test/emqx_coap_SUITE.erl | 35 ++++++++++++++++++- .../test/emqx_event_message_SUITE.erl | 5 ++- 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/apps/emqx_gateway/src/coap/emqx_coap_channel.erl b/apps/emqx_gateway/src/coap/emqx_coap_channel.erl index d15b8605a..7a0cbdb79 100644 --- a/apps/emqx_gateway/src/coap/emqx_coap_channel.erl +++ b/apps/emqx_gateway/src/coap/emqx_coap_channel.erl @@ -638,7 +638,8 @@ process_connection({open, Req}, Result, Channel); process_connection({close, Msg}, _, Channel, _) -> Reply = emqx_coap_message:piggyback({ok, deleted}, Msg), - {shutdown, close, Reply, Channel}. + NChannel = ensure_disconnected(close_connection, Channel), + {shutdown, close, Reply, NChannel}. process_subscribe({Sub, Msg}, Result, #channel{session = Session} = Channel, Iter) -> Result2 = emqx_coap_session:process_subscribe(Sub, Msg, Result, Session), diff --git a/apps/emqx_gateway/test/emqx_coap_SUITE.erl b/apps/emqx_gateway/test/emqx_coap_SUITE.erl index 8bac1ffbd..9057daa3f 100644 --- a/apps/emqx_gateway/test/emqx_coap_SUITE.erl +++ b/apps/emqx_gateway/test/emqx_coap_SUITE.erl @@ -292,12 +292,37 @@ t_clients_get_subscription_api(_) -> end, with_connection(Fun). +t_on_offline_event(_) -> + Fun = fun(Channel) -> + application:start(emqx_modules), + emqx_event_message_SUITE:load_config(), + timer:sleep(100), + + emqx_event_message:enable(), + timer:sleep(200), + + emqx_broker:subscribe(<<"$event/#">>), + + Token = connection(Channel), + ?assertMatch(#message{topic = <<"$event/client_connected">>}, receive_deliver(500)), + + disconnection(Channel, Token), + + ?assertMatch(#message{topic = <<"$event/client_disconnected">>}, receive_deliver(500)), + + emqx_broker:unsubscribe(<<"$event/#">>), + emqx_event_message:disable(), + application:stop(emqx_modules), + timer:sleep(200) + end, + do(Fun). + %%-------------------------------------------------------------------- %% helpers connection(Channel) -> URI = ?MQTT_PREFIX ++ - "/connection?clientid=client1&username=admin&password=public", + "/connection?clientid=client1&username=admin&password=public", Req = make_req(post), {ok, created, Data} = do_request(Channel, URI, Req), #coap_content{payload = BinToken} = Data, @@ -378,3 +403,11 @@ with_connection(Action) -> timer:sleep(100) end, do(Fun). + +receive_deliver(Wait) -> + receive + {deliver, _, Msg} -> + Msg + after Wait -> + {error, timeout} + end. diff --git a/apps/emqx_modules/test/emqx_event_message_SUITE.erl b/apps/emqx_modules/test/emqx_event_message_SUITE.erl index c74db36f6..beb9175fe 100644 --- a/apps/emqx_modules/test/emqx_event_message_SUITE.erl +++ b/apps/emqx_modules/test/emqx_event_message_SUITE.erl @@ -42,9 +42,12 @@ all() -> emqx_common_test_helpers:all(?MODULE). init_per_suite(Config) -> emqx_common_test_helpers:boot_modules(all), emqx_common_test_helpers:start_apps([emqx_modules]), - ok = emqx_common_test_helpers:load_config(emqx_modules_schema, ?EVENT_MESSAGE), + load_config(), Config. +load_config() -> + ok = emqx_common_test_helpers:load_config(emqx_modules_schema, ?EVENT_MESSAGE). + end_per_suite(_Config) -> emqx_common_test_helpers:stop_apps([emqx_modules]).