|
|
@@ -10,14 +10,7 @@
|
|
|
-include_lib("eunit/include/eunit.hrl").
|
|
|
-include_lib("common_test/include/ct.hrl").
|
|
|
|
|
|
--import(
|
|
|
- emqx_mgmt_api_test_util,
|
|
|
- [
|
|
|
- request_api/2,
|
|
|
- request/3,
|
|
|
- uri/1
|
|
|
- ]
|
|
|
-).
|
|
|
+-import(emqx_mgmt_api_test_util, [uri/1]).
|
|
|
|
|
|
all() ->
|
|
|
emqx_common_test_helpers:all(?MODULE).
|
|
|
@@ -33,10 +26,12 @@ init_per_suite(Config) ->
|
|
|
},
|
|
|
<<"durable_storage">> => #{
|
|
|
<<"messages">> => #{
|
|
|
- <<"backend">> => <<"builtin_raft">>
|
|
|
+ <<"backend">> => <<"builtin_raft">>,
|
|
|
+ <<"n_shards">> => 4
|
|
|
},
|
|
|
<<"queues">> => #{
|
|
|
- <<"backend">> => <<"builtin_raft">>
|
|
|
+ <<"backend">> => <<"builtin_raft">>,
|
|
|
+ <<"n_shards">> => 4
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -67,6 +62,7 @@ init_per_testcase(_TC, Config) ->
|
|
|
end_per_testcase(_TC, _Config) ->
|
|
|
ok = snabbkaffe:stop(),
|
|
|
ok = emqx_ds_shared_sub_registry:purge(),
|
|
|
+ ok = destroy_queues(),
|
|
|
ok.
|
|
|
%%--------------------------------------------------------------------
|
|
|
%% Tests
|
|
|
@@ -74,7 +70,7 @@ end_per_testcase(_TC, _Config) ->
|
|
|
|
|
|
t_basic_crud(_Config) ->
|
|
|
?assertMatch(
|
|
|
- {ok, []},
|
|
|
+ {ok, #{<<"data">> := []}},
|
|
|
api_get(["durable_queues"])
|
|
|
),
|
|
|
|
|
|
@@ -126,7 +122,7 @@ t_basic_crud(_Config) ->
|
|
|
|
|
|
{ok, 201, #{<<"id">> := QueueID2}} = Resp2,
|
|
|
?assertMatch(
|
|
|
- {ok, [#{<<"id">> := QueueID1}, #{<<"id">> := QueueID2}]},
|
|
|
+ {ok, #{<<"data">> := [#{<<"id">> := QueueID1}, #{<<"id">> := QueueID2}]}},
|
|
|
api_get(["durable_queues"])
|
|
|
),
|
|
|
|
|
|
@@ -140,10 +136,90 @@ t_basic_crud(_Config) ->
|
|
|
),
|
|
|
|
|
|
?assertMatch(
|
|
|
- {ok, [#{<<"id">> := QueueID2}]},
|
|
|
+ {ok, #{<<"data">> := [#{<<"id">> := QueueID2}]}},
|
|
|
api_get(["durable_queues"])
|
|
|
).
|
|
|
|
|
|
+t_list_queues(_Config) ->
|
|
|
+ {ok, 201, #{<<"id">> := QID1}} = api(post, ["durable_queues"], #{
|
|
|
+ <<"group">> => <<"glq1">>,
|
|
|
+ <<"topic">> => <<"#">>,
|
|
|
+ <<"start_time">> => 42
|
|
|
+ }),
|
|
|
+ {ok, 201, #{<<"id">> := QID2}} = api(post, ["durable_queues"], #{
|
|
|
+ <<"group">> => <<"glq2">>,
|
|
|
+ <<"topic">> => <<"specific/topic">>,
|
|
|
+ <<"start_time">> => 0
|
|
|
+ }),
|
|
|
+ {ok, 201, #{<<"id">> := QID3}} = api(post, ["durable_queues"], #{
|
|
|
+ <<"group">> => <<"glq3">>,
|
|
|
+ <<"topic">> => <<"1/2/3/+">>,
|
|
|
+ <<"start_time">> => emqx_message:timestamp_now()
|
|
|
+ }),
|
|
|
+ {ok, 201, #{<<"id">> := QID4}} = api(post, ["durable_queues"], #{
|
|
|
+ <<"group">> => <<"glq4">>,
|
|
|
+ <<"topic">> => <<"4/5/6/#">>,
|
|
|
+ <<"start_time">> => emqx_message:timestamp_now()
|
|
|
+ }),
|
|
|
+
|
|
|
+ {ok, Resp} = api_get(["durable_queues"]),
|
|
|
+ ?assertMatch(
|
|
|
+ #{
|
|
|
+ <<"data">> := [#{}, #{}, #{}, #{}],
|
|
|
+ <<"meta">> := #{<<"hasnext">> := false}
|
|
|
+ },
|
|
|
+ Resp
|
|
|
+ ),
|
|
|
+
|
|
|
+ {ok, Resp1} = api_get(["durable_queues"], #{limit => <<"1">>}),
|
|
|
+ ?assertMatch(
|
|
|
+ #{
|
|
|
+ <<"data">> := [#{}],
|
|
|
+ <<"meta">> := #{<<"hasnext">> := true, <<"cursor">> := _}
|
|
|
+ },
|
|
|
+ Resp1
|
|
|
+ ),
|
|
|
+
|
|
|
+ {ok, Resp2} = api_get(["durable_queues"], #{
|
|
|
+ limit => <<"1">>,
|
|
|
+ cursor => emqx_utils_maps:deep_get([<<"meta">>, <<"cursor">>], Resp1)
|
|
|
+ }),
|
|
|
+ ?assertMatch(
|
|
|
+ #{
|
|
|
+ <<"data">> := [#{}],
|
|
|
+ <<"meta">> := #{<<"hasnext">> := true, <<"cursor">> := _}
|
|
|
+ },
|
|
|
+ Resp2
|
|
|
+ ),
|
|
|
+
|
|
|
+ {ok, Resp3} = api_get(["durable_queues"], #{
|
|
|
+ limit => <<"2">>,
|
|
|
+ cursor => emqx_utils_maps:deep_get([<<"meta">>, <<"cursor">>], Resp2)
|
|
|
+ }),
|
|
|
+ ?assertMatch(
|
|
|
+ #{
|
|
|
+ <<"data">> := [#{}, #{}],
|
|
|
+ <<"meta">> := #{<<"hasnext">> := false}
|
|
|
+ },
|
|
|
+ Resp3
|
|
|
+ ),
|
|
|
+
|
|
|
+ Data = maps:get(<<"data">>, Resp),
|
|
|
+ ?assertEqual(
|
|
|
+ [QID1, QID2, QID3, QID4],
|
|
|
+ lists:sort([ID || #{<<"id">> := ID} <- Data]),
|
|
|
+ Resp
|
|
|
+ ),
|
|
|
+
|
|
|
+ Data1 = maps:get(<<"data">>, Resp1),
|
|
|
+ Data2 = maps:get(<<"data">>, Resp2),
|
|
|
+ Data3 = maps:get(<<"data">>, Resp3),
|
|
|
+ ?assertEqual(
|
|
|
+ [QID1, QID2, QID3, QID4],
|
|
|
+ lists:sort([ID || D <- [Data1, Data2, Data3], #{<<"id">> := ID} <- D]),
|
|
|
+ [Resp1, Resp2, Resp3]
|
|
|
+ ).
|
|
|
+
|
|
|
t_duplicate_queue(_Config) ->
|
|
|
?assertMatch(
|
|
|
{ok, 201, #{
|
|
|
@@ -168,20 +244,36 @@ t_duplicate_queue(_Config) ->
|
|
|
})
|
|
|
).
|
|
|
|
|
|
+%%--------------------------------------------------------------------
|
|
|
+
|
|
|
+destroy_queues() ->
|
|
|
+ case api_get(["durable_queues"], #{limit => <<"100">>}) of
|
|
|
+ {ok, #{<<"data">> := Queues}} ->
|
|
|
+ lists:foreach(fun destroy_queue/1, Queues);
|
|
|
+ Error ->
|
|
|
+ Error
|
|
|
+ end.
|
|
|
+
|
|
|
+destroy_queue(#{<<"id">> := QueueID}) ->
|
|
|
+ {ok, 200, _Deleted} = api(delete, ["durable_queues", QueueID], #{}).
|
|
|
+
|
|
|
%%--------------------------------------------------------------------
|
|
|
%% Helpers
|
|
|
%%--------------------------------------------------------------------
|
|
|
|
|
|
api_get(Path) ->
|
|
|
- case request_api(get, uri(Path)) of
|
|
|
- {ok, ResponseBody} ->
|
|
|
- {ok, jiffy:decode(list_to_binary(ResponseBody), [return_maps])};
|
|
|
- {error, _} = Error ->
|
|
|
- Error
|
|
|
- end.
|
|
|
+ api_response(emqx_mgmt_api_test_util:request_api(get, uri(Path))).
|
|
|
+
|
|
|
+api_get(Path, Query) ->
|
|
|
+ api_response(emqx_mgmt_api_test_util:request_api(get, uri(Path), Query, [])).
|
|
|
+
|
|
|
+api_response({ok, ResponseBody}) ->
|
|
|
+ {ok, jiffy:decode(iolist_to_binary(ResponseBody), [return_maps])};
|
|
|
+api_response({error, _} = Error) ->
|
|
|
+ Error.
|
|
|
|
|
|
api(Method, Path, Data) ->
|
|
|
- case request(Method, uri(Path), Data) of
|
|
|
+ case emqx_mgmt_api_test_util:request(Method, uri(Path), Data) of
|
|
|
{ok, Code, ResponseBody} ->
|
|
|
Res =
|
|
|
case emqx_utils_json:safe_decode(ResponseBody, [return_maps]) of
|