pyrad 2.3__py3-none-any.whl → 2.5.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. docs/Makefile +20 -0
  2. docs/make.bat +36 -0
  3. docs/source/_static/logo.png +0 -0
  4. docs/source/api/client.rst +10 -0
  5. docs/source/api/dictionary.rst +10 -0
  6. docs/source/api/host.rst +7 -0
  7. docs/source/api/packet.rst +48 -0
  8. docs/source/api/proxy.rst +7 -0
  9. docs/source/api/server.rst +13 -0
  10. docs/source/conf.py +158 -0
  11. docs/source/index.rst +75 -0
  12. example/acct.py +41 -0
  13. example/auth.py +37 -0
  14. example/auth_async.py +164 -0
  15. example/client-coa.py +61 -0
  16. example/coa.py +40 -0
  17. example/dictionary +405 -0
  18. example/dictionary.freeradius +91 -0
  19. example/pyrad.log +0 -0
  20. example/server.py +68 -0
  21. example/server_async.py +117 -0
  22. example/status.py +26 -0
  23. pyrad/__init__.py +3 -3
  24. pyrad/client.py +54 -9
  25. pyrad/client_async.py +22 -14
  26. pyrad/dictfile.py +2 -5
  27. pyrad/dictionary.py +12 -1
  28. pyrad/host.py +1 -1
  29. pyrad/packet.py +208 -133
  30. pyrad/proxy.py +2 -2
  31. pyrad/server.py +3 -7
  32. pyrad/server_async.py +4 -5
  33. pyrad/tests/__init__.py +2 -2
  34. pyrad/tests/mock.py +5 -1
  35. pyrad/tests/{testBidict.py → test_bidict.py} +2 -2
  36. pyrad/tests/{testClient.py → test_client.py} +28 -30
  37. pyrad/tests/{testDictionary.py → test_dictionary.py} +38 -21
  38. pyrad/tests/{testHost.py → test_host.py} +10 -10
  39. pyrad/tests/test_packet.py +679 -0
  40. pyrad/tests/{testProxy.py → test_proxy.py} +11 -11
  41. pyrad/tests/{testServer.py → test_server.py} +35 -33
  42. pyrad/tests/test_tools.py +126 -0
  43. pyrad/tools.py +254 -158
  44. {pyrad-2.3.dist-info → pyrad-2.5.0.dist-info}/METADATA +44 -20
  45. pyrad-2.5.0.dist-info/RECORD +51 -0
  46. {pyrad-2.3.dist-info → pyrad-2.5.0.dist-info}/WHEEL +1 -1
  47. {pyrad-2.3.dist-info → pyrad-2.5.0.dist-info/licenses}/LICENSE.txt +2 -1
  48. pyrad-2.5.0.dist-info/top_level.txt +3 -0
  49. pyrad/tests/testPacket.py +0 -530
  50. pyrad/tests/testTools.py +0 -122
  51. pyrad-2.3.dist-info/RECORD +0 -29
  52. pyrad-2.3.dist-info/top_level.txt +0 -1
  53. {pyrad-2.3.dist-info → pyrad-2.5.0.dist-info}/zip-safe +0 -0
@@ -1,16 +1,16 @@
1
1
  import select
2
2
  import socket
3
3
  import unittest
4
+ from .mock import MockFd
5
+ from .mock import MockPoll
6
+ from .mock import MockSocket
7
+ from .mock import MockClassMethod
8
+ from .mock import UnmockClassMethods
4
9
  from pyrad.proxy import Proxy
5
10
  from pyrad.packet import AccessAccept
6
11
  from pyrad.packet import AccessRequest
7
12
  from pyrad.server import ServerPacketError
8
13
  from pyrad.server import Server
9
- from pyrad.tests.mock import MockFd
10
- from pyrad.tests.mock import MockPoll
11
- from pyrad.tests.mock import MockSocket
12
- from pyrad.tests.mock import MockClassMethod
13
- from pyrad.tests.mock import UnmockClassMethods
14
14
 
15
15
 
16
16
  class TrivialObject:
@@ -30,10 +30,10 @@ class SocketTests(unittest.TestCase):
30
30
  def testProxyFd(self):
31
31
  self.proxy._poll = MockPoll()
32
32
  self.proxy._PrepareSockets()
