summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'test/com/isode/stroke/streamstack/StreamStackTest.java')
-rw-r--r--test/com/isode/stroke/streamstack/StreamStackTest.java219
1 files changed, 219 insertions, 0 deletions
diff --git a/test/com/isode/stroke/streamstack/StreamStackTest.java b/test/com/isode/stroke/streamstack/StreamStackTest.java
new file mode 100644
index 0000000..b868a59
--- /dev/null
+++ b/test/com/isode/stroke/streamstack/StreamStackTest.java
@@ -0,0 +1,219 @@
+/*
+ * Copyright (c) 2010-2014 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+/*
+ * Copyright (c) 2015 Tarun Gupta.
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+package com.isode.stroke.streamstack;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import org.junit.Test;
+import org.junit.Before;
+import com.isode.stroke.base.SafeByteArray;
+import com.isode.stroke.streamstack.StreamStack;
+import com.isode.stroke.streamstack.LowLayer;
+import com.isode.stroke.streamstack.XMPPLayer;
+import com.isode.stroke.streamstack.StreamLayer;
+import com.isode.stroke.parser.PlatformXMLParserFactory;
+import com.isode.stroke.parser.payloadparsers.FullPayloadParserFactoryCollection;
+import com.isode.stroke.serializer.payloadserializers.FullPayloadSerializerCollection;
+import com.isode.stroke.elements.Element;
+import com.isode.stroke.elements.StreamType;
+import com.isode.stroke.signals.Slot1;
+import java.util.Vector;
+
+public class StreamStackTest {
+
+ private class MyStreamLayer extends StreamLayer {
+
+ public MyStreamLayer(final String prepend) {
+ this.prepend_ = prepend;
+ }
+
+ public void writeData(final SafeByteArray data) {
+ writeDataToChildLayer(new SafeByteArray(prepend_).append(data));
+ }
+
+ public void handleDataRead(final SafeByteArray data) {
+ writeDataToParentLayer(new SafeByteArray(prepend_).append(data));
+ }
+
+ private String prepend_ = "";
+ };
+
+ /* Multiple-inheritance workarounds */
+
+ private StreamLayer fakeStreamLayer_ = new StreamLayer() {
+ public void writeData(SafeByteArray data) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public void handleDataRead(SafeByteArray data) {
+ writeDataToParentLayer(data);
+ }
+ };
+
+ private class TestLowLayer implements LowLayer {
+
+ public Vector<SafeByteArray> data_ = new Vector<SafeByteArray>();
+
+ public TestLowLayer() {
+
+ }
+
+ public void writeData(final SafeByteArray data) {
+ data_.add(data);
+ }
+
+ public void onDataRead(SafeByteArray data) {
+ writeDataToParentLayer(data);
+ }
+
+ public HighLayer getParentLayer() {
+ return fakeStreamLayer_.getParentLayer();
+ }
+
+ public void setParentLayer(HighLayer highLayer) {
+ fakeStreamLayer_.setParentLayer(highLayer);
+ }
+
+ public void writeDataToParentLayer(SafeByteArray data) {
+ fakeStreamLayer_.writeDataToParentLayer(data);
+ }
+ };
+
+ private FullPayloadParserFactoryCollection parserFactories_ = new FullPayloadParserFactoryCollection();
+ private FullPayloadSerializerCollection serializers_ = new FullPayloadSerializerCollection();
+ private TestLowLayer physicalStream_;
+ private XMPPLayer xmppStream_;
+ private int elementsReceived_;
+ private int dataWriteReceived_;
+
+ @Before
+ public void setUp() {
+ physicalStream_ = new TestLowLayer();
+ xmppStream_ = new XMPPLayer(parserFactories_, serializers_, StreamType.ClientStreamType);
+ elementsReceived_ = 0;
+ dataWriteReceived_ = 0;
+ }
+
+ public void handleElement(Element element) {
+ ++elementsReceived_;
+ }
+
+ public void handleWriteData(final SafeByteArray SafeByteArray) {
+ ++dataWriteReceived_;
+ }
+
+ @Test
+ public void testWriteData_NoIntermediateStreamStack() {
+ StreamStack testling = new StreamStack(xmppStream_, physicalStream_);
+
+ xmppStream_.writeData("foo");
+
+ assertEquals(1, physicalStream_.data_.size());
+ assertEquals(new SafeByteArray("foo"), physicalStream_.data_.get(0));
+ }
+
+ @Test
+ public void testWriteData_OneIntermediateStream() {
+ StreamStack testling = new StreamStack(xmppStream_, physicalStream_);
+ MyStreamLayer xStream = new MyStreamLayer("X");
+ testling.addLayer(xStream);
+
+ xmppStream_.writeData("foo");
+
+ assertEquals(1, physicalStream_.data_.size());
+ assertEquals(new SafeByteArray("Xfoo"), physicalStream_.data_.get(0));
+ }
+
+ @Test
+ public void testWriteData_TwoIntermediateStreamStack() {
+ StreamStack testling = new StreamStack(xmppStream_, physicalStream_);
+ MyStreamLayer xStream = new MyStreamLayer("X");
+ MyStreamLayer yStream = new MyStreamLayer("Y");
+ testling.addLayer(xStream);
+ testling.addLayer(yStream);
+
+ xmppStream_.writeData("foo");
+
+ assertEquals(1, physicalStream_.data_.size());
+ assertEquals(new SafeByteArray("XYfoo"), physicalStream_.data_.get(0));
+ }
+
+ @Test
+ public void testReadData_NoIntermediateStreamStack() {
+ StreamStack testling = new StreamStack(xmppStream_, physicalStream_);
+ xmppStream_.onElement.connect(new Slot1<Element>() {
+ @Override
+ public void call(Element e1) {
+ handleElement(e1);
+ }
+ });
+ physicalStream_.onDataRead(new SafeByteArray("<stream:stream xmlns:stream='http://etherx.jabber.org/streams'><presence/>"));
+
+ assertEquals(1, elementsReceived_);
+ }
+
+ @Test
+ public void testReadData_OneIntermediateStream() {
+ StreamStack testling = new StreamStack(xmppStream_, physicalStream_);
+ xmppStream_.onElement.connect(new Slot1<Element>() {
+ @Override
+ public void call(Element e1) {
+ handleElement(e1);
+ }
+ });
+ MyStreamLayer xStream = new MyStreamLayer("<");
+ testling.addLayer(xStream);
+
+ physicalStream_.onDataRead(new SafeByteArray("stream:stream xmlns:stream='http://etherx.jabber.org/streams'><presence/>"));
+
+ assertEquals(1, elementsReceived_);
+ }
+
+ @Test
+ public void testReadData_TwoIntermediateStreamStack() {
+ StreamStack testling = new StreamStack(xmppStream_, physicalStream_);
+ xmppStream_.onElement.connect(new Slot1<Element>() {
+ @Override
+ public void call(Element e1) {
+ handleElement(e1);
+ }
+ });
+ MyStreamLayer xStream = new MyStreamLayer("s");
+ MyStreamLayer yStream = new MyStreamLayer("<");
+ testling.addLayer(xStream);
+ testling.addLayer(yStream);
+
+ physicalStream_.onDataRead(new SafeByteArray("tream:stream xmlns:stream='http://etherx.jabber.org/streams'><presence/>"));
+
+ assertEquals(1, elementsReceived_);
+ }
+
+ @Test
+ public void testAddLayer_ExistingOnWriteDataSlot() {
+ StreamStack testling = new StreamStack(xmppStream_, physicalStream_);
+ xmppStream_.onWriteData.connect(new Slot1<SafeByteArray>() {
+ @Override
+ public void call(SafeByteArray b1) {
+ handleWriteData(b1);
+ }
+ });
+ MyStreamLayer xStream = new MyStreamLayer("X");
+ testling.addLayer(xStream);
+
+ xmppStream_.writeData("foo");
+
+ assertEquals(1, dataWriteReceived_);
+ }
+} \ No newline at end of file