# Jabber::Simple - An extremely easy-to-use Jabber client library. # Copyright 2006 Blaine Cook , 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