/*
* 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 org.osgi.framework.*;
/**
* Contains fields and methods used by most or all tests in the Jabber slick.
*
* @author Damian Minkov
* @author Valentin Martinet
*/
public class JabberSlickFixture
extends TestCase
{
/**
* To be set by the slick itself upon activation.
*/
public static BundleContext bc = null;
/**
* An osgi service reference for the protocol provider corresponding to our
* first testing account.
*/
public ServiceReference provider1ServiceRef = null;
/**
* The protocol provider corresponding to our first testing account.
*/
public ProtocolProviderService provider1 = null;
/**
* The user ID associated with testing account 1.
*/
public String userID1 = null;
/**
* An osgi service reference for the protocol provider corresponding to our
* second testing account.
*/
public ServiceReference provider2ServiceRef = null;
/**
* The protocol provider corresponding to our first testing account.
*/
public ProtocolProviderService provider2 = null;
/**
* The user ID associated with testing account 2.
*/
public String userID2 = null;
/**
* An osgi service reference for the protocol provider corresponding to our
* third testing account.
*/
public ServiceReference provider3ServiceRef = null;
/**
* The protocol provider corresponding to our third testing account.
*/
public ProtocolProviderService provider3 = null;
/**
* The user ID associated with testing account 3.
*/
public String userID3 = null;
/**
* The name of the chat room that we are using for testing of multi user
* chatting.
*/
public String chatRoomName = null;
/**
* The tested protocol provider factory.
*/
public ProtocolProviderFactory providerFactory = null;
/**
* A reference to the bundle containing the tested pp implementation. This
* reference is set during the accoung uninstallation testing and used during
* the account uninstallation persistence testing.
*/
public static Bundle providerBundle = null;
/**
* Indicates whether the user has requested for onlline tests not to be run.
* (e.g. due to lack of network connectivity or ... time constraints ;)).
*/
public static boolean onlineTestingDisabled = false;
/**
* A Hashtable containing group names mapped against array lists of buddy
* screen names. This is a snapshot of the server stored buddy list for
* the account that is going to be used by the tested implementation.
* It is filled in by the tester agent who'd login with that account
* and initialize the ss contact list before the tested implementation has
* actually done so.
*/
public static Hashtable<String, List<String>> preInstalledBuddyList = null;
/**
* Initializes protocol provider references and whatever else there is to
* initialize.
*
* @throws java.lang.Exception in case we meet problems while retrieving
* protocol providers through OSGI
*/
@Override
public void setUp()
throws Exception
{
// first obtain a reference to the provider factory
ServiceReference[] serRefs = null;
String osgiFilter = "(" + ProtocolProviderFactory.PROTOCOL
+ "="+ProtocolNames.JABBER+")";
try{
serRefs = bc.getServiceReferences(
ProtocolProviderFactory.class.getName(), osgiFilter);
}
catch (InvalidSyntaxException ex){
//this really shouldhn't occur as the filter expression is static.
fail(osgiFilter + " is not a valid osgi filter");
}
assertTrue(
"Failed to find a provider factory service for protocol Jabber",
(serRefs != null) && (serRefs.length > 0));
//Keep the reference for later usage.
providerFactory = (ProtocolProviderFactory)bc.getService(serRefs[0]);
userID1
= System.getProperty(
JabberProtocolProviderServiceLick.ACCOUNT_1_PREFIX
+ ProtocolProviderFactory.USER_ID);
userID2
= System.getProperty(
JabberProtocolProviderServiceLick.ACCOUNT_2_PREFIX
+ ProtocolProviderFactory.USER_ID);
userID3
= System.getProperty(
JabberProtocolProviderServiceLick.ACCOUNT_3_PREFIX
+ ProtocolProviderFactory.USER_ID);
chatRoomName
= System.getProperty(
JabberProtocolProviderServiceLick.CHAT_ROOM_NAME);
//find the protocol providers exported for the three accounts
ServiceReference[] jabberProvider1Refs
= bc.getServiceReferences(
ProtocolProviderService.class.getName(),
"(&"
+"("+ProtocolProviderFactory.PROTOCOL+"="+ProtocolNames.JABBER+")"
+"("+ProtocolProviderFactory.USER_ID+"="
+ userID1 +")"
+")");
//make sure we found a service
assertNotNull("No Protocol Provider was found for Jabber account1:"
+ userID1, jabberProvider1Refs);
assertTrue("No Protocol Provider was found for Jabber account1:"+
userID1, jabberProvider1Refs.length > 0);
ServiceReference[] jabberProvider2Refs
= bc.getServiceReferences(
ProtocolProviderService.class.getName(),
"(&"
+"("+ProtocolProviderFactory.PROTOCOL+"="+ProtocolNames.JABBER+")"
+"("+ProtocolProviderFactory.USER_ID+"="
+ userID2 +")"
+")");
//again make sure we found a service.
assertNotNull("No Protocol Provider was found for Jabber account2:"
+ userID2, jabberProvider2Refs);
assertTrue("No Protocol Provider was found for Jabber account2:"+
userID2, jabberProvider2Refs.length > 0);
ServiceReference[] jabberProvider3Refs
= bc.getServiceReferences(
ProtocolProviderService.class.getName(),
"(&"
+"("+ProtocolProviderFactory.PROTOCOL+"="+ProtocolNames.JABBER+")"
+"("+ProtocolProviderFactory.USER_ID+"="
+ userID3 +")"
+")");
//again make sure we found a service.
assertNotNull("No Protocol Provider was found for Jabber account3:"
+ userID3, jabberProvider3Refs);
assertTrue("No Protocol Provider was found for Jabber account3:"+
userID3, jabberProvider3Refs.length > 0);
//save the service for other tests to use.
provider1ServiceRef = jabberProvider1Refs[0];
provider1 = (ProtocolProviderService)bc.getService(provider1ServiceRef);
provider2ServiceRef = jabberProvider2Refs[0];
provider2 = (ProtocolProviderService)bc.getService(provider2ServiceRef);
provider3ServiceRef = jabberProvider3Refs[0];
provider3 = (ProtocolProviderService)bc.getService(provider3ServiceRef);
}
/**
* Un get service references used in here.
*/
@Override
public void tearDown()
{
bc.ungetService(provider1ServiceRef);
bc.ungetService(provider2ServiceRef);
bc.ungetService(provider3ServiceRef);
}
/**
* Returns the bundle that has registered the protocol provider service
* implementation that we're currently testing. The method would go through
* all bundles currently installed in the framework and return the first
* one that exports the same protocol provider instance as the one we test
* in this slick.
* @param provider the provider whose bundle we're looking for.
* @return the Bundle that has registered the protocol provider service
* we're testing in the slick.
*/
public Bundle findProtocolProviderBundle(
ProtocolProviderService provider)
{
Bundle[] bundles = bc.getBundles();
for (int i = 0; i < bundles.length; i++)
{
ServiceReference[] registeredServices
= bundles[i].getRegisteredServices();
if (registeredServices == null)
continue;
for (int j = 0; j < registeredServices.length; j++)
{
Object service
= bc.getService(registeredServices[j]);
if (service == provider)
return bundles[i];
}
}
return null;
}
/**
* Clears all the providers of this fixture.
*
* @throws Exception
*/
public void clearProvidersLists()
throws Exception
{
clearProvider(provider1);
clearProvider(provider2);
clearProvider(provider3);
}
/**
* Clears the given <tt>provider</tt>. It means delete existing contacts,
* existing groups.
*
* @param provider
* @throws IllegalArgumentException
* @throws IllegalStateException
* @throws OperationFailedException
*/
public void clearProvider(ProtocolProviderService provider)
throws IllegalArgumentException,
IllegalStateException,
OperationFailedException
{
Map<String, OperationSet> supportedOperationSets =
provider.getSupportedOperationSets();
if ( supportedOperationSets == null
|| supportedOperationSets.size() < 1)
throw new NullPointerException(
"No OperationSet implementations are supported by "
+"this Jabber implementation. ");
//get the operation set presence here.
OperationSetPersistentPresence opSetPersPresence =
(OperationSetPersistentPresence) supportedOperationSets.get(
OperationSetPersistentPresence.class.getName());
//if still null then the implementation doesn't offer a presence
//operation set which is unacceptable for jabber.
if (opSetPersPresence == null)
throw new NullPointerException(
"An implementation of the Jabber service must provide an "
+ "implementation of at least the one of the Presence "
+ "Operation Sets");
deleteGroups(opSetPersPresence);
}
/**
* Delete all groups and contacts for the given persistent presence op. set.
*
* @param opSetPersPresence
* @throws IllegalArgumentException
* @throws IllegalStateException
* @throws OperationFailedException
*/
public void deleteGroups(OperationSetPersistentPresence opSetPersPresence)
throws IllegalArgumentException,
IllegalStateException,
OperationFailedException
{
ContactGroup rootGroup =
opSetPersPresence.getServerStoredContactListRoot();
// first delete the groups
Vector<ContactGroup> groupsToRemove = new Vector<ContactGroup>();
Iterator<ContactGroup> iter = rootGroup.subgroups();
while (iter.hasNext())
{
groupsToRemove.add(iter.next());
}
iter = groupsToRemove.iterator();
while (iter.hasNext())
{
ContactGroup item = iter.next();
opSetPersPresence.removeServerStoredContactGroup(item);
}
//then delete contacts if any in root list
Vector<Contact> contactsToRemove = new Vector<Contact>();
Iterator<Contact> iter2 = rootGroup.contacts();
while (iter2.hasNext())
{
contactsToRemove.add(iter2.next());
}
iter2 = contactsToRemove.iterator();
while (iter2.hasNext())
{
opSetPersPresence.unsubscribe(iter2.next());
}
}
}