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