From 3b75828cf1137d6dbcab63a438980ee1a7a9468a Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sun, 1 Jan 2017 14:50:29 +0000 Subject: Support registering DB mock implementations as factories --- libdbpp/mockDatabase.cpp | 4 ++ libdbpp/mockDatabase.h | 1 + libdbpp/unittests/Jamfile.jam | 4 +- libdbpp/unittests/mockdb.cpp | 88 ++++++++++++++++++++++++++++++++++++ libdbpp/unittests/mockdb.h | 34 ++++++++++++++ libdbpp/unittests/testConnection.cpp | 34 +------------- libdbpp/unittests/testMock.cpp | 33 +++++++++++--- 7 files changed, 157 insertions(+), 41 deletions(-) create mode 100644 libdbpp/unittests/mockdb.cpp create mode 100644 libdbpp/unittests/mockdb.h diff --git a/libdbpp/mockDatabase.cpp b/libdbpp/mockDatabase.cpp index 8951189..ddc13af 100644 --- a/libdbpp/mockDatabase.cpp +++ b/libdbpp/mockDatabase.cpp @@ -1,8 +1,11 @@ +#define BOOST_FILESYSTEM_DYN_LINK +#define BOOST_FILESYSTEM_SOURCE #include "mockDatabase.h" #include #include #include #include +#include namespace AdHoc { template <> @@ -14,6 +17,7 @@ namespace AdHoc { } } INSTANTIATEPLUGINOF(DB::MockDatabase); +INSTANTIATEFACTORY(DB::MockDatabase, const std::string &, const std::string &, const std::vector &); namespace DB { diff --git a/libdbpp/mockDatabase.h b/libdbpp/mockDatabase.h index d6d2328..5d3ee52 100644 --- a/libdbpp/mockDatabase.h +++ b/libdbpp/mockDatabase.h @@ -63,6 +63,7 @@ class DLL_PUBLIC MockServerDatabase : public MockDatabase { const std::string testDbName; }; +typedef AdHoc::Factory &> MockDatabaseFactory; } #endif diff --git a/libdbpp/unittests/Jamfile.jam b/libdbpp/unittests/Jamfile.jam index 93b26b3..45c069d 100644 --- a/libdbpp/unittests/Jamfile.jam +++ b/libdbpp/unittests/Jamfile.jam @@ -6,7 +6,7 @@ lib boost_utf : : boost_unit_test_framework ; lib IceUtil ; run - testConnection.cpp + testConnection.cpp mockdb.cpp : : : ROOT=\"$(me)\" BOOST_TEST_DYN_LINK @@ -70,7 +70,7 @@ run ; run - testMock.cpp + testMock.cpp mockdb.cpp : : : ROOT=\"$(me)\" BOOST_TEST_DYN_LINK diff --git a/libdbpp/unittests/mockdb.cpp b/libdbpp/unittests/mockdb.cpp new file mode 100644 index 0000000..6ae6810 --- /dev/null +++ b/libdbpp/unittests/mockdb.cpp @@ -0,0 +1,88 @@ +#include "mockdb.h" + +// LCOV_EXCL_START + +MockDb::MockDb(const std::string &) +{ +} + +void +MockDb::beginTxInt() +{ +} + +void +MockDb::commitTxInt() +{ +} +void +MockDb::rollbackTxInt() +{ +} +void +MockDb::ping() const +{ + +} + +DB::BulkDeleteStyle +MockDb::bulkDeleteStyle() const +{ + return DB::BulkDeleteUsingUsing; +} + +DB::BulkUpdateStyle +MockDb::bulkUpdateStyle() const +{ + return DB::BulkUpdateUsingJoin; +} + +void +MockDb::execute(const std::string & sql) +{ + if (sql.substr(0, 3) == "Not") { + throw DB::Error(); + } + executed.push_back(sql); +} + +DB::SelectCommand * +MockDb::newSelectCommand(const std::string &) +{ + return nullptr; +} + +DB::ModifyCommand * +MockDb::newModifyCommand(const std::string &) +{ + return nullptr; +} + +MockMock::MockMock(const std::string &, const std::string & name, const std::vector & ss) : + DB::MockDatabase(name) +{ + CreateNewDatabase(); + PlaySchemaScripts(ss); +} + +DB::Connection * +MockMock::openConnection() const +{ + return new MockDb(""); +} + +void +MockMock::CreateNewDatabase() const +{ +} + +void +MockMock::DropDatabase() const +{ +} + +FACTORY(MockMock, DB::MockDatabaseFactory); +FACTORY(MockDb, DB::ConnectionFactory); + +// LCOV_EXCL_STOP + diff --git a/libdbpp/unittests/mockdb.h b/libdbpp/unittests/mockdb.h new file mode 100644 index 0000000..cd6fb26 --- /dev/null +++ b/libdbpp/unittests/mockdb.h @@ -0,0 +1,34 @@ +#ifndef DB_MOCKDB_H +#define DB_MOCKDB_H + +#include "../connection.h" +#include "../mockDatabase.h" + +class MockDb : public DB::Connection { + public: + MockDb(const std::string &); + + void beginTxInt() override; + void commitTxInt() override; + void rollbackTxInt() override; + void ping() const override; + DB::BulkDeleteStyle bulkDeleteStyle() const override; + DB::BulkUpdateStyle bulkUpdateStyle() const override; + + void execute(const std::string & sql) override; + DB::SelectCommand * newSelectCommand(const std::string &) override; + DB::ModifyCommand * newModifyCommand(const std::string &) override; + + mutable std::vector executed; +}; + +class MockMock : public DB::MockDatabase { + public: + MockMock(const std::string &, const std::string &, const std::vector &); + DB::Connection * openConnection() const override; + void CreateNewDatabase() const override; + void DropDatabase() const override; +}; + +#endif + diff --git a/libdbpp/unittests/testConnection.cpp b/libdbpp/unittests/testConnection.cpp index d4b1610..f1df3b0 100644 --- a/libdbpp/unittests/testConnection.cpp +++ b/libdbpp/unittests/testConnection.cpp @@ -8,39 +8,7 @@ #include #include #include - -// LCOV_EXCL_START -class MockDb : public DB::Connection { - public: - MockDb(const std::string &) {} - - void beginTxInt() override { } - void commitTxInt() override { } - void rollbackTxInt() override { } - void ping() const override {} - DB::BulkDeleteStyle bulkDeleteStyle() const override { return DB::BulkDeleteUsingUsing; } - DB::BulkUpdateStyle bulkUpdateStyle() const override { return DB::BulkUpdateUsingJoin; } - - void execute(const std::string & sql) override { - executed.push_back(sql); - } - DB::SelectCommand * newSelectCommand(const std::string &) override { return nullptr; } - DB::ModifyCommand * newModifyCommand(const std::string &) override { return nullptr; } - - mutable std::vector executed; -}; -// LCOV_EXCL_STOP - -FACTORY(MockDb, DB::ConnectionFactory); - -BOOST_AUTO_TEST_CASE( plugins ) -{ - auto pm = AdHoc::PluginManager::getDefault(); - BOOST_REQUIRE(pm); - BOOST_REQUIRE_EQUAL(1, pm->count()); - BOOST_REQUIRE_EQUAL(1, pm->getAll().size()); - BOOST_REQUIRE_EQUAL(1, pm->getAll().size()); -} +#include "mockdb.h" BOOST_AUTO_TEST_CASE( create ) { diff --git a/libdbpp/unittests/testMock.cpp b/libdbpp/unittests/testMock.cpp index 0b1efd5..add0720 100644 --- a/libdbpp/unittests/testMock.cpp +++ b/libdbpp/unittests/testMock.cpp @@ -3,20 +3,41 @@ #include #include -#include -#include "error.h" +#include "../error.h" +#include "../mockDatabase.h" +#include "mockdb.h" + +BOOST_AUTO_TEST_CASE( noFactory ) +{ + BOOST_REQUIRE_THROW({ + DB::MockDatabaseFactory::get("not-found"); + }, AdHoc::NoSuchPluginException); +} + +BOOST_AUTO_TEST_CASE( mockFactory ) +{ + auto f = DB::MockDatabaseFactory::get("MockMock"); + BOOST_REQUIRE(f); + auto m = f->create("", typeid(this).name(), {}); + BOOST_REQUIRE(m); + auto c = m->openConnection(); + BOOST_REQUIRE(c); + BOOST_REQUIRE_EQUAL(typeid(MockDb), typeid(*c)); +} BOOST_AUTO_TEST_CASE( missingMock ) { BOOST_REQUIRE_THROW({ - PQ::Mock m ("user=postgres dbname=postgres", "pqmock", { rootDir / "missing.sql" }); - }, std::fstream::failure); + DB::MockDatabaseFactory::createNew("MockMock", + "user=postgres dbname=postgres", typeid(this).name(), { rootDir / "missing.sql" }); + }, std::fstream::failure); } BOOST_AUTO_TEST_CASE( failingMock ) { BOOST_REQUIRE_THROW({ - PQ::Mock m ("user=postgres dbname=postgres", "pqmock", { rootDir / "badMock.sql" }); - }, DB::Error); + DB::MockDatabaseFactory::createNew("MockMock", + "user=postgres dbname=postgres", typeid(this).name(), { rootDir / "badMock.sql" }); + }, DB::Error); } -- cgit v1.2.3