33
- self.failUnless(isinstance(self.proxy._proxyfd, MockSocket))
33
+ self.assertTrue(isinstance(self.proxy._proxyfd, MockSocket))
34
34
  self.assertEqual(list(self.proxy._fdmap.keys()), [1])
35
35
  self.assertEqual(self.proxy._poll.registry,
36
- {1: select.POLLIN | select.POLLPRI | select.POLLERR})
36
+ {1: select.POLLIN | select.POLLPRI | select.POLLERR})
37
37
 
38
38
 
39
39
  class ProxyPacketHandlingTests(unittest.TestCase):
@@ -50,7 +50,7 @@ class ProxyPacketHandlingTests(unittest.TestCase):
50
50
  try:
51
51
  self.proxy._HandleProxyPacket(self.packet)
52
52
  except ServerPacketError as e:
53
- self.failUnless('unknown host' in str(e))
53
+ self.assertTrue('unknown host' in str(e))
54
54
  else:
55
55
  self.fail()
56
56
 
@@ -63,7 +63,7 @@ class ProxyPacketHandlingTests(unittest.TestCase):
63
63
  try:
64
64
  self.proxy._HandleProxyPacket(self.packet)
65
65
  except ServerPacketError as e:
66
- self.failUnless('non-response' in str(e))
66
+ self.assertTrue('non-response' in str(e))
67
67
  else:
68
68
  self.fail()
69
69
 
@@ -82,14 +82,14 @@ class OtherTests(unittest.TestCase):
82
82
  MockClassMethod(Server, '_ProcessInput')
83
83
  self.proxy._ProcessInput(fd)
84
84
  self.assertEqual(self.proxy.called,
85
- [('_ProcessInput', (fd,), {})])
85
+ [('_ProcessInput', (fd,), {})])
86
86
 
87
87
  def testProcessInput(self):
88
88
  MockClassMethod(Proxy, '_GrabPacket')
89
89
  MockClassMethod(Proxy, '_HandleProxyPacket')
90
90
  self.proxy._ProcessInput(self.proxy._proxyfd)
91
91
  self.assertEqual([x[0] for x in self.proxy.called],
92
- ['_GrabPacket', '_HandleProxyPacket'])
92
+ ['_GrabPacket', '_HandleProxyPacket'])
93
93
 
94
94
 
95
95
  if not hasattr(select, 'poll'):
@@ -1,16 +1,16 @@
1
1
  import select
2
2
  import socket
3
3
  import unittest
4
+ from .mock import MockFinished
5
+ from .mock import MockFd
6
+ from .mock import MockPoll
7
+ from .mock import MockSocket
8
+ from .mock import MockClassMethod
9
+ from .mock import UnmockClassMethods
4
10
  from pyrad.packet import PacketError
5
11
  from pyrad.server import RemoteHost
6
12
  from pyrad.server import Server
7
13
  from pyrad.server import ServerPacketError
8
- from pyrad.tests.mock import MockFinished
9
- from pyrad.tests.mock import MockFd
10
- from pyrad.tests.mock import MockPoll
11
- from pyrad.tests.mock import MockSocket
12
- from pyrad.tests.mock import MockClassMethod
13
- from pyrad.tests.mock import UnmockClassMethods
14
14
  from pyrad.packet import AccessRequest
15
15
  from pyrad.packet import AccountingRequest
16
16
 
@@ -31,7 +31,7 @@ class RemoteHostTests(unittest.TestCase):
31
31
 
32
32
  def testNamedConstruction(self):
33
33
  host = RemoteHost(address='address', secret='secret', name='name',
34
- authport='authport', acctport='acctport', coaport='coaport')
34
+ authport='authport', acctport='acctport', coaport='coaport')
35
35
  self.assertEqual(host.address, 'address')
36
36
  self.assertEqual(host.secret, 'secret')
37
37
  self.assertEqual(host.name, 'name')
@@ -39,6 +39,7 @@ class RemoteHostTests(unittest.TestCase):
39
39
  self.assertEqual(host.acctport, 'acctport')
40
40
  self.assertEqual(host.coaport, 'coaport')
41
41
 
42
+
42
43
  class ServerConstructiontests(unittest.TestCase):
43
44
  def testSimpleConstruction(self):
