Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
git-svn-id: https://xmpp4r-simple.googlecode.com/svn/trunk@8 1e3c5029-9921-0410-9e82-436f4d538387
- Loading branch information
romeda
committed
Nov 9, 2006
1 parent
a863d45
commit e1c3105
Showing
1 changed file
with
241 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,241 @@ | ||
# Jabber::Simple - An extremely easy-to-use Jabber client library. | ||
# Copyright 2006 Blaine Cook <blaine@obvious.com>, Obvious Corp. | ||
# | ||
# Jabber::Simple is free software; you can redistribute it and/or modify | ||
# it under the terms of the GNU General Public License as published by | ||
# the Free Software Foundation; either version 2 of the License, or | ||
# (at your option) any later version. | ||
# | ||
# Jabber::Simple is distributed in the hope that it will be useful, | ||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
# GNU General Public License for more details. | ||
# | ||
# You should have received a copy of the GNU General Public License | ||
# along with Jabber::Simple; if not, write to the Free Software | ||
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
# | ||
$:.unshift "#{File.dirname(__FILE__)}/../lib" | ||
|
||
require 'test/unit' | ||
require 'timeout' | ||
require 'xmpp4r-simple' | ||
|
||
class JabberSimpleTest < Test::Unit::TestCase | ||
|
||
def setup | ||
@@connections ||= {} | ||
|
||
if @@connections.include?(:client1) | ||
@client1 = @@connections[:client1] | ||
@client2 = @@connections[:client2] | ||
@client1.accept_subscriptions = true | ||
@client2.accept_subscriptions = true | ||
@jid1_raw = @@connections[:jid1_raw] | ||
@jid2_raw = @@connections[:jid2_raw] | ||
@jid1 = @jid1_raw.strip.to_s | ||
@jid2 = @jid2_raw.strip.to_s | ||
return true | ||
end | ||
|
||
logins = [] | ||
begin | ||
logins = File.readlines(File.expand_path("~/.xmpp4r-simple-test-config")).map! { |login| login.split(" ") } | ||
raise StandardError unless logins.size == 2 | ||
rescue => e | ||
puts "\nConfiguration Error!\n\nYou must make available two unique Jabber accounts in order for the tests to pass." | ||
puts "Place them in ~/.xmpp4r-simple-test-config, one per line like so:\n\n" | ||
puts "user1@example.com/res password" | ||
puts "user2@example.com/res password\n\n" | ||
raise e | ||
end | ||
|
||
@@connections[:client1] = Jabber::Simple.new(*logins[0]) | ||
@@connections[:client2] = Jabber::Simple.new(*logins[1]) | ||
|
||
@@connections[:jid1_raw] = Jabber::JID.new(logins[0][0]) | ||
@@connections[:jid2_raw] = Jabber::JID.new(logins[1][0]) | ||
|
||
# Force load the client and roster, just to be safe. | ||
@@connections[:client1].roster | ||
@@connections[:client2].roster | ||
|
||
# Re-run this method to setup the local instance variables the first time. | ||
setup | ||
end | ||
|
||
def test_ensure_the_jabber_clients_are_connected_after_setup | ||
assert @client1.client.is_connected? | ||
assert @client2.client.is_connected? | ||
end | ||
|
||
def test_inspect_should_be_custom | ||
assert_equal "Jabber::Simple #{@jid1_raw}", @client1.inspect | ||
end | ||
|
||
def test_inspect_contact_should_be_custom | ||
assert_equal "Jabber::Contact #{@jid2}", @client1.contacts(@jid2).inspect | ||
end | ||
|
||
def test_remove_users_from_our_roster_should_succeed | ||
@client2.remove(@jid1) | ||
@client1.remove(@jid2) | ||
|
||
sleep 3 | ||
|
||
assert_equal false, @client1.subscribed_to?(@jid2) | ||
assert_equal false, @client2.subscribed_to?(@jid1) | ||
end | ||
|
||
def test_add_users_to_our_roster_should_succeed_with_automatic_approval | ||
@client1.remove(@jid2) | ||
@client2.remove(@jid1) | ||
|
||
assert_before 60 do | ||
assert_equal false, @client1.subscribed_to?(@jid2) | ||
assert_equal false, @client2.subscribed_to?(@jid1) | ||
end | ||
|
||
@client1.new_subscriptions | ||
@client1.add(@jid2) | ||
|
||
assert_before 60 do | ||
assert @client1.subscribed_to?(@jid2) | ||
assert @client2.subscribed_to?(@jid1) | ||
end | ||
|
||
new_subscriptions = @client1.new_subscriptions | ||
assert_equal 1, new_subscriptions.size | ||
assert_equal @jid2, new_subscriptions[0][0].jid.strip.to_s | ||
end | ||
|
||
def test_sent_message_should_be_received | ||
# First clear the client's message queue, just in case. | ||
assert_kind_of Array, @client2.received_messages | ||
|
||
# Next ensure that we're not subscribed, so that we can test the deferred message queue. | ||
@client1.remove(@jid2) | ||
@client2.remove(@jid1) | ||
sleep 2 | ||
|
||
# Deliver the messages; this should be received by the other client. | ||
@client1.deliver(@jid2, "test message") | ||
|
||
sleep 2 | ||
|
||
# Fetch the message; allow up to ten seconds for the delivery to occur. | ||
messages = [] | ||
begin | ||
Timeout::timeout(20) { | ||
loop do | ||
messages = @client2.received_messages | ||
break unless messages.empty? | ||
sleep 1 | ||
end | ||
} | ||
rescue Timeout::Error | ||
flunk "Timeout waiting for message" | ||
end | ||
|
||
# Ensure that the message was received intact. | ||
assert_equal @jid1, messages.first.from.strip.to_s | ||
assert_equal "test message", messages.first.body | ||
end | ||
|
||
def test_presence_updates_should_be_received | ||
|
||
@client2.add(@client1) | ||
|
||
assert_before(60) { assert @client2.subscribed_to?(@jid1) } | ||
assert_before(60) { assert_equal 0, @client2.presence_updates.size } | ||
|
||
@client1.status(:away, "Doing something else.") | ||
|
||
new_statuses = [] | ||
assert_before(60) do | ||
new_statuses = @client2.presence_updates | ||
assert_equal 1, new_statuses.size | ||
end | ||
|
||
new_status = new_statuses.first | ||
assert_equal @jid1, new_status[0].jid.strip.to_s | ||
assert_equal "Doing something else.", new_status[2].status | ||
assert_equal :away, new_status[2].show | ||
end | ||
|
||
def test_disable_auto_accept_subscription_requests | ||
@client1.remove(@jid2) | ||
@client2.remove(@jid1) | ||
|
||
assert_before(60) do | ||
assert_equal false, @client1.subscribed_to?(@jid2) | ||
assert_equal false, @client2.subscribed_to?(@jid1) | ||
end | ||
|
||
@client1.accept_subscriptions = false | ||
assert_equal false, @client1.accept_subscriptions? | ||
|
||
assert_before(60) { assert_equal 0, @client1.subscription_requests.size } | ||
|
||
@client2.add(@jid1) | ||
|
||
new_subscription_requests = [] | ||
assert_before(60) do | ||
new_subscription_requests = @client1.subscription_requests | ||
assert_equal 1, new_subscription_requests.size | ||
end | ||
|
||
new_subscription = new_subscription_requests.first | ||
assert_equal @jid2, new_subscription[0].jid.strip.to_s | ||
assert_equal :subscribe, new_subscription[1].type | ||
end | ||
|
||
def test_automatically_reconnect | ||
@client1.client.close | ||
|
||
assert_before 60 do | ||
assert_equal false, @client1.connected? | ||
end | ||
|
||
# empty client 2's received message queue. | ||
@client2.received_messages | ||
|
||
@client1.deliver(@jid2, "Testing") | ||
|
||
assert_before(60) { assert @client1.connected? } | ||
assert @client1.roster.instance_variable_get('@stream').is_connected? | ||
assert_before(60) { assert_equal 1, @client2.received_messages.size } | ||
end | ||
|
||
def test_disconnect_doesnt_allow_auto_reconnects | ||
@client1.disconnect | ||
|
||
assert_equal false, @client1.connected? | ||
|
||
assert_raises Jabber::ConnectionError do | ||
@client1.deliver(@jid2, "testing") | ||
end | ||
|
||
@client1.reconnect | ||
end | ||
|
||
private | ||
|
||
def assert_before(seconds, &block) | ||
error = nil | ||
begin | ||
Timeout::timeout(seconds) { | ||
begin | ||
yield | ||
rescue => e | ||
error = e | ||
sleep 0.5 | ||
retry | ||
end | ||
} | ||
rescue Timeout::Error | ||
raise error | ||
end | ||
end | ||
|
||
end |