Moving files around

This commit is contained in:
Daniil Fedotov 2016-07-22 11:14:33 +01:00
parent df929611a8
commit ab642c9278
26 changed files with 169 additions and 100 deletions

View File

@ -15,7 +15,7 @@ rabbitmq_stomp.d
# Python testsuite.
*.pyc
test/deps/pika/pika/
test/deps/pika/pika-git/
test/deps/stomppy/stomppy/
test/deps/stomppy/stomppy-git/
test/python_SUITE_data/deps/pika/pika/
test/python_SUITE_data/deps/pika/pika-git/
test/python_SUITE_data/deps/stomppy/stomppy/
test/python_SUITE_data/deps/stomppy/stomppy-git/

View File

@ -46,12 +46,14 @@ groups() ->
blank_destination_in_send
],
[{list_to_atom("version_" ++ V), [sequence], Tests}
[{list_to_atom("version_" ++ V), [sequence], Tests}
|| V <- ?SUPPORTED_VERSIONS].
init_per_suite(Config) ->
Config1 = rabbit_ct_helpers:set_config(Config,
[{rmq_nodename_suffix, ?MODULE}]),
rabbit_ct_helpers:log_environment(),
rabbit_ct_helpers:run_setup_steps(Config,
rabbit_ct_helpers:run_setup_steps(Config1,
rabbit_ct_broker_helpers:setup_steps()).
end_per_suite(Config) ->
@ -63,7 +65,7 @@ init_per_group(Group, Config) ->
end_per_group(_Group, Config) -> Config.
init_per_testcase(_, Config) ->
init_per_testcase(TestCase, Config) ->
Version = ?config(version, Config),
StompPort = rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_stomp),
{ok, Connection} = amqp_connection:start(#amqp_params_direct{
@ -71,19 +73,44 @@ init_per_testcase(_, Config) ->
}),
{ok, Channel} = amqp_connection:open_channel(Connection),
{ok, Client} = rabbit_stomp_client:connect(Version, StompPort),
rabbit_ct_helpers:set_config(Config, [
Config1 = rabbit_ct_helpers:set_config(Config, [
{amqp_connection, Connection},
{amqp_channel, Channel},
{stomp_client, Client}
]).
]),
init_per_testcase0(TestCase, Config1).
end_per_testcase(_, Config) ->
end_per_testcase(TestCase, Config) ->
Connection = ?config(amqp_connection, Config),
Channel = ?config(amqp_channel, Config),
Client = ?config(stomp_client, Config),
rabbit_stomp_client:disconnect(Client),
amqp_channel:close(Channel),
amqp_connection:close(Connection),
end_per_testcase0(TestCase, Config).
init_per_testcase0(publish_unauthorized_error, Config) ->
Channel = ?config(amqp_channel, Config),
#'queue.declare_ok'{} =
amqp_channel:call(Channel, #'queue.declare'{queue = <<"RestrictedQueue">>,
auto_delete = true}),
rabbit_ct_broker_helpers:rpc(Config, 0, rabbit_auth_backend_internal, add_user, [<<"user">>, <<"pass">>]),
rabbit_ct_broker_helpers:rpc(Config, 0, rabbit_auth_backend_internal, set_permissions, [
<<"user">>, <<"/">>, <<"nothing">>, <<"nothing">>, <<"nothing">>]),
Version = ?config(version, Config),
StompPort = rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_stomp),
{ok, ClientFoo} = rabbit_stomp_client:connect(Version, "user", "pass", StompPort),
rabbit_ct_helpers:set_config(Config, [{client_foo, ClientFoo}]);
init_per_testcase0(_, Config) ->
Config.
end_per_testcase0(publish_unauthorized_error, Config) ->
ClientFoo = ?config(client_foo, Config),
rabbit_stomp_client:disconnect(ClientFoo),
rabbit_ct_broker_helpers:rpc(Config, 0, rabbit_auth_backend_internal, delete_user, [<<"user">>]),
Config;
end_per_testcase0(_, Config) ->
Config.
publish_no_dest_error(Config) ->
@ -95,29 +122,12 @@ publish_no_dest_error(Config) ->
ok.
publish_unauthorized_error(Config) ->
Channel = ?config(amqp_channel, Config),
Version = ?config(version, Config),
#'queue.declare_ok'{} =
amqp_channel:call(Channel, #'queue.declare'{queue = <<"RestrictedQueue">>,
auto_delete = true}),
rabbit_ct_broker_helpers:rpc(Config, 0, rabbit_auth_backend_internal, add_user, [<<"user">>, <<"pass">>]),
rabbit_ct_broker_helpers:rpc(Config, 0, rabbit_auth_backend_internal, set_permissions, [
<<"user">>, <<"/">>, <<"nothing">>, <<"nothing">>, <<"nothing">>]),
StompPort = rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_stomp),
{ok, ClientFoo} = rabbit_stomp_client:connect(Version, "user", "pass", StompPort),
try
rabbit_stomp_client:send(
ClientFoo, "SEND", [{"destination", "/amq/queue/RestrictedQueue"}], ["hello"]),
{ok, _Client1, Hdrs, _} = stomp_receive(ClientFoo, "ERROR"),
"access_refused" = proplists:get_value("message", Hdrs),
ok
catch _:Err ->
Err
after
rabbit_stomp_client:disconnect(ClientFoo),
rabbit_ct_broker_helpers:rpc(Config, 0, rabbit_auth_backend_internal, delete_user, [<<"user">>])
end.
ClientFoo = ?config(client_foo, Config),
rabbit_stomp_client:send(
ClientFoo, "SEND", [{"destination", "/amq/queue/RestrictedQueue"}], ["hello"]),
{ok, _Client1, Hdrs, _} = stomp_receive(ClientFoo, "ERROR"),
"access_refused" = proplists:get_value("message", Hdrs),
ok.
subscribe_error(Config) ->
Client = ?config(stomp_client, Config),

