package org.societies.android.platform.events.realtest; import java.util.concurrent.CountDownLatch; import org.societies.android.api.css.manager.IServiceManager; import org.societies.android.api.events.IAndroidSocietiesEvents; import org.societies.android.api.internal.servicelifecycle.IServiceControl; import org.societies.android.platform.events.realcontainer.RealPlatformEventsTest; import org.societies.android.platform.events.realcontainer.RealPlatformEventsTest.RealPlatformEventsBinder; import org.societies.api.schema.cssmanagement.CssEvent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.test.ServiceTestCase; import android.test.suitebuilder.annotation.MediumTest; import android.util.Log; /** * Required for test * 1. Virgo and Openfire running and correctly configured. * 2. Societies Login tester app running and successfully logged in * * */ public class TestRealPlatformEvents extends ServiceTestCase <RealPlatformEventsTest> { //Logging tag private static final String LOG_TAG = TestRealPlatformEvents.class.getName(); private static final int ALL_EVENTS_COUNT = 13; private static final String CLIENT_PARAM_1 = "org.societies.android.platform.events.test"; private static final String CLIENT_PARAM_2 = "org.societies.android.platform.events.test.alternate"; private static final String CLIENT_PARAM_3 = "org.societies.android.platform.events.test.other"; private static final String INTENT_FILTER = "org.societies.android.css.manager"; private static final String CSS_EVENT_TEST_DESCRIPTION = "test Css Event"; private static final String CSS_EVENT_TEST_TYPE = "test type"; private static final int DELAY = 10000; private boolean testCompleted; private IAndroidSocietiesEvents eventService; private CountDownLatch endCondition; public TestRealPlatformEvents() { super(RealPlatformEventsTest.class); } protected void setUp() throws Exception { super.setUp(); } protected void tearDown() throws Exception { super.tearDown(); } /** * The name 'test preconditions' is a convention to signal that if this * test doesn't pass, the test case was not set up properly and it might * explain any and all failures in other tests. This is not guaranteed * to run before other tests, as JUnit uses reflection to find the tests. */ @MediumTest public void testPreconditions() { } @MediumTest public void testSubscribeToSingleEvent() throws Exception { this.endCondition = new CountDownLatch(1); this.testCompleted = false; BroadcastReceiver receiver = setupSingleEventReceiver(); Intent eventsIntent = new Intent(getContext(), RealPlatformEventsTest.class); RealPlatformEventsBinder binder = (RealPlatformEventsBinder) bindService(eventsIntent); assertNotNull(binder); this.eventService = (IAndroidSocietiesEvents) binder.getService(); this.eventService.startService(); this.endCondition.await(); this.unregisterReceiver(receiver); assertTrue(this.testCompleted); } // @MediumTest public void testSubscribeToAllEvents() throws Exception { this.endCondition = new CountDownLatch(1); this.testCompleted = false; BroadcastReceiver receiver = setupAllEventsReceiver(); Intent eventsIntent = new Intent(getContext(), RealPlatformEventsTest.class); RealPlatformEventsBinder binder = (RealPlatformEventsBinder) bindService(eventsIntent); assertNotNull(binder); this.eventService = (IAndroidSocietiesEvents) binder.getService(); this.eventService.startService(); this.endCondition.await(); this.unregisterReceiver(receiver); assertTrue(this.testCompleted); } @MediumTest public void testSubscribeToMultipleEvents() throws Exception { this.endCondition = new CountDownLatch(1); this.testCompleted = false; BroadcastReceiver receiver = setupMultipleEventsReceiver(); Intent eventsIntent = new Intent(getContext(), RealPlatformEventsTest.class); RealPlatformEventsBinder binder = (RealPlatformEventsBinder) bindService(eventsIntent); assertNotNull(binder); this.eventService = (IAndroidSocietiesEvents) binder.getService(); this.eventService.startService(); this.endCondition.await(); this.unregisterReceiver(receiver); assertTrue(this.testCompleted); } /** * Broadcast receiver to receive intent return values from service method calls */ private class SingleEventReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.d(LOG_TAG, "Received action: " + intent.getAction()); if (intent.getAction().equals(IAndroidSocietiesEvents.SUBSCRIBE_TO_EVENT)) { assertTrue(intent.getBooleanExtra(IAndroidSocietiesEvents.INTENT_RETURN_VALUE_KEY, false)); TestRealPlatformEvents.this.eventService.getNumSubscribedNodes(CLIENT_PARAM_1); } else if (intent.getAction().equals(IAndroidSocietiesEvents.UNSUBSCRIBE_FROM_EVENT)) { assertTrue(intent.getBooleanExtra(IAndroidSocietiesEvents.INTENT_RETURN_VALUE_KEY, false)); TestRealPlatformEvents.this.eventService.stopService(); } else if (intent.getAction().equals(IServiceManager.INTENT_SERVICE_STARTED_STATUS)) { assertTrue(intent.getBooleanExtra(IServiceManager.INTENT_RETURN_VALUE_KEY, false)); TestRealPlatformEvents.this.eventService.subscribeToEvent(CLIENT_PARAM_1, IAndroidSocietiesEvents.CSS_MANAGER_ADD_CSS_NODE_INTENT); } else if (intent.getAction().equals(IServiceManager.INTENT_SERVICE_STOPPED_STATUS)) { assertTrue(intent.getBooleanExtra(IServiceManager.INTENT_RETURN_VALUE_KEY, false)); TestRealPlatformEvents.this.endCondition.countDown(); TestRealPlatformEvents.this.testCompleted = true; } else if (intent.getAction().equals(IAndroidSocietiesEvents.NUM_EVENT_LISTENERS)) { assertEquals(1, intent.getIntExtra(IAndroidSocietiesEvents.INTENT_RETURN_VALUE_KEY, 0)); TestRealPlatformEvents.this.eventService.publishEvent(CLIENT_PARAM_1, IAndroidSocietiesEvents.CSS_MANAGER_ADD_CSS_NODE_INTENT, getCssEvent()); } else if (intent.getAction().equals(IAndroidSocietiesEvents.PUBLISH_EVENT)) { assertTrue(intent.getBooleanExtra(IAndroidSocietiesEvents.INTENT_RETURN_VALUE_KEY, false)); } else if (intent.getAction().equals(IAndroidSocietiesEvents.CSS_MANAGER_ADD_CSS_NODE_INTENT)) { Log.d(LOG_TAG, "Received event: " + IAndroidSocietiesEvents.CSS_MANAGER_ADD_CSS_NODE_INTENT); CssEvent event = (CssEvent) intent.getParcelableExtra(IAndroidSocietiesEvents.GENERIC_INTENT_PAYLOAD_KEY); assertEquals(CSS_EVENT_TEST_TYPE, event.getType()); assertEquals(CSS_EVENT_TEST_DESCRIPTION, event.getDescription()); TestRealPlatformEvents.this.eventService.unSubscribeFromEvent(CLIENT_PARAM_1, IAndroidSocietiesEvents.CSS_MANAGER_ADD_CSS_NODE_INTENT); } } } /** * Broadcast receiver to receive intent return values from service method calls */ private class AllEventReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.d(LOG_TAG, "Received action: " + intent.getAction()); if (intent.getAction().equals(IAndroidSocietiesEvents.SUBSCRIBE_TO_EVENTS)) { assertTrue(intent.getBooleanExtra(IAndroidSocietiesEvents.INTENT_RETURN_VALUE_KEY, false)); TestRealPlatformEvents.this.eventService.getNumSubscribedNodes(CLIENT_PARAM_1); } else if (intent.getAction().equals(IAndroidSocietiesEvents.UNSUBSCRIBE_FROM_EVENTS)) { assertTrue(intent.getBooleanExtra(IAndroidSocietiesEvents.INTENT_RETURN_VALUE_KEY, false)); TestRealPlatformEvents.this.eventService.stopService(); } else if (intent.getAction().equals(IServiceManager.INTENT_SERVICE_STARTED_STATUS)) { assertTrue(intent.getBooleanExtra(IServiceManager.INTENT_RETURN_VALUE_KEY, false)); TestRealPlatformEvents.this.eventService.subscribeToAllEvents(CLIENT_PARAM_1); } else if (intent.getAction().equals(IServiceManager.INTENT_SERVICE_STOPPED_STATUS)) { assertTrue(intent.getBooleanExtra(IServiceManager.INTENT_RETURN_VALUE_KEY, false)); TestRealPlatformEvents.this.endCondition.countDown(); TestRealPlatformEvents.this.testCompleted = true; } else if (intent.getAction().equals(IAndroidSocietiesEvents.NUM_EVENT_LISTENERS)) { assertEquals(1, intent.getIntExtra(IAndroidSocietiesEvents.INTENT_RETURN_VALUE_KEY, 0)); TestRealPlatformEvents.this.eventService.unSubscribeFromAllEvents(CLIENT_PARAM_1); } } } /** * Broadcast receiver to receive intent return values from service method calls */ private class MultipleEventsReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.d(LOG_TAG, "Received action: " + intent.getAction()); if (intent.getAction().equals(IAndroidSocietiesEvents.SUBSCRIBE_TO_EVENTS)) { assertTrue(intent.getBooleanExtra(IAndroidSocietiesEvents.INTENT_RETURN_VALUE_KEY, false)); TestRealPlatformEvents.this.eventService.getNumSubscribedNodes(CLIENT_PARAM_1); } else if (intent.getAction().equals(IAndroidSocietiesEvents.UNSUBSCRIBE_FROM_EVENTS)) { assertTrue(intent.getBooleanExtra(IAndroidSocietiesEvents.INTENT_RETURN_VALUE_KEY, false)); TestRealPlatformEvents.this.eventService.stopService(); } else if (intent.getAction().equals(IServiceManager.INTENT_SERVICE_STARTED_STATUS)) { assertTrue(intent.getBooleanExtra(IServiceManager.INTENT_RETURN_VALUE_KEY, false)); TestRealPlatformEvents.this.eventService.subscribeToEvents(CLIENT_PARAM_1, INTENT_FILTER); } else if (intent.getAction().equals(IServiceManager.INTENT_SERVICE_STOPPED_STATUS)) { assertTrue(intent.getBooleanExtra(IServiceManager.INTENT_RETURN_VALUE_KEY, false)); TestRealPlatformEvents.this.endCondition.countDown(); TestRealPlatformEvents.this.testCompleted = true; } else if (intent.getAction().equals(IAndroidSocietiesEvents.NUM_EVENT_LISTENERS)) { assertEquals(2, intent.getIntExtra(IAndroidSocietiesEvents.INTENT_RETURN_VALUE_KEY, 0)); TestRealPlatformEvents.this.eventService.unSubscribeFromEvents(CLIENT_PARAM_1, INTENT_FILTER); } } } /** * Create a broadcast receiver * * @return the created broadcast receiver */ private BroadcastReceiver setupMultipleEventsReceiver() { Log.d(LOG_TAG, "Set up broadcast receiver"); BroadcastReceiver receiver = new MultipleEventsReceiver(); getContext().registerReceiver(receiver, createTestIntentFilter()); Log.d(LOG_TAG, "Register multiple event broadcast receiver"); return receiver; } /** * Create a broadcast receiver * * @return the created broadcast receiver */ private BroadcastReceiver setupAllEventsReceiver() { Log.d(LOG_TAG, "Set up broadcast receiver"); BroadcastReceiver receiver = new AllEventReceiver(); getContext().registerReceiver(receiver, createTestIntentFilter()); Log.d(LOG_TAG, "Register all event broadcast receiver"); return receiver; } /** * Create a broadcast receiver * * @return the created broadcast receiver */ private BroadcastReceiver setupSingleEventReceiver() { Log.d(LOG_TAG, "Set up broadcast receiver"); BroadcastReceiver receiver = new SingleEventReceiver(); getContext().registerReceiver(receiver, createTestIntentFilter()); Log.d(LOG_TAG, "Register single event 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); } /** * Create a suitable intent filter * @return IntentFilter */ private IntentFilter createTestIntentFilter() { //register broadcast receiver to receive SocietiesEvents return values IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(IAndroidSocietiesEvents.SUBSCRIBE_TO_ALL_EVENTS); intentFilter.addAction(IAndroidSocietiesEvents.SUBSCRIBE_TO_EVENT); intentFilter.addAction(IAndroidSocietiesEvents.SUBSCRIBE_TO_EVENTS); intentFilter.addAction(IAndroidSocietiesEvents.UNSUBSCRIBE_FROM_ALL_EVENTS); intentFilter.addAction(IAndroidSocietiesEvents.UNSUBSCRIBE_FROM_EVENT); intentFilter.addAction(IAndroidSocietiesEvents.UNSUBSCRIBE_FROM_EVENTS); intentFilter.addAction(IAndroidSocietiesEvents.PUBLISH_EVENT); intentFilter.addAction(IAndroidSocietiesEvents.NUM_EVENT_LISTENERS); intentFilter.addAction(IServiceManager.INTENT_SERVICE_STARTED_STATUS); intentFilter.addAction(IServiceManager.INTENT_SERVICE_STOPPED_STATUS); intentFilter.addAction(IServiceManager.INTENT_NOTSTARTED_EXCEPTION); intentFilter.addAction(IServiceManager.INTENT_SERVICE_EXCEPTION_INFO); intentFilter.addAction(IAndroidSocietiesEvents.CSS_MANAGER_ADD_CSS_NODE_INTENT); return intentFilter; } private static CssEvent getCssEvent() { CssEvent event = new CssEvent(); event.setDescription(CSS_EVENT_TEST_DESCRIPTION); event.setType(CSS_EVENT_TEST_TYPE); return event; } }