------------------------------------------------------------------ -- Collection of utilities to help testing Kong features and plugins. -- -- @copyright Copyright 2016-2022 Kong Inc. All rights reserved. -- @license [Apache 2.0](https://opensource.org/licenses/Apache-2.0) -- @module spec.helpers local log = require("kong.cmd.utils.log") local reload_module = require("spec.internal.module").reload log.set_lvl(log.levels.quiet) -- disable stdout logs in tests -- reload some modules when env or _G changes local CONSTANTS = reload_module("spec.internal.constants") local conf = reload_module("spec.internal.conf") local shell = reload_module("spec.internal.shell") local misc = reload_module("spec.internal.misc") local DB = reload_module("spec.internal.db") local grpc = reload_module("spec.internal.grpc") local dns_mock = reload_module("spec.internal.dns") local asserts = reload_module("spec.internal.asserts") -- luacheck: ignore local pid = reload_module("spec.internal.pid") local cmd = reload_module("spec.internal.cmd") local server = reload_module("spec.internal.server") local client = reload_module("spec.internal.client") local wait = reload_module("spec.internal.wait") ---------------- -- Variables/constants -- @section exported-fields --- Below is a list of fields/constants exported on the `helpers` module table: -- @table helpers -- @field dir The [`pl.dir` module of Penlight](http://tieske.github.io/Penlight/libraries/pl.dir.html) -- @field path The [`pl.path` module of Penlight](http://tieske.github.io/Penlight/libraries/pl.path.html) -- @field file The [`pl.file` module of Penlight](http://tieske.github.io/Penlight/libraries/pl.file.html) -- @field utils The [`pl.utils` module of Penlight](http://tieske.github.io/Penlight/libraries/pl.utils.html) -- @field test_conf The Kong test configuration. See also `get_running_conf` which might be slightly different. -- @field test_conf_path The configuration file in use. -- @field mock_upstream_hostname -- @field mock_upstream_protocol -- @field mock_upstream_host -- @field mock_upstream_port -- @field mock_upstream_url Base url constructed from the components -- @field mock_upstream_ssl_protocol -- @field mock_upstream_ssl_host -- @field mock_upstream_ssl_port -- @field mock_upstream_ssl_url Base url constructed from the components -- @field mock_upstream_stream_port -- @field mock_upstream_stream_ssl_port -- @field mock_grpc_upstream_proto_path -- @field grpcbin_host The host for grpcbin service, it can be set by env KONG_SPEC_TEST_GRPCBIN_HOST. -- @field grpcbin_port The port (SSL disabled) for grpcbin service, it can be set by env KONG_SPEC_TEST_GRPCBIN_PORT. -- @field grpcbin_ssl_port The port (SSL enabled) for grpcbin service it can be set by env KONG_SPEC_TEST_GRPCBIN_SSL_PORT. -- @field grpcbin_url The URL (SSL disabled) for grpcbin service -- @field grpcbin_ssl_url The URL (SSL enabled) for grpcbin service -- @field redis_host The host for Redis, it can be set by env KONG_SPEC_TEST_REDIS_HOST. -- @field redis_port The port (SSL disabled) for Redis, it can be set by env KONG_SPEC_TEST_REDIS_PORT. -- @field redis_ssl_port The port (SSL enabled) for Redis, it can be set by env KONG_SPEC_TEST_REDIS_SSL_PORT. -- @field redis_ssl_sni The server name for Redis, it can be set by env KONG_SPEC_TEST_REDIS_SSL_SNI. -- @field zipkin_host The host for Zipkin service, it can be set by env KONG_SPEC_TEST_ZIPKIN_HOST. -- @field zipkin_port the port for Zipkin service, it can be set by env KONG_SPEC_TEST_ZIPKIN_PORT. -- @field otelcol_host The host for OpenTelemetry Collector service, it can be set by env KONG_SPEC_TEST_OTELCOL_HOST. -- @field otelcol_http_port the port for OpenTelemetry Collector service, it can be set by env KONG_SPEC_TEST_OTELCOL_HTTP_PORT. -- @field old_version_kong_path the path for the old version kong source code, it can be set by env KONG_SPEC_TEST_OLD_VERSION_KONG_PATH. -- @field otelcol_zpages_port the port for OpenTelemetry Collector Zpages service, it can be set by env KONG_SPEC_TEST_OTELCOL_ZPAGES_PORT. -- @field otelcol_file_exporter_path the path of for OpenTelemetry Collector's file exporter, it can be set by env KONG_SPEC_TEST_OTELCOL_FILE_EXPORTER_PATH. ---------- -- Exposed ---------- -- @export return { -- Penlight dir = require("pl.dir"), path = require("pl.path"), file = require("pl.file"), utils = require("pl.utils"), -- Kong testing properties db = DB.db, blueprints = DB.blueprints, get_db_utils = DB.get_db_utils, get_cache = DB.get_cache, bootstrap_database = DB.bootstrap_database, bin_path = CONSTANTS.BIN_PATH, test_conf = conf, test_conf_path = CONSTANTS.TEST_CONF_PATH, external_plugins_path = CONSTANTS.EXTERNAL_PLUGINS_PATH, mock_upstream_hostname = CONSTANTS.MOCK_UPSTREAM_HOSTNAME, mock_upstream_protocol = CONSTANTS.MOCK_UPSTREAM_PROTOCOL, mock_upstream_host = CONSTANTS.MOCK_UPSTREAM_HOST, mock_upstream_port = CONSTANTS.MOCK_UPSTREAM_PORT, mock_upstream_url = CONSTANTS.MOCK_UPSTREAM_PROTOCOL .. "://" .. CONSTANTS.MOCK_UPSTREAM_HOST .. ':' .. CONSTANTS.MOCK_UPSTREAM_PORT, mock_upstream_ssl_protocol = CONSTANTS.MOCK_UPSTREAM_SSL_PROTOCOL, mock_upstream_ssl_host = CONSTANTS.MOCK_UPSTREAM_HOST, mock_upstream_ssl_port = CONSTANTS.MOCK_UPSTREAM_SSL_PORT, mock_upstream_ssl_url = CONSTANTS.MOCK_UPSTREAM_SSL_PROTOCOL .. "://" .. CONSTANTS.MOCK_UPSTREAM_HOST .. ':' .. CONSTANTS.MOCK_UPSTREAM_SSL_PORT, mock_upstream_stream_port = CONSTANTS.MOCK_UPSTREAM_STREAM_PORT, mock_upstream_stream_ssl_port = CONSTANTS.MOCK_UPSTREAM_STREAM_SSL_PORT, mock_grpc_upstream_proto_path = CONSTANTS.MOCK_GRPC_UPSTREAM_PROTO_PATH, zipkin_host = CONSTANTS.ZIPKIN_HOST, zipkin_port = CONSTANTS.ZIPKIN_PORT, otelcol_host = CONSTANTS.OTELCOL_HOST, otelcol_http_port = CONSTANTS.OTELCOL_HTTP_PORT, otelcol_zpages_port = CONSTANTS.OTELCOL_ZPAGES_PORT, otelcol_file_exporter_path = CONSTANTS.OTELCOL_FILE_EXPORTER_PATH, grpcbin_host = CONSTANTS.GRPCBIN_HOST, grpcbin_port = CONSTANTS.GRPCBIN_PORT, grpcbin_ssl_port = CONSTANTS.GRPCBIN_SSL_PORT, grpcbin_url = string.format("grpc://%s:%d", CONSTANTS.GRPCBIN_HOST, CONSTANTS.GRPCBIN_PORT), grpcbin_ssl_url = string.format("grpcs://%s:%d", CONSTANTS.GRPCBIN_HOST, CONSTANTS.GRPCBIN_SSL_PORT), redis_host = CONSTANTS.REDIS_HOST, redis_port = CONSTANTS.REDIS_PORT, redis_ssl_port = CONSTANTS.REDIS_SSL_PORT, redis_ssl_sni = CONSTANTS.REDIS_SSL_SNI, redis_auth_port = CONSTANTS.REDIS_AUTH_PORT, blackhole_host = CONSTANTS.BLACKHOLE_HOST, old_version_kong_path = CONSTANTS.OLD_VERSION_KONG_PATH, -- Kong testing helpers execute = shell.exec, dns_mock = dns_mock, kong_exec = shell.kong_exec, get_version = cmd.get_version, get_running_conf = cmd.get_running_conf, http_client = client.http_client, grpc_client = client.grpc_client, http2_client = client.http2_client, make_synchronized_clients = client.make_synchronized_clients, wait_until = wait.wait_until, pwait_until = wait.pwait_until, wait_pid = pid.wait_pid, wait_timer = wait.wait_timer, wait_for_all_config_update = wait.wait_for_all_config_update, wait_for_file = wait.wait_for_file, wait_for_file_contents = wait.wait_for_file_contents, tcp_server = server.tcp_server, udp_server = server.udp_server, kill_tcp_server = server.kill_tcp_server, is_echo_server_ready = server.is_echo_server_ready, echo_server_reset = server.echo_server_reset, get_echo_server_received_data = server.get_echo_server_received_data, http_mock = server.http_mock, get_proxy_ip = client.get_proxy_ip, get_proxy_port = client.get_proxy_port, proxy_client = client.proxy_client, proxy_client_grpc = client.proxy_client_grpc, proxy_client_grpcs = client.proxy_client_grpcs, proxy_client_h2c = client.proxy_client_h2c, proxy_client_h2 = client.proxy_client_h2, admin_client = client.admin_client, admin_gui_client = client.admin_gui_client, proxy_ssl_client = client.proxy_ssl_client, admin_ssl_client = client.admin_ssl_client, admin_gui_ssl_client = client.admin_gui_ssl_client, prepare_prefix = cmd.prepare_prefix, clean_prefix = cmd.clean_prefix, clean_logfile = cmd.clean_logfile, wait_for_invalidation = wait.wait_for_invalidation, each_strategy = DB.each_strategy, all_strategies = DB.all_strategies, validate_plugin_config_schema = DB.validate_plugin_config_schema, clustering_client = client.clustering_client, https_server = require("spec.fixtures.https_server"), stress_generator = require("spec.fixtures.stress_generator"), -- miscellaneous intercept = misc.intercept, openresty_ver_num = misc.openresty_ver_num, unindent = misc.unindent, make_yaml_file = misc.make_yaml_file, setenv = misc.setenv, unsetenv = misc.unsetenv, deep_sort = misc.deep_sort, generate_keys = misc.generate_keys, -- launching Kong subprocesses start_kong = cmd.start_kong, stop_kong = cmd.stop_kong, cleanup_kong = cmd.cleanup_kong, restart_kong = cmd.restart_kong, reload_kong = wait.reload_kong, get_kong_workers = wait.get_kong_workers, wait_until_no_common_workers = wait.wait_until_no_common_workers, start_grpc_target = grpc.start_grpc_target, stop_grpc_target = grpc.stop_grpc_target, get_grpc_target_port = grpc.get_grpc_target_port, -- plugin compatibility test use_old_plugin = misc.use_old_plugin, -- Only use in CLI tests from spec/02-integration/01-cmd kill_all = cmd.kill_all, with_current_ws = misc.with_current_ws, signal = cmd.signal, -- send signal to all Nginx workers, not including the master signal_workers = cmd.signal_workers, -- returns the plugins and version list that is used by Hybrid mode tests get_plugins_list = DB.clone_plugins_list, get_available_port = wait.get_available_port, make_temp_dir = misc.make_temp_dir, build_go_plugins = cmd.build_go_plugins, }