/**
* Copyright (c) 2011, SOCIETIES Consortium (WATERFORD INSTITUTE OF TECHNOLOGY (TSSG), HERIOT-WATT UNIVERSITY (HWU), SOLUTA.NET
* (SN), GERMAN AEROSPACE CENTRE (Deutsches Zentrum fuer Luft- und Raumfahrt e.V.) (DLR), Zavod za varnostne tehnologije
* informacijske dru�be in elektronsko poslovanje (SETCCE), INSTITUTE OF COMMUNICATION AND COMPUTER SYSTEMS (ICCS), LAKE
* COMMUNICATIONS (LAKE), INTEL PERFORMANCE LEARNING SOLUTIONS LTD (INTEL), PORTUGAL TELECOM INOVA��O, SA (PTIN), IBM Corp.,
* INSTITUT TELECOM (ITSUD), AMITEC DIACHYTI EFYIA PLIROFORIKI KAI EPIKINONIES ETERIA PERIORISMENIS EFTHINIS (AMITEC), TELECOM
* ITALIA S.p.a.(TI), TRIALOG (TRIALOG), Stiftelsen SINTEF (SINTEF), NEC EUROPE LTD (NEC))
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following
* conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
* SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.societies.android.platform.useragent.feedback.container.test;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import org.societies.android.api.comms.IMethodCallback;
import org.societies.android.api.events.IAndroidSocietiesEvents;
import org.societies.android.api.events.IPlatformEventsCallback;
import org.societies.android.api.events.PlatformEventsHelperNotConnectedException;
import org.societies.android.api.internal.useragent.IAndroidUserFeedback;
import org.societies.android.api.internal.useragent.model.ExpProposalContent;
import org.societies.android.api.internal.useragent.model.ExpProposalType;
import org.societies.android.remote.helper.EventsHelper;
import org.societies.android.platform.useragent.feedback.container.TestContainerFeedbackService;
import org.societies.android.platform.useragent.feedback.container.TestContainerFeedbackService.FeedbackContainerBinder;
import org.societies.android.platform.useragent.feedback.guis.AcknackPopup;
import org.societies.android.platform.useragent.feedback.model.UserFeedbackEventTopics;
import org.societies.api.schema.useragent.feedback.ExpFeedbackResultBean;
import org.societies.api.schema.useragent.feedback.FeedbackMethodType;
import org.societies.api.schema.useragent.feedback.UserFeedbackBean;
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;
/**
* @author Eliza
*
*/
public class TestUserFeedback extends ServiceTestCase <TestContainerFeedbackService>{
private static final String LOG_TAG = TestUserFeedback.class.getName();
private static final String CLIENT_ID = LOG_TAG;
private Boolean receivedResult = false;
private EventsHelper eventsHelper;
private boolean isEventsConnected = false;
public TestUserFeedback() {
super(TestContainerFeedbackService.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
this.receivedResult = false;
setupBroadcastReceiver();
//setup eventsHelper
eventsHelper = new EventsHelper(this.getContext());
eventsHelper.setUpService(new IMethodCallback() {
@Override
public void returnAction(String result) {
Log.d(LOG_TAG, "eventMgr callback: ReturnAction(String) called");
}
@Override
public void returnAction(boolean resultFlag) {
Log.d(LOG_TAG, "eventMgr callback: ReturnAction(boolean) called. Connected");
isEventsConnected=true;
}
@Override
public void returnException(String arg0) { }
});
}
private class UserFeedbackBroadcastReceiver extends BroadcastReceiver{
private final String LOG_TAG = UserFeedbackBroadcastReceiver.class.getName();
@Override
public void onReceive(Context context, Intent intent) {
Log.d(LOG_TAG, "Received action: " + intent.getAction());
assertNotNull(intent.getParcelableExtra(IAndroidUserFeedback.INTENT_RETURN_VALUE));
TestUserFeedback.this.receivedResult = true;
Log.d(LOG_TAG, "OnReceive finished");
}
}
@MediumTest
public void testGetExplicitFB() {
Intent userFeedbackIntent = new Intent(getContext(), this.getClass());
FeedbackContainerBinder binder = (FeedbackContainerBinder) bindService(userFeedbackIntent);
IAndroidUserFeedback ufService = (IAndroidUserFeedback) binder.getService();
ExpProposalContent proposal = new ExpProposalContent("Testing explicit proposal user feedback", new String[]{"Yes","No"});
ExpFeedbackResultBean bean = ufService.getExplicitFB(CLIENT_ID, ExpProposalType.ACKNACK, proposal);
while (!this.receivedResult){
try {
Log.d(LOG_TAG, "Not received result");
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Log.d(LOG_TAG, "Received result");
}
@MediumTest
public void testGetExplicitFBTriggerFromCloud(){
/*Intent userFeedbackIntent = new Intent(getContext(), this.getClass());
FeedbackContainerBinder binder = (FeedbackContainerBinder) bindService(userFeedbackIntent);
IAndroidUserFeedback ufService = binder.getService();*/
IAndroidUserFeedback ufService = new AndroidUserFeedbackService(getContext(), false);
boolean started = ufService.startService();
if (started){
Log.d(LOG_TAG, "Connecting to pubsub");
Log.d(LOG_TAG, "Setup broadcast receiver");
Log.d(LOG_TAG, "new EventService");
if (isEventsConnected){
Log.d(LOG_TAG, "Connected to eventsManager");
subscribeToEvent();
publishEvent();
}else{
android.test.AndroidTestCase.fail("Failed to connect to : "+EventsHelper.class.getName());
}
}
else{
android.test.AndroidTestCase.fail("Failed to startService(): "+IAndroidUserFeedback.class.getName());
}
while (!this.receivedResult){
try {
Log.d(LOG_TAG, "Not received result");
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Log.d(LOG_TAG, "Received result");
}
/**
* Create a broadcast receiver
*
*/
private void setupBroadcastReceiver() {
BroadcastReceiver receiver = null;
Log.d(LOG_TAG, "Set up broadcast receiver");
receiver = new UserFeedbackBroadcastReceiver();
IntentFilter intentFilter = createTestIntentFilter();
getContext().registerReceiver(receiver, intentFilter);
Log.d(LOG_TAG, "Registered broadcast 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(IAndroidUserFeedback.GET_IMPLICITFB);
intentFilter.addAction(IAndroidUserFeedback.GET_EXPLICITFB);
intentFilter.addAction(IAndroidUserFeedback.INTENT_RETURN_VALUE);
return intentFilter;
}
private void publishEvent(){
UserFeedbackBean bean = new UserFeedbackBean();
bean.setMethod(FeedbackMethodType.GET_EXPLICIT_FB);
List<String> options = new ArrayList<String>();
options.add("Yes");
options.add("No");
bean.setOptions(options);
bean.setProposalText("Click here to test user feedback notifications triggered by pubsub");
bean.setRequestId(UUID.randomUUID().toString());
bean.setType(ExpProposalType.ACKNACK);
try {
if (eventsHelper==null){
Log.d(LOG_TAG, "EventsHelper is null");
}else{
Log.d(LOG_TAG, "EventsHelper is NOT null");
}
eventsHelper.publishEvent(UserFeedbackEventTopics.REQUEST, bean, new IPlatformEventsCallback() {
@Override
public void returnAction(int arg0) {
Log.d(LOG_TAG, "eventMgr callback: ReturnAction(String) called");
}
@Override
public void returnAction(boolean arg0) {
Log.d(LOG_TAG, "eventMgr callback: ReturnAction(boolean) called. Published event");
}
@Override
public void returnException(int arg0) { }
});
} catch (PlatformEventsHelperNotConnectedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void subscribeToEvent() {
try {
eventsHelper.subscribeToEvent(IAndroidSocietiesEvents.UF_REQUEST_INTENT, new IPlatformEventsCallback() {
@Override
public void returnAction(int arg0) {
Log.d(LOG_TAG, "eventMgr callback: ReturnAction(String) called");
}
@Override
public void returnAction(boolean arg0) {
Log.d(LOG_TAG, "eventMgr callback: ReturnAction(boolean) called. Subscribed to event");
}
@Override
public void returnException(int arg0) { }
});
} catch (PlatformEventsHelperNotConnectedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}