/**
* Copyright (c) 2011, SOCIETIES Consortium
* 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.test.datamanagement.util;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
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.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.societies.api.context.model.CtxAttributeTypes;
import org.societies.api.context.model.MalformedCtxIdentifierException;
import org.societies.api.identity.IIdentity;
import org.societies.api.identity.IdentityType;
import org.societies.api.identity.Requestor;
import org.societies.api.identity.RequestorCis;
import org.societies.api.identity.util.DataIdentifierFactory;
import org.societies.api.privacytrust.privacy.model.PrivacyException;
import org.societies.api.privacytrust.privacy.model.privacypolicy.Action;
import org.societies.api.privacytrust.privacy.model.privacypolicy.Condition;
import org.societies.api.privacytrust.privacy.model.privacypolicy.Decision;
import org.societies.api.privacytrust.privacy.model.privacypolicy.RequestItem;
import org.societies.api.privacytrust.privacy.model.privacypolicy.Resource;
import org.societies.api.privacytrust.privacy.model.privacypolicy.ResponseItem;
import org.societies.api.privacytrust.privacy.model.privacypolicy.constants.ActionConstants;
import org.societies.api.privacytrust.privacy.util.privacypolicy.ActionUtils;
import org.societies.api.schema.identity.DataIdentifier;
import org.societies.api.schema.identity.DataIdentifierScheme;
import org.societies.privacytrust.privacyprotection.api.IPrivacyDataManagerInternal;
import org.societies.util.commonmock.MockIdentity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* @author Olivier Maridat (Trialog)
*
*/
// Run this test case using Spring jUnit
@RunWith(SpringJUnit4ClassRunner.class)
// Search context configuration file in classpath:<ClassName>-context.xml
@ContextConfiguration(locations = { "../PrivacyDataManagerInternalTest-context.xml" })
public class PrivacyDataManagerInternalDeprecationTest extends AbstractTransactionalJUnit4SpringContextTests {
private static Logger LOG = LoggerFactory.getLogger(PrivacyDataManagerInternalDeprecationTest.class.getSimpleName());
@Autowired
IPrivacyDataManagerInternal privacyDataManagerInternal;
// -- Mocked data
private DataIdentifier dataId;
private Requestor requestor;
private Requestor requestorCis;
@Before
public void setUp() throws Exception {
// Requestor
IIdentity myCssId = new MockIdentity(IdentityType.CSS, "mycss","societies.local");
IIdentity requestorId = new MockIdentity(IdentityType.CSS, "othercss","societies.local");
IIdentity requestorCisId = new MockIdentity(IdentityType.CIS, "cis-one", "societies.local");
requestor = new Requestor(requestorId);
requestorCis = new RequestorCis(requestorId, requestorCisId);
// Data Id
try {
dataId = DataIdentifierFactory.fromUri(DataIdentifierScheme.CONTEXT+"://"+myCssId.getJid()+"/ENTITY/person/1/ATTRIBUTE/name/13");
}
catch (MalformedCtxIdentifierException e) {
LOG.error("setUp(): DataId creation error "+e.getMessage()+"\n", e);
fail("setUp(): DataId creation error "+e.getMessage());
}
}
@After
public void tearDown() throws Exception {
// privacyDataManagerInternal = null;
}
@Test(expected = PrivacyException.class)
@Rollback(true)
public void testUpdatePermissionNoActions() throws PrivacyException {
String testTitle = new String("testUpdatePermission: with an empty action list");
LOG.info("[Test] "+testTitle);
boolean dataUpdated = false;
List<Action> actions = new ArrayList<Action>();
Decision permission = Decision.PERMIT;
dataUpdated = privacyDataManagerInternal.updatePermission(requestor, dataId, actions, permission);
assertFalse("Data has been updated but should not", dataUpdated);
}
@Test
@Rollback(true)
public void testUpdatePermission() {
String testTitle = new String("testUpdatePermission");
LOG.info("[Test] "+testTitle);
boolean dataUpdated = false;
try {
List<Action> actions = new ArrayList<Action>();
actions.add(new Action(ActionConstants.READ));
Decision permission = Decision.PERMIT;
dataUpdated = privacyDataManagerInternal.updatePermission(requestor, dataId, actions, permission);
} catch (PrivacyException e) {
LOG.info("[Test PrivacyException] "+testTitle, e);
fail("[Error "+testTitle+"] Privacy error: "+e.getMessage());
} catch (Exception e) {
LOG.info("[Test PrivacyException] "+testTitle, e);
fail("[Error "+testTitle+"] error: "+e.getMessage());
}
assertTrue("Data not updated", dataUpdated);
}
/**
* Test method for {@link org.societies.privacytrust.privacyprotection.datamanagement.PrivacyDataManagerInternal#updatePermissions(org.societies.api.identity.Requestor, org.societies.api.identity.IIdentity, org.societies.api.identity.IIdentity)}.
*/
@Test
@Rollback(true)
public void testUpdatePermission2Times() {
String testTitle = new String("testUpdatePermission2Times");
LOG.info("[Test] "+testTitle);
boolean dataUpdated1 = false;
boolean dataUpdated2 = false;
try {
List<Action> actions = new ArrayList<Action>();
actions.add(new Action(ActionConstants.READ));
Decision permission = Decision.PERMIT;
dataUpdated1 = privacyDataManagerInternal.updatePermission(requestorCis, dataId, actions, permission);
dataUpdated2 = privacyDataManagerInternal.updatePermission(requestorCis, dataId, actions, permission);
} catch (PrivacyException e) {
LOG.info("[Test PrivacyException] "+testTitle, e);
fail("[Error "+testTitle+"] Privacy error: "+e.getMessage());
} catch (Exception e) {
LOG.info("[Test PrivacyException] "+testTitle, e);
fail("[Error "+testTitle+"] error: "+e.getMessage());
}
assertTrue("Data not updated", dataUpdated1);
assertTrue("Data not updated the second time", dataUpdated2);
}
/**
* Test method for {@link org.societies.privacytrust.privacyprotection.datamanagement.PrivacyDataManagerInternal#updatePermissions(org.societies.api.identity.Requestor, java.lang.String, org.societies.api.identity.IIdentity, org.societies.api.schema.privacytrust.privacy.model.privacypolicy.privacyprotection.model.privacypolicy.ResponseItem)}.
* Using ResponseItem
*/
@Test
@Rollback(true)
public void testUpdatePermissionResponseItem() {
String testTitle = new String("testUpdatePermissionResponseItem");
LOG.info("[Test] "+testTitle);
boolean dataUpdated = false;
try {
List<Action> actions = new ArrayList<Action>();
actions.add(new Action(ActionConstants.READ));
Decision decision = Decision.PERMIT;
Resource resource = new Resource(dataId);
RequestItem requestItem = new RequestItem(resource, actions, new ArrayList<Condition>());
ResponseItem permission = new ResponseItem(requestItem, decision);
dataUpdated = privacyDataManagerInternal.updatePermission(requestorCis, permission);
} catch (PrivacyException e) {
LOG.info("[Test PrivacyException] "+testTitle, e);
fail("[Error "+testTitle+"] Privacy error: "+e.getMessage());
} catch (Exception e) {
LOG.info("[Test PrivacyException] "+testTitle, e);
fail("[Error "+testTitle+"] error: "+e.getMessage());
}
assertTrue("Data not updated", dataUpdated);
}
/**
* Test method for {@link org.societies.privacytrust.privacyprotection.datamanagement.PrivacyDataManagerInternal#updatePermissions(org.societies.api.identity.Requestor, java.lang.String, org.societies.api.identity.IIdentity, org.societies.api.schema.privacytrust.privacy.model.privacypolicy.privacyprotection.model.privacypolicy.ResponseItem)}.
* Using ResponseItem
*/
@Test
@Rollback(true)
public void testUpdatePermissionResponseItemDataType() {
String testTitle = new String("testUpdatePermissionResponseItemDataType: update a privacy permission with data type");
LOG.info("[Test] "+testTitle);
boolean dataUpdated = false;
try {
List<Action> actions = new ArrayList<Action>();
actions.add(new Action(ActionConstants.READ));
Decision decision = Decision.PERMIT;
Resource resource = new Resource(DataIdentifierScheme.CONTEXT,CtxAttributeTypes.LOCATION_SYMBOLIC);
RequestItem requestItem = new RequestItem(resource, actions, new ArrayList<Condition>());
ResponseItem permission = new ResponseItem(requestItem, decision);
dataUpdated = privacyDataManagerInternal.updatePermission(requestorCis, permission);
} catch (PrivacyException e) {
LOG.info("[Test PrivacyException] "+testTitle, e);
fail("[Error "+testTitle+"] Privacy error: "+e.getMessage());
} catch (Exception e) {
LOG.info("[Test PrivacyException] "+testTitle, e);
fail("[Error "+testTitle+"] error: "+e.getMessage());
}
assertTrue("Data has not been updated", dataUpdated);
}
@Test
@Rollback(true)
public void testGetPermission1Action() {
String testTitle = new String("testGetPermission: only 1 action");
LOG.info("[Test] "+testTitle);
boolean dataUpdated = false;
List<org.societies.api.schema.privacytrust.privacy.model.privacypolicy.ResponseItem> responseItems = null;
Decision permission = Decision.PERMIT;
List<Action> actions = new ArrayList<Action>();
actions.add(new Action(ActionConstants.READ));
try {
dataUpdated = privacyDataManagerInternal.updatePermission(requestorCis, dataId, actions, permission);
responseItems = privacyDataManagerInternal.getPermissions(requestorCis, dataId, actions);
} catch (PrivacyException e) {
LOG.info("[Test PrivacyException] "+testTitle, e);
fail("[Error "+testTitle+"] Privacy error: "+e);
} catch (Exception e) {
LOG.info("[Test PrivacyException] "+testTitle, e);
fail("[Error "+testTitle+"] error: "+e);
}
assertTrue("Data not updated", dataUpdated);
assertNotNull("ResponseItem permission can't be retrieved", responseItems);
assertTrue("ResponseItem permission can't be retrieved", responseItems.size() > 0);
assertEquals("Permission result not as expected", permission.name(), responseItems.get(0).getDecision().name());
assertTrue("Permission action list not as expected", ActionUtils.equal(ActionUtils.toActionBeans(actions), responseItems.get(0).getRequestItem().getActions()));
}
@Test
@Rollback(true)
public void testGetPermission3Actions() {
String testTitle = new String("testGetPermission: 3 actions with 1 optional");
LOG.info("[Test] "+testTitle);
boolean dataUpdated = false;
List<org.societies.api.schema.privacytrust.privacy.model.privacypolicy.ResponseItem> responseItems = null;
List<Action> actions = new ArrayList<Action>();
actions.add(new Action(ActionConstants.READ));
actions.add(new Action(ActionConstants.WRITE));
actions.add(new Action(ActionConstants.CREATE, true));
Decision permission = Decision.PERMIT;
try {
dataUpdated = privacyDataManagerInternal.updatePermission(requestorCis, dataId, actions, permission);
responseItems = privacyDataManagerInternal.getPermissions(requestorCis, dataId, actions);
} catch (PrivacyException e) {
LOG.info("[Test PrivacyException] "+testTitle, e);
fail("[Error "+testTitle+"] Privacy error: "+e.getMessage());
} catch (Exception e) {
LOG.info("[Test PrivacyException] "+testTitle, e);
fail("[Error "+testTitle+"] error: "+e.getMessage());
}
assertTrue("Data not updated", dataUpdated);
assertNotNull("ResponseItem permission can't be retrieved", responseItems);
assertTrue("ResponseItem permission can't be retrieved", responseItems.size() > 0);
assertEquals("Permission result not as expected", permission.name(), responseItems.get(0).getDecision().name());
assertTrue("Permission action list not as expected", ActionUtils.equal(ActionUtils.toActionBeans(actions), responseItems.get(0).getRequestItem().getActions()));
}
@Test
@Rollback(true)
public void testGetPermission3ActionsInverse() {
String testTitle = new String("testGetPermission: 3 actions with 1 optional, different order between update and get");
LOG.info("[Test] "+testTitle);
boolean dataUpdated = false;
List<org.societies.api.schema.privacytrust.privacy.model.privacypolicy.ResponseItem> responseItems = null;
List<Action> actions1 = new ArrayList<Action>();
actions1.add(new Action(ActionConstants.WRITE));
actions1.add(new Action(ActionConstants.READ));
actions1.add(new Action(ActionConstants.CREATE, true));
List<Action> actions2 = new ArrayList<Action>();
actions2.add(new Action(ActionConstants.CREATE, true));
actions2.add(new Action(ActionConstants.READ));
actions2.add(new Action(ActionConstants.WRITE));
Decision permission = Decision.PERMIT;
try {
dataUpdated = privacyDataManagerInternal.updatePermission(requestorCis, dataId, actions1, permission);
responseItems = privacyDataManagerInternal.getPermissions(requestorCis, dataId, actions2);
} catch (PrivacyException e) {
LOG.info("[Test PrivacyException] "+testTitle, e);
fail("[Error "+testTitle+"] Privacy error: "+e.getMessage());
} catch (Exception e) {
LOG.info("[Test PrivacyException] "+testTitle, e);
fail("[Error "+testTitle+"] error: "+e.getMessage());
}
assertTrue("Data not updated", dataUpdated);
assertNotNull("ResponseItem permission can't be retrieved", responseItems);
assertTrue("ResponseItem permission can't be retrieved", responseItems.size() > 0);
assertEquals("Permission result not as expected", permission.name(), responseItems.get(0).getDecision().name());
assertTrue("Permission action list not as expected", ActionUtils.equal(ActionUtils.toActionBeans(actions1), responseItems.get(0).getRequestItem().getActions()));
}
@Test
@Rollback(true)
public void testGetPermissionPreviouslyAddedRequestorCisError() {
String testTitle = new String("testGetPermission: 2 actions, PERMIT for requestor so must be deny for requestorCis");
LOG.info("[Test] "+testTitle);
boolean dataDeleted = false;
boolean dataUpdated = false;
List<org.societies.api.schema.privacytrust.privacy.model.privacypolicy.ResponseItem> responseItems = null;
List<Action> actions = new ArrayList<Action>();
actions.add(new Action(ActionConstants.READ));
actions.add(new Action(ActionConstants.WRITE));
Decision permission = Decision.PERMIT;
try {
dataDeleted = privacyDataManagerInternal.deletePermission(requestorCis, dataId, actions);
dataUpdated = privacyDataManagerInternal.updatePermission(requestor, dataId, actions, permission);
responseItems = privacyDataManagerInternal.getPermissions(requestorCis, dataId, actions);
} catch (PrivacyException e) {
LOG.info("[Test PrivacyException] "+testTitle, e);
fail("[Error "+testTitle+"] Privacy error: "+e);
} catch (Exception e) {
LOG.info("[Test PrivacyException] "+testTitle, e);
fail("[Error "+testTitle+"] error: "+e);
}
assertTrue("Data not deleted", dataDeleted);
assertTrue("Data not updated", dataUpdated);
assertNull("ResponseItem permission should not be retrieved", responseItems);
}
/**
* Test method for {@link org.societies.privacytrust.privacyprotection.datamanagement.PrivacyDataManagerInternal#deletePermissionsorg.societies.api.identity.Requestor, org.societies.api.identity.IIdentity, org.societies.api.identity.IIdentity)}.
*/
@Test
@Rollback(true)
public void testDeletePermission() {
String testTitle = new String("testDeletePermission");
LOG.info("[Test] "+testTitle);
boolean dataUpdated = false;
boolean dataDeleted = false;
List<org.societies.api.schema.privacytrust.privacy.model.privacypolicy.ResponseItem> responseItems = null;
try {
List<Action> actions = new ArrayList<Action>();
actions.add(new Action(ActionConstants.READ));
Decision permission = Decision.PERMIT;
dataUpdated = privacyDataManagerInternal.updatePermission(requestorCis, dataId, actions, permission);
dataDeleted = privacyDataManagerInternal.deletePermissions(requestorCis, dataId);
responseItems = privacyDataManagerInternal.getPermissions(requestorCis, dataId, actions);
} catch (PrivacyException e) {
LOG.info("[Test PrivacyException] "+testTitle, e);
fail("[Error "+testTitle+"] Privacy error: "+e.getMessage());
} catch (Exception e) {
LOG.info("[Test PrivacyException] "+testTitle, e);
fail("[Error "+testTitle+"] error: "+e.getMessage());
}
assertTrue("Privacy permission not added", dataUpdated);
assertTrue("Privacy permission not deleted", dataDeleted);
assertNull("ResponseItem permission still available", responseItems);
}
/* --- Dependency Injection -- */
public void setPrivacyDataManagerInternal(
IPrivacyDataManagerInternal privacyDataManagerInternal) {
this.privacyDataManagerInternal = privacyDataManagerInternal;
LOG.info("[Dependency Injection] PrivacyDataManagerInternal injected");
}
}