/lib/pyxmpp2/test/ext_version.py

https://github.com/kulikov/python-tools · Python · 181 lines · 158 code · 19 blank · 4 comment · 1 complexity · e2fbd19b4377b43f46e0da2ecdaf6164 MD5 · raw file

  1. #!/usr/bin/python
  2. # -*- coding: UTF-8 -*-
  3. # pylint: disable=C0111
  4. import unittest
  5. import platform
  6. from pyxmpp2.etree import ElementTree
  7. import pyxmpp2.version
  8. from pyxmpp2.iq import Iq
  9. from pyxmpp2.jid import JID
  10. from pyxmpp2.stanzaprocessor import StanzaProcessor
  11. from pyxmpp2.settings import XMPPSettings
  12. from pyxmpp2.stanzapayload import XMLPayload
  13. from pyxmpp2.ext.version import VersionPayload, VersionProvider
  14. from pyxmpp2.ext.version import request_software_version
  15. IQ1 = '''<iq type="get" id="1" xmlns="jabber:client">
  16. <query xmlns="jabber:iq:version"/>
  17. </iq>'''
  18. IQ2 = '''<iq type="response" id="1" xmlns="jabber:client">
  19. <query xmlns="jabber:iq:version">
  20. <name>NAME</name>
  21. <version>VERSION</version>
  22. <os>OS</os>
  23. </query>
  24. </iq>'''
  25. class TestVersionPayload(unittest.TestCase):
  26. def test_parse_empty(self):
  27. element = ElementTree.XML(IQ1)
  28. payload = VersionPayload.from_xml(element[0])
  29. self.assertIsNone(payload.name)
  30. self.assertIsNone(payload.version)
  31. self.assertIsNone(payload.os_name)
  32. def test_parse_full(self):
  33. element = ElementTree.XML(IQ2)
  34. payload = VersionPayload.from_xml(element[0])
  35. self.assertEqual(payload.name, 'NAME')
  36. self.assertEqual(payload.version, 'VERSION')
  37. self.assertEqual(payload.os_name, 'OS')
  38. def test_build_empty(self):
  39. payload = VersionPayload()
  40. self.assertIsNone(payload.name)
  41. self.assertIsNone(payload.version)
  42. self.assertIsNone(payload.os_name)
  43. element = payload.as_xml()
  44. self.assertEqual(element.tag, "{jabber:iq:version}query")
  45. self.assertEqual(len(element), 0)
  46. class Processor(StanzaProcessor):
  47. def __init__(self, handlers):
  48. StanzaProcessor.__init__(self)
  49. self.setup_stanza_handlers(handlers, "post-auth")
  50. self.stanzas_sent = []
  51. def send(self, stanza):
  52. self.stanzas_sent.append(stanza)
  53. class TestVersionProvider(unittest.TestCase):
  54. def test_defaults(self):
  55. provider = VersionProvider()
  56. processor = Processor([provider])
  57. stanza = Iq(ElementTree.XML(IQ1))
  58. processor.uplink_receive(stanza)
  59. self.assertEqual(len(processor.stanzas_sent), 1)
  60. response = processor.stanzas_sent[0]
  61. self.assertIsInstance(response, Iq)
  62. self.assertEqual(response.stanza_type, "result")
  63. payload = response.get_payload(VersionPayload)
  64. self.assertIsInstance(payload, VersionPayload)
  65. self.assertEqual(payload.name, "PyXMPP2")
  66. self.assertEqual(payload.version, pyxmpp2.version.version)
  67. expected = u" ".join((platform.system(), platform.release(),
  68. platform.machine()))
  69. self.assertEqual(payload.os_name, expected)
  70. def test_custom(self):
  71. settings = XMPPSettings({
  72. "software_name": "NAME",
  73. "software_version": "VERSION",
  74. "software_os": "OS",
  75. })
  76. provider = VersionProvider(settings)
  77. processor = Processor([provider])
  78. stanza = Iq(ElementTree.XML(IQ1))
  79. processor.uplink_receive(stanza)
  80. self.assertEqual(len(processor.stanzas_sent), 1)
  81. response = processor.stanzas_sent[0]
  82. self.assertIsInstance(response, Iq)
  83. self.assertEqual(response.stanza_type, "result")
  84. payload = response.get_payload(VersionPayload)
  85. self.assertIsInstance(payload, VersionPayload)
  86. self.assertEqual(payload.name, "NAME")
  87. self.assertEqual(payload.version, "VERSION")
  88. self.assertEqual(payload.os_name, "OS")
  89. def test_bad_request(self):
  90. provider = VersionProvider()
  91. processor = Processor([provider])
  92. stanza = Iq(ElementTree.XML(IQ2))
  93. stanza.stanza_type = 'set'
  94. processor.uplink_receive(stanza)
  95. self.assertEqual(len(processor.stanzas_sent), 1)
  96. response = processor.stanzas_sent[0]
  97. self.assertIsInstance(response, Iq)
  98. self.assertEqual(response.stanza_type, "error")
  99. self.assertEqual(response.error.condition.tag,
  100. "{urn:ietf:params:xml:ns:xmpp-stanzas}service-unavailable")
  101. class TestVersionRequest(unittest.TestCase):
  102. def test_request(self):
  103. payload_received = []
  104. errors_received = []
  105. def callback(payload):
  106. payload_received.append(payload)
  107. def error_callback(stanza):
  108. errors_received.append(stanza)
  109. processor = Processor([])
  110. request_software_version(processor, JID("test@example.org"),
  111. callback, error_callback)
  112. self.assertEqual(len(processor.stanzas_sent), 1)
  113. request = processor.stanzas_sent[0]
  114. self.assertIsInstance(request, Iq)
  115. self.assertEqual(request.stanza_type, "get")
  116. payload = request.get_payload(VersionPayload)
  117. self.assertIsNone(payload.name)
  118. self.assertIsNone(payload.version)
  119. self.assertIsNone(payload.os_name)
  120. response = request.make_result_response()
  121. payload = XMLPayload(ElementTree.XML(IQ2)[0])
  122. response.set_payload(payload)
  123. processor.uplink_receive(response)
  124. self.assertEqual(len(processor.stanzas_sent), 1)
  125. self.assertEqual(len(payload_received), 1)
  126. self.assertEqual(len(errors_received), 0)
  127. payload = payload_received[0]
  128. self.assertEqual(payload.name, "NAME")
  129. self.assertEqual(payload.version, "VERSION")
  130. self.assertEqual(payload.os_name, "OS")
  131. def test_request_error(self):
  132. payload_received = []
  133. errors_received = []
  134. def callback(payload):
  135. payload_received.append(payload)
  136. def error_callback(stanza):
  137. errors_received.append(stanza)
  138. processor = Processor([])
  139. request_software_version(processor, JID("test@example.org"),
  140. callback, error_callback)
  141. self.assertEqual(len(processor.stanzas_sent), 1)
  142. request = processor.stanzas_sent[0]
  143. self.assertIsInstance(request, Iq)
  144. self.assertEqual(request.stanza_type, "get")
  145. payload = request.get_payload(VersionPayload)
  146. self.assertIsNone(payload.name)
  147. self.assertIsNone(payload.version)
  148. self.assertIsNone(payload.os_name)
  149. response = request.make_error_response(u'service-unavailable')
  150. processor.uplink_receive(response)
  151. self.assertEqual(len(processor.stanzas_sent), 1)
  152. self.assertEqual(len(payload_received), 0)
  153. self.assertEqual(len(errors_received), 1)
  154. received = errors_received[0]
  155. self.assertIsInstance(received, Iq)
  156. self.assertEqual(received.stanza_type, "error")
  157. # pylint: disable=W0611
  158. from pyxmpp2.test._support import load_tests, setup_logging
  159. def setUpModule():
  160. setup_logging()
  161. if __name__ == "__main__":
  162. unittest.main()