Browse Source

Do direct answers more generically

They will be needed for zone tests

git-svn-id: svn://bind10.isc.org/svn/bind10/branches/trac408@3731 e5f2f494-b856-4b98-b285-d166d9295462
Michal Vaner 14 years ago
parent
commit
277f631c1d
2 changed files with 37 additions and 31 deletions
  1. 12 30
      src/lib/nsas/tests/nameserver_entry_unittest.cc
  2. 25 1
      src/lib/nsas/tests/nsas_test.h

+ 12 - 30
src/lib/nsas/tests/nameserver_entry_unittest.cc

@@ -324,34 +324,6 @@ TEST_F(NameserverEntryTest, IPCallbacksUnreachable) {
 }
 
 /*
- * The resolver for DirectAnswer test.
- * It answers right away, from inside resolve. I tried to put it
- * inside the function, but shared_ptr complains for some reason there.
- */
-class DirectResolver : public ResolverInterface {
-    public:
-        DirectResolver(RRsetPtr rrv4, RRsetPtr rrv6) :
-            rrv4_(rrv4), rrv6_(rrv6)
-        { }
-        virtual void resolve(QuestionPtr question, CallbackPtr callback) {
-            if (question->getClass() == RRClass::IN()) {
-                EXPECT_EQ(Name(EXAMPLE_CO_UK), question->getName());
-                if (question->getType() == RRType::A()) {
-                    callback->success(rrv4_);
-                } else if (question->getType() == RRType::AAAA()) {
-                    callback->success(rrv6_);
-                } else {
-                    ADD_FAILURE() << "Unknow rrtype asked";
-                }
-            } else {
-                callback->failure();
-            }
-        }
-    private:
-        RRsetPtr rrv4_, rrv6_;
-};
-
-/*
  * Tests that it works even when we provide the answer right away, directly
  * from resolve.
  */
@@ -359,10 +331,19 @@ TEST_F(NameserverEntryTest, DirectAnswer) {
     shared_ptr<NameserverEntry> entry(new NameserverEntry(EXAMPLE_CO_UK,
         RRClass::IN()));
     shared_ptr<Callback> callback(new Callback);
-    shared_ptr<ResolverInterface> resolver(new DirectResolver(rrv4_, rrv6_));
+    shared_ptr<TestResolver> resolver(new TestResolver);
+    resolver->addPresetAnswer(Question(Name(EXAMPLE_CO_UK), RRClass::IN(),
+        RRType::A()), rrv4_);
+    resolver->addPresetAnswer(Question(Name(EXAMPLE_CO_UK), RRClass::IN(),
+        RRType::AAAA()), rrv6_);
+    resolver->addPresetAnswer(Question(Name(EXAMPLE_NET), RRClass::IN(),
+        RRType::A()), shared_ptr<AbstractRRset>());
+    resolver->addPresetAnswer(Question(Name(EXAMPLE_NET), RRClass::IN(),
+        RRType::AAAA()), shared_ptr<AbstractRRset>());
 
     // A successfull test first
     entry->askIP(resolver, callback, ANY_OK);
+    EXPECT_EQ(0, resolver->requests.size());
     EXPECT_EQ(1, callback->count);
     NameserverEntry::AddressVector addresses;
     EXPECT_EQ(Fetchable::READY, entry->getAddresses(addresses));
@@ -370,8 +351,9 @@ TEST_F(NameserverEntryTest, DirectAnswer) {
 
     // An unsuccessfull test
     callback->count = 0;
-    entry.reset(new NameserverEntry(EXAMPLE_CO_UK, RRClass::CH()));
+    entry.reset(new NameserverEntry(EXAMPLE_NET, RRClass::IN()));
     entry->askIP(resolver, callback, ANY_OK);
+    EXPECT_EQ(0, resolver->requests.size());
     EXPECT_EQ(1, callback->count);
     addresses.clear();
     EXPECT_EQ(Fetchable::UNREACHABLE, entry->getAddresses(addresses));

+ 25 - 1
src/lib/nsas/tests/nsas_test.h

@@ -224,11 +224,35 @@ class TestResolver : public isc::nsas::ResolverInterface {
         bool checkIndex(size_t index) {
             return (requests.size() > index);
         }
+
+        typedef std::map<isc::dns::Question, boost::shared_ptr<AbstractRRset> >
+            PresetAnswers;
+        PresetAnswers answers_;
     public:
         typedef pair<QuestionPtr, CallbackPtr> Request;
         vector<Request> requests;
         virtual void resolve(QuestionPtr q, CallbackPtr c) {
-            requests.push_back(Request(q, c));
+            PresetAnswers::iterator it(answers_.find(*q));
+            if (it == answers_.end()) {
+                requests.push_back(Request(q, c));
+            } else {
+                if (it->second) {
+                    c->success(it->second);
+                } else {
+                    c->failure();
+                }
+            }
+        }
+
+        /*
+         * Add a preset answer. If shared_ptr() is passed (eg. NULL),
+         * it will generate failure. If the question is not preset,
+         * it goes to requests and you can answer later.
+         */
+        void addPresetAnswer(const isc::dns::Question& question,
+            boost::shared_ptr<AbstractRRset> answer)
+        {
+            answers_[question] = answer;
         }
 
         // Thrown if the query at the given index does not exist.