Move management test helpers here to test management plugins
This commit is contained in:
parent
84698da76f
commit
ca42aa2db9
|
|
@ -0,0 +1,12 @@
|
|||
-include_lib("eunit/include/eunit.hrl").
|
||||
-include_lib("amqp_client/include/amqp_client.hrl").
|
||||
|
||||
-define(OK, 200).
|
||||
-define(CREATED, 201).
|
||||
-define(NO_CONTENT, 204).
|
||||
-define(SEE_OTHER, 303).
|
||||
-define(BAD_REQUEST, 400).
|
||||
-define(NOT_AUTHORISED, 401).
|
||||
%%-define(NOT_FOUND, 404). Defined for AMQP by amqp_client.hrl (as 404)
|
||||
%% httpc seems to get racy when using HTTP 1.1
|
||||
-define(HTTPC_OPTS, [{version, "HTTP/1.0"}, {autoredirect, false}]).
|
||||
|
|
@ -0,0 +1,213 @@
|
|||
%% 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 Management Console.
|
||||
%%
|
||||
%% The Initial Developer of the Original Code is GoPivotal, Inc.
|
||||
%% Copyright (c) 2010-2012 GoPivotal, Inc. All rights reserved.
|
||||
%%
|
||||
|
||||
-module(rabbit_mgmt_test_util).
|
||||
|
||||
-include_lib("rabbitmq_ct_helpers/include/rabbit_mgmt_test.hrl").
|
||||
|
||||
-compile(export_all).
|
||||
|
||||
reset_management_settings(Config) ->
|
||||
rabbit_ct_broker_helpers:rpc(Config, 0, application, set_env,
|
||||
[rabbit, collect_statistics_interval, 5000]),
|
||||
Config.
|
||||
|
||||
merge_stats_app_env(Config, Interval, SampleInterval) ->
|
||||
Config1 = rabbit_ct_helpers:merge_app_env(
|
||||
Config, {rabbit, [{collect_statistics_interval, Interval}]}),
|
||||
rabbit_ct_helpers:merge_app_env(
|
||||
Config1, {rabbitmq_management_agent, [{sample_retention_policies,
|
||||
[{global, [{605, SampleInterval}]},
|
||||
{basic, [{605, SampleInterval}]},
|
||||
{detailed, [{10, SampleInterval}]}] }]}).
|
||||
http_get_from_node(Config, Node, Path) ->
|
||||
{ok, {{_HTTP, CodeAct, _}, Headers, ResBody}} =
|
||||
req(Config, Node, get, Path, [auth_header("guest", "guest")]),
|
||||
assert_code(?OK, CodeAct, "GET", Path, ResBody),
|
||||
decode(?OK, Headers, ResBody).
|
||||
|
||||
|
||||
http_get(Config, Path) ->
|
||||
http_get(Config, Path, ?OK).
|
||||
|
||||
http_get(Config, Path, CodeExp) ->
|
||||
http_get(Config, Path, "guest", "guest", CodeExp).
|
||||
|
||||
http_get(Config, Path, User, Pass, CodeExp) ->
|
||||
{ok, {{_HTTP, CodeAct, _}, Headers, ResBody}} =
|
||||
req(Config, 0, get, Path, [auth_header(User, Pass)]),
|
||||
assert_code(CodeExp, CodeAct, "GET", Path, ResBody),
|
||||
decode(CodeExp, Headers, ResBody).
|
||||
|
||||
http_put(Config, Path, List, CodeExp) ->
|
||||
http_put_raw(Config, Path, format_for_upload(List), CodeExp).
|
||||
|
||||
http_put(Config, Path, List, User, Pass, CodeExp) ->
|
||||
http_put_raw(Config, Path, format_for_upload(List), User, Pass, CodeExp).
|
||||
|
||||
http_post(Config, Path, List, CodeExp) ->
|
||||
http_post_raw(Config, Path, format_for_upload(List), CodeExp).
|
||||
|
||||
http_post(Config, Path, List, User, Pass, CodeExp) ->
|
||||
http_post_raw(Config, Path, format_for_upload(List), User, Pass, CodeExp).
|
||||
|
||||
http_post_accept_json(Config, Path, List, CodeExp) ->
|
||||
http_post_accept_json(Config, Path, List, "guest", "guest", CodeExp).
|
||||
|
||||
http_post_accept_json(Config, Path, List, User, Pass, CodeExp) ->
|
||||
http_post_raw(Config, Path, format_for_upload(List), User, Pass, CodeExp,
|
||||
[{"Accept", "application/json"}]).
|
||||
|
||||
req(Config, Type, Path, Headers) ->
|
||||
req(Config, 0, Type, Path, Headers).
|
||||
|
||||
req(Config, Node, Type, Path, Headers) ->
|
||||
httpc:request(Type, {uri_base_from(Config, Node) ++ Path, Headers}, ?HTTPC_OPTS, []).
|
||||
|
||||
req(Config, Node, Type, Path, Headers, Body) ->
|
||||
httpc:request(Type, {uri_base_from(Config, Node) ++ Path, Headers, "application/json", Body},
|
||||
?HTTPC_OPTS, []).
|
||||
|
||||
uri_base_from(Config, Node) ->
|
||||
binary_to_list(
|
||||
rabbit_mgmt_format:print(
|
||||
"http://localhost:~w/api",
|
||||
[mgmt_port(Config, Node)])).
|
||||
|
||||
auth_header(Username, Password) ->
|
||||
{"Authorization",
|
||||
"Basic " ++ binary_to_list(base64:encode(Username ++ ":" ++ Password))}.
|
||||
|
||||
amqp_port(Config) ->
|
||||
config_port(Config, tcp_port_amqp).
|
||||
|
||||
mgmt_port(Config, Node) ->
|
||||
config_port(Config, Node, tcp_port_mgmt).
|
||||
|
||||
config_port(Config, PortKey) ->
|
||||
config_port(Config, 0, PortKey).
|
||||
|
||||
config_port(Config, Node, PortKey) ->
|
||||
rabbit_ct_broker_helpers:get_node_config(Config, Node, PortKey).
|
||||
|
||||
http_put_raw(Config, Path, Body, CodeExp) ->
|
||||
http_upload_raw(Config, put, Path, Body, "guest", "guest", CodeExp, []).
|
||||
|
||||
http_put_raw(Config, Path, Body, User, Pass, CodeExp) ->
|
||||
http_upload_raw(Config, put, Path, Body, User, Pass, CodeExp, []).
|
||||
|
||||
|
||||
http_post_raw(Config, Path, Body, CodeExp) ->
|
||||
http_upload_raw(Config, post, Path, Body, "guest", "guest", CodeExp, []).
|
||||
|
||||
http_post_raw(Config, Path, Body, User, Pass, CodeExp) ->
|
||||
http_upload_raw(Config, post, Path, Body, User, Pass, CodeExp, []).
|
||||
|
||||
http_post_raw(Config, Path, Body, User, Pass, CodeExp, MoreHeaders) ->
|
||||
http_upload_raw(Config, post, Path, Body, User, Pass, CodeExp, MoreHeaders).
|
||||
|
||||
|
||||
http_upload_raw(Config, Type, Path, Body, User, Pass, CodeExp, MoreHeaders) ->
|
||||
{ok, {{_HTTP, CodeAct, _}, Headers, ResBody}} =
|
||||
req(Config, 0, Type, Path, [auth_header(User, Pass)] ++ MoreHeaders, Body),
|
||||
assert_code(CodeExp, CodeAct, Type, Path, ResBody),
|
||||
decode(CodeExp, Headers, ResBody).
|
||||
|
||||
http_delete(Config, Path, CodeExp) ->
|
||||
http_delete(Config, Path, "guest", "guest", CodeExp).
|
||||
|
||||
http_delete(Config, Path, User, Pass, CodeExp) ->
|
||||
{ok, {{_HTTP, CodeAct, _}, Headers, ResBody}} =
|
||||
req(Config, 0, delete, Path, [auth_header(User, Pass)]),
|
||||
assert_code(CodeExp, CodeAct, "DELETE", Path, ResBody),
|
||||
decode(CodeExp, Headers, ResBody).
|
||||
|
||||
format_for_upload(none) ->
|
||||
<<"">>;
|
||||
format_for_upload(List) ->
|
||||
iolist_to_binary(mochijson2:encode({struct, List})).
|
||||
|
||||
assert_code(CodesExpected, CodeAct, Type, Path, Body) when is_list(CodesExpected) ->
|
||||
case lists:member(CodeAct, CodesExpected) of
|
||||
true ->
|
||||
ok;
|
||||
false ->
|
||||
throw({expected, CodesExpected, got, CodeAct, type, Type,
|
||||
path, Path, body, Body})
|
||||
end;
|
||||
assert_code(CodeExp, CodeAct, Type, Path, Body) ->
|
||||
case CodeExp of
|
||||
CodeAct -> ok;
|
||||
_ -> throw({expected, CodeExp, got, CodeAct, type, Type,
|
||||
path, Path, body, Body})
|
||||
end.
|
||||
|
||||
decode(?OK, _Headers, ResBody) -> cleanup(mochijson2:decode(ResBody));
|
||||
decode(_, Headers, _ResBody) -> Headers.
|
||||
|
||||
cleanup(L) when is_list(L) ->
|
||||
[cleanup(I) || I <- L];
|
||||
cleanup({struct, I}) ->
|
||||
cleanup(I);
|
||||
cleanup({K, V}) when is_binary(K) ->
|
||||
{list_to_atom(binary_to_list(K)), cleanup(V)};
|
||||
cleanup(I) ->
|
||||
I.
|
||||
|
||||
assert_list(Exp, Act) ->
|
||||
case length(Exp) == length(Act) of
|
||||
true -> ok;
|
||||
false -> throw({expected, Exp, actual, Act})
|
||||
end,
|
||||
[case length(lists:filter(fun(ActI) -> test_item(ExpI, ActI) end, Act)) of
|
||||
1 -> ok;
|
||||
N -> throw({found, N, ExpI, in, Act})
|
||||
end || ExpI <- Exp].
|
||||
|
||||
assert_item(Exp, Act) ->
|
||||
case test_item0(Exp, Act) of
|
||||
[] -> ok;
|
||||
Or -> throw(Or)
|
||||
end.
|
||||
|
||||
test_item(Exp, Act) ->
|
||||
case test_item0(Exp, Act) of
|
||||
[] -> true;
|
||||
_ -> false
|
||||
end.
|
||||
|
||||
test_item0(Exp, Act) ->
|
||||
[{did_not_find, ExpI, in, Act} || ExpI <- Exp,
|
||||
not lists:member(ExpI, Act)].
|
||||
|
||||
assert_keys(Exp, Act) ->
|
||||
case test_key0(Exp, Act) of
|
||||
[] -> ok;
|
||||
Or -> throw(Or)
|
||||
end.
|
||||
|
||||
test_key0(Exp, Act) ->
|
||||
[{did_not_find, ExpI, in, Act} || ExpI <- Exp,
|
||||
not proplists:is_defined(ExpI, Act)].
|
||||
assert_no_keys(NotExp, Act) ->
|
||||
case test_no_key0(NotExp, Act) of
|
||||
[] -> ok;
|
||||
Or -> throw(Or)
|
||||
end.
|
||||
|
||||
test_no_key0(Exp, Act) ->
|
||||
[{invalid_key, ExpI, in, Act} || ExpI <- Exp,
|
||||
proplists:is_defined(ExpI, Act)].
|
||||
Loading…
Reference in New Issue