diff --git a/test/org/jivesoftware/smack/PresencePriorityTest.java b/test/org/jivesoftware/smack/PresencePriorityTest.java new file mode 100644 index 000000000..1c528ea19 --- /dev/null +++ b/test/org/jivesoftware/smack/PresencePriorityTest.java @@ -0,0 +1,88 @@ +/** + * $RCSfile$ + * $Revision$ + * $Date$ + * + * Copyright (C) 2004 Jive Software. All rights reserved. + * + * This software is published under the terms of the GNU Public License (GPL), + * a copy of which is included in this distribution. + */ + +package org.jivesoftware.smack; + +import org.jivesoftware.smack.test.SmackTestCase; +import org.jivesoftware.smack.packet.Presence; + +/** + * Ensure that the server is delivering messages to the correct client based on the client's + * presence priority. + * + * @author Gaston Dombiak + */ +public class PresencePriorityTest extends SmackTestCase { + + public PresencePriorityTest(String arg0) { + super(arg0); + } + + /** + * Connection(0) will send messages to the bareJID of Connection(1) where the user of + * Connection(1) has logged from two different places with different presence priorities. + */ + public void testMessageToHighestPriority() { + boolean wasFiltering = Chat.isFilteredOnThreadID(); + Chat.setFilteredOnThreadID(false); + XMPPConnection conn = null; + try { + // User_1 will log in again using another resource + conn = new XMPPConnection(getHost(), getPort()); + conn.login(getUsername(1), getUsername(1), "OtherPlace"); + // Change the presence priorities of User_1 + getConnection(1).sendPacket(new Presence(Presence.Type.AVAILABLE, null, 1, + Presence.Mode.AVAILABLE)); + conn.sendPacket(new Presence(Presence.Type.AVAILABLE, null, 2, + Presence.Mode.AVAILABLE)); + // Create the chats between the participants + Chat chat0 = new Chat(getConnection(0), getBareJID(1)); + Chat chat1 = new Chat(getConnection(1), getBareJID(0)); + Chat chat2 = new Chat(conn, getBareJID(0)); + + // Test delivery of message to the presence with highest priority + chat0.sendMessage("Hello"); + assertNotNull("Resource with highest priority didn't receive the message", + chat2.nextMessage(2000)); + assertNull("Resource with lowest priority received the message", + chat1.nextMessage(1000)); + + // Invert the presence priorities of User_1 + getConnection(1).sendPacket(new Presence(Presence.Type.AVAILABLE, null, 2, + Presence.Mode.AVAILABLE)); + conn.sendPacket(new Presence(Presence.Type.AVAILABLE, null, 1, + Presence.Mode.AVAILABLE)); + + // Test delivery of message to the presence with highest priority + chat0.sendMessage("Hello"); + assertNotNull("Resource with highest priority didn't receive the message", + chat1.nextMessage(2000)); + assertNull("Resource with lowest priority received the message", + chat2.nextMessage(1000)); + + } + catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + finally { + // Restore the previous filtering value so we don't affect other test cases + Chat.setFilteredOnThreadID(wasFiltering); + if (conn != null) { + conn.close(); + } + } + } + + protected int getMaxConnections() { + return 2; + } +}