Skip to content

Commit a17fb13

Browse files
committed
make: Initial work on using ct_master to run tests
Because `ct_master` is yet another Erlang node, and it is used to run multiple CT nodes, meaning it is in a cluster of CT nodes, the tests that change the net_ticktime could not work properly anymore. This is because net_ticktime must be the same value across the cluster. The same value had to be set for all tests in order to solve this. This is why it was changed to 5s across the board. The lower net_ticktime was used in most places to speed up tests that must deal with cluster failures, so that value is good enough for these cases. One test in amqp_client was using the net_ticktime to test the behavior of the direct connection timeout with varying net_ticktime configurations. The test now mocks the `net_kernel:get_net_ticktime()` function to achieve the same result.
1 parent c66e874 commit a17fb13

17 files changed

+279
-67
lines changed

deps/amqp_client/test/system_SUITE.erl

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -335,14 +335,16 @@ safe_call_timeouts_test(Params = #amqp_params_network{}) ->
335335
meck:unload(amqp_network_connection);
336336

337337
safe_call_timeouts_test(Params = #amqp_params_direct{}) ->
338+
%% We must mock net_kernel:get_net_ticktime/0 as changing
339+
%% the tick time directly could lead to nodes disconnecting.
340+
meck:new(net_kernel, [unstick, passthrough]),
341+
338342
TestCallTimeout = 30000,
339-
NetTicktime0 = net_kernel:get_net_ticktime(),
340343
amqp_util:update_call_timeout(TestCallTimeout),
341344

342345
%% 1. NetTicktime >= DIRECT_OPERATION_TIMEOUT (120s)
343346
NetTicktime1 = 140,
344-
net_kernel:set_net_ticktime(NetTicktime1, 1),
345-
wait_until_net_ticktime(NetTicktime1),
347+
meck:expect(net_kernel, get_net_ticktime, fun() -> NetTicktime1 end),
346348

347349
{ok, Connection1} = amqp_connection:start(Params),
348350
?assertEqual((NetTicktime1 * 1000) + ?CALL_TIMEOUT_DEVIATION,
@@ -356,15 +358,12 @@ safe_call_timeouts_test(Params = #amqp_params_direct{}) ->
356358

357359
%% 2. Transitioning NetTicktime >= DIRECT_OPERATION_TIMEOUT (120s)
358360
NetTicktime2 = 120,
359-
net_kernel:set_net_ticktime(NetTicktime2, 1),
360-
?assertEqual({ongoing_change_to, NetTicktime2}, net_kernel:get_net_ticktime()),
361+
meck:expect(net_kernel, get_net_ticktime, fun() -> {ongoing_change_to, NetTicktime2} end),
361362

362363
{ok, Connection2} = amqp_connection:start(Params),
363364
?assertEqual((NetTicktime2 * 1000) + ?CALL_TIMEOUT_DEVIATION,
364365
amqp_util:call_timeout()),
365366

366-
wait_until_net_ticktime(NetTicktime2),
367-
368367
?assertEqual(ok, amqp_connection:close(Connection2)),
369368
wait_for_death(Connection2),
370369

@@ -373,15 +372,14 @@ safe_call_timeouts_test(Params = #amqp_params_direct{}) ->
373372

374373
%% 3. NetTicktime < DIRECT_OPERATION_TIMEOUT (120s)
375374
NetTicktime3 = 60,
376-
net_kernel:set_net_ticktime(NetTicktime3, 1),
377-
wait_until_net_ticktime(NetTicktime3),
375+
meck:expect(net_kernel, get_net_ticktime, fun() -> NetTicktime3 end),
378376

379377
{ok, Connection3} = amqp_connection:start(Params),
380378
?assertEqual((?DIRECT_OPERATION_TIMEOUT + ?CALL_TIMEOUT_DEVIATION),
381379
amqp_util:call_timeout()),
382380

383-
net_kernel:set_net_ticktime(NetTicktime0, 1),
384-
wait_until_net_ticktime(NetTicktime0),
381+
meck:unload(net_kernel),
382+
385383
?assertEqual(ok, amqp_connection:close(Connection3)),
386384
wait_for_death(Connection3),
387385

@@ -1578,16 +1576,6 @@ assert_down_with_error(MonitorRef, CodeAtom) ->
15781576
exit(did_not_die)
15791577
end.
15801578

1581-
wait_until_net_ticktime(NetTicktime) ->
1582-
case net_kernel:get_net_ticktime() of
1583-
NetTicktime -> ok;
1584-
{ongoing_change_to, NetTicktime} ->
1585-
timer:sleep(1000),
1586-
wait_until_net_ticktime(NetTicktime);
1587-
_ ->
1588-
throw({error, {net_ticktime_not_set, NetTicktime}})
1589-
end.
1590-
15911579
set_resource_alarm(Resource, Config)
15921580
when Resource =:= memory orelse Resource =:= disk ->
15931581
SrcDir = ?config(amqp_client_srcdir, Config),

deps/rabbit/Makefile

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,36 @@ ct-slow:
226226

227227
CT_OPTS += -ct_hooks rabbit_ct_hook []
228228

229+
define ct_master.erl
230+
StartOpts = #{
231+
host => "localhost",
232+
connection => standard_io,
233+
args => ["-hidden"]
234+
},
235+
{ok, Pid1, _} = peer:start(StartOpts#{name => "rabbit_shard1"}),
236+
{ok, Pid2, _} = peer:start(StartOpts#{name => "rabbit_shard2"}),
237+
{ok, Pid3, _} = peer:start(StartOpts#{name => "rabbit_shard3"}),
238+
{ok, Pid4, _} = peer:start(StartOpts#{name => "rabbit_shard4"}),
239+
peer:call(Pid1, net_kernel, set_net_ticktime, [5]),
240+
peer:call(Pid2, net_kernel, set_net_ticktime, [5]),
241+
peer:call(Pid3, net_kernel, set_net_ticktime, [5]),
242+
peer:call(Pid4, net_kernel, set_net_ticktime, [5]),
243+
peer:call(Pid1, persistent_term, put, [rabbit_ct_tcp_port_base, 23000]),
244+
peer:call(Pid2, persistent_term, put, [rabbit_ct_tcp_port_base, 25000]),
245+
peer:call(Pid3, persistent_term, put, [rabbit_ct_tcp_port_base, 27000]),
246+
peer:call(Pid4, persistent_term, put, [rabbit_ct_tcp_port_base, 29000]),
247+
ct_master:run("ct.test.spec"),
248+
peer:stop(Pid4),
249+
peer:stop(Pid3),
250+
peer:stop(Pid2),
251+
peer:stop(Pid1),
252+
halt()
253+
endef
254+
255+
ct-master: test-build
256+
$(verbose) mkdir -p $(CT_LOGS_DIR)
257+
$(call erlang,$(ct_master.erl),-sname rabbit_master@localhost -hidden -kernel net_ticktime 5)
258+
229259
# --------------------------------------------------------------------
230260
# Compilation.
231261
# --------------------------------------------------------------------

deps/rabbit/ct.test.spec

Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
{logdir, "logs/"}.
2+
{logdir, master, "logs/"}.
3+
{create_priv_dir, all_nodes, auto_per_run}.
4+
5+
{node, shard1, 'rabbit_shard1@localhost'}.
6+
{node, shard2, 'rabbit_shard2@localhost'}.
7+
{node, shard3, 'rabbit_shard3@localhost'}.
8+
{node, shard4, 'rabbit_shard4@localhost'}.
9+
10+
%%
11+
%% Sets of test suites that take around the same time to complete.
12+
%%
13+
14+
{define, 'Set1', [
15+
amqp_address_SUITE
16+
, amqp_auth_SUITE
17+
, amqp_client_SUITE
18+
, amqp_credit_api_v2_SUITE
19+
, amqp_proxy_protocol_SUITE
20+
, amqp_system_SUITE
21+
, amqpl_consumer_ack_SUITE
22+
, amqpl_direct_reply_to_SUITE
23+
, amqqueue_backward_compatibility_SUITE
24+
, backing_queue_SUITE
25+
, bindings_SUITE
26+
, channel_interceptor_SUITE
27+
, channel_operation_timeout_SUITE
28+
, classic_queue_SUITE
29+
, classic_queue_prop_SUITE
30+
]}.
31+
32+
{define, 'Set2', [
33+
cluster_SUITE
34+
, config_schema_SUITE
35+
, confirms_rejects_SUITE
36+
, consumer_timeout_SUITE
37+
, crashing_queues_SUITE
38+
, deprecated_features_SUITE
39+
, direct_exchange_routing_v2_SUITE
40+
, disconnect_detected_during_alarm_SUITE
41+
, disk_monitor_SUITE
42+
, dynamic_qq_SUITE
43+
, exchanges_SUITE
44+
, rabbit_stream_queue_SUITE
45+
]}.
46+
47+
{define, 'Set3', [
48+
cli_forget_cluster_node_SUITE
49+
, feature_flags_SUITE
50+
, feature_flags_v2_SUITE
51+
, feature_flags_with_unpriveleged_user_SUITE
52+
, list_consumers_sanity_check_SUITE
53+
, list_queues_online_and_offline_SUITE
54+
, logging_SUITE
55+
, lqueue_SUITE
56+
, maintenance_mode_SUITE
57+
, mc_unit_SUITE
58+
, message_containers_deaths_v2_SUITE
59+
, message_size_limit_SUITE
60+
, metadata_store_migration_SUITE
61+
, metadata_store_phase1_SUITE
62+
, metrics_SUITE
63+
, mirrored_supervisor_SUITE
64+
, msg_store_SUITE
65+
, peer_discovery_classic_config_SUITE
66+
]}.
67+
68+
{define, 'Set4', [
69+
peer_discovery_dns_SUITE
70+
, peer_discovery_tmp_hidden_node_SUITE
71+
, per_node_limit_SUITE
72+
, per_user_connection_channel_limit_SUITE
73+
, per_user_connection_channel_tracking_SUITE
74+
, per_user_connection_tracking_SUITE
75+
, per_vhost_connection_limit_SUITE
76+
, per_vhost_msg_store_SUITE
77+
, per_vhost_queue_limit_SUITE
78+
, policy_SUITE
79+
, priority_queue_SUITE
80+
, priority_queue_recovery_SUITE
81+
, product_info_SUITE
82+
, proxy_protocol_SUITE
83+
, publisher_confirms_parallel_SUITE
84+
]}.
85+
86+
{define, 'Set5', [
87+
clustering_recovery_SUITE
88+
, metadata_store_clustering_SUITE
89+
, queue_length_limits_SUITE
90+
, queue_parallel_SUITE
91+
, quorum_queue_SUITE
92+
, rabbit_access_control_SUITE
93+
, rabbit_confirms_SUITE
94+
, rabbit_core_metrics_gc_SUITE
95+
, rabbit_cuttlefish_SUITE
96+
, rabbit_db_binding_SUITE
97+
, rabbit_db_exchange_SUITE
98+
, rabbit_db_maintenance_SUITE
99+
, rabbit_db_msup_SUITE
100+
, rabbit_db_policy_SUITE
101+
, rabbit_db_queue_SUITE
102+
, rabbit_db_topic_exchange_SUITE
103+
, rabbit_direct_reply_to_prop_SUITE
104+
]}.
105+
106+
{define, 'Set6', [
107+
queue_type_SUITE
108+
, quorum_queue_member_reconciliation_SUITE
109+
, rabbit_fifo_SUITE
110+
, rabbit_fifo_dlx_SUITE
111+
, rabbit_fifo_dlx_integration_SUITE
112+
, rabbit_fifo_int_SUITE
113+
, rabbit_fifo_prop_SUITE
114+
, rabbit_fifo_v0_SUITE
115+
, rabbit_local_random_exchange_SUITE
116+
, rabbit_message_interceptor_SUITE
117+
, rabbit_stream_coordinator_SUITE
118+
, rabbit_stream_sac_coordinator_SUITE
119+
, rabbitmq_4_0_deprecations_SUITE
120+
, rabbitmq_queues_cli_integration_SUITE
121+
, rabbitmqctl_integration_SUITE
122+
, rabbitmqctl_shutdown_SUITE
123+
, routing_SUITE
124+
, runtime_parameters_SUITE
125+
]}.
126+
127+
{define, 'Set7', [
128+
cluster_limit_SUITE
129+
, cluster_minority_SUITE
130+
, clustering_management_SUITE
131+
, signal_handling_SUITE
132+
, single_active_consumer_SUITE
133+
, term_to_binary_compat_prop_SUITE
134+
, topic_permission_SUITE
135+
, transactions_SUITE
136+
, unicode_SUITE
137+
, unit_access_control_SUITE
138+
, unit_access_control_authn_authz_context_propagation_SUITE
139+
, unit_access_control_credential_validation_SUITE
140+
, unit_amqp091_content_framing_SUITE
141+
, unit_amqp091_server_properties_SUITE
142+
, unit_app_management_SUITE
143+
, unit_cluster_formation_locking_mocks_SUITE
144+
, unit_cluster_formation_sort_nodes_SUITE
145+
, unit_collections_SUITE
146+
, unit_config_value_encryption_SUITE
147+
, unit_connection_tracking_SUITE
148+
]}.
149+
150+
{define, 'Set8', [
151+
dead_lettering_SUITE
152+
, definition_import_SUITE
153+
, per_user_connection_channel_limit_partitions_SUITE
154+
, per_vhost_connection_limit_partitions_SUITE
155+
, unit_credit_flow_SUITE
156+
, unit_disk_monitor_SUITE
157+
, unit_file_handle_cache_SUITE
158+
, unit_gen_server2_SUITE
159+
, unit_log_management_SUITE
160+
, unit_operator_policy_SUITE
161+
, unit_pg_local_SUITE
162+
, unit_plugin_directories_SUITE
163+
, unit_plugin_versioning_SUITE
164+
, unit_policy_validators_SUITE
165+
, unit_priority_queue_SUITE
166+
, unit_queue_consumers_SUITE
167+
, unit_queue_location_SUITE
168+
, unit_quorum_queue_SUITE
169+
, unit_stats_and_metrics_SUITE
170+
, unit_supervisor2_SUITE
171+
, unit_vm_memory_monitor_SUITE
172+
, upgrade_preparation_SUITE
173+
, vhost_SUITE
174+
]}.
175+
176+
{suites, shard1, "test/", 'Set1'}.
177+
{suites, shard1, "test/", 'Set2'}.
178+
179+
{suites, shard2, "test/", 'Set3'}.
180+
{suites, shard2, "test/", 'Set4'}.
181+
182+
{suites, shard3, "test/", 'Set5'}.
183+
{suites, shard3, "test/", 'Set6'}.
184+
185+
{suites, shard4, "test/", 'Set7'}.
186+
{suites, shard4, "test/", 'Set8'}.

deps/rabbit/test/cluster_limit_SUITE.erl

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,7 @@ init_per_group(Group, Config) ->
5454
[{rmq_nodes_count, ClusterSize},
5555
{rmq_nodename_suffix, Group},
5656
{tcp_ports_base}]),
57-
Config1b = rabbit_ct_helpers:set_config(Config1, [{net_ticktime, 10}]),
58-
rabbit_ct_helpers:run_steps(Config1b,
57+
rabbit_ct_helpers:run_steps(Config1,
5958
[fun merge_app_env/1 ] ++
6059
rabbit_ct_broker_helpers:setup_steps())
6160
end.

deps/rabbit/test/feature_flags_v2_SUITE.erl

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,15 @@ start_slave_node(Parent, Config, Testcase, N) ->
167167
Name = list_to_atom(
168168
rabbit_misc:format("~ts-~b", [Testcase, N])),
169169
ct:pal("- Starting slave node `~ts@...`", [Name]),
170-
{ok, Node} = slave:start(net_adm:localhost(), Name),
170+
{ok, NodePid, Node} = peer:start(#{
171+
name => Name,
172+
connection => standard_io,
173+
shutdown => close
174+
}),
175+
peer:call(NodePid, net_kernel, set_net_ticktime, [5]),
176+
177+
persistent_term:put({?MODULE, Node}, NodePid),
178+
171179
ct:pal("- Slave node `~ts` started", [Node]),
172180

173181
TestCodePath = filename:dirname(code:which(?MODULE)),
@@ -183,8 +191,16 @@ stop_slave_nodes(Config) ->
183191
rabbit_ct_helpers:delete_config(Config, nodes).
184192

185193
stop_slave_node(Node) ->
186-
ct:pal("- Stopping slave node `~ts`...", [Node]),
187-
ok = slave:stop(Node).
194+
case persistent_term:get({?MODULE, Node}, undefined) of
195+
undefined ->
196+
%% Node was already stopped (e.g. by the test case).
197+
ok;
198+
NodePid ->
199+
persistent_term:erase({?MODULE, Node}),
200+
201+
ct:pal("- Stopping slave node `~ts`...", [Node]),
202+
ok = peer:stop(NodePid)
203+
end.
188204

189205
connect_nodes([FirstNode | OtherNodes] = Nodes) ->
190206
lists:foreach(

deps/rabbit/test/metadata_store_clustering_SUITE.erl

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,7 @@ end_per_suite(Config) ->
7373
init_per_group(unclustered, Config) ->
7474
rabbit_ct_helpers:set_config(Config, [{metadata_store, mnesia},
7575
{rmq_nodes_clustered, false},
76-
{tcp_ports_base},
77-
{net_ticktime, 10}]);
76+
{tcp_ports_base}]);
7877
init_per_group(cluster_size_2, Config) ->
7978
rabbit_ct_helpers:set_config(Config, [{rmq_nodes_count, 2}]);
8079
init_per_group(cluster_size_3, Config) ->

deps/rabbit/test/per_vhost_connection_limit_SUITE.erl

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,8 @@ init_per_multinode_group(_Group, Config, NodeCount) ->
105105
rabbit_ct_broker_helpers:setup_steps() ++
106106
rabbit_ct_client_helpers:setup_steps()).
107107

108-
end_per_group(Group, Config) when Group == tests;
109-
Group == khepri_migration ->
110-
% The broker is managed by {init,end}_per_testcase().
108+
end_per_group(Group, Config) when Group == tests ->
109+
% The broker is managed by sub-groups.
111110
Config;
112111
end_per_group(_Group, Config) ->
113112
rabbit_ct_helpers:run_steps(Config,

deps/rabbit/test/queue_parallel_SUITE.erl

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -646,7 +646,11 @@ delete_immediately_by_resource(Config) ->
646646
ok.
647647

648648
cc_header_non_array_should_close_channel(Config) ->
649-
{C, Ch} = rabbit_ct_client_helpers:open_connection_and_channel(Config, 0),
649+
%% We use an unmanaged connection to avoid issues with
650+
%% tests running in parallel: in this test we expect the
651+
%% channel to close, but that channel is reused in other tests.
652+
C = rabbit_ct_client_helpers:open_unmanaged_connection(Config, 0),
653+
{ok, Ch} = amqp_connection:open_channel(C),
650654
Name0 = ?FUNCTION_NAME,
651655
Name = atom_to_binary(Name0),
652656
QName = <<"queue_cc_header_non_array", Name/binary>>,

deps/rabbit/test/queue_type_SUITE.erl

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,7 @@ init_per_group(Group, Config) ->
5656
{tcp_ports_base, {skip_n_nodes, ClusterSize}}
5757
]),
5858
Config1b = rabbit_ct_helpers:set_config(Config1,
59-
[{queue_type, atom_to_binary(Group, utf8)},
60-
{net_ticktime, 5}
59+
[{queue_type, atom_to_binary(Group, utf8)}
6160
]),
6261
Config2 = rabbit_ct_helpers:run_steps(Config1b,
6362
[fun merge_app_env/1 ] ++

deps/rabbit/test/quorum_queue_member_reconciliation_SUITE.erl

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,7 @@ init_per_group(Group, Config) ->
5151
[{rmq_nodes_count, ClusterSize},
5252
{rmq_nodename_suffix, Group},
5353
{tcp_ports_base}]),
54-
Config1b = rabbit_ct_helpers:set_config(Config1, [{net_ticktime, 10}]),
55-
rabbit_ct_helpers:run_steps(Config1b,
54+
rabbit_ct_helpers:run_steps(Config1,
5655
[fun merge_app_env/1 ] ++
5756
rabbit_ct_broker_helpers:setup_steps()).
5857

0 commit comments

Comments
 (0)