44
45
  server = Server()
@@ -50,7 +51,7 @@ class ServerConstructiontests(unittest.TestCase):
50
51
  self.assertEqual(server.hosts, {})
51
52
 
52
53
  def testParameterOrder(self):
53
- server = Server([], 'authport', 'acctport', 'coaport','hosts', 'dict')
54
+ server = Server([], 'authport', 'acctport', 'coaport', 'hosts', 'dict')
54
55
  self.assertEqual(server.authfds, [])
55
56
  self.assertEqual(server.acctfds, [])
56
57
  self.assertEqual(server.authport, 'authport')
@@ -85,21 +86,21 @@ class SocketTests(unittest.TestCase):
85
86
  self.server.BindToAddress('192.168.13.13')
86
87
  self.assertEqual(len(self.server.authfds), 1)
87
88
  self.assertEqual(self.server.authfds[0].address,
88
- ('192.168.13.13', 1812))
89
+ ('192.168.13.13', 1812))
89
90
 
90
91
  self.assertEqual(len(self.server.acctfds), 1)
91
92
  self.assertEqual(self.server.acctfds[0].address,
92
- ('192.168.13.13', 1813))
93
+ ('192.168.13.13', 1813))
93
94
 
94
95
  def testBindv6(self):
95
96
  self.server.BindToAddress('2001:db8:123::1')
96
97
  self.assertEqual(len(self.server.authfds), 1)
97
98
  self.assertEqual(self.server.authfds[0].address,
98
- ('2001:db8:123::1', 1812))
99
+ ('2001:db8:123::1', 1812))
99
100
 
100
101
  self.assertEqual(len(self.server.acctfds), 1)
101
102
  self.assertEqual(self.server.acctfds[0].address,
102
- ('2001:db8:123::1', 1813))
103
+ ('2001:db8:123::1', 1813))
103
104
 
104
105
  def testGrabPacket(self):
105
106
  def gen(data):
@@ -110,10 +111,10 @@ class SocketTests(unittest.TestCase):
110
111
  fd = MockFd()
111
112
  fd.source = object()
112
113
  pkt = self.server._GrabPacket(gen, fd)
113
- self.failUnless(isinstance(pkt, TrivialObject))
114
- self.failUnless(pkt.fd is fd)
115
- self.failUnless(pkt.source is fd.source)
116
- self.failUnless(pkt.data is fd.data)
114
+ self.assertTrue(isinstance(pkt, TrivialObject))
115
+ self.assertTrue(pkt.fd is fd)
116
+ self.assertTrue(pkt.source is fd.source)
117
+ self.assertTrue(pkt.data is fd.data)
117
118
 
118
119
  def testPrepareSocketNoFds(self):
119
120
  self.server._poll = MockPoll()
@@ -131,8 +132,8 @@ class SocketTests(unittest.TestCase):
131
132
 
132
133
  self.assertEqual(list(self.server._fdmap.keys()), [12, 14])
133
134
  self.assertEqual(self.server._poll.registry,
134
- {12: select.POLLIN | select.POLLPRI | select.POLLERR,
135
- 14: select.POLLIN | select.POLLPRI | select.POLLERR})
135
+ {12: select.POLLIN | select.POLLPRI | select.POLLERR,
136
+ 14: select.POLLIN | select.POLLPRI | select.POLLERR})
136
137
 
137
138
  def testPrepareSocketAcctFds(self):
138
139
  self.server._poll = MockPoll()
@@ -142,8 +143,8 @@ class SocketTests(unittest.TestCase):
142
143
 
143
144
  self.assertEqual(list(self.server._fdmap.keys()), [12, 14])
144
145
  self.assertEqual(self.server._poll.registry,
145
- {12: select.POLLIN | select.POLLPRI | select.POLLERR,
146
- 14: select.POLLIN | select.POLLPRI | select.POLLERR})
146
+ {12: select.POLLIN | select.POLLPRI | select.POLLERR,
147
+ 14: select.POLLIN | select.POLLPRI | select.POLLERR})
147
148
 
148
149
 
149
150
  class AuthPacketHandlingTests(unittest.TestCase):
@@ -160,7 +161,7 @@ class AuthPacketHandlingTests(unittest.TestCase):
160
161
  try:
