jenkins-bot has submitted this change and it was merged. ( 
https://gerrit.wikimedia.org/r/343655 )

Change subject: Add unit tests for DNSQueryMonitoringProtocol
......................................................................


Add unit tests for DNSQueryMonitoringProtocol

Change-Id: I08ad45f6353cdaaac2cc7e9d61bc7302436a3c7f
---
M pybal/monitors/dnsquery.py
M pybal/test/test_monitors.py
2 files changed, 130 insertions(+), 2 deletions(-)

Approvals:
  Mark Bergsma: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/pybal/monitors/dnsquery.py b/pybal/monitors/dnsquery.py
index 33c3938..65b7e89 100644
--- a/pybal/monitors/dnsquery.py
+++ b/pybal/monitors/dnsquery.py
@@ -82,7 +82,7 @@
         self.DNSQueryDeferred.addCallback(self._querySuccessful, query
                 ).addErrback(self._queryFailed, query
                 ).addBoth(self._checkFinished)
-
+        return self.DNSQueryDeferred
 
     def _querySuccessful(self, (answers, authority, additional), query):
         """Called when the DNS query finished successfully."""
diff --git a/pybal/test/test_monitors.py b/pybal/test/test_monitors.py
index 7d4b4c8..b44d29d 100644
--- a/pybal/test/test_monitors.py
+++ b/pybal/test/test_monitors.py
@@ -6,10 +6,15 @@
   This module contains tests for `pybal.monitors`.
 
 """
-import unittest
 
 import pybal.util
 from pybal.monitors.idleconnection import IdleConnectionMonitoringProtocol
+from pybal.monitors.dnsquery import DNSQueryMonitoringProtocol
+
+from twisted.internet import defer
+from twisted.internet.reactor import getDelayedCalls
+from twisted.names.common import ResolverBase
+from twisted.names import dns, error
 
 from .fixtures import PyBalTestCase
 
@@ -60,3 +65,126 @@
         self.monitor.up = False
         self.monitor.buildProtocol(None)
         self.assertTrue(self.monitor.up)
+
+
+class FakeResolverOK(ResolverBase):
+    def _lookup(self, name, cls, qtype, timeout):
+        if qtype == dns.A:
+            payload = dns.Record_A(address='127.0.0.1', ttl=60)
+        else:
+            payload = dns.Record_AAAA(address='1::2', ttl=60)
+
+        rr = dns.RRHeader(name=name, type=qtype, cls=cls, ttl=60,
+                          payload=payload)
+
+        results = [rr]
+        authority = []
+        additional = []
+        return defer.succeed((results, authority, additional))
+
+
+class FakeResolverTimeoutError(ResolverBase):
+    def _lookup(self, name, cls, qtype, timeout):
+        return defer.fail(error.DNSQueryTimeoutError([]))
+
+
+class FakeResolverServerError(ResolverBase):
+    def _lookup(self, name, cls, qtype, timeout):
+        return defer.fail(error.DNSServerError([]))
+
+
+class FakeResolverNameError(ResolverBase):
+    def _lookup(self, name, cls, qtype, timeout):
+        return defer.fail(error.DNSNameError([]))
+
+
+class FakeResolverQueryRefusedError(ResolverBase):
+    def _lookup(self, name, cls, qtype, timeout):
+        return defer.fail(error.DNSQueryRefusedError([]))
+
+
+class FakeResolverUnknownError(ResolverBase):
+    def _lookup(self, name, cls, qtype, timeout):
+        return defer.fail(error.DNSUnknownError([]))
+
+
+class DNSQueryMonitoringProtocolTestCase(PyBalTestCase):
+    """Test case for `pybal.monitors.DNSQueryMonitoringProtocol`."""
+
+    def setUp(self):
+        super(DNSQueryMonitoringProtocolTestCase, self).setUp()
+        self.config = pybal.util.ConfigDict()
+        self.config['dnsquery.hostnames'] = '["en.wikipedia.org"]'
+        self.monitor = DNSQueryMonitoringProtocol(
+            self.coordinator, self.server, self.config)
+
+    def tearDown(self):
+        # There doesn't seem to be any sane way to avoid the delayed call to
+        # maybeParseConfig: https://twistedmatrix.com/trac/ticket/3745
+        for call in getDelayedCalls():
+            if call.func.func_name == 'maybeParseConfig':
+                call.cancel()
+
+    def testInit(self):
+        """Test `DNSQueryMonitoringProtocol.__init__`."""
+        monitor = DNSQueryMonitoringProtocol(None, None, self.config)
+
+        self.assertEquals(monitor.intvCheck, monitor.INTV_CHECK)
+        self.assertEquals(monitor.toQuery, monitor.TIMEOUT_QUERY)
+        self.assertEquals(monitor.hostnames, ['en.wikipedia.org'])
+        self.assertFalse(monitor.failOnNXDOMAIN)
+
+    def testRun(self):
+        """Test `DNSQueryMonitoringProtocol.run`."""
+        self.assertIsNone(self.monitor.resolver)
+        self.monitor.run()
+        self.assert_(len(self.monitor.resolver.resolvers) > 0)
+        self.monitor.stop()
+
+    def __testQuery(self, expectSuccess, fakeResolver):
+        """Install a mocked resolver to test different lookup results"""
+        self.monitor.resolver = fakeResolver()
+        query = self.monitor.check()
+
+        def test_dnsquery(results):
+            if expectSuccess:
+                self.assertTrue(self.monitor.up)
+            else:
+                self.assertFalse(self.monitor.up)
+
+        # Check test outcome upon deferred query completion
+        query.addCallback(test_dnsquery)
+        return query
+
+    def testQuerySuccessful(self):
+        self.__testQuery(expectSuccess=True, fakeResolver=FakeResolverOK)
+
+    def testQueryFailedTimeoutError(self):
+        self.__testQuery(expectSuccess=False,
+                         fakeResolver=FakeResolverTimeoutError)
+
+    def testQueryFailedServerError(self):
+        self.__testQuery(expectSuccess=False,
+                         fakeResolver=FakeResolverServerError)
+
+    def testQueryFailedNameErrorOK(self):
+        # dnsquery.fail-on-nxdomain is set to false by default. Expect success.
+        self.__testQuery(expectSuccess=True,
+                         fakeResolver=FakeResolverNameError)
+
+    def testQueryFailedNameErrorKO(self):
+        # Set dnsquery.fail-on-nxdomain to true and expect failure.
+        self.config['dnsquery.fail-on-nxdomain'] = 'true'
+        self.monitor = DNSQueryMonitoringProtocol(
+                self.coordinator, self.server, self.config)
+
+        self.__testQuery(expectSuccess=False,
+                         fakeResolver=FakeResolverNameError)
+
+    def testQueryFailedQueryRefusedError(self):
+        self.__testQuery(expectSuccess=False,
+                         fakeResolver=FakeResolverQueryRefusedError)
+
+    def testQueryFailedUnknownError(self):
+        self.__testQuery(expectSuccess=False,
+                         fakeResolver=FakeResolverUnknownError)

-- 
To view, visit https://gerrit.wikimedia.org/r/343655
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I08ad45f6353cdaaac2cc7e9d61bc7302436a3c7f
Gerrit-PatchSet: 3
Gerrit-Project: operations/debs/pybal
Gerrit-Branch: 1.13
Gerrit-Owner: Ema <e...@wikimedia.org>
Gerrit-Reviewer: Alexandros Kosiaris <akosia...@wikimedia.org>
Gerrit-Reviewer: Ema <e...@wikimedia.org>
Gerrit-Reviewer: Giuseppe Lavagetto <glavage...@wikimedia.org>
Gerrit-Reviewer: Mark Bergsma <m...@wikimedia.org>
Gerrit-Reviewer: Volans <rcocci...@wikimedia.org>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to