#!/usr/bin/ruby
$:.unshift File::dirname(__FILE__) + '/../../lib'
require 'test/unit'
require File::dirname(__FILE__) + '/../lib/clienttester'
require 'xmpp4r/muc'
include Jabber
class MUCClientTest < Test::Unit::TestCase
include ClientTester
def test_new1
m = MUC::MUCClient.new(@client)
assert_equal(nil, m.jid)
assert_equal(nil, m.my_jid)
assert_equal({}, m.roster)
assert(!m.active?)
end
# JEP-0045: 6.3 Entering a Room
def test_enter_room
state { |pres|
assert_kind_of(Presence, pres)
assert_equal(JID.new('hag66@shakespeare.lit/pda'), pres.from)
assert_equal(JID.new('darkcave@macbeth.shakespeare.lit/thirdwitch'), pres.to)
send("" +
"" +
"" +
"")
}
state { |pres|
assert_kind_of(Presence, pres)
assert_equal(JID.new('hag66@shakespeare.lit/pda'), pres.from)
assert_equal(JID.new('darkcave@macbeth.shakespeare.lit/thirdwitch'), pres.to)
send("" +
" " +
"" +
"" +
" " +
"" +
"" +
" " +
"")
}
m = MUC::MUCClient.new(@client)
m.my_jid = 'hag66@shakespeare.lit/pda'
assert(!m.active?)
assert_nil(m.room)
assert_raises(ErrorException) {
m.join('darkcave@macbeth.shakespeare.lit/thirdwitch')
}
assert(!m.active?)
assert_nil(m.room)
assert_equal(m, m.join('darkcave@macbeth.shakespeare.lit/thirdwitch'))
assert(m.active?)
assert_equal('darkcave', m.room)
assert_equal(3, m.roster.size)
m.roster.each { |resource,pres|
assert_equal(resource, pres.from.resource)
assert_equal('darkcave', pres.from.node)
assert_equal('macbeth.shakespeare.lit', pres.from.domain)
assert_kind_of(String, resource)
assert_kind_of(Presence, pres)
assert(%w(firstwitch secondwitch thirdwitch).include?(resource))
assert_kind_of(MUC::XMUCUser, pres.x)
assert_kind_of(Array, pres.x.items)
assert_equal(1, pres.x.items.size)
}
assert_equal(:owner, m.roster['firstwitch'].x.items[0].affiliation)
assert_equal(:moderator, m.roster['firstwitch'].x.items[0].role)
assert_equal(:admin, m.roster['secondwitch'].x.items[0].affiliation)
assert_equal(:moderator, m.roster['secondwitch'].x.items[0].role)
assert_equal(:member, m.roster['thirdwitch'].x.items[0].affiliation)
assert_equal(:participant, m.roster['thirdwitch'].x.items[0].role)
assert_nil(m.roster['thirdwitch'].x.items[0].jid)
send("" +
" " +
"")
sleep 0.1
assert_equal(3, m.roster.size)
assert_equal(:none, m.roster['thirdwitch'].x.items[0].affiliation)
assert_equal(:participant, m.roster['thirdwitch'].x.items[0].role)
assert_equal(JID.new('hag66@shakespeare.lit/pda'), m.roster['thirdwitch'].x.items[0].jid)
end
def test_enter_room_password
state { |pres|
assert_kind_of(Presence, pres)
send("" +
"" +
"")
}
state { |pres|
assert_kind_of(Presence, pres)
assert_equal('cauldron', pres.x.password)
send("" +
" " +
"")
}
m = MUC::MUCClient.new(@client)
m.my_jid = 'hag66@shakespeare.lit/pda'
assert_raises(ErrorException) {
m.join('darkcave@macbeth.shakespeare.lit/thirdwitch')
}
assert(!m.active?)
assert_equal(m, m.join('darkcave@macbeth.shakespeare.lit/thirdwitch', 'cauldron'))
assert(m.active?)
end
def test_members_only_room
state { |pres|
assert_kind_of(Presence, pres)
send("" +
"" +
"")
}
m = MUC::MUCClient.new(@client)
m.my_jid = 'hag66@shakespeare.lit/pda'
assert_raises(ErrorException) {
m.join('darkcave@macbeth.shakespeare.lit/thirdwitch')
}
assert(!m.active?)
end
def test_banned_users
state { |pres|
assert_kind_of(Presence, pres)
send("" +
"" +
"")
}
m = MUC::MUCClient.new(@client)
m.my_jid = 'hag66@shakespeare.lit/pda'
assert_raises(ErrorException) {
m.join('darkcave@macbeth.shakespeare.lit/thirdwitch')
}
assert(!m.active?)
end
def test_nickname_conflict
state { |pres|
assert_kind_of(Presence, pres)
send("" +
"" +
"")
}
m = MUC::MUCClient.new(@client)
m.my_jid = 'hag66@shakespeare.lit/pda'
assert_raises(ErrorException) {
m.join('darkcave@macbeth.shakespeare.lit/thirdwitch')
}
assert(!m.active?)
end
def test_max_users
state { |pres|
assert_kind_of(Presence, pres)
send("" +
"" +
"")
}
m = MUC::MUCClient.new(@client)
m.my_jid = 'hag66@shakespeare.lit/pda'
assert_raises(ErrorException) {
m.join('darkcave@macbeth.shakespeare.lit/thirdwitch')
}
assert(!m.active?)
end
def test_locked_room
state { |pres|
assert_kind_of(Presence, pres)
send("" +
"" +
"")
}
m = MUC::MUCClient.new(@client)
m.my_jid = 'hag66@shakespeare.lit/pda'
assert_raises(ErrorException) {
m.join('darkcave@macbeth.shakespeare.lit/thirdwitch')
}
assert(!m.active?)
end
def test_exit_room
state { |pres|
assert_kind_of(Presence, pres)
assert_nil(pres.type)
send("" +
" " +
"")
}
state { |pres|
assert_kind_of(Presence, pres)
assert_equal(:unavailable, pres.type)
assert_equal(JID.new('hag66@shakespeare.lit/pda'), pres.from)
assert_nil(pres.status)
send("" +
" " +
"")
send("" +
" " +
"")
}
ignored_stanzas = 0
@client.add_stanza_callback { |stanza|
ignored_stanzas += 1
}
m = MUC::MUCClient.new(@client)
m.my_jid = 'hag66@shakespeare.lit/pda'
assert_equal(0, ignored_stanzas)
assert_equal(m, m.join('darkcave@macbeth.shakespeare.lit/thirdwitch'))
assert(m.active?)
assert_equal(0, ignored_stanzas)
assert_equal(m, m.exit)
assert(!m.active?)
assert_equal(1, ignored_stanzas)
end
def test_custom_exit_message
state { |pres|
assert_kind_of(Presence, pres)
assert_nil(pres.type)
send("" +
" " +
"")
}
state { |pres|
assert_kind_of(Presence, pres)
assert_equal(:unavailable, pres.type)
assert_equal(JID.new('hag66@shakespeare.lit/pda'), pres.from)
assert_equal('gone where the goblins go', pres.status)
send("" +
" " +
"")
}
m = MUC::MUCClient.new(@client)
m.my_jid = 'hag66@shakespeare.lit/pda'
assert_equal(m, m.join('darkcave@macbeth.shakespeare.lit/thirdwitch'))
assert(m.active?)
assert_equal(m, m.exit('gone where the goblins go'))
assert(!m.active?)
end
def test_joins
state { |pres|
assert_kind_of(Presence, pres)
assert_nil(pres.type)
assert_equal(JID.new('hag66@shakespeare.lit/pda'), pres.from)
assert_equal(JID.new('darkcave@macbeth.shakespeare.lit/thirdwitch'), pres.to)
send("" +
" " +
"")
}
state { |pres|
assert_kind_of(Presence, pres)
assert_equal(:unavailable, pres.type)
assert_equal(JID.new('hag66@shakespeare.lit/pda'), pres.from)
assert_equal(JID.new('darkcave@macbeth.shakespeare.lit/thirdwitch'), pres.to)
assert_nil(pres.status)
send("" +
" " +
"")
}
state { |pres|
assert_kind_of(Presence, pres)
assert_nil(pres.type)
assert_equal(JID.new('hag66@shakespeare.lit/pda'), pres.from)
assert_equal(JID.new('darkcave@macbeth.shakespeare.lit/fourthwitch'), pres.to)
send("" +
" " +
"")
}
state { |pres|
assert_kind_of(Presence, pres)
assert_equal(:unavailable, pres.type)
assert_equal(JID.new('hag66@shakespeare.lit/pda'), pres.from)
assert_equal(JID.new('darkcave@macbeth.shakespeare.lit/fourthwitch'), pres.to)
assert_equal(pres.status, 'Exiting one last time')
send("" +
" " +
"")
}
m = MUC::MUCClient.new(@client)
m.my_jid = 'hag66@shakespeare.lit/pda'
assert_equal(m, m.join('darkcave@macbeth.shakespeare.lit/thirdwitch'))
assert(m.active?)
assert_raises(RuntimeError) { m.join('darkcave@macbeth.shakespeare.lit/thirdwitch') }
assert_raises(RuntimeError) { m.join('darkcave@macbeth.shakespeare.lit/fourthwitch') }
assert(m.active?)
assert_equal(m, m.exit)
assert(!m.active?)
assert_raises(RuntimeError) { m.exit }
assert(!m.active?)
assert_equal(m, m.join('darkcave@macbeth.shakespeare.lit/fourthwitch'))
assert(m.active?)
assert_raises(RuntimeError) { m.join('darkcave@macbeth.shakespeare.lit/thirdwitch') }
assert_raises(RuntimeError) { m.join('darkcave@macbeth.shakespeare.lit/fourthwitch') }
assert(m.active?)
assert_equal(m, m.exit('Exiting one last time'))
assert(!m.active?)
assert_raises(RuntimeError) { m.exit }
assert(!m.active?)
end
def test_message_callback
state { |pres|
assert_kind_of(Presence, pres)
assert_equal('cauldron', pres.x.password)
send("" +
" " +
"")
}
message_lock = Mutex.new
message_lock.lock
messages_client = 0
@client.add_message_callback { |msg|
messages_client += 1
message_lock.unlock
}
m = MUC::MUCClient.new(@client)
m.my_jid = 'hag66@shakespeare.lit/pda'
messages_muc = 0
m.add_message_callback { |msg|
messages_muc += 1
message_lock.unlock
}
messages_muc_private = 0
m.add_private_message_callback { |msg|
messages_muc_private += 1
message_lock.unlock
}
assert_equal(m, m.join('darkcave@macbeth.shakespeare.lit/thirdwitch', 'cauldron'))
assert(m.active?)
assert_equal(0, messages_client)
assert_equal(0, messages_muc)
assert_equal(0, messages_muc_private)
send("Hello")
message_lock.lock
assert_equal(0, messages_client)
assert_equal(1, messages_muc)
assert_equal(0, messages_muc_private)
send("Hello")
message_lock.lock
assert_equal(1, messages_client)
assert_equal(1, messages_muc)
assert_equal(0, messages_muc_private)
send("Hello")
message_lock.lock
assert_equal(1, messages_client)
assert_equal(1, messages_muc)
assert_equal(1, messages_muc_private)
end
def test_presence_callbacks
state { |pres|
assert_kind_of(Presence, pres)
assert_nil(pres.x.password)
send("" +
" " +
"")
}
presence_lock = Mutex.new
presence_lock.lock
presences_client = 0
@client.add_presence_callback { |pres|
presences_client += 1
presence_lock.unlock
}
m = MUC::MUCClient.new(@client)
m.my_jid = 'hag66@shakespeare.lit/pda'
presences_join = 0
m.add_join_callback { |pres|
presences_join += 1
presence_lock.unlock
}
presences_leave = 0
m.add_leave_callback { |pres|
presences_leave += 1
presence_lock.unlock
}
presences_muc = 0
m.add_presence_callback { |pres|
presences_muc += 1
presence_lock.unlock
}
assert_equal(0, presences_client)
assert_equal(0, presences_join)
assert_equal(0, presences_leave)
assert_equal(0, presences_muc)
assert_equal(m, m.join('darkcave@macbeth.shakespeare.lit/thirdwitch'))
assert(m.active?)
assert_equal(0, presences_client)
assert_equal(0, presences_join) # Joins before own join won't be called back
assert_equal(0, presences_leave)
assert_equal(0, presences_muc)
send("" +
" " +
"")
presence_lock.lock
assert_equal(0, presences_client)
assert_equal(1, presences_join)
assert_equal(0, presences_leave)
assert_equal(0, presences_muc)
send("" +
"chat" +
"")
presence_lock.lock
assert_equal(1, presences_client)
assert_equal(1, presences_join)
assert_equal(0, presences_leave)
assert_equal(0, presences_muc)
send("" +
" " +
"away")
presence_lock.lock
assert_equal(1, presences_client)
assert_equal(1, presences_join)
assert_equal(0, presences_leave)
assert_equal(1, presences_muc)
send("")
presence_lock.lock
assert_equal(1, presences_client)
assert_equal(1, presences_join)
assert_equal(1, presences_leave)
assert_equal(1, presences_muc)
end
def test_send
state { |pres|
assert_kind_of(Presence, pres)
assert_nil(pres.x.password)
send("" +
" " +
"")
}
state { |stanza|
assert_kind_of(Message, stanza)
assert(:groupchat, stanza.type)
assert_equal(JID.new('hag66@shakespeare.lit/pda'), stanza.from)
assert_equal(JID.new('darkcave@macbeth.shakespeare.lit'), stanza.to)
assert_equal('First message', stanza.body)
}
state { |stanza|
assert_kind_of(Message, stanza)
assert(:chat, stanza.type)
assert_equal(JID.new('hag66@shakespeare.lit/pda'), stanza.from)
assert_equal(JID.new('darkcave@macbeth.shakespeare.lit/secondwitch'), stanza.to)
assert_equal('Second message', stanza.body)
}
state { |stanza|
assert_kind_of(Message, stanza)
assert(:chat, stanza.type)
assert_equal(JID.new('hag66@shakespeare.lit/pda'), stanza.from)
assert_equal(JID.new('darkcave@macbeth.shakespeare.lit/firstwitch'), stanza.to)
assert_equal('Third message', stanza.body)
}
m = MUC::MUCClient.new(@client)
m.my_jid = 'hag66@shakespeare.lit/pda'
assert_equal(m, m.join('darkcave@macbeth.shakespeare.lit/thirdwitch'))
wait_state
assert(m.active?)
m.send(Jabber::Message.new(nil, 'First message'))
wait_state
m.send(Jabber::Message.new(nil, 'Second message'), 'secondwitch')
wait_state
m.send(Jabber::Message.new('secondwitch', 'Third message'), 'firstwitch')
wait_state
end
def test_nick
state { |pres|
assert_kind_of(Presence, pres)
assert_nil(pres.x.password)
send("" +
" " +
"")
}
state { |pres|
assert_kind_of(Presence, pres)
assert_equal(JID.new('hag66@shakespeare.lit/pda'), pres.from)
assert_equal(JID.new('darkcave@macbeth.shakespeare.lit/secondwitch'), pres.to)
assert_nil(pres.type)
send("" +
"" +
"")
}
state { |pres|
assert_kind_of(Presence, pres)
assert_equal(JID.new('hag66@shakespeare.lit/pda'), pres.from)
assert_equal(JID.new('darkcave@macbeth.shakespeare.lit/oldhag'), pres.to)
assert_nil(pres.type)
send("" +
"" +
" " +
"" +
"" +
"" +
"" +
" " +
"")
}
m = MUC::MUCClient.new(@client)
m.my_jid = 'hag66@shakespeare.lit/pda'
assert_equal(m, m.join('darkcave@macbeth.shakespeare.lit/thirdwitch'))
assert(m.active?)
assert_equal('thirdwitch', m.nick)
assert_raises(ErrorException) {
m.nick = 'secondwitch'
}
assert(m.active?)
assert_equal('thirdwitch', m.nick)
m.nick = 'oldhag'
assert(m.active?)
assert_equal('oldhag', m.nick)
end
end