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,61 @@
1
+ #!/usr/bin/ruby
2
+
3
+ $:.unshift File::dirname(__FILE__) + '/../../lib'
4
+
5
+ require 'test/unit'
6
+ require File::dirname(__FILE__) + '/../lib/clienttester'
7
+
8
+ require 'xmpp4r'
9
+ require 'xmpp4r/pubsub/children/node_config'
10
+ require 'xmpp4r/dataforms'
11
+ include Jabber
12
+
13
+ # Jabber.debug = true
14
+
15
+ class PubSub::NodeConfigTest < Test::Unit::TestCase
16
+ include ClientTester
17
+
18
+ def test_create()
19
+ config = PubSub::NodeConfig.new()
20
+ assert_nil(config.form)
21
+ assert_nil(config.node)
22
+ assert_equal({}, config.options)
23
+ end
24
+
25
+ def test_create_with_options
26
+ options = {'pubsub#access_model'=>'open'}
27
+
28
+ config = PubSub::NodeConfig.new(nil, options)
29
+ assert_kind_of(Jabber::Dataforms::XData, config.form)
30
+ assert_equal(options, config.options)
31
+ assert_equal(:submit, config.form.type)
32
+ assert_equal('http://jabber.org/protocol/pubsub#node_config', config.form.field('FORM_TYPE').values.first)
33
+ end
34
+
35
+ def test_create_with_options_and_node
36
+ node = 'mynode'
37
+ options = {'pubsub#access_model'=>'open'}
38
+
39
+ config = PubSub::NodeConfig.new(node, options)
40
+ assert_equal(node, config.node)
41
+ assert_kind_of(Jabber::Dataforms::XData, config.form)
42
+ assert_equal(options, config.options)
43
+ assert_equal(:submit, config.form.type)
44
+ assert_equal('http://jabber.org/protocol/pubsub#node_config', config.form.field('FORM_TYPE').values.first)
45
+ end
46
+
47
+ def test_set_options
48
+ options = {'pubsub#access_model'=>'open'}
49
+ config = PubSub::NodeConfig.new()
50
+ config.options = options
51
+ assert_kind_of(Jabber::Dataforms::XData, config.form)
52
+ assert_equal(options, config.options)
53
+ end
54
+
55
+ def test_create_with_array_in_options
56
+ options = {'pubsub#collection'=>['parent1','parent2']}
57
+ config = PubSub::OwnerNodeConfig.new(nil, options)
58
+
59
+ assert_equal(options, config.options)
60
+ end
61
+ end
@@ -0,0 +1,41 @@
1
+ #!/usr/bin/ruby
2
+
3
+ $:.unshift File::dirname(__FILE__) + '/../../lib'
4
+
5
+ require 'test/unit'
6
+ require File::dirname(__FILE__) + '/../lib/clienttester'
7
+
8
+ require 'xmpp4r'
9
+ require 'xmpp4r/pubsub/children/subscription_config'
10
+ require 'xmpp4r/dataforms'
11
+ include Jabber
12
+
13
+ # Jabber.debug = true
14
+
15
+ class PubSub::SubscriptionConfigTest < Test::Unit::TestCase
16
+ include ClientTester
17
+
18
+ def test_create()
19
+ config = PubSub::SubscriptionConfig.new()
20
+ assert_nil(config.form)
21
+ assert_nil(config.node)
22
+ assert_equal({}, config.options)
23
+ end
24
+
25
+ def test_create_with_options
26
+ node = 'mynode'
27
+ jid = 'test@test.com'
28
+ options = {'pubsub#access_model'=>'open'}
29
+ subid = '004-yyy'
30
+
31
+ config = PubSub::SubscriptionConfig.new(node, jid, options, subid)
32
+ assert_equal(node, config.node)
33
+ assert_equal(subid, config.subid)
34
+ assert_kind_of(Jabber::JID, config.jid)
35
+ assert_equal(Jabber::JID.new(jid), config.jid)
36
+ assert_kind_of(Jabber::Dataforms::XData, config.form)
37
+ assert_equal(options, config.options)
38
+ assert_equal(:submit, config.form.type)
39
+ assert_equal('http://jabber.org/protocol/pubsub#subscribe_options', config.form.field('FORM_TYPE').values.first)
40
+ end
41
+ end
@@ -0,0 +1,334 @@
1
+ #!/usr/bin/ruby
2
+
3
+ $:.unshift "#{File.dirname(__FILE__)}/../../lib"
4
+
5
+ require 'test/unit'
6
+ require 'xmpp4r'
7
+
8
+ # Jabber::debug = true
9
+ # Jabber::warnings = true
10
+
11
+ class ClientDisconnectCleanupTest < Test::Unit::TestCase
12
+ class ControledClient < Jabber::Client
13
+ attr_accessor :tcpserver, :socket_override
14
+ def connect
15
+ begin
16
+ @port = 1024 + rand(32768 - 1024)
17
+ @tcpserver = TCPServer.new("127.0.0.1", @port)
18
+ rescue Errno::EADDRINUSE, Errno::EACCES
19
+ @tcpserver.close rescue nil
20
+ retry
21
+ end
22
+ super("127.0.0.1", @port)
23
+ end
24
+ def start
25
+ @socket = socket_override
26
+ super
27
+ end
28
+ end
29
+
30
+ def test_regular_stream_end
31
+ rd, wr = IO.pipe
32
+ rd.instance_eval do
33
+ def write(*args)
34
+ end
35
+ def flush
36
+ end
37
+ end
38
+ client = ControledClient.new("test@localhost")
39
+ @exceptions_caught = 0
40
+ client.on_exception do |e, connection, where_failed|
41
+ @exceptions_caught += 1
42
+ end
43
+
44
+ Thread.new do
45
+ client.socket_override = rd
46
+ client.instance_eval{ @keepalive_interval = 0.1 }
47
+ client.connect
48
+ client.auth_nonsasl("password", false)
49
+ end
50
+ sleep(0.1)
51
+ assert client.is_connected?
52
+
53
+ wr.write('<stream:stream xmlns:stream="http://etherx.jabber.org/streams">')
54
+ wr.write("</stream:stream>")
55
+ sleep(0.2)
56
+
57
+ assert !client.is_connected?
58
+ assert client.instance_eval{ @parser_thread.nil? || !@parser_thread.alive? }
59
+ assert client.instance_eval{ @keepaliveThread.nil? || !@keepaliveThread.alive? }
60
+ assert @exceptions_caught > 0
61
+ end
62
+
63
+ def test_error_on_send
64
+ rd, wr = IO.pipe
65
+ rd.instance_eval do
66
+ def write(*args)
67
+ end
68
+ def flush
69
+ end
70
+ end
71
+ client = ControledClient.new("test@localhost")
72
+ @exceptions_caught = 0
73
+ client.on_exception do |e, connection, where_failed|
74
+ @exceptions_caught += 1
75
+ end
76
+
77
+ Thread.new do
78
+ client.socket_override = rd
79
+ client.connect
80
+ client.auth_nonsasl("password", false)
81
+ end
82
+ sleep(0.1)
83
+ assert client.is_connected?
84
+
85
+ rd.instance_eval do
86
+ def write(*args)
87
+ raise "No writting for you, you disconnect now"
88
+ end
89
+ end
90
+ wr.write(%Q{<stream:stream from='localhost' id="acecf234be084aecdc16509077573c7d7200912f" version='1.0' xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client"><stream:features><auth xmlns='http://jabber.org/features/iq-auth'/></stream:features> })
91
+ sleep(0.1)
92
+
93
+ assert !client.is_connected?
94
+ assert client.instance_eval{ @parser_thread.nil? || !@parser_thread.alive? }
95
+ assert client.instance_eval{ @keepaliveThread.nil? || !@keepaliveThread.alive? }
96
+ assert @exceptions_caught > 0
97
+ end
98
+
99
+ def test_client_disconnect
100
+ rd, wr = IO.pipe
101
+ rd.instance_eval do
102
+ def write(*args)
103
+ end
104
+ def flush
105
+ end
106
+ end
107
+ client = ControledClient.new("test@localhost")
108
+ @exceptions_caught = 0
109
+ client.on_exception do |e, connection, where_failed|
110
+ @exceptions_caught += 1
111
+ end
112
+
113
+ Thread.new do
114
+ client.socket_override = rd
115
+ client.connect
116
+ client.auth_nonsasl("password", false)
117
+ end
118
+ wr.write(%Q{<stream:stream from='localhost' id="acecf234be084aecdc16509077573c7d7200912f" version='1.0' xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client"><stream:features><auth xmlns='http://jabber.org/features/iq-auth'/></stream:features> })
119
+ sleep(0.1)
120
+ assert client.is_connected?
121
+ assert client.instance_eval{ @parser_thread.alive? }
122
+ assert client.instance_eval{ @keepaliveThread.alive? }
123
+
124
+ wr.close
125
+ sleep(0.1)
126
+
127
+ assert !client.is_connected?
128
+ assert client.instance_eval{ @parser_thread.nil? || !@parser_thread.alive? }
129
+ assert client.instance_eval{ @keepaliveThread.nil? || !@keepaliveThread.alive? }
130
+ assert @exceptions_caught > 0
131
+ end
132
+
133
+ end
134
+
135
+ class ConnectionDisconnectCleanupTest < Test::Unit::TestCase
136
+ class PipeConnection < Jabber::Connection
137
+ attr_accessor :socket_override
138
+ def connect
139
+ begin
140
+ @port = 1024 + rand(32768 - 1024)
141
+ tcpsocket = TCPServer.new("127.0.0.1", @port)
142
+ rescue Errno::EADDRINUSE, Errno::EACCES
143
+ tcpsocket.close rescue nil
144
+ retry
145
+ end
146
+ super("127.0.0.1", @port)
147
+ end
148
+ def accept_features
149
+ #do nothing
150
+ end
151
+ def start
152
+ @socket = self.socket_override
153
+ super
154
+ end
155
+ end
156
+
157
+ def test_cleanup_when_disconnected_during_keepalive
158
+ rd, wr = IO.pipe
159
+ conn = PipeConnection.new
160
+ @exceptions_caught = 0
161
+ conn.on_exception do |e, connection, where_failed|
162
+ @exceptions_caught += 1
163
+ end
164
+
165
+ Thread.new do
166
+ conn.socket_override = rd
167
+ #this will raise exception in keepalive thread, when attempts to send blank space shortly after connect
168
+ conn.instance_eval{ @keepalive_interval = 0.1 }
169
+ conn.connect
170
+ end
171
+
172
+ sleep(0.2)
173
+
174
+ assert rd.closed?
175
+ assert !conn.is_connected?
176
+ assert !conn.instance_eval{ @parser_thread }.alive?
177
+ assert !conn.instance_eval{ @keepaliveThread }.alive?
178
+ assert @exceptions_caught > 0
179
+ end
180
+
181
+ def test_cleanup_after_stream_close
182
+ rd, wr = IO.pipe
183
+ conn = PipeConnection.new
184
+ @exceptions_caught = 0
185
+ conn.on_exception do |e, connection, where_failed|
186
+ @exceptions_caught += 1
187
+ end
188
+
189
+ Thread.new do
190
+ conn.socket_override = rd
191
+ conn.connect
192
+ end
193
+
194
+ wr.write("<hi/>")
195
+ wr.close
196
+ sleep(0.1)
197
+
198
+ assert rd.closed?
199
+ assert !conn.is_connected?
200
+ assert !conn.instance_eval{ @parser_thread }.alive?
201
+ assert !conn.instance_eval{ @keepaliveThread }.alive?
202
+ assert @exceptions_caught > 0
203
+ end
204
+
205
+ def test_cleanup_after_stream_end
206
+ rd, wr = IO.pipe
207
+ conn = PipeConnection.new
208
+ @exceptions_caught = 0
209
+ conn.on_exception do |e, connection, where_failed|
210
+ @exceptions_caught += 1
211
+ end
212
+
213
+ Thread.new do
214
+ conn.socket_override = rd
215
+ conn.connect
216
+ end
217
+
218
+ wr.write('<stream:stream xmlns:stream="http://etherx.jabber.org/streams">')
219
+ wr.write("</stream:stream>")
220
+ # wr.close
221
+ sleep(0.1)
222
+
223
+ assert rd.closed?
224
+ assert !conn.is_connected?
225
+ assert !conn.instance_eval{ @parser_thread }.alive?
226
+ assert !conn.instance_eval{ @keepaliveThread }.alive?
227
+ assert @exceptions_caught > 0
228
+ end
229
+
230
+ end
231
+
232
+ class StreamDisconnectCleanupTest < Test::Unit::TestCase
233
+
234
+ def test_cleanup_when_errors_on_send
235
+ rd, wr = IO.pipe
236
+
237
+ stream = Jabber::Stream.new
238
+ @exceptions_caught = 0
239
+ stream.on_exception do |e, connection, where_failed|
240
+ @exceptions_caught += 1
241
+ end
242
+
243
+ assert !stream.is_connected?
244
+
245
+ stream.start(rd)
246
+ wr.write("<hi/>")
247
+ assert stream.is_connected?
248
+ #should raise error trying to write to stream that can't be written to, and catch should close it.
249
+ begin
250
+ stream.send("<hi/>")
251
+ rescue
252
+ end
253
+ sleep(0.1)
254
+
255
+ assert rd.closed?
256
+ assert !stream.is_connected?
257
+ assert !stream.instance_eval{ @parser_thread }.alive?
258
+ assert @exceptions_caught > 0
259
+ end
260
+
261
+ def test_cleanup_after_stream_close
262
+ rd, wr = IO.pipe
263
+
264
+ stream = Jabber::Stream.new
265
+ @exceptions_caught = 0
266
+ stream.on_exception do |e, connection, where_failed|
267
+ @exceptions_caught += 1
268
+ end
269
+
270
+ assert !stream.is_connected?
271
+
272
+ stream.start(rd)
273
+ wr.write("<hi/>")
274
+ assert stream.is_connected?
275
+
276
+ wr.close
277
+ sleep(0.1)
278
+
279
+ assert rd.closed?
280
+ assert !stream.is_connected?
281
+ assert !stream.instance_eval{ @parser_thread }.alive?
282
+ assert @exceptions_caught > 0
283
+ end
284
+
285
+ def test_cleanup_after_stream_end
286
+ rd, wr = IO.pipe
287
+
288
+ stream = Jabber::Stream.new
289
+ @exceptions_caught = 0
290
+ stream.on_exception do |e, connection, where_failed|
291
+ @exceptions_caught += 1
292
+ end
293
+
294
+ assert !stream.is_connected?
295
+
296
+ stream.start(rd)
297
+ wr.write('<stream:stream xmlns:stream="http://etherx.jabber.org/streams">')
298
+ wr.write("</stream:stream>")
299
+ assert stream.is_connected?
300
+
301
+ # wr.close
302
+ sleep(0.1)
303
+
304
+ assert rd.closed?
305
+ assert !stream.is_connected?
306
+ assert !stream.instance_eval{ @parser_thread }.alive?
307
+ assert @exceptions_caught > 0
308
+ end
309
+
310
+ def test_cleanup_after_parse_failure
311
+ rd, wr = IO.pipe
312
+
313
+ stream = Jabber::Stream.new
314
+ @exceptions_caught = 0
315
+ stream.on_exception do |e, connection, where_failed|
316
+ @exceptions_caught += 1
317
+ end
318
+
319
+ assert !stream.is_connected?
320
+
321
+ stream.start(rd)
322
+ wr.write('<this is bad xml>>')
323
+ wr.close
324
+ assert stream.is_connected?
325
+
326
+ sleep(0.1)
327
+
328
+ assert rd.closed?
329
+ assert !stream.is_connected?
330
+ assert !stream.instance_eval{ @parser_thread }.alive?
331
+ assert @exceptions_caught > 0
332
+ end
333
+
334
+ end
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/ruby
2
+
3
+ $:.unshift "#{File.dirname(__FILE__)}/../../lib"
4
+
5
+ require 'test/unit'
6
+ require 'xmpp4r'
7
+
8
+ class DisconnectExceptionTest < Test::Unit::TestCase
9
+ class Listener
10
+ def receive(element)
11
+ end
12
+ end
13
+
14
+ def test_streamparser
15
+ rd, wr = IO.pipe
16
+ listener = Listener.new
17
+ exception_raised = nil
18
+
19
+ Thread.new do
20
+ begin
21
+ parser = Jabber::StreamParser.new(rd, listener)
22
+ parser.parse
23
+ rescue => e
24
+ exception_raised = e
25
+ end
26
+ end
27
+
28
+ wr.write("<hi/>")
29
+ wr.close
30
+ sleep(0.1)
31
+
32
+ assert exception_raised
33
+ assert exception_raised.is_a?(Jabber::ServerDisconnected), "Expected a Jabber::ServerDisconnected but got #{exception_raised}"
34
+ # puts exception_raised.inspect
35
+ end
36
+
37
+ end