From eb62192838768458e85cef38c348eb23d7684ce8 Mon Sep 17 00:00:00 2001 From: Erik Timan Date: Mon, 28 Nov 2022 13:45:52 +0100 Subject: [PATCH] test: expand EE mysql bridge test with toxiproxy --- .../docker-compose-toxiproxy.yaml | 2 + .ci/docker-compose-file/toxiproxy.json | 12 +++ lib-ee/emqx_ee_bridge/docker-ct | 1 + .../test/emqx_ee_bridge_mysql_SUITE.erl | 81 ++++++++++++++----- scripts/ct/run.sh | 6 +- 5 files changed, 78 insertions(+), 24 deletions(-) diff --git a/.ci/docker-compose-file/docker-compose-toxiproxy.yaml b/.ci/docker-compose-file/docker-compose-toxiproxy.yaml index 924c9e6ae..66e7ec308 100644 --- a/.ci/docker-compose-file/docker-compose-toxiproxy.yaml +++ b/.ci/docker-compose-file/docker-compose-toxiproxy.yaml @@ -13,6 +13,8 @@ services: - 8474:8474 - 8086:8086 - 8087:8087 + - 13306:3306 + - 13307:3307 command: - "-host=0.0.0.0" - "-config=/config/toxiproxy.json" diff --git a/.ci/docker-compose-file/toxiproxy.json b/.ci/docker-compose-file/toxiproxy.json index 176b35d36..2d3a30b6b 100644 --- a/.ci/docker-compose-file/toxiproxy.json +++ b/.ci/docker-compose-file/toxiproxy.json @@ -10,5 +10,17 @@ "listen": "0.0.0.0:8087", "upstream": "influxdb_tls:8086", "enabled": true + }, + { + "name": "mysql_tcp", + "listen": "0.0.0.0:3306", + "upstream": "mysql:3306", + "enabled": true + }, + { + "name": "mysql_tls", + "listen": "0.0.0.0:3307", + "upstream": "mysql-tls:3306", + "enabled": true } ] diff --git a/lib-ee/emqx_ee_bridge/docker-ct b/lib-ee/emqx_ee_bridge/docker-ct index 1548a3203..94f9379df 100644 --- a/lib-ee/emqx_ee_bridge/docker-ct +++ b/lib-ee/emqx_ee_bridge/docker-ct @@ -1,3 +1,4 @@ +toxiproxy influxdb kafka mongo diff --git a/lib-ee/emqx_ee_bridge/test/emqx_ee_bridge_mysql_SUITE.erl b/lib-ee/emqx_ee_bridge/test/emqx_ee_bridge_mysql_SUITE.erl index 753a9f3f9..655fee6e5 100644 --- a/lib-ee/emqx_ee_bridge/test/emqx_ee_bridge_mysql_SUITE.erl +++ b/lib-ee/emqx_ee_bridge/test/emqx_ee_bridge_mysql_SUITE.erl @@ -63,22 +63,24 @@ groups() -> ]. init_per_group(tcp, Config0) -> - MysqlHost = os:getenv("MYSQL_TCP_HOST", "mysql"), + MysqlHost = os:getenv("MYSQL_TCP_HOST", "toxiproxy"), MysqlPort = list_to_integer(os:getenv("MYSQL_TCP_PORT", "3306")), Config = [ {mysql_host, MysqlHost}, {mysql_port, MysqlPort}, - {enable_tls, false} + {enable_tls, false}, + {proxy_name, "mysql_tcp"} | Config0 ], common_init(Config); init_per_group(tls, Config0) -> - MysqlHost = os:getenv("MYSQL_TLS_HOST", "mysql-tls"), - MysqlPort = list_to_integer(os:getenv("MYSQL_TLS_PORT", "3306")), + MysqlHost = os:getenv("MYSQL_TLS_HOST", "toxiproxy"), + MysqlPort = list_to_integer(os:getenv("MYSQL_TLS_PORT", "3307")), Config = [ {mysql_host, MysqlHost}, {mysql_port, MysqlPort}, - {enable_tls, true} + {enable_tls, true}, + {proxy_name, "mysql_tls"} | Config0 ], common_init(Config); @@ -95,6 +97,9 @@ init_per_group(_Group, Config) -> end_per_group(Group, Config) when Group =:= tcp; Group =:= tls -> connect_and_drop_table(Config), + ProxyHost = ?config(proxy_host, Config), + ProxyPort = ?config(proxy_port, Config), + emqx_common_test_helpers:reset_proxy(ProxyHost, ProxyPort), ok; end_per_group(_Group, _Config) -> ok. @@ -107,16 +112,18 @@ end_per_suite(_Config) -> ok = emqx_common_test_helpers:stop_apps([emqx_bridge, emqx_conf]), ok. -init_per_testcase(_Testcase, Config0) -> - Config = [{mysql_direct_pid, connect_direct_mysql(Config0)} | Config0], - catch clear_table(Config), +init_per_testcase(_Testcase, Config) -> + % Config = [{mysql_direct_pid, connect_direct_mysql(Config0)} | Config0], + connect_and_clear_table(Config), delete_bridge(Config), Config. end_per_testcase(_Testcase, Config) -> - catch clear_table(Config), - DirectPid = ?config(mysql_direct_pid, Config), - mysql:stop(DirectPid), + ProxyHost = ?config(proxy_host, Config), + ProxyPort = ?config(proxy_port, Config), + emqx_common_test_helpers:reset_proxy(ProxyHost, ProxyPort), + connect_and_clear_table(Config), + ok = snabbkaffe:stop(), delete_bridge(Config), ok. @@ -130,6 +137,10 @@ common_init(Config0) -> MysqlPort = ?config(mysql_port, Config0), case emqx_common_test_helpers:is_tcp_server_available(MysqlHost, MysqlPort) of true -> + % Setup toxiproxy + ProxyHost = os:getenv("PROXY_HOST", "toxiproxy"), + ProxyPort = list_to_integer(os:getenv("PROXY_PORT", "8474")), + emqx_common_test_helpers:reset_proxy(ProxyHost, ProxyPort), % Ensure EE bridge module is loaded _ = application:load(emqx_ee_bridge), _ = emqx_ee_bridge:module_info(), @@ -142,7 +153,9 @@ common_init(Config0) -> [ {mysql_config, MysqlConfig}, {mysql_bridge_type, BridgeType}, - {mysql_name, Name} + {mysql_name, Name}, + {proxy_host, ProxyHost}, + {proxy_port, ProxyPort} | Config0 ], Config; @@ -171,7 +184,7 @@ mysql_config(BridgeType, Config) -> " query_mode = ~s\n" " }\n" " ssl = {\n" - " enable = ~w\n" + " enable = ~w\n" " }\n" "}", [ @@ -255,14 +268,16 @@ connect_and_drop_table(Config) -> ok = mysql:query(DirectPid, ?SQL_DROP_TABLE), mysql:stop(DirectPid). -% These funs expects a connection to already exist -clear_table(Config) -> - DirectPid = ?config(mysql_direct_pid, Config), - ok = mysql:query(DirectPid, ?SQL_DELETE). +connect_and_clear_table(Config) -> + DirectPid = connect_direct_mysql(Config), + ok = mysql:query(DirectPid, ?SQL_DELETE), + mysql:stop(DirectPid). -get_payload(Config) -> - DirectPid = ?config(mysql_direct_pid, Config), - mysql:query(DirectPid, ?SQL_SELECT). +connect_and_get_payload(Config) -> + DirectPid = connect_direct_mysql(Config), + Result = mysql:query(DirectPid, ?SQL_SELECT), + mysql:stop(DirectPid), + Result. %%------------------------------------------------------------------------------ %% Testcases @@ -284,7 +299,7 @@ t_setup_via_config_and_publish(Config) -> ), ?assertMatch( {ok, [<<"payload">>], [[Val]]}, - get_payload(Config) + connect_and_get_payload(Config) ), ok end, @@ -319,7 +334,7 @@ t_setup_via_http_api_and_publish(Config) -> ), ?assertMatch( {ok, [<<"payload">>], [[Val]]}, - get_payload(Config) + connect_and_get_payload(Config) ), ok end, @@ -330,3 +345,25 @@ t_setup_via_http_api_and_publish(Config) -> end ), ok. + +t_get_status(Config) -> + ?assertMatch( + {ok, _}, + create_bridge(Config) + ), + ProxyPort = ?config(proxy_port, Config), + ProxyHost = ?config(proxy_host, Config), + ProxyName = ?config(proxy_name, Config), + + Name = ?config(mysql_name, Config), + BridgeType = ?config(mysql_bridge_type, Config), + ResourceID = emqx_bridge_resource:resource_id(BridgeType, Name), + + ?assertEqual({ok, connected}, emqx_resource_manager:health_check(ResourceID)), + emqx_common_test_helpers:with_failure(down, ProxyName, ProxyHost, ProxyPort, fun() -> + ?assertMatch( + {ok, Status} when Status =:= disconnected orelse Status =:= connecting, + emqx_resource_manager:health_check(ResourceID) + ) + end), + ok. diff --git a/scripts/ct/run.sh b/scripts/ct/run.sh index d1e24558b..18dfb2525 100755 --- a/scripts/ct/run.sh +++ b/scripts/ct/run.sh @@ -92,9 +92,11 @@ for dep in ${CT_DEPS}; do erlang24) FILES+=( '.ci/docker-compose-file/docker-compose.yaml' ) ;; + toxiproxy) + FILES+=( '.ci/docker-compose-file/docker-compose-toxiproxy.yaml' ) + ;; influxdb) - FILES+=( '.ci/docker-compose-file/docker-compose-toxiproxy.yaml' - '.ci/docker-compose-file/docker-compose-influxdb-tcp.yaml' + FILES+=( '.ci/docker-compose-file/docker-compose-influxdb-tcp.yaml' '.ci/docker-compose-file/docker-compose-influxdb-tls.yaml' ) ;; mongo)