diff options
-rw-r--r-- | test/net/java/sip/communicator/slick/protocol/gibberish/TestOperationSetBasicInstantMessaging.java | 479 |
1 files changed, 479 insertions, 0 deletions
diff --git a/test/net/java/sip/communicator/slick/protocol/gibberish/TestOperationSetBasicInstantMessaging.java b/test/net/java/sip/communicator/slick/protocol/gibberish/TestOperationSetBasicInstantMessaging.java new file mode 100644 index 0000000..5323000 --- /dev/null +++ b/test/net/java/sip/communicator/slick/protocol/gibberish/TestOperationSetBasicInstantMessaging.java @@ -0,0 +1,479 @@ +/* + * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +package net.java.sip.communicator.slick.protocol.gibberish; + +import java.net.*; +import java.util.*; + +import junit.framework.*; +import net.java.sip.communicator.service.protocol.*; +import net.java.sip.communicator.service.protocol.Message; +import net.java.sip.communicator.service.protocol.event.*; +import net.java.sip.communicator.util.*; + +/** + * Performs testing of the basic instant messaging operation set. Tests include + * going over basic functionality such as sending a message from the tested + * implementation and asserting reception by the tester agent and vice versa. + * + * @author Emil Ivov + */ +public class TestOperationSetBasicInstantMessaging + extends TestCase +{ + private static final Logger logger = + Logger.getLogger(TestOperationSetBasicInstantMessaging.class); + + private GibberishSlickFixture fixture = new GibberishSlickFixture(); + + private OperationSetBasicInstantMessaging opSetBasicIM1 = null; + private OperationSetBasicInstantMessaging opSetBasicIM2 = null; + + private OperationSetPresence opSetPresence1 = null; + private OperationSetPresence opSetPresence2 = null; + + public TestOperationSetBasicInstantMessaging(String name) + { + super(name); + } + + /** + * Get a reference to the basic IM operation set. + * @throws Exception if this is not a good day. + */ + protected void setUp() throws Exception + { + super.setUp(); + fixture.setUp(); + + Map supportedOperationSets1 = + fixture.provider1.getSupportedOperationSets(); + + if ( supportedOperationSets1 == null + || supportedOperationSets1.size() < 1) + throw new NullPointerException( + "No OperationSet implementations are supported by " + +"this implementation. "); + + //get the operation set presence here. + opSetBasicIM1 = + (OperationSetBasicInstantMessaging)supportedOperationSets1.get( + OperationSetBasicInstantMessaging.class.getName()); + + if (opSetBasicIM1 == null) + { + throw new NullPointerException( + "No implementation for basic IM was found"); + } + + //we also need the presence op set in order to retrieve contacts. + opSetPresence1 = + (OperationSetPresence)supportedOperationSets1.get( + OperationSetPresence.class.getName()); + + //if the op set is null show that we're not happy. + if (opSetPresence1 == null) + { + throw new NullPointerException( + "An implementation of the service must provide an " + + "implementation of at least one of the PresenceOperationSets"); + } + + Map supportedOperationSets2 = + fixture.provider2.getSupportedOperationSets(); + + if ( supportedOperationSets2 == null + || supportedOperationSets2.size() < 1) + throw new NullPointerException( + "No OperationSet implementations are supported by " + +"this implementation. "); + + //get the operation set presence here. + opSetBasicIM2 = + (OperationSetBasicInstantMessaging)supportedOperationSets2.get( + OperationSetBasicInstantMessaging.class.getName()); + + if (opSetBasicIM2 == null) + { + throw new NullPointerException( + "No implementation for basic IM was found"); + } + + opSetPresence2 = + (OperationSetPresence) supportedOperationSets2.get( + OperationSetPresence.class.getName()); + + //if the op set is null show that we're not happy. + if (opSetPresence2 == null) + { + throw new NullPointerException( + "An implementation of the service must provide an " + + "implementation of at least one of the PresenceOperationSets"); + } + + } + + protected void tearDown() throws Exception + { + super.tearDown(); + + fixture.tearDown(); + } + + /** + * Creates a test suite containing tests of this class in a specific order. + * We'll first execute tests beginning with the "test" prefix and then go to + * ordered tests.We first execture tests for receiving messagese, so that + * a volatile contact is created for the sender. we'll then be able to + * retrieve this volatile contact and send them a message on our turn. + * We need to do things this way as the contact corresponding to the tester + * agent has been removed in the previous test and we no longer have it + * in our contact list. + * + * @return Test a testsuite containing all tests to execute. + */ + public static Test suite() + { + TestSuite suite = new TestSuite(); + + suite.addTest(new TestOperationSetBasicInstantMessaging( + "prepareContactList")); + + suite.addTestSuite(TestOperationSetBasicInstantMessaging.class); + + //the following 2 need to be run in the specified order. + suite.addTest(new TestOperationSetBasicInstantMessaging( + "firstTestReceiveMessage")); + suite.addTest(new TestOperationSetBasicInstantMessaging( + "thenTestSendMessage")); + + return suite; + } + + /** + * Create the list to be sure that contacts exchanging messages + * exists in each other lists + * @throws Exception + */ + public void prepareContactList() + throws Exception + { + fixture.clearProvidersLists(); + + Object o = new Object(); + synchronized(o) + { + o.wait(2000); + } + + try + { + opSetPresence1.subscribe(fixture.userID2); + } + catch (OperationFailedException ex) + { + // the contact already exist its OK + } + + try + { + opSetPresence2.subscribe(fixture.userID1); + } + catch (OperationFailedException ex1) + { + // the contact already exist its OK + } + + synchronized(o) + { + o.wait(2000); + } + } + + /** + * Send an instant message from the tested operation set and assert + * reception by the tester agent. + */ + public void firstTestReceiveMessage() + { + String body = "This is an IM coming from the tester agent" + + " on " + new Date().toString(); + + ImEventCollector evtCollector = new ImEventCollector(); + + //add a msg listener and register to the op set and send an instant + //msg from the tester agent. + opSetBasicIM1.addMessageListener(evtCollector); + + Contact testerAgentContact + = opSetPresence2.findContactByID(fixture.userID1); + + logger.debug("Will send message " + body + " to: " + testerAgentContact); + + opSetBasicIM2.sendInstantMessage(testerAgentContact, + opSetBasicIM2.createMessage(body)); + + evtCollector.waitForEvent(10000); + + opSetBasicIM1.removeMessageListener(evtCollector); + + //assert reception of a message event + assertTrue( "No events delivered upon a received message" + , evtCollector.collectedEvents.size() > 0); + + //assert event instance of Message Received Evt + assertTrue( "Received evt was not an instance of " + + MessageReceivedEvent.class.getName() + , evtCollector.collectedEvents.get(0) + instanceof MessageReceivedEvent); + + //assert source contact == testAgent.uin + MessageReceivedEvent evt + = (MessageReceivedEvent)evtCollector.collectedEvents.get(0); + assertEquals("message sender " + , evt.getSourceContact().getAddress() + , fixture.userID2); + + //assert messageBody == body + assertEquals("message body", body, evt.getSourceMessage().getContent()); + } + + /** + * Send an instant message from the tester agent and assert reception by + * the tested implementation + */ + public void thenTestSendMessage() + { + logger.debug("Printing Server Stored list to see if message fails are contacts in each other lists"); + ContactGroup rootGroup1 + = ((OperationSetPersistentPresence)opSetPresence1). + getServerStoredContactListRoot(); + + logger.debug("=========== Server Stored Contact List 1 ================="); + + logger.debug("rootGroup="+rootGroup1.getGroupName() + +" rootGroup.childContacts="+rootGroup1.countContacts() + + "rootGroup.childGroups="+rootGroup1.countSubgroups() + + "Printing rootGroupContents=\n"+rootGroup1.toString()); + + ContactGroup rootGroup2 + = ((OperationSetPersistentPresence)opSetPresence2). + getServerStoredContactListRoot(); + + logger.debug("=========== Server Stored Contact List 2 ================="); + + logger.debug("rootGroup="+rootGroup2.getGroupName() + +" rootGroup.childContacts="+rootGroup2.countContacts() + + "rootGroup.childGroups="+rootGroup2.countSubgroups() + + "Printing rootGroupContents=\n"+rootGroup2.toString()); + + String body = "This is an IM coming from the tested implementation" + + " on " + new Date().toString(); + + //create the message + net.java.sip.communicator.service.protocol.Message msg + = opSetBasicIM1.createMessage(body); + + //register a listener in the op set + ImEventCollector imEvtCollector1 = new ImEventCollector(); + opSetBasicIM1.addMessageListener(imEvtCollector1); + + //register a listener in the tester agent + ImEventCollector imEvtCollector2 = new ImEventCollector(); + opSetBasicIM2.addMessageListener(imEvtCollector2); + + Contact testerAgentContact + = opSetPresence1.findContactByID(fixture.userID2); + + opSetBasicIM1.sendInstantMessage(testerAgentContact, msg); + + imEvtCollector1.waitForEvent(10000); + imEvtCollector2.waitForEvent(10000); + + opSetBasicIM1.removeMessageListener(imEvtCollector1); + opSetBasicIM2.removeMessageListener(imEvtCollector2); + + //verify that the message delivered event was dispatched + assertTrue( "No events delivered when sending a message" + , imEvtCollector1.collectedEvents.size() > 0); + + assertTrue( "Received evt was not an instance of " + + MessageDeliveredEvent.class.getName() + , imEvtCollector1.collectedEvents.get(0) + instanceof MessageDeliveredEvent); + + MessageDeliveredEvent evt + = (MessageDeliveredEvent)imEvtCollector1.collectedEvents.get(0); + assertEquals("message destination " + , evt.getDestinationContact().getAddress() + , fixture.userID2); + + assertSame("source message", msg, evt.getSourceMessage()); + + + //verify that the message has successfully arived at the destination + assertTrue( "No messages received by the tester agent" + , imEvtCollector2.collectedEvents.size() > 0); + + assertFalse( "Message was unable to deliver !", + imEvtCollector2.collectedEvents.get(0) + instanceof MessageDeliveryFailedEvent); + + String receivedBody = + ((MessageReceivedEvent)imEvtCollector2.collectedEvents + .get(0)).getSourceMessage().getContent(); + + assertEquals("received message body", msg.getContent(), receivedBody); + } + + /** + * Creates an Message through the simple createMessage() method and inspects + * its parameters. + */ + public void testCreateMessage1() + { + String body = "This is an IM coming from the tested implementation" + + " on " + new Date().toString(); + net.java.sip.communicator.service.protocol.Message msg + = opSetBasicIM1.createMessage(body); + + assertEquals("message body", body, msg.getContent()); + assertTrue("message body bytes" + , Arrays.equals(body.getBytes(), msg.getRawData())); + assertEquals("message length", body.length(), msg.getSize()); + assertEquals("message content type" + , OperationSetBasicInstantMessaging.DEFAULT_MIME_TYPE + , msg.getContentType()); + + assertEquals("message encoding" + , OperationSetBasicInstantMessaging.DEFAULT_MIME_ENCODING + , msg.getEncoding()); + + assertNotNull("message uid", msg.getMessageUID()); + + //a further test on message uid. + net.java.sip.communicator.service.protocol.Message msg2 + = opSetBasicIM1.createMessage(body); + assertFalse("message uid", msg.getMessageUID().equals( + msg2.getMessageUID())); + } + + /** + * Creates an Message through the advance createMessage() method and + * inspects its parameters. + */ + public void testCreateMessage2() + { + String body = "This is an IM coming from the tested implementation" + + " on " + new Date().toString(); + String contentType = "text/html"; + String encoding = "UTF-16"; + String subject = "test message"; + net.java.sip.communicator.service.protocol.Message msg + = opSetBasicIM1.createMessage( + body.getBytes(), contentType, encoding, subject); + + assertEquals("message body", body, msg.getContent()); + assertTrue("message body bytes" + , Arrays.equals(body.getBytes(), msg.getRawData())); + assertEquals("message length", body.length(), msg.getSize()); + assertEquals("message content type", contentType, msg.getContentType()); + assertEquals("message encoding", encoding, msg.getEncoding()); + assertNotNull("message uid", msg.getMessageUID()); + + //a further test on message uid. + net.java.sip.communicator.service.protocol.Message msg2 + = opSetBasicIM1.createMessage(body); + assertFalse("message uid", msg.getMessageUID().equals( + msg2.getMessageUID())); + } + + /** + * Collects instant messaging events. + */ + private class ImEventCollector implements MessageListener + { + private List collectedEvents = new LinkedList(); + /** + * Called when a new incoming <tt>Message</tt> has been received. + * @param evt the <tt>MessageReceivedEvent</tt> containing the newly + * received message, its sender and other details. + */ + public void messageReceived(MessageReceivedEvent evt) + { + logger.debug("Received a MessageReceivedEvent: " + evt); + + synchronized(this) + { + collectedEvents.add(evt); + notifyAll(); + } + } + + /** + * Called to indicated that delivery of a message sent earlier has failed. + * Reason code and phrase are contained by the <tt>MessageFailedEvent</tt> + * @param evt the <tt>MessageFailedEvent</tt> containing the ID of the + * message whose delivery has failed. + */ + public void messageDeliveryFailed(MessageDeliveryFailedEvent evt) + { + logger.debug("Received a MessageDeliveryFailedEvent: " + evt); + + synchronized(this) + { + collectedEvents.add(evt); + notifyAll(); + } + } + + + /** + * Called when the underlying implementation has received an indication + * that a message, sent earlier has been successfully received by the + * destination. + * @param evt the MessageDeliveredEvent containing the id of the message + * that has caused the event. + */ + public void messageDelivered(MessageDeliveredEvent evt) + { + logger.debug("Received a MessageDeliveredEvent: " + evt); + + synchronized(this) + { + collectedEvents.add(evt); + notifyAll(); + } + } + + /** + * Blocks until at least one event is received or until waitFor + * miliseconds pass (whichever happens first). + * + * @param waitFor the number of miliseconds that we should be waiting + * for an event before simply bailing out. + */ + public void waitForEvent(long waitFor) + { + synchronized(this) + { + + if(collectedEvents.size() > 0) + return; + + try{ + wait(waitFor); + } + catch (InterruptedException ex) + { + logger.debug( + "Interrupted while waiting for a message evt", ex); + } + } + } + } +} |