View File

@ -31,10 +31,13 @@ all() ->
].
init_per_suite(Config) ->
Config1 = rabbit_ct_helpers:set_config(Config,
[{rmq_nodename_suffix, ?MODULE}]),
rabbit_ct_helpers:log_environment(),
rabbit_ct_helpers:run_setup_steps(Config,
rabbit_ct_helpers:run_setup_steps(Config1,
rabbit_ct_broker_helpers:setup_steps()).
end_per_suite(Config) ->
rabbit_ct_helpers:run_teardown_steps(Config).

View File

@ -14,17 +14,45 @@
%% Copyright (c) 2007-2016 Pivotal Software, Inc. All rights reserved.
%%
-module(rabbit_stomp_test_frame).
-module(frame_SUITE).
-include_lib("common_test/include/ct.hrl").
-include_lib("eunit/include/eunit.hrl").
-include_lib("amqp_client/include/amqp_client.hrl").
-include("rabbit_stomp_frame.hrl").
-include("rabbit_stomp_headers.hrl").
-compile(export_all).
parse_simple_frame_test() ->
all() ->
[
parse_simple_frame,
parse_simple_frame_crlf,
parse_command_only,
parse_ignore_empty_frames,
parse_heartbeat_interframe,
parse_crlf_interframe,
parse_carriage_return_not_ignored_interframe,
parse_carriage_return_mid_command,
parse_carriage_return_end_command,
parse_resume_mid_command,
parse_resume_mid_header_key,
parse_resume_mid_header_val,
parse_resume_mid_body,
parse_no_header_stripping,
parse_multiple_headers,
header_no_colon,
no_nested_escapes,
header_name_with_cr,
header_value_with_cr,
header_value_with_colon,
headers_escaping_roundtrip,
headers_escaping_roundtrip_without_trailing_lf
].
parse_simple_frame(_) ->
parse_simple_frame_gen("\n").
parse_simple_frame_crlf_test() ->
parse_simple_frame_crlf(_) ->
parse_simple_frame_gen("\r\n").
parse_simple_frame_gen(Term) ->
@ -40,34 +68,34 @@ parse_simple_frame_gen(Term) ->
#stomp_frame{body_iolist = Body} = Frame,
?assertEqual(<<"Body Content">>, iolist_to_binary(Body)).
parse_command_only_test() ->
parse_command_only(_) ->
{ok, #stomp_frame{command = "COMMAND"}, _Rest} = parse("COMMAND\n\n\0").
parse_ignore_empty_frames_test() ->
parse_ignore_empty_frames(_) ->
{ok, #stomp_frame{command = "COMMAND"}, _Rest} = parse("\0\0COMMAND\n\n\0").
parse_heartbeat_interframe_test() ->
parse_heartbeat_interframe(_) ->
{ok, #stomp_frame{command = "COMMAND"}, _Rest} = parse("\nCOMMAND\n\n\0").
parse_crlf_interframe_test() ->
parse_crlf_interframe(_) ->
{ok, #stomp_frame{command = "COMMAND"}, _Rest} = parse("\r\nCOMMAND\n\n\0").
parse_carriage_return_not_ignored_interframe_test() ->
parse_carriage_return_not_ignored_interframe(_) ->
{error, {unexpected_chars_between_frames, "\rC"}} = parse("\rCOMMAND\n\n\0").
parse_carriage_return_mid_command_test() ->
parse_carriage_return_mid_command(_) ->
{error, {unexpected_chars_in_command, "\rA"}} = parse("COMM\rAND\n\n\0").
parse_carriage_return_end_command_test() ->
parse_carriage_return_end_command(_) ->
{error, {unexpected_chars_in_command, "\r\r"}} = parse("COMMAND\r\r\n\n\0").
parse_resume_mid_command_test() ->
parse_resume_mid_command(_) ->
First = "COMM",
Second = "AND\n\n\0",
{more, Resume} = parse(First),
{ok, #stomp_frame{command = "COMMAND"}, _Rest} = parse(Second, Resume).
parse_resume_mid_header_key_test() ->
parse_resume_mid_header_key(_) ->
First = "COMMAND\nheade",
Second = "r1:value1\n\n\0",
{more, Resume} = parse(First),
@ -76,7 +104,7 @@ parse_resume_mid_header_key_test() ->
?assertEqual({ok, "value1"},
rabbit_stomp_frame:header(Frame, "header1")).
parse_resume_mid_header_val_test() ->
parse_resume_mid_header_val(_) ->
First = "COMMAND\nheader1:val",
Second = "ue1\n\n\0",
{more, Resume} = parse(First),
@ -85,7 +113,7 @@ parse_resume_mid_header_val_test() ->
?assertEqual({ok, "value1"},
rabbit_stomp_frame:header(Frame, "header1")).
parse_resume_mid_body_test() ->
parse_resume_mid_body(_) ->
First = "COMMAND\n\nABC",
Second = "DEF\0",
{more, Resume} = parse(First),
@ -93,19 +121,19 @@ parse_resume_mid_body_test() ->
parse(Second, Resume),
?assertEqual([<<"ABC">>, <<"DEF">>], Body).
parse_no_header_stripping_test() ->
parse_no_header_stripping(_) ->
Content = "COMMAND\nheader: foo \n\n\0",
{ok, Frame, _} = parse(Content),
{ok, Val} = rabbit_stomp_frame:header(Frame, "header"),
?assertEqual(" foo ", Val).
parse_multiple_headers_test() ->
parse_multiple_headers(_) ->
Content = "COMMAND\nheader:correct\nheader:incorrect\n\n\0",
{ok, Frame, _} = parse(Content),
{ok, Val} = rabbit_stomp_frame:header(Frame, "header"),
?assertEqual("correct", Val).
header_no_colon_test() ->
header_no_colon(_) ->
Content = "COMMAND\n"
"hdr1:val1\n"
"hdrerror\n"
@ -113,7 +141,7 @@ header_no_colon_test() ->
"\n\0",
?assertEqual(parse(Content), {error, {header_no_value, "hdrerror"}}).
no_nested_escapes_test() ->
no_nested_escapes(_) ->
Content = "COM\\\\rAND\n" % no escapes
"hdr\\\\rname:" % one escape
"hdr\\\\rval\n\n\0", % one escape
@ -123,15 +151,15 @@ no_nested_escapes_test() ->
headers = [{"hdr\\rname", "hdr\\rval"}],
body_iolist = []}).
header_name_with_cr_test() ->
header_name_with_cr(_) ->
Content = "COMMAND\nhead\rer:val\n\n\0",
{error, {unexpected_chars_in_header, "\re"}} = parse(Content).
header_value_with_cr_test() ->
header_value_with_cr(_) ->
Content = "COMMAND\nheader:val\rue\n\n\0",
{error, {unexpected_chars_in_header, "\ru"}} = parse(Content).
header_value_with_colon_test() ->
header_value_with_colon(_) ->
Content = "COMMAND\nheader:val:ue\n\n\0",
{ok, Frame, _} = parse(Content),
?assertEqual(Frame,
@ -146,10 +174,10 @@ test_frame_serialization(Expected, TrailingLF) ->
Serialized = lists:flatten(rabbit_stomp_frame:serialize(Frame, TrailingLF)),
?assertEqual(Expected, rabbit_misc:format("~s", [Serialized])).
headers_escaping_roundtrip_test() ->
headers_escaping_roundtrip(_) ->
test_frame_serialization("COMMAND\nhead\\r\\c\\ner:\\c\\n\\r\\\\\n\n\0\n", true).
headers_escaping_roundtrip_without_trailing_lf_test() ->
headers_escaping_roundtrip_without_trailing_lf(_) ->
test_frame_serialization("COMMAND\nhead\\r\\c\\ner:\\c\\n\\r\\\\\n\n\0", false).
parse(Content) ->
@ -161,9 +189,6 @@ parse_complete(Content) ->
{ok, Frame = #stomp_frame{command = Command}, State} = parse(Content),
{Command, Frame, State}.
frame_string(Command, Headers, BodyContent) ->
frame_string(Command, Headers, BodyContent, "\n").
frame_string(Command, Headers, BodyContent, Term) ->
HeaderString =
lists:flatten([Key ++ ":" ++ Value ++ Term || {Key, Value} <- Headers]),

View File

@ -11,10 +11,12 @@ all() ->
init_per_testcase(_, Config) ->
Config1 = rabbit_ct_helpers:set_config(Config, [{rmq_certspwd, "bunnychow"}]),
Config1 = rabbit_ct_helpers:set_config(Config,
[{rmq_certspwd, "bunnychow"},
{rmq_nodename_suffix, ?MODULE}]),
rabbit_ct_helpers:log_environment(),
rabbit_ct_helpers:run_setup_steps(
Config1,
Config1,
rabbit_ct_broker_helpers:setup_steps()).
end_per_testcase(_, Config) ->
@ -22,29 +24,33 @@ end_per_testcase(_, Config) ->
common(Config) ->
run(Config, "/src/test.py").
run(Config, filename:join("src", "test.py")).
connect_options(Config) ->
run(Config, "/src/test_connect_options.py").
run(Config, filename:join("src", "test_connect_options.py")).
ssl(Config) ->
run(Config, "/src/test_ssl.py").
run(Config, filename:join("src", "test_ssl.py")).
run(Config, Test) ->
Curdir = cur_dir(),
DataDir = ?config(data_dir, Config),
CertsDir = rabbit_ct_helpers:get_config(Config, rmq_certsdir),
StompPort = rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_stomp),
StompPortTls = rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_stomp_tls),
AmqpPort = rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_amqp),
NodeName = rabbit_ct_broker_helpers:get_node_config(Config, 0, nodename),
PythonPath = os:getenv("PYTHONPATH"),
os:putenv("PYTHONPATH", Curdir ++ "/deps/pika/pika:"++ Curdir ++ "/deps/stomppy/stomppy:" ++ PythonPath),
os:putenv("PYTHONPATH", filename:join([DataDir, "deps", "pika","pika"])
++":"++
filename:join([DataDir, "deps", "stomppy", "stomppy"])
++ ":" ++
PythonPath),
os:putenv("AMQP_PORT", integer_to_list(AmqpPort)),
os:putenv("STOMP_PORT", integer_to_list(StompPort)),
os:putenv("STOMP_PORT_TLS", integer_to_list(StompPortTls)),
os:putenv("RABBITMQ_NODENAME", atom_to_list(NodeName)),
os:putenv("SSL_CERTS_PATH", CertsDir),
{ok, _} = rabbit_ct_helpers:exec([Curdir ++ Test]).
{ok, _} = rabbit_ct_helpers:exec([filename:join(DataDir, Test)]).
cur_dir() ->

View File

@ -14,22 +14,53 @@
%% Copyright (c) 2007-2016 Pivotal Software, Inc. All rights reserved.
%%
-module(rabbit_stomp_test_util).
-module(util_SUITE).
-include_lib("common_test/include/ct.hrl").
-include_lib("eunit/include/eunit.hrl").
-include_lib("amqp_client/include/amqp_client.hrl").
-include_lib("amqp_client/include/rabbit_routing_prefixes.hrl").
-include("rabbit_stomp_frame.hrl").
-compile(export_all).
all() -> [
longstr_field,
message_properties,
message_headers,
minimal_message_headers_with_no_custom,
headers_post_process,
headers_post_process_noop_replyto,
headers_post_process_noop2,
negotiate_version_both_empty,
negotiate_version_no_common,
negotiate_version_simple_common,
negotiate_version_two_choice_common,
negotiate_version_two_choice_common_out_of_order,
negotiate_version_two_choice_big_common,
negotiate_version_choice_mismatched_length,
negotiate_version_choice_duplicates,
trim_headers,
ack_mode_auto,
ack_mode_auto_default,
ack_mode_client,
ack_mode_client_individual,
consumer_tag_id,
consumer_tag_destination,
consumer_tag_invalid,
parse_valid_message_id,
parse_invalid_message_id
].
%%--------------------------------------------------------------------
%% Header Processing Tests
%%--------------------------------------------------------------------
longstr_field_test() ->
longstr_field(_) ->
{<<"ABC">>, longstr, <<"DEF">>} =
rabbit_stomp_util:longstr_field("ABC", "DEF").
message_properties_test() ->
message_properties(_) ->
Headers = [
{"content-type", "text/plain"},
{"content-encoding", "UTF-8"},
@ -65,7 +96,7 @@ message_properties_test() ->
} =
rabbit_stomp_util:message_properties(#stomp_frame{headers = Headers}).
message_headers_test() ->
message_headers(_) ->
Properties = #'P_basic'{
headers = [{<<"str">>, longstr, <<"foo">>},
{<<"int">>, signedint, 123}],
@ -102,13 +133,7 @@ message_headers_test() ->
[] = lists:subtract(Headers, Expected).
minimal_message_headers_with_no_custom_test() ->
Delivery = #'basic.deliver'{
consumer_tag = <<"Q_123">>,
delivery_tag = 123,
exchange = <<"">>,
routing_key = <<"foo">>},
minimal_message_headers_with_no_custom(_) ->
Properties = #'P_basic'{},
Headers = rabbit_stomp_util:message_headers(Properties),
@ -120,7 +145,7 @@ minimal_message_headers_with_no_custom_test() ->
[] = lists:subtract(Headers, Expected).
headers_post_process_test() ->
headers_post_process(_) ->
Headers = [{"header1", "1"},
{"header2", "12"},
{"reply-to", "something"}],
@ -130,13 +155,13 @@ headers_post_process_test() ->
[] = lists:subtract(
rabbit_stomp_util:headers_post_process(Headers), Expected).
headers_post_process_noop_replyto_test() ->
headers_post_process_noop_replyto(_) ->
[begin
Headers = [{"reply-to", Prefix ++ "/something"}],
Headers = rabbit_stomp_util:headers_post_process(Headers)
end || Prefix <- rabbit_routing_util:dest_prefixes()].
headers_post_process_noop2_test() ->
headers_post_process_noop2(_) ->
Headers = [{"header1", "1"},
{"header2", "12"}],
Expected = [{"header1", "1"},
@ -144,38 +169,38 @@ headers_post_process_noop2_test() ->
[] = lists:subtract(
rabbit_stomp_util:headers_post_process(Headers), Expected).
negotiate_version_both_empty_test() ->
negotiate_version_both_empty(_) ->
{error, no_common_version} = rabbit_stomp_util:negotiate_version([],[]).
negotiate_version_no_common_test() ->
negotiate_version_no_common(_) ->
{error, no_common_version} =
rabbit_stomp_util:negotiate_version(["1.2"],["1.3"]).
negotiate_version_simple_common_test() ->
negotiate_version_simple_common(_) ->
{ok, "1.2"} =
rabbit_stomp_util:negotiate_version(["1.2"],["1.2"]).
negotiate_version_two_choice_common_test() ->
negotiate_version_two_choice_common(_) ->
{ok, "1.3"} =
rabbit_stomp_util:negotiate_version(["1.2", "1.3"],["1.2", "1.3"]).
negotiate_version_two_choice_common_out_of_order_test() ->
negotiate_version_two_choice_common_out_of_order(_) ->
{ok, "1.3"} =
rabbit_stomp_util:negotiate_version(["1.3", "1.2"],["1.2", "1.3"]).
negotiate_version_two_choice_big_common_test() ->
negotiate_version_two_choice_big_common(_) ->
{ok, "1.20.23"} =
rabbit_stomp_util:negotiate_version(["1.20.23", "1.30.456"],
["1.20.23", "1.30.457"]).
negotiate_version_choice_mismatched_length_test() ->
negotiate_version_choice_mismatched_length(_) ->
{ok, "1.2.3"} =
rabbit_stomp_util:negotiate_version(["1.2", "1.2.3"],
["1.2.3", "1.2"]).
negotiate_version_choice_duplicates_test() ->
negotiate_version_choice_duplicates(_) ->
{ok, "1.2"} =
rabbit_stomp_util:negotiate_version(["1.2", "1.2"],
["1.2", "1.2"]).
trim_headers_test() ->
trim_headers(_) ->
#stomp_frame{headers = [{"one", "foo"}, {"two", "baz "}]} =
rabbit_stomp_util:trim_headers(
#stomp_frame{headers = [{"one", " foo"}, {"two", " baz "}]}).
@ -184,31 +209,31 @@ trim_headers_test() ->
%% Frame Parsing Tests
%%--------------------------------------------------------------------
ack_mode_auto_test() ->
ack_mode_auto(_) ->
Frame = #stomp_frame{headers = [{"ack", "auto"}]},
{auto, _} = rabbit_stomp_util:ack_mode(Frame).
ack_mode_auto_default_test() ->
ack_mode_auto_default(_) ->
Frame = #stomp_frame{headers = []},
{auto, _} = rabbit_stomp_util:ack_mode(Frame).
ack_mode_client_test() ->
ack_mode_client(_) ->
Frame = #stomp_frame{headers = [{"ack", "client"}]},
{client, true} = rabbit_stomp_util:ack_mode(Frame).
ack_mode_client_individual_test() ->
ack_mode_client_individual(_) ->
Frame = #stomp_frame{headers = [{"ack", "client-individual"}]},
{client, false} = rabbit_stomp_util:ack_mode(Frame).
consumer_tag_id_test() ->
consumer_tag_id(_) ->
Frame = #stomp_frame{headers = [{"id", "foo"}]},
{ok, <<"T_foo">>, _} = rabbit_stomp_util:consumer_tag(Frame).
consumer_tag_destination_test() ->
consumer_tag_destination(_) ->
Frame = #stomp_frame{headers = [{"destination", "foo"}]},
{ok, <<"Q_foo">>, _} = rabbit_stomp_util:consumer_tag(Frame).
consumer_tag_invalid_test() ->
consumer_tag_invalid(_) ->
Frame = #stomp_frame{headers = []},
{error, missing_destination_header} = rabbit_stomp_util:consumer_tag(Frame).
@ -216,11 +241,11 @@ consumer_tag_invalid_test() ->
%% Message ID Parsing Tests
%%--------------------------------------------------------------------
parse_valid_message_id_test() ->
parse_valid_message_id(_) ->
{ok, {<<"bar">>, "abc", 123}} =
rabbit_stomp_util:parse_message_id("bar@@abc@@123").
parse_invalid_message_id_test() ->
parse_invalid_message_id(_) ->
{error, invalid_message_id} =
rabbit_stomp_util:parse_message_id("blah").