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