Skip to content

Commit 37cb595

Browse files
authored
Merge pull request #14210 from cloudamqp/mqtt_processor_SUITE_no_mnesia
Minor: Don't use Mnesia in rabbitmq_mqtt/test/processor_SUITE
2 parents 6acc2b1 + 7d4ecb5 commit 37cb595

File tree

2 files changed

+83
-89
lines changed

2 files changed

+83
-89
lines changed

deps/rabbitmq_mqtt/src/rabbit_mqtt_processor.erl

Lines changed: 34 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1185,65 +1185,56 @@ get_vhost(UserBin, SslLogin, Port) ->
11851185
get_vhost_ssl(UserBin, SslLogin, Port).
11861186

11871187
get_vhost_no_ssl(UserBin, Port) ->
1188-
case vhost_in_username(UserBin) of
1189-
true ->
1190-
{vhost_in_username_or_default, get_vhost_username(UserBin)};
1191-
false ->
1192-
PortVirtualHostMapping = rabbit_runtime_parameters:value_global(
1193-
mqtt_port_to_vhost_mapping
1194-
),
1195-
case get_vhost_from_port_mapping(Port, PortVirtualHostMapping) of
1188+
case get_vhost_username(UserBin) of
1189+
undefined ->
1190+
case get_vhost_from_port_mapping(Port) of
11961191
undefined ->
1197-
{plugin_configuration_or_default_vhost, {rabbit_mqtt_util:env(vhost), UserBin}};
1198-
VHost ->
1199-
{port_to_vhost_mapping, {VHost, UserBin}}
1200-
end
1192+
VhostFromConfig = rabbit_mqtt_util:env(vhost),
1193+
{plugin_configuration_or_default_vhost, {VhostFromConfig, UserBin}};
1194+
VHostFromPortMapping ->
1195+
{port_to_vhost_mapping, {VHostFromPortMapping, UserBin}}
1196+
end;
1197+
VHostUser ->
1198+
{vhost_in_username, VHostUser}
12011199
end.
12021200

12031201
get_vhost_ssl(UserBin, SslLoginName, Port) ->
1204-
UserVirtualHostMapping = rabbit_runtime_parameters:value_global(
1205-
mqtt_default_vhosts
1206-
),
1207-
case get_vhost_from_user_mapping(SslLoginName, UserVirtualHostMapping) of
1202+
case get_vhost_from_user_mapping(SslLoginName) of
12081203
undefined ->
1209-
PortVirtualHostMapping = rabbit_runtime_parameters:value_global(
1210-
mqtt_port_to_vhost_mapping
1211-
),
1212-
case get_vhost_from_port_mapping(Port, PortVirtualHostMapping) of
1204+
case get_vhost_from_port_mapping(Port) of
12131205
undefined ->
1214-
{vhost_in_username_or_default, get_vhost_username(UserBin)};
1206+
case get_vhost_username(UserBin) of
1207+
undefined ->
1208+
VhostFromConfig = rabbit_mqtt_util:env(vhost),
1209+
{plugin_configuration_or_default_vhost, {VhostFromConfig, UserBin}};
1210+
VHostUser ->
1211+
{vhost_in_username, VHostUser}
1212+
end;
12151213
VHostFromPortMapping ->
12161214
{port_to_vhost_mapping, {VHostFromPortMapping, UserBin}}
12171215
end;
12181216
VHostFromCertMapping ->
12191217
{client_cert_to_vhost_mapping, {VHostFromCertMapping, UserBin}}
12201218
end.
12211219

1222-
vhost_in_username(UserBin) ->
1223-
case application:get_env(?APP_NAME, ignore_colons_in_username) of
1224-
{ok, true} -> false;
1225-
_ ->
1226-
%% split at the last colon, disallowing colons in username
1227-
case re:split(UserBin, ":(?!.*?:)") of
1228-
[_, _] -> true;
1229-
[UserBin] -> false;
1230-
[] -> false
1231-
end
1232-
end.
1233-
12341220
get_vhost_username(UserBin) ->
1235-
Default = {rabbit_mqtt_util:env(vhost), UserBin},
12361221
case application:get_env(?APP_NAME, ignore_colons_in_username) of
1237-
{ok, true} -> Default;
1222+
{ok, true} -> undefined;
12381223
_ ->
12391224
%% split at the last colon, disallowing colons in username
12401225
case re:split(UserBin, ":(?!.*?:)") of
12411226
[Vhost, UserName] -> {Vhost, UserName};
1242-
[UserBin] -> Default;
1243-
[] -> Default
1227+
[UserBin] -> undefined;
1228+
[] -> undefined
12441229
end
12451230
end.
12461231

