From: Marcin Siodelski Date: Thu, 30 Aug 2018 16:49:35 +0000 (+0200) Subject: [#92,!13] Created testutils libs for MySQL, PgSQL and CQL. X-Git-Tag: gitlab116_base~24 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b773ae7fe102961ebd7d4944445671ff761e4a12;p=thirdparty%2Fkea.git [#92,!13] Created testutils libs for MySQL, PgSQL and CQL. --- diff --git a/configure.ac b/configure.ac index 0dc860ea61..3d76e5b9f5 100644 --- a/configure.ac +++ b/configure.ac @@ -1536,6 +1536,7 @@ AC_CONFIG_FILES([Makefile src/lib/cryptolink/tests/Makefile src/lib/database/Makefile src/lib/database/tests/Makefile + src/lib/database/testutils/Makefile src/lib/dhcp/Makefile src/lib/dhcp/tests/Makefile src/lib/dhcp_ddns/Makefile @@ -1573,10 +1574,13 @@ AC_CONFIG_FILES([Makefile src/lib/log/tests/severity_test.sh src/lib/log/tests/tempdir.h src/lib/mysql/Makefile + src/lib/mysql/testutils/Makefile src/lib/pgsql/Makefile src/lib/pgsql/tests/Makefile + src/lib/pgsql/testutils/Makefile src/lib/cql/Makefile src/lib/cql/tests/Makefile + src/lib/cql/testutils/Makefile src/lib/process/Makefile src/lib/process/tests/Makefile src/lib/process/testutils/Makefile diff --git a/src/bin/dhcp4/tests/Makefile.am b/src/bin/dhcp4/tests/Makefile.am index 9cad3a6986..cd6eb79226 100644 --- a/src/bin/dhcp4/tests/Makefile.am +++ b/src/bin/dhcp4/tests/Makefile.am @@ -132,15 +132,19 @@ dhcp4_unittests_LDADD += $(top_builddir)/src/lib/dhcp/libkea-dhcp++.la dhcp4_unittests_LDADD += $(top_builddir)/src/lib/dhcp/tests/libdhcptest.la if HAVE_MYSQL +dhcp4_unittests_LDADD += $(top_builddir)/src/lib/mysql/testutils/libmysqltest.la dhcp4_unittests_LDADD += $(top_builddir)/src/lib/mysql/libkea-mysql.la endif if HAVE_PGSQL +dhcp4_unittests_LDADD += $(top_builddir)/src/lib/pgsql/testutils/libpgsqltest.la dhcp4_unittests_LDADD += $(top_builddir)/src/lib/pgsql/libkea-pgsql.la endif if HAVE_CQL +dhcp4_unittests_LDADD += $(top_builddir)/src/lib/cql/testutils/libcqltest.la dhcp4_unittests_LDADD += $(top_builddir)/src/lib/cql/libkea-cql.la endif +dhcp4_unittests_LDADD += $(top_builddir)/src/lib/database/testutils/libdatabasetest.la dhcp4_unittests_LDADD += $(top_builddir)/src/lib/database/libkea-database.la dhcp4_unittests_LDADD += $(top_builddir)/src/lib/asiolink/libkea-asiolink.la dhcp4_unittests_LDADD += $(top_builddir)/src/lib/cc/libkea-cc.la diff --git a/src/bin/dhcp4/tests/dora_unittest.cc b/src/bin/dhcp4/tests/dora_unittest.cc index a4a4243599..a1b705f2c7 100644 --- a/src/bin/dhcp4/tests/dora_unittest.cc +++ b/src/bin/dhcp4/tests/dora_unittest.cc @@ -13,9 +13,19 @@ #include #include #include -#include -#include -#include + +#ifdef HAVE_CQL +#include +#endif + +#ifdef HAVE_MYSQL +#include +#endif + +#ifdef HAVE_PGSQL +#include +#endif + #include #include #include @@ -24,6 +34,7 @@ using namespace isc; using namespace isc::asiolink; using namespace isc::data; +using namespace isc::db::test; using namespace isc::dhcp; using namespace isc::dhcp::test; diff --git a/src/bin/dhcp4/tests/host_unittest.cc b/src/bin/dhcp4/tests/host_unittest.cc index c8a36018b8..9b1aa6c904 100644 --- a/src/bin/dhcp4/tests/host_unittest.cc +++ b/src/bin/dhcp4/tests/host_unittest.cc @@ -13,9 +13,6 @@ #include #include #include -#include -#include -#include #include #include #include diff --git a/src/bin/dhcp4/tests/kea_controller_unittest.cc b/src/bin/dhcp4/tests/kea_controller_unittest.cc index 5b843fde7e..2065fa1782 100644 --- a/src/bin/dhcp4/tests/kea_controller_unittest.cc +++ b/src/bin/dhcp4/tests/kea_controller_unittest.cc @@ -19,7 +19,11 @@ #include #include #include -#include + +#ifdef HAVE_MYSQL +#include +#endif + #include #include @@ -39,6 +43,7 @@ using namespace isc; using namespace isc::asiolink; using namespace isc::config; using namespace isc::data; +using namespace isc::db::test; using namespace isc::dhcp; using namespace isc::dhcp::test; using namespace isc::hooks; diff --git a/src/bin/dhcp6/tests/Makefile.am b/src/bin/dhcp6/tests/Makefile.am index 0686764695..d94f577347 100644 --- a/src/bin/dhcp6/tests/Makefile.am +++ b/src/bin/dhcp6/tests/Makefile.am @@ -132,17 +132,20 @@ dhcp6_unittests_LDADD += $(top_builddir)/src/lib/dhcp/libkea-dhcp++.la dhcp6_unittests_LDADD += $(top_builddir)/src/lib/dhcp/tests/libdhcptest.la if HAVE_MYSQL +dhcp6_unittests_LDADD += $(top_builddir)/src/lib/mysql/testutils/libmysqltest.la dhcp6_unittests_LDADD += $(top_builddir)/src/lib/mysql/libkea-mysql.la endif if HAVE_PGSQL +dhcp6_unittests_LDADD += $(top_builddir)/src/lib/pgsql/testutils/libpgsqltest.la dhcp6_unittests_LDADD += $(top_builddir)/src/lib/pgsql/libkea-pgsql.la endif if HAVE_CQL +dhcp6_unittests_LDADD += $(top_builddir)/src/lib/cql/testutils/libcqltest.la dhcp6_unittests_LDADD += $(top_builddir)/src/lib/cql/libkea-cql.la endif +dhcp6_unittests_LDADD += $(top_builddir)/src/lib/database/testutils/libdatabasetest.la dhcp6_unittests_LDADD += $(top_builddir)/src/lib/database/libkea-database.la - dhcp6_unittests_LDADD += $(top_builddir)/src/lib/asiolink/libkea-asiolink.la dhcp6_unittests_LDADD += $(top_builddir)/src/lib/cc/libkea-cc.la dhcp6_unittests_LDADD += $(top_builddir)/src/lib/dns/libkea-dns++.la diff --git a/src/bin/dhcp6/tests/kea_controller_unittest.cc b/src/bin/dhcp6/tests/kea_controller_unittest.cc index 1238fa970c..6f454d135b 100644 --- a/src/bin/dhcp6/tests/kea_controller_unittest.cc +++ b/src/bin/dhcp6/tests/kea_controller_unittest.cc @@ -17,7 +17,11 @@ #include #include #include -#include + +#ifdef HAVE_MYSQL +#include +#endif + #include #include @@ -36,6 +40,7 @@ using namespace isc; using namespace isc::asiolink; using namespace isc::config; using namespace isc::data; +using namespace isc::db::test; using namespace isc::dhcp; using namespace isc::dhcp::test; using namespace isc::hooks; diff --git a/src/lib/cql/Makefile.am b/src/lib/cql/Makefile.am index 28856fd85f..7d04e4a286 100644 --- a/src/lib/cql/Makefile.am +++ b/src/lib/cql/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = . tests +SUBDIRS = . testutils tests AM_CPPFLAGS = -I$(top_srcdir)/src/lib -I$(top_builddir)/src/lib AM_CPPFLAGS += $(BOOST_INCLUDES) $(CQL_CPPFLAGS) diff --git a/src/lib/cql/testutils/Makefile.am b/src/lib/cql/testutils/Makefile.am new file mode 100644 index 0000000000..81080726e1 --- /dev/null +++ b/src/lib/cql/testutils/Makefile.am @@ -0,0 +1,23 @@ +SUBDIRS = . + +AM_CPPFLAGS = -I$(top_builddir)/src/lib -I$(top_srcdir)/src/lib +AM_CPPFLAGS += -DDATABASE_SCRIPTS_DIR=\"$(abs_top_srcdir)/src/share/database/scripts\" +AM_CPPFLAGS += $(BOOST_INCLUDES) + +AM_CXXFLAGS = $(KEA_CXXFLAGS) + +CLEANFILES = *.gcno *.gcda + +if HAVE_GTEST + +noinst_LTLIBRARIES = libcqltest.la + +libcqltest_la_SOURCES = cql_schema.cc cql_schema.h + +libcqltest_la_CXXFLAGS = $(AM_CXXFLAGS) +libcqltest_la_CPPFLAGS = $(AM_CPPFLAGS) $(GTEST_INCLUDES) $(CQL_CPPFLAGS) +libcqltest_la_LDFLAGS = $(AM_LDFLAGS) $(CQL_LIBS) + +libcqltest_la_LIBADD = $(top_builddir)/src/lib/database/testutils/libdatabasetest.la + +endif diff --git a/src/lib/cql/testutils/cql_schema.cc b/src/lib/cql/testutils/cql_schema.cc new file mode 100644 index 0000000000..0f004d1c53 --- /dev/null +++ b/src/lib/cql/testutils/cql_schema.cc @@ -0,0 +1,87 @@ +// Copyright (C) 2015-2018 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#include + +#include + +#include +#include + +#include + +#include +#include +#include +#include + +namespace isc { +namespace db { +namespace test { + +const char* CQL_VALID_TYPE = "type=cql"; + +std::string +validCqlConnectionString() { + return (connectionString(CQL_VALID_TYPE, VALID_NAME, VALID_HOST, VALID_USER, + VALID_PASSWORD)); +} + +bool +softWipeEnabled() { + const char* const env = getenv("KEA_TEST_CASSANDRA_WIPE"); + if (env && (std::string(env) == std::string("soft"))) { + return (true); + } + + return (false); +} + +void +destroyCqlSchema(bool force_wipe, bool show_err) { + if (force_wipe || !softWipeEnabled()) { + // Do full wipe + runCqlScript(DATABASE_SCRIPTS_DIR, "cql/dhcpdb_drop.cql", show_err); + } else { + // do soft wipe (just remove the data, not the structures) + runCqlScript(DATABASE_SCRIPTS_DIR, "cql/soft_wipe.cql", show_err); + } +} + +void +createCqlSchema(bool force_wipe, bool show_err) { + if (force_wipe || !softWipeEnabled()) { + runCqlScript(DATABASE_SCRIPTS_DIR, "cql/dhcpdb_create.cql", show_err); + } +} + +void +runCqlScript(const std::string& path, + const std::string& script_name, + bool show_err) { + std::ostringstream cmd; + cmd << "cqlsh -u keatest -p keatest -k keatest"; + if (!show_err) { + cmd << " 2>/dev/null "; + } + + cmd << " -f"; + + if (!path.empty()) { + cmd << path << "/"; + } + + cmd << script_name; + + int32_t retval = ::system(cmd.str().c_str()); + if (retval) { + std::cerr << "runCqlSchema failed:" << cmd.str() << std::endl; + } +} + +} // namespace test +} // namespace dhcp +} // namespace isc diff --git a/src/lib/cql/testutils/cql_schema.h b/src/lib/cql/testutils/cql_schema.h new file mode 100644 index 0000000000..55f93e0ada --- /dev/null +++ b/src/lib/cql/testutils/cql_schema.h @@ -0,0 +1,95 @@ +// Copyright (C) 2015-2018 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#ifndef TEST_CQL_SCHEMA_H +#define TEST_CQL_SCHEMA_H + +#include +#include +#include + +namespace isc { +namespace db { +namespace test { + +extern const char* CQL_VALID_TYPE; + +/// Return valid connection string +/// +/// @return valid CQL connection string. +std::string validCqlConnectionString(); + +/// @brief Clear everything from the database +/// +/// Submits the current schema drop script: +/// +/// /cql/dhcpdb_drop.cql +/// +/// to the unit test CQL database. If the script fails, the invoking test +/// will fail. The output of stderr is suppressed unless the parameter, +/// show_err is true. +/// +/// @param force_wipe forces wipe of the database, even if +/// KEA_TEST_CASSANDRA_WIPE is set. +/// @param show_err flag which governs whether or not stderr is suppressed. +void destroyCqlSchema(bool force_wipe, bool show_err = false); + +/// @brief Create the CQL Schema +/// +/// Submits the current schema creation script: +/// +/// /cql/dhcpdb_create.cql +/// +/// to the unit test CQL database. If the script fails, the invoking test +/// will fail. The output of stderr is suppressed unless the parameter, +/// show_err is true. +/// +/// @param force_wipe forces wipe of the database, even if +/// KEA_TEST_CASSANDRA_WIPE is set. +/// @param show_err flag which governs whether or not stderr is suppressed. +void createCqlSchema(bool force_wipe, bool show_err = false); + +/// @brief Run a CQL script against the CQL unit test database +/// +/// Submits the given CQL script to CQL via cqlsh CLI. The output of +/// stderr is suppressed unless the parameter, show_err is true. The is done +/// to suppress warnings that might otherwise make test output needlessly +/// noisy. A gtest assertion occurs if the script fails to execute. +/// +/// @param path - path (if not blank) of the script to execute +/// @param script_name - file name of the path to execute +/// @param show_err flag which governs whether or not stderr is suppressed. +void runCqlScript(const std::string& path, const std::string& script_name, + bool show_err); + +/// @brief Returns status if the soft-wipe is enabled or not. +/// +/// In some deployments (In case of Tomek's dev system) Cassandra tests take +/// a very long time to execute. This was traced back to slow table/indexes +/// creation/deletion. With full wipe and recreation of all structures, it +/// took over 60 seconds for each test to execute. To avoid this problem, a +/// feature called soft-wipe has been implemented. If enabled, it does not +/// remove the structures, just the data from essential tables. To enable +/// it set KEA_TEST_CASSANDRA_WIPE environment variable to 'soft'. Make sure +/// that the database schema is set up properly before running in soft-wipe +/// mode. +/// +/// For example to use soft-wipe mode, you can: +/// +/// $ cqlsh -u keatest -p keatest -k keatest +/// -f src/share/database/scripts/cql/dhcpdb_create.cql +/// $ export KEA_TEST_CASSANDRA_WIPE=soft +/// $ cd src/lib/dhcpsrv +/// $ make -j9 +/// $ tests/libdhcpsrv_unittests --gtest_filter=CqlLeaseMgrTest.* +/// +/// @return true if soft-wipe is enabled, false otherwise +bool softWipeEnabled(); +}; +}; +}; + +#endif diff --git a/src/lib/database/Makefile.am b/src/lib/database/Makefile.am index 76a083e13b..b39015f8db 100644 --- a/src/lib/database/Makefile.am +++ b/src/lib/database/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = . tests +SUBDIRS = . testutils tests AM_CPPFLAGS = -I$(top_srcdir)/src/lib -I$(top_builddir)/src/lib AM_CPPFLAGS += $(BOOST_INCLUDES) diff --git a/src/lib/database/testutils/Makefile.am b/src/lib/database/testutils/Makefile.am new file mode 100644 index 0000000000..1a368e88d1 --- /dev/null +++ b/src/lib/database/testutils/Makefile.am @@ -0,0 +1,19 @@ +SUBDIRS = . + +AM_CPPFLAGS = -I$(top_builddir)/src/lib -I$(top_srcdir)/src/lib + +AM_CXXFLAGS = $(KEA_CXXFLAGS) + +CLEANFILES = *.gcno *.gcda + +if HAVE_GTEST + +noinst_LTLIBRARIES = libdatabasetest.la + +libdatabasetest_la_SOURCES = schema.cc schema.h + +libdatabasetest_la_CXXFLAGS = $(AM_CXXFLAGS) +libdatabasetest_la_CPPFLAGS = $(AM_CPPFLAGS) +libdatabasetest_la_LDFLAGS = $(AM_LDFLAGS) + +endif diff --git a/src/lib/dhcpsrv/testutils/schema.cc b/src/lib/database/testutils/schema.cc similarity index 96% rename from src/lib/dhcpsrv/testutils/schema.cc rename to src/lib/database/testutils/schema.cc index b373363dc7..e02b64310f 100644 --- a/src/lib/dhcpsrv/testutils/schema.cc +++ b/src/lib/database/testutils/schema.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2016 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2016-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -10,7 +10,7 @@ using namespace std; namespace isc { -namespace dhcp { +namespace db { namespace test { // Connection strings. diff --git a/src/lib/dhcpsrv/testutils/schema.h b/src/lib/database/testutils/schema.h similarity index 95% rename from src/lib/dhcpsrv/testutils/schema.h rename to src/lib/database/testutils/schema.h index 14d04abb6e..86b22b0c26 100644 --- a/src/lib/dhcpsrv/testutils/schema.h +++ b/src/lib/database/testutils/schema.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2016-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -12,7 +12,7 @@ #include namespace isc { -namespace dhcp { +namespace db { namespace test { extern const char* INVALID_TYPE; diff --git a/src/lib/dhcpsrv/tests/Makefile.am b/src/lib/dhcpsrv/tests/Makefile.am index f652a8ee30..696ebcf6eb 100644 --- a/src/lib/dhcpsrv/tests/Makefile.am +++ b/src/lib/dhcpsrv/tests/Makefile.am @@ -155,6 +155,20 @@ libdhcpsrv_unittests_LDFLAGS += $(CQL_LIBS) endif libdhcpsrv_unittests_LDADD = $(top_builddir)/src/lib/dhcpsrv/testutils/libdhcpsrvtest.la + +if HAVE_MYSQL +libdhcpsrv_unittests_LDADD += $(top_builddir)/src/lib/mysql/testutils/libmysqltest.la +endif + +if HAVE_PGSQL +libdhcpsrv_unittests_LDADD += $(top_builddir)/src/lib/pgsql/testutils/libpgsqltest.la +endif + +if HAVE_CQL +libdhcpsrv_unittests_LDADD += $(top_builddir)/src/lib/cql/testutils/libcqltest.la +endif + +libdhcpsrv_unittests_LDADD += $(top_builddir)/src/lib/database/testutils/libdatabasetest.la libdhcpsrv_unittests_LDADD += $(top_builddir)/src/lib/dhcpsrv/libkea-dhcpsrv.la libdhcpsrv_unittests_LDADD += $(top_builddir)/src/lib/eval/libkea-eval.la libdhcpsrv_unittests_LDADD += $(top_builddir)/src/lib/dhcp_ddns/libkea-dhcp_ddns.la diff --git a/src/lib/dhcpsrv/tests/cfg_db_access_unittest.cc b/src/lib/dhcpsrv/tests/cfg_db_access_unittest.cc index d78bbf0e68..d680dd1de3 100644 --- a/src/lib/dhcpsrv/tests/cfg_db_access_unittest.cc +++ b/src/lib/dhcpsrv/tests/cfg_db_access_unittest.cc @@ -11,13 +11,13 @@ #include #include #include -#include +#include #include #include using namespace isc; +using namespace isc::db::test; using namespace isc::dhcp; -using namespace isc::dhcp::test; using namespace isc::test; namespace { diff --git a/src/lib/dhcpsrv/tests/host_mgr_unittest.cc b/src/lib/dhcpsrv/tests/host_mgr_unittest.cc index 0fb3bf5175..46240eed85 100644 --- a/src/lib/dhcpsrv/tests/host_mgr_unittest.cc +++ b/src/lib/dhcpsrv/tests/host_mgr_unittest.cc @@ -14,11 +14,11 @@ #include #if defined HAVE_MYSQL -#include +#include #endif #if defined HAVE_PGSQL -#include +#include #endif #if defined HAVE_CQL @@ -30,7 +30,9 @@ using namespace isc; using namespace isc::db; +using namespace isc::db::test; using namespace isc::dhcp; +using namespace isc::dhcp::test; using namespace isc::asiolink; namespace { @@ -619,13 +621,13 @@ HostMgrDbLostCallbackTest::testDbLostCallback() { // Find the most recently opened socket. Our SQL client's socket should // be the next one. - int last_open_socket = test::findLastSocketFd(); + int last_open_socket = findLastSocketFd(); // Connect to the host backend. ASSERT_NO_THROW(HostMgr::addBackend(validConnectString())); // Find the SQL client socket. - int sql_socket = test::findLastSocketFd(); + int sql_socket = findLastSocketFd(); ASSERT_TRUE(sql_socket > last_open_socket); // Clear the callback invocation marker. @@ -667,12 +669,12 @@ MySQLHostMgrTest::SetUp() { HostMgrTest::SetUp(); // Ensure schema is the correct one. - test::destroyMySQLSchema(); - test::createMySQLSchema(); + destroyMySQLSchema(); + createMySQLSchema(); // Connect to the database try { - HostMgr::addBackend(test::validMySQLConnectionString()); + HostMgr::addBackend(validMySQLConnectionString()); } catch (...) { std::cerr << "*** ERROR: unable to open database. The test\n" "*** environment is broken and must be fixed before\n" @@ -687,7 +689,7 @@ void MySQLHostMgrTest::TearDown() { HostMgr::instance().getHostDataSource()->rollback(); HostMgr::delBackend("mysql"); - test::destroyMySQLSchema(); + destroyMySQLSchema(); } /// @brief Test fixture class for validating @c HostMgr using @@ -695,15 +697,15 @@ MySQLHostMgrTest::TearDown() { class MySQLHostMgrDbLostCallbackTest : public HostMgrDbLostCallbackTest { public: virtual void destroySchema() { - test::destroyMySQLSchema(); + destroyMySQLSchema(); } virtual void createSchema() { - test::createMySQLSchema(); + createMySQLSchema(); } virtual std::string validConnectString() { - return (test::validMySQLConnectionString()); + return (validMySQLConnectionString()); } }; @@ -764,12 +766,12 @@ PostgreSQLHostMgrTest::SetUp() { HostMgrTest::SetUp(); // Ensure schema is the correct one. - test::destroyPgSQLSchema(); - test::createPgSQLSchema(); + destroyPgSQLSchema(); + createPgSQLSchema(); // Connect to the database try { - HostMgr::addBackend(test::validPgSQLConnectionString()); + HostMgr::addBackend(validPgSQLConnectionString()); } catch (...) { std::cerr << "*** ERROR: unable to open database. The test\n" "*** environment is broken and must be fixed before\n" @@ -784,7 +786,7 @@ void PostgreSQLHostMgrTest::TearDown() { HostMgr::instance().getHostDataSource()->rollback(); HostMgr::delBackend("postgresql"); - test::destroyPgSQLSchema(); + destroyPgSQLSchema(); } /// @brief Test fixture class for validating @c HostMgr using @@ -792,15 +794,15 @@ PostgreSQLHostMgrTest::TearDown() { class PostgreSQLHostMgrDbLostCallbackTest : public HostMgrDbLostCallbackTest { public: virtual void destroySchema() { - test::destroyPgSQLSchema(); + destroyPgSQLSchema(); } virtual void createSchema() { - test::createPgSQLSchema(); + createPgSQLSchema(); } virtual std::string validConnectString() { - return (test::validPgSQLConnectionString()); + return (validPgSQLConnectionString()); } }; @@ -859,12 +861,12 @@ CQLHostMgrTest::SetUp() { HostMgrTest::SetUp(); // Ensure schema is the correct one. - test::destroyCqlSchema(false, true); - test::createCqlSchema(false, true); + destroyCqlSchema(false, true); + createCqlSchema(false, true); // Connect to the database try { - HostMgr::addBackend(test::validCqlConnectionString()); + HostMgr::addBackend(validCqlConnectionString()); } catch (...) { std::cerr << "*** ERROR: unable to open database. The test\n" "*** environment is broken and must be fixed before\n" @@ -879,7 +881,7 @@ void CQLHostMgrTest::TearDown() { HostMgr::instance().getHostDataSource()->rollback(); HostMgr::delBackend("cql"); - test::destroyCqlSchema(false, true); + destroyCqlSchema(false, true); } // This test verifies that reservations for a particular client can diff --git a/src/lib/dhcpsrv/tests/mysql_host_data_source_unittest.cc b/src/lib/dhcpsrv/tests/mysql_host_data_source_unittest.cc index 898d32add3..32c0272ec3 100644 --- a/src/lib/dhcpsrv/tests/mysql_host_data_source_unittest.cc +++ b/src/lib/dhcpsrv/tests/mysql_host_data_source_unittest.cc @@ -12,11 +12,11 @@ #include #include #include -#include #include #include #include #include +#include #include @@ -29,6 +29,7 @@ using namespace isc; using namespace isc::asiolink; using namespace isc::db; +using namespace isc::db::test; using namespace isc::dhcp; using namespace isc::dhcp::test; using namespace isc::data; diff --git a/src/lib/dhcpsrv/tests/mysql_lease_mgr_unittest.cc b/src/lib/dhcpsrv/tests/mysql_lease_mgr_unittest.cc index e2ce91b2a6..851fbc777a 100644 --- a/src/lib/dhcpsrv/tests/mysql_lease_mgr_unittest.cc +++ b/src/lib/dhcpsrv/tests/mysql_lease_mgr_unittest.cc @@ -11,9 +11,9 @@ #include #include #include -#include #include #include +#include #include @@ -26,6 +26,7 @@ using namespace isc; using namespace isc::asiolink; using namespace isc::db; +using namespace isc::db::test; using namespace isc::dhcp; using namespace isc::dhcp::test; using namespace std; @@ -565,15 +566,15 @@ TEST_F(MySqlLeaseMgrTest, DISABLED_wipeLeases6) { class MySQLLeaseMgrDbLostCallbackTest : public LeaseMgrDbLostCallbackTest { public: virtual void destroySchema() { - test::destroyMySQLSchema(); + destroyMySQLSchema(); } virtual void createSchema() { - test::createMySQLSchema(); + createMySQLSchema(); } virtual std::string validConnectString() { - return (test::validMySQLConnectionString()); + return (validMySQLConnectionString()); } virtual std::string invalidConnectString() { diff --git a/src/lib/dhcpsrv/tests/pgsql_host_data_source_unittest.cc b/src/lib/dhcpsrv/tests/pgsql_host_data_source_unittest.cc index ef43d53e6b..89bd6db260 100644 --- a/src/lib/dhcpsrv/tests/pgsql_host_data_source_unittest.cc +++ b/src/lib/dhcpsrv/tests/pgsql_host_data_source_unittest.cc @@ -12,11 +12,11 @@ #include #include #include -#include #include #include #include #include +#include #include @@ -29,6 +29,7 @@ using namespace isc; using namespace isc::asiolink; using namespace isc::db; +using namespace isc::db::test; using namespace isc::dhcp; using namespace isc::dhcp::test; using namespace isc::data; diff --git a/src/lib/dhcpsrv/tests/pgsql_lease_mgr_unittest.cc b/src/lib/dhcpsrv/tests/pgsql_lease_mgr_unittest.cc index 27ae1e1cbe..2bc544cafd 100644 --- a/src/lib/dhcpsrv/tests/pgsql_lease_mgr_unittest.cc +++ b/src/lib/dhcpsrv/tests/pgsql_lease_mgr_unittest.cc @@ -7,13 +7,13 @@ #include #include +#include #include #include #include #include -#include #include -#include +#include #include @@ -26,6 +26,7 @@ using namespace isc; using namespace isc::asiolink; using namespace isc::db; +using namespace isc::db::test; using namespace isc::dhcp; using namespace isc::dhcp::test; using namespace std; @@ -200,15 +201,15 @@ TEST(PgSqlOpenTest, OpenDatabase) { class PgSqlLeaseMgrDbLostCallbackTest : public LeaseMgrDbLostCallbackTest { public: virtual void destroySchema() { - test::destroyPgSQLSchema(); + destroyPgSQLSchema(); } virtual void createSchema() { - test::createPgSQLSchema(); + createPgSQLSchema(); } virtual std::string validConnectString() { - return (test::validPgSQLConnectionString()); + return (validPgSQLConnectionString()); } virtual std::string invalidConnectString() { diff --git a/src/lib/dhcpsrv/testutils/Makefile.am b/src/lib/dhcpsrv/testutils/Makefile.am index 02f446e2c5..a56e0e6eb0 100644 --- a/src/lib/dhcpsrv/testutils/Makefile.am +++ b/src/lib/dhcpsrv/testutils/Makefile.am @@ -17,20 +17,8 @@ libdhcpsrvtest_la_SOURCES += dhcp4o6_test_ipc.cc dhcp4o6_test_ipc.h libdhcpsrvtest_la_SOURCES += host_data_source_utils.cc host_data_source_utils.h libdhcpsrvtest_la_SOURCES += memory_host_data_source.cc memory_host_data_source.h libdhcpsrvtest_la_SOURCES += generic_host_data_source_unittest.cc generic_host_data_source_unittest.h - -libdhcpsrvtest_la_SOURCES += schema.cc schema.h libdhcpsrvtest_la_SOURCES += lease_file_io.cc lease_file_io.h -if HAVE_MYSQL -libdhcpsrvtest_la_SOURCES += mysql_schema.cc mysql_schema.h -endif -if HAVE_PGSQL -libdhcpsrvtest_la_SOURCES += pgsql_schema.cc pgsql_schema.h -endif -if HAVE_CQL -libdhcpsrvtest_la_SOURCES += cql_schema.cc cql_schema.h -endif - libdhcpsrvtest_la_CXXFLAGS = $(AM_CXXFLAGS) libdhcpsrvtest_la_CPPFLAGS = $(AM_CPPFLAGS) $(GTEST_INCLUDES) diff --git a/src/lib/dhcpsrv/testutils/cql_schema.h b/src/lib/dhcpsrv/testutils/cql_schema.h index 91377f96db..d47a3d23c1 100644 --- a/src/lib/dhcpsrv/testutils/cql_schema.h +++ b/src/lib/dhcpsrv/testutils/cql_schema.h @@ -1,4 +1,4 @@ -// Copyright (C) 2015-2016 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2015-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -8,7 +8,7 @@ #define TEST_CQL_SCHEMA_H #include -#include +#include #include namespace isc { diff --git a/src/lib/dhcpsrv/testutils/generic_host_data_source_unittest.cc b/src/lib/dhcpsrv/testutils/generic_host_data_source_unittest.cc index e6b797f0c4..ce14d9192f 100644 --- a/src/lib/dhcpsrv/testutils/generic_host_data_source_unittest.cc +++ b/src/lib/dhcpsrv/testutils/generic_host_data_source_unittest.cc @@ -19,7 +19,7 @@ #include #include #include -#include +#include #include #include @@ -35,6 +35,7 @@ using namespace std; using namespace isc::asiolink; using namespace isc::db; +using namespace isc::db::test; using namespace isc::util; using namespace isc::data; diff --git a/src/lib/mysql/Makefile.am b/src/lib/mysql/Makefile.am index fd2a8336e4..8852b7e813 100644 --- a/src/lib/mysql/Makefile.am +++ b/src/lib/mysql/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = . +SUBDIRS = . testutils AM_CPPFLAGS = -I$(top_srcdir)/src/lib -I$(top_builddir)/src/lib AM_CPPFLAGS += $(BOOST_INCLUDES) $(MYSQL_CPPFLAGS) diff --git a/src/lib/mysql/testutils/Makefile.am b/src/lib/mysql/testutils/Makefile.am new file mode 100644 index 0000000000..64680e639f --- /dev/null +++ b/src/lib/mysql/testutils/Makefile.am @@ -0,0 +1,23 @@ +SUBDIRS = . + +AM_CPPFLAGS = -I$(top_builddir)/src/lib -I$(top_srcdir)/src/lib +AM_CPPFLAGS += -DDATABASE_SCRIPTS_DIR=\"$(abs_top_srcdir)/src/share/database/scripts\" +AM_CPPFLAGS += $(BOOST_INCLUDES) + +AM_CXXFLAGS = $(KEA_CXXFLAGS) + +CLEANFILES = *.gcno *.gcda + +if HAVE_GTEST + +noinst_LTLIBRARIES = libmysqltest.la + +libmysqltest_la_SOURCES = mysql_schema.cc mysql_schema.h + +libmysqltest_la_CXXFLAGS = $(AM_CXXFLAGS) +libmysqltest_la_CPPFLAGS = $(AM_CPPFLAGS) $(GTEST_INCLUDES) $(MYSQL_CPPFLAGS) +libmysqltest_la_LDFLAGS = $(AM_LDFLAGS) $(MYSQL_LIBS) + +libmysqltest_la_LIBADD = $(top_builddir)/src/lib/database/testutils/libdatabasetest.la + +endif diff --git a/src/lib/dhcpsrv/testutils/mysql_schema.cc b/src/lib/mysql/testutils/mysql_schema.cc similarity index 94% rename from src/lib/dhcpsrv/testutils/mysql_schema.cc rename to src/lib/mysql/testutils/mysql_schema.cc index c079218135..42bcf0406c 100644 --- a/src/lib/dhcpsrv/testutils/mysql_schema.cc +++ b/src/lib/mysql/testutils/mysql_schema.cc @@ -7,7 +7,7 @@ #include #include #include -#include +#include #include #include @@ -18,7 +18,7 @@ using namespace std; namespace isc { -namespace dhcp { +namespace db { namespace test { const char* MYSQL_VALID_TYPE = "type=mysql"; @@ -58,5 +58,5 @@ void runMySQLScript(const std::string& path, const std::string& script_name, } } // namespace test -} // namespace dhcp +} // namespace db } // namespace isc diff --git a/src/lib/dhcpsrv/testutils/mysql_schema.h b/src/lib/mysql/testutils/mysql_schema.h similarity index 94% rename from src/lib/dhcpsrv/testutils/mysql_schema.h rename to src/lib/mysql/testutils/mysql_schema.h index d0665eb46a..ad2202d5a2 100644 --- a/src/lib/dhcpsrv/testutils/mysql_schema.h +++ b/src/lib/mysql/testutils/mysql_schema.h @@ -1,4 +1,4 @@ -// Copyright (C) 2015-2016 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2015-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -8,11 +8,11 @@ #define TEST_MYSQL_SCHEMA_H #include -#include +#include #include namespace isc { -namespace dhcp { +namespace db { namespace test { extern const char* MYSQL_VALID_TYPE; diff --git a/src/lib/pgsql/Makefile.am b/src/lib/pgsql/Makefile.am index d9dc6515b9..3f92c7f53e 100644 --- a/src/lib/pgsql/Makefile.am +++ b/src/lib/pgsql/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = . tests +SUBDIRS = . testutils tests AM_CPPFLAGS = -I$(top_srcdir)/src/lib -I$(top_builddir)/src/lib AM_CPPFLAGS += $(BOOST_INCLUDES) $(PGSQL_CPPFLAGS) diff --git a/src/lib/dhcpsrv/testutils/pgsql_schema.cc b/src/lib/pgsql/tests/pgsql_schema.cc similarity index 93% rename from src/lib/dhcpsrv/testutils/pgsql_schema.cc rename to src/lib/pgsql/tests/pgsql_schema.cc index fc7d1c3d35..fe26c6c88c 100644 --- a/src/lib/dhcpsrv/testutils/pgsql_schema.cc +++ b/src/lib/pgsql/tests/pgsql_schema.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2016 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2016-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -6,7 +6,7 @@ #include #include -#include +#include #include diff --git a/src/lib/dhcpsrv/testutils/pgsql_schema.h b/src/lib/pgsql/tests/pgsql_schema.h similarity index 100% rename from src/lib/dhcpsrv/testutils/pgsql_schema.h rename to src/lib/pgsql/tests/pgsql_schema.h diff --git a/src/lib/pgsql/testutils/Makefile.am b/src/lib/pgsql/testutils/Makefile.am new file mode 100644 index 0000000000..c46de152e4 --- /dev/null +++ b/src/lib/pgsql/testutils/Makefile.am @@ -0,0 +1,23 @@ +SUBDIRS = . + +AM_CPPFLAGS = -I$(top_builddir)/src/lib -I$(top_srcdir)/src/lib +AM_CPPFLAGS += -DDATABASE_SCRIPTS_DIR=\"$(abs_top_srcdir)/src/share/database/scripts\" +AM_CPPFLAGS += $(BOOST_INCLUDES) + +AM_CXXFLAGS = $(KEA_CXXFLAGS) + +CLEANFILES = *.gcno *.gcda + +if HAVE_GTEST + +noinst_LTLIBRARIES = libpgsqltest.la + +libpgsqltest_la_SOURCES = pgsql_schema.cc pgsql_schema.h + +libpgsqltest_la_CXXFLAGS = $(AM_CXXFLAGS) +libpgsqltest_la_CPPFLAGS = $(AM_CPPFLAGS) $(GTEST_INCLUDES) $(PGSQL_CPPFLAGS) +libpgsqltest_la_LDFLAGS = $(AM_LDFLAGS) $(PGSQL_LIBS) + +libpgsqltest_la_LIBADD = $(top_builddir)/src/lib/database/testutils/libdatabasetest.la + +endif diff --git a/src/lib/pgsql/testutils/pgsql_schema.cc b/src/lib/pgsql/testutils/pgsql_schema.cc new file mode 100644 index 0000000000..1d4ab1b8ac --- /dev/null +++ b/src/lib/pgsql/testutils/pgsql_schema.cc @@ -0,0 +1,64 @@ +// Copyright (C) 2016-2018 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#include +#include +#include + +#include + +#include +#include +#include +#include + +using namespace std; + +namespace isc { +namespace db { +namespace test { + +const char* PGSQL_VALID_TYPE = "type=postgresql"; + +string +validPgSQLConnectionString() { + return (connectionString(PGSQL_VALID_TYPE, VALID_NAME, VALID_HOST, + VALID_USER, VALID_PASSWORD)); +} + +void destroyPgSQLSchema(bool show_err) { + runPgSQLScript(DATABASE_SCRIPTS_DIR, "pgsql/dhcpdb_drop.pgsql", show_err); +} + +void createPgSQLSchema(bool show_err) { + runPgSQLScript(DATABASE_SCRIPTS_DIR, "pgsql/dhcpdb_create.pgsql", show_err); +} + +void runPgSQLScript(const std::string& path, const std::string& script_name, + bool show_err) { + std::ostringstream cmd; + + cmd << "export PGPASSWORD=keatest; cat "; + if (!path.empty()) { + cmd << " < " << path << "/"; + } + + cmd << script_name + << " | psql --set ON_ERROR_STOP=1 -A -t -h localhost -q -U keatest -d keatest"; + + if (!show_err) { + cmd << " 2>/dev/null "; + } + + int retval = ::system(cmd.str().c_str()); + if (retval) { + std::cerr << "runPgSQLSchema failed:" << cmd.str() << std::endl; + } +} + +} // namespace test +} // namespace dhcp +} // namespace isc diff --git a/src/lib/pgsql/testutils/pgsql_schema.h b/src/lib/pgsql/testutils/pgsql_schema.h new file mode 100644 index 0000000000..8f07ceb6cb --- /dev/null +++ b/src/lib/pgsql/testutils/pgsql_schema.h @@ -0,0 +1,68 @@ +// Copyright (C) 2016-2018 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#ifndef TEST_PGSQL_SCHEMA_H +#define TEST_PGSQL_SCHEMA_H + +#include +#include +#include + +namespace isc { +namespace db { +namespace test { + +extern const char* PGSQL_VALID_TYPE; + +/// Return valid connection string +/// +/// @return valid PgSQL connection string. +std::string validPgSQLConnectionString(); + +/// @brief Clear everything from the database +/// +/// Submits the current schema drop script: +/// +/// /pgsql/dhcpdb_drop.pgsql +/// +/// to the unit test Postgresql database. If the script fails, the invoking +/// test will fail. The output of stderr is suppressed unless the parameter, +/// show_err is true. +/// +/// @param show_err flag which governs whether or not stderr is suppressed. +void destroyPgSQLSchema(bool show_err = false); + +/// @brief Create the Postgresql Schema +/// +/// Submits the current schema creation script: +/// +/// /pgsql/dhcpdb_create.pgsql +/// +/// to the unit test Postgresql database. If the script fails, the invoking +/// test will fail. The output of stderr is suppressed unless the parameter, +/// show_err is true. +/// +/// @param show_err flag which governs whether or not stderr is suppressed. +void createPgSQLSchema(bool show_err = false); + +/// @brief Run a PgSQL SQL script against the Postgresql unit test database +/// +/// Submits the given SQL script to Postgresql via psql CLI. The output of +/// stderr is suppressed unless the parameter, show_err is true. The is done +/// to suppress warnings that might otherwise make test output needlessly +/// noisy. A gtest assertion occurs if the script fails to execute. +/// +/// @param path - path (if not blank) of the script to execute +/// @param script_name - file name of the path to execute +/// @param show_err flag which governs whether or not stderr is suppressed. +void runPgSQLScript(const std::string& path, const std::string& script_name, + bool show_err); + +}; +}; +}; + +#endif