#!/usr/bin/ruby
$:.unshift '../lib'
$:.unshift './lib/'
require 'tempfile'
require 'test/unit'
require 'socket'
require 'xmpp4r/stream'
require 'xmpp4r/semaphore'
require 'clienttester'
include Jabber
# Jabber::debug = true
class StreamTest < Test::Unit::TestCase
include ClientTester
def busywait(&block)
n = 0
while not block.call and n < 10000
Thread::pass
n += 1
end
end
##
# tests that connection really waits the call to process() to dispatch
# stanzas to filters
def test_process
called = false
@client.add_xml_callback { called = true }
assert(!called)
@server.send('')
busywait { called }
assert(called)
end
def test_process20
done = Semaphore.new
n = 0
@client.add_message_callback {
n += 1
done.run if n % 20 == 0
}
20.times {
@server.send('')
}
done.wait
assert_equal(20, n)
@server.send('' * 20)
done.wait
assert_equal(40, n)
end
def test_send
sem = Semaphore::new
@server.add_xml_callback { |e|
@server.send(Iq.new(:result))
sem.run
}
called = 0
@client.send(Iq.new(:get)) { |reply|
called += 1
if reply.kind_of? Iq and reply.type == :result
true
else
false
end
}
sem.wait
busywait { called }
assert_equal(1, called)
end
def test_send_nested
finished = Semaphore.new
id = 0
@server.add_xml_callback do |e|
id += 1
if id == 1
@server.send(Iq.new(:result).set_id('1').delete_namespace)
elsif id == 2
@server.send(Iq.new(:result).set_id('2').delete_namespace)
elsif id == 3
@server.send(Iq.new(:result).set_id('3').delete_namespace)
else
p e
end
end
called_outer = 0
called_inner = 0
@client.send(Iq.new(:get)) do |reply|
called_outer += 1
assert_kind_of(Iq, reply)
assert_equal(:result, reply.type)
if reply.id == '1'
@client.send(Iq.new(:set)) do |reply2|
called_inner += 1
assert_kind_of(Iq, reply2)
assert_equal(:result, reply2.type)
assert_equal('2', reply2.id)
@client.send(Iq.new(:get))
true
end
false
elsif reply.id == '3'
true
else
false
end
end
assert_equal(2, called_outer)
assert_equal(1, called_inner)
end
def test_send_in_callback
finished = Semaphore.new
@client.add_message_callback {
@client.send_with_id(Iq.new(:get)) { |reply|
assert_equal(:result, reply.type)
finished.run
}
}
@server.add_iq_callback { |iq|
@server.send(Iq.new(:result).set_id(iq.id))
}
@server.send(Message.new)
finished.wait
end
def test_similar_children
n = 0
@client.add_message_callback { n += 1 }
assert_equal(0, n)
@server.send("")
busywait { n == 1 }
assert_equal(1, n)
@server.send('')
assert_equal(1, n)
@server.send('')
assert_equal(1, n)
@server.send('')
busywait { n == 2 }
assert_equal(2, n)
@server.send("")
assert_equal(2, n)
@server.send('')
busywait { n == 3 }
assert_equal(3, n)
end
end