} candidate;
BOOST_FOREACH(const DataSourceInfo& info, data_sources_) {
- // TODO: Once we have support for the caches, consider them too here
- // somehow. This would probably get replaced by a function, that
- // checks if there's a cache available, if it is, checks the loaded
- // zones and zones expected to be in the real data source. If it is
- // the cached one, provide the cached one. If it is in the external
- // data source, use the datasource and don't provide the finder yet.
- const DataSourceClient::FindResult result(
- info.data_src_client_->findZone(name));
+ DataSourceClient* client(info.cache_ ? info.cache_.get() :
+ info.data_src_client_);
+ const DataSourceClient::FindResult result(client->findZone(name));
+ // TODO: Once we mark the zones that are not loaded, but are present
+ // in the data source somehow, check them too.
switch (result.code) {
case result::SUCCESS:
// If we found an exact match, we have no hope to getting
// TODO: In case we have only the datasource and not the finder
// and the need_updater parameter is true, get the zone there.
- return (FindResult(info.data_src_client_, result.zone_finder,
+ return (FindResult(client, result.zone_finder,
true));
case result::PARTIALMATCH:
if (!want_exact_match) {
if (labels > candidate.matched_labels ||
!candidate.matched) {
// This one is strictly better. Replace it.
- candidate.datasrc_client = info.data_src_client_;
+ candidate.datasrc_client = client;
candidate.finder = result.zone_finder;
candidate.matched_labels = labels;
candidate.matched = true;
void positiveResult(const ClientList::FindResult& result,
const shared_ptr<MockDataSourceClient>& dsrc,
const Name& name, bool exact,
- const char* test)
+ const char* test, bool from_cache = false)
{
SCOPED_TRACE(test);
- EXPECT_EQ(dsrc.get(), result.dsrc_client_);
ASSERT_NE(ZoneFinderPtr(), result.finder_);
EXPECT_EQ(name, result.finder_->getOrigin());
EXPECT_EQ(exact, result.exact_match_);
+ if (from_cache) {
+ EXPECT_NE(shared_ptr<InMemoryZoneFinder>(),
+ dynamic_pointer_cast<InMemoryZoneFinder>(
+ result.finder_)) << "Finder is not from cache";
+ EXPECT_TRUE(NULL !=
+ dynamic_cast<InMemoryClient*>(result.dsrc_client_));
+ } else {
+ EXPECT_EQ(dsrc.get(), result.dsrc_client_);
+ }
}
// Configure the list with multiple data sources, according to
// some configuration. It uses the index as parameter, to be able to
EXPECT_EQ(result::SUCCESS, cache->findZone(Name("example.org")).code);
EXPECT_EQ(result::SUCCESS, cache->findZone(Name("example.com")).code);
EXPECT_EQ(result::NOTFOUND, cache->findZone(Name("example.cz")).code);
+
+ // These are cached and answered from the cache
+ positiveResult(list_->find(Name("example.com.")), ds_[0],
+ Name("example.com."), true, "com", true);
+ positiveResult(list_->find(Name("example.org.")), ds_[0],
+ Name("example.org."), true, "org", true);
+ positiveResult(list_->find(Name("sub.example.com.")), ds_[0],
+ Name("example.com."), false, "Subdomain of com", true);
+ // For now, the ones not cached are ignored.
+ EXPECT_TRUE(negativeResult_ == list_->find(Name("example.cz.")));
}
// Check the caching handles misbehaviour from the data source and