package org.societies.platform.slm.container.test;
import java.util.concurrent.CountDownLatch;
import org.societies.android.api.css.manager.IServiceManager;
import org.societies.android.api.internal.servicelifecycle.IServiceDiscovery;
import org.societies.platform.slm.container.ServiceManagementTest;
import org.societies.platform.slm.container.ServiceManagementTest.LocalSLMBinder;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Parcelable;
import android.test.ServiceTestCase;
import android.test.suitebuilder.annotation.MediumTest;
import android.util.Log;
/**
* 1. Created identity must be deleted prior to test on XMPP server
* 2. Ensure that test data in test source matches XMPP server and Virgo details
*
*
*/
public class TestSLMmanager extends ServiceTestCase<ServiceManagementTest> {
private static final String LOG_TAG = TestSLMmanager.class.getName();
private static final String CLIENT = "org.societies.android.platform.slm.test";
private static final int DELAY = 10000;
private static final int TEST_END_DELAY = 2000;
private static final String TEST_IDENTITY = "john.societies.local";
private IServiceDiscovery serviceDisco;
private long testStartTime, testEndTime;
private CountDownLatch serviceDiscoConnected;
public TestSLMmanager() {
super(ServiceManagementTest.class);
}
protected void setUp() throws Exception {
super.setUp();
serviceDiscoConnected = new CountDownLatch(1);
Intent commsIntent = new Intent(getContext(), ServiceManagementTest.class);
LocalSLMBinder binder = (LocalSLMBinder) bindService(commsIntent);
assertNotNull(binder);
this.serviceDisco = (IServiceDiscovery) binder.getService();
this.serviceDisco.startService();
serviceDiscoConnected.await();
}
protected void tearDown() throws Exception {
Thread.sleep(TEST_END_DELAY);
//ensure that service is shutdown to test if service leakage occurs
shutdownService();
super.tearDown();
}
@MediumTest
public void testGetMyServices() throws Exception {
BroadcastReceiver receiver = this.setupBroadcastReceiver();
this.testStartTime = System.currentTimeMillis();
this.testEndTime = this.testStartTime;
Log.d(LOG_TAG, "testGetMyServices start time: " + this.testStartTime);
try {
this.serviceDisco.getMyServices(CLIENT);
} catch (Exception e) {
Log.d(LOG_TAG, "");
}
Thread.sleep(DELAY);
//ensure that the broadcast receiver is shutdown to prevent more than one active receiver
unregisterReceiver(receiver);
}
@MediumTest
public void testGetServices() throws Exception {
BroadcastReceiver receiver = this.setupBroadcastReceiver();
this.testStartTime = System.currentTimeMillis();
this.testEndTime = this.testStartTime;
Log.d(LOG_TAG, "testGetServices start time: " + this.testStartTime);
try {
this.serviceDisco.getServices(CLIENT, TEST_IDENTITY);
} catch (Exception e) {
Log.d(LOG_TAG, "");
}
Thread.sleep(DELAY);
//ensure that the broadcast receiver is shutdown to prevent more than one active receiver
unregisterReceiver(receiver);
}
/**
* Create a broadcast receiver
*
* @return the created broadcast receiver
*/
private BroadcastReceiver setupBroadcastReceiver() {
BroadcastReceiver receiver = null;
Log.d(LOG_TAG, "Set up Main broadcast receiver");
receiver = new MainReceiver();
getContext().registerReceiver(receiver, createTestIntentFilter());
Log.d(LOG_TAG, "Register Main broadcast receiver");
return receiver;
}
/**
* Unregister a broadcast receiver
* @param receiver
*/
private void unregisterReceiver(BroadcastReceiver receiver) {
Log.d(LOG_TAG, "Unregister broadcast receiver");
getContext().unregisterReceiver(receiver);
}
/**
* Broadcast receiver to receive intent return values from service method calls
*/
private class MainReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(LOG_TAG, "Received action: " + intent.getAction());
if (intent.getAction().equals(IServiceDiscovery.GET_MY_SERVICES) || intent.getAction().equals(IServiceDiscovery.GET_SERVICES)) {
boolean notStarted = intent.getBooleanExtra(IServiceManager.INTENT_NOTSTARTED_EXCEPTION, false);
if (notStarted)
fail("'Service Not Started' returned from service");
else {
Parcelable[] returnedServices = intent.getParcelableArrayExtra(IServiceDiscovery.INTENT_RETURN_VALUE);
assertNotNull(returnedServices);
for (int i=0; i< returnedServices.length; i++) {
org.societies.api.schema.servicelifecycle.model.Service service = (org.societies.api.schema.servicelifecycle.model.Service) returnedServices[i];
Log.d(LOG_TAG, service.getServiceName());
}
}
TestSLMmanager.this.testEndTime = System.currentTimeMillis();
Log.d(LOG_TAG, intent.getAction() + " elapse time: " + (TestSLMmanager.this.testEndTime - TestSLMmanager.this.testStartTime));
}
else if (intent.getAction().equals(IServiceManager.INTENT_SERVICE_STARTED_STATUS)) {
boolean started = intent.getBooleanExtra(IServiceManager.INTENT_RETURN_VALUE_KEY, false);
Log.d(LOG_TAG, "Service started: " + started);
TestSLMmanager.this.serviceDiscoConnected.countDown();
}
}
}
/**
* Create a suitable intent filter
* @return IntentFilter
*/
private IntentFilter createTestIntentFilter() {
//register broadcast receiver to receive SocietiesEvents return values
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(IServiceDiscovery.GET_MY_SERVICES);
intentFilter.addAction(IServiceDiscovery.GET_SERVICE);
intentFilter.addAction(IServiceDiscovery.GET_SERVICES);
intentFilter.addAction(IServiceDiscovery.SEARCH_SERVICES);
intentFilter.addAction(IServiceDiscovery.INTENT_NOTSTARTED_EXCEPTION);
intentFilter.addAction(IServiceManager.INTENT_SERVICE_STARTED_STATUS);
return intentFilter;
}
}