ln-xmpp4r 0.5

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 (215) hide show
  1. data/CHANGELOG +91 -0
  2. data/COPYING +340 -0
  3. data/LICENSE +59 -0
  4. data/README.rdoc +113 -0
  5. data/README_ruby19.txt +43 -0
  6. data/Rakefile +252 -0
  7. data/data/doc/xmpp4r/examples/advanced/adventure/README +56 -0
  8. data/data/doc/xmpp4r/examples/advanced/adventure/adventure.rb +23 -0
  9. data/data/doc/xmpp4r/examples/advanced/adventure/adventuremuc.rb +136 -0
  10. data/data/doc/xmpp4r/examples/advanced/adventure/cube.xml +15 -0
  11. data/data/doc/xmpp4r/examples/advanced/adventure/tower.xml +69 -0
  12. data/data/doc/xmpp4r/examples/advanced/adventure/world.rb +424 -0
  13. data/data/doc/xmpp4r/examples/advanced/fileserve.conf +11 -0
  14. data/data/doc/xmpp4r/examples/advanced/fileserve.rb +346 -0
  15. data/data/doc/xmpp4r/examples/advanced/getonline.rb +56 -0
  16. data/data/doc/xmpp4r/examples/advanced/gtkmucclient.rb +315 -0
  17. data/data/doc/xmpp4r/examples/advanced/migrate.rb +88 -0
  18. data/data/doc/xmpp4r/examples/advanced/minimuc.rb +266 -0
  19. data/data/doc/xmpp4r/examples/advanced/pep-aggregator/index.xsl +235 -0
  20. data/data/doc/xmpp4r/examples/advanced/pep-aggregator/pep-aggregator.rb +147 -0
  21. data/data/doc/xmpp4r/examples/advanced/recvfile.rb +84 -0
  22. data/data/doc/xmpp4r/examples/advanced/rosterdiscovery.rb +129 -0
  23. data/data/doc/xmpp4r/examples/advanced/sendfile.conf +10 -0
  24. data/data/doc/xmpp4r/examples/advanced/sendfile.rb +72 -0
  25. data/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr.rb +51 -0
  26. data/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr_jabber.rb +43 -0
  27. data/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr_test.rb +10 -0
  28. data/data/doc/xmpp4r/examples/advanced/versionpoll.rb +109 -0
  29. data/data/doc/xmpp4r/examples/advanced/xmpping.rb +146 -0
  30. data/data/doc/xmpp4r/examples/advanced/xmppingrc.sample +14 -0
  31. data/data/doc/xmpp4r/examples/basic/change_password.rb +41 -0
  32. data/data/doc/xmpp4r/examples/basic/client.rb +70 -0
  33. data/data/doc/xmpp4r/examples/basic/component.rb +11 -0
  34. data/data/doc/xmpp4r/examples/basic/echo.rb +37 -0
  35. data/data/doc/xmpp4r/examples/basic/jabbersend.rb +41 -0
  36. data/data/doc/xmpp4r/examples/basic/mass_sender.rb +68 -0
  37. data/data/doc/xmpp4r/examples/basic/muc_owner_config.rb +12 -0
  38. data/data/doc/xmpp4r/examples/basic/mucinfo.rb +41 -0
  39. data/data/doc/xmpp4r/examples/basic/mucsimplebot.rb +82 -0
  40. data/data/doc/xmpp4r/examples/basic/register.rb +42 -0
  41. data/data/doc/xmpp4r/examples/basic/remove_registration.rb +18 -0
  42. data/data/doc/xmpp4r/examples/basic/roster.rb +44 -0
  43. data/data/doc/xmpp4r/examples/basic/rosterprint.rb +50 -0
  44. data/data/doc/xmpp4r/examples/basic/rosterrename.rb +34 -0
  45. data/data/doc/xmpp4r/examples/basic/rosterwatch.rb +171 -0
  46. data/data/doc/xmpp4r/examples/basic/send_vcard.rb +67 -0
  47. data/data/doc/xmpp4r/examples/basic/tune_client.rb +56 -0
  48. data/data/doc/xmpp4r/examples/basic/tune_server.rb +58 -0
  49. data/data/doc/xmpp4r/examples/basic/versionbot.rb +75 -0
  50. data/lib/xmpp4r.rb +116 -0
  51. data/lib/xmpp4r/base64.rb +32 -0
  52. data/lib/xmpp4r/bytestreams.rb +15 -0
  53. data/lib/xmpp4r/bytestreams/helper/filetransfer.rb +319 -0
  54. data/lib/xmpp4r/bytestreams/helper/ibb/base.rb +257 -0
  55. data/lib/xmpp4r/bytestreams/helper/ibb/initiator.rb +31 -0
  56. data/lib/xmpp4r/bytestreams/helper/ibb/target.rb +54 -0
  57. data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb +152 -0
  58. data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/initiator.rb +86 -0
  59. data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/server.rb +198 -0
  60. data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/socks5.rb +65 -0
  61. data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/target.rb +79 -0
  62. data/lib/xmpp4r/bytestreams/iq/bytestreams.rb +170 -0
  63. data/lib/xmpp4r/bytestreams/iq/si.rb +206 -0
  64. data/lib/xmpp4r/callbacks.rb +133 -0
  65. data/lib/xmpp4r/caps.rb +1 -0
  66. data/lib/xmpp4r/caps/c.rb +67 -0
  67. data/lib/xmpp4r/caps/helper/generator.rb +160 -0
  68. data/lib/xmpp4r/caps/helper/helper.rb +84 -0
  69. data/lib/xmpp4r/client.rb +344 -0
  70. data/lib/xmpp4r/command/helper/responder.rb +53 -0
  71. data/lib/xmpp4r/command/iq/command.rb +154 -0
  72. data/lib/xmpp4r/component.rb +103 -0
  73. data/lib/xmpp4r/connection.rb +223 -0
  74. data/lib/xmpp4r/dataforms.rb +5 -0
  75. data/lib/xmpp4r/dataforms/x/data.rb +297 -0
  76. data/lib/xmpp4r/debuglog.rb +63 -0
  77. data/lib/xmpp4r/delay.rb +5 -0
  78. data/lib/xmpp4r/delay/x/delay.rb +99 -0
  79. data/lib/xmpp4r/discovery.rb +8 -0
  80. data/lib/xmpp4r/discovery/helper/helper.rb +58 -0
  81. data/lib/xmpp4r/discovery/helper/responder.rb +165 -0
  82. data/lib/xmpp4r/discovery/iq/discoinfo.rb +211 -0
  83. data/lib/xmpp4r/discovery/iq/discoitems.rb +147 -0
  84. data/lib/xmpp4r/errors.rb +284 -0
  85. data/lib/xmpp4r/feature_negotiation.rb +5 -0
  86. data/lib/xmpp4r/feature_negotiation/iq/feature.rb +28 -0
  87. data/lib/xmpp4r/framework/base.rb +55 -0
  88. data/lib/xmpp4r/framework/bot.rb +148 -0
  89. data/lib/xmpp4r/httpbinding.rb +5 -0
  90. data/lib/xmpp4r/httpbinding/client.rb +275 -0
  91. data/lib/xmpp4r/idgenerator.rb +37 -0
  92. data/lib/xmpp4r/iq.rb +221 -0
  93. data/lib/xmpp4r/jid.rb +167 -0
  94. data/lib/xmpp4r/last.rb +2 -0
  95. data/lib/xmpp4r/last/helper/helper.rb +37 -0
  96. data/lib/xmpp4r/last/iq/last.rb +67 -0
  97. data/lib/xmpp4r/location.rb +2 -0
  98. data/lib/xmpp4r/location/helper/helper.rb +56 -0
  99. data/lib/xmpp4r/location/location.rb +179 -0
  100. data/lib/xmpp4r/message.rb +180 -0
  101. data/lib/xmpp4r/muc.rb +14 -0
  102. data/lib/xmpp4r/muc/helper/mucbrowser.rb +92 -0
  103. data/lib/xmpp4r/muc/helper/mucclient.rb +462 -0
  104. data/lib/xmpp4r/muc/helper/simplemucclient.rb +332 -0
  105. data/lib/xmpp4r/muc/iq/mucadmin.rb +23 -0
  106. data/lib/xmpp4r/muc/iq/mucadminitem.rb +20 -0
  107. data/lib/xmpp4r/muc/iq/mucowner.rb +15 -0
  108. data/lib/xmpp4r/muc/item.rb +143 -0
  109. data/lib/xmpp4r/muc/x/muc.rb +70 -0
  110. data/lib/xmpp4r/muc/x/mucuserinvite.rb +60 -0
  111. data/lib/xmpp4r/muc/x/mucuseritem.rb +36 -0
  112. data/lib/xmpp4r/presence.rb +232 -0
  113. data/lib/xmpp4r/pubsub.rb +8 -0
  114. data/lib/xmpp4r/pubsub/children/configuration.rb +86 -0
  115. data/lib/xmpp4r/pubsub/children/event.rb +49 -0
  116. data/lib/xmpp4r/pubsub/children/item.rb +35 -0
  117. data/lib/xmpp4r/pubsub/children/items.rb +53 -0
  118. data/lib/xmpp4r/pubsub/children/node_config.rb +48 -0
  119. data/lib/xmpp4r/pubsub/children/publish.rb +38 -0
  120. data/lib/xmpp4r/pubsub/children/retract.rb +41 -0
  121. data/lib/xmpp4r/pubsub/children/subscription.rb +62 -0
  122. data/lib/xmpp4r/pubsub/children/subscription_config.rb +67 -0
  123. data/lib/xmpp4r/pubsub/children/unsubscribe.rb +48 -0
  124. data/lib/xmpp4r/pubsub/helper/nodebrowser.rb +129 -0
  125. data/lib/xmpp4r/pubsub/helper/nodehelper.rb +156 -0
  126. data/lib/xmpp4r/pubsub/helper/oauth_service_helper.rb +90 -0
  127. data/lib/xmpp4r/pubsub/helper/servicehelper.rb +456 -0
  128. data/lib/xmpp4r/pubsub/iq/pubsub.rb +19 -0
  129. data/lib/xmpp4r/query.rb +15 -0
  130. data/lib/xmpp4r/reliable.rb +168 -0
  131. data/lib/xmpp4r/rexmladdons.rb +157 -0
  132. data/lib/xmpp4r/roster.rb +7 -0
  133. data/lib/xmpp4r/roster/helper/roster.rb +522 -0
  134. data/lib/xmpp4r/roster/iq/roster.rb +215 -0
  135. data/lib/xmpp4r/roster/x/roster.rb +138 -0
  136. data/lib/xmpp4r/rpc.rb +2 -0
  137. data/lib/xmpp4r/rpc/helper/client.rb +123 -0
  138. data/lib/xmpp4r/rpc/helper/server.rb +74 -0
  139. data/lib/xmpp4r/rpc/helper/xmlrpcaddons.rb +67 -0
  140. data/lib/xmpp4r/rpc/iq/rpc.rb +23 -0
  141. data/lib/xmpp4r/sasl.rb +248 -0
  142. data/lib/xmpp4r/semaphore.rb +38 -0
  143. data/lib/xmpp4r/stream.rb +599 -0
  144. data/lib/xmpp4r/streamparser.rb +85 -0
  145. data/lib/xmpp4r/test/listener_mocker.rb +118 -0
  146. data/lib/xmpp4r/tune.rb +2 -0
  147. data/lib/xmpp4r/tune/helper/helper.rb +58 -0
  148. data/lib/xmpp4r/tune/tune.rb +113 -0
  149. data/lib/xmpp4r/vcard.rb +6 -0
  150. data/lib/xmpp4r/vcard/helper/vcard.rb +84 -0
  151. data/lib/xmpp4r/vcard/iq/vcard.rb +109 -0
  152. data/lib/xmpp4r/version.rb +7 -0
  153. data/lib/xmpp4r/version/helper/responder.rb +72 -0
  154. data/lib/xmpp4r/version/helper/simpleresponder.rb +44 -0
  155. data/lib/xmpp4r/version/iq/version.rb +105 -0
  156. data/lib/xmpp4r/x.rb +37 -0
  157. data/lib/xmpp4r/xhtml.rb +1 -0
  158. data/lib/xmpp4r/xhtml/html.rb +115 -0
  159. data/lib/xmpp4r/xmpp4r.rb +20 -0
  160. data/lib/xmpp4r/xmppelement.rb +168 -0
  161. data/lib/xmpp4r/xmppstanza.rb +162 -0
  162. data/setup.rb +1586 -0
  163. data/test/bytestreams/tc_ibb.rb +188 -0
  164. data/test/bytestreams/tc_socks5bytestreams.rb +114 -0
  165. data/test/caps/tc_helper.rb +158 -0
  166. data/test/dataforms/tc_data.rb +81 -0
  167. data/test/delay/tc_xdelay.rb +51 -0
  168. data/test/discovery/tc_responder.rb +91 -0
  169. data/test/last/tc_helper.rb +75 -0
  170. data/test/lib/assert_equal_xml.rb +14 -0
  171. data/test/lib/clienttester.rb +149 -0
  172. data/test/muc/tc_muc_mucclient.rb +834 -0
  173. data/test/muc/tc_muc_simplemucclient.rb +114 -0
  174. data/test/muc/tc_mucowner.rb +50 -0
  175. data/test/pubsub/tc_helper.rb +785 -0
  176. data/test/pubsub/tc_nodeconfig.rb +61 -0
  177. data/test/pubsub/tc_subscriptionconfig.rb +41 -0
  178. data/test/reliable/tc_disconnect_cleanup.rb +334 -0
  179. data/test/reliable/tc_disconnect_exception.rb +37 -0
  180. data/test/reliable/tc_listener_mocked_test.rb +68 -0
  181. data/test/reliable/tc_reliable_connection.rb +31 -0
  182. data/test/roster/tc_helper.rb +524 -0
  183. data/test/roster/tc_iqqueryroster.rb +173 -0
  184. data/test/roster/tc_xroster.rb +73 -0
  185. data/test/rpc/tc_helper.rb +96 -0
  186. data/test/tc_callbacks.rb +129 -0
  187. data/test/tc_class_names.rb +146 -0
  188. data/test/tc_client.rb +30 -0
  189. data/test/tc_errors.rb +146 -0
  190. data/test/tc_idgenerator.rb +30 -0
  191. data/test/tc_iq.rb +113 -0
  192. data/test/tc_iqquery.rb +31 -0
  193. data/test/tc_jid.rb +204 -0
  194. data/test/tc_message.rb +131 -0
  195. data/test/tc_presence.rb +150 -0
  196. data/test/tc_rexml.rb +139 -0
  197. data/test/tc_stream.rb +167 -0
  198. data/test/tc_streamComponent.rb +95 -0
  199. data/test/tc_streamError.rb +129 -0
  200. data/test/tc_streamSend.rb +59 -0
  201. data/test/tc_streamparser.rb +125 -0
  202. data/test/tc_xmppstanza.rb +135 -0
  203. data/test/ts_xmpp4r.rb +44 -0
  204. data/test/tune/tc_helper_recv.rb +82 -0
  205. data/test/tune/tc_helper_send.rb +74 -0
  206. data/test/tune/tc_tune.rb +79 -0
  207. data/test/vcard/tc_helper.rb +49 -0
  208. data/test/vcard/tc_iqvcard.rb +62 -0
  209. data/test/version/tc_helper.rb +60 -0
  210. data/test/version/tc_iqqueryversion.rb +97 -0
  211. data/test/xhtml/tc_html.rb +41 -0
  212. data/tools/gen_requires.bash +31 -0
  213. data/tools/xmpp4r-gemspec-test.rb +11 -0
  214. data/xmpp4r.gemspec +238 -0
  215. metadata +280 -0
