/**
* 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.api.privacytrust.privacy.util.privacypolicy;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.societies.api.context.model.CtxAttributeTypes;
import org.societies.api.identity.util.RequestorUtils;
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.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.PrivacyPolicyBehaviourConstants;
import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.RequestItem;
import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.RequestPolicy;
/**
* @author Olivier Maridat (Trialog)
*
*/
public class PrivacyPolicyUtilsTest {
private static Logger LOG = LoggerFactory.getLogger(PrivacyPolicyUtilsTest.class.getName());
private RequestPolicy privacyPolicy;
private RequestPolicy privacyPolicyWithoutRequestor;
private String privacyPolicyWithoutRequestorString;
@Before
public void setUp() {
RequestorBean requestor = RequestorUtils.create("emma.ict-societies.local", "cis-test.ict-societies.local");
List<Condition> conditions1 = new ArrayList<Condition>();
conditions1.add(ConditionUtils.create(ConditionConstants.SHARE_WITH_3RD_PARTIES, "Yes"));
List<Condition> conditions2 = new ArrayList<Condition>();
conditions2.add(ConditionUtils.create(ConditionConstants.SHARE_WITH_3RD_PARTIES, "Yes"));
conditions2.add(ConditionUtils.create(ConditionConstants.MAY_BE_INFERRED, "Yes"));
privacyPolicyWithoutRequestorString = "<RequestPolicy>"+
/* There is an expected issue in <subject></subject>. The CIS ID is badly formatted. This should return a null Requestor and not failed. */
"<Subject>"+
" <Attribute AttributeId=\"urn:oasis:names:tc:xacml:1.0:subject:subject-id\""+
" DataType=\"org.societies.api.identity.IIdentity\">"+
" <AttributeValue>othercss@societies.local</AttributeValue>"+
" </Attribute>"+
" <Attribute AttributeId=\"CisId\""+
" DataType=\"org.societies.api.identity.IIdentity\">"+
" <AttributeValue>onecis.societies.local</AttributeValue>"+
" </Attribute></Subject>"+
"<Target>"+
"<Resource>"+
" <Attribute AttributeId=\"contextType\""+
" DataType=\"http://www.w3.org/2001/XMLSchema#string\">"+
" <AttributeValue>fdsfsf</AttributeValue>"+
" </Attribute>"+
"</Resource>"+
"<Action>"+
" <Attribute AttributeId=\"urn:oasis:names:tc:xacml:1.0:action:action-id\" "+
" DataType=\"org.societies.api.internal.privacytrust.privacyprotection.model.privacypolicy.constants.ActionConstants\">"+
" <AttributeValue>WRITE</AttributeValue>"+
" </Attribute>"+
"<optional>false</optional>"+
"</Action>"+
"<Condition>"+
" <Attribute AttributeId=\"urn:oasis:names:tc:xacml:1.0:action:condition-id\" "+
" DataType=\"org.societies.api.internal.privacytrust.privacyprotection.model.privacypolicy.constants.ConditionConstants\">"+
" <AttributeValue DataType=\"SHARE_WITH_3RD_PARTIES\">dfsdf</AttributeValue>"+
" </Attribute>"+
"<optional>true</optional>"+
"</Condition>"+
"<Condition>"+
" <Attribute AttributeId=\"urn:oasis:names:tc:xacml:1.0:action:condition-id\" "+
" DataType=\"org.societies.api.internal.privacytrust.privacyprotection.model.privacypolicy.constants.ConditionConstants\">"+
" <AttributeValue DataType=\"DATA_RETENTION_IN_MINUTES\">412</AttributeValue>"+
" </Attribute>"+
"<optional>true</optional>"+
"</Condition>"+
"<optional>false</optional>"+
"</Target></RequestPolicy>";
privacyPolicyWithoutRequestor = RequestPolicyUtils.createList(null,
RequestItemUtils.create(ResourceUtils.create(DataIdentifierScheme.CONTEXT, CtxAttributeTypes.ACTION),
ActionUtils.createList(ActionConstants.READ),
conditions1),
RequestItemUtils.create(ResourceUtils.create(DataIdentifierScheme.CONTEXT, CtxAttributeTypes.LOCATION_COORDINATES),
ActionUtils.createList(ActionConstants.READ),
conditions2)
);
privacyPolicy = RequestPolicyUtils.createList(requestor,
RequestItemUtils.create(ResourceUtils.create(DataIdentifierScheme.CONTEXT, CtxAttributeTypes.ACTION),
ActionUtils.createList(ActionConstants.READ),
conditions1),
RequestItemUtils.create(ResourceUtils.create(DataIdentifierScheme.CONTEXT, CtxAttributeTypes.LOCATION_COORDINATES),
ActionUtils.createList(ActionConstants.READ),
conditions2)
);
}
@Test
public void testFromXacmlStringNull() {
String testTitle = "FromXacmlNull";
LOG.info(testTitle);
RequestPolicy privacyPolicy1 = null;
RequestPolicy privacyPolicy2 = null;
try {
privacyPolicy1 = PrivacyPolicyUtils.fromXacmlString("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
privacyPolicy2 = PrivacyPolicyUtils.fromXacmlString("");
}
catch (Exception e) {
LOG.info("[Test Exception] "+testTitle+": "+e.getMessage(), e);
fail("[Error testFromXmlNull] "+testTitle+": "+e.getMessage());
}
assertNull("Privacy policy (only header) should be null", privacyPolicy1);
assertNull("Privacy policy should be null", privacyPolicy2);
}
@Test
public void testFromXacmlString() {
String testTitle = "testFromXacmlString: generated a RequestPolicy from a XML privacy policy";
LOG.info(testTitle);
RequestPolicy retrievedPrivacyPolicy = null;
RequestPolicy retrievedPrivacyPolicyWithoutRequestor = null;
RequestPolicy retrievedPrivacyPolicyWithoutRequestorString = null;
try {
retrievedPrivacyPolicy = PrivacyPolicyUtils.fromXacmlString(RequestPolicyUtils.toXmlString(privacyPolicy));
retrievedPrivacyPolicyWithoutRequestor = PrivacyPolicyUtils.fromXacmlString(RequestPolicyUtils.toXmlString(privacyPolicyWithoutRequestor));
retrievedPrivacyPolicyWithoutRequestorString = PrivacyPolicyUtils.fromXacmlString(privacyPolicyWithoutRequestorString);
}
catch (Exception e) {
LOG.error("[Test Exception] "+testTitle, e);
fail("Error "+e.getMessage()+": "+testTitle);
}
// -- Privacy Policy with Requestor
assertNotNull("Privacy policy generated should not be null", retrievedPrivacyPolicy);
assertNotNull("Privacy policy original should not be null", privacyPolicy);
// LOG.debug("**** Original XML privacy policy ****");
// LOG.debug(RequestPolicyUtils.toXmlString(privacyPolicy));
// LOG.debug("**** Generated RequestPolicy ****");
// LOG.debug(RequestPolicyUtils.toXmlString(retrievedPrivacyPolicy));
assertEquals("Privacy policy generated (xml) not equal to the original policy", RequestPolicyUtils.toXmlString(privacyPolicy), RequestPolicyUtils.toXmlString(retrievedPrivacyPolicy));
// Class
assertEquals("Privacy policy generated not same class as the original policy", privacyPolicy.getClass(), retrievedPrivacyPolicy.getClass());
// Requestor
assertTrue("Privacy policy generated and the original policy: not the same requestor", RequestorUtils.equal(privacyPolicy.getRequestor(), retrievedPrivacyPolicy.getRequestor()));
// Request Items
assertEquals("Privacy policy generated and the original policy: not the same request items size", privacyPolicy.getRequestItems().size(), retrievedPrivacyPolicy.getRequestItems().size());
for(int i=0; i<retrievedPrivacyPolicy.getRequestItems().size(); i++) {
assertTrue("Privacy policy generated and the original policy: not the same request item "+i, RequestItemUtils.equal(privacyPolicy.getRequestItems().get(i), retrievedPrivacyPolicy.getRequestItems().get(i)));
}
assertTrue("Privacy policy generated and the original policy: not the same request items", RequestItemUtils.equal(privacyPolicy.getRequestItems(), retrievedPrivacyPolicy.getRequestItems()));
// All
assertTrue("Privacy policy generated not equal to the original policy", RequestPolicyUtils.equal(privacyPolicy, retrievedPrivacyPolicy));
// -- Privacy Policy without Requestor
assertNotNull("Privacy policy generated should not be null (2)", retrievedPrivacyPolicyWithoutRequestor);
assertNotNull("Privacy policy original should not be null (2)", privacyPolicyWithoutRequestor);
// LOG.info("**** Original XML privacy policy ****");
// LOG.info(RequestPolicyUtils.toXmlString(privacyPolicyWithoutRequestor));
// LOG.info("**** Generated RequestPolicy ****");
// LOG.info(RequestPolicyUtils.toXmlString(retrievedPrivacyPolicyWithoutRequestor));
assertEquals("Privacy policy generated (xml) not equal to the original policy (2)", RequestPolicyUtils.toXmlString(privacyPolicyWithoutRequestor), RequestPolicyUtils.toXmlString(retrievedPrivacyPolicyWithoutRequestor));
// Class
assertEquals("Privacy policy generated not same class as the original policy (2)", privacyPolicyWithoutRequestor.getClass(), retrievedPrivacyPolicyWithoutRequestor.getClass());
// Requestor
assertNull("Privacy policy generated should have a null requestor (2)", retrievedPrivacyPolicyWithoutRequestor.getRequestor());
assertTrue("Privacy policy generated and the original policy: not the same requestor (2)", RequestorUtils.equal(privacyPolicyWithoutRequestor.getRequestor(), retrievedPrivacyPolicyWithoutRequestor.getRequestor()));
// Request Items
assertEquals("Privacy policy generated and the original policy: not the same request items size (2)", privacyPolicyWithoutRequestor.getRequestItems().size(), retrievedPrivacyPolicyWithoutRequestor.getRequestItems().size());
for(int i=0; i<retrievedPrivacyPolicy.getRequestItems().size(); i++) {
assertTrue("Privacy policy generated and the original policy: not the same request item (2)"+i, RequestItemUtils.equal(privacyPolicyWithoutRequestor.getRequestItems().get(i), retrievedPrivacyPolicyWithoutRequestor.getRequestItems().get(i)));
}
assertTrue("Privacy policy generated and the original policy: not the same request items (2)", RequestItemUtils.equal(privacyPolicyWithoutRequestor.getRequestItems(), retrievedPrivacyPolicyWithoutRequestor.getRequestItems()));
// All
assertTrue("Privacy policy generated not equal to the original policy (2)", RequestPolicyUtils.equal(privacyPolicyWithoutRequestor, retrievedPrivacyPolicyWithoutRequestor));
// -- Privacy Policy without Requestor (originaly a string)
assertNotNull("Privacy policy generated should not be null (3)", retrievedPrivacyPolicyWithoutRequestorString);
assertNotNull("Privacy policy original should not be null (3)", privacyPolicyWithoutRequestorString);
LOG.info("**** Original XML privacy policy ****");
LOG.info(privacyPolicyWithoutRequestorString);
LOG.info("**** Generated RequestPolicy ****");
LOG.info(RequestPolicyUtils.toXmlString(retrievedPrivacyPolicyWithoutRequestorString));
// Requestor
assertNull("Privacy policy generated should have a null requestor (3)", retrievedPrivacyPolicyWithoutRequestorString.getRequestor());
}
@Test
public void testGetDataTypesWithScheme() {
RequestPolicy privacyPolicy = null;
DataIdentifierScheme schemeFilter = DataIdentifierScheme.CONTEXT;
// -- Null Privacy Policy
List<String> dataTypes = PrivacyPolicyUtils.getDataTypes(schemeFilter, privacyPolicy);
assertNull("Data type list of an null privacy policy should be null", dataTypes);
// -- Empty Privacy Policy
privacyPolicy = new RequestPolicy();
dataTypes = PrivacyPolicyUtils.getDataTypes(schemeFilter, privacyPolicy);
assertNull("Data type list of an empty privacy policy should be null", dataTypes);
// -- Privacy Policy
List<RequestItem> requestItems = new ArrayList<RequestItem>();
List<Condition> conditions = new ArrayList<Condition>();
conditions.add(ConditionUtils.create(ConditionConstants.SHARE_WITH_3RD_PARTIES, "Yes"));
requestItems.add(RequestItemUtils.create(ResourceUtils.create(DataIdentifierScheme.CONTEXT, CtxAttributeTypes.ABOUT), ActionUtils.createList(ActionConstants.READ), conditions));
privacyPolicy.setRequestItems(requestItems);
dataTypes = PrivacyPolicyUtils.getDataTypes(schemeFilter, privacyPolicy);
assertNotNull("Data type list of an empty privacy policy should be null", dataTypes);
}
@Test
public void testInferCisPrivacyPolicy() {
String testTitle = "InferCisPrivacyPolicy: create a pre-privacy policy";
LOG.info(testTitle);
RequestPolicy privacyPolicyPrivate = null;
RequestPolicy privacyPolicyMembersOnly = null;
RequestPolicy privacyPolicyPublic = null;
try {
privacyPolicyPrivate = PrivacyPolicyUtils.inferCisPrivacyPolicy(PrivacyPolicyBehaviourConstants.PRIVATE, null);
privacyPolicyMembersOnly = PrivacyPolicyUtils.inferCisPrivacyPolicy(PrivacyPolicyBehaviourConstants.MEMBERS_ONLY, null);
privacyPolicyPublic = PrivacyPolicyUtils.inferCisPrivacyPolicy(PrivacyPolicyBehaviourConstants.PUBLIC, null);
} catch (PrivacyException e) {
LOG.error("[Test Exception] "+testTitle, e);
fail("Error "+e.getMessage()+": "+testTitle);
}
assertNotNull("Private privacy policy should not be null", privacyPolicyPrivate);
assertNotNull("Members only privacy policy should not be null", privacyPolicyMembersOnly);
assertNotNull("Public privacy policy should not be null", privacyPolicyPublic);
// Log.debug("Private privacy policy: "+PrivacyPolicyUtils.toXacmlString(privacyPolicyPrivate)+"\n*******");
// Log.debug("Members only privacy policy: "+PrivacyPolicyUtils.toXacmlString(privacyPolicyMembersOnly)+"\n*******");
// Log.debug("Public privacy policy: "+PrivacyPolicyUtils.toXacmlString(privacyPolicyPublic)+"\n*******");
}
}