From: Michal 'vorner' Vaner Date: Thu, 15 Mar 2012 15:19:12 +0000 (+0100) Subject: [1758] Future test support. X-Git-Tag: trac2351_base~226^2~116^2~100^2~10^2~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2bb6957f057d02e70338d1c8586d53bbda7f7d33;p=thirdparty%2Fkea.git [1758] Future test support. --- diff --git a/src/lib/datasrc/tests/database_unittest.cc b/src/lib/datasrc/tests/database_unittest.cc index b4306e4977..8a019a2068 100644 --- a/src/lib/datasrc/tests/database_unittest.cc +++ b/src/lib/datasrc/tests/database_unittest.cc @@ -205,6 +205,13 @@ const char* const TEST_RECORDS[][5] = { {NULL, NULL, NULL, NULL, NULL}, }; +// FIXME: Taken from a different test. Fill with proper data when creating a test. +const char* TEST_NSEC3_RECORDS[][5] = { + {"1BB7SO0452U1QHL98UISNDD9218GELR5", "NSEC3", "3600", "", "1 0 10 FEEDABEE 4KLSVDE8KH8G95VU68R7AHBE1CPQN38J"}, + {"1BB7SO0452U1QHL98UISNDD9218GELR5", "RRSIG", "3600", "", "NSEC3 5 4 7200 20100410172647 20100311172647 63192 example.org. gNIVj4T8t51fEU6kOPpvK7HOGBFZGbalN5ZK mInyrww6UWZsUNdw07ge6/U6HfG+/s61RZ/L is2M6yUWHyXbNbj/QqwqgadG5dhxTArfuR02 xP600x0fWX8LXzW4yLMdKVxGbzYT+vvGz71o 8gHSY5vYTtothcZQa4BMKhmGQEk="}, + {NULL, NULL, NULL, NULL, NULL} +}; + /* * An accessor with minimum implementation, keeping the original * "NotImplemented" methods. @@ -383,6 +390,28 @@ public: } private: + class DomainIterator : public IteratorContext { + public: + DomainIterator(const std::vector >& domain) : + domain_(domain), + position_(domain_.begin()) + {} + virtual bool getNext(std::string (&columns)[COLUMN_COUNT]) { + if (position_ == domain_.end()) { + return (false); + } else { + for (size_t i(0); i < COLUMN_COUNT; ++ i) { + columns[i] = (*position_)[i]; + } + ++ position_; + return (true); + } + } + private: + const std::vector > domain_; + std::vector >::const_iterator position_; + }; + class MockNameIteratorContext : public IteratorContext { public: MockNameIteratorContext(const MockAccessor& mock_accessor, int zone_id, @@ -615,6 +644,17 @@ public: } } + virtual IteratorContextPtr getNSEC3Records(const std::string& hash, + int) const + { + Domains::const_iterator it(nsec_namespace_.find(hash)); + if (it == nsec_namespace_.end()) { + return (IteratorContextPtr(new EmptyIteratorContext())); + } else { + return (IteratorContextPtr(new DomainIterator(it->second))); + } + } + virtual pair startUpdateZone(const std::string& zone_name, bool replace) { @@ -835,6 +875,9 @@ private: const Domains empty_records_master_; const Domains* empty_records_; + // The NSEC3 namespace. The above trick will be added once it is needed. + Domains nsec_namespace_; + // The journal data std::vector journal_entries_master_; std::vector* journal_entries_; @@ -895,6 +938,20 @@ private: cur_name_.clear(); } + // Works in a similar way to addCurName, but it is added to + // the NSEC3 namespace. You don't provide the full name, only + // the hash part. + void addCurHash(const std::string& hash) { + ASSERT_EQ(0, nsec_namespace_.count(hash)); + // Append the name to all of them + for (std::vector >::iterator + i = cur_name_.begin(); i != cur_name_.end(); ++ i) { + i->push_back(hash); + } + (*readonly_records_)[hash] = cur_name_; + cur_name_.clear(); + } + // Fills the database with zone data. // This method constructs a number of resource records (with addRecord), // which will all be added for one domain name to the fake database @@ -917,6 +974,17 @@ private: TEST_RECORDS[i][3], TEST_RECORDS[i][4]); } addCurName(prev_name); + prev_name = NULL; + for (int i = 0; TEST_NSEC3_RECORDS[i][0] != NULL; ++i) { + if (prev_name != NULL && + strcmp(prev_name, TEST_NSEC3_RECORDS[i][0]) != 0) { + addCurHash(prev_name); + } + prev_name = TEST_NSEC3_RECORDS[i][0]; + addRecord(TEST_NSEC3_RECORDS[i][1], TEST_NSEC3_RECORDS[i][2], + TEST_NSEC3_RECORDS[i][3], TEST_NSEC3_RECORDS[i][4]); + } + addCurHash(prev_name); } };