BIND 10 trac1061, updated. 11b8b873e7fd6722053aa224d20f29350bf2b298 [trac1061] Implement finding a zone in DB
BIND 10 source code commits
bind10-changes at lists.isc.org
Mon Aug 1 11:11:33 UTC 2011
The branch, trac1061 has been updated
via 11b8b873e7fd6722053aa224d20f29350bf2b298 (commit)
via b63b9aac20259f3612e23c7a3e977dcb48693ef1 (commit)
via 14a0766224d50d1c4c409e883cf29515dafc25f0 (commit)
via b5fbd9c942b1080aa60a48ee23da60574d1fc22f (commit)
from 63f4617b5ab99d75e98e40760ff68bb1615a84e6 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 11b8b873e7fd6722053aa224d20f29350bf2b298
Author: Michal 'vorner' Vaner <michal.vaner at nic.cz>
Date: Mon Aug 1 13:06:13 2011 +0200
[trac1061] Implement finding a zone in DB
And provide some basics of the ZoneFinder, which does not work, but
compiles at last.
commit b63b9aac20259f3612e23c7a3e977dcb48693ef1
Author: Michal 'vorner' Vaner <michal.vaner at nic.cz>
Date: Mon Aug 1 13:04:40 2011 +0200
[trac1061] Don't return reference
While it works for in-memory zone and similar, it can't be done with
databases, as the database returns some primitive data and it must be
created on the spot.
commit 14a0766224d50d1c4c409e883cf29515dafc25f0
Author: Michal 'vorner' Vaner <michal.vaner at nic.cz>
Date: Mon Aug 1 12:03:35 2011 +0200
[trac1061] Test for constructor exception
commit b5fbd9c942b1080aa60a48ee23da60574d1fc22f
Author: Michal 'vorner' Vaner <michal.vaner at nic.cz>
Date: Mon Aug 1 11:47:37 2011 +0200
[trac1061] Tests for finding of the zone.
-----------------------------------------------------------------------
Summary of changes:
src/bin/auth/tests/query_unittest.cc | 4 +-
src/lib/datasrc/database.cc | 64 ++++++++++++++++++
src/lib/datasrc/database.h | 28 +++++++--
src/lib/datasrc/memory_datasrc.cc | 4 +-
src/lib/datasrc/memory_datasrc.h | 4 +-
src/lib/datasrc/tests/Makefile.am | 1 +
src/lib/datasrc/tests/database_unittest.cc | 99 ++++++++++++++++++++++++++++
src/lib/datasrc/zone.h | 4 +-
8 files changed, 195 insertions(+), 13 deletions(-)
create mode 100644 src/lib/datasrc/tests/database_unittest.cc
-----------------------------------------------------------------------
diff --git a/src/bin/auth/tests/query_unittest.cc b/src/bin/auth/tests/query_unittest.cc
index 6a75856..9ef8c13 100644
--- a/src/bin/auth/tests/query_unittest.cc
+++ b/src/bin/auth/tests/query_unittest.cc
@@ -122,8 +122,8 @@ public:
masterLoad(zone_stream, origin_, rrclass_,
boost::bind(&MockZoneFinder::loadRRset, this, _1));
}
- virtual const isc::dns::Name& getOrigin() const { return (origin_); }
- virtual const isc::dns::RRClass& getClass() const { return (rrclass_); }
+ virtual isc::dns::Name getOrigin() const { return (origin_); }
+ virtual isc::dns::RRClass getClass() const { return (rrclass_); }
virtual FindResult find(const isc::dns::Name& name,
const isc::dns::RRType& type,
RRsetList* target = NULL,
diff --git a/src/lib/datasrc/database.cc b/src/lib/datasrc/database.cc
index 71014d2..5fe9f7b 100644
--- a/src/lib/datasrc/database.cc
+++ b/src/lib/datasrc/database.cc
@@ -14,8 +14,72 @@
#include <datasrc/database.h>
+#include <exceptions/exceptions.h>
+#include <dns/name.h>
+
+using isc::dns::Name;
+
namespace isc {
namespace datasrc {
+DatabaseClient::DatabaseClient(std::auto_ptr<DatabaseConnection> connection) :
+ connection_(connection)
+{
+ if (connection_.get() == NULL) {
+ isc_throw(isc::InvalidParameter,
+ "No connection provided to DatabaseClient");
+ }
+}
+
+DataSourceClient::FindResult
+DatabaseClient::findZone(const Name& name) const {
+ std::pair<bool, int> zone(connection_->getZone(name));
+ // Try exact first
+ if (zone.first) {
+ return (FindResult(result::SUCCESS,
+ ZoneFinderPtr(new Finder(*connection_,
+ zone.second))));
+ }
+ // Than super domains
+ // Start from 1, as 0 is covered above
+ for (size_t i(1); i < name.getLabelCount(); ++i) {
+ zone = connection_->getZone(name.split(i));
+ if (zone.first) {
+ return (FindResult(result::PARTIALMATCH,
+ ZoneFinderPtr(new Finder(*connection_,
+ zone.second))));
+ }
+ }
+ // No, really nothing
+ return (FindResult(result::NOTFOUND, ZoneFinderPtr()));
+}
+
+DatabaseClient::Finder::Finder(DatabaseConnection& connection, int zone_id) :
+ connection_(connection),
+ zone_id_(zone_id)
+{ }
+
+ZoneFinder::FindResult
+DatabaseClient::Finder::find(const isc::dns::Name&,
+ const isc::dns::RRType&,
+ isc::dns::RRsetList*,
+ const FindOptions) const
+{
+ // TODO Implement
+ return (FindResult(SUCCESS, isc::dns::ConstRRsetPtr()));
+}
+
+Name
+DatabaseClient::Finder::getOrigin() const {
+ // TODO Implement
+ return (Name("."));
+}
+
+isc::dns::RRClass
+DatabaseClient::Finder::getClass() const {
+ // TODO Implement
+ return isc::dns::RRClass::IN();
+}
+
}
}
diff --git a/src/lib/datasrc/database.h b/src/lib/datasrc/database.h
index e949ec3..5693479 100644
--- a/src/lib/datasrc/database.h
+++ b/src/lib/datasrc/database.h
@@ -70,7 +70,7 @@ public:
* be returned - the ID is only passed back to the connection as
* an opaque handle.
*/
- virtual std::pair<bool, int> getZone(const isc::dns::Name& name) const;
+ virtual std::pair<bool, int> getZone(const isc::dns::Name& name) const = 0;
};
/**
@@ -111,7 +111,7 @@ public:
* suggests, the client takes ownership of the connection and will
* delete it when itself deleted.
*/
- DatabaseClient(const std::auto_ptr<DatabaseConnection>& connection);
+ DatabaseClient(std::auto_ptr<DatabaseConnection> connection);
/**
* \brief Corresponding ZoneFinder implementation
*
@@ -139,13 +139,31 @@ public:
* calls to the connection.
*/
Finder(DatabaseConnection& connection, int zone_id);
- virtual const isc::dns::Name& getOrigin() const;
- virtual const isc::dns::RRClass& getClass() const;
+ virtual isc::dns::Name getOrigin() const;
+ virtual isc::dns::RRClass getClass() const;
virtual FindResult find(const isc::dns::Name& name,
const isc::dns::RRType& type,
isc::dns::RRsetList* target = NULL,
const FindOptions options = FIND_DEFAULT)
- const = 0;
+ const;
+ /**
+ * \brief The zone ID
+ *
+ * This function provides the stored zone ID as passed to the
+ * constructor. This is meant for testing purposes and normal
+ * applications shouldn't need it.
+ */
+ int zone_id() const { return (zone_id_); }
+ /**
+ * \brief The database connection.
+ *
+ * This function provides the database connection stored inside as
+ * passed to the constructor. This is meant for testing purposes and
+ * normal applications shouldn't need it.
+ */
+ const DatabaseConnection& connection() const {
+ return (connection_);
+ }
private:
DatabaseConnection& connection_;
const int zone_id_;
diff --git a/src/lib/datasrc/memory_datasrc.cc b/src/lib/datasrc/memory_datasrc.cc
index 3d24ce0..26223da 100644
--- a/src/lib/datasrc/memory_datasrc.cc
+++ b/src/lib/datasrc/memory_datasrc.cc
@@ -606,12 +606,12 @@ InMemoryZoneFinder::~InMemoryZoneFinder() {
delete impl_;
}
-const Name&
+Name
InMemoryZoneFinder::getOrigin() const {
return (impl_->origin_);
}
-const RRClass&
+RRClass
InMemoryZoneFinder::getClass() const {
return (impl_->zone_class_);
}
diff --git a/src/lib/datasrc/memory_datasrc.h b/src/lib/datasrc/memory_datasrc.h
index 9bed960..9707797 100644
--- a/src/lib/datasrc/memory_datasrc.h
+++ b/src/lib/datasrc/memory_datasrc.h
@@ -58,10 +58,10 @@ public:
//@}
/// \brief Returns the origin of the zone.
- virtual const isc::dns::Name& getOrigin() const;
+ virtual isc::dns::Name getOrigin() const;
/// \brief Returns the class of the zone.
- virtual const isc::dns::RRClass& getClass() const;
+ virtual isc::dns::RRClass getClass() const;
/// \brief Looks up an RRset in the zone.
///
diff --git a/src/lib/datasrc/tests/Makefile.am b/src/lib/datasrc/tests/Makefile.am
index fbcf9c9..9cfd0d8 100644
--- a/src/lib/datasrc/tests/Makefile.am
+++ b/src/lib/datasrc/tests/Makefile.am
@@ -28,6 +28,7 @@ run_unittests_SOURCES += rbtree_unittest.cc
run_unittests_SOURCES += zonetable_unittest.cc
run_unittests_SOURCES += memory_datasrc_unittest.cc
run_unittests_SOURCES += logger_unittest.cc
+run_unittests_SOURCES += database_unittest.cc
run_unittests_CPPFLAGS = $(AM_CPPFLAGS) $(GTEST_INCLUDES)
run_unittests_LDFLAGS = $(AM_LDFLAGS) $(GTEST_LDFLAGS)
diff --git a/src/lib/datasrc/tests/database_unittest.cc b/src/lib/datasrc/tests/database_unittest.cc
new file mode 100644
index 0000000..b60d5c0
--- /dev/null
+++ b/src/lib/datasrc/tests/database_unittest.cc
@@ -0,0 +1,99 @@
+// Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
+//
+// Permission to use, copy, modify, and/or distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+// AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+// PERFORMANCE OF THIS SOFTWARE.
+
+#include <gtest/gtest.h>
+
+#include <dns/name.h>
+#include <exceptions/exceptions.h>
+
+#include <datasrc/database.h>
+
+using namespace isc::datasrc;
+using namespace std;
+using namespace boost;
+using isc::dns::Name;
+
+namespace {
+
+/*
+ * A virtual database connection that pretends it contains single zone --
+ * example.org.
+ */
+class MockConnection : public DatabaseConnection {
+public:
+ virtual std::pair<bool, int> getZone(const Name& name) const {
+ if (name == Name("example.org")) {
+ return (std::pair<bool, int>(true, 42));
+ } else {
+ return (std::pair<bool, int>(false, 0));
+ }
+ }
+};
+
+class DatabaseClientTest : public ::testing::Test {
+public:
+ DatabaseClientTest() {
+ createClient();
+ }
+ /*
+ * We initialize the client from a function, so we can call it multiple
+ * times per test.
+ */
+ void createClient() {
+ current_connection_ = new MockConnection();
+ client_.reset(new DatabaseClient(auto_ptr<DatabaseConnection>(
+ current_connection_)));
+ }
+ // Will be deleted by client_, just keep the current value for comparison.
+ MockConnection* current_connection_;
+ auto_ptr<DatabaseClient> client_;
+ /**
+ * Check the zone finder is a valid one and references the zone ID and
+ * connection available here.
+ */
+ void checkZoneFinder(const DataSourceClient::FindResult& zone) {
+ ASSERT_NE(ZoneFinderPtr(), zone.zone_finder) << "No zone finder";
+ shared_ptr<DatabaseClient::Finder> finder(
+ dynamic_pointer_cast<DatabaseClient::Finder>(zone.zone_finder));
+ ASSERT_NE(shared_ptr<DatabaseClient::Finder>(), finder) <<
+ "Wrong type of finder";
+ EXPECT_EQ(42, finder->zone_id());
+ EXPECT_EQ(current_connection_, &finder->connection());
+ }
+};
+
+TEST_F(DatabaseClientTest, zoneNotFound) {
+ DataSourceClient::FindResult zone(client_->findZone(Name("example.com")));
+ EXPECT_EQ(result::NOTFOUND, zone.code);
+}
+
+TEST_F(DatabaseClientTest, exactZone) {
+ DataSourceClient::FindResult zone(client_->findZone(Name("example.org")));
+ EXPECT_EQ(result::SUCCESS, zone.code);
+ checkZoneFinder(zone);
+}
+
+TEST_F(DatabaseClientTest, superZone) {
+ DataSourceClient::FindResult zone(client_->findZone(Name(
+ "sub.example.org")));
+ EXPECT_EQ(result::PARTIALMATCH, zone.code);
+ checkZoneFinder(zone);
+}
+
+TEST_F(DatabaseClientTest, noConnException) {
+ EXPECT_THROW(DatabaseClient(auto_ptr<DatabaseConnection>()),
+ isc::InvalidParameter);
+}
+
+}
diff --git a/src/lib/datasrc/zone.h b/src/lib/datasrc/zone.h
index 69785f0..f67ed4b 100644
--- a/src/lib/datasrc/zone.h
+++ b/src/lib/datasrc/zone.h
@@ -131,10 +131,10 @@ public:
/// These methods should never throw an exception.
//@{
/// Return the origin name of the zone.
- virtual const isc::dns::Name& getOrigin() const = 0;
+ virtual isc::dns::Name getOrigin() const = 0;
/// Return the RR class of the zone.
- virtual const isc::dns::RRClass& getClass() const = 0;
+ virtual isc::dns::RRClass getClass() const = 0;
//@}
///
More information about the bind10-changes
mailing list