diff options
Diffstat (limited to 'test/com/isode/stroke/filetransfer/IBBReceiveSessionTest.java')
-rw-r--r-- | test/com/isode/stroke/filetransfer/IBBReceiveSessionTest.java | 238 |
1 files changed, 238 insertions, 0 deletions
diff --git a/test/com/isode/stroke/filetransfer/IBBReceiveSessionTest.java b/test/com/isode/stroke/filetransfer/IBBReceiveSessionTest.java new file mode 100644 index 0000000..bb6ac7a --- /dev/null +++ b/test/com/isode/stroke/filetransfer/IBBReceiveSessionTest.java @@ -0,0 +1,238 @@ +/* Copyright (c) 2016, Isode Limited, London, England. + * All rights reserved. + * + * Acquisition and use of this software and related materials for any + * purpose requires a written license agreement from Isode Limited, + * or a written license from an organisation licensed by Isode Limited + * to grant such a license. + * + */ +package com.isode.stroke.filetransfer; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +import com.isode.stroke.base.ByteArray; +import com.isode.stroke.client.DummyStanzaChannel; +import com.isode.stroke.elements.IBB; +import com.isode.stroke.elements.IBB.Action; +import com.isode.stroke.elements.IQ; +import com.isode.stroke.elements.IQ.Type; +import com.isode.stroke.jid.JID; +import com.isode.stroke.queries.IQRouter; +import com.isode.stroke.signals.Slot1; + +/** + * Tests for {@link IBBReceiveSession} + */ +public class IBBReceiveSessionTest { + + private final DummyStanzaChannel stanzaChannel = new DummyStanzaChannel(); + private final IQRouter iqRouter = new IQRouter(stanzaChannel); + private boolean finished = false; + private final ByteArrayWriteBytestream bytestream = new ByteArrayWriteBytestream(); + private FileTransferError error = null; + + @Test + public void testOpen() { + IBBReceiveSession testling = createSession("foo@bar.com/baz", "mysession"); + testling.start(); + stanzaChannel.onIQReceived.emit(createIBBRequest(IBB.createIBBOpen("mysession", 0x10), + new JID("foo@bar.com/baz"), "id-open")); + assertTrue(stanzaChannel.isResultAtIndex(0, "id-open")); + assertFalse(finished); + testling.stop(); + } + + @Test + public void testReceiveData() { + IBBReceiveSession testling = createSession("foo@bar.com/baz", "mysession"); + testling.start(); + stanzaChannel.onIQReceived.emit(createIBBRequest( + IBB.createIBBOpen("mysession", 0x10), + new JID("foo@bar.com/baz"), + "id-open")); + + stanzaChannel.onIQReceived.emit(createIBBRequest( + IBB.createIBBData("mysession", 0, new ByteArray("abc")), + new JID("foo@bar.com/baz"), + "id-a")); + + assertTrue(stanzaChannel.isResultAtIndex(1, "id-a")); + assertEquals(new ByteArray("abc"),bytestream.getData()); + assertFalse(finished); + + testling.stop(); + } + + @Test + public void testReceiveMultipleData() { + IBBReceiveSession testling = createSession("foo@bar.com/baz", "mysession"); + testling.start(); + stanzaChannel.onIQReceived.emit(createIBBRequest( + IBB.createIBBOpen("mysession", 0x10), + new JID("foo@bar.com/baz"), + "id-open")); + + stanzaChannel.onIQReceived.emit(createIBBRequest( + IBB.createIBBData("mysession", 0, new ByteArray("abc")), + new JID("foo@bar.com/baz"), + "id-a")); + + stanzaChannel.onIQReceived.emit(createIBBRequest( + IBB.createIBBData("mysession", 1, new ByteArray("def")), + new JID("foo@bar.com/baz"), + "id-b")); + + assertTrue(stanzaChannel.isResultAtIndex(2, "id-b")); + assertEquals(new ByteArray("abcdef"),bytestream.getData()); + assertFalse(finished); + + testling.stop(); + } + + @Test + public void testReceiveDataForOtherSession() { + IBBReceiveSession testling = createSession("foo@bar.com/baz", "mysession"); + testling.start(); + stanzaChannel.onIQReceived.emit(createIBBRequest( + IBB.createIBBOpen("mysession", 0x10), + new JID("foo@bar.com/baz"), + "id-open")); + + stanzaChannel.onIQReceived.emit(createIBBRequest( + IBB.createIBBData("othersession", 0, new ByteArray("abc")), + new JID("foo@bar.com/baz"), + "id-a")); + + assertTrue(stanzaChannel.isErrorAtIndex(1, "id-a")); + + testling.stop(); + } + + @Test + public void testReceiveDataOutOfOrder() { + IBBReceiveSession testling = createSession("foo@bar.com/baz", "mysession"); + testling.start(); + stanzaChannel.onIQReceived.emit(createIBBRequest( + IBB.createIBBOpen("mysession", 0x10), + new JID("foo@bar.com/baz"), + "id-open")); + + stanzaChannel.onIQReceived.emit(createIBBRequest( + IBB.createIBBData("mysession", 0, new ByteArray("abc")), + new JID("foo@bar.com/baz"), + "id-a")); + + stanzaChannel.onIQReceived.emit(createIBBRequest( + IBB.createIBBData("mysession", 0, new ByteArray("def")), + new JID("foo@bar.com/baz"), + "id-b")); + + assertTrue(stanzaChannel.isErrorAtIndex(2, "id-b")); + assertTrue(finished); + assertNotNull(error); + + testling.stop(); + } + + @Test + public void testReceiveLastData() { + IBBReceiveSession testling = createSession("foo@bar.com/baz", "mysession", 6); + testling.start(); + stanzaChannel.onIQReceived.emit(createIBBRequest( + IBB.createIBBOpen("mysession", 0x10), + new JID("foo@bar.com/baz"), + "id-open")); + + stanzaChannel.onIQReceived.emit(createIBBRequest( + IBB.createIBBData("mysession", 0, new ByteArray("abc")), + new JID("foo@bar.com/baz"), + "id-a")); + + stanzaChannel.onIQReceived.emit(createIBBRequest( + IBB.createIBBData("mysession", 1, new ByteArray("def")), + new JID("foo@bar.com/baz"), + "id-b")); + + assertTrue(stanzaChannel.isResultAtIndex(2, "id-b")); + assertEquals(new ByteArray("abcdef"),bytestream.getData()); + assertTrue(finished); + assertNull(error); + + testling.stop(); + } + + @Test + public void testReceiveClose() { + IBBReceiveSession testling = createSession("foo@bar.com/baz", "mysession", 6); + testling.start(); + stanzaChannel.onIQReceived.emit(createIBBRequest( + IBB.createIBBOpen("mysession", 0x10), + new JID("foo@bar.com/baz"), + "id-open")); + + stanzaChannel.onIQReceived.emit(createIBBRequest( + IBB.createIBBClose("mysession"), + new JID("foo@bar.com/baz"), + "id-close")); + + assertTrue(finished); + assertNotNull(error); + + testling.stop(); + } + + @Test + public void testStopWhileActive() { + IBBReceiveSession testling = createSession("foo@bar.com/baz", "mysession", 6); + testling.start(); + stanzaChannel.onIQReceived.emit(createIBBRequest( + IBB.createIBBOpen("mysession", 0x10), + new JID("foo@bar.com/baz"), + "id-open")); + + testling.stop(); + + assertTrue(stanzaChannel.isRequestAtIndex(1, new JID("foo@bar.com/baz"), + Type.Set, new IBB())); + IBB ibb = stanzaChannel.sentStanzas.get(1).getPayload(new IBB()); + assertEquals(Action.Close,ibb.getAction()); + assertTrue(finished); + assertNull(error); + } + + private IQ createIBBRequest(IBB ibb,JID from,String id) { + IQ request = IQ.createRequest(Type.Set, new JID("baz@fum.com/dum"), id, ibb); + request.setFrom(from); + return request; + } + + private IBBReceiveSession createSession(String from,String id) { + return createSession(from, id, 0x1000); + } + + private IBBReceiveSession createSession(String from,String id,int size) { + IBBReceiveSession session = + new IBBReceiveSession(id, new JID(from), new JID(), size, bytestream, iqRouter); + session.onFinished.connect(new Slot1<FileTransferError>() { + + @Override + public void call(FileTransferError error) { + handleFinished(error); + } + }); + return session; + } + + private void handleFinished(FileTransferError error) { + finished = true; + this.error = error; + } + +} |