/**
* 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.privacytrust.privacyprotection.privacynegotiation.test;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.security.Key;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import junit.framework.TestCase;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import org.societies.api.context.CtxException;
import org.societies.api.context.model.CtxAttribute;
import org.societies.api.context.model.CtxAttributeIdentifier;
import org.societies.api.context.model.CtxAttributeTypes;
import org.societies.api.context.model.CtxEntityIdentifier;
import org.societies.api.context.model.IndividualCtxEntity;
import org.societies.api.context.model.util.SerialisationHelper;
import org.societies.api.identity.IIdentity;
import org.societies.api.identity.IIdentityManager;
import org.societies.api.identity.INetworkNode;
import org.societies.api.identity.IdentityType;
import org.societies.api.identity.RequestorCis;
import org.societies.api.identity.RequestorService;
import org.societies.api.identity.util.RequestorUtils;
import org.societies.api.internal.context.broker.ICtxBroker;
import org.societies.api.internal.personalisation.preference.IUserPreferenceManagement;
import org.societies.api.internal.privacytrust.privacyprotection.IPrivacyPolicyManager;
import org.societies.api.internal.privacytrust.privacyprotection.model.privacypolicy.IAgreement;
import org.societies.api.internal.privacytrust.privacyprotection.model.privacypolicy.PPNegotiationEvent;
import org.societies.api.internal.privacytrust.privacyprotection.negotiation.FailedNegotiationEvent;
import org.societies.api.internal.privacytrust.privacyprotection.negotiation.NegotiationDetails;
import org.societies.api.internal.privacytrust.privacyprotection.remote.INegotiationAgentRemote;
import org.societies.api.internal.schema.privacytrust.privacyprotection.model.privacypolicy.Agreement;
import org.societies.api.internal.schema.privacytrust.privacyprotection.model.privacypolicy.AgreementEnvelope;
import org.societies.api.internal.schema.privacytrust.privacyprotection.preferences.PrivacyOutcomeConstantsBean;
import org.societies.api.internal.schema.useragent.feedback.NegotiationDetailsBean;
import org.societies.api.internal.useragent.feedback.IUserFeedback;
import org.societies.api.osgi.event.IEventMgr;
import org.societies.api.privacytrust.privacy.model.PrivacyException;
import org.societies.api.schema.identity.DataIdentifierScheme;
import org.societies.api.schema.identity.RequestorBean;
import org.societies.api.schema.identity.RequestorCisBean;
import org.societies.api.schema.identity.RequestorServiceBean;
import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.Action;
import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.ActionConstants;
import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.Condition;
import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.ConditionConstants;
import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.Decision;
import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.NegotiationStatus;
import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.PrivacyPolicyTypeConstants;
import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.RequestItem;
import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.RequestPolicy;
import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.Resource;
import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.ResponseItem;
import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.ResponsePolicy;
import org.societies.api.schema.servicelifecycle.model.ServiceResourceIdentifier;
import org.societies.privacytrust.privacyprotection.api.IPrivacyAgreementManagerInternal;
import org.societies.privacytrust.privacyprotection.api.IPrivacyDataManagerInternal;
import org.societies.privacytrust.privacyprotection.api.IPrivacyPreferenceManager;
import org.societies.privacytrust.privacyprotection.api.identity.IIdentityOption;
import org.societies.privacytrust.privacyprotection.api.identity.IIdentitySelection;
import org.societies.privacytrust.privacyprotection.api.identity.ILinkabilityDetail;
import org.societies.privacytrust.privacyprotection.api.model.privacypreference.IPrivacyPreference;
import org.societies.privacytrust.privacyprotection.api.model.privacypreference.PrivacyCondition;
import org.societies.privacytrust.privacyprotection.api.model.privacypreference.PrivacyPreference;
import org.societies.privacytrust.privacyprotection.api.model.privacypreference.ppn.PPNPOutcome;
import org.societies.privacytrust.privacyprotection.privacynegotiation.PrivacyPolicyNegotiationManager;
import org.societies.privacytrust.privacyprotection.privacynegotiation.negotiation.client.AgreementFinaliser;
import org.springframework.scheduling.annotation.AsyncResult;
/**
* Describe your class here...
*
* @author Eliza
*
*/
public class PrivacyNegotiationTest {
private IUserPreferenceManagement prefMgr = Mockito.mock(IUserPreferenceManagement.class);
private ICtxBroker ctxBroker = Mockito.mock(ICtxBroker.class);
private IEventMgr eventMgr = Mockito.mock(IEventMgr.class);
private IIdentityManager idm = Mockito.mock(IIdentityManager.class);
private IPrivacyPreferenceManager privacyPreferenceManager = Mockito.mock(IPrivacyPreferenceManager.class);
private PrivacyPolicyNegotiationManager negotiationMgr;
private IPrivacyDataManagerInternal privacyDataManager = Mockito.mock(IPrivacyDataManagerInternal.class);
private IPrivacyAgreementManagerInternal policyAgreementMgr = Mockito.mock(IPrivacyAgreementManagerInternal.class);
private INegotiationAgentRemote negAgent = Mockito.mock(INegotiationAgentRemote.class);
private IIdentitySelection ids = Mockito.mock(IIdentitySelection.class);
private IPrivacyPolicyManager privacyPolicyManager = Mockito.mock(IPrivacyPolicyManager.class);
private RequestorServiceBean requestorServiceBean;
private RequestorCisBean requestorCisBean;
private RequestorService requestorService;
private RequestorCis requestorCis;
private RequestPolicy servicePolicy;
private RequestPolicy cisPolicy;
private INetworkNode userId;
private IndividualCtxEntity userCtxEntity;
private CtxAttributeIdentifier ctxLocationAttributeId;
private CtxAttribute locationAttribute;
private CtxAttributeIdentifier ctxStatusAttributeId;
private CtxAttribute statusAttribute;
private ResponsePolicy serviceResponsePolicy;
private AgreementEnvelope negotiationAgreementEnvelope;
private Agreement agreement;
private PPNPOutcome locationOutcomeForService;
private PPNPOutcome statusOutcomeForService;
private ResponsePolicy cisResponsePolicy;
private PPNPOutcome locationOutcomeForCis;
private PPNPOutcome statusOutcomeForCis;
private PPNegotiationEvent successfulEvent;
private FailedNegotiationEvent failedEvent;
private List<Action> actions;
private List<Condition> conditions;
private IUserFeedback userFeedback = Mockito.mock(IUserFeedback.class);
@Before
public void setUp() throws CtxException{
setupContext();
this.setupRequestorServiceBean();
this.setupRequestorCisBean();
this.setupRequestorCisObject();
this.setupRequestorServiceObject();
this.setupPolicyDetails();
this.servicePolicy = this.getServicePolicy();
this.cisPolicy = this.getCisPolicy();
this.serviceResponsePolicy = this.getServiceResponsePolicy();
this.cisResponsePolicy = this.getCisResponsePolicy();
this.createNegotiationAgreement();
this.negotiationMgr = new PrivacyPolicyNegotiationManager();
this.negotiationMgr.setCtxBroker(ctxBroker);
this.negotiationMgr.setEventMgr(eventMgr);
this.negotiationMgr.setIdentitySelection(Mockito.mock(IIdentitySelection.class));
this.negotiationMgr.setIdm(idm);
this.negotiationMgr.setPrefMgr(prefMgr);
this.negotiationMgr.setPrivacyDataManagerInternal(privacyDataManager);
this.negotiationMgr.setPrivacyAgreementManagerInternal(policyAgreementMgr );
this.negotiationMgr.setNegotiationAgentRemote(negAgent);
this.negotiationMgr.setPrivacyPreferenceManager(privacyPreferenceManager);
this.negotiationMgr.setPrivacyPolicyManager(privacyPolicyManager);
this.negotiationMgr.setUserFeedback(userFeedback);
this.setupMockito();
this.negotiationMgr.initialisePrivacyPolicyNegotiationManager();
}
private void setupMockito() throws CtxException{
Mockito.when(ctxBroker.retrieveIndividualEntity(this.userId)).thenReturn(new AsyncResult<IndividualCtxEntity>(this.userCtxEntity));
Mockito.when(negAgent.getPolicy((RequestorBean) Mockito.anyObject())).thenReturn(new AsyncResult<RequestPolicy>(servicePolicy));
//Mockito.when(negAgent.getPolicy(Mockito.eq(requestorCisBean))).thenReturn(new AsyncResult<RequestPolicy>(cisPolicy));
Mockito.when(userFeedback.getPrivacyNegotiationFB((ResponsePolicy)Mockito.anyObject(), (NegotiationDetailsBean) Mockito.anyObject())).thenReturn(new AsyncResult<ResponsePolicy>(serviceResponsePolicy));
Mockito.when(idm.getThisNetworkNode()).thenReturn(this.userId);
Mockito.when(negAgent.negotiate((RequestorBean) Mockito.anyObject(), (ResponsePolicy) Mockito.anyObject())).thenReturn(new AsyncResult<ResponsePolicy>(serviceResponsePolicy));
//Mockito.when(negAgent.negotiate(Mockito.eq(requestorCisBean), (ResponsePolicy) Mockito.anyObject())).thenReturn(new AsyncResult<ResponsePolicy>(cisResponsePolicy));
Mockito.when(negAgent.acknowledgeAgreement((AgreementEnvelope) Mockito.anyObject())).thenReturn(new AsyncResult<Boolean>(true));
Mockito.when(ids.processIdentityContext((IAgreement) Mockito.anyObject())).thenReturn(this.getIdOptions());
}
private void setupPolicyDetails() {
this.setupActions();
this.setupConditions();
}
private void setupActions() {
this.actions= new ArrayList<Action>();
Action actionRead = new Action();
actionRead.setActionConstant(ActionConstants.READ);
Action actionWrite = new Action();
actionWrite.setActionConstant(ActionConstants.WRITE);
Action actionCreate = new Action();
actionCreate.setActionConstant(ActionConstants.CREATE);
Action actionDelete = new Action();
actionDelete.setActionConstant(ActionConstants.DELETE);
}
private void setupConditions() {
Condition conditionDataRetention = new Condition();
conditionDataRetention.setConditionConstant(ConditionConstants.DATA_RETENTION_IN_HOURS);
conditionDataRetention.setValue("48");
Condition conditionShare3p = new Condition();
conditionShare3p.setConditionConstant(ConditionConstants.SHARE_WITH_3RD_PARTIES);
conditionShare3p.setValue("Yes");
Condition conditionRightToOptOut = new Condition();
conditionRightToOptOut.setConditionConstant(ConditionConstants.RIGHT_TO_OPTOUT);
conditionRightToOptOut.setValue("Yes");
Condition conditionStoreSecure = new Condition();
conditionStoreSecure.setConditionConstant(ConditionConstants.STORE_IN_SECURE_STORAGE);
conditionStoreSecure.setValue("Yes");
this.conditions = new ArrayList<Condition>();
this.conditions.add(conditionStoreSecure);
this.conditions.add(conditionShare3p);
this.conditions.add(conditionDataRetention);
this.conditions.add(conditionRightToOptOut);
}
private void createNegotiationAgreement() {
AgreementFinaliser finaliser = new AgreementFinaliser();
agreement = new Agreement();
agreement.setRequestedItems(serviceResponsePolicy.getResponseItems());
agreement.setRequestor(requestorServiceBean);
byte[] signature = finaliser.signAgreement(agreement);
Key publicKey = finaliser.getPublicKey();
try {
this.negotiationAgreementEnvelope = new AgreementEnvelope();
this.negotiationAgreementEnvelope.setAgreement(agreement);
this.negotiationAgreementEnvelope.setPublicKey(SerialisationHelper.serialise(publicKey));
this.negotiationAgreementEnvelope.setSignature(signature);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private ResponsePolicy getCisResponsePolicy() {
List<ResponseItem> responses = new ArrayList<ResponseItem>();
for (RequestItem requestItem : this.cisPolicy.getRequestItems()){
ResponseItem responseItem = new ResponseItem();
responseItem.setDecision(Decision.PERMIT);
responseItem.setRequestItem(requestItem);
responses.add(responseItem);
}
ResponsePolicy response = new ResponsePolicy();
response.setNegotiationStatus(NegotiationStatus.SUCCESSFUL);
response.setRequestor(this.requestorCisBean);
response.setResponseItems(responses);
return response;
}
private ResponsePolicy getServiceResponsePolicy() {
List<ResponseItem> responses = new ArrayList<ResponseItem>();
for (RequestItem requestItem : this.servicePolicy.getRequestItems()){
ResponseItem responseItem = new ResponseItem();
responseItem.setDecision(Decision.PERMIT);
responseItem.setRequestItem(requestItem);
responses.add(responseItem);
}
ResponsePolicy response = new ResponsePolicy();
response.setNegotiationStatus(NegotiationStatus.SUCCESSFUL);
response.setRequestor(this.requestorServiceBean);
response.setResponseItems(responses);
return response;
}
public List<IIdentityOption> getIdOptions(){
ArrayList<IIdentityOption> idOptions = new ArrayList<IIdentityOption>();
IIdentityOption option = new IIdentityOption() {
@Override
public IIdentity getReferenceIdentity() {
// TODO Auto-generated method stub
return userId;
}
@Override
public List<ILinkabilityDetail> getOrderedLinkabilityDetailList() {
// TODO Auto-generated method stub
return null;
}
@Override
public Map<IIdentity, ILinkabilityDetail> getLinkabilityDetailMap() {
// TODO Auto-generated method stub
return null;
}
@Override
public int getIdentityContextMatch() {
// TODO Auto-generated method stub
return 0;
}
};
idOptions.add(option);
return idOptions;
}
@Test
public void TestStartNegotiation(){
NegotiationDetails serviceDetails = new NegotiationDetails(this.requestorService, 0);
NegotiationDetails cisDetails = new NegotiationDetails(requestorCis, 0);
try {
this.negotiationMgr.negotiateServicePolicy(serviceDetails);
} catch (PrivacyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
TestCase.fail(e.getMessage());
}
try {
this.negotiationMgr.negotiateCISPolicy(cisDetails);
} catch (PrivacyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
TestCase.fail(e.getMessage());
}
}
/* @Test
public void TestGetProviderPolicy(){
}
@Test
public void TestNegotiate(){
}
@Test
public void TestAcknowledgeAgreement(){
}*/
private void setupRequestorServiceBean(){
IIdentity requestorId = new MyIdentity(IdentityType.CSS, "eliza","societies.org");
ServiceResourceIdentifier serviceId = new ServiceResourceIdentifier();
serviceId.setServiceInstanceIdentifier("css://eliza@societies.org/HelloEarth");
try {
serviceId.setIdentifier(new URI("css://eliza@societies.org/HelloEarth"));
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.requestorServiceBean = new RequestorServiceBean();
requestorServiceBean.setRequestorId(requestorId.getJid());
requestorServiceBean.setRequestorServiceId(serviceId);
}
private void setupRequestorServiceObject(){
IIdentity requestorId = new MyIdentity(IdentityType.CSS, "eliza","societies.org");
ServiceResourceIdentifier serviceId = new ServiceResourceIdentifier();
serviceId.setServiceInstanceIdentifier("css://eliza@societies.org/HelloEarth");
try {
serviceId.setIdentifier(new URI("css://eliza@societies.org/HelloEarth"));
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.requestorService = new RequestorService(requestorId, serviceId);
}
private void setupRequestorCisBean(){
IIdentity requestorId = new MyIdentity(IdentityType.CSS, "me","domain.com");
IIdentity cisId = new MyIdentity(IdentityType.CIS, "Holidays", "domain.com");
this.requestorCisBean = new RequestorCisBean();
requestorCisBean.setRequestorId(requestorId.getJid());
requestorCisBean.setCisRequestorId(cisId.getJid());
}
private void setupRequestorCisObject(){
IIdentity requestorId = new MyIdentity(IdentityType.CSS, "me","domain.com");
IIdentity cisId = new MyIdentity(IdentityType.CIS, "Holidays", "domain.com");
this.requestorCis = new RequestorCis(requestorId,cisId);
}
private RequestPolicy getServicePolicy(){
RequestPolicy policy = this.getPolicyWithoutRequestor();
policy.setRequestor(requestorServiceBean);
return policy;
}
private RequestPolicy getCisPolicy(){
RequestPolicy policy = this.getPolicyWithoutRequestor();
policy.setRequestor(requestorCisBean);
return policy;
}
private RequestPolicy getPolicyWithoutRequestor(){
/*
* location requestItem
*/
Resource rLocation = new Resource();
rLocation.setScheme(DataIdentifierScheme.CONTEXT);
rLocation.setDataType(CtxAttributeTypes.LOCATION_SYMBOLIC);
RequestItem itemLocation = new RequestItem();
itemLocation.setResource(rLocation);
itemLocation.setActions(actions);
itemLocation.setConditions(conditions);
/*
* status requestItem
*/
Resource rStatus = new Resource();
rStatus.setScheme(DataIdentifierScheme.CONTEXT);
rStatus.setDataType(CtxAttributeTypes.STATUS);
RequestItem itemStatus = new RequestItem();
itemStatus.setResource(rStatus);
itemStatus.setActions(actions);
itemStatus.setConditions(conditions);
/* ----------------------------------------------------*/
List<RequestItem> requests = new ArrayList<RequestItem>();
requests.add(itemLocation);
requests.add(itemStatus);
RequestPolicy policy = new RequestPolicy();
policy.setPrivacyPolicyType(PrivacyPolicyTypeConstants.SERVICE);
policy.setRequestItems(requests);
return policy;
}
private void setupContext(){
this.userId = new MyIdentity(IdentityType.CSS, "xcmanager","societies.local");
CtxEntityIdentifier ctxId = new CtxEntityIdentifier(userId.getJid(), "Person", new Long(1));
this.userCtxEntity = new IndividualCtxEntity(ctxId);
ctxLocationAttributeId = new CtxAttributeIdentifier(userCtxEntity.getId(), CtxAttributeTypes.LOCATION_SYMBOLIC, new Long(1));
ctxLocationAttributeId.setScheme(DataIdentifierScheme.CONTEXT);
locationAttribute = new CtxAttribute(ctxLocationAttributeId);
locationAttribute.setStringValue("home");
ctxStatusAttributeId = new CtxAttributeIdentifier(userCtxEntity.getId(), CtxAttributeTypes.STATUS, new Long(1));
ctxStatusAttributeId.setScheme(DataIdentifierScheme.CONTEXT);
statusAttribute = new CtxAttribute(ctxStatusAttributeId);
statusAttribute.setStringValue("busy");
userCtxEntity.addAttribute(locationAttribute);
userCtxEntity.addAttribute(statusAttribute);
}
}