diff --git a/test/org/jivesoftware/smack/PacketReaderTest.java b/test/org/jivesoftware/smack/PacketReaderTest.java index 3fb8a759c..2652bf040 100644 --- a/test/org/jivesoftware/smack/PacketReaderTest.java +++ b/test/org/jivesoftware/smack/PacketReaderTest.java @@ -1,60 +1,61 @@ /** -* $RCSfile$ -* $Revision$ -* $Date$ -* -* Copyright (C) 2002-2003 Jive Software. All rights reserved. -* ==================================================================== -* The Jive Software License (based on Apache Software License, Version 1.1) -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* -* 1. Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* -* 2. Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* -* 3. The end-user documentation included with the redistribution, -* if any, must include the following acknowledgment: -* "This product includes software developed by -* Jive Software (http://www.jivesoftware.com)." -* Alternately, this acknowledgment may appear in the software itself, -* if and wherever such third-party acknowledgments normally appear. -* -* 4. The names "Smack" and "Jive Software" must not be used to -* endorse or promote products derived from this software without -* prior written permission. For written permission, please -* contact webmaster@jivesoftware.com. -* -* 5. Products derived from this software may not be called "Smack", -* nor may "Smack" appear in their name, without prior written -* permission of Jive Software. -* -* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED -* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL JIVE SOFTWARE OR -* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -* SUCH DAMAGE. -* ==================================================================== -*/ + * $RCSfile$ + * $Revision$ + * $Date$ + * + * Copyright (C) 2002-2003 Jive Software. All rights reserved. + * ==================================================================== + * The Jive Software License (based on Apache Software License, Version 1.1) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by + * Jive Software (http://www.jivesoftware.com)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Smack" and "Jive Software" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please + * contact webmaster@jivesoftware.com. + * + * 5. Products derived from this software may not be called "Smack", + * nor may "Smack" appear in their name, without prior written + * permission of Jive Software. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL JIVE SOFTWARE OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + */ package org.jivesoftware.smack; import org.jivesoftware.smack.filter.FromMatchesFilter; import org.jivesoftware.smack.filter.PacketIDFilter; import org.jivesoftware.smack.filter.PacketTypeFilter; +import org.jivesoftware.smack.filter.PacketFilter; import org.jivesoftware.smack.packet.*; import org.jivesoftware.smack.test.SmackTestCase; @@ -63,14 +64,42 @@ import java.util.Date; public class PacketReaderTest extends SmackTestCase { + private int counter; + + private final Object mutex = new Object(); + /** * Constructor for PacketReaderTest. + * * @param arg0 */ public PacketReaderTest(String arg0) { super(arg0); + resetCounter(); } + // Counter management + + private void resetCounter() { + synchronized (mutex) { + counter = 0; + } + } + + public void incCounter() { + synchronized (mutex) { + counter++; + } + } + + private int valCounter() { + int val; + synchronized (mutex) { + val = counter; + } + return val; + } + /** * Verify that when Smack receives a "not implemented IQ" answers with an IQ packet * with error code 501. @@ -91,7 +120,7 @@ public class PacketReaderTest extends SmackTestCase { PacketCollector collector = getConnection(0).createPacketCollector( new PacketIDFilter(iqPacket.getPacketID())); getConnection(0).sendPacket(iqPacket); - IQ response = (IQ)collector.nextResult(SmackConfiguration.getPacketReplyTimeout()); + IQ response = (IQ) collector.nextResult(SmackConfiguration.getPacketReplyTimeout()); if (response == null) { fail("No response from the other user."); } @@ -104,23 +133,29 @@ public class PacketReaderTest extends SmackTestCase { * Tests that PacketReader adds new listeners and also removes them correctly. */ public void testRemoveListener() { - PacketListener listener = new PacketListener() { - public void processPacket(Packet packet) { - //Ignore - } - }; - // Keep number of current listeners - int listenersSize = getConnection(0).packetReader.listeners.size(); - // Add a new listener - getConnection(0).addPacketListener(listener, new MockPacketFilter(true)); - // Check that the listener was added - assertEquals("Listener was not added", listenersSize + 1, - getConnection(0).packetReader.listeners.size()); - // Remove the listener - getConnection(0).removePacketListener(listener); - // Check that the number of listeners is correct (i.e. the listener was removed) - assertEquals("Listener was not removed", listenersSize, - getConnection(0).packetReader.listeners.size()); + + PacketListener listener = new PacketListener() { + public void processPacket(Packet packet) { + // Do nothing + } + }; + // Keep number of current listeners + int listenersSize = getConnection(0).packetReader.listeners.size(); + // Add a new listener + getConnection(0).addPacketListener(listener, new MockPacketFilter(true)); + // Check that the listener was added + assertEquals("Listener was not added", listenersSize + 1, + getConnection(0).packetReader.listeners.size()); + + Message msg = new Message(getConnection(0).getUser(), Message.Type.normal); + + getConnection(1).sendPacket(msg); + + // Remove the listener + getConnection(0).removePacketListener(listener); + // Check that the number of listeners is correct (i.e. the listener was removed) + assertEquals("Listener was not removed", listenersSize, + getConnection(0).packetReader.listeners.size()); } /** @@ -164,6 +199,69 @@ public class PacketReaderTest extends SmackTestCase { assertNotNull("No message was received", collector.nextResult(1000)); } + /** + * Tests that PacketReader adds new listeners and also removes them correctly. + */ + public void testFiltersRemotion() { + + resetCounter(); + + int repeat=10; + + for (int j = 0; j < repeat; j++) { + + PacketListener listener = new PacketListener() { + public void processPacket(Packet packet) { + System.out.println("Packet Captured"); + incCounter(); + } + }; + PacketFilter pf = new PacketFilter() { + public boolean accept(Packet packet) { + System.out.println("Packet Filtered"); + incCounter(); + return true; + } + }; + + getConnection(0).addPacketListener(listener,pf); + // Check that the listener was added + + Message msg = new Message(getConnection(0).getUser(), Message.Type.normal); + + getConnection(1).sendPacket(msg); + + try { + Thread.sleep(100); + } + catch (InterruptedException e) { + e.printStackTrace(); + } + + // Remove the listener + getConnection(0).removePacketListener(listener); + + try { + Thread.sleep(200); + } + catch (InterruptedException e) { + e.printStackTrace(); + } + + for (int i = 0; i < 10; i++) + getConnection(1).sendPacket(msg); + + try { + Thread.sleep(100); + } + catch (InterruptedException e) { + e.printStackTrace(); + } + } + System.out.println(valCounter()); + assertEquals(valCounter(),repeat*2); + } + protected int getMaxConnections() { return 2; }