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