161
162
  self.server._HandleAuthPacket(self.packet)
162
163
  except ServerPacketError as e:
163
- self.failUnless('unknown host' in str(e))
164
+ self.assertTrue('unknown host' in str(e))
164
165
  else:
165
166
  self.fail()
166
167
 
@@ -169,7 +170,7 @@ class AuthPacketHandlingTests(unittest.TestCase):
169
170
  try:
170
171
  self.server._HandleAuthPacket(self.packet)
171
172
  except ServerPacketError as e:
172
- self.failUnless('port' in str(e))
173
+ self.assertTrue('port' in str(e))
173
174
  else:
174
175
  self.fail()
175
176
 
@@ -180,7 +181,7 @@ class AuthPacketHandlingTests(unittest.TestCase):
180
181
  Server.HandleAuthPacket = HandleAuthPacket
181
182
 
182
183
  self.server._HandleAuthPacket(self.packet)
183
- self.failUnless(self.server.handled is self.packet)
184
+ self.assertTrue(self.server.handled is self.packet)
184
185
 
185
186
  Server.HandleAuthPacket = hap
186
187
 
@@ -199,7 +200,7 @@ class AcctPacketHandlingTests(unittest.TestCase):
199
200
  try:
200
201
  self.server._HandleAcctPacket(self.packet)
201
202
  except ServerPacketError as e:
202
- self.failUnless('unknown host' in str(e))
203
+ self.assertTrue('unknown host' in str(e))
203
204
  else:
204
205
  self.fail()
205
206
 
@@ -208,7 +209,7 @@ class AcctPacketHandlingTests(unittest.TestCase):
208
209
  try:
209
210
  self.server._HandleAcctPacket(self.packet)
210
211
  except ServerPacketError as e:
211
- self.failUnless('port' in str(e))
212
+ self.assertTrue('port' in str(e))
212
213
  else:
213
214
  self.fail()
214
215
 
@@ -219,7 +220,7 @@ class AcctPacketHandlingTests(unittest.TestCase):
219
220
  Server.HandleAcctPacket = HandleAcctPacket
220
221
 
221
222
  self.server._HandleAcctPacket(self.packet)
222
- self.failUnless(self.server.handled is self.packet)
223
+ self.assertTrue(self.server.handled is self.packet)
223
224
 
224
225
  Server.HandleAcctPacket = hap
225
226
 
@@ -241,9 +242,9 @@ class OtherTests(unittest.TestCase):
241
242
  return reply
242
243
 
243
244
  reply = self.server.CreateReplyPacket(TrivialPacket(),
244
- one='one', two='two')
245
- self.failUnless(isinstance(reply, TrivialObject))
246
- self.failUnless(reply.source is TrivialPacket.source)
245
+ one='one', two='two')
246
+ self.assertTrue(isinstance(reply, TrivialObject))
247
+ self.assertTrue(reply.source is TrivialPacket.source)
247
248
  self.assertEqual(reply.kw, dict(one='one', two='two'))
248
249
 
249
250
  def testAuthProcessInput(self):
@@ -254,7 +255,7 @@ class OtherTests(unittest.TestCase):
254
255
 
255
256
  self.server._ProcessInput(fd)
256
257
  self.assertEqual([x[0] for x in self.server.called],
257
- ['_GrabPacket', '_HandleAuthPacket'])
258
+ ['_GrabPacket', '_HandleAuthPacket'])
258
259
  self.assertEqual(self.server.called[0][1][1], fd)
259
260
 
260
261
  def testAcctProcessInput(self):
@@ -266,7 +267,7 @@ class OtherTests(unittest.TestCase):
266
267
 
267
268
  self.server._ProcessInput(fd)
268
269
  self.assertEqual([x[0] for x in self.server.called],
269
- ['_GrabPacket', '_HandleAcctPacket'])
270
+ ['_GrabPacket', '_HandleAcctPacket'])
270
271
  self.assertEqual(self.server.called[0][1][1], fd)
271
272
 
272
273
 
@@ -285,8 +286,8 @@ class ServerRunTests(unittest.TestCase):
285
286
  MockClassMethod(Server, '_PrepareSockets')
286
287
  self.assertRaises(MockFinished, self.server.Run)
287
288
  self.assertEqual(self.server.called, [('_PrepareSockets', (), {})])