1232+
get_vhost_from_user_mapping(User) ->
1233+
UserVirtualHostMapping = rabbit_runtime_parameters:value_global(
1234+
mqtt_default_vhosts
1235+
),
1236+
get_vhost_from_user_mapping(User, UserVirtualHostMapping).
1237+
12471238
get_vhost_from_user_mapping(_User, not_found) ->
12481239
undefined;
12491240
get_vhost_from_user_mapping(User, Mapping) ->
@@ -1255,6 +1246,12 @@ get_vhost_from_user_mapping(User, Mapping) ->
12551246
VHost
12561247
end.
12571248

1249+
get_vhost_from_port_mapping(Port) ->
1250+
PortVirtualHostMapping = rabbit_runtime_parameters:value_global(
1251+
mqtt_port_to_vhost_mapping
1252+
),
1253+
get_vhost_from_port_mapping(Port, PortVirtualHostMapping).
1254+
12581255
get_vhost_from_port_mapping(_Port, not_found) ->
12591256
undefined;
12601257
get_vhost_from_port_mapping(Port, Mapping) ->

deps/rabbitmq_mqtt/test/processor_SUITE.erl

Lines changed: 49 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -31,38 +31,27 @@ suite() ->
3131

3232
init_per_suite(Config) ->
3333
ok = application:load(rabbitmq_mqtt),
34+
meck:new(rabbit_runtime_parameters, [passthrough, no_link]),
3435
Config.
3536
end_per_suite(Config) ->
3637
ok = application:unload(rabbitmq_mqtt),
38+
meck:unload(rabbit_runtime_parameters),
3739
Config.
3840
init_per_group(_, Config) -> Config.
3941
end_per_group(_, Config) -> Config.
40-
init_per_testcase(get_vhost, Config) ->
41-
mnesia:start(),
42-
mnesia:create_table(rabbit_runtime_parameters, [
43-
{attributes, record_info(fields, runtime_parameters)},
44-
{record_name, runtime_parameters}]),
45-
meck:new(rabbit_feature_flags, [passthrough, no_link]),
46-
meck:expect(
47-
rabbit_feature_flags, is_enabled,
48-
fun
49-
(khepri_db, _) -> false;
50-
(FeatureNames, _) -> meck:passthrough([FeatureNames])
51-
end),
52-
Config;
5342
init_per_testcase(_, Config) -> Config.
54-
end_per_testcase(get_vhost, Config) ->
55-
meck:unload(rabbit_feature_flags),
56-
mnesia:stop(),
57-
Config;
5843
end_per_testcase(_, Config) -> Config.
5944

6045
ignore_colons(B) -> application:set_env(rabbitmq_mqtt, ignore_colons_in_username, B).
6146

6247
ignores_colons_in_username_if_option_set(_Config) ->
63-
ignore_colons(true),
64-
?assertEqual({rabbit_mqtt_util:env(vhost), <<"a:b:c">>},
65-
rabbit_mqtt_processor:get_vhost_username(<<"a:b:c">>)).
48+
clear_vhost_global_parameters(),
49+
ignore_colons(true),
50+
?assertEqual(undefined,
51+
rabbit_mqtt_processor:get_vhost_username(<<"a:b:c">>)),
52+
?assertEqual({plugin_configuration_or_default_vhost,
53+
{rabbit_mqtt_util:env(vhost), <<"a:b:c">>}},
54+
rabbit_mqtt_processor:get_vhost(<<"a:b:c">>, none, 1883)).
6655

6756
interprets_colons_in_username_if_option_not_set(_Config) ->
6857
ignore_colons(false),
@@ -150,26 +139,32 @@ get_vhost(_Config) ->
150139

