/*
* 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.icq;
import java.util.*;
import junit.framework.*;
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.service.protocol.event.*;
import org.osgi.framework.*;
/**
* Provides utility code, such as locating and obtaining references towards
* base services that anyother service would need.
*
* @author Emil Ivov
*/
public class IcqSlickFixture extends TestCase
{
/**
* To be set by the slick itself upon activation.
*/
public static BundleContext bc = null;
/**
* The tested account id obtained during installation.
*/
public static AccountID icqAccountID = null;
/**
* The agent that we use to verify whether the tested implementation is
* being honest with us. The icq tester agent is instantiated and registered
* by the icq slick activator. If it is still null when a test is running,
* it means there was something seriously wrong with the test account
* properties file.
*/
static IcqTesterAgent testerAgent = null;
/**
* 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 icq account that is going to be used by the tested implementation.
* It is filled in by the icq tester agent who'd login with that account
* and initialise the ss contact list before the tested implementation has
* actually done so.
*/
public static Hashtable<String, List<String>> preInstalledBuddyList = null;
public ServiceReference icqServiceRef = null;
public ProtocolProviderService provider = null;
public ProtocolProviderFactory providerFactory = null;
public String ourUserID = null;
/**
* A reference to the bundle containing the tested pp implementation. This
* reference is set during the account uninstallation testing and used during
* the account uninstallation persistence testing.
*/
public static Bundle providerBundle = null;
public static OfflineMsgCollector offlineMsgCollector = 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;
@Override
public void setUp() throws Exception
{
// first obtain a reference to the provider factory
ServiceReference[] serRefs = null;
String osgiFilter = "(" + ProtocolProviderFactory.PROTOCOL
+ "="+ProtocolNames.ICQ+")";
try{
serRefs = IcqSlickFixture.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 ICQ",
(serRefs != null) && (serRefs.length > 0));
//Keep the reference for later usage.
providerFactory = (ProtocolProviderFactory)
IcqSlickFixture.bc.getService(serRefs[0]);
ourUserID =
System.getProperty(
IcqProtocolProviderSlick.TESTED_IMPL_USER_ID_PROP_NAME);
//find the protocol provider service
ServiceReference[] icqProviderRefs
= bc.getServiceReferences(
ProtocolProviderService.class.getName(),
"(&"
+"("+ProtocolProviderFactory.PROTOCOL+"="+ProtocolNames.ICQ+")"
+"("+ProtocolProviderFactory.USER_ID+"="
+ ourUserID +")"
+")");
//make sure we found a service
assertNotNull("No Protocol Provider was found for ICQ UIN:"+ ourUserID,
icqProviderRefs);
assertTrue("No Protocol Provider was found for ICQ UIN:"+ ourUserID,
icqProviderRefs.length > 0);
//save the service for other tests to use.
icqServiceRef = icqProviderRefs[0];
provider = (ProtocolProviderService)bc.getService(icqServiceRef);
}
@Override
public void tearDown()
{
bc.ungetService(icqServiceRef);
}
/**
* 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;
}
//used in Offline Message receive test
//this MessageReceiver is created in IcqProtocolProviderSlick
//registered as listener in TestProtocolProviderServiceIcqImpl
// as soon tested account has been registed
//There is only one offline message send. And this message is the first message
// received after the successful regitration, so this listener is removed
// after receiving one message. This message is tested in TestOperationSetBasicInstantMessaging
// whether it is the one that has been send
static class OfflineMsgCollector implements MessageListener
{
private String offlineMessageToBeDelivered = null;
private OperationSetBasicInstantMessaging imOper = null;
private Message receivedMessage = null;
public void messageReceived(MessageReceivedEvent evt)
{
receivedMessage = evt.getSourceMessage();
imOper.removeMessageListener(this);
}
public void messageDelivered(MessageDeliveredEvent evt)
{
}
public void messageDeliveryFailed(MessageDeliveryFailedEvent evt)
{
}
public void setMessageText(String txt)
{
this.offlineMessageToBeDelivered = txt;
}
public String getMessageText()
{
return offlineMessageToBeDelivered;
}
public void register(OperationSetBasicInstantMessaging imOper)
{
this.imOper = imOper;
imOper.addMessageListener(this);
}
public Message getReceivedMessage()
{
return receivedMessage;
}
}
}