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.
- docs/Makefile +20 -0
- docs/make.bat +36 -0
- docs/source/_static/logo.png +0 -0
- docs/source/api/client.rst +10 -0
- docs/source/api/dictionary.rst +10 -0
- docs/source/api/host.rst +7 -0
- docs/source/api/packet.rst +48 -0
- docs/source/api/proxy.rst +7 -0
- docs/source/api/server.rst +13 -0
- docs/source/conf.py +158 -0
- docs/source/index.rst +75 -0
- example/acct.py +41 -0
- example/auth.py +37 -0
- example/auth_async.py +164 -0
- example/client-coa.py +61 -0
- example/coa.py +40 -0
- example/dictionary +405 -0
- example/dictionary.freeradius +91 -0
- example/pyrad.log +0 -0
- example/server.py +68 -0
- example/server_async.py +117 -0
- example/status.py +26 -0
- pyrad/__init__.py +3 -3
- pyrad/client.py +54 -9
- pyrad/client_async.py +22 -14
- pyrad/dictfile.py +2 -5
- pyrad/dictionary.py +12 -1
- pyrad/host.py +1 -1
- pyrad/packet.py +208 -133
- pyrad/proxy.py +2 -2
- pyrad/server.py +3 -7
- pyrad/server_async.py +4 -5
- pyrad/tests/__init__.py +2 -2
- pyrad/tests/mock.py +5 -1
- pyrad/tests/{testBidict.py → test_bidict.py} +2 -2
- pyrad/tests/{testClient.py → test_client.py} +28 -30
- pyrad/tests/{testDictionary.py → test_dictionary.py} +38 -21
- pyrad/tests/{testHost.py → test_host.py} +10 -10
- pyrad/tests/test_packet.py +679 -0
- pyrad/tests/{testProxy.py → test_proxy.py} +11 -11
- pyrad/tests/{testServer.py → test_server.py} +35 -33
- pyrad/tests/test_tools.py +126 -0
- pyrad/tools.py +254 -158
- {pyrad-2.3.dist-info → pyrad-2.5.0.dist-info}/METADATA +44 -20
- pyrad-2.5.0.dist-info/RECORD +51 -0
- {pyrad-2.3.dist-info → pyrad-2.5.0.dist-info}/WHEEL +1 -1
- {pyrad-2.3.dist-info → pyrad-2.5.0.dist-info/licenses}/LICENSE.txt +2 -1
- pyrad-2.5.0.dist-info/top_level.txt +3 -0
- pyrad/tests/testPacket.py +0 -530
- pyrad/tests/testTools.py +0 -122
- pyrad-2.3.dist-info/RECORD +0 -29
- pyrad-2.3.dist-info/top_level.txt +0 -1
- {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.
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
114
|
-
self.
|
|
115
|
-
self.
|
|
116
|
-
self.
|
|
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
|
-
|
|
135
|
-
|
|
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
|
-
|
|
146
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
245
|
-
self.
|
|
246
|
-
self.
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
289
|
-
self.
|
|
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)
|