#!/usr/bin/ruby
$:.unshift File::dirname(__FILE__) + '/../../lib'
require 'test/unit'
require File::dirname(__FILE__) + '/../lib/clienttester'
require 'xmpp4r'
require 'xmpp4r/bytestreams'
require 'xmpp4r/semaphore'
include Jabber
class IBBTest < Test::Unit::TestCase
include ClientTester
def create_buffer(size)
([nil] * size).collect { rand(256).chr }.join
end
def test_ibb_target2initiator
target = Bytestreams::IBBTarget.new(@server, '1', nil, '1@a.com/1')
initiator = Bytestreams::IBBInitiator.new(@client, '1', nil, '1@a.com/1')
buffer = create_buffer(9999)
Thread.new do
target.accept
target.write(buffer)
Thread.pass
target.close
end
initiator.open
received = ''
while buf = initiator.read
received += buf
end
initiator.close
assert_equal(buffer, received)
end
def test_ibb_initiator2target
target = Bytestreams::IBBTarget.new(@server, '1', nil, '1@a.com/1')
initiator = Bytestreams::IBBInitiator.new(@client, '1', nil, '1@a.com/1')
buffer = create_buffer(9999)
Thread.new do
Thread.pass
initiator.open
initiator.write(buffer)
Thread.pass
initiator.close
end
target.accept
received = ''
while buf = target.read
received += buf
end
target.close
assert_equal(buffer, received)
end
def test_ibb_pingpong
ignored_stanzas = 0
wait = Semaphore.new
@server.add_message_callback { ignored_stanzas += 1; wait.run }
@server.add_iq_callback { ignored_stanzas += 1; wait.run }
target = Bytestreams::IBBTarget.new(@server, '1', nil, '1@a.com/1')
initiator = Bytestreams::IBBInitiator.new(@client, '1', nil, '1@a.com/1')
Thread.new do
target.accept
while buf = target.read
target.write(buf)
target.flush
end
target.close
end
assert_equal(0, ignored_stanzas)
@client.send("
")
wait.wait
assert_equal(1, ignored_stanzas)
initiator.open
assert_equal(1, ignored_stanzas)
@client.send("
")
wait.wait
assert_equal(2, ignored_stanzas)
@client.send("
")
wait.wait
assert_equal(3, ignored_stanzas)
10.times do
buf = create_buffer(9999)
initiator.write(buf)
initiator.flush
bufr = ''
begin
bufr += initiator.read
end while bufr.size < buf.size
assert_equal(buf, bufr)
end
initiator.close
assert_equal(3, ignored_stanzas)
end
def test_ibb_error
target = Bytestreams::IBBTarget.new(@server, '1', nil, '1@a.com/1')
initiator = Bytestreams::IBBInitiator.new(@client, '1', nil, '1@a.com/1')
Thread.new do
target.accept
@server.send("
")
end
initiator.open
assert_nil(initiator.read)
initiator.close
end
def test_ibb_inactive
target = Bytestreams::IBBTarget.new(@server, '1', nil, '1@a.com/1')
initiator = Bytestreams::IBBInitiator.new(@client, '1', nil, '1@a.com/1')
assert_nil(target.read)
assert_nil(initiator.read)
assert_raise(RuntimeError) {
target.write('a' * target.block_size)
}
assert_raise(RuntimeError) {
initiator.write('a' * initiator.block_size)
}
end
def test_ibb_queueitem
i1 = Bytestreams::IBBQueueItem.new(:close)
assert_equal(:close, i1.type)
assert_nil(i1.seq)
i2 = Bytestreams::IBBQueueItem.new(:data, 1, Base64::encode64('blah'))
assert_equal(:data, i2.type)
assert_equal(1, i2.seq)
assert_equal('blah', i2.data)
assert_raise(RuntimeError) {
i3 = Bytestreams::IBBQueueItem.new(:invalid)
}
end
end