288
- self.failUnless(isinstance(self.server._fdmap, dict))
289
- self.failUnless(isinstance(self.server._poll, MockPoll))
289
+ self.assertTrue(isinstance(self.server._fdmap, dict))
290
+ self.assertTrue(isinstance(self.server._poll, MockPoll))
290
291
 
291
292
  def testRunIgnoresPollErrors(self):
292
293
  self.server.authfds = [MockFd()]
@@ -316,6 +317,7 @@ class ServerRunTests(unittest.TestCase):
316
317
  self.assertRaises(MockFinished, self.server.Run)
317
318
  self.assertEqual(self.server.called, [('_ProcessInput', (fd[0],), {})])
318
319
 
320
+
319
321
  if not hasattr(select, 'poll'):
320
322
  del SocketTests
321
323
  del ServerRunTests
@@ -0,0 +1,126 @@
1
+ from pyrad import tools
2
+ import unittest
3
+
4
+
5
+ class EncodingTests(unittest.TestCase):
6
+ def testStringEncoding(self):
7
+ self.assertRaises(ValueError, tools.EncodeString, 'x' * 254)
8
+ self.assertEqual(
9
+ tools.EncodeString('1234567890'),
10
+ b'1234567890')
11
+
12
+ def testInvalidStringEncodingRaisesTypeError(self):
13
+ self.assertRaises(TypeError, tools.EncodeString, 1)
14
+
15
+ def testAddressEncoding(self):
16
+ self.assertRaises((ValueError, Exception), tools.EncodeAddress, 'TEST123')
17
+ self.assertEqual(
18
+ tools.EncodeAddress('192.168.0.255'),
19
+ b'\xc0\xa8\x00\xff')
20
+
21
+ def testInvalidAddressEncodingRaisesTypeError(self):
22
+ self.assertRaises(TypeError, tools.EncodeAddress, 1)
23
+
24
+ def testIntegerEncoding(self):
25
+ self.assertEqual(tools.EncodeInteger(0x01020304), b'\x01\x02\x03\x04')
26
+
27
+ def testInteger64Encoding(self):
28
+ self.assertEqual(
29
+ tools.EncodeInteger64(0xFFFFFFFFFFFFFFFF), b'\xff' * 8
30
+ )
31
+
32
+ def testUnsignedIntegerEncoding(self):
33
+ self.assertEqual(tools.EncodeInteger(0xFFFFFFFF), b'\xff\xff\xff\xff')
34
+
35
+ def testInvalidIntegerEncodingRaisesTypeError(self):
36
+ self.assertRaises(TypeError, tools.EncodeInteger, 'ONE')
37
+
38
+ def testDateEncoding(self):
39
+ self.assertEqual(tools.EncodeDate(0x01020304), b'\x01\x02\x03\x04')
40
+
41
+ def testInvalidDataEncodingRaisesTypeError(self):
42
+ self.assertRaises(TypeError, tools.EncodeDate, '1')
43
+
44
+ def testEncodeAscendBinary(self):
45
+ self.assertEqual(
46
+ tools.EncodeAscendBinary('family=ipv4 action=discard direction=in dst=10.10.255.254/32'),
47
+ b'\x01\x00\x01\x00\x00\x00\x00\x00\n\n\xff\xfe\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
48
+
49
+ def testStringDecoding(self):
50
+ self.assertEqual(
51
+ tools.DecodeString(b'1234567890'),
52
+ '1234567890')
53
+
54
+ def testAddressDecoding(self):
55
+ self.assertEqual(
56
+ tools.DecodeAddress(b'\xc0\xa8\x00\xff'),
57
+ '192.168.0.255')
58
+
59
+ def testIntegerDecoding(self):
60
+ self.assertEqual(
61
+ tools.DecodeInteger(b'\x01\x02\x03\x04'),
62
+ 0x01020304)
63
+
64
+ def testInteger64Decoding(self):
65
+ self.assertEqual(
66
+ tools.DecodeInteger64(b'\xff' * 8), 0xFFFFFFFFFFFFFFFF
67
+ )
68
+
69
+ def testDateDecoding(self):
70
+ self.assertEqual(
71
+ tools.DecodeDate(b'\x01\x02\x03\x04'),
72
+ 0x01020304)
73
+
74
+ def testOctetsEncoding(self):
75
+ self.assertEqual(tools.EncodeOctets('0x01020304'), b'\x01\x02\x03\x04')
76
+ self.assertEqual(tools.EncodeOctets(b'0x01020304'), b'\x01\x02\x03\x04')
77
+ self.assertEqual(tools.EncodeOctets('16909060'), b'\x01\x02\x03\x04')
78
+ # encodes to 253 bytes
79
+ self.assertEqual(tools.EncodeOctets('0x0102030405060708090A0B0C0D0E0F100102030405060708090A0B0C0D0E0F100102030405060708090A0B0C0D0E0F100102030405060708090A0B0C0D0E0F100102030405060708090A0B0C0D0E0F100102030405060708090A0B0C0D0E0F100102030405060708090A0B0C0D0E0F100102030405060708090A0B0C0D0E0F100102030405060708090A0B0C0D0E0F100102030405060708090A0B0C0D0E0F100102030405060708090A0B0C0D0E0F100102030405060708090A0B0C0D0E0F100102030405060708090A0B0C0D0E0F100102030405060708090A0B0C0D0E0F100102030405060708090A0B0C0D0E0F100102030405060708090A0B0C0D'), b'\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r')
80
+ self.assertRaisesRegex(ValueError, 'Can only encode strings of <= 253 characters', tools.EncodeOctets, '0x0102030405060708090A0B0C0D0E0F100102030405060708090A0B0C0D0E0F100102030405060708090A0B0C0D0E0F100102030405060708090A0B0C0D0E0F100102030405060708090A0B0C0D0E0F100102030405060708090A0B0C0D0E0F100102030405060708090A0B0C0D0E0F100102030405060708090A0B0C0D0E0F100102030405060708090A0B0C0D0E0F100102030405060708090A0B0C0D0E0F100102030405060708090A0B0C0D0E0F100102030405060708090A0B0C0D0E0F100102030405060708090A0B0C0D0E0F100102030405060708090A0B0C0D0E0F100102030405060708090A0B0C0D0E0F100102030405060708090A0B0C0D0E')
81
+
82
+ def testUnknownTypeEncoding(self):
83
+ self.assertRaises(ValueError, tools.EncodeAttr, 'unknown', None)
84
+
85
+ def testUnknownTypeDecoding(self):
86
+ self.assertRaises(ValueError, tools.DecodeAttr, 'unknown', None)
87
+
88
+ def testEncodeFunction(self):
89
+ self.assertEqual(
90
+ tools.EncodeAttr('string', 'string'),
91
+ b'string')
92
+ self.assertEqual(
93
+ tools.EncodeAttr('octets', b'string'),
94
+ b'string')
95
+ self.assertEqual(
96
+ tools.EncodeAttr('ipaddr', '192.168.0.255'),
97
+ b'\xc0\xa8\x00\xff')
98
+ self.assertEqual(
99
+ tools.EncodeAttr('integer', 0x01020304),
100
+ b'\x01\x02\x03\x04')
101
+ self.assertEqual(
102
+ tools.EncodeAttr('date', 0x01020304),
103
+ b'\x01\x02\x03\x04')
104
+ self.assertEqual(
105
+ tools.EncodeAttr('integer64', 0xFFFFFFFFFFFFFFFF),
106
+ b'\xff'*8)
107
+
108
+ def testDecodeFunction(self):
109
+ self.assertEqual(
110
+ tools.DecodeAttr('string', b'string'),
111
+ 'string')
112
+ self.assertEqual(
113
+ tools.EncodeAttr('octets', b'string'),
114
+ b'string')
115
+ self.assertEqual(
116
+ tools.DecodeAttr('ipaddr', b'\xc0\xa8\x00\xff'),
117
+ '192.168.0.255')
118
+ self.assertEqual(
119
+ tools.DecodeAttr('integer', b'\x01\x02\x03\x04'),
120
+ 0x01020304)
121
+ self.assertEqual(
122
+ tools.DecodeAttr('integer64', b'\xff'*8),
123
+ 0xFFFFFFFFFFFFFFFF)
124
+ self.assertEqual(
125
+ tools.DecodeAttr('date', b'\x01\x02\x03\x04'),
126
+ 0x01020304)