/*
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
*
* Copyright @ 2015 Atlassian Pty Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.java.sip.communicator.slick.protocol.jabber;
import java.util.*;
import junit.framework.*;
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.service.protocol.event.*;
import net.java.sip.communicator.util.*;
/**
* Creates a chat room on the server, then tries to make both users join the
* chatroom. Users would then exchange messages and perform a number of chat
* room operations.
*
* @author Emil Ivov
*/
public class TestOperationSetMultiUserChat
extends TestCase
{
private static final Logger logger
= Logger.getLogger(TestOperationSetMultiUserChat.class);
private JabberSlickFixture fixture = new JabberSlickFixture();
private OperationSetPresence opSetPresence1 = null;
private OperationSetPresence opSetPresence2 = null;
private OperationSetMultiUserChat opSetMultiChat1 = null;
private OperationSetMultiUserChat opSetMultiChat2 = null;
/**
* Creates the test with the specified method name.
* @param name the name of the method to execute.
*/
public TestOperationSetMultiUserChat(String name)
{
super(name);
}
/**
* Creates a test suite containing tests of this class in a specific order.
* We'll first execute a test where we receive a typing notification, and
* a volatile contact is created for the sender. we'll then be able to
* retrieve this volatile contact and them a notification 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();
//make sure tests are executed in the right order as we need to first
//create and join the room before actually being able to send and/or
//receive messages and participant events.
suite.addTest(
new TestOperationSetMultiUserChat("testCreateChatRoom"));
suite.addTest(
new TestOperationSetMultiUserChat("testGetExistingChatRooms"));
suite.addTest(
new TestOperationSetMultiUserChat("testFindRoom"));
suite.addTest(
new TestOperationSetMultiUserChat("testOurJoin"));
suite.addTest(
new TestOperationSetMultiUserChat("testGetMembersAfterJoin"));
suite.addTest(
new TestOperationSetMultiUserChat("testParticipantJoin"));
suite.addTest(
new TestOperationSetMultiUserChat("testSendAndReceiveMessages"));
suite.addTest(
new TestOperationSetMultiUserChat("testParticipantLeave"));
suite.addTest(
new TestOperationSetMultiUserChat(
"testGetMembersAfterParticipantLeave"));
suite.addTest(
new TestOperationSetMultiUserChat("testOurLeave"));
return suite;
}
/**
* JUnit setup method.
* @throws Exception in case anything goes wrong.
*/
@Override
protected void setUp() throws Exception
{
super.setUp();
fixture.setUp();
Map<String, OperationSet> 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.
opSetMultiChat1 =
(OperationSetMultiUserChat)supportedOperationSets1.get(
OperationSetMultiUserChat.class.getName());
if (opSetMultiChat1 == null)
{
throw new NullPointerException(
"No implementation for multi user chat 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<String, OperationSet> 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.
opSetMultiChat2 =
(OperationSetMultiUserChat)supportedOperationSets2.get(
OperationSetMultiUserChat.class.getName());
if (opSetMultiChat2 == null)
{
throw new NullPointerException(
"No implementation for multi user chat 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");
}
}
/**
* JUnit teardown method.
*
* @throws Exception in case anything goes wrong.
*/
@Override
protected void tearDown() throws Exception
{
super.tearDown();
fixture.tearDown();
}
/**
* Creates a chat room and verifies that it has been properly created.
*
* @throws Exception if any Exception is thrown during the test.
*/
public void testCreateChatRoom()
throws Exception
{
//create room
ChatRoom testChatRoom = opSetMultiChat1
.createChatRoom(fixture.chatRoomName, null);
//get available rooms
assertNotNull("createChatRoom() returned null", testChatRoom);
assertEquals("The name of the chat room that was "
+"created did not match the name that we wanted to have"
, fixture.chatRoomName, testChatRoom.getName());
assertSame(
"The newly created chat room did not had a properly set provider."
, fixture.provider1
, testChatRoom.getParentProvider());
}
/**
* Retrieves existing chat room from the protocol provider and makes sure
* that the room we created in previous tests is in there.
*
* @throws Exception if an exception is thrown while retrieving existing
* chat rooms.
*/
public void testGetExistingChatRooms()
throws Exception
{
List<String> existingChatRooms = opSetMultiChat1.getExistingChatRooms();
assertTrue (
"No chat rooms found on the server, even after we "
+"have created one. "
, existingChatRooms.size() > 0);
logger.info("Server returned the following list of chat rooms: "
+ existingChatRooms);
boolean testRoomFound = false;
for (String roomName : existingChatRooms)
if (roomName.equals(fixture.chatRoomName))
testRoomFound = true;
assertTrue("The room we created in previous tests "
+fixture.chatRoomName
+" was not among the existing rooms list returned by "
+"the provider."
, testRoomFound);
}
/**
* Tries to find the test room we created previously and makes sure it looks
* as expected.
* @throws Exception if we fail finding the chat room.
*/
public void testFindRoom()
throws Exception
{
ChatRoom testChatRoom = opSetMultiChat1.findRoom(fixture.chatRoomName);
assertNotNull("Could not find the test chat room on the server"
, testChatRoom);
String roomName = testChatRoom.getName();
assertEquals("Name of the test chat room did not match the name of the "
+"room we created"
, fixture.chatRoomName, roomName);
}
/**
* Join the chat room and verify that we are among its members
* @throws Exception
*/
public void testOurJoin()
throws Exception
{
ChatRoom testChatRoom1
= opSetMultiChat1.findRoom(fixture.chatRoomName);
// testChatRoom1.addParticipantStatusListener();
testChatRoom1.join();
/** @todo add event handlers for us joining the room for our status */
testChatRoom1.getParentProvider();
testChatRoom1.getUserNickname();
testChatRoom1.isJoined();
}
public void testGetMembersAfterJoin()
{
//member count > 0
//are we among the members?
}
public void testParticipantJoin()
throws Exception
{
/** @todo join provider 2 */
/** @todo make sure there was an event delivered to provider 1 saying
* that provider 2 has joined. */
}
public void testSendAndReceiveMessages()
throws Exception
{
ChatRoom testChatRoom = opSetMultiChat1.findRoom(fixture.chatRoomName);
testChatRoom.sendMessage(testChatRoom.createMessage("opla"));
/** @todo make sure there is a message at BOTH provider 1 & 2 saying
* that the message was delivered */
/** @todo make sure there is a message at BOTH provider 1 & 2 saying
* that the message was delivered */
}
public void testParticipantLeave()
{
}
public void testGetMembersAfterParticipantLeave()
{
//are we not among the members?
}
public void testOurLeave()
{
//are we not among the members?
}
private class ParticipantStatusEventCollector
implements ChatRoomMemberPresenceListener
{
/**
* Stores the received event and notifies all waiting on this object
*
* @param event the event containing the source call.
*/
public void memberPresenceChanged(
ChatRoomMemberPresenceChangeEvent evt)
{
// synchronized(this)
// {
// logger.debug(
// "Collected evt("+collectedEvents.size()+")= "+event);
//
// if(((CallState)event.getNewValue()).equals(awaitedState))
// {
// this.collectedEvents.add(event);
// notifyAll();
// }
// }
}
}
}