Initial import to Tizen
[profile/ivi/python-twisted.git] / twisted / pair / test / test_rawudp.py
1 # Copyright (c) Twisted Matrix Laboratories.
2 # See LICENSE for details.
3
4 #
5 from twisted.trial import unittest
6
7 from twisted.internet import protocol, reactor, error
8 from twisted.python import failure
9 from twisted.pair import rawudp
10
11 class MyProtocol(protocol.DatagramProtocol):
12     def __init__(self, expecting):
13         self.expecting = list(expecting)
14
15     def datagramReceived(self, data, (host, port)):
16         assert self.expecting, 'Got a packet when not expecting anymore.'
17         expectData, expectHost, expectPort = self.expecting.pop(0)
18
19         assert expectData == data, "Expected data %r, got %r" % (expectData, data)
20         assert expectHost == host, "Expected host %r, got %r" % (expectHost, host)
21         assert expectPort == port, "Expected port %d=0x%04x, got %d=0x%04x" % (expectPort, expectPort, port, port)
22
23 class RawUDPTestCase(unittest.TestCase):
24     def testPacketParsing(self):
25         proto = rawudp.RawUDPProtocol()
26         p1 = MyProtocol([
27
28             ('foobar', 'testHost', 0x43A2),
29
30             ])
31         proto.addProto(0xF00F, p1)
32
33         proto.datagramReceived("\x43\xA2" #source
34                                + "\xf0\x0f" #dest
35                                + "\x00\x06" #len
36                                + "\xDE\xAD" #check
37                                + "foobar",
38                                partial=0,
39                                dest='dummy',
40                                source='testHost',
41                                protocol='dummy',
42                                version='dummy',
43                                ihl='dummy',
44                                tos='dummy',
45                                tot_len='dummy',
46                                fragment_id='dummy',
47                                fragment_offset='dummy',
48                                dont_fragment='dummy',
49                                more_fragments='dummy',
50                                ttl='dummy',
51                                )
52
53         assert not p1.expecting, \
54                'Should not expect any more packets, but still want %r' % p1.expecting
55
56     def testMultiplePackets(self):
57         proto = rawudp.RawUDPProtocol()
58         p1 = MyProtocol([
59
60             ('foobar', 'testHost', 0x43A2),
61             ('quux', 'otherHost', 0x33FE),
62
63             ])
64         proto.addProto(0xF00F, p1)
65         proto.datagramReceived("\x43\xA2" #source
66                                + "\xf0\x0f" #dest
67                                + "\x00\x06" #len
68                                + "\xDE\xAD" #check
69                                + "foobar",
70                                partial=0,
71                                dest='dummy',
72                                source='testHost',
73                                protocol='dummy',
74                                version='dummy',
75                                ihl='dummy',
76                                tos='dummy',
77                                tot_len='dummy',
78                                fragment_id='dummy',
79                                fragment_offset='dummy',
80                                dont_fragment='dummy',
81                                more_fragments='dummy',
82                                ttl='dummy',
83                                )
84         proto.datagramReceived("\x33\xFE" #source
85                                + "\xf0\x0f" #dest
86                                + "\x00\x05" #len
87                                + "\xDE\xAD" #check
88                                + "quux",
89                                partial=0,
90                                dest='dummy',
91                                source='otherHost',
92                                protocol='dummy',
93                                version='dummy',
94                                ihl='dummy',
95                                tos='dummy',
96                                tot_len='dummy',
97                                fragment_id='dummy',
98                                fragment_offset='dummy',
99                                dont_fragment='dummy',
100                                more_fragments='dummy',
101                                ttl='dummy',
102                                )
103
104         assert not p1.expecting, \
105                'Should not expect any more packets, but still want %r' % p1.expecting
106
107
108     def testMultipleSameProtos(self):
109         proto = rawudp.RawUDPProtocol()
110         p1 = MyProtocol([
111
112             ('foobar', 'testHost', 0x43A2),
113
114             ])
115
116         p2 = MyProtocol([
117
118             ('foobar', 'testHost', 0x43A2),
119
120             ])
121
122         proto.addProto(0xF00F, p1)
123         proto.addProto(0xF00F, p2)
124
125         proto.datagramReceived("\x43\xA2" #source
126                                + "\xf0\x0f" #dest
127                                + "\x00\x06" #len
128                                + "\xDE\xAD" #check
129                                + "foobar",
130                                partial=0,
131                                dest='dummy',
132                                source='testHost',
133                                protocol='dummy',
134                                version='dummy',
135                                ihl='dummy',
136                                tos='dummy',
137                                tot_len='dummy',
138                                fragment_id='dummy',
139                                fragment_offset='dummy',
140                                dont_fragment='dummy',
141                                more_fragments='dummy',
142                                ttl='dummy',
143                                )
144
145         assert not p1.expecting, \
146                'Should not expect any more packets, but still want %r' % p1.expecting
147         assert not p2.expecting, \
148                'Should not expect any more packets, but still want %r' % p2.expecting
149
150     def testWrongProtoNotSeen(self):
151         proto = rawudp.RawUDPProtocol()
152         p1 = MyProtocol([])
153         proto.addProto(1, p1)
154
155         proto.datagramReceived("\x43\xA2" #source
156                                + "\xf0\x0f" #dest
157                                + "\x00\x06" #len
158                                + "\xDE\xAD" #check
159                                + "foobar",
160                                partial=0,
161                                dest='dummy',
162                                source='testHost',
163                                protocol='dummy',
164                                version='dummy',
165                                ihl='dummy',
166                                tos='dummy',
167                                tot_len='dummy',
168                                fragment_id='dummy',
169                                fragment_offset='dummy',
170                                dont_fragment='dummy',
171                                more_fragments='dummy',
172                                ttl='dummy',
173                                )
174
175     def testDemuxing(self):
176         proto = rawudp.RawUDPProtocol()
177         p1 = MyProtocol([
178
179             ('foobar', 'testHost', 0x43A2),
180             ('quux', 'otherHost', 0x33FE),
181
182             ])
183         proto.addProto(0xF00F, p1)
184
185         p2 = MyProtocol([
186
187             ('quux', 'otherHost', 0xA401),
188             ('foobar', 'testHost', 0xA302),
189
190             ])
191         proto.addProto(0xB050, p2)
192
193         proto.datagramReceived("\xA4\x01" #source
194                                + "\xB0\x50" #dest
195                                + "\x00\x05" #len
196                                + "\xDE\xAD" #check
197                                + "quux",
198                                partial=0,
199                                dest='dummy',
200                                source='otherHost',
201                                protocol='dummy',
202                                version='dummy',
203                                ihl='dummy',
204                                tos='dummy',
205                                tot_len='dummy',
206                                fragment_id='dummy',
207                                fragment_offset='dummy',
208                                dont_fragment='dummy',
209                                more_fragments='dummy',
210                                ttl='dummy',
211                                )
212         proto.datagramReceived("\x43\xA2" #source
213                                + "\xf0\x0f" #dest
214                                + "\x00\x06" #len
215                                + "\xDE\xAD" #check
216                                + "foobar",
217                                partial=0,
218                                dest='dummy',
219                                source='testHost',
220                                protocol='dummy',
221                                version='dummy',
222                                ihl='dummy',
223                                tos='dummy',
224                                tot_len='dummy',
225                                fragment_id='dummy',
226                                fragment_offset='dummy',
227                                dont_fragment='dummy',
228                                more_fragments='dummy',
229                                ttl='dummy',
230                                )
231         proto.datagramReceived("\x33\xFE" #source
232                                + "\xf0\x0f" #dest
233                                + "\x00\x05" #len
234                                + "\xDE\xAD" #check
235                                + "quux",
236                                partial=0,
237                                dest='dummy',
238                                source='otherHost',
239                                protocol='dummy',
240                                version='dummy',
241                                ihl='dummy',
242                                tos='dummy',
243                                tot_len='dummy',
244                                fragment_id='dummy',
245                                fragment_offset='dummy',
246                                dont_fragment='dummy',
247                                more_fragments='dummy',
248                                ttl='dummy',
249                                )
250         proto.datagramReceived("\xA3\x02" #source
251                                + "\xB0\x50" #dest
252                                + "\x00\x06" #len
253                                + "\xDE\xAD" #check
254                                + "foobar",
255                                partial=0,
256                                dest='dummy',
257                                source='testHost',
258                                protocol='dummy',
259                                version='dummy',
260                                ihl='dummy',
261                                tos='dummy',
262                                tot_len='dummy',
263                                fragment_id='dummy',
264                                fragment_offset='dummy',
265                                dont_fragment='dummy',
266                                more_fragments='dummy',
267                                ttl='dummy',
268                                )
269
270         assert not p1.expecting, \
271                'Should not expect any more packets, but still want %r' % p1.expecting
272         assert not p2.expecting, \
273                'Should not expect any more packets, but still want %r' % p2.expecting
274
275     def testAddingBadProtos_WrongLevel(self):
276         """Adding a wrong level protocol raises an exception."""
277         e = rawudp.RawUDPProtocol()
278         try:
279             e.addProto(42, "silliness")
280         except TypeError, e:
281             if e.args == ('Added protocol must be an instance of DatagramProtocol',):
282                 pass
283             else:
284                 raise
285         else:
286             raise AssertionError, 'addProto must raise an exception for bad protocols'
287
288
289     def testAddingBadProtos_TooSmall(self):
290         """Adding a protocol with a negative number raises an exception."""
291         e = rawudp.RawUDPProtocol()
292         try:
293             e.addProto(-1, protocol.DatagramProtocol())
294         except TypeError, e:
295             if e.args == ('Added protocol must be positive or zero',):
296                 pass
297             else:
298                 raise
299         else:
300             raise AssertionError, 'addProto must raise an exception for bad protocols'
301
302
303     def testAddingBadProtos_TooBig(self):
304         """Adding a protocol with a number >=2**16 raises an exception."""
305         e = rawudp.RawUDPProtocol()
306         try:
307             e.addProto(2**16, protocol.DatagramProtocol())
308         except TypeError, e:
309             if e.args == ('Added protocol must fit in 16 bits',):
310                 pass
311             else:
312                 raise
313         else:
314             raise AssertionError, 'addProto must raise an exception for bad protocols'
315
316     def testAddingBadProtos_TooBig2(self):
317         """Adding a protocol with a number >=2**16 raises an exception."""
318         e = rawudp.RawUDPProtocol()
319         try:
320             e.addProto(2**16+1, protocol.DatagramProtocol())
321         except TypeError, e:
322             if e.args == ('Added protocol must fit in 16 bits',):
323                 pass
324             else:
325                 raise
326         else:
327             raise AssertionError, 'addProto must raise an exception for bad protocols'