package org.societies.integration.tests.bit.webapp;
import junit.framework.Assert;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.societies.api.internal.schema.useragent.feedback.NegotiationDetailsBean;
import org.societies.api.internal.useragent.feedback.IUserFeedback;
import org.societies.api.schema.identity.RequestorBean;
import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.*;
import org.societies.integration.api.selenium.SeleniumTest;
import org.societies.integration.api.selenium.components.UFNotificationPopup;
import org.societies.integration.api.selenium.pages.IndexPage;
import org.societies.integration.api.selenium.pages.PrivacyPolicyNegotiationRequestPage;
import org.societies.integration.api.selenium.pages.TestPage;
import java.math.BigInteger;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
public class TestWebappPrivacyNegotiation extends SeleniumTest {
private static final Logger log = LoggerFactory.getLogger(TestWebappPrivacyNegotiation.class);
private static final String USERNAME = "paddy";
private static final String PASSWORD = "p";
private IndexPage indexPage;
private IUserFeedback userFeedback;
private final SecureRandom random = new SecureRandom();
public TestWebappPrivacyNegotiation() {
log.debug("TestWebappUserFeedback ctor()");
}
@Before
public void setupTest() {
log.debug("Setting up test");
this.userFeedback = UFTestInit.getUserFeedback();
userFeedback.clear();
indexPage = new IndexPage(getDriver());
log.debug("Finished setting up test");
}
@After
public void tearDown() {
}
@Test
public void eventsAppearAtLogin() {
String requestId = UUID.randomUUID().toString();
Future<ResponsePolicy> responsePolicyFuture = buildAndSendPPN(requestId);
Assert.assertFalse(responsePolicyFuture.isDone());
indexPage.doLogin(USERNAME, PASSWORD);
int number = indexPage.getNumberInNotificationsBubble();
// there may already be some notifications in the bubble
Assert.assertTrue(number >= 1);
indexPage.clickNotificationBubble();
Assert.assertFalse(responsePolicyFuture.isDone());
log.debug("Test complete");
}
@Test
public void canAcceptPPN() throws ExecutionException, InterruptedException {
String requestId = UUID.randomUUID().toString();
// login, check no notifications existing
indexPage.doLogin(USERNAME, PASSWORD);
TestPage testPage = indexPage.navigateToTestPage();
testPage.clickResetUFButton();
testPage.verifyNumberInNotificationsBubble(0);
// send PPN
Future<ResponsePolicy> responsePolicyFuture = buildAndSendPPN(requestId);
Assert.assertFalse(responsePolicyFuture.isDone());
// ensure notification displayed
testPage.verifyNumberInNotificationsBubble(1);
// switch to the notification page
UFNotificationPopup ufNotificationPopup = indexPage.clickNotificationBubble();
PrivacyPolicyNegotiationRequestPage ppnPage = ufNotificationPopup.clickPPNLink(requestId);
Assert.assertFalse(responsePolicyFuture.isDone());
ppnPage.clickAcceptPpnButton();
Assert.assertTrue(responsePolicyFuture.isDone());
ResponsePolicy policy = responsePolicyFuture.get();
Assert.assertEquals(NegotiationStatus.ONGOING, policy.getNegotiationStatus());
testPage.verifyNumberInNotificationsBubble(0);
log.debug("Test complete");
}
@Test
public void canCancelPPN() throws ExecutionException, InterruptedException {
String requestId = UUID.randomUUID().toString();
// login, check no notifications existing
indexPage.doLogin(USERNAME, PASSWORD);
TestPage testPage = indexPage.navigateToTestPage();
testPage.clickResetUFButton();
testPage.verifyNumberInNotificationsBubble(0);
// send PPN
Future<ResponsePolicy> responsePolicyFuture = buildAndSendPPN(requestId);
Assert.assertFalse(responsePolicyFuture.isDone());
// ensure notification displayed
testPage.verifyNumberInNotificationsBubble(1);
// switch to the notification page
UFNotificationPopup ufNotificationPopup = indexPage.clickNotificationBubble();
PrivacyPolicyNegotiationRequestPage ppnPage = ufNotificationPopup.clickPPNLink(requestId);
Assert.assertFalse(responsePolicyFuture.isDone());
ppnPage.clickCancelPpnButton();
Assert.assertTrue(responsePolicyFuture.isDone());
ResponsePolicy policy = responsePolicyFuture.get();
Assert.assertEquals(NegotiationStatus.FAILED, policy.getNegotiationStatus());
testPage.verifyNumberInNotificationsBubble(0);
log.debug("Test complete");
}
private Future<ResponsePolicy> buildAndSendPPN(String requestID) {
String requestorId = UUID.randomUUID().toString();
int negotiationId = new BigInteger(130, random).intValue();
RequestorBean requestorBean = new RequestorBean();
requestorBean.setRequestorId(requestorId);
NegotiationDetailsBean negotiationDetails = new NegotiationDetailsBean();
negotiationDetails.setRequestor(requestorBean);
negotiationDetails.setNegotiationID(negotiationId);
ResponsePolicy responsePolicy = buildResponsePolicy(requestorBean);
return userFeedback.getPrivacyNegotiationFBAsync(requestID, responsePolicy, negotiationDetails, null);
}
private static ResponsePolicy buildResponsePolicy(RequestorBean requestorBean) {
List<ResponseItem> responseItems = new ArrayList<ResponseItem>();
responseItems.add(buildResponseItem("http://this.is.a.win/", "winning"));
responseItems.add(buildResponseItem("http://paddy.rules/", "paddy"));
responseItems.add(buildResponseItem("http://something.something.something/", "dark side"));
ResponsePolicy responsePolicy = new ResponsePolicy();
responsePolicy.setRequestor(requestorBean);
responsePolicy.setNegotiationStatus(NegotiationStatus.ONGOING);
responsePolicy.setResponseItems(responseItems);
return responsePolicy;
}
private static ResponseItem buildResponseItem(String uri, String dataType) {
Action action1 = new Action();
action1.setActionConstant(ActionConstants.CREATE);
action1.setOptional(true);
Action action2 = new Action();
action2.setActionConstant(ActionConstants.DELETE);
action2.setOptional(true);
Action action3 = new Action();
action3.setActionConstant(ActionConstants.READ);
action3.setOptional(true);
Action action4 = new Action();
action4.setActionConstant(ActionConstants.WRITE);
action4.setOptional(true);
Condition condition1 = new Condition();
condition1.setConditionConstant(ConditionConstants.DATA_RETENTION_IN_HOURS);
condition1.setValue("1");
condition1.setOptional(true);
Condition condition2 = new Condition();
condition2.setConditionConstant(ConditionConstants.RIGHT_TO_ACCESS_HELD_DATA);
condition2.setValue("2");
condition2.setOptional(true);
Condition condition3 = new Condition();
condition3.setConditionConstant(ConditionConstants.RIGHT_TO_OPTOUT);
condition3.setValue("3");
condition3.setOptional(true);
Condition condition4 = new Condition();
condition4.setConditionConstant(ConditionConstants.STORE_IN_SECURE_STORAGE);
condition4.setValue("4");
condition4.setOptional(true);
Resource resource = new Resource();
resource.setDataIdUri(uri);
resource.setDataType(dataType);
RequestItem requestItem = new RequestItem();
requestItem.getActions().add(action1);
requestItem.getActions().add(action2);
requestItem.getActions().add(action3);
requestItem.getActions().add(action4);
requestItem.getConditions().add(condition1);
requestItem.getConditions().add(condition2);
requestItem.getConditions().add(condition3);
requestItem.getConditions().add(condition4);
requestItem.setOptional(true);
requestItem.setResource(resource);
ResponseItem responseItem = new ResponseItem();
responseItem.setDecision(Decision.INDETERMINATE);
responseItem.setRequestItem(requestItem);
return responseItem;
}
}