|
|
@@ -251,6 +251,7 @@ start_app(App, SpecAppConfig, Opts) ->
|
|
|
{ok, _} ->
|
|
|
ok = ensure_dashboard_listeners_started(App),
|
|
|
ok = wait_for_app_processes(App),
|
|
|
+ ok = perform_sanity_checks(App),
|
|
|
ok;
|
|
|
{error, Reason} ->
|
|
|
error({failed_to_start_app, App, Reason})
|
|
|
@@ -264,6 +265,27 @@ wait_for_app_processes(emqx_conf) ->
|
|
|
wait_for_app_processes(_) ->
|
|
|
ok.
|
|
|
|
|
|
+%% These are checks to detect inter-suite or inter-testcase flakiness
|
|
|
+%% early. For example, one suite might forget one application running
|
|
|
+%% and stop others, and then the `application:start/2' callback is
|
|
|
+%% never called again for this application.
|
|
|
+perform_sanity_checks(emqx_rule_engine) ->
|
|
|
+ ensure_config_handler(emqx_rule_engine, [rule_engine, rules]),
|
|
|
+ ok;
|
|
|
+perform_sanity_checks(emqx_bridge) ->
|
|
|
+ ensure_config_handler(emqx_bridge, [bridges]),
|
|
|
+ ok;
|
|
|
+perform_sanity_checks(_App) ->
|
|
|
+ ok.
|
|
|
+
|
|
|
+ensure_config_handler(Module, ConfigPath) ->
|
|
|
+ #{handlers := Handlers} = sys:get_state(emqx_config_handler),
|
|
|
+ case emqx_utils_maps:deep_get(ConfigPath, Handlers, not_found) of
|
|
|
+ #{{mod} := Module} -> ok;
|
|
|
+ _NotFound -> error({config_handler_missing, ConfigPath, Module})
|
|
|
+ end,
|
|
|
+ ok.
|
|
|
+
|
|
|
app_conf_file(emqx_conf) -> "emqx.conf.all";
|
|
|
app_conf_file(App) -> atom_to_list(App) ++ ".conf".
|
|
|
|