Commit 8e93f114 authored by Michal 'vorner' Vaner's avatar Michal 'vorner' Vaner
Browse files

[1483] Port the ANY logic in memory datasource

To the new interface. The tests were reintroduced.
parent 118d0d9c
......@@ -390,6 +390,14 @@ DatabaseClient::Finder::findNSECCover(const Name& name) {
return (RRsetPtr());
}
ZoneFinder::FindResult
DatabaseClient::Finder::findAll(const isc::dns::Name&,
std::vector<isc::dns::ConstRRsetPtr>&,
const FindOptions)
{
isc_throw(isc::NotImplemented, "Not implemented");
}
ZoneFinder::FindResult
DatabaseClient::Finder::find(const isc::dns::Name& name,
const isc::dns::RRType& type,
......
......@@ -782,6 +782,16 @@ public:
virtual FindResult find(const isc::dns::Name& name,
const isc::dns::RRType& type,
const FindOptions options = FIND_DEFAULT);
/**
* \brief Implementation of the ZoneFinder::findAll method.
*
* In short, it is mostly the same thing as find, but it returns all
* RRsets in the named node through the target parameter in successful
* case. It acts the same in the unsuccessful one.
*/
virtual FindResult findAll(const isc::dns::Name& name,
std::vector<isc::dns::ConstRRsetPtr>& target,
const FindOptions options = FIND_DEFAULT);
/**
* \brief Implementation of ZoneFinder::findPreviousName method.
......
......@@ -421,8 +421,9 @@ struct InMemoryZoneFinder::InMemoryZoneFinderImpl {
}
// Implementation of InMemoryZoneFinder::find
FindResult find(const Name& name, RRType type, const FindOptions options)
const
FindResult find(const Name& name, RRType type,
std::vector<ConstRRsetPtr> *target,
const FindOptions options) const
{
LOG_DEBUG(logger, DBG_TRACE_BASIC, DATASRC_MEM_FIND).arg(name).
arg(type);
......@@ -566,23 +567,18 @@ struct InMemoryZoneFinder::InMemoryZoneFinderImpl {
}
}
#if 0
TODO: Move this to some other place, new method
// handle type any query
if (target != NULL && !node->getData()->empty()) {
// Empty domain will be handled as NXRRSET by normal processing
for (found = node->getData()->begin();
found != node->getData()->end(); ++found)
{
target->addRRset(
boost::const_pointer_cast<RRset>(prepareRRset(name,
found->second, rename)));
target->push_back(prepareRRset(name, found->second, rename));
}
LOG_DEBUG(logger, DBG_TRACE_DATA, DATASRC_MEM_ANY_SUCCESS).
arg(name);
return (FindResult(SUCCESS, ConstRRsetPtr()));
}
#endif
found = node->getData()->find(type);
if (found != node->getData()->end()) {
......@@ -634,7 +630,15 @@ ZoneFinder::FindResult
InMemoryZoneFinder::find(const Name& name, const RRType& type,
const FindOptions options)
{
return (impl_->find(name, type, options));
return (impl_->find(name, type, NULL, options));
}
ZoneFinder::FindResult
InMemoryZoneFinder::findAll(const Name& name,
std::vector<ConstRRsetPtr>& target,
const FindOptions options)
{
return (impl_->find(name, RRType::ANY(), &target, options));
}
result::Result
......
......@@ -69,13 +69,20 @@ public:
///
/// See documentation in \c Zone.
///
/// It returns NULL pointer in case of NXDOMAIN and NXRRSET,
/// and also SUCCESS if target is not NULL(TYPE_ANY query).
/// (the base class documentation does not seem to require that).
/// It returns NULL pointer in case of NXDOMAIN and NXRRSET.
virtual FindResult find(const isc::dns::Name& name,
const isc::dns::RRType& type,
const FindOptions options = FIND_DEFAULT);
/// \brief Version of find that returns all types at once
///
/// It acts the same as find, just that when the correct node is found,
/// all the RRsets are filled into the target parameter instead of being
/// returned by the result.
virtual FindResult findAll(const isc::dns::Name& name,
std::vector<isc::dns::ConstRRsetPtr>& target,
const FindOptions options = FIND_DEFAULT);
/// \brief Imelementation of the ZoneFinder::findPreviousName method
///
/// This one throws NotImplemented exception, as InMemory doesn't
......
......@@ -16,6 +16,7 @@
#include <vector>
#include <boost/bind.hpp>
#include <boost/foreach.hpp>
#include <exceptions/exceptions.h>
......@@ -437,6 +438,32 @@ public:
}
});
}
/**
* \brief Calls the findAll on the finder and checks the result.
*/
std::vector<ConstRRsetPtr> findAllTest(const Name& name,
ZoneFinder::Result result,
size_t expected_size,
InMemoryZoneFinder* finder = NULL,
const ConstRRsetPtr &rrset_result =
ConstRRsetPtr(),
ZoneFinder::FindOptions options =
ZoneFinder::FIND_DEFAULT)
{
if (finder == NULL) {
finder = &zone_finder_;
}
std::vector<ConstRRsetPtr> target;
ZoneFinder::FindResult findResult(finder->findAll(name, target,
options));
EXPECT_EQ(result, findResult.code);
EXPECT_EQ(rrset_result, findResult.rrset);
BOOST_FOREACH(const ConstRRsetPtr& rrset, target) {
EXPECT_EQ(name, rrset->getName());
}
EXPECT_EQ(expected_size, target.size());
return (target);
}
// Internal part of the cancelWildcard test that is multiple times
void doCancelWildcardTest();
};
......@@ -629,33 +656,25 @@ TEST_F(InMemoryZoneFinderTest, delegationNS) {
ZoneFinder::DELEGATION, true, rr_child_ns_);
}
#if 0
TODO: Update to the new interface
TEST_F(InMemoryZoneFinderTest, findAny) {
EXPECT_NO_THROW(EXPECT_EQ(SUCCESS, zone_finder_.add(rr_a_)));
EXPECT_NO_THROW(EXPECT_EQ(SUCCESS, zone_finder_.add(rr_ns_)));
EXPECT_NO_THROW(EXPECT_EQ(SUCCESS, zone_finder_.add(rr_child_glue_)));
// origin
RRsetList origin_rrsets;
findTest(origin_, RRType::ANY(), ZoneFinder::SUCCESS, true,
ConstRRsetPtr(), NULL, &origin_rrsets);
EXPECT_EQ(2, origin_rrsets.size());
EXPECT_EQ(rr_a_, origin_rrsets.findRRset(RRType::A(), RRClass::IN()));
EXPECT_EQ(rr_ns_, origin_rrsets.findRRset(RRType::NS(), RRClass::IN()));
std::vector<ConstRRsetPtr> rrsets(findAllTest(origin_, ZoneFinder::SUCCESS,
2));
EXPECT_FALSE(rrsets.end() == std::find(rrsets.begin(), rrsets.end(),
rr_a_));
EXPECT_FALSE(rrsets.end() == std::find(rrsets.begin(), rrsets.end(),
rr_ns_));
// out zone name
RRsetList out_rrsets;
findTest(Name("example.com"), RRType::ANY(), ZoneFinder::NXDOMAIN, true,
ConstRRsetPtr(), NULL, &out_rrsets);
EXPECT_EQ(0, out_rrsets.size());
RRsetList glue_child_rrsets;
findTest(rr_child_glue_->getName(), RRType::ANY(), ZoneFinder::SUCCESS,
true, ConstRRsetPtr(), NULL, &glue_child_rrsets);
EXPECT_EQ(rr_child_glue_, glue_child_rrsets.findRRset(RRType::A(),
RRClass::IN()));
EXPECT_EQ(1, glue_child_rrsets.size());
findAllTest(Name("example.com"), ZoneFinder::NXDOMAIN, 0);
rrsets = findAllTest(rr_child_glue_->getName(), ZoneFinder::SUCCESS, 1);
EXPECT_FALSE(rrsets.end() == std::find(rrsets.begin(), rrsets.end(),
rr_child_glue_));
// TODO: test NXRRSET case after rbtree non-terminal logic has
// been implemented
......@@ -664,18 +683,13 @@ TEST_F(InMemoryZoneFinderTest, findAny) {
EXPECT_NO_THROW(EXPECT_EQ(SUCCESS, zone_finder_.add(rr_child_ns_)));
// zone cut
RRsetList child_rrsets;
findTest(rr_child_ns_->getName(), RRType::ANY(), ZoneFinder::DELEGATION,
true, rr_child_ns_, &child_rrsets);
EXPECT_EQ(0, child_rrsets.size());
findAllTest(rr_child_ns_->getName(), ZoneFinder::DELEGATION, 0, NULL,
rr_child_ns_);
// glue for this zone cut
RRsetList new_glue_child_rrsets;
findTest(rr_child_glue_->getName(), RRType::ANY(), ZoneFinder::DELEGATION,
true, rr_child_ns_, &new_glue_child_rrsets);
EXPECT_EQ(0, new_glue_child_rrsets.size());
findAllTest(rr_child_glue_->getName(),ZoneFinder::DELEGATION, 0, NULL,
rr_child_ns_);
}
#endif
TEST_F(InMemoryZoneFinderTest, glue) {
// install zone data:
......@@ -892,8 +906,6 @@ TEST_F(InMemoryZoneFinderTest, delegatedWildcard) {
}
}
#if 0
When the new interface is created, use it
// Tests combination of wildcard and ANY.
TEST_F(InMemoryZoneFinderTest, anyWildcard) {
EXPECT_EQ(SUCCESS, zone_finder_.add(rr_wild_));
......@@ -901,9 +913,9 @@ TEST_F(InMemoryZoneFinderTest, anyWildcard) {
// First try directly the name (normal match)
{
SCOPED_TRACE("Asking direcly for *");
RRsetList target;
findTest(Name("*.wild.example.org"), RRType::ANY(),
ZoneFinder::SUCCESS, true, ConstRRsetPtr(), &target);
const std::vector<ConstRRsetPtr>
target(findAllTest(Name("*.wild.example.org"), ZoneFinder::SUCCESS,
1));
ASSERT_EQ(1, target.size());
EXPECT_EQ(RRType::A(), (*target.begin())->getType());
EXPECT_EQ(Name("*.wild.example.org"), (*target.begin())->getName());
......@@ -912,15 +924,13 @@ TEST_F(InMemoryZoneFinderTest, anyWildcard) {
// Then a wildcard match
{
SCOPED_TRACE("Asking in the wild way");
RRsetList target;
findTest(Name("a.wild.example.org"), RRType::ANY(),
ZoneFinder::SUCCESS, true, ConstRRsetPtr(), &target);
ASSERT_EQ(1, target.size());
const std::vector<ConstRRsetPtr>
target(findAllTest(Name("a.wild.example.org"), ZoneFinder::SUCCESS,
1));
EXPECT_EQ(RRType::A(), (*target.begin())->getType());
EXPECT_EQ(Name("a.wild.example.org"), (*target.begin())->getName());
}
}
#endif
// Test there's nothing in the wildcard in the middle if we load
// wild.*.foo.example.org.
......@@ -946,21 +956,12 @@ TEST_F(InMemoryZoneFinderTest, emptyWildcard) {
findTest(Name("foo.example.org"), RRType::A(), ZoneFinder::NXRRSET);
}
#if 0
TODO: Update to the new interface
{
SCOPED_TRACE("Asking for ANY record");
RRsetList normalTarget;
findTest(Name("*.foo.example.org"), RRType::ANY(), ZoneFinder::NXRRSET,
true, ConstRRsetPtr(), &normalTarget);
EXPECT_EQ(0, normalTarget.size());
RRsetList wildTarget;
findTest(Name("a.foo.example.org"), RRType::ANY(),
ZoneFinder::NXRRSET, true, ConstRRsetPtr(), &wildTarget);
EXPECT_EQ(0, wildTarget.size());
findAllTest(Name("*.foo.example.org"), ZoneFinder::NXRRSET, 0);
findAllTest(Name("a.foo.example.org"), ZoneFinder::NXRRSET, 0);
}
#endif
{
SCOPED_TRACE("Asking on the non-terminal");
......@@ -1013,21 +1014,15 @@ TEST_F(InMemoryZoneFinderTest, nestedEmptyWildcard) {
}
}
#if 0
TODO: Update to the new interface once it is created
{
SCOPED_TRACE("Asking for ANY on parent nodes");
for (const char** name(names); *name != NULL; ++ name) {
SCOPED_TRACE(string("Node ") + *name);
RRsetList target;
findTest(Name(*name), RRType::ANY(), ZoneFinder::NXRRSET, true,
ConstRRsetPtr(), &target);
EXPECT_EQ(0, target.size());
findAllTest(Name(*name), ZoneFinder::NXRRSET, 0);
}
}
#endif
}
// We run this part twice from the below test, in two slightly different
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment