diff options
Diffstat (limited to 'deps/rabbitmq_mqtt/test/processor_SUITE.erl')
-rw-r--r-- | deps/rabbitmq_mqtt/test/processor_SUITE.erl | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/deps/rabbitmq_mqtt/test/processor_SUITE.erl b/deps/rabbitmq_mqtt/test/processor_SUITE.erl new file mode 100644 index 0000000000..e38a1d5318 --- /dev/null +++ b/deps/rabbitmq_mqtt/test/processor_SUITE.erl @@ -0,0 +1,211 @@ +%% 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) 2007-2020 VMware, Inc. or its affiliates. All rights reserved. + + +-module(processor_SUITE). +-compile([export_all]). + +-include_lib("common_test/include/ct.hrl"). +-include_lib("eunit/include/eunit.hrl"). +-include_lib("amqp_client/include/amqp_client.hrl"). + +all() -> + [ + {group, non_parallel_tests} + ]. + +groups() -> + [ + {non_parallel_tests, [], [ + ignores_colons_in_username_if_option_set, + interprets_colons_in_username_if_option_not_set, + get_vhosts_from_global_runtime_parameter, + get_vhost, + add_client_id_to_adapter_info + ]} + ]. + +suite() -> + [{timetrap, {seconds, 60}}]. + +init_per_suite(Config) -> + ok = application:load(rabbitmq_mqtt), + Config. +end_per_suite(Config) -> + ok = application:unload(rabbitmq_mqtt), + Config. +init_per_group(_, Config) -> Config. +end_per_group(_, Config) -> Config. +init_per_testcase(get_vhost, Config) -> + mnesia:start(), + mnesia:create_table(rabbit_runtime_parameters, [ + {attributes, record_info(fields, runtime_parameters)}, + {record_name, runtime_parameters}]), + Config; +init_per_testcase(_, Config) -> Config. +end_per_testcase(get_vhost, Config) -> + mnesia:stop(), + Config; +end_per_testcase(_, Config) -> Config. + +ignore_colons(B) -> application:set_env(rabbitmq_mqtt, ignore_colons_in_username, B). + +ignores_colons_in_username_if_option_set(_Config) -> + ignore_colons(true), + ?assertEqual({rabbit_mqtt_util:env(vhost), <<"a:b:c">>}, + rabbit_mqtt_processor:get_vhost_username(<<"a:b:c">>)). + +interprets_colons_in_username_if_option_not_set(_Config) -> + ignore_colons(false), + ?assertEqual({<<"a:b">>, <<"c">>}, + rabbit_mqtt_processor:get_vhost_username(<<"a:b:c">>)). + +get_vhosts_from_global_runtime_parameter(_Config) -> + MappingParameter = [ + {<<"O=client,CN=dummy1">>, <<"vhost1">>}, + {<<"O=client,CN=dummy2">>, <<"vhost2">>} + ], + <<"vhost1">> = rabbit_mqtt_processor:get_vhost_from_user_mapping(<<"O=client,CN=dummy1">>, MappingParameter), + <<"vhost2">> = rabbit_mqtt_processor:get_vhost_from_user_mapping(<<"O=client,CN=dummy2">>, MappingParameter), + undefined = rabbit_mqtt_processor:get_vhost_from_user_mapping(<<"O=client,CN=dummy3">>, MappingParameter), + undefined = rabbit_mqtt_processor:get_vhost_from_user_mapping(<<"O=client,CN=dummy3">>, not_found). + +get_vhost(_Config) -> + clear_vhost_global_parameters(), + + %% not a certificate user, no cert/vhost mapping, no vhost in user + %% should use default vhost + {_, {<<"/">>, <<"guest">>}} = rabbit_mqtt_processor:get_vhost(<<"guest">>, none, 1883), + {_, {<<"/">>, <<"guest">>}} = rabbit_mqtt_processor:get_vhost(<<"guest">>, undefined, 1883), + clear_vhost_global_parameters(), + + %% not a certificate user, no cert/vhost mapping, vhost in user + %% should use vhost in user + {_, {<<"somevhost">>, <<"guest">>}} = rabbit_mqtt_processor:get_vhost(<<"somevhost:guest">>, none, 1883), + clear_vhost_global_parameters(), + + %% certificate user, no cert/vhost mapping + %% should use default vhost + {_, {<<"/">>, <<"guest">>}} = rabbit_mqtt_processor:get_vhost(<<"guest">>, <<"O=client,CN=dummy">>, 1883), + clear_vhost_global_parameters(), + + %% certificate user, cert/vhost mapping with global runtime parameter + %% should use mapping + set_global_parameter(mqtt_default_vhosts, [ + {<<"O=client,CN=dummy">>, <<"somevhost">>}, + {<<"O=client,CN=otheruser">>, <<"othervhost">>} + ]), + {_, {<<"somevhost">>, <<"guest">>}} = rabbit_mqtt_processor:get_vhost(<<"guest">>, <<"O=client,CN=dummy">>, 1883), + clear_vhost_global_parameters(), + + %% certificate user, cert/vhost mapping with global runtime parameter, but no key for the user + %% should use default vhost + set_global_parameter(mqtt_default_vhosts, [{<<"O=client,CN=otheruser">>, <<"somevhost">>}]), + {_, {<<"/">>, <<"guest">>}} = rabbit_mqtt_processor:get_vhost(<<"guest">>, <<"O=client,CN=dummy">>, 1883), + clear_vhost_global_parameters(), + + %% not a certificate user, port/vhost mapping + %% should use mapping + set_global_parameter(mqtt_port_to_vhost_mapping, [ + {<<"1883">>, <<"somevhost">>}, + {<<"1884">>, <<"othervhost">>} + ]), + {_, {<<"somevhost">>, <<"guest">>}} = rabbit_mqtt_processor:get_vhost(<<"guest">>, none, 1883), + clear_vhost_global_parameters(), + + %% not a certificate user, port/vhost mapping, but vhost in username + %% vhost in username should take precedence + set_global_parameter(mqtt_port_to_vhost_mapping, [ + {<<"1883">>, <<"somevhost">>}, + {<<"1884">>, <<"othervhost">>} + ]), + {_, {<<"vhostinusername">>, <<"guest">>}} = rabbit_mqtt_processor:get_vhost(<<"vhostinusername:guest">>, none, 1883), + clear_vhost_global_parameters(), + + %% not a certificate user, port/vhost mapping, but no mapping for this port + %% should use default vhost + set_global_parameter(mqtt_port_to_vhost_mapping, [ + {<<"1884">>, <<"othervhost">>} + ]), + {_, {<<"/">>, <<"guest">>}} = rabbit_mqtt_processor:get_vhost(<<"guest">>, none, 1883), + clear_vhost_global_parameters(), + + %% certificate user, port/vhost parameter, mapping, no cert/vhost mapping + %% should use port/vhost mapping + set_global_parameter(mqtt_port_to_vhost_mapping, [ + {<<"1883">>, <<"somevhost">>}, + {<<"1884">>, <<"othervhost">>} + ]), + {_, {<<"somevhost">>, <<"guest">>}} = rabbit_mqtt_processor:get_vhost(<<"guest">>, <<"O=client,CN=dummy">>, 1883), + clear_vhost_global_parameters(), + + %% certificate user, port/vhost parameter but no mapping, cert/vhost mapping + %% should use cert/vhost mapping + set_global_parameter(mqtt_default_vhosts, [ + {<<"O=client,CN=dummy">>, <<"somevhost">>}, + {<<"O=client,CN=otheruser">>, <<"othervhost">>} + ]), + set_global_parameter(mqtt_port_to_vhost_mapping, [ + {<<"1884">>, <<"othervhost">>} + ]), + {_, {<<"somevhost">>, <<"guest">>}} = rabbit_mqtt_processor:get_vhost(<<"guest">>, <<"O=client,CN=dummy">>, 1883), + clear_vhost_global_parameters(), + + %% certificate user, port/vhost parameter, cert/vhost parameter + %% cert/vhost parameter takes precedence + set_global_parameter(mqtt_default_vhosts, [ + {<<"O=client,CN=dummy">>, <<"cert-somevhost">>}, + {<<"O=client,CN=otheruser">>, <<"othervhost">>} + ]), + set_global_parameter(mqtt_port_to_vhost_mapping, [ + {<<"1883">>, <<"port-vhost">>}, + {<<"1884">>, <<"othervhost">>} + ]), + {_, {<<"cert-somevhost">>, <<"guest">>}} = rabbit_mqtt_processor:get_vhost(<<"guest">>, <<"O=client,CN=dummy">>, 1883), + clear_vhost_global_parameters(), + + %% certificate user, no port/vhost or cert/vhost mapping, vhost in username + %% should use vhost in username + {_, {<<"vhostinusername">>, <<"guest">>}} = rabbit_mqtt_processor:get_vhost(<<"vhostinusername:guest">>, <<"O=client,CN=dummy">>, 1883), + + %% not a certificate user, port/vhost parameter, cert/vhost parameter + %% port/vhost mapping is used, as cert/vhost should not be used + set_global_parameter(mqtt_default_vhosts, [ + {<<"O=cert">>, <<"cert-somevhost">>}, + {<<"O=client,CN=otheruser">>, <<"othervhost">>} + ]), + set_global_parameter(mqtt_port_to_vhost_mapping, [ + {<<"1883">>, <<"port-vhost">>}, + {<<"1884">>, <<"othervhost">>} + ]), + {_, {<<"port-vhost">>, <<"guest">>}} = rabbit_mqtt_processor:get_vhost(<<"guest">>, none, 1883), + clear_vhost_global_parameters(), + ok. + +add_client_id_to_adapter_info(_Config) -> + TestFun = fun(AdapterInfo) -> + Info0 = rabbit_mqtt_processor:add_client_id_to_adapter_info(<<"my-client-id">>, AdapterInfo), + AdditionalInfo0 = Info0#amqp_adapter_info.additional_info, + ?assertEqual(#{<<"client_id">> => <<"my-client-id">>}, proplists:get_value(variable_map, AdditionalInfo0)), + ClientProperties = proplists:get_value(client_properties, AdditionalInfo0), + ?assertEqual([{client_id,longstr,<<"my-client-id">>}], ClientProperties) + end, + lists:foreach(TestFun, [#amqp_adapter_info{}, #amqp_adapter_info{additional_info = [{client_properties, []}]}]), + ok. + +set_global_parameter(Key, Term) -> + InsertParameterFun = fun () -> + mnesia:write(rabbit_runtime_parameters, #runtime_parameters{key = Key, value = Term}, write) + end, + + {atomic, ok} = mnesia:transaction(InsertParameterFun). + +clear_vhost_global_parameters() -> + DeleteParameterFun = fun () -> + ok = mnesia:delete(rabbit_runtime_parameters, mqtt_default_vhosts, write), + ok = mnesia:delete(rabbit_runtime_parameters, mqtt_port_to_vhost_mapping, write) + end, + {atomic, ok} = mnesia:transaction(DeleteParameterFun). |