summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAyanda-D <ayanda.dube@erlang-solutions.com>2020-11-26 17:30:18 +0000
committerAyanda-D <ayanda.dube@erlang-solutions.com>2020-11-26 17:30:18 +0000
commit0059fd724993d32dc94aa3ef837bbdb4d3ed1978 (patch)
treeb9d7c8acc769cd67c93a1c74d88e5c369af600f5
parentd817c531f26db81809d1c445605a327b8dbc4602 (diff)
downloadrabbitmq-server-git-0059fd724993d32dc94aa3ef837bbdb4d3ed1978.tar.gz
Add erlang client safe_call_timeouts tests
-rw-r--r--deps/amqp_client/Makefile2
-rw-r--r--deps/amqp_client/test/system_SUITE.erl103
2 files changed, 102 insertions, 3 deletions
diff --git a/deps/amqp_client/Makefile b/deps/amqp_client/Makefile
index b15fd918f0..186441ce9a 100644
--- a/deps/amqp_client/Makefile
+++ b/deps/amqp_client/Makefile
@@ -30,7 +30,7 @@ PACKAGES_DIR ?= $(abspath PACKAGES)
LOCAL_DEPS = xmerl
DEPS = rabbit_common
-TEST_DEPS = rabbitmq_ct_helpers rabbit
+TEST_DEPS = rabbitmq_ct_helpers rabbit meck
DEP_EARLY_PLUGINS = rabbit_common/mk/rabbitmq-early-test.mk
DEP_PLUGINS = rabbit_common/mk/rabbitmq-build.mk \
diff --git a/deps/amqp_client/test/system_SUITE.erl b/deps/amqp_client/test/system_SUITE.erl
index 9e39e468b7..80eaaf751c 100644
--- a/deps/amqp_client/test/system_SUITE.erl
+++ b/deps/amqp_client/test/system_SUITE.erl
@@ -77,9 +77,10 @@ all() ->
{hard_error_loop, [{repeat, 100}, parallel], [hard_error]}
]).
-define(COMMON_NON_PARALLEL_TEST_CASES, [
- basic_qos, %% Not parallel because it's time-based.
+ basic_qos, %% Not parallel because it's time-based, or has mocks
connection_failure,
- channel_death
+ channel_death,
+ safe_call_timeouts
]).
groups() ->
@@ -294,6 +295,94 @@ named_connection(Config) ->
%% -------------------------------------------------------------------
+safe_call_timeouts(Config) ->
+ Params = ?config(amqp_client_conn_params, Config),
+ safe_call_timeouts_test(Params).
+
+safe_call_timeouts_test(Params = #amqp_params_network{}) ->
+ TestConnTimeout = 2000,
+ TestCallTimeout = 1000,
+
+ Params1 = Params#amqp_params_network{connection_timeout = TestConnTimeout},
+
+ %% Normal connection
+ amqp_util:update_call_timeout(TestCallTimeout),
+
+ {ok, Connection1} = amqp_connection:start(Params1),
+ ?assertEqual(TestConnTimeout + ?CALL_TIMEOUT_DEVIATION, amqp_util:call_timeout()),
+
+ ?assertEqual(ok, amqp_connection:close(Connection1)),
+ wait_for_death(Connection1),
+
+ %% Failing connection
+ amqp_util:update_call_timeout(TestCallTimeout),
+
+ ok = meck:new(amqp_network_connection, [passthrough]),
+ ok = meck:expect(amqp_network_connection, connect,
+ fun(_AmqpParams, _SIF, _TypeSup, _State) ->
+ timer:sleep(TestConnTimeout),
+ {error, test_connection_timeout}
+ end),
+
+ {error, test_connection_timeout} = amqp_connection:start(Params1),
+
+ ?assertEqual(TestConnTimeout + ?CALL_TIMEOUT_DEVIATION, amqp_util:call_timeout()),
+
+ meck:unload(amqp_network_connection);
+
+safe_call_timeouts_test(Params = #amqp_params_direct{}) ->
+ TestCallTimeout = 30000,
+ NetTicktime0 = net_kernel:get_net_ticktime(),
+ amqp_util:update_call_timeout(TestCallTimeout),
+
+ %% 1. NetTicktime >= DIRECT_OPERATION_TIMEOUT (120s)
+ NetTicktime1 = 140,
+ net_kernel:set_net_ticktime(NetTicktime1, 1),
+ wait_until_net_ticktime(NetTicktime1),
+
+ {ok, Connection1} = amqp_connection:start(Params),
+ ?assertEqual((NetTicktime1 * 1000) + ?CALL_TIMEOUT_DEVIATION,
+ amqp_util:call_timeout()),
+
+ ?assertEqual(ok, amqp_connection:close(Connection1)),
+ wait_for_death(Connection1),
+
+ %% Reset call timeout
+ amqp_util:update_call_timeout(TestCallTimeout),
+
+ %% 2. Transitioning NetTicktime >= DIRECT_OPERATION_TIMEOUT (120s)
+ NetTicktime2 = 120,
+ net_kernel:set_net_ticktime(NetTicktime2, 1),
+ ?assertEqual({ongoing_change_to, NetTicktime2}, net_kernel:get_net_ticktime()),
+
+ {ok, Connection2} = amqp_connection:start(Params),
+ ?assertEqual((NetTicktime2 * 1000) + ?CALL_TIMEOUT_DEVIATION,
+ amqp_util:call_timeout()),
+
+ wait_until_net_ticktime(NetTicktime2),
+
+ ?assertEqual(ok, amqp_connection:close(Connection2)),
+ wait_for_death(Connection2),
+
+ %% Reset call timeout
+ amqp_util:update_call_timeout(TestCallTimeout),
+
+ %% 3. NetTicktime < DIRECT_OPERATION_TIMEOUT (120s)
+ NetTicktime3 = 60,
+ net_kernel:set_net_ticktime(NetTicktime3, 1),
+ wait_until_net_ticktime(NetTicktime3),
+
+ {ok, Connection3} = amqp_connection:start(Params),
+ ?assertEqual((?DIRECT_OPERATION_TIMEOUT + ?CALL_TIMEOUT_DEVIATION),
+ amqp_util:call_timeout()),
+
+ net_kernel:set_net_ticktime(NetTicktime0, 1),
+ wait_until_net_ticktime(NetTicktime0),
+ ?assertEqual(ok, amqp_connection:close(Connection3)),
+ wait_for_death(Connection3).
+
+%% -------------------------------------------------------------------
+
simultaneous_close(Config) ->
{ok, Connection} = new_connection(Config),
%% We pick a high channel number, to avoid any conflict with other
@@ -1456,6 +1545,16 @@ assert_down_with_error(MonitorRef, CodeAtom) ->
exit(did_not_die)
end.
+wait_until_net_ticktime(NetTicktime) ->
+ case net_kernel:get_net_ticktime() of
+ NetTicktime -> ok;
+ {ongoing_change_to, NetTicktime} ->
+ timer:sleep(1000),
+ wait_until_net_ticktime(NetTicktime);
+ _ ->
+ throw({error, {net_ticktime_not_set, NetTicktime}})
+ end.
+
set_resource_alarm(memory, Config) ->
SrcDir = ?config(amqp_client_srcdir, Config),
Nodename = rabbit_ct_broker_helpers:get_node_config(Config, 0, nodename),