From a69c0def96cfb8d6a3e766f3f18ba5cb2e9bf67c Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Sat, 26 Jan 2019 23:22:21 +0100 Subject: [PATCH] [406-update-cb_cmds-with-get-commands] Added toElement to BackendSelector --- src/lib/database/backend_selector.cc | 18 +++++++++++- src/lib/database/backend_selector.h | 14 +++++++-- src/lib/database/tests/Makefile.am | 1 + .../tests/backend_selector_unittest.cc | 29 ++++++++++++++++++- 4 files changed, 57 insertions(+), 5 deletions(-) diff --git a/src/lib/database/backend_selector.cc b/src/lib/database/backend_selector.cc index e3ab92d96c..cea5a53c5a 100644 --- a/src/lib/database/backend_selector.cc +++ b/src/lib/database/backend_selector.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2018 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2018-2019 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 @@ -109,6 +109,22 @@ BackendSelector::toText() const { return (text); } +ElementPtr +BackendSelector::toElement() const { + if (backend_type_ == BackendSelector::Type::UNSPEC) { + isc_throw(BadValue, "toElement: backend selector type is unspecified"); + } + ElementPtr result = Element::createMap(); + result->set("type", Element::create(backendTypeToString(backend_type_))); + if (!host_.empty()) { + result->set("host", Element::create(host_)); + if (port_ > 0) { + result->set("port", Element::create(static_cast(port_))); + } + } + return (result); +} + BackendSelector::Type BackendSelector::stringToBackendType(const std::string& type) { if (type == "mysql") { diff --git a/src/lib/database/backend_selector.h b/src/lib/database/backend_selector.h index 7d256a037a..0628c0e5ae 100644 --- a/src/lib/database/backend_selector.h +++ b/src/lib/database/backend_selector.h @@ -1,4 +1,4 @@ -// Copyright (C) 2018 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2018-2019 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,6 +8,7 @@ #define BACKEND_SELECTOR_H #include +#include #include #include @@ -51,7 +52,7 @@ namespace db { /// /// The @c BackendSelector class may be extended in the future to provide /// additional backend selection criteria. -class BackendSelector { +class BackendSelector : public data::CfgToElement { public: /// @brief Supported database types. @@ -171,6 +172,14 @@ public: /// "type=mysql,host=somehost.example.org,port=1234". std::string toText() const; + /// @brief Unparse a backend selector object. + /// + /// The caller must check if the type is specified before. + /// + /// @return A pointer to unparsed backend selector configuration. + /// @throw BadValue If the backend selector type is unspecified. + virtual data::ElementPtr toElement() const; + /// @brief Converts string to backend type. /// /// @param type Backend type as string. @@ -181,7 +190,6 @@ public: /// @param type Backend type to be converted. static std::string backendTypeToString(const Type& type); - private: /// @brief Checks if the specified selector is valid. diff --git a/src/lib/database/tests/Makefile.am b/src/lib/database/tests/Makefile.am index cdf149b629..c05c29ce92 100644 --- a/src/lib/database/tests/Makefile.am +++ b/src/lib/database/tests/Makefile.am @@ -30,6 +30,7 @@ libdatabase_unittests_CPPFLAGS = $(AM_CPPFLAGS) $(GTEST_INCLUDES) libdatabase_unittests_LDFLAGS = $(AM_LDFLAGS) $(GTEST_LDFLAGS) libdatabase_unittests_LDADD = $(top_builddir)/src/lib/database/libkea-database.la +libdatabase_unittests_LDADD += $(top_builddir)/src/lib/testutils/libkea-testutils.la libdatabase_unittests_LDADD += $(top_builddir)/src/lib/cc/libkea-cc.la libdatabase_unittests_LDADD += $(top_builddir)/src/lib/asiolink/libkea-asiolink.la libdatabase_unittests_LDADD += $(top_builddir)/src/lib/log/libkea-log.la diff --git a/src/lib/database/tests/backend_selector_unittest.cc b/src/lib/database/tests/backend_selector_unittest.cc index 3665d50972..6061e1bd41 100644 --- a/src/lib/database/tests/backend_selector_unittest.cc +++ b/src/lib/database/tests/backend_selector_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2018 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2018-2019 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 @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -169,6 +170,32 @@ TEST(BackendSelectorTest, backendTypeToString) { BackendSelector::backendTypeToString(BackendSelector::Type::CQL)); } +// Tests toElement from backend selectors. +TEST(BackendSelectorTest, backendToElement) { + // Unspecified. + boost::scoped_ptr sel(new BackendSelector()); + EXPECT_THROW(sel->toElement(), BadValue); + + // Unspecified type. + sel.reset(new BackendSelector("myhost", 1234)); + EXPECT_THROW(sel->toElement(), BadValue); + + // Type only. + EXPECT_NO_THROW(sel.reset(new BackendSelector(BackendSelector::Type::MYSQL))); + ElementPtr expected = Element::createMap(); + expected->set("type", Element::create("mysql")); + test::runToElementTest(expected, *sel); + + // Add host. + expected->set("host", Element::create("myhost")); + EXPECT_NO_THROW(sel.reset(new BackendSelector(expected))); + test::runToElementTest(expected, *sel); + + // Add port. + expected->set("port", Element::create(1234L)); + EXPECT_NO_THROW(sel.reset(new BackendSelector(expected))); + test::runToElementTest(expected, *sel); +} } -- 2.47.2