diff --git a/test/tap/tap/Makefile b/test/tap/tap/Makefile index 00db2a3e2..6ca93576e 100644 --- a/test/tap/tap/Makefile +++ b/test/tap/tap/Makefile @@ -14,11 +14,15 @@ SQLITE3_DIR=$(DEPS_PATH)/sqlite3/sqlite3 SQLITE3_IDIR=$(SQLITE3_DIR) SQLITE3_LDIR=$(SQLITE3_DIR) +DOTENV_DIR=./cpp-dotenv/cpp-dotenv +DOTENV_IDIR=$(DOTENV_DIR)/include +DOTENV_LDIR=$(DOTENV_DIR) + IDIR=../../../include LDIR=../../../lib LIBPROXYSQLAR=$(LDIR)/libproxysql.a -INCLUDEDIRS=-I$(IDIR) -I$(JSON_IDIR) -I$(MARIADB_IDIR) -I${CURL_IDIR} -I${SQLITE3_IDIR} +INCLUDEDIRS=-I$(IDIR) -I$(JSON_IDIR) -I$(MARIADB_IDIR) -I${CURL_IDIR} -I${SQLITE3_IDIR} -I$(DOTENV_IDIR) .PHONY: all all: libtap.a @@ -26,12 +30,20 @@ all: libtap.a .PHONY: clean clean: rm -f *.o libtap.a || true + find cpp-dotenv/cpp-dotenv/ -name '*.o' -or -name '*.a' -delete || true OPT=-O2 debug: OPT = -O0 -DDEBUG -ggdb debug: libtap.a -libtap.a: tap.cpp tap.h command_line.cpp command_line.h utils.cpp utils.h +libtap.a: tap.cpp tap.h command_line.cpp command_line.h utils.cpp utils.h cpp-dotenv g++ -c tap.cpp command_line.cpp utils.cpp -std=c++11 $(INCLUDEDIRS) $(OPT) - ar rcs libtap.a tap.o command_line.o utils.o + ar rcs libtap.a tap.o command_line.o utils.o $$(find $(DOTENV_DIR)/ -name '*.o') + +cpp-dotenv/cpp-dotenv/libcpp_dotenv.a: + cd cpp-dotenv && rm -rf cpp-dotenv-*/ || true + cd cpp-dotenv && tar -zxf cpp-dotenv-*.tar.gz + cd cpp-dotenv/cpp-dotenv && cmake . -DBUILD_TESTING=OFF -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Debug + cd cpp-dotenv/cpp-dotenv && CC=${CC} CXX=${CXX} ${MAKE} +cpp-dotenv: cpp-dotenv/cpp-dotenv/libcpp_dotenv.a diff --git a/test/tap/tap/command_line.cpp b/test/tap/tap/command_line.cpp index 85e77151e..811f876eb 100644 --- a/test/tap/tap/command_line.cpp +++ b/test/tap/tap/command_line.cpp @@ -11,7 +11,11 @@ #include "command_line.h" #include "json.hpp" +#include "dotenv.h" + using nlohmann::json; +using dotenv::env; +//using namespace dotenv; CommandLine::CommandLine() {} @@ -100,6 +104,25 @@ int CommandLine::getEnv() { *field = strdup(value); }; + { +// char dir_name[256] +// getcwd(dir_name, sizeof(dir_name); +// strcat(dir_name,".env") +// env.load_dotenv(".env", true).load_dotenv(dir_name, true); + + char temp[PATH_MAX]; + std::string dir_name = getcwd(temp, sizeof(temp)) ? std::string( temp ) : std::string(""); + env.load_dotenv(".env", true); + env.load_dotenv((dir_name.substr(dir_name.find_last_of('/') + 1) + ".env").c_str(), true); + fprintf(stdout, ">>> %s %s <<<\n", (dir_name + ".env").c_str(), (dir_name.substr(dir_name.find_last_of('/') + 1) + ".env").c_str()); + + std::string exe_name; + std::ifstream("/proc/self/comm") >> exe_name; + env.load_dotenv((exe_name + ".env").c_str(), true); + env.load_dotenv((exe_name.substr(0, exe_name.size() - 2) + ".env").c_str(), true); + fprintf(stdout, ">>> %s %s <<<\n", (exe_name + ".env").c_str(), (exe_name.substr(0, exe_name.size() - 2) + ".env").c_str()); + } + value=getenv("TAP_HOST"); if(!value) return -1; replace_str_field(&this->host, value); diff --git a/test/tap/tap/cpp-dotenv/cpp-dotenv b/test/tap/tap/cpp-dotenv/cpp-dotenv new file mode 120000 index 000000000..fcdbe8d2c --- /dev/null +++ b/test/tap/tap/cpp-dotenv/cpp-dotenv @@ -0,0 +1 @@ +cpp-dotenv-1.0.0-alpha \ No newline at end of file diff --git a/test/tap/tap/cpp-dotenv/cpp-dotenv-v1.0.0-alpha.tar.gz b/test/tap/tap/cpp-dotenv/cpp-dotenv-v1.0.0-alpha.tar.gz new file mode 100644 index 000000000..025be1138 Binary files /dev/null and b/test/tap/tap/cpp-dotenv/cpp-dotenv-v1.0.0-alpha.tar.gz differ diff --git a/test/tap/tap/utils.cpp b/test/tap/tap/utils.cpp index e0cdd364f..41b6d8b56 100644 --- a/test/tap/tap/utils.cpp +++ b/test/tap/tap/utils.cpp @@ -10,7 +10,7 @@ #include #include -#include +#include "mysql.h" #include "tap.h" #include "utils.h" diff --git a/test/tap/tests/.env b/test/tap/tests/.env new file mode 100644 index 000000000..c2bab0e82 --- /dev/null +++ b/test/tap/tests/.env @@ -0,0 +1 @@ +TAP_ENV_VAR1=.env diff --git a/test/tap/tests/Makefile b/test/tap/tests/Makefile index 7c6c72cbe..72807857a 100644 --- a/test/tap/tests/Makefile +++ b/test/tap/tests/Makefile @@ -65,6 +65,10 @@ COREDUMPER_DIR=$(DEPS_PATH)/coredumper/coredumper COREDUMPER_IDIR=$(COREDUMPER_DIR)/include COREDUMPER_LDIR=$(COREDUMPER_DIR)/src +DOTENV_DIR=../tap/cpp-dotenv/cpp-dotenv +DOTENV_IDIR=$(DOTENV_DIR)/include +DOTENV_LDIR=$(DOTENV_DIR) + IDIR=../../../include LDIR=../../../lib TAP_LIBDIR=../tap @@ -77,7 +81,7 @@ EXECUTABLE=proxysql OBJ=../../../src/obj/proxysql_global.o ../../../src/obj/main.o ../../../src/obj/proxy_tls.o -INCLUDEDIRS=-I../tap -I$(RE2_PATH) -I$(IDIR) -I$(JEMALLOC_IDIR) -I$(SQLITE3_DIR) -I$(MICROHTTPD_IDIR) -I$(LIBHTTPSERVER_IDIR) -I$(CURL_IDIR) -I$(DAEMONPATH_IDIR) -I$(MARIADB_IDIR) -I$(SSL_IDIR) -I$(JSON_IDIR) -I$(LIBCONFIG_IDIR) -I$(PROMETHEUS_IDIR) -I$(EV_IDIR) +INCLUDEDIRS=-I../tap -I$(RE2_PATH) -I$(IDIR) -I$(JEMALLOC_IDIR) -I$(SQLITE3_DIR) -I$(MICROHTTPD_IDIR) -I$(LIBHTTPSERVER_IDIR) -I$(CURL_IDIR) -I$(DAEMONPATH_IDIR) -I$(MARIADB_IDIR) -I$(SSL_IDIR) -I$(JSON_IDIR) -I$(LIBCONFIG_IDIR) -I$(PROMETHEUS_IDIR) -I$(EV_IDIR) -I$(DOTENV_IDIR) LDIRS=-L$(TAP_LIBDIR) -L$(LDIR) -L$(JEMALLOC_LDIR) $(LIBCONFIG_LDIR) -L$(RE2_PATH)/obj -L$(MARIADB_LDIR) -L$(DAEMONPATH_LDIR) -L$(PCRE_LDIR) -L$(MICROHTTPD_LDIR) -L$(LIBHTTPSERVER_LDIR) -L$(LIBINJECTION_LDIR) -L$(CURL_LDIR) -L$(EV_LDIR) -L$(SSL_LDIR) -L$(PROMETHEUS_LDIR) UNAME_S := $(shell uname -s) diff --git a/test/tap/tests/envvars-t.cpp b/test/tap/tests/envvars-t.cpp new file mode 100644 index 000000000..6f18697a6 --- /dev/null +++ b/test/tap/tests/envvars-t.cpp @@ -0,0 +1,44 @@ +#include +#include + +#include "tap.h" +#include "command_line.h" + +int main() { + CommandLine cl; + + char* value = NULL; + + // this test checks the env file loading mechanism implemented in tap/command_line.cpp:CommandLine::getEnv() + // foldername/foldername.env - enviroment vars for whole folder + // foldername/testname-t.env - enviroment vars only for testname-t + + // create + // echo 'TAP_ENV_VAR1=.env' > .env + // echo 'TAP_ENV_VAR2=tests.env' > tests.env + // echo 'TAP_ENV_VAR3=envvars-t.env' > envvars-t.env + // echo 'TAP_ENV_VAR4=envvars.env' > envvars.env + +// if (cl.getEnv()) { +// diag("Failed to get the required environmental variables."); +// return -1; +// } + cl.getEnv(); + + plan(4); + + value = getenv("TAP_ENV_VAR1"); + ok((value != NULL) and (strcmp(value, ".env") == 0), "Env variable 'TAP_ENV_VAR1' from '.env' Expected: '.env' Actual: '%s'", value); // ok_1 + + value = getenv("TAP_ENV_VAR2"); + ok((value != NULL) and (strcmp(value, "tests.env") == 0), "Env variable 'TAP_ENV_VAR2' from 'tests.env' Expected: 'tests.env' Actual: '%s'", value); // ok_2 + + value = getenv("TAP_ENV_VAR3"); + ok((value != NULL) and (strcmp(value, "envvars-t.env") == 0), "Env variable 'TAP_ENV_VAR3' from 'envvars-t.env' Expected: 'envvars-t.env' Actual: '%s'", value); // ok_3 + + value = getenv("TAP_ENV_VAR4"); + ok((value != NULL) and (strcmp(value, "envvars.env") == 0), "Env variable 'TAP_ENV_VAR4' from 'envvars.env' Expected: 'envvars.env' Actual: '%s'", value); // ok_4 + + return exit_status(); +} + diff --git a/test/tap/tests/envvars-t.env b/test/tap/tests/envvars-t.env new file mode 100644 index 000000000..e90aa8d32 --- /dev/null +++ b/test/tap/tests/envvars-t.env @@ -0,0 +1 @@ +TAP_ENV_VAR3=envvars-t.env diff --git a/test/tap/tests/envvars.env b/test/tap/tests/envvars.env new file mode 100644 index 000000000..59e84fa64 --- /dev/null +++ b/test/tap/tests/envvars.env @@ -0,0 +1 @@ +TAP_ENV_VAR4=envvars.env diff --git a/test/tap/tests/tests.env b/test/tap/tests/tests.env new file mode 100644 index 000000000..348efc54d --- /dev/null +++ b/test/tap/tests/tests.env @@ -0,0 +1 @@ +TAP_ENV_VAR2=tests.env