151140
%% certificate user, port/vhost parameter but no mapping, cert/vhost mapping
152141
%% should use cert/vhost mapping
153-
set_global_parameter(mqtt_default_vhosts, [
154-
{<<"O=client,CN=dummy">>, <<"somevhost">>},
155-
{<<"O=client,CN=otheruser">>, <<"othervhost">>}
156-
]),
157-
set_global_parameter(mqtt_port_to_vhost_mapping, [
158-
{<<"1884">>, <<"othervhost">>}
159-
]),
142+
set_global_parameters(
143+
[{mqtt_default_vhosts,
144+
[
145+
{<<"O=client,CN=dummy">>, <<"somevhost">>},
146+
{<<"O=client,CN=otheruser">>, <<"othervhost">>}
147+
]},
148+
{mqtt_port_to_vhost_mapping,
149+
[
150+
{<<"1884">>, <<"othervhost">>}
151+
]}]),
160152
{_, {<<"somevhost">>, <<"guest">>}} = rabbit_mqtt_processor:get_vhost(<<"guest">>, <<"O=client,CN=dummy">>, 1883),
161153
clear_vhost_global_parameters(),
162154

163155
%% certificate user, port/vhost parameter, cert/vhost parameter
164156
%% cert/vhost parameter takes precedence
165-
set_global_parameter(mqtt_default_vhosts, [
166-
{<<"O=client,CN=dummy">>, <<"cert-somevhost">>},
167-
{<<"O=client,CN=otheruser">>, <<"othervhost">>}
168-
]),
169-
set_global_parameter(mqtt_port_to_vhost_mapping, [
170-
{<<"1883">>, <<"port-vhost">>},
171-
{<<"1884">>, <<"othervhost">>}
172-
]),
157+
set_global_parameters(
158+
[{mqtt_default_vhosts,
159+
[
160+
{<<"O=client,CN=dummy">>, <<"cert-somevhost">>},
161+
{<<"O=client,CN=otheruser">>, <<"othervhost">>}
162+
]},
163+
{mqtt_port_to_vhost_mapping,
164+
[
165+
{<<"1883">>, <<"port-vhost">>},
166+
{<<"1884">>, <<"othervhost">>}
167+
]}]),
173168
{_, {<<"cert-somevhost">>, <<"guest">>}} = rabbit_mqtt_processor:get_vhost(<<"guest">>, <<"O=client,CN=dummy">>, 1883),
174169
clear_vhost_global_parameters(),
175170

@@ -179,28 +174,30 @@ get_vhost(_Config) ->
179174

180175
%% not a certificate user, port/vhost parameter, cert/vhost parameter
181176
%% port/vhost mapping is used, as cert/vhost should not be used
182-
set_global_parameter(mqtt_default_vhosts, [
183-
{<<"O=cert">>, <<"cert-somevhost">>},
184-
{<<"O=client,CN=otheruser">>, <<"othervhost">>}
185-
]),
186-
set_global_parameter(mqtt_port_to_vhost_mapping, [
187-
{<<"1883">>, <<"port-vhost">>},
188-
{<<"1884">>, <<"othervhost">>}
189-
]),
177+
set_global_parameters(
178+
[{mqtt_default_vhosts,
179+
[
180+
{<<"O=cert">>, <<"cert-somevhost">>},
181+
{<<"O=client,CN=otheruser">>, <<"othervhost">>}
182+
]},
183+
{mqtt_port_to_vhost_mapping,
184+
[
185+
{<<"1883">>, <<"port-vhost">>},
186+
{<<"1884">>, <<"othervhost">>}
187+
]}]),
190188
{_, {<<"port-vhost">>, <<"guest">>}} = rabbit_mqtt_processor:get_vhost(<<"guest">>, none, 1883),
191189
clear_vhost_global_parameters(),
192190
ok.
193191

194192
set_global_parameter(Key, Term) ->
195-
InsertParameterFun = fun () ->
196-
mnesia:write(rabbit_runtime_parameters, #runtime_parameters{key = Key, value = Term}, write)
197-
end,
193+
set_global_parameters([{Key, Term}]).
198194

199-
{atomic, ok} = mnesia:transaction(InsertParameterFun).
195+
set_global_parameters(KVList) ->
196+
meck:expect(
197+
rabbit_runtime_parameters, value_global,
198+
fun(Key) -> proplists:get_value(Key, KVList, not_found) end).
200199

201200
clear_vhost_global_parameters() ->
202-
DeleteParameterFun = fun () ->
203-
ok = mnesia:delete(rabbit_runtime_parameters, mqtt_default_vhosts, write),
204-
ok = mnesia:delete(rabbit_runtime_parameters, mqtt_port_to_vhost_mapping, write)
205-
end,
206-
{atomic, ok} = mnesia:transaction(DeleteParameterFun).
201+
meck:expect(
202+
rabbit_runtime_parameters, value_global,
203+
fun(_) -> not_found end).

0 commit comments

Comments
 (0)