1#!/usr/bin/env python 2# Copyright 2009 Google Inc. All Rights Reserved. 3# 4# Licensed under the Apache License, Version 2.0 (the "License"); 5# you may not use this file except in compliance with the License. 6# You may obtain a copy of the License at 7# 8# http://www.apache.org/licenses/LICENSE-2.0 9# 10# Unless required by applicable law or agreed to in writing, software 11# distributed under the License is distributed on an "AS IS" BASIS, 12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13# See the License for the specific language governing permissions and 14# limitations under the License. 15 16"""Mocks for tests.""" 17 18__author__ = 'tstromberg@google.com (Thomas Stromberg)' 19 20import mocks 21import nameserver 22import unittest 23 24class TestNameserver(unittest.TestCase): 25 def testInit(self): 26 ns = mocks.MockNameServer(mocks.GOOD_IP) 27 self.assertEquals(ns.ip, mocks.GOOD_IP) 28 self.assertEquals(ns.name, None) 29 30 ns = mocks.MockNameServer(mocks.NO_RESPONSE_IP, name='Broked') 31 self.assertEquals(ns.ip, mocks.NO_RESPONSE_IP) 32 self.assertEquals(ns.name, 'Broked') 33 34 35 def testTimedRequest(self): 36 ns = mocks.MockNameServer(mocks.GOOD_IP) 37 (response, duration, exception) = ns.TimedRequest('A', 'www.paypal.com') 38 self.assertEquals(response.id, 999) 39 expected = ('www.paypal.com. 159 IN A 66.211.169.65\n' 40 'www.paypal.com. 159 IN A 66.211.169.2') 41 self.assertEquals(str(response.answer[0]), expected) 42 self.assertTrue(duration > 0) 43 self.assertEquals(exception, None) 44 45 def testTestAnswers(self): 46 ns = mocks.MockNameServer(mocks.GOOD_IP) 47 (is_broken, warning, duration) = ns.TestAnswers('A', 'www.paypal.com', 48 '10.0.0.1') 49 self.assertEquals(is_broken, False) 50 self.assertEquals(warning, None) 51 self.assertTrue(duration > 0 and duration < 3600) 52 53 def testResponseToAscii(self): 54 ns = mocks.MockNameServer(mocks.GOOD_IP) 55 (response, duration, exception) = ns.TimedRequest('A', 'www.paypal.com') 56 self.assertEquals(nameserver.ResponseToAscii(response), 57 '66.211.169.65 + 66.211.169.2') 58 response.answer = None 59 self.assertEquals(nameserver.ResponseToAscii(response), 'no answer') 60 61 def testGoogleComResponse(self): 62 ns = mocks.MockNameServer(mocks.GOOD_IP) 63 (is_broken, warning, duration) = ns.TestGoogleComResponse() 64 self.assertEquals(is_broken, False) 65 self.assertEquals(warning, 66 'google.com. is hijacked (66.211.169.65 + 66.211.169.2)') 67 self.assertTrue(duration > 0 and duration < 3600) 68 69 def testWwwGoogleComResponse(self): 70 ns = mocks.MockNameServer(mocks.GOOD_IP) 71 (is_broken, warning, duration) = ns.TestWwwGoogleComResponse() 72 self.assertEquals(is_broken, True) 73 self.assertEquals(warning, 'No answer') 74 self.assertTrue(duration > 0 and duration < 3600) 75 76 def testWwwPaypalComResponse(self): 77 ns = mocks.MockNameServer(mocks.GOOD_IP) 78 (is_broken, warning, duration) = ns.TestWwwPaypalComResponse() 79 self.assertEquals(is_broken, False) 80 self.assertEquals(warning, None) 81 82 def testNegativeResponse(self): 83 ns = mocks.MockNameServer(mocks.NO_RESPONSE_IP) 84 (is_broken, warning, duration) = ns.TestNegativeResponse() 85 self.assertEquals(is_broken, False) 86 self.assertEquals(warning, None) 87 88 def testNegativeResponseHijacked(self): 89 ns = mocks.MockNameServer(mocks.GOOD_IP) 90 (is_broken, warning, duration) = ns.TestNegativeResponse() 91 self.assertEquals(is_broken, False) 92 self.assertEquals(warning, 93 'NXDOMAIN Hijacking (66.211.169.65 + 66.211.169.2)') 94 95 def testNegativeResponseBroken(self): 96 ns = mocks.MockNameServer(mocks.BROKEN_IP) 97 (is_broken, warning, duration) = ns.TestNegativeResponse() 98 self.assertEquals(is_broken, True) 99 self.assertEquals(warning, 'BadResponse') 100 101 def testWildcardCache(self): 102 ns = mocks.MockNameServer(mocks.GOOD_IP) 103 (response, is_broken, warning, duration) = ns.QueryWildcardCache() 104 self.assertEquals(is_broken, False) 105 question = str(response.question[0]) 106 self.assertTrue(question.startswith('namebench')) 107 self.assertEquals(warning, None) 108 109 def testCheckHealthGood(self): 110 ns = mocks.MockNameServer(mocks.GOOD_IP) 111 ns.CheckHealth() 112 self.assertEquals(ns.CheckHealth(), False) 113 self.assertEquals(ns.warnings, ['No answer']) 114 self.assertEquals(len(ns.checks), 1) 115 self.assertEquals(ns.failure[0], 'TestWwwGoogleComResponse') 116 self.assertEquals(ns.checks[0][0:3], 117 ('TestWwwGoogleComResponse', True, 'No answer')) 118 119 def testCheckHealthPerfect(self): 120 ns = mocks.MockNameServer(mocks.PERFECT_IP) 121 ns.CheckHealth() 122 self.assertEquals(ns.CheckHealth(), True) 123 expected = ['www.google.com. is hijacked (66.211.169.65 + 66.211.169.2)', 124 'google.com. is hijacked (66.211.169.65 + 66.211.169.2)', 125 'NXDOMAIN Hijacking (66.211.169.65 + 66.211.169.2)'] 126 self.assertEquals(ns.warnings, expected) 127 self.assertEquals(len(ns.checks), 5) 128 self.assertEquals(ns.failure, None) 129 self.assertTrue(ns.check_duration > 10) 130 131 def testQUeryWildcardCacheSaving(self): 132 ns = mocks.MockNameServer(mocks.GOOD_IP) 133 other_ns = mocks.MockNameServer(mocks.PERFECT_IP) 134 ns.QueryWildcardCache(save=True) 135 other_ns.QueryWildcardCache(save=True) 136 137 # Test our cache-sharing mechanisms 138 (hostname, ttl) = ns.cache_check 139 self.assertTrue(hostname.startswith('namebench')) 140 self.assertEquals(ttl, 159) 141 (other_hostname, other_ttl) = other_ns.cache_check 142 self.assertTrue(other_hostname.startswith('namebench')) 143 self.assertNotEqual(hostname, other_hostname) 144 self.assertEquals(other_ttl, 159) 145 146 def testSharedCacheNoMatch(self): 147 ns = mocks.MockNameServer(mocks.GOOD_IP) 148 other_ns = mocks.MockNameServer(mocks.PERFECT_IP) 149 ns.QueryWildcardCache(save=True) 150 other_ns.QueryWildcardCache(save=True) 151 (shared, slower, faster) = ns.TestSharedCache(other_ns) 152 self.assertEquals(shared, False) 153 self.assertEquals(slower, None) 154 self.assertEquals(faster, None) 155 156 157 def testSharedCacheMatch(self): 158 ns = mocks.MockNameServer(mocks.GOOD_IP) 159 other_ns = mocks.MockNameServer(mocks.PERFECT_IP) 160 ns.QueryWildcardCache(save=True) 161 other_ns.QueryWildcardCache(save=True) 162 # Increase the TTL of 'other' 163 other_ns.cache_check = (other_ns.cache_check[0], other_ns.cache_check[1] + 5) 164 (shared, slower, faster) = ns.TestSharedCache(other_ns) 165 self.assertEquals(shared, True) 166 self.assertEquals(slower.ip, mocks.GOOD_IP) 167 self.assertEquals(faster.ip, mocks.PERFECT_IP) 168 169 170 # Increase the TTL of 'other' by a whole lot 171 other_ns.cache_check = (other_ns.cache_check[0], other_ns.cache_check[1] + 3600) 172 (shared, slower, faster) = ns.TestSharedCache(other_ns) 173 self.assertEquals(shared, False) 174 self.assertEquals(slower, None) 175 self.assertEquals(faster, None) 176 177 178if __name__ == '__main__': 179 unittest.main() 180