/*
* 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.generic;
import java.util.*;
import junit.framework.*;
import net.java.sip.communicator.service.protocol.*;
import org.osgi.framework.*;
/**
* Generic Slick fixture for ad-hoc multi-user chat.
*
* @author Valentin Martinet
*/
public abstract class AdHocMultiUserChatSlickFixture 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 second 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 tested protocol provider factory.
*/
public ProtocolProviderFactory providerFactory = 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;
/**
* 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;
/**
* Constructor
*/
public AdHocMultiUserChatSlickFixture()
{
super();
}
/**
*
*
* @throws IllegalArgumentException
* @throws IllegalStateException
* @throws OperationFailedException
*/
public void clearProvidersLists()
throws IllegalArgumentException,
IllegalStateException,
OperationFailedException
{
Map<String, OperationSet> supportedOperationSets1 =
provider1.getSupportedOperationSets();
if ( supportedOperationSets1 == null
|| supportedOperationSets1.size() < 1)
throw new NullPointerException(
"No OperationSet implementations are supported by "
+"this msn implementation. ");
//get the operation set presence here.
OperationSetPersistentPresence opSetPersPresence1 =
(OperationSetPersistentPresence)supportedOperationSets1.get(
OperationSetPersistentPresence.class.getName());
//if still null then the implementation doesn't offer a presence
//operation set which is unacceptable for msn.
if (opSetPersPresence1 == null)
throw new NullPointerException(
"An implementation of the msn service must provide an "
+ "implementation of at least the one of the Presence "
+ "Operation Sets");
// lets do it once again for the second provider
Map<String, OperationSet> supportedOperationSets2 =
provider2.getSupportedOperationSets();
if (supportedOperationSets2 == null
|| supportedOperationSets2.size() < 1)
throw new NullPointerException(
"No OperationSet implementations are supported by "
+ "this msn implementation. ");
//get the operation set presence here.
OperationSetPersistentPresence opSetPersPresence2 =
(OperationSetPersistentPresence) supportedOperationSets2.get(
OperationSetPersistentPresence.class.getName());
//if still null then the implementation doesn't offer a presence
//operation set which is unacceptable for msn.
if (opSetPersPresence2 == null)
throw new NullPointerException(
"An implementation of the msn service must provide an "
+ "implementation of at least the one of the Presence "
+ "Operation Sets");
// lets do it once again for the third provider
Map<String, OperationSet> supportedOperationSets3 =
provider3.getSupportedOperationSets();
if (supportedOperationSets3 == null
|| supportedOperationSets3.size() < 1)
throw new NullPointerException(
"No OperationSet implementations are supported by "
+ "this msn implementation. ");
//get the operation set presence here.
OperationSetPersistentPresence opSetPersPresence3 =
(OperationSetPersistentPresence) supportedOperationSets3.get(
OperationSetPersistentPresence.class.getName());
//if still null then the implementation doesn't offer a presence
//operation set which is unacceptable for msn.
if (opSetPersPresence3 == null)
throw new NullPointerException(
"An implementation of the msn service must provide an "
+ "implementation of at least the one of the Presence "
+ "Operation Sets");
deleteGroups(opSetPersPresence1);
deleteGroups(opSetPersPresence2);
deleteGroups(opSetPersPresence3);
}
/**
* 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 static 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;
}
/**
* 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());
}
}
/**
* JUnit setUp
*/
@Override
public void setUp() throws Exception
{
super.setUp();
}
/**
* JUnit tearDown method.
* Unget service references used in here.
*/
@Override
public void tearDown() throws Exception
{
bc.ungetService(provider1ServiceRef);
bc.ungetService(provider2ServiceRef);
bc.ungetService(provider3ServiceRef);
}
}