From 50f6191bf8646147b303f8a9e1a5a9efa1d6dc5a Mon Sep 17 00:00:00 2001 From: juhlig Date: Thu, 10 Sep 2020 16:18:06 +0200 Subject: Enable connection count alarms --- test/acceptor_SUITE.erl | 76 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 75 insertions(+), 1 deletion(-) (limited to 'test') diff --git a/test/acceptor_SUITE.erl b/test/acceptor_SUITE.erl index 49625c6..53a1223 100644 --- a/test/acceptor_SUITE.erl +++ b/test/acceptor_SUITE.erl @@ -109,7 +109,8 @@ groups() -> misc_post_listen_callback_error, misc_set_transport_options, misc_wait_for_connections, - misc_multiple_ip_local_socket_opts + misc_multiple_ip_local_socket_opts, + misc_connection_alarms ]}, {supervisor, [ connection_type_supervisor, connection_type_supervisor_separate_from_connection, @@ -576,6 +577,79 @@ do_misc_multiple_ip_local_socket_opts() -> {error, enoent} = file:read_file_info(SockFile2), ok. +misc_connection_alarms(_) -> + doc("Ensure that connection alarms work."), + Name = name(), + + Self = self(), + TransOpts0 = #{num_conns_sups => 1}, + AlarmCallback = fun (Ref, AlarmName, _, ActiveConns) -> + Self ! {connection_alarm, {Ref, AlarmName, length(ActiveConns)}} + end, + Alarms0 = #{ + test1 => Alarm1 = #{type => num_connections, treshold => 2, cooldown => 0, callback => AlarmCallback}, + test2 => Alarm2 = #{type => num_connections, treshold => 3, cooldown => 0, callback => AlarmCallback} + }, + ConnectOpts = [binary, {active, false}, {packet, raw}], + + {ok, _} = ranch:start_listener(Name, ranch_tcp, + TransOpts0#{alarms => Alarms0}, notify_and_wait_protocol, #{pid => self()}), + Port = ranch:get_port(Name), + + {ok, _} = gen_tcp:connect("localhost", Port, ConnectOpts), + {1, [Conn1]} = receive_loop(connected, 100), + #{test1 := undefined, test2 := undefined} = do_recv_connection_alarms(Name, 100), + + {ok, _} = gen_tcp:connect("localhost", Port, ConnectOpts), + {1, [Conn2]} = receive_loop(connected, 100), + #{test1 := 2, test2 := undefined} = do_recv_connection_alarms(Name, 100), + + {ok, _} = gen_tcp:connect("localhost", Port, ConnectOpts), + {1, [Conn3]} = receive_loop(connected, 100), + #{test1 := 3, test2 := 3} = do_recv_connection_alarms(Name, 100), + + Alarms1 = #{ + test1 => Alarm1#{cooldown => 100}, + test2 => Alarm2#{cooldown => 100} + }, + ok = ranch:set_transport_options(Name, TransOpts0#{alarms => Alarms1}), + ok = do_flush_connection_alarms(Name), + #{test1 := 3, test2 := 3} = do_recv_connection_alarms(Name, 100), + ok = do_flush_connection_alarms(Name), + #{test1 := 3, test2 := 3} = do_recv_connection_alarms(Name, 100), + + Conn3 ! stop, + timer:sleep(100), + ok = do_flush_connection_alarms(Name), + #{test1 := 2, test2 := undefined} = do_recv_connection_alarms(Name, 100), + + Conn2 ! stop, + timer:sleep(100), + ok = do_flush_connection_alarms(Name), + #{test1 := undefined, test2 := undefined} = do_recv_connection_alarms(Name, 100), + + Conn1 ! stop, + + ok = ranch:stop_listener(Name), + ok. + +do_recv_connection_alarms(Name, Timeout) -> + do_recv_connection_alarms(Name, Timeout, #{test1 => undefined, test2 => undefined}). + +do_recv_connection_alarms(Name, Timeout, Acc) -> + receive {connection_alarm, {Name, AlarmName, N}} -> + do_recv_connection_alarms(Name, Timeout, Acc#{AlarmName => N}) + after Timeout -> + Acc + end. + +do_flush_connection_alarms(Name) -> + receive {connection_alarm, {Name, _, _}} -> + do_flush_connection_alarms(Name) + after 0 -> + ok + end. + %% ssl. ssl_accept_error(_) -> -- cgit v1.2.3