rabbitmq-server/deps/rabbit/test/rabbitmqctl_integration_SUI...

165 lines
6.2 KiB
Erlang

%% This Source Code Form is subject to the terms of the Mozilla Public
%% License, v. 2.0. If a copy of the MPL was not distributed with this
%% file, You can obtain one at https://mozilla.org/MPL/2.0/.
%%
%% Copyright (c) 2016-2021 VMware, Inc. or its affiliates. All rights reserved.
%%
-module(rabbitmqctl_integration_SUITE).
-include_lib("common_test/include/ct.hrl").
-include_lib("amqp_client/include/amqp_client.hrl").
-include_lib("eunit/include/eunit.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
,list_queues_stopped/1
]).
all() ->
[
{group, list_queues}
].
groups() ->
[
{list_queues, [],
[list_queues_local
,list_queues_online
,list_queues_offline
,list_queues_stopped
]}
].
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(list_queues_stopped, Config0) ->
%% Start node 3 to crash it's queues
rabbit_ct_broker_helpers:start_node(Config0, 2),
%% Make vhost "down" on nodes 2 and 3
rabbit_ct_broker_helpers:force_vhost_failure(Config0, 1, <<"/">>),
rabbit_ct_broker_helpers:force_vhost_failure(Config0, 2, <<"/">>),
rabbit_ct_broker_helpers:stop_node(Config0, 2),
rabbit_ct_helpers:testcase_started(Config0, list_queues_stopped);
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.
list_queues_stopped(Config) ->
Node1Queues = lists:sort(lists:nth(1, ?config(per_node_queues, Config))),
Node2Queues = lists:sort(lists:nth(2, ?config(per_node_queues, Config))),
Node3Queues = lists:sort(lists:nth(3, ?config(per_node_queues, Config))),
%% All queues are listed
ListedQueues =
[ {Name, State}
|| [Name, State] <- rabbit_ct_broker_helpers:rabbitmqctl_list(
Config, 0, ["list_queues", "name", "state", "--no-table-headers"]) ],
[ <<"running">> = proplists:get_value(Q, ListedQueues) || Q <- Node1Queues ],
%% Node is running. Vhost is down
[ <<"stopped">> = proplists:get_value(Q, ListedQueues) || Q <- Node2Queues ],
%% Node is not running. Vhost is down
[ <<"down">> = proplists:get_value(Q, ListedQueues) || Q <- Node3Queues ].
%%----------------------------------------------------------------------------
%% 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)),
?assertMatch(Expected, Got).
run_list_queues(Config, Node, Args) ->
rabbit_ct_broker_helpers:rabbitmqctl_list(Config, Node, ["list_queues"] ++ Args ++ ["name", "--no-table-headers"]).