Feng Lee пре 10 година
родитељ
комит
5695ba178c
2 измењених фајлова са 95 додато и 7 уклоњено
  1. 19 5
      src/emqttd_ctl.erl
  2. 76 2
      test/emqttd_SUITE.erl

+ 19 - 5
src/emqttd_ctl.erl

@@ -25,7 +25,8 @@
 -define(SERVER, ?MODULE).
 
 %% API Function Exports
--export([start_link/0, register_cmd/3, unregister_cmd/1, run/1]).
+-export([start_link/0, register_cmd/2, register_cmd/3, unregister_cmd/1,
+         lookup/1, run/1]).
 
 %% gen_server Function Exports
 -export([init/1, handle_call/3, handle_cast/2, handle_info/2,
@@ -43,6 +44,11 @@ start_link() ->
     gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).
 
 %% @doc Register a command
+-spec register_cmd(atom(), {module(), atom()}) -> ok.
+register_cmd(Cmd, MF) ->
+    register_cmd(Cmd, MF, []).
+
+%% @doc Register a command with opts
 -spec register_cmd(atom(), {module(), atom()}, list()) -> ok.
 register_cmd(Cmd, MF, Opts) ->
     cast({register_cmd, Cmd, MF, Opts}).
@@ -55,17 +61,25 @@ unregister_cmd(Cmd) ->
 cast(Msg) -> gen_server:cast(?SERVER, Msg).
 
 %% @doc Run a command
+-spec run([string()]) -> any().
 run([]) -> usage();
 
 run(["help"]) -> usage();
 
 run([CmdS|Args]) ->
-    Cmd = list_to_atom(CmdS),
-    case ets:match(?CMD_TAB, {{'_', Cmd}, '$1', '_'}) of
-        [[{Mod, Fun}]] -> Mod:Fun(Args);
+    case lookup(list_to_atom(CmdS)) of
+        [{Mod, Fun}] -> Mod:Fun(Args);
         [] -> usage() 
     end.
-    
+
+%% @doc Lookup a command
+-spec lookup(atom()) -> [{module(), atom()}].
+lookup(Cmd) ->
+    case ets:match(?CMD_TAB, {{'_', Cmd}, '$1', '_'}) of
+        [El] -> El;
+        []   -> []
+    end.
+
 %% @doc Usage
 usage() ->
     ?PRINT("Usage: ~s~n", [?MODULE]),

+ 76 - 2
test/emqttd_SUITE.erl

@@ -27,7 +27,8 @@ all() ->
      {group, retainer},
      {group, broker},
      {group, metrics},
-     {group, stats}].
+     {group, stats},
+     {group, cli}].
 
 groups() ->
     [{pubsub, [sequence],
@@ -48,7 +49,18 @@ groups() ->
      {metrics, [sequence],
       [inc_dec_metric]},
      {stats, [sequence],
-      [set_get_stat]}].
+      [set_get_stat]},
+     {cli, [sequence],
+      [ctl_register_cmd,
+       cli_status,
+       cli_broker,
+       cli_clients,
+       cli_sessions,
+       cli_topics,
+       cli_subscriptions,
+       cli_bridges,
+       cli_plugins,
+       cli_listeners]}].
 
 init_per_suite(Config) ->
     application:start(lager),
@@ -212,3 +224,65 @@ inc_dec_metric(_) ->
 set_get_stat(_) ->
     emqttd_stats:setstat('retained/max', 99),
     99 = emqttd_stats:getstat('retained/max').
+
+%%--------------------------------------------------------------------
+%% CLI Group
+%%--------------------------------------------------------------------
+
+ctl_register_cmd(_) ->
+    emqttd_ctl:register_cmd(test_cmd, {?MODULE, test_cmd}),
+    erlang:yield(),
+    timer:sleep(5),
+    [{?MODULE, test_cmd}] = emqttd_ctl:lookup(test_cmd),
+    emqttd_ctl:run(["test_cmd", "arg1", "arg2"]),
+    emqttd_ctl:unregister_cmd(test_cmd).
+
+test_cmd(["arg1", "arg2"]) ->
+    ct:print("test_cmd is called");
+
+test_cmd([]) ->
+    io:format("test command").
+
+cli_status(_) ->
+    emqttd_cli:status([]).
+
+cli_broker(_) ->
+    emqttd_cli:broker([]),
+    emqttd_cli:broker(["stats"]),
+    emqttd_cli:broker(["metrics"]),
+    emqttd_cli:broker(["pubsub"]).
+
+cli_clients(_) ->
+    emqttd_cli:clients(["list"]),
+    emqttd_cli:clients(["show", "clientId"]),
+    emqttd_cli:clients(["kick", "clientId"]).
+
+cli_sessions(_) ->
+    emqttd_cli:sessions(["list"]),
+    emqttd_cli:sessions(["list", "persistent"]),
+    emqttd_cli:sessions(["list", "transient"]),
+    emqttd_cli:sessions(["show", "clientId"]).
+
+cli_topics(_) ->
+    emqttd_cli:topics(["list"]),
+    emqttd_cli:topics(["show", "topic"]).
+
+cli_subscriptions(_) ->
+    emqttd_cli:subscriptions(["list"]),
+    emqttd_cli:subscriptions(["show", "clientId"]),
+    emqttd_cli:subscriptions(["add", "clientId", "topic", "2"]),
+    emqttd_cli:subscriptions(["del", "clientId", "topic"]).
+
+cli_plugins(_) ->
+    emqttd_cli:plugins(["list"]),
+    emqttd_cli:plugins(["load", "emqttd_plugin_template"]),
+    emqttd_cli:plugins(["unload", "emqttd_plugin_template"]).
+
+cli_bridges(_) ->
+    emqttd_cli:bridges(["list"]),
+    emqttd_cli:bridges(["start", "a@127.0.0.1", "topic"]),
+    emqttd_cli:bridges(["stop", "a@127.0.0.1", "topic"]).
+
+cli_listeners(_) ->
+    emqttd_cli:listeners([]).
+