PageRenderTime 48ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/python/lib/PyAMF-0.6.1/pyamf/tests/test_remoting.py

https://gitlab.com/gregtyka/frankenserver
Python | 390 lines | 243 code | 105 blank | 42 comment | 7 complexity | af3412acb32ac26358eaaaf9c56f8864 MD5 | raw file
  1. # -*- coding: utf-8 -*-
  2. #
  3. # Copyright (c) The PyAMF Project.
  4. # See LICENSE.txt for details.
  5. """
  6. Tests for AMF Remoting.
  7. @since: 0.1.0
  8. """
  9. import unittest
  10. import pyamf
  11. from pyamf import remoting, util
  12. class DecoderTestCase(unittest.TestCase):
  13. """
  14. Tests the decoders.
  15. """
  16. def test_client_version(self):
  17. """
  18. Tests the AMF client version.
  19. """
  20. for x in ('\x00', '\x01', '\x03'):
  21. try:
  22. remoting.decode('\x00' + x)
  23. except IOError:
  24. pass
  25. def test_null_msg(self):
  26. msg = remoting.decode('\x00\x00\x00\x00\x00\x00')
  27. self.assertEqual(msg.amfVersion, 0)
  28. self.assertEqual(msg.headers, {})
  29. self.assertEqual(msg, {})
  30. y = [x for x in msg]
  31. self.assertEqual(y, [])
  32. def test_simple_header(self):
  33. """
  34. Test header decoder.
  35. """
  36. msg = remoting.decode('\x00\x00\x00\x01\x00\x04name\x00\x00\x00\x00'
  37. '\x05\x0a\x00\x00\x00\x00\x00\x00')
  38. self.assertEqual(msg.amfVersion, 0)
  39. self.assertEqual(len(msg.headers), 1)
  40. self.assertEqual('name' in msg.headers, True)
  41. self.assertEqual(msg.headers['name'], [])
  42. self.assertFalse(msg.headers.is_required('name'))
  43. self.assertEqual(msg, {})
  44. y = [x for x in msg]
  45. self.assertEqual(y, [])
  46. def test_required_header(self):
  47. msg = remoting.decode('\x00\x00\x00\x01\x00\x04name\x01\x00\x00\x00'
  48. '\x05\x0a\x00\x00\x00\x00\x00\x00')
  49. self.assertTrue(msg.headers.is_required('name'))
  50. def test_invalid_header_data_length(self):
  51. remoting.decode('\x00\x00\x00\x01\x00\x04name\x00\x00\x00\x00\x06\x0a'
  52. '\x00\x00\x00\x00\x00\x00')
  53. self.failUnlessRaises(pyamf.DecodeError, remoting.decode,
  54. '\x00\x00\x00\x01\x00\x04name\x00\x00\x00\x00\x06\x0a\x00\x00\x00'
  55. '\x00\x00\x00', strict=True)
  56. def test_multiple_headers(self):
  57. msg = remoting.decode('\x00\x00\x00\x02\x00\x04name\x00\x00\x00\x00'
  58. '\x05\x0a\x00\x00\x00\x00\x00\x04spam\x01\x00\x00\x00\x01\x05\x00'
  59. '\x00')
  60. self.assertEqual(msg.amfVersion, 0)
  61. self.assertEqual(len(msg.headers), 2)
  62. self.assertEqual('name' in msg.headers, True)
  63. self.assertEqual('spam' in msg.headers, True)
  64. self.assertEqual(msg.headers['name'], [])
  65. self.assertFalse(msg.headers.is_required('name'))
  66. self.assertEqual(msg.headers['spam'], None)
  67. self.assertTrue(msg.headers.is_required('spam'))
  68. self.assertEqual(msg, {})
  69. y = [x for x in msg]
  70. self.assertEqual(y, [])
  71. def test_simple_body(self):
  72. self.failUnlessRaises(IOError, remoting.decode,
  73. '\x00\x00\x00\x00\x00\x01')
  74. msg = remoting.decode('\x00\x00\x00\x00\x00\x01\x00\x09test.test\x00'
  75. '\x02/1\x00\x00\x00\x14\x0a\x00\x00\x00\x01\x08\x00\x00\x00\x00'
  76. '\x00\x01\x61\x02\x00\x01\x61\x00\x00\x09')
  77. self.assertEqual(msg.amfVersion, 0)
  78. self.assertEqual(len(msg.headers), 0)
  79. self.assertEqual(len(msg), 1)
  80. self.assertTrue('/1' in msg)
  81. m = msg['/1']
  82. self.assertEqual(m.target, 'test.test')
  83. self.assertEqual(m.body, [{'a': 'a'}])
  84. y = [x for x in msg]
  85. self.assertEqual(len(y), 1)
  86. x = y[0]
  87. self.assertEqual(('/1', m), x)
  88. def test_invalid_body_data_length(self):
  89. remoting.decode('\x00\x00\x00\x00\x00\x01\x00\x09test.test\x00\x02/1'
  90. '\x00\x00\x00\x13\x0a\x00\x00\x00\x01\x08\x00\x00\x00\x00\x00\x01'
  91. '\x61\x02\x00\x01\x61\x00\x00\x09')
  92. self.failUnlessRaises(pyamf.DecodeError, remoting.decode,
  93. '\x00\x00\x00\x00\x00\x01\x00\x09test.test\x00\x02/1\x00\x00\x00'
  94. '\x13\x0a\x00\x00\x00\x01\x08\x00\x00\x00\x00\x00\x01\x61\x02\x00'
  95. '\x01\x61\x00\x00\x09', strict=True)
  96. def test_message_order(self):
  97. request = util.BufferedByteStream()
  98. request.write('\x00\x00\x00\x00\x00\x02\x00\x08get_spam\x00\x02/2\x00'
  99. '\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x04echo\x00\x02/1\x00\x00'
  100. '\x00\x00\x0a\x00\x00\x00\x01\x02\x00\x0bhello world')
  101. request.seek(0, 0)
  102. request_envelope = remoting.decode(request)
  103. it = iter(request_envelope)
  104. self.assertEqual(it.next()[0], '/2')
  105. self.assertEqual(it.next()[0], '/1')
  106. self.assertRaises(StopIteration, it.next)
  107. def test_multiple_request_header_references(self):
  108. msg = remoting.decode(
  109. '\x00\x00\x00\x01\x00\x0b\x43\x72\x65\x64\x65\x6e\x74\x69\x61\x6c'
  110. '\x73\x00\x00\x00\x00\x2c\x11\x0a\x0b\x01\x0d\x75\x73\x65\x72\x69'
  111. '\x64\x06\x1f\x67\x65\x6e\x6f\x70\x72\x6f\x5c\x40\x67\x65\x72\x61'
  112. '\x72\x64\x11\x70\x61\x73\x73\x77\x6f\x72\x64\x06\x09\x67\x67\x67'
  113. '\x67\x01\x00\x01\x00\x0b\x63\x72\x65\x61\x74\x65\x47\x72\x6f\x75'
  114. '\x70\x00\x02\x2f\x31\x00\x00\x00\x1c\x0a\x00\x00\x00\x01\x11\x0a'
  115. '\x0b\x01\x09\x73\x74\x72\x41\x06\x09\x74\x65\x73\x74\x09\x73\x74'
  116. '\x72\x42\x06\x02\x01')
  117. self.assertEqual(msg.amfVersion, 0)
  118. self.assertEqual(len(msg.headers), 1)
  119. self.assertEqual(msg.headers['Credentials'],
  120. {'password': 'gggg', 'userid':'genopro\\@gerard'})
  121. self.assertEqual(len(msg), 1)
  122. self.assertTrue('/1' in msg)
  123. m = msg['/1']
  124. self.assertEqual(m.target, 'createGroup')
  125. self.assertEqual(m.body, [{'strB':'test', 'strA':'test'}])
  126. def test_timezone(self):
  127. """
  128. Ensure that the timezone offsets work as expected
  129. """
  130. import datetime
  131. td = datetime.timedelta(hours=-5)
  132. msg = remoting.decode(
  133. '\x00\x00\x00\x00\x00\x01\x00\x0b/1/onResult\x00\x04null\x00\x00'
  134. '\x00\x00\n\x00\x00\x00\x01\x0bBr>\xcc\n~\x00\x00\x00\x00',
  135. timezone_offset=td)
  136. self.assertEqual(msg['/1'].body[0],
  137. datetime.datetime(2009, 9, 24, 10, 52, 12))
  138. class EncoderTestCase(unittest.TestCase):
  139. """
  140. Test the encoders.
  141. """
  142. def test_basic(self):
  143. """
  144. """
  145. msg = remoting.Envelope(pyamf.AMF0)
  146. self.assertEqual(remoting.encode(msg).getvalue(), '\x00' * 6)
  147. msg = remoting.Envelope(pyamf.AMF3)
  148. self.assertEqual(remoting.encode(msg).getvalue(),
  149. '\x00\x03' + '\x00' * 4)
  150. def test_header(self):
  151. """
  152. Test encoding of header.
  153. """
  154. msg = remoting.Envelope(pyamf.AMF0)
  155. msg.headers['spam'] = (False, 'eggs')
  156. self.assertEqual(remoting.encode(msg).getvalue(),
  157. '\x00\x00\x00\x01\x00\x04spam\x00\x00\x00\x00\x00\n\x00\x00\x00\x02'
  158. '\x01\x00\x02\x00\x04eggs\x00\x00')
  159. msg = remoting.Envelope(pyamf.AMF0)
  160. msg.headers['spam'] = (True, ['a', 'b', 'c'])
  161. self.assertEqual(remoting.encode(msg).getvalue(),
  162. '\x00\x00\x00\x01\x00\x04spam\x00\x00\x00\x00\x00\n\x00\x00\x00\x02'
  163. '\x01\x01\n\x00\x00\x00\x03\x02\x00\x01a\x02\x00\x01b\x02\x00\x01c'
  164. '\x00\x00')
  165. def test_request(self):
  166. """
  167. Test encoding of request body.
  168. """
  169. msg = remoting.Envelope(pyamf.AMF0)
  170. msg['/1'] = remoting.Request('test.test', body=['hello'])
  171. self.assertEqual(len(msg), 1)
  172. x = msg['/1']
  173. self.assertTrue(isinstance(x, remoting.Request))
  174. self.assertEqual(x.envelope, msg)
  175. self.assertEqual(x.target, 'test.test')
  176. self.assertEqual(x.body, ['hello'])
  177. self.assertEqual(x.headers, msg.headers)
  178. self.assertEqual(remoting.encode(msg).getvalue(),
  179. '\x00\x00\x00\x00\x00\x01\x00\ttest.test\x00\x02/1\x00\x00\x00'
  180. '\x00\n\x00\x00\x00\x01\x02\x00\x05hello')
  181. def test_response(self):
  182. """
  183. Test encoding of request body.
  184. """
  185. msg = remoting.Envelope(pyamf.AMF0)
  186. msg['/1'] = remoting.Response(body=[1, 2, 3])
  187. self.assertEqual(len(msg), 1)
  188. x = msg['/1']
  189. self.assertTrue(isinstance(x, remoting.Response))
  190. self.assertEqual(x.envelope, msg)
  191. self.assertEqual(x.body, [1, 2, 3])
  192. self.assertEqual(x.status, 0)
  193. self.assertEqual(x.headers, msg.headers)
  194. self.assertEqual(remoting.encode(msg).getvalue(), '\x00\x00\x00\x00'
  195. '\x00\x01\x00\x0b/1/onResult\x00\x04null\x00\x00\x00\x00\n\x00\x00'
  196. '\x00\x03\x00?\xf0\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00'
  197. '\x00\x00\x00\x00@\x08\x00\x00\x00\x00\x00\x00')
  198. def test_message_order(self):
  199. msg = remoting.Envelope(pyamf.AMF0)
  200. msg['/3'] = remoting.Request('test.test', body='hello')
  201. msg['/1'] = remoting.Request('test.test', body='hello')
  202. msg['/2'] = remoting.Request('test.test', body='hello')
  203. it = iter(msg)
  204. self.assertEqual(it.next()[0], '/3')
  205. self.assertEqual(it.next()[0], '/1')
  206. self.assertEqual(it.next()[0], '/2')
  207. self.assertRaises(StopIteration, it.next)
  208. def test_stream_pos(self):
  209. """
  210. Ensure that the stream pointer is placed at the beginning.
  211. """
  212. msg = remoting.Envelope(pyamf.AMF0)
  213. msg['/1'] = remoting.Response(body=[1, 2, 3])
  214. stream = remoting.encode(msg)
  215. self.assertEqual(stream.tell(), 0)
  216. def test_timezone(self):
  217. """
  218. Ensure that the timezone offsets work as expected
  219. """
  220. import datetime
  221. d = datetime.datetime(2009, 9, 24, 15, 52, 12)
  222. td = datetime.timedelta(hours=-5)
  223. msg = remoting.Envelope(pyamf.AMF0)
  224. msg['/1'] = remoting.Response(body=[d])
  225. stream = remoting.encode(msg, timezone_offset=td).getvalue()
  226. self.assertEqual(stream, '\x00\x00\x00\x00\x00\x01\x00\x0b/1/onResult'
  227. '\x00\x04null\x00\x00\x00\x00\n\x00\x00\x00\x01\x0bBr>\xdd5\x06'
  228. '\x00\x00\x00\x00')
  229. class StrictEncodingTestCase(unittest.TestCase):
  230. def test_request(self):
  231. msg = remoting.Envelope(pyamf.AMF0)
  232. msg['/1'] = remoting.Request('test.test', body=['hello'])
  233. self.assertEqual(remoting.encode(msg, strict=True).getvalue(),
  234. '\x00\x00\x00\x00\x00\x01\x00\ttest.test\x00\x02/1\x00\x00\x00'
  235. '\r\n\x00\x00\x00\x01\x02\x00\x05hello')
  236. def test_response(self):
  237. msg = remoting.Envelope(pyamf.AMF0)
  238. msg['/1'] = remoting.Response(['spam'])
  239. self.assertEqual(remoting.encode(msg, strict=True).getvalue(),
  240. '\x00\x00\x00\x00\x00\x01\x00\x0b/1/onResult\x00\x04null\x00\x00'
  241. '\x00\x0c\n\x00\x00\x00\x01\x02\x00\x04spam')
  242. class FaultTestCase(unittest.TestCase):
  243. def test_exception(self):
  244. x = remoting.get_fault({'level': 'error', 'code': 'Server.Call.Failed'})
  245. self.assertRaises(remoting.RemotingCallFailed, x.raiseException)
  246. def test_kwargs(self):
  247. # The fact that this doesn't throw an error means that this test passes
  248. x = remoting.get_fault({'foo': 'bar'})
  249. self.assertIsInstance(x, remoting.ErrorFault)
  250. class ContextTextCase(unittest.TestCase):
  251. def test_body_references(self):
  252. msg = remoting.Envelope(pyamf.AMF0)
  253. f = ['a', 'b', 'c']
  254. msg['/1'] = remoting.Request('foo', body=[f])
  255. msg['/2'] = remoting.Request('bar', body=[f])
  256. s = remoting.encode(msg).getvalue()
  257. self.assertEqual(s, '\x00\x00\x00\x00\x00\x02\x00\x03foo\x00\x02/1'
  258. '\x00\x00\x00\x00\n\x00\x00\x00\x01\n\x00\x00\x00\x03\x02\x00\x01'
  259. 'a\x02\x00\x01b\x02\x00\x01c\x00\x03bar\x00\x02/2\x00\x00\x00\x00'
  260. '\n\x00\x00\x00\x01\n\x00\x00\x00\x03\x02\x00\x01a\x02\x00\x01b'
  261. '\x02\x00\x01c')
  262. class FunctionalTestCase(unittest.TestCase):
  263. def test_encode_bytearray(self):
  264. from pyamf.amf3 import ByteArray
  265. stream = ByteArray()
  266. stream.write('12345678')
  267. msg = remoting.Envelope(pyamf.AMF0)
  268. msg['/1'] = remoting.Response([stream])
  269. self.assertEqual(remoting.encode(msg).getvalue(),
  270. '\x00\x00\x00\x00\x00\x01\x00\x0b/1/onResult\x00\x04null'
  271. '\x00\x00\x00\x00\n\x00\x00\x00\x01\x11\x0c\x1112345678')
  272. class ReprTestCase(unittest.TestCase):
  273. def test_response(self):
  274. r = remoting.Response(u'€±')
  275. self.assertEqual(repr(r),
  276. "<Response status=/onResult>u'\\u20ac\\xb1'</Response>")
  277. def test_request(self):
  278. r = remoting.Request(u'€±', [u'å∫ç'])
  279. self.assertEqual(repr(r),
  280. "<Request target=u'\\u20ac\\xb1'>[u'\\xe5\\u222b\\xe7']</Request>")
  281. def test_base_fault(self):
  282. r = remoting.BaseFault(code=u'å', type=u'å', description=u'å', details=u'å')
  283. self.assertEqual(repr(r),
  284. "BaseFault level=None code=u'\\xe5' type=u'\\xe5' description=u'\\xe5'\nTraceback:\nu'\\xe5'")