pyu-xmpp4r-simple 0.8.8
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.
- data/CHANGELOG +73 -0
- data/COPYING +281 -0
- data/README +96 -0
- data/lib/xmpp4r-simple.rb +819 -0
- data/test/test_xmpp4r_simple.rb +313 -0
- metadata +87 -0
@@ -0,0 +1,313 @@
|
|
1
|
+
# Jabber::Simple - An extremely easy-to-use Jabber client library.
|
2
|
+
# Copyright 2006 Blaine Cook <blaine@obvious.com>, Obvious Corp.
|
3
|
+
#
|
4
|
+
# Jabber::Simple is free software; you can redistribute it and/or modify
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
6
|
+
# the Free Software Foundation; either version 2 of the License, or
|
7
|
+
# (at your option) any later version.
|
8
|
+
#
|
9
|
+
# Jabber::Simple is distributed in the hope that it will be useful,
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
+
# GNU General Public License for more details.
|
13
|
+
#
|
14
|
+
# You should have received a copy of the GNU General Public License
|
15
|
+
# along with Jabber::Simple; if not, write to the Free Software
|
16
|
+
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
17
|
+
#
|
18
|
+
$:.unshift "#{File.dirname(__FILE__)}/../lib"
|
19
|
+
|
20
|
+
require 'test/unit'
|
21
|
+
require 'timeout'
|
22
|
+
require 'xmpp4r-simple'
|
23
|
+
|
24
|
+
class JabberSimpleTest < Test::Unit::TestCase
|
25
|
+
|
26
|
+
def setup
|
27
|
+
@@connections ||= {}
|
28
|
+
|
29
|
+
if @@connections.include?(:client1)
|
30
|
+
@client1 = @@connections[:client1]
|
31
|
+
@client2 = @@connections[:client2]
|
32
|
+
@client1.accept_subscriptions = true
|
33
|
+
@client2.accept_subscriptions = true
|
34
|
+
@jid1_raw = @@connections[:jid1_raw]
|
35
|
+
@jid2_raw = @@connections[:jid2_raw]
|
36
|
+
@jid1 = @jid1_raw.strip.to_s
|
37
|
+
@jid2 = @jid2_raw.strip.to_s
|
38
|
+
@domain1 = @jid1_raw.domain
|
39
|
+
@domain2 = @jid2_raw.domain
|
40
|
+
@pubsub1 = "pubsub." + @domain1
|
41
|
+
@pubsub2 = "pubsub." + @domain2
|
42
|
+
return true
|
43
|
+
end
|
44
|
+
|
45
|
+
logins = []
|
46
|
+
begin
|
47
|
+
logins = File.readlines(File.expand_path("~/.xmpp4r-simple-test-config")).map! { |login| login.split(" ") }
|
48
|
+
raise StandardError unless logins.size == 2
|
49
|
+
rescue => e
|
50
|
+
puts "\nConfiguration Error!\n\nYou must make available two unique Jabber accounts in order for the tests to pass."
|
51
|
+
puts "Place them in ~/.xmpp4r-simple-test-config, one per line like so:\n\n"
|
52
|
+
puts "user1@example.com/res password"
|
53
|
+
puts "user2@example.com/res password\n\n"
|
54
|
+
raise e
|
55
|
+
end
|
56
|
+
|
57
|
+
@@connections[:client1] = Jabber::Simple.new(*logins[0])
|
58
|
+
@@connections[:client2] = Jabber::Simple.new(*logins[1])
|
59
|
+
|
60
|
+
@@connections[:jid1_raw] = Jabber::JID.new(logins[0][0])
|
61
|
+
@@connections[:jid2_raw] = Jabber::JID.new(logins[1][0])
|
62
|
+
|
63
|
+
# Force load the client and roster, just to be safe.
|
64
|
+
@@connections[:client1].roster
|
65
|
+
@@connections[:client2].roster
|
66
|
+
|
67
|
+
# Re-run this method to setup the local instance variables the first time.
|
68
|
+
setup
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_ensure_the_jabber_clients_are_connected_after_setup
|
72
|
+
assert @client1.client.is_connected?
|
73
|
+
assert @client2.client.is_connected?
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_inspect_should_be_custom
|
77
|
+
assert_equal "Jabber::Simple #{@jid1_raw}", @client1.inspect
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_inspect_contact_should_be_custom
|
81
|
+
assert_equal "Jabber::Contact #{@jid2}", @client1.contacts(@jid2).inspect
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_remove_users_from_our_roster_should_succeed
|
85
|
+
@client2.remove(@jid1)
|
86
|
+
@client1.remove(@jid2)
|
87
|
+
|
88
|
+
sleep 3
|
89
|
+
|
90
|
+
assert_equal false, @client1.subscribed_to?(@jid2)
|
91
|
+
assert_equal false, @client2.subscribed_to?(@jid1)
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_add_users_to_our_roster_should_succeed_with_automatic_approval
|
95
|
+
@client1.remove(@jid2)
|
96
|
+
@client2.remove(@jid1)
|
97
|
+
|
98
|
+
assert_before 10 do
|
99
|
+
assert_equal false, @client1.subscribed_to?(@jid2)
|
100
|
+
assert_equal false, @client2.subscribed_to?(@jid1)
|
101
|
+
end
|
102
|
+
|
103
|
+
@client1.new_subscriptions
|
104
|
+
@client1.add(@jid2)
|
105
|
+
|
106
|
+
assert_before 10 do
|
107
|
+
assert @client1.subscribed_to?(@jid2)
|
108
|
+
assert @client2.subscribed_to?(@jid1)
|
109
|
+
end
|
110
|
+
|
111
|
+
new_subscriptions = @client1.new_subscriptions
|
112
|
+
assert_equal 1, new_subscriptions.size
|
113
|
+
assert_equal @jid2, new_subscriptions[0][0].jid.strip.to_s
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_sent_message_should_be_received
|
117
|
+
# First clear the client's message queue, just in case.
|
118
|
+
assert_kind_of Array, @client2.received_messages
|
119
|
+
|
120
|
+
# Next ensure that we're not subscribed, so that we can test the deferred message queue.
|
121
|
+
@client1.remove(@jid2)
|
122
|
+
@client2.remove(@jid1)
|
123
|
+
sleep 2
|
124
|
+
|
125
|
+
# Deliver the messages; this should be received by the other client.
|
126
|
+
@client1.deliver(@jid2, "test message")
|
127
|
+
|
128
|
+
sleep 2
|
129
|
+
|
130
|
+
# Fetch the message; allow up to ten seconds for the delivery to occur.
|
131
|
+
messages = []
|
132
|
+
begin
|
133
|
+
Timeout::timeout(20) {
|
134
|
+
loop do
|
135
|
+
messages = @client2.received_messages
|
136
|
+
break unless messages.empty?
|
137
|
+
sleep 1
|
138
|
+
end
|
139
|
+
}
|
140
|
+
rescue Timeout::Error
|
141
|
+
flunk "Timeout waiting for message"
|
142
|
+
end
|
143
|
+
|
144
|
+
# Ensure that the message was received intact.
|
145
|
+
assert_equal @jid1, messages.first.from.strip.to_s
|
146
|
+
assert_equal "test message", messages.first.body
|
147
|
+
end
|
148
|
+
|
149
|
+
def test_presence_updates_should_be_received
|
150
|
+
|
151
|
+
@client2.add(@client1)
|
152
|
+
@client1.add(@client2)
|
153
|
+
|
154
|
+
assert_before(60) { assert @client2.subscribed_to?(@jid1) }
|
155
|
+
assert_before(60) { assert_equal 0, @client2.presence_updates.size }
|
156
|
+
|
157
|
+
@client1.status(:away, "Doing something else.")
|
158
|
+
|
159
|
+
new_statuses = []
|
160
|
+
assert_before(60) do
|
161
|
+
new_statuses = @client2.presence_updates
|
162
|
+
assert_equal 1, new_statuses.size
|
163
|
+
end
|
164
|
+
|
165
|
+
new_status = new_statuses.first
|
166
|
+
assert_equal @jid1, new_status[0]
|
167
|
+
assert_equal "Doing something else.", new_status[2]
|
168
|
+
assert_equal :away, new_status[1]
|
169
|
+
end
|
170
|
+
|
171
|
+
def test_disable_auto_accept_subscription_requests
|
172
|
+
@client1.remove(@jid2)
|
173
|
+
@client2.remove(@jid1)
|
174
|
+
|
175
|
+
assert_before(60) do
|
176
|
+
assert_equal false, @client1.subscribed_to?(@jid2)
|
177
|
+
assert_equal false, @client2.subscribed_to?(@jid1)
|
178
|
+
end
|
179
|
+
|
180
|
+
@client1.accept_subscriptions = false
|
181
|
+
assert_equal false, @client1.accept_subscriptions?
|
182
|
+
|
183
|
+
assert_before(60) { assert_equal 0, @client1.subscription_requests.size }
|
184
|
+
|
185
|
+
@client2.add(@jid1)
|
186
|
+
|
187
|
+
new_subscription_requests = []
|
188
|
+
assert_before(60) do
|
189
|
+
new_subscription_requests = @client1.subscription_requests
|
190
|
+
assert_equal 1, new_subscription_requests.size
|
191
|
+
end
|
192
|
+
|
193
|
+
new_subscription = new_subscription_requests.first
|
194
|
+
assert_equal @jid2, new_subscription[0].jid.strip.to_s
|
195
|
+
assert_equal :subscribe, new_subscription[1].type
|
196
|
+
end
|
197
|
+
|
198
|
+
def test_automatically_reconnect
|
199
|
+
@client1.client.close
|
200
|
+
|
201
|
+
assert_before 60 do
|
202
|
+
assert_equal false, @client1.connected?
|
203
|
+
end
|
204
|
+
|
205
|
+
# empty client 2's received message queue.
|
206
|
+
@client2.received_messages
|
207
|
+
|
208
|
+
@client1.deliver(@jid2, "Testing")
|
209
|
+
|
210
|
+
assert_before(60) { assert @client1.connected? }
|
211
|
+
assert @client1.roster.instance_variable_get('@stream').is_connected?
|
212
|
+
assert_before(60) { assert_equal 1, @client2.received_messages.size }
|
213
|
+
end
|
214
|
+
|
215
|
+
def test_disconnect_doesnt_allow_auto_reconnects
|
216
|
+
@client1.disconnect
|
217
|
+
|
218
|
+
assert_equal false, @client1.connected?
|
219
|
+
|
220
|
+
assert_raises Jabber::ConnectionError do
|
221
|
+
@client1.deliver(@jid2, "testing")
|
222
|
+
end
|
223
|
+
|
224
|
+
@client1.reconnect
|
225
|
+
end
|
226
|
+
|
227
|
+
def test_set_pubsub_service
|
228
|
+
if ! @client1.has_pubsub?
|
229
|
+
@client1.set_pubsub_service(@pubsub1)
|
230
|
+
end
|
231
|
+
assert @client1.has_pubsub?
|
232
|
+
end
|
233
|
+
|
234
|
+
def test_create_delete_node
|
235
|
+
set_pubsub
|
236
|
+
delete_nodes
|
237
|
+
|
238
|
+
assert_nothing_raised @client1.create_node("/home/#{@domain1}/testnode1")
|
239
|
+
assert_nothing_raised @client2.create_node("/home/#{@domain2}/testnode2")
|
240
|
+
assert_nothing_raised @client1.create_node("/home/#{@domain1}/testnode1/level1")
|
241
|
+
assert_nothing_raised @client2.create_node("/home/#{@domain2}/testnode2/level2")
|
242
|
+
|
243
|
+
assert_nothing_raised @client1.delete_node("/home/#{@domain1}/testnode1")
|
244
|
+
assert_nothing_raised @client2.delete_node("/home/#{@domain2}/testnode2")
|
245
|
+
assert_nothing_raised @client1.delete_node("/home/#{@domain1}/testnode1/level1")
|
246
|
+
assert_nothing_raised @client2.delete_node("/home/#{@domain2}/testnode2/level2")
|
247
|
+
end
|
248
|
+
|
249
|
+
def test_publish_and_subscribe
|
250
|
+
set_pubsub
|
251
|
+
create_nodes
|
252
|
+
|
253
|
+
@client1.pubsubscribe_to("/home/#{@domain2}/testnode2/level2")
|
254
|
+
@client2.pubsubscribe_to("/home/#{@domain1}/testnode1/level1")
|
255
|
+
|
256
|
+
puts @client1.pubsubscriptions
|
257
|
+
puts @client2.pubsubscriptions
|
258
|
+
|
259
|
+
delete_nodes
|
260
|
+
end
|
261
|
+
|
262
|
+
private
|
263
|
+
|
264
|
+
def assert_before(seconds, &block)
|
265
|
+
error = nil
|
266
|
+
|
267
|
+
# This is for Ruby 1.9.1 compatibility
|
268
|
+
assertion_exception_class = begin
|
269
|
+
MiniTest::Assertion
|
270
|
+
rescue NameError
|
271
|
+
Test::Unit::AssertionFailedError
|
272
|
+
end
|
273
|
+
|
274
|
+
begin
|
275
|
+
Timeout::timeout(seconds) {
|
276
|
+
begin
|
277
|
+
yield
|
278
|
+
rescue assertion_exception_class => e
|
279
|
+
error = e
|
280
|
+
sleep 0.5
|
281
|
+
retry
|
282
|
+
end
|
283
|
+
}
|
284
|
+
rescue Timeout::Error
|
285
|
+
raise error
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
289
|
+
def create_nodes
|
290
|
+
@client1.create_node("/home/#{@domain1}/testnode1")
|
291
|
+
@client2.create_node("/home/#{@domain2}/testnode2")
|
292
|
+
@client1.create_node("/home/#{@domain1}/testnode1/level1")
|
293
|
+
@client2.create_node("/home/#{@domain2}/testnode2/level2")
|
294
|
+
end
|
295
|
+
|
296
|
+
def delete_nodes
|
297
|
+
begin
|
298
|
+
@client1.delete_node("/home/#{@domain1}/testnode1")
|
299
|
+
@client2.delete_node("/home/#{@domain2}/testnode2")
|
300
|
+
@client1.delete_node("/home/#{@domain1}/testnode1/level1")
|
301
|
+
@client2.delete_node("/home/#{@domain2}/testnode2/level2")
|
302
|
+
rescue
|
303
|
+
# => Do nothing
|
304
|
+
end
|
305
|
+
end
|
306
|
+
|
307
|
+
def set_pubsub
|
308
|
+
@client1.set_pubsub_service(@pubsub1) if ! @client1.has_pubsub?
|
309
|
+
@client2.set_pubsub_service(@pubsub2) if ! @client2.has_pubsub?
|
310
|
+
end
|
311
|
+
|
312
|
+
|
313
|
+
end
|
metadata
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: pyu-xmpp4r-simple
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 47
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 8
|
9
|
+
- 8
|
10
|
+
version: 0.8.8
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Blaine Cook
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-11-03 00:00:00 -05:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: xmpp4r
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 23
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
- 3
|
33
|
+
- 2
|
34
|
+
version: 0.3.2
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
description: " Jabber::Simple takes the strong foundation laid by xmpp4r\n and hides the relatively high complexity of maintaining a simple instant\n messenger bot in Ruby.\n"
|
38
|
+
email: romeda@gmail.com
|
39
|
+
executables: []
|
40
|
+
|
41
|
+
extensions: []
|
42
|
+
|
43
|
+
extra_rdoc_files:
|
44
|
+
- README
|
45
|
+
- COPYING
|
46
|
+
files:
|
47
|
+
- test/test_xmpp4r_simple.rb
|
48
|
+
- lib/xmpp4r-simple.rb
|
49
|
+
- README
|
50
|
+
- COPYING
|
51
|
+
- CHANGELOG
|
52
|
+
has_rdoc: true
|
53
|
+
homepage: http://xmpp4r-simple.rubyforge.org/
|
54
|
+
licenses: []
|
55
|
+
|
56
|
+
post_install_message:
|
57
|
+
rdoc_options: []
|
58
|
+
|
59
|
+
require_paths:
|
60
|
+
- lib
|
61
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
62
|
+
none: false
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
hash: 3
|
67
|
+
segments:
|
68
|
+
- 0
|
69
|
+
version: "0"
|
70
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
71
|
+
none: false
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
hash: 3
|
76
|
+
segments:
|
77
|
+
- 0
|
78
|
+
version: "0"
|
79
|
+
requirements: []
|
80
|
+
|
81
|
+
rubyforge_project: xmpp4r-simple
|
82
|
+
rubygems_version: 1.3.7
|
83
|
+
signing_key:
|
84
|
+
specification_version: 3
|
85
|
+
summary: A simplified Jabber client library.
|
86
|
+
test_files:
|
87
|
+
- test/test_xmpp4r_simple.rb
|