/**
* 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.trust.test;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.societies.api.privacytrust.trust.evidence.TrustEvidenceType;
import org.societies.api.privacytrust.trust.model.TrustValueType;
import org.societies.api.privacytrust.trust.model.TrustedEntityId;
import org.societies.api.privacytrust.trust.model.TrustedEntityType;
import org.societies.privacytrust.trust.api.ITrustNodeMgr;
import org.societies.privacytrust.trust.api.engine.IIndirectTrustEngine;
import org.societies.privacytrust.trust.api.evidence.model.ITrustEvidence;
import org.societies.privacytrust.trust.api.evidence.repo.ITrustEvidenceRepository;
import org.societies.privacytrust.trust.api.model.ITrustedCss;
import org.societies.privacytrust.trust.api.model.ITrustedEntity;
import org.societies.privacytrust.trust.api.model.ITrustedService;
import org.societies.privacytrust.trust.api.repo.ITrustRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* Describe your class here...
*
* @author <a href="mailto:nicolas.liampotis@cn.ntua.gr">Nicolas Liampotis</a> (ICCS)
* @since 1.1
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:META-INF/spring/IndirectTrustEngineTest-context.xml"})
public class IndirectTrustEngineTest {
private static double DELTA = 0.000001d;
private static final String BASE_ID = "itet";
private static final String TRUSTOR_CSS_ID = BASE_ID + "TrustorCssIIdentity";
private static final int TRUSTEE_CSS_LIST_SIZE = 100;
private static final String TRUSTEE_CSS_ID_BASE = BASE_ID + "TrusteeCssIIdentity";
private static final int TRUSTEE_CIS_LIST_SIZE = 10;
private static final String TRUSTEE_CIS_ID_BASE = BASE_ID + "TrusteeCisIIdentity";
private static final int TRUSTEE_SERVICE_LIST_SIZE = 200;
private static final String TRUSTEE_SERVICE_ID_BASE = BASE_ID + "TrusteeServiceResourceIdentifier";
private static final int TRUSTEE_SERVICE_TYPE_LIST_SIZE = 10;
private static final String TRUSTEE_SERVICE_TYPE_BASE = BASE_ID + "TrusteeServiceType";
private static TrustedEntityId myCssTeid;
private static List<TrustedEntityId> trusteeCssTeidList;
private static List<TrustedEntityId> trusteeCisTeidList;
private static List<TrustedEntityId> trusteeServiceTeidList;
private static List<String> trusteeServiceTypeList;
/** The IIndirectTrustEngine service reference. */
@Autowired
@InjectMocks
private IIndirectTrustEngine engine;
/** The ITrustRepository service reference. */
@Autowired
private ITrustRepository trustRepo;
/** The ITrustEvidenceRepository service reference. */
@Autowired
private ITrustEvidenceRepository trustEvidenceRepo;
@Mock
private ITrustNodeMgr mockTrustNodeMgr;
/**
* @throws java.lang.Exception
*/
@BeforeClass
public static void setUpBeforeClass() throws Exception {
myCssTeid = new TrustedEntityId(TrustedEntityType.CSS, TRUSTOR_CSS_ID);
trusteeCssTeidList = new ArrayList<TrustedEntityId>(TRUSTEE_CSS_LIST_SIZE);
for (int i = 0; i < TRUSTEE_CSS_LIST_SIZE; ++i) {
final TrustedEntityId cssTeid =
new TrustedEntityId(TrustedEntityType.CSS, TRUSTEE_CSS_ID_BASE+i);
trusteeCssTeidList.add(cssTeid);
}
trusteeCisTeidList = new ArrayList<TrustedEntityId>(TRUSTEE_CIS_LIST_SIZE);
for (int i = 0; i < TRUSTEE_CIS_LIST_SIZE; ++i) {
final TrustedEntityId cisTeid =
new TrustedEntityId(TrustedEntityType.CIS, TRUSTEE_CIS_ID_BASE+i);
trusteeCisTeidList.add(cisTeid);
}
trusteeServiceTypeList = new ArrayList<String>(TRUSTEE_SERVICE_TYPE_LIST_SIZE);
for (int i = 0; i < TRUSTEE_SERVICE_TYPE_LIST_SIZE; ++i)
trusteeServiceTypeList.add(TRUSTEE_SERVICE_TYPE_BASE+i);
trusteeServiceTeidList = new ArrayList<TrustedEntityId>(TRUSTEE_SERVICE_LIST_SIZE);
for (int i = 0; i < TRUSTEE_SERVICE_LIST_SIZE; ++i) {
final TrustedEntityId serviceTeid =
new TrustedEntityId(TrustedEntityType.SVC, TRUSTEE_SERVICE_ID_BASE+i);
trusteeServiceTeidList.add(serviceTeid);
}
}
/**
* @throws java.lang.Exception
*/
@AfterClass
public static void tearDownAfterClass() throws Exception {
myCssTeid = null;
trusteeCssTeidList = null;
trusteeCisTeidList = null;
trusteeServiceTypeList = null;
trusteeServiceTeidList = null;
}
/**
* @throws java.lang.Exception
*/
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
final Collection<TrustedEntityId> myIds = new HashSet<TrustedEntityId>();
myIds.add(myCssTeid);
when(mockTrustNodeMgr.getMyIds()).thenReturn(myIds);
}
/**
* @throws java.lang.Exception
*/
@After
public void tearDown() throws Exception {
// clean trust database
this.trustRepo.removeEntities(null, null, null);
// clean trust evidence database
this.trustEvidenceRepo.removeEvidence(null, null, null, null, null, null);
}
/*
* Test method for {@link org.societies.privacytrust.trust.api.engine.IIndirectTrustEngine#evaluate(org.societies.api.privacytrust.trust.model.TrustedEntityId, org.societies.privacytrust.trust.api.evidence.model.IIndirectTrustEvidence)}.
* @throws Exception
*/
@Test
public void testEvaluate() throws Exception {
// setup test data
// add direct trust myCSS -> CSS
final TrustedEntityId trusteeCssTeid = trusteeCssTeidList.get(0);
ITrustedCss trusteeCss = (ITrustedCss)
this.trustRepo.createEntity(myCssTeid, trusteeCssTeid);
trusteeCss.getDirectTrust().setValue(0.5);
trusteeCss = (ITrustedCss) this.trustRepo.updateEntity(trusteeCss);
// add trust opinion CSS -> SVC
final TrustedEntityId trusteeSvcTeid = trusteeServiceTeidList.get(0);
ITrustEvidence evidence = this.trustEvidenceRepo.addEvidence(
trusteeCssTeid, trusteeSvcTeid, TrustEvidenceType.DIRECTLY_TRUSTED,
new Date(), new Double(0.75), trusteeCssTeid);
// verify indirect trust myCSS -> SVC
this.engine.evaluate(myCssTeid, evidence);
ITrustedService trusteeSvc = (ITrustedService)
this.trustRepo.retrieveEntity(myCssTeid, trusteeSvcTeid);
assertNotNull(trusteeSvc);
// verify evidence association
assertNotNull(trusteeSvc.getEvidence());
assertFalse(trusteeSvc.getEvidence().isEmpty());
assertTrue(trusteeSvc.getEvidence().contains(evidence));
// verify value
assertNull(trusteeSvc.getDirectTrust().getValue());
assertNotNull(trusteeSvc.getIndirectTrust().getValue());
// indirect trust = mean of direct trust values of myCSS
assertEquals(this.trustRepo.retrieveMeanTrustValue(myCssTeid, TrustValueType.DIRECT, null),
trusteeSvc.getIndirectTrust().getValue(), DELTA);
assertEquals(0.25, trusteeSvc.getIndirectTrust().getConfidence(), DELTA);
// verify similarity with CSS
Double similarity = ((ITrustedCss) this.trustRepo.retrieveEntity(
myCssTeid, trusteeCssTeid)).getSimilarity();
assertEquals(0.0d, similarity, DELTA);
// add direct trust myCSS -> SVC (same as CSS -> SVC)
trusteeSvc.getDirectTrust().setValue((Double) evidence.getInfo());
trusteeSvc = (ITrustedService) this.trustRepo.updateEntity(trusteeSvc);
// add direct trust myCSS -> CSS2 (same as CSS -> CSS)
final TrustedEntityId trusteeCssTeid2 = trusteeCssTeidList.get(1);
ITrustedCss trusteeCss2 = (ITrustedCss)
this.trustRepo.createEntity(myCssTeid, trusteeCssTeid2);
trusteeCss2.getDirectTrust().setValue(trusteeCss.getDirectTrust().getValue());
trusteeCss2 = (ITrustedCss) this.trustRepo.updateEntity(trusteeCss2);
// add trust opinion CSS2 -> SVC2 with same value as CSS -> SVC
final TrustedEntityId trusteeSvcTeid2 = trusteeServiceTeidList.get(1);
ITrustEvidence evidence2 = this.trustEvidenceRepo.addEvidence(
trusteeCssTeid2, trusteeSvcTeid2, TrustEvidenceType.DIRECTLY_TRUSTED,
new Date(), evidence.getInfo(), trusteeCssTeid2);
// verify indirect trust myCSS -> SVC2
this.engine.evaluate(myCssTeid, evidence2);
ITrustedService trusteeSvc2 = (ITrustedService)
this.trustRepo.retrieveEntity(myCssTeid, trusteeSvcTeid2);
assertNotNull(trusteeSvc2);
// verify evidence association
assertNotNull(trusteeSvc2.getEvidence());
assertFalse(trusteeSvc2.getEvidence().isEmpty());
assertTrue(trusteeSvc2.getEvidence().contains(evidence2));
// verify value
assertNull(trusteeSvc2.getDirectTrust().getValue());
assertNotNull(trusteeSvc2.getIndirectTrust().getValue());
// indirect trust = mean of direct trust values of myCSS
assertEquals(this.trustRepo.retrieveMeanTrustValue(myCssTeid, TrustValueType.DIRECT, null),
trusteeSvc2.getIndirectTrust().getValue(), DELTA);
assertEquals(0.25, trusteeSvc2.getIndirectTrust().getConfidence(), DELTA);
// verify similarity with CSS2
Double similarity2 = ((ITrustedCss) this.trustRepo.retrieveEntity(
myCssTeid, trusteeCssTeid2)).getSimilarity();
assertEquals(0.0d, similarity2, DELTA);
// add trust opinion CSS2 -> SVC2 with same value as CSS -> SVC
ITrustEvidence evidence3 = this.trustEvidenceRepo.addEvidence(
trusteeCssTeid, trusteeSvcTeid2, TrustEvidenceType.DIRECTLY_TRUSTED,
new Date(), evidence.getInfo(), trusteeCssTeid);
// verify indirect trust myCSS -> SVC2
this.engine.evaluate(myCssTeid, evidence3);
trusteeSvc2 = (ITrustedService)
this.trustRepo.retrieveEntity(myCssTeid, trusteeSvcTeid2);
assertNotNull(trusteeSvc2);
// verify evidence association
assertNotNull(trusteeSvc2.getEvidence());
assertFalse(trusteeSvc2.getEvidence().isEmpty());
assertTrue(trusteeSvc2.getEvidence().contains(evidence2));
assertTrue(trusteeSvc2.getEvidence().contains(evidence3));
// verify value
assertNull(trusteeSvc2.getDirectTrust().getValue());
assertNotNull(trusteeSvc2.getIndirectTrust().getValue());
// indirect trust = mean of direct trust values of myCSS + (trust opinion - mean = 0)
assertEquals(this.trustRepo.retrieveMeanTrustValue(myCssTeid, TrustValueType.DIRECT, null),
trusteeSvc2.getIndirectTrust().getValue(), DELTA);
assertEquals(0.5, trusteeSvc2.getIndirectTrust().getConfidence(), DELTA);
// verify similarity with CSS2 - nothing in common
similarity = ((ITrustedCss) this.trustRepo.retrieveEntity(
myCssTeid, trusteeCssTeid2)).getSimilarity();
assertEquals(0.0d, similarity2, DELTA);
// Add similar trust preferences between myCSS - CSS
// Add dissimilar trust preferences between myCSS - CSS2
for (int i = 100; i < 150; ++i) {
final TrustedEntityId trusteeSvcTeidX = trusteeServiceTeidList.get(i);
final Double commonValue = new Double(0.8);
final Double differentValue = new Random().nextDouble();
// add direct trust myCSS -> SVCX (same as CSS -> SVC)
ITrustedService trusteeSvcX = (ITrustedService)
this.trustRepo.createEntity(myCssTeid, trusteeSvcTeidX);
trusteeSvcX.getDirectTrust().setValue(commonValue);
trusteeSvcX = (ITrustedService) this.trustRepo.updateEntity(trusteeSvcX);
// add similar trust opinion CSS -> SVCX
final ITrustEvidence evidenceCss = this.trustEvidenceRepo.addEvidence(
trusteeCssTeid, trusteeSvcTeidX, TrustEvidenceType.DIRECTLY_TRUSTED,
new Date(), commonValue, trusteeCssTeid);
// normally evidenceX would cause an event
// but for testing we invoke evaluate on-demand
this.engine.evaluate(myCssTeid, evidenceCss);
// add dissimilar trust opinion CSS2 -> SVCX
final ITrustEvidence evidenceCss2 = this.trustEvidenceRepo.addEvidence(
trusteeCssTeid2, trusteeSvcTeidX, TrustEvidenceType.DIRECTLY_TRUSTED,
new Date(), differentValue, trusteeCssTeid2);
// normally evidenceX would cause an event
// but for testing we invoke evaluate on-demand
this.engine.evaluate(myCssTeid, evidenceCss2);
}
// verify similarity with CSS is max
Double similarityCss = ((ITrustedCss) this.trustRepo.retrieveEntity(myCssTeid, trusteeCssTeid)).getSimilarity();
assertEquals(1.0, similarityCss, DELTA);
Double similarityCss2 = ((ITrustedCss) this.trustRepo.retrieveEntity(myCssTeid, trusteeCssTeid2)).getSimilarity();
// verify similarity with CSS is higher than that with CSS2
assertTrue(similarityCss.compareTo(similarityCss2) > 0);
// add trust opinion CSS -> SVC3
final TrustedEntityId trusteeSvcTeid3 = trusteeServiceTeidList.get(2);
evidence3 = this.trustEvidenceRepo.addEvidence(
trusteeCssTeid, trusteeSvcTeid3, TrustEvidenceType.DIRECTLY_TRUSTED,
new Date(), new Double(1.0), trusteeCssTeid);
this.engine.evaluate(myCssTeid, evidence3);
// verify indirect trust with SVC3
ITrustedService trusteeSvc3 = (ITrustedService)
this.trustRepo.retrieveEntity(myCssTeid, trusteeSvcTeid3);
assertNotNull(trusteeSvc3);
assertNull(trusteeSvc3.getDirectTrust().getValue());
assertNotNull(trusteeSvc3.getIndirectTrust().getValue());
// indirect trust = mean of direct trust values of myCSS + (trust opinion - mean > 0)
assertTrue(trusteeSvc3.getIndirectTrust().getValue().compareTo(
this.trustRepo.retrieveMeanTrustValue(myCssTeid, TrustValueType.DIRECT, null)) > 0);
assertEquals(0.5, trusteeSvc3.getIndirectTrust().getConfidence(), DELTA);
// verify similarity with CSS is max
similarityCss = ((ITrustedCss) this.trustRepo.retrieveEntity(myCssTeid, trusteeCssTeid)).getSimilarity();
assertEquals(1.0, similarityCss, DELTA);
// add trust opinion CSS2 -> SVC4
final TrustedEntityId trusteeSvcTeid4 = trusteeServiceTeidList.get(3);
final ITrustEvidence evidence4 = this.trustEvidenceRepo.addEvidence(
trusteeCssTeid2, trusteeSvcTeid4, TrustEvidenceType.DIRECTLY_TRUSTED,
new Date(), new Double(1.0), trusteeCssTeid2);
this.engine.evaluate(myCssTeid, evidence4);
// verify indirect trust with SVC4
ITrustedService trusteeSvc4 = (ITrustedService)
this.trustRepo.retrieveEntity(myCssTeid, trusteeSvcTeid4);
assertNotNull(trusteeSvc4);
assertNull(trusteeSvc4.getDirectTrust().getValue());
assertNotNull(trusteeSvc4.getIndirectTrust().getValue());
// verify indirect trust with SVC4 < SVC3
/*assertTrue(trusteeSvc4.getIndirectTrust().getValue().compareTo(
trusteeSvc3.getIndirectTrust().getValue()) < 0);
assertEquals(0.5, trusteeSvc4.getIndirectTrust().getConfidence(), DELTA);
// verify similarity with CSS2 is lower than that with CSS
similarityCss2 = ((ITrustedCss) this.trustRepo.retrieveEntity(myCssTeid, trusteeCssTeid2)).getSimilarity();
assertTrue(similarityCss.compareTo(similarityCss2) > 0);*/
}
@Test
public void testRelevantEvidence() throws Exception {
// add trust opinion CSS -> CSS2
final TrustedEntityId trusteeCssTeid = trusteeCssTeidList.get(0);
final TrustedEntityId trusteeCssTeid2 = trusteeCssTeidList.get(1);
ITrustEvidence evidence = this.trustEvidenceRepo.addEvidence(
trusteeCssTeid, trusteeCssTeid2, TrustEvidenceType.DIRECTLY_TRUSTED,
new Date(), new Double(0.75), trusteeCssTeid);
Set<ITrustedEntity> entities = this.engine.evaluate(myCssTeid, evidence);
// verify evidence is relevant
assertNotNull(entities);
assertFalse(entities.isEmpty());
assertEquals(1, entities.size());
assertNotNull(entities.iterator().next().getIndirectTrust().getValue());
ITrustedCss trusteeCss = (ITrustedCss)
this.trustRepo.retrieveEntity(myCssTeid, trusteeCssTeid2);
assertNotNull(trusteeCss);
// add trust opinion CSS -> CSS
evidence = this.trustEvidenceRepo.addEvidence(
trusteeCssTeid, trusteeCssTeid, TrustEvidenceType.DIRECTLY_TRUSTED,
new Date(), new Double(0.75), trusteeCssTeid);
entities = this.engine.evaluate(myCssTeid, evidence);
// verify evidence is ignored
assertNotNull(entities);
assertTrue(entities.isEmpty());
// add trust opinion myCSS -> myCSS
evidence = this.trustEvidenceRepo.addEvidence(
myCssTeid, myCssTeid, TrustEvidenceType.DIRECTLY_TRUSTED,
new Date(), new Double(0.75), trusteeCssTeid);
entities = this.engine.evaluate(myCssTeid, evidence);
// verify evidence is ignored
assertNotNull(entities);
assertTrue(entities.isEmpty());
// add trust opinion myCSS -> CSS
evidence = this.trustEvidenceRepo.addEvidence(
myCssTeid, trusteeCssTeid, TrustEvidenceType.DIRECTLY_TRUSTED,
new Date(), new Double(0.75), myCssTeid);
entities = this.engine.evaluate(myCssTeid, evidence);
// verify evidence is ignored
assertNotNull(entities);
assertTrue(entities.isEmpty());
// add trust opinion CSS -> myCSS
evidence = this.trustEvidenceRepo.addEvidence(
trusteeCssTeid, myCssTeid, TrustEvidenceType.DIRECTLY_TRUSTED,
new Date(), new Double(0.75), trusteeCssTeid);
entities = this.engine.evaluate(myCssTeid, evidence);
// verify evidence is ignored
assertNotNull(entities);
assertTrue(entities.isEmpty());
}
}