@@ -0,0 +1,139 @@
1
+ #!/usr/bin/ruby
2
+
3
+ $:.unshift File::dirname(__FILE__) + '/../lib'
4
+
5
+ require 'test/unit'
6
+ require 'xmpp4r/rexmladdons'
7
+
8
+ class REXMLTest < Test::Unit::TestCase
9
+ def test_simple
10
+ e = REXML::Element.new('e')
11
+ assert_kind_of(REXML::Element, e)
12
+ assert_nil(e.text)
13
+ assert_nil(e.attributes['x'])
14
+ end
15
+
16
+ def test_normalize
17
+ assert_equal('&amp;', REXML::Text::normalize('&'))
18
+ assert_equal('&amp;amp;', REXML::Text::normalize('&amp;'))
19
+ assert_equal('&amp;amp;amp;', REXML::Text::normalize('&amp;amp;'))
20
+ assert_equal('&amp;nbsp;', REXML::Text::normalize('&nbsp;'))
21
+ end
22
+
23
+ def test_unnormalize
24
+ assert_equal('&', REXML::Text::unnormalize('&amp;'))
25
+ assert_equal('&amp;', REXML::Text::unnormalize('&amp;amp;'))
26
+ assert_equal('&amp;amp;', REXML::Text::unnormalize('&amp;amp;amp;'))
27
+ assert_equal('&nbsp;', REXML::Text::unnormalize('&amp;nbsp;'))
28
+ assert_equal('&nbsp;', REXML::Text::unnormalize('&nbsp;')) # ?
29
+ end
30
+
31
+ def test_text_entities
32
+ e = REXML::Element.new('e')
33
+ e.text = '&'
34
+ assert_equal('<e>&amp;</e>', e.to_s)
35
+ e.text = '&amp;'
36
+ assert_equal('<e>&amp;amp;</e>', e.to_s)
37
+ e.text = '&nbsp'
38
+ assert_equal('<e>&amp;nbsp</e>', e.to_s)
39
+ e.text = '&nbsp;'
40
+ assert_equal('<e>&amp;nbsp;</e>', e.to_s)
41
+ e.text = '&<;'
42
+ assert_equal('<e>&amp;&lt;;</e>', e.to_s)
43
+ e.text = '<>"\''
44
+ assert_equal('<e>&lt;&gt;&quot;&apos;</e>', e.to_s)
45
+ e.text = '<x>&amp;</x>'
46
+ assert_equal('<e>&lt;x&gt;&amp;amp;&lt;/x&gt;</e>', e.to_s)
47
+ end
48
+
49
+ def test_attribute_entites
50
+ e = REXML::Element.new('e')
51
+ e.attributes['x'] = '&'
52
+ assert_equal('&', e.attributes['x'])
53
+ e.attributes['x'] = '&amp;'
54
+ # bug in REXML 3.1.6 unescaped the ampersand
55
+ # assert_equal('&', e.attributes['x'])
56
+ # substituting a test that works with 3.1.5, 3.1.6, and 3.1.7
57
+ assert_equal('&amp;amp;', e.attribute('x').to_s)
58
+ e.attributes['x'] = '&nbsp'
59
+ assert_equal('&nbsp', e.attributes['x'])
60
+ e.attributes['x'] = '&nbsp;'
61
+ assert_equal('&nbsp;', e.attributes['x'])
62
+ end
63
+
64
+ # test '==(o)'
65
+
66
+ def test_passing_in_non_rexml_element_as_self
67
+ o = Object.new
68
+ assert_not_equal(o, REXML::Element.new('foo'))
69
+ end
70
+
71
+ def test_passing_in_non_rexml_element_as_comparison_object
72
+ o = Object.new
73
+ assert_not_equal(REXML::Element.new('foo'), o)
74
+ end
75
+
76
+ def test_element_equal_simple
77
+ assert_equal(REXML::Element.new('foo'), REXML::Element.new('foo'))
78
+ end
79
+
80
+ def test_element_not_equal_simple
81
+ assert_not_equal(REXML::Element.new('foo'), REXML::Element.new('bar'))
82
+ end
83
+
84
+ def test_element_equal_when_all_are_same
85
+ e1 = REXML::Element.new('foo')
86
+ e1.add_namespace('a', 'urn:test:foo')
87
+ e1.attributes['a:bar'] = 'baz'
88
+ e2 = REXML::Element.new('foo')
89
+ e2.add_namespace('a', 'urn:test:foo')
90
+ e2.attributes['a:bar'] = 'baz'
91
+
92
+ assert_equal(e1, e2)
93
+ end
94
+
95
+ def test_element_not_equal_when_namespace_name_differs
96
+ e1 = REXML::Element.new('foo')
97
+ e1.add_namespace('a', 'urn:test:foo')
98
+ e1.attributes['a:bar'] = 'baz'
99
+ e2 = REXML::Element.new('foo')
100
+ e2.add_namespace('b', 'urn:test:foo')
101
+ e2.attributes['a:bar'] = 'baz'
102
+
103
+ assert_not_equal(e1, e2)
104
+ end
105
+
106
+ def test_element_not_equal_when_namespace_value_differs
107
+ e1 = REXML::Element.new('foo')
108
+ e1.add_namespace('a', 'urn:test:foo')
109
+ e1.attributes['a:bar'] = 'baz'
110
+ e2 = REXML::Element.new('foo')
111
+ e2.add_namespace('a', 'urn:test:bar')
112
+ e2.attributes['a:bar'] = 'baz'
113
+
114
+ assert_not_equal(e1, e2)
115
+ end
116
+
117
+ def test_element_not_equal_when_attribute_name_differs
118
+ e1 = REXML::Element.new('foo')
119
+ e1.add_namespace('a', 'urn:test:foo')
120
+ e1.attributes['a:bar'] = 'baz'
121
+ e2 = REXML::Element.new('foo')
122
+ e1.add_namespace('a', 'urn:test:foo')
123
+ e2.attributes['b:bar'] = 'baz'
124
+
125
+ assert_not_equal(e1, e2)
126
+ end
127
+
128
+ def test_element_not_equal_when_attribute_value_differs
129
+ e1 = REXML::Element.new('foo')
130
+ e1.add_namespace('a', 'urn:test:foo')
131
+ e1.attributes['a:bar'] = 'baz'
132
+ e2 = REXML::Element.new('foo')
133
+ e1.add_namespace('a', 'urn:test:foo')
134
+ e2.attributes['a:bar'] = 'bar'
135
+
136
+ assert_not_equal(e1, e2)
137
+ end
138
+
139
+ end
@@ -0,0 +1,167 @@
1
+ #!/usr/bin/ruby
2
+
3
+ $:.unshift '../lib'
4
+ $:.unshift './lib/'
5
+
6
+ require 'tempfile'
7
+ require 'test/unit'
8
+ require 'socket'
9
+ require 'xmpp4r/stream'
10
+ require 'xmpp4r/semaphore'
11
+ require 'clienttester'
12
+ include Jabber
13
+
14
+ # Jabber::debug = true
15
+
16
+ class StreamTest < Test::Unit::TestCase
17
+ include ClientTester
18
+
19
+ def busywait(&block)
20
+ n = 0
21
+ while not block.yield and n < 1000
22
+ Thread::pass
23
+ n += 1
24
+ end
25
+ end
26
+
27
+ ##
28
+ # tests that connection really waits the call to process() to dispatch
29
+ # stanzas to filters
30
+ def test_process
31
+ called = false
32
+ @client.add_xml_callback { called = true }
33
+ assert(!called)
34
+ @server.send('<iq/>')
35
+ busywait { called }
36
+ assert(called)
37
+ end
38
+
39
+ def test_process20
40
+ done = Semaphore.new
41
+ n = 0
42
+ @client.add_message_callback {
43
+ n += 1
44
+ done.run if n % 20 == 0
45
+ }
46
+
47
+ 20.times {
48
+ @server.send('<message/>')
49
+ }
50
+
51
+ done.wait
52
+ assert_equal(20, n)
53
+
54
+ @server.send('<message/>' * 20)
55
+
56
+ done.wait
57
+ assert_equal(40, n)
58
+ end
59
+
60
+ def test_send
61
+ sem = Semaphore::new
62
+ @server.add_xml_callback { |e|
63
+ @server.send(Iq.new(:result))
64
+ sem.run
65
+ }
66
+
67
+ called = 0
68
+ @client.send(Iq.new(:get)) { |reply|
69
+ called += 1
70
+ if reply.kind_of? Iq and reply.type == :result
71
+ true
72
+ else
73
+ false
74
+ end
75
+ }
76
+ sem.wait
77
+ busywait { called }
78
+ assert_equal(1, called)
79
+ end
80
+
81
+ def test_send_nested
82
+ finished = Semaphore.new
83
+
84
+ id = 0
85
+ @server.add_xml_callback do |e|
86
+ id += 1
87
+ if id == 1
88
+ @server.send(Iq.new(:result).set_id('1').delete_namespace)
89
+ elsif id == 2
90
+ @server.send(Iq.new(:result).set_id('2').delete_namespace)
91
+ elsif id == 3
92
+ @server.send(Iq.new(:result).set_id('3').delete_namespace)
93
+ else
94
+ p e
95
+ end
96
+ end
97
+
98
+ called_outer = 0
99
+ called_inner = 0
100
+
101
+ @client.send(Iq.new(:get)) do |reply|
102
+ called_outer += 1
103
+ assert_kind_of(Iq, reply)
104
+ assert_equal(:result, reply.type)
105
+
106
+ if reply.id == '1'
107
+ @client.send(Iq.new(:set)) do |reply2|
108
+ called_inner += 1
109
+ assert_kind_of(Iq, reply2)
110
+ assert_equal(:result, reply2.type)
111
+ assert_equal('2', reply2.id)
112
+
113
+ @client.send(Iq.new(:get))
114
+
115
+ true
116
+ end
117
+ false
118
+ elsif reply.id == '3'
119
+ true
120
+ else
121
+ false
122
+ end
123
+ end
124
+
125
+ assert_equal(2, called_outer)
126
+ assert_equal(1, called_inner)
127
+ end
128
+
129
+ def test_send_in_callback
130
+ finished = Semaphore.new
131
+
132
+ @client.add_message_callback {
133
+ @client.send_with_id(Iq.new(:get)) { |reply|
134
+ assert_equal(:result, reply.type)
135
+ finished.run
136
+ }
137
+ }
138
+
139
+ @server.add_iq_callback { |iq|
140
+ @server.send(Iq.new(:result).set_id(iq.id))
141
+ }
142
+
143
+ @server.send(Message.new)
144
+ finished.wait
145
+ end
146
+
147
+ def test_similar_children
148
+ n = 0
149
+ @client.add_message_callback { n += 1 }
150
+ assert_equal(0, n)
151
+ @server.send("<message/>")
152
+ busywait { n == 1 }
153
+ assert_equal(1, n)
154
+ @server.send('<message>')
155
+ assert_equal(1, n)
156
+ @server.send('<message/>')
157
+ assert_equal(1, n)
158
+ @server.send('</message>')
159
+ busywait { n == 2 }
160
+ assert_equal(2, n)
161
+ @server.send("<message><stream:stream><message/></stream:stream>")
162
+ assert_equal(2, n)
163
+ @server.send('</message>')
164
+ busywait { n == 3 }
165
+ assert_equal(3, n)
166
+ end
167
+ end
@@ -0,0 +1,95 @@
1
+ #!/usr/bin/ruby
2
+
3
+ $:.unshift '../lib'
4
+
5
+ require 'tempfile'
6
+ require 'test/unit'
7
+ require 'socket'
8
+ require 'xmpp4r/component'
9
+ require 'xmpp4r/bytestreams'
10
+ require 'xmpp4r/semaphore'
11
+ require 'xmpp4r'
12
+ include Jabber
13
+
14
+ class StreamComponentTest < Test::Unit::TestCase
15
+ @@SOCKET_PORT = 65224
16
+ STREAM = 'stream:stream xmlns:stream="http://etherx.jabber.org/streams"'
17
+
18
+ def setup
19
+ servlisten = TCPServer.new(@@SOCKET_PORT)
20
+ serverwait = Semaphore.new
21
+ Thread.new do
22
+ Thread.current.abort_on_exception = true
23
+ serversock = servlisten.accept
24
+ servlisten.close
25
+ serversock.sync = true
26
+ @server = Stream.new
27
+ @server.add_xml_callback do |xml|
28
+ if xml.prefix == 'stream' and xml.name == 'stream'
29
+ @server.send("<#{STREAM} xmlns='jabber:component:accept'>")
30
+ true
31
+ else
32
+ false
33
+ end
34
+ end
35
+ @server.start(serversock)
36
+
37
+ serverwait.run
38
+ end
39
+
40
+ @stream = Component.new('test')
41
+ @stream.connect('localhost', @@SOCKET_PORT)
42
+
43
+ serverwait.wait
44
+ end
45
+
46
+ def teardown
47
+ @stream.close
48
+ @server.close
49
+ end
50
+
51
+ def test_process
52
+ stanzas = 0
53
+ message_lock = Semaphore.new
54
+ iq_lock = Semaphore.new
55
+ presence_lock = Semaphore.new
56
+
57
+ @stream.add_message_callback { |msg|
58
+ assert_kind_of(Message, msg)
59
+ stanzas += 1
60
+ message_lock.run
61
+ }
62
+ @stream.add_iq_callback { |iq|
63
+ assert_kind_of(Iq, iq)
64
+ stanzas += 1
65
+ iq_lock.run
66
+ }
67
+ @stream.add_presence_callback { |pres|
68
+ assert_kind_of(Presence, pres)
69
+ stanzas += 1
70
+ presence_lock.run
71
+ }
72
+
73
+ @server.send('<message/>')
74
+ @server.send('<iq/>')
75
+ @server.send('<presence/>')
76
+
77
+ message_lock.wait
78
+ iq_lock.wait
79
+ presence_lock.wait
80
+
81
+ assert_equal(3, stanzas)
82
+ end
83
+
84
+ def test_outgoing
85
+ received_wait = Semaphore.new
86
+
87
+ @server.add_message_callback { |msg|
88
+ assert_kind_of(Message, msg)
89
+ received_wait.run
90
+ }
91
+
92
+ @stream.send(Message.new)
93
+ received_wait.wait
94
+ end
95
+ end
@@ -0,0 +1,129 @@
1
+ #!/usr/bin/ruby
2
+
3
+ $:.unshift "#{File.dirname(__FILE__)}/../lib"
4
+
5
+ require 'test/unit'
6
+ require 'socket'
7
+ require 'xmpp4r/client'
8
+ include Jabber
9
+
10
+ class ConnectionErrorTest < Test::Unit::TestCase
11
+ @@SOCKET_PORT = 65225
12
+ STREAM = '<stream:stream xmlns:stream="http://etherx.jabber.org/streams">'
13
+
14
+ def setup
15
+ servlisten = TCPServer.new(@@SOCKET_PORT)
16
+ serverwait = Semaphore.new
17
+ @server = nil
18
+ Thread.new do
19
+ Thread.current.abort_on_exception = true
20
+ @server = servlisten.accept
21
+ servlisten.close
22
+ @server.sync = true
23
+
24
+ serverwait.run
25
+ end
26
+
27
+ @conn = TCPSocket.new('localhost', @@SOCKET_PORT)
28
+
29
+ serverwait.wait
30
+ end
31
+
32
+ def teardown
33
+ @conn.close if not @conn.closed?
34
+ @server.close if not @conn.closed?
35
+ end
36
+
37
+ def test_connectionError_start_withexcblock
38
+ @stream = Stream.new
39
+ error = false
40
+ @stream.on_exception do |e, o, w|
41
+ # strange exception, it's caused by REXML, actually
42
+ assert_kind_of(StandardError, e)
43
+ assert_equal(Jabber::Stream, o.class)
44
+ assert_equal(:start, w)
45
+ error = true
46
+ end
47
+ assert(!error)
48
+ begin
49
+ # wrong port on purpose
50
+ conn = TCPSocket.new('localhost', 1)
51
+ rescue
52
+ end
53
+ @stream.start(conn)
54
+ sleep 0.2
55
+ assert(error)
56
+ @server.close
57
+ @stream.close
58
+ end
59
+
60
+ def test_connectionError_parse_withexcblock
61
+ @stream = Stream.new
62
+ error = false
63
+ @stream.start(@conn)
64
+ @stream.on_exception do |e, o, w|
65
+ if w == :disconnected
66
+ assert_equal(nil, e)
67
+ assert_equal(Jabber::Stream, o.class)
68
+ else
69
+ assert_equal(REXML::ParseException, e.class)
70
+ assert_equal(Jabber::Stream, o.class)
71
+ assert_equal(:parser, w)
72
+ error = true
73
+ end
74
+ end
75
+ @server.puts(STREAM)
76
+ @server.flush
77
+ assert(!error)
78
+ @server.puts('</blop>')
79
+ @server.flush
80
+ sleep 0.2
81
+ assert(error)
82
+ @server.close
83
+ @stream.close
84
+ end
85
+
86
+ def test_connectionError_send_withexcblock
87
+ @stream = Stream.new
88
+ error = 0
89
+ @stream.start(@conn)
90
+ @stream.on_exception do |exc, o, w|
91
+ case w
92
+ when :sending
93
+ assert_equal(IOError, exc.class)
94
+ assert_equal(Jabber::Stream, o.class)
95
+ when :disconnected
96
+ assert_equal(nil, exc)
97
+ assert_equal(Jabber::Stream, o.class)
98
+ end
99
+ error += 1
100
+ end
101
+ @server.puts(STREAM)
102
+ @server.flush
103
+ assert_equal(0, error)
104
+ @server.close
105
+ sleep 0.1
106
+ assert_equal(1, error)
107
+ @stream.send('</test>')
108
+ sleep 0.1
109
+ @stream.send('</test>')
110
+ sleep 0.1
111
+ assert_equal(3, error)
112
+ @stream.close
113
+ end
114
+
115
+ def test_connectionError_send_withoutexcblock
116
+ @stream = Stream.new
117
+ @stream.start(@conn)
118
+ @server.puts(STREAM)
119
+ @server.flush
120
+ assert_raise(IOError) do
121
+ @server.close
122
+ sleep 0.1
123
+ @stream.send('</test>')
124
+ sleep 0.1
125
+ @stream.send('</test>')
126
+ sleep 0.1
127
+ end
128
+ end
129
+ end