1 # Copyright (C) 2003-2007, 2009, 2010 Nominum, Inc.
3 # Permission to use, copy, modify, and distribute this software and its
4 # documentation for any purpose with or without fee is hereby granted,
5 # provided that the above copyright notice and this permission notice
6 # appear in all copies.
8 # THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
9 # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
11 # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
14 # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23 query_text
= """id 1234
31 wwww.dnspython.org. IN A
36 goodhex
= '04d201000001000000000001047777777709646e73707974686f6e' \
37 '036f726700000100010000291000000080000000'
39 goodwire
= goodhex
.decode('hex_codec')
41 answer_text
= """id 1234
48 dnspython.org. 3600 IN SOA woof.dnspython.org. hostmaster.dnspython.org. 2003052700 3600 1800 604800 3600
50 dnspython.org. 3600 IN NS ns1.staff.nominum.org.
51 dnspython.org. 3600 IN NS ns2.staff.nominum.org.
52 dnspython.org. 3600 IN NS woof.play-bow.org.
54 woof.play-bow.org. 3600 IN A 204.152.186.150
57 goodhex2
= '04d2 8500 0001 0001 0003 0001' \
58 '09646e73707974686f6e036f726700 0006 0001' \
59 'c00c 0006 0001 00000e10 0028 ' \
60 '04776f6f66c00c 0a686f73746d6173746572c00c' \
61 '7764289c 00000e10 00000708 00093a80 00000e10' \
62 'c00c 0002 0001 00000e10 0014' \
63 '036e7331057374616666076e6f6d696e756dc016' \
64 'c00c 0002 0001 00000e10 0006 036e7332c063' \
65 'c00c 0002 0001 00000e10 0010 04776f6f6608706c61792d626f77c016' \
66 'c091 0001 0001 00000e10 0004 cc98ba96'
69 goodwire2
= goodhex2
.replace(' ', '').decode('hex_codec')
71 query_text_2
= """id 1234
79 wwww.dnspython.org. IN A
84 goodhex3
= '04d2010f0001000000000001047777777709646e73707974686f6e' \
85 '036f726700000100010000291000ff0080000000'
87 goodwire3
= goodhex3
.decode('hex_codec')
89 class MessageTestCase(unittest
.TestCase
):
91 def test_comparison_eq1(self
):
92 q1
= dns
.message
.from_text(query_text
)
93 q2
= dns
.message
.from_text(query_text
)
94 self
.failUnless(q1
== q2
)
96 def test_comparison_ne1(self
):
97 q1
= dns
.message
.from_text(query_text
)
98 q2
= dns
.message
.from_text(query_text
)
100 self
.failUnless(q1
!= q2
)
102 def test_comparison_ne2(self
):
103 q1
= dns
.message
.from_text(query_text
)
104 q2
= dns
.message
.from_text(query_text
)
106 self
.failUnless(q1
!= q2
)
108 def test_comparison_ne3(self
):
109 q1
= dns
.message
.from_text(query_text
)
110 self
.failUnless(q1
!= 1)
112 def test_EDNS_to_wire1(self
):
113 q
= dns
.message
.from_text(query_text
)
115 self
.failUnless(w
== goodwire
)
117 def test_EDNS_from_wire1(self
):
118 m
= dns
.message
.from_wire(goodwire
)
119 self
.failUnless(str(m
) == query_text
)
121 def test_EDNS_to_wire2(self
):
122 q
= dns
.message
.from_text(query_text_2
)
124 self
.failUnless(w
== goodwire3
)
126 def test_EDNS_from_wire2(self
):
127 m
= dns
.message
.from_wire(goodwire3
)
128 self
.failUnless(str(m
) == query_text_2
)
130 def test_TooBig(self
):
132 q
= dns
.message
.from_text(query_text
)
133 for i
in xrange(0, 25):
134 rrset
= dns
.rrset
.from_text('foo%d.' % i
, 3600,
138 q
.additional
.append(rrset
)
139 w
= q
.to_wire(max_size
=512)
140 self
.failUnlessRaises(dns
.exception
.TooBig
, bad
)
142 def test_answer1(self
):
143 a
= dns
.message
.from_text(answer_text
)
144 wire
= a
.to_wire(want_shuffle
=False)
145 self
.failUnless(wire
== goodwire2
)
147 def test_TrailingJunk(self
):
149 badwire
= goodwire
+ '\x00'
150 m
= dns
.message
.from_wire(badwire
)
151 self
.failUnlessRaises(dns
.message
.TrailingJunk
, bad
)
153 def test_ShortHeader(self
):
155 badwire
= '\x00' * 11
156 m
= dns
.message
.from_wire(badwire
)
157 self
.failUnlessRaises(dns
.message
.ShortHeader
, bad
)
159 def test_RespondingToResponse(self
):
161 q
= dns
.message
.make_query('foo', 'A')
162 r1
= dns
.message
.make_response(q
)
163 r2
= dns
.message
.make_response(r1
)
164 self
.failUnlessRaises(dns
.exception
.FormError
, bad
)
166 def test_ExtendedRcodeSetting(self
):
167 m
= dns
.message
.make_query('foo', 'A')
169 self
.failUnless(m
.rcode() == 4095)
171 self
.failUnless(m
.rcode() == 2)
173 def test_EDNSVersionCoherence(self
):
174 m
= dns
.message
.make_query('foo', 'A')
176 self
.failUnless((m
.ednsflags
>> 16) & 0xFF == 1)
178 if __name__
== '__main__':