summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorMichael Klishin <mklishin@pivotal.io>2016-08-18 12:17:34 +0300
committerMichael Klishin <mklishin@pivotal.io>2016-08-18 12:17:34 +0300
commit754feab6936ff1954964bf04423a2758899b91dc (patch)
treed4d72c1ef7e84d994c52805a955e38d6967efd99 /test
parentdad8511a6409816d3d8012fdb70213122bb690e4 (diff)
parent9f1c12f8ab553aab2da435f82a805da8b08c9149 (diff)
downloadrabbitmq-server-git-754feab6936ff1954964bf04423a2758899b91dc.tar.gz
Merge branch 'master' into rabbitmq-server-500-squashed
Conflicts: src/rabbit_control_main.erl
Diffstat (limited to 'test')
-rw-r--r--test/gm_SUITE.erl11
-rw-r--r--test/health_check_SUITE.erl19
-rw-r--r--test/rabbitmqctl_integration_SUITE.erl146
-rw-r--r--test/unit_SUITE.erl45
4 files changed, 205 insertions, 16 deletions
diff --git a/test/gm_SUITE.erl b/test/gm_SUITE.erl
index f5ccf75b70..e4c68a257a 100644
--- a/test/gm_SUITE.erl
+++ b/test/gm_SUITE.erl
@@ -38,7 +38,8 @@ all() ->
broadcast,
confirmed_broadcast,
member_death,
- receive_in_order
+ receive_in_order,
+ unexpected_msg
].
init_per_suite(Config) ->
@@ -114,6 +115,14 @@ receive_in_order(_Config) ->
passed
end).
+unexpected_msg(_Config) ->
+ passed = with_two_members(
+ fun(Pid, _) ->
+ Pid ! {make_ref(), old_gen_server_answer},
+ true = erlang:is_process_alive(Pid),
+ passed
+ end).
+
do_broadcast(Fun) ->
with_two_members(broadcast_fun(Fun)).
diff --git a/test/health_check_SUITE.erl b/test/health_check_SUITE.erl
index 4d8f56e9d3..50abc97a02 100644
--- a/test/health_check_SUITE.erl
+++ b/test/health_check_SUITE.erl
@@ -33,6 +33,8 @@
,ignores_remote_alarms/1
,detects_local_alarm/1
,honors_timeout_argument/1
+ ,detects_stuck_local_node_monitor/1
+ ,ignores_stuck_remote_node_monitor/1
]).
all() ->
@@ -47,6 +49,8 @@ groups() ->
,ignores_remote_alarms
,detects_local_alarm
,honors_timeout_argument
+ ,detects_stuck_local_node_monitor
+ ,ignores_stuck_remote_node_monitor
]}].
init_per_suite(Config) ->
@@ -123,6 +127,21 @@ detects_local_alarm(Config) ->
{match, _} = re:run(Str, "resource alarm.*in effect"),
ok.
+detects_stuck_local_node_monitor(Config) ->
+ [A|_] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
+ rabbit_ct_broker_helpers:rpc(Config, A, sys, suspend, [rabbit_node_monitor]),
+ {error, 75, Str} = rabbit_ct_broker_helpers:rabbitmqctl(Config, A, ["-t", "5", "node_health_check"]),
+ {match, _} = re:run(Str, "operation node_health_check.*timed out"),
+ resume_sys_process(Config, A, rabbit_node_monitor),
+ ok.
+
+ignores_stuck_remote_node_monitor(Config) ->
+ [A, B] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
+ rabbit_ct_broker_helpers:rpc(Config, A, sys, suspend, [rabbit_node_monitor]),
+ {ok, _} = rabbit_ct_broker_helpers:rabbitmqctl(Config, B, ["-t", "5", "node_health_check"]),
+ resume_sys_process(Config, A, rabbit_node_monitor),
+ ok.
+
honors_timeout_argument(Config) ->
[A|_] = open_channel_and_declare_queue_everywhere(Config),
QPid = suspend_single_queue(Config, A),
diff --git a/test/rabbitmqctl_integration_SUITE.erl b/test/rabbitmqctl_integration_SUITE.erl
new file mode 100644
index 0000000000..9305781bda
--- /dev/null
+++ b/test/rabbitmqctl_integration_SUITE.erl
@@ -0,0 +1,146 @@
+%% The contents of this file are subject to the Mozilla Public License
+%% Version 1.1 (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.mozilla.org/MPL/
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and
+%% limitations under the License.
+%%
+%% The Original Code is RabbitMQ.
+%%
+%% The Initial Developer of the Original Code is GoPivotal, Inc.
+%% Copyright (c) 2016 Pivotal Software, Inc. All rights reserved.
+%%
+-module(rabbitmqctl_integration_SUITE).
+
+-include_lib("common_test/include/ct.hrl").
+-include_lib("amqp_client/include/amqp_client.hrl").
+
+-export([all/0
+ ,groups/0
+ ,init_per_suite/1
+ ,end_per_suite/1
+ ,init_per_group/2
+ ,end_per_group/2
+ ,init_per_testcase/2
+ ,end_per_testcase/2
+ ]).
+
+-export([list_queues_local/1
+ ,list_queues_offline/1
+ ,list_queues_online/1
+ ]).
+
+all() ->
+ [{group, list_queues}].
+
+groups() ->
+ [{list_queues, [],
+ [list_queues_local
+ ,list_queues_online
+ ,list_queues_offline
+ ]}].
+
+init_per_suite(Config) ->
+ rabbit_ct_helpers:log_environment(),
+ rabbit_ct_helpers:run_setup_steps(Config).
+
+end_per_suite(Config) ->
+ rabbit_ct_helpers:run_teardown_steps(Config).
+
+init_per_group(list_queues, Config0) ->
+ NumNodes = 3,
+ Config = create_n_node_cluster(Config0, NumNodes),
+ Config1 = declare_some_queues(Config),
+ rabbit_ct_broker_helpers:stop_node(Config1, NumNodes - 1),
+ Config1;
+init_per_group(_, Config) ->
+ Config.
+
+create_n_node_cluster(Config0, NumNodes) ->
+ Config1 = rabbit_ct_helpers:set_config(
+ Config0, [{rmq_nodes_count, NumNodes},
+ {rmq_nodes_clustered, true}]),
+ rabbit_ct_helpers:run_steps(Config1,
+ rabbit_ct_broker_helpers:setup_steps() ++
+ rabbit_ct_client_helpers:setup_steps()).
+
+declare_some_queues(Config) ->
+ Nodes = rabbit_ct_helpers:get_config(Config, rmq_nodes),
+ PerNodeQueues = [ declare_some_queues(Config, NodeNum)
+ || NodeNum <- lists:seq(0, length(Nodes)-1) ],
+ rabbit_ct_helpers:set_config(Config, {per_node_queues, PerNodeQueues}).
+
+declare_some_queues(Config, NodeNum) ->
+ {Conn, Chan} = rabbit_ct_client_helpers:open_connection_and_channel(Config, NodeNum),
+ NumQueues = 5,
+ Queues = [ list_to_binary(io_lib:format("queue-~b-on-node-~b", [QueueNum, NodeNum]))
+ || QueueNum <- lists:seq(1, NumQueues) ],
+ lists:foreach(fun (QueueName) ->
+ #'queue.declare_ok'{} = amqp_channel:call(Chan, #'queue.declare'{queue = QueueName, durable = true})
+ end, Queues),
+ rabbit_ct_client_helpers:close_connection_and_channel(Conn, Chan),
+ Queues.
+
+end_per_group(list_queues, Config0) ->
+ Config1 = case rabbit_ct_helpers:get_config(Config0, save_config) of
+ undefined -> Config0;
+ C -> C
+ end,
+ rabbit_ct_helpers:run_steps(Config1,
+ rabbit_ct_client_helpers:teardown_steps() ++
+ rabbit_ct_broker_helpers:teardown_steps());
+end_per_group(_, Config) ->
+ Config.
+
+init_per_testcase(Testcase, Config0) ->
+ rabbit_ct_helpers:testcase_started(Config0, Testcase).
+
+end_per_testcase(Testcase, Config0) ->
+ rabbit_ct_helpers:testcase_finished(Config0, Testcase).
+
+%%----------------------------------------------------------------------------
+%% Test cases
+%%----------------------------------------------------------------------------
+list_queues_local(Config) ->
+ Node1Queues = lists:sort(lists:nth(1, ?config(per_node_queues, Config))),
+ Node2Queues = lists:sort(lists:nth(2, ?config(per_node_queues, Config))),
+ assert_ctl_queues(Config, 0, ["--local"], Node1Queues),
+ assert_ctl_queues(Config, 1, ["--local"], Node2Queues),
+ ok.
+
+list_queues_online(Config) ->
+ Node1Queues = lists:sort(lists:nth(1, ?config(per_node_queues, Config))),
+ Node2Queues = lists:sort(lists:nth(2, ?config(per_node_queues, Config))),
+ OnlineQueues = Node1Queues ++ Node2Queues,
+ assert_ctl_queues(Config, 0, ["--online"], OnlineQueues),
+ assert_ctl_queues(Config, 1, ["--online"], OnlineQueues),
+ ok.
+
+list_queues_offline(Config) ->
+ Node3Queues = lists:sort(lists:nth(3, ?config(per_node_queues, Config))),
+ OfflineQueues = Node3Queues,
+ assert_ctl_queues(Config, 0, ["--offline"], OfflineQueues),
+ assert_ctl_queues(Config, 1, ["--offline"], OfflineQueues),
+ ok.
+
+%%----------------------------------------------------------------------------
+%% Helpers
+%%----------------------------------------------------------------------------
+assert_ctl_queues(Config, Node, Args, Expected0) ->
+ Expected = lists:sort(Expected0),
+ Got0 = run_list_queues(Config, Node, Args),
+ Got = lists:sort(lists:map(fun hd/1, Got0)),
+ case Got of
+ Expected ->
+ ok;
+ _ ->
+ ct:pal(error, "Listing queues on node ~p failed. Expected:~n~p~n~nGot:~n~p~n~n",
+ [Node, Expected, Got]),
+ exit({list_queues_unexpected_on, Node, Expected, Got})
+ end.
+
+run_list_queues(Config, Node, Args) ->
+ rabbit_ct_broker_helpers:rabbitmqctl_list(Config, Node, ["list_queues"] ++ Args ++ ["name"]).
diff --git a/test/unit_SUITE.erl b/test/unit_SUITE.erl
index 30bf4d937c..5faeccdaab 100644
--- a/test/unit_SUITE.erl
+++ b/test/unit_SUITE.erl
@@ -31,7 +31,7 @@ groups() ->
[
{parallel_tests, [parallel], [
arguments_parser,
- filtering_flags_parsing,
+ mutually_exclusive_flags_parsing,
{basic_header_handling, [parallel], [
write_table_with_invalid_existing_type,
invalid_existing_headers,
@@ -135,26 +135,41 @@ check_parse_arguments(ExpRes, Fun, As) ->
true = SortRes(ExpRes) =:= SortRes(Fun(As)).
-filtering_flags_parsing(_Config) ->
- Cases = [{[], [], []}
- ,{[{"--online", true}], ["--offline", "--online", "--third-option"], [false, true, false]}
- ,{[{"--online", true}, {"--third-option", true}, {"--offline", true}], ["--offline", "--online", "--third-option"], [true, true, true]}
- ,{[], ["--offline", "--online", "--third-option"], [true, true, true]}
- ],
- lists:foreach(fun({Vals, Opts, Expect}) ->
- case rabbit_cli:filter_opts(Vals, Opts) of
- Expect ->
+mutually_exclusive_flags_parsing(_Config) ->
+ Matcher = fun ({ok, Value}, {ok, Value}) -> true;
+ ({error, Value}, {error, Pattern}) ->
+ case re:run(Value, Pattern) of
+ {match, _} -> true;
+ _ -> false
+ end;
+ (_, _) -> false
+ end,
+ Spec = [{"--online", online}
+ ,{"--offline", offline}
+ ,{"--local", local}],
+ Default = all,
+ Cases =[{["--online"], {ok, online}}
+ ,{[], {ok, Default}}
+ ,{["--offline"], {ok, offline}}
+ ,{["--local"], {ok, local}}
+ ,{["--offline", "--local"], {error, "mutually exclusive"}}
+ ,{["--offline", "--online"], {error, "mutually exclusive"}}
+ ,{["--offline", "--local", "--online"], {error, "mutually exclusive"}}
+ ],
+ lists:foreach(fun({Opts, Expected}) ->
+ ExpandedOpts = [ {Opt, true} || Opt <- Opts ],
+ Got = rabbit_cli:mutually_exclusive_flags(ExpandedOpts, all, Spec),
+ case Matcher(Got, Expected) of
+ true ->
ok;
- Got ->
- exit({no_match, Got, Expect, {args, Vals, Opts}})
+ false ->
+ exit({no_match, Got, Expected, {opts, Opts}})
end
- end,
- Cases).
+ end, Cases).
%% -------------------------------------------------------------------
%% basic_header_handling.
%% -------------------------------------------------------------------
-
-define(XDEATH_TABLE,
[{<<"reason">>, longstr, <<"blah">>},
{<<"queue">>, longstr, <<"foo.bar.baz">>},