/**
* 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.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.TrustedEntityId;
import org.societies.api.privacytrust.trust.model.TrustedEntityType;
import org.societies.privacytrust.trust.api.ITrustNodeMgr;
import org.societies.privacytrust.trust.api.engine.IDirectTrustEngine;
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.IDirectTrust;
import org.societies.privacytrust.trust.api.model.ITrust;
import org.societies.privacytrust.trust.api.model.ITrustedCis;
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 0.3
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:META-INF/spring/DirectTrustEngineTest-context.xml"})
public class DirectTrustEngineTest {
private static double EPSILON = 0.000001d;
private static final String BASE_ID = "dtet";
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 = 500;
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 IDirectTrustEngine service reference. */
@Autowired
@InjectMocks
private IDirectTrustEngine 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(this.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.IDirectTrustEngine#evaluate(TrustedEntityId, IDirectTrustEvidence)}.
* @throws Exception
*/
@Test
public void testEvaluateCssTrustRating() throws Exception {
// trust rating
final TrustedEntityId trusteeCssTeid = trusteeCssTeidList.get(0);
final Double rating = new Double(0.8d);
final Date timestamp = new Date();
ITrustEvidence evidence = this.trustEvidenceRepo.addEvidence(
myCssTeid, trusteeCssTeid,
TrustEvidenceType.RATED, timestamp, rating, null);
Set<ITrustedEntity> resultSet = this.engine.evaluate(myCssTeid, evidence);
// verify this has no effect as there is no direct trust relationship with the CSS yet
assertNotNull(resultSet);
assertTrue(resultSet.isEmpty());
// create direct trust relationship with CSS
evidence = this.trustEvidenceRepo.addEvidence(
myCssTeid, trusteeCssTeid,
TrustEvidenceType.FRIENDED_USER, timestamp, null, null);
resultSet = this.engine.evaluate(myCssTeid, evidence);
// verify direct trust relationship with CSS
assertNotNull(resultSet);
assertFalse(resultSet.isEmpty());
assertTrue(resultSet.size() == 1);
assertTrue(resultSet.iterator().next() instanceof ITrustedCss);
ITrustedCss evaluatedCss = (ITrustedCss) resultSet.iterator().next();
// verify association with evidence
assertNotNull(evaluatedCss.getEvidence());
assertTrue(evaluatedCss.getEvidence().contains(evidence));
// verify updated trust
assertNotNull(evaluatedCss.getDirectTrust().getLastModified());
assertNotNull(evaluatedCss.getDirectTrust().getLastUpdated());
assertEquals(evaluatedCss.getDirectTrust().getLastModified(),
evaluatedCss.getDirectTrust().getLastUpdated());
assertNull(evaluatedCss.getDirectTrust().getRating());
assertNotNull(evaluatedCss.getDirectTrust().getScore());
assertTrue(evaluatedCss.getDirectTrust().getScore() > IDirectTrust.INIT_SCORE);
assertNotNull(evaluatedCss.getDirectTrust().getValue());
// trust rating
evidence = this.trustEvidenceRepo.addEvidence(
myCssTeid, trusteeCssTeid,
TrustEvidenceType.RATED, timestamp, rating, null);
resultSet = this.engine.evaluate(myCssTeid, evidence);
// verify updated direct trust relationship with CSS
assertNotNull(resultSet);
assertFalse(resultSet.isEmpty());
assertTrue(resultSet.size() == 1);
assertTrue(resultSet.iterator().next() instanceof ITrustedCss);
evaluatedCss = (ITrustedCss) resultSet.iterator().next();
// verify association with evidence
assertNotNull(evaluatedCss.getEvidence());
assertTrue(evaluatedCss.getEvidence().contains(evidence));
// verify updated trust
assertNotNull(evaluatedCss.getDirectTrust().getLastModified());
assertNotNull(evaluatedCss.getDirectTrust().getLastUpdated());
assertEquals(evaluatedCss.getDirectTrust().getLastModified(),
evaluatedCss.getDirectTrust().getLastUpdated());
assertNotNull(evaluatedCss.getDirectTrust().getRating());
assertEquals(rating, evaluatedCss.getDirectTrust().getRating());
assertNotNull(evaluatedCss.getDirectTrust().getScore());
assertTrue(evaluatedCss.getDirectTrust().getScore() > IDirectTrust.INIT_SCORE);
assertNotNull(evaluatedCss.getDirectTrust().getValue());
assertTrue(evaluatedCss.getDirectTrust().getValue() >= 0.6d);
}
/**
* Test method for {@link org.societies.privacytrust.trust.api.engine.IDirectTrustEngine#evaluate(TrustedEntityId, IDirectTrustEvidence)}.
* @throws Exception
*/
@Test
public void testEvaluateCssSharedContext() throws Exception {
// CSS shared context 1
final TrustedEntityId trusteeCssTeid = trusteeCssTeidList.get(0);
final ITrustEvidence cssSharedCtxevidence1 = this.trustEvidenceRepo.addEvidence(
myCssTeid, trusteeCssTeid,
TrustEvidenceType.SHARED_CONTEXT, new Date(), "name", null);
Set<ITrustedEntity> resultSet = this.engine.evaluate(myCssTeid, cssSharedCtxevidence1);
ITrustedCss evaluatedCss = (ITrustedCss) this.trustRepo.retrieveEntity(myCssTeid, trusteeCssTeid);
// verify direct trust relationship with CSS
assertNotNull(resultSet);
assertFalse(resultSet.isEmpty());
assertTrue(resultSet.size() == 1);
assertTrue(resultSet.contains(evaluatedCss));
// verify CSS association with evidence
assertNotNull(evaluatedCss.getEvidence());
assertTrue(evaluatedCss.getEvidence().contains(cssSharedCtxevidence1));
// verify CSS trust
assertNotNull(evaluatedCss.getDirectTrust().getLastModified());
assertNotNull(evaluatedCss.getDirectTrust().getLastUpdated());
assertNull(evaluatedCss.getDirectTrust().getRating());
assertNotNull(evaluatedCss.getDirectTrust().getScore());
assertTrue(evaluatedCss.getDirectTrust().getScore() > IDirectTrust.INIT_SCORE);
assertNotNull(evaluatedCss.getDirectTrust().getValue());
assertTrue(evaluatedCss.getDirectTrust().getValue() > 0.5d);
// CSS2 shared context 1
final TrustedEntityId trusteeCssTeid2 = trusteeCssTeidList.get(1);
final ITrustEvidence css2SharedCtxevidence1 = this.trustEvidenceRepo.addEvidence(
myCssTeid, trusteeCssTeid2,
TrustEvidenceType.SHARED_CONTEXT, new Date(), "name", null);
resultSet = this.engine.evaluate(myCssTeid, css2SharedCtxevidence1);
evaluatedCss = (ITrustedCss) this.trustRepo.retrieveEntity(myCssTeid, trusteeCssTeid);
ITrustedCss evaluatedCss2 = (ITrustedCss) this.trustRepo.retrieveEntity(myCssTeid, trusteeCssTeid2);
// verify direct trust relationship with CSS and CSS2
assertNotNull(resultSet);
assertFalse(resultSet.isEmpty());
assertTrue(resultSet.size() == 2);
assertTrue(resultSet.contains(evaluatedCss));
assertTrue(resultSet.contains(evaluatedCss2));
// verify CSS association with evidence
assertNotNull(evaluatedCss.getEvidence());
assertTrue(evaluatedCss.getEvidence().contains(cssSharedCtxevidence1));
// verify CSS2 association with evidence
assertNotNull(evaluatedCss2.getEvidence());
assertTrue(evaluatedCss2.getEvidence().contains(css2SharedCtxevidence1));
// verify CSS2 trust
assertNotNull(evaluatedCss2.getDirectTrust().getLastModified());
assertNotNull(evaluatedCss2.getDirectTrust().getLastUpdated());
assertNull(evaluatedCss2.getDirectTrust().getRating());
assertNotNull(evaluatedCss2.getDirectTrust().getScore());
assertTrue(evaluatedCss2.getDirectTrust().getScore() > IDirectTrust.INIT_SCORE);
assertNotNull(evaluatedCss2.getDirectTrust().getValue());
assertTrue(evaluatedCss2.getDirectTrust().getValue() > 0.5d);
// verify CSS trust == CSS2 trust
assertEquals(evaluatedCss.getDirectTrust().getValue(), evaluatedCss2.getDirectTrust().getValue(), EPSILON);
// CSS shared context 2
final ITrustEvidence cssSharedCtxevidence2 = this.trustEvidenceRepo.addEvidence(
myCssTeid, trusteeCssTeid,
TrustEvidenceType.SHARED_CONTEXT, new Date(), "email", null);
resultSet = this.engine.evaluate(myCssTeid, cssSharedCtxevidence2);
evaluatedCss = (ITrustedCss) this.trustRepo.retrieveEntity(myCssTeid, trusteeCssTeid);
evaluatedCss2 = (ITrustedCss) this.trustRepo.retrieveEntity(myCssTeid, trusteeCssTeid2);
// verify direct trust relationship with CSS and CSS2
assertNotNull(resultSet);
assertFalse(resultSet.isEmpty());
assertTrue(resultSet.size() == 2);
assertTrue(resultSet.contains(evaluatedCss));
assertTrue(resultSet.contains(evaluatedCss2));
// verify CSS association with evidence
assertNotNull(evaluatedCss.getEvidence());
assertTrue(evaluatedCss.getEvidence().contains(cssSharedCtxevidence1));
assertTrue(evaluatedCss.getEvidence().contains(cssSharedCtxevidence2));
// verify CSS2 association with evidence
assertNotNull(evaluatedCss2.getEvidence());
assertTrue(evaluatedCss2.getEvidence().contains(css2SharedCtxevidence1));
// verify CSS trust
assertNotNull(evaluatedCss.getDirectTrust().getLastModified());
assertNotNull(evaluatedCss.getDirectTrust().getLastUpdated());
assertNull(evaluatedCss.getDirectTrust().getRating());
assertNotNull(evaluatedCss.getDirectTrust().getScore());
assertTrue(evaluatedCss.getDirectTrust().getScore() > IDirectTrust.INIT_SCORE);
assertNotNull(evaluatedCss.getDirectTrust().getValue());
assertTrue(evaluatedCss.getDirectTrust().getValue() > 0.5d);
// verify CSS trust > CSS2 trust
assertTrue(evaluatedCss.getDirectTrust().getValue() > evaluatedCss2.getDirectTrust().getValue());
// CSS withheld context 1
final ITrustEvidence cssWithheldCtxevidence1 = this.trustEvidenceRepo.addEvidence(
myCssTeid, trusteeCssTeid,
TrustEvidenceType.WITHHELD_CONTEXT, new Date(), "location", null);
resultSet = this.engine.evaluate(myCssTeid, cssWithheldCtxevidence1);
evaluatedCss = (ITrustedCss) this.trustRepo.retrieveEntity(myCssTeid, trusteeCssTeid);
evaluatedCss2 = (ITrustedCss) this.trustRepo.retrieveEntity(myCssTeid, trusteeCssTeid2);
// verify direct trust relationship with CSS and CSS2
assertNotNull(resultSet);
assertFalse(resultSet.isEmpty());
assertTrue(resultSet.size() == 2);
assertTrue(resultSet.contains(evaluatedCss));
assertTrue(resultSet.contains(evaluatedCss2));
// verify CSS association with evidence
assertNotNull(evaluatedCss.getEvidence());
assertTrue(evaluatedCss.getEvidence().contains(cssSharedCtxevidence1));
assertTrue(evaluatedCss.getEvidence().contains(cssSharedCtxevidence2));
assertTrue(evaluatedCss.getEvidence().contains(cssWithheldCtxevidence1));
// verify CSS2 association with evidence
assertNotNull(evaluatedCss2.getEvidence());
assertTrue(evaluatedCss2.getEvidence().contains(css2SharedCtxevidence1));
// verify CSS trust
assertNotNull(evaluatedCss.getDirectTrust().getLastModified());
assertNotNull(evaluatedCss.getDirectTrust().getLastUpdated());
assertNull(evaluatedCss.getDirectTrust().getRating());
assertNotNull(evaluatedCss.getDirectTrust().getScore());
assertTrue(evaluatedCss.getDirectTrust().getScore() < IDirectTrust.INIT_SCORE);
assertNotNull(evaluatedCss.getDirectTrust().getValue());
assertTrue(evaluatedCss.getDirectTrust().getValue() < 0.5d);
// verify CSS trust < CSS2 trust
assertTrue(evaluatedCss.getDirectTrust().getValue() < evaluatedCss2.getDirectTrust().getValue());
}
/**
* Test method for {@link org.societies.privacytrust.trust.api.engine.IDirectTrustEngine#evaluate(TrustedEntityId, Set)}.
* @throws Exception
*/
@Test
public void testEvaluateCssMultipleEvidence() throws Exception {
final TrustedEntityId trusteeCssTeid = trusteeCssTeidList.get(0);
final Set<ITrustEvidence> evidenceSet = new HashSet<ITrustEvidence>();
// trust rating
final Double rating = new Double(0.1d);
// timestamp
final Date now = new Date();
// Ugly hack for MySQL - remove ms precision from date
final Date timestamp = new Date(1000 * (now.getTime() / 1000));
final ITrustEvidence evidence1 = this.trustEvidenceRepo.addEvidence(
myCssTeid, trusteeCssTeid,
TrustEvidenceType.RATED, timestamp, rating, null);
evidenceSet.add(evidence1);
// trust rating2
final Double rating2 = new Double(0.8d);
final Date timestamp2 = new Date(timestamp.getTime() + 1000);
final ITrustEvidence evidence2 = this.trustEvidenceRepo.addEvidence(
myCssTeid, trusteeCssTeid,
TrustEvidenceType.RATED, timestamp2, rating2, null);
evidenceSet.add(evidence2);
// friendship
final Date timestamp3 = new Date(timestamp.getTime() - 2000);
final ITrustEvidence evidence3 = this.trustEvidenceRepo.addEvidence(
myCssTeid, trusteeCssTeid,
TrustEvidenceType.FRIENDED_USER, timestamp3, null, null);
evidenceSet.add(evidence3);
// trust rating3
final Double rating3 = new Double(0.2d);
final Date timestamp4 = new Date(timestamp.getTime() - 1000);
final ITrustEvidence evidence4 = this.trustEvidenceRepo.addEvidence(
myCssTeid, trusteeCssTeid,
TrustEvidenceType.RATED, timestamp4, rating3, null);
evidenceSet.add(evidence4);
final Set<ITrustedEntity> resultSet = this.engine.evaluate(myCssTeid, evidenceSet);
// verify
assertNotNull(resultSet);
assertTrue(!resultSet.isEmpty());
assertTrue(resultSet.size() == 1);
assertTrue(resultSet.iterator().next() instanceof ITrustedCss);
final ITrustedCss evaluatedCss = (ITrustedCss) resultSet.iterator().next();
// verify association with evidence
assertNotNull(evaluatedCss.getEvidence());
assertTrue(evaluatedCss.getEvidence().containsAll(evidenceSet));
// verify updated trust
assertNotNull(evaluatedCss.getDirectTrust().getLastModified());
assertNotNull(evaluatedCss.getDirectTrust().getLastUpdated());
assertEquals(evaluatedCss.getDirectTrust().getLastModified(),
evaluatedCss.getDirectTrust().getLastUpdated());
assertNotNull(evaluatedCss.getDirectTrust().getRating());
assertEquals(rating2, evaluatedCss.getDirectTrust().getRating());
assertNotNull(evaluatedCss.getDirectTrust().getScore());
assertTrue(evaluatedCss.getDirectTrust().getScore() > IDirectTrust.INIT_SCORE);
assertNotNull(evaluatedCss.getDirectTrust().getValue());
assertTrue(evaluatedCss.getDirectTrust().getValue() >= 0.6d);
}
/**
* Test method for {@link org.societies.privacytrust.trust.api.engine.IDirectTrustEngine#evaluate(TrustedEntityId, IDirectTrustEvidence)}.
* @throws Exception
*/
@Test
public void testEvaluateCisTrustRating() throws Exception {
// trust rating
final TrustedEntityId trusteeCisTeid = trusteeCisTeidList.get(0);
final Double highRating = new Double(1.0d);
final Double mediumRating = new Double(0.6d);
final Double lowRating = new Double(0.2d);
// timestamp
final Date now = new Date();
// Ugly hack for MySQL - remove ms precision from date
final Date timestamp = new Date(1000 * (now.getTime() / 1000));
ITrustEvidence evidence = this.trustEvidenceRepo.addEvidence(
myCssTeid, trusteeCisTeid,
TrustEvidenceType.RATED, timestamp, highRating, null);
Set<ITrustedEntity> resultSet = this.engine.evaluate(myCssTeid, evidence);
// verify this has no effect as there is no direct trust relationship with the CSS yet
assertNotNull(resultSet);
assertTrue(resultSet.isEmpty());
// create direct trust relationship with CSS
evidence = this.trustEvidenceRepo.addEvidence(
myCssTeid, trusteeCisTeid,
TrustEvidenceType.JOINED_COMMUNITY, timestamp, null, null);
resultSet = this.engine.evaluate(myCssTeid, evidence);
// verify direct trust relationship with CSS
assertNotNull(resultSet);
assertFalse(resultSet.isEmpty());
assertTrue(resultSet.size() == 1);
assertTrue(resultSet.iterator().next() instanceof ITrustedCis);
final ITrustedCis evaluatedCis = (ITrustedCis) resultSet.iterator().next();
// verify association with evidence
assertNotNull(evaluatedCis.getEvidence());
assertTrue(evaluatedCis.getEvidence().contains(evidence));
// verify updated trust
assertNotNull(evaluatedCis.getDirectTrust().getLastModified());
assertNotNull(evaluatedCis.getDirectTrust().getLastUpdated());
assertEquals(evaluatedCis.getDirectTrust().getLastModified(),
evaluatedCis.getDirectTrust().getLastUpdated());
assertNull(evaluatedCis.getDirectTrust().getRating());
assertNotNull(evaluatedCis.getDirectTrust().getScore());
assertTrue(evaluatedCis.getDirectTrust().getScore() > IDirectTrust.INIT_SCORE);
assertNotNull(evaluatedCis.getDirectTrust().getValue());
assertTrue(evaluatedCis.getDirectTrust().getValue() > 0.5d);
// high trust rating
evidence = this.trustEvidenceRepo.addEvidence(
myCssTeid, trusteeCisTeid,
TrustEvidenceType.RATED, new Date(timestamp.getTime()+1000l), highRating, null);
resultSet = this.engine.evaluate(myCssTeid, evidence);
// verify updated direct trust relationship with CSS
assertNotNull(resultSet);
assertFalse(resultSet.isEmpty());
assertTrue(resultSet.size() == 1);
assertTrue(resultSet.iterator().next() instanceof ITrustedCis);
final ITrustedCis evaluatedCis2 = (ITrustedCis) resultSet.iterator().next();
// verify association with evidence
assertNotNull(evaluatedCis2.getEvidence());
assertTrue(evaluatedCis2.getEvidence().contains(evidence));
// verify updated trust
assertNotNull(evaluatedCis2.getDirectTrust().getLastModified());
assertNotNull(evaluatedCis2.getDirectTrust().getLastUpdated());
assertEquals(evaluatedCis2.getDirectTrust().getLastModified(),
evaluatedCis2.getDirectTrust().getLastUpdated());
assertNotNull(evaluatedCis2.getDirectTrust().getRating());
assertEquals(highRating, evaluatedCis2.getDirectTrust().getRating());
assertNotNull(evaluatedCis2.getDirectTrust().getScore());
assertTrue(evaluatedCis2.getDirectTrust().getScore() > IDirectTrust.INIT_SCORE);
assertNotNull(evaluatedCis2.getDirectTrust().getValue());
assertTrue(evaluatedCis2.getDirectTrust().getValue() > evaluatedCis.getDirectTrust().getValue());
// medium trust rating
evidence = this.trustEvidenceRepo.addEvidence(
myCssTeid, trusteeCisTeid,
TrustEvidenceType.RATED, new Date(timestamp.getTime()+2000l), mediumRating, null);
resultSet = this.engine.evaluate(myCssTeid, evidence);
// verify updated direct trust relationship with CSS
assertNotNull(resultSet);
assertFalse(resultSet.isEmpty());
assertTrue(resultSet.size() == 1);
assertTrue(resultSet.iterator().next() instanceof ITrustedCis);
final ITrustedCis evaluatedCis3 = (ITrustedCis) resultSet.iterator().next();
// verify association with evidence
assertNotNull(evaluatedCis3.getEvidence());
assertTrue(evaluatedCis3.getEvidence().contains(evidence));
// verify updated trust
assertNotNull(evaluatedCis3.getDirectTrust().getLastModified());
assertNotNull(evaluatedCis3.getDirectTrust().getLastUpdated());
assertEquals(evaluatedCis3.getDirectTrust().getLastModified(),
evaluatedCis3.getDirectTrust().getLastUpdated());
assertNotNull(evaluatedCis3.getDirectTrust().getRating());
assertEquals(mediumRating, evaluatedCis3.getDirectTrust().getRating());
assertNotNull(evaluatedCis3.getDirectTrust().getScore());
assertTrue(evaluatedCis3.getDirectTrust().getScore() > IDirectTrust.INIT_SCORE);
assertNotNull(evaluatedCis3.getDirectTrust().getValue());
assertTrue(evaluatedCis3.getDirectTrust().getValue() < evaluatedCis2.getDirectTrust().getValue());
assertEquals(evaluatedCis.getDirectTrust().getValue(), evaluatedCis3.getDirectTrust().getValue(), EPSILON);
// low trust rating
evidence = this.trustEvidenceRepo.addEvidence(
myCssTeid, trusteeCisTeid,
TrustEvidenceType.RATED, new Date(timestamp.getTime()+3000l), lowRating, null);
resultSet = this.engine.evaluate(myCssTeid, evidence);
// verify updated direct trust relationship with CSS
assertNotNull(resultSet);
assertFalse(resultSet.isEmpty());
assertTrue(resultSet.size() == 1);
assertTrue(resultSet.iterator().next() instanceof ITrustedCis);
final ITrustedCis evaluatedCis4 = (ITrustedCis) resultSet.iterator().next();
// verify association with evidence
assertNotNull(evaluatedCis4.getEvidence());
assertTrue(evaluatedCis4.getEvidence().contains(evidence));
// verify updated trust
assertNotNull(evaluatedCis4.getDirectTrust().getLastModified());
assertNotNull(evaluatedCis4.getDirectTrust().getLastUpdated());
assertEquals(evaluatedCis4.getDirectTrust().getLastModified(),
evaluatedCis4.getDirectTrust().getLastUpdated());
assertNotNull(evaluatedCis4.getDirectTrust().getRating());
assertEquals(lowRating, evaluatedCis4.getDirectTrust().getRating());
assertNotNull(evaluatedCis4.getDirectTrust().getScore());
assertTrue(evaluatedCis4.getDirectTrust().getScore() > IDirectTrust.INIT_SCORE);
assertNotNull(evaluatedCis4.getDirectTrust().getValue());
assertTrue(evaluatedCis4.getDirectTrust().getValue() < 0.5d);
assertTrue(evaluatedCis4.getDirectTrust().getValue() < evaluatedCis2.getDirectTrust().getValue());
assertTrue(evaluatedCis4.getDirectTrust().getValue() < evaluatedCis3.getDirectTrust().getValue());
}
/**
* Test method for {@link org.societies.privacytrust.trust.api.engine.IDirectTrustEngine#evaluate(TrustedEntityId, IDirectTrustEvidence)}.
* @throws Exception
*/
@Test
public void testEvaluateCisMultipleEvidence() throws Exception {
final TrustedEntityId trusteeCisTeid = trusteeCisTeidList.get(0);
// Joined Community evidence
// timestamp
final Date now = new Date();
// Ugly hack for MySQL - remove ms precision from date
final Date timestamp = new Date(1000 * (now.getTime() / 1000));
final ITrustEvidence evidence = this.trustEvidenceRepo.addEvidence(
myCssTeid, trusteeCisTeid,
TrustEvidenceType.JOINED_COMMUNITY, timestamp, null, null);
final Set<ITrustedEntity> resultSet = this.engine.evaluate(myCssTeid, evidence);
final ITrustedCss cisMember = (ITrustedCss) this.trustRepo.retrieveEntity(myCssTeid, myCssTeid);
final ITrustedCis evaluatedCis = (ITrustedCis) this.trustRepo.retrieveEntity(myCssTeid, trusteeCisTeid);
// verify
assertNotNull(resultSet);
assertTrue(!resultSet.isEmpty());
assertEquals(1, resultSet.size());
assertTrue(resultSet.contains(evaluatedCis));
// from the member's side
assertNotNull(cisMember);
assertNotNull(cisMember.getDirectTrust().getRating());
assertEquals(new Double(IDirectTrust.MAX_RATING), cisMember.getDirectTrust().getRating());
assertNotNull(cisMember.getDirectTrust().getScore());
assertEquals(new Double(IDirectTrust.MAX_SCORE), cisMember.getDirectTrust().getScore());
assertNotNull(cisMember.getDirectTrust().getValue());
assertEquals(new Double(ITrust.MAX_VALUE), cisMember.getDirectTrust().getValue());
assertFalse(cisMember.getCommunities().isEmpty());
assertTrue(cisMember.getCommunities().contains(evaluatedCis));
// verify association with evidence
assertNotNull(cisMember.getEvidence());
assertTrue(cisMember.getEvidence().isEmpty());
// from the community's side
assertFalse(evaluatedCis.getMembers().isEmpty());
assertTrue(evaluatedCis.getMembers().contains(cisMember));
// verify association with evidence
assertNotNull(evaluatedCis.getEvidence());
assertTrue(evaluatedCis.getEvidence().contains(evidence));
// verify updated trust
assertNotNull(evaluatedCis.getDirectTrust().getLastModified());
assertNotNull(evaluatedCis.getDirectTrust().getLastUpdated());
assertEquals(evaluatedCis.getDirectTrust().getLastModified(),
evaluatedCis.getDirectTrust().getLastUpdated());
assertNull(evaluatedCis.getDirectTrust().getRating());
assertNotNull(evaluatedCis.getDirectTrust().getScore());
assertNotNull(evaluatedCis.getDirectTrust().getValue());
assertTrue(evaluatedCis.getDirectTrust().getValue() > 0.5d);
// add another member
final TrustedEntityId trusteeCssTeid2 = trusteeCssTeidList.get(0);
// Joined Community evidence
final Date timestamp2 = new Date(timestamp.getTime() + 1000);
final ITrustEvidence evidence2 = this.trustEvidenceRepo.addEvidence(
trusteeCssTeid2, trusteeCisTeid,
TrustEvidenceType.JOINED_COMMUNITY, timestamp2, null, null);
final Set<ITrustedEntity> resultSet2 = this.engine.evaluate(myCssTeid, evidence2);
final ITrustedCss cisMember2 = (ITrustedCss) this.trustRepo.retrieveEntity(myCssTeid, trusteeCssTeid2);
final ITrustedCis updatedCis = (ITrustedCis) this.trustRepo.retrieveEntity(myCssTeid, trusteeCisTeid);
// verify
assertNotNull(resultSet2);
assertTrue(!resultSet2.isEmpty());
assertEquals(1, resultSet2.size());
assertTrue(resultSet2.contains(updatedCis));
// from the member's side
assertNotNull(cisMember2);
assertFalse(cisMember2.getCommunities().isEmpty());
assertTrue(cisMember2.getCommunities().contains(updatedCis));
// verify association with evidence
assertNotNull(cisMember2.getEvidence());
assertTrue(cisMember2.getEvidence().isEmpty());
// from the community's side
assertFalse(updatedCis.getMembers().isEmpty());
// contains first member (myself)
assertTrue(updatedCis.getMembers().contains(cisMember));
// contains other member
assertTrue(updatedCis.getMembers().contains(cisMember2));
// verify association with evidence
assertNotNull(updatedCis.getEvidence());
assertTrue(updatedCis.getEvidence().contains(evidence));
assertTrue(updatedCis.getEvidence().contains(evidence2));
// verify updated trust
assertNotNull(updatedCis.getDirectTrust().getLastModified());
assertNotNull(updatedCis.getDirectTrust().getLastUpdated());
assertTrue(Math.abs(updatedCis.getDirectTrust().getLastModified().getTime() -
updatedCis.getDirectTrust().getLastUpdated().getTime()) < 1000);
assertNull(updatedCis.getDirectTrust().getRating());
assertNotNull(updatedCis.getDirectTrust().getScore());
assertTrue(updatedCis.getDirectTrust().getScore() > IDirectTrust.INIT_SCORE);
assertNotNull(updatedCis.getDirectTrust().getValue());
assertEquals(evaluatedCis.getDirectTrust().getValue(), updatedCis.getDirectTrust().getValue(), EPSILON);
final int NUM_EXTRA_CSS = 10;
final int NUM_EXTRA_CIS = 6;
// Add DIRECTLY trusted CSSs to the trust DB
for (int i = 1; i <= NUM_EXTRA_CSS; ++i) {
ITrustedEntity entity = this.trustRepo.createEntity(myCssTeid, trusteeCssTeidList.get(i));
entity.getDirectTrust().setValue(0.5d);
this.trustRepo.updateEntity(entity);
}
// Add INDIRECTLY trusted CSSs to the trust DB
for (int i = NUM_EXTRA_CSS+1; i <= 2*NUM_EXTRA_CSS; ++i) {
ITrustedEntity entity = this.trustRepo.createEntity(myCssTeid, trusteeCssTeidList.get(i));
entity.getIndirectTrust().setValue(0.5d);
this.trustRepo.updateEntity(entity);
}
// Add INDIRECTLY trusted CISs to the trust DB
for (int i = 1; i <= NUM_EXTRA_CIS; ++i) {
ITrustedEntity entity = this.trustRepo.createEntity(myCssTeid, trusteeCisTeidList.get(i));
entity.getIndirectTrust().setValue(0.5d);
this.trustRepo.updateEntity(entity);
}
// Updated trust in CIS member evidence
final Date timestamp3 = new Date(timestamp2.getTime() + 1000);
final ITrustEvidence evidence3 = this.trustEvidenceRepo.addEvidence(
myCssTeid, trusteeCssTeid2,
TrustEvidenceType.WITHHELD_CONTEXT, timestamp3, null, null);
final Set<ITrustedEntity> resultSet3 = this.engine.evaluate(myCssTeid, evidence3);
final ITrustedCss updatedCisMember2 = (ITrustedCss)
this.trustRepo.retrieveEntity(myCssTeid, trusteeCssTeid2);
final ITrustedCis updated2Cis = (ITrustedCis)
this.trustRepo.retrieveEntity(myCssTeid, trusteeCisTeid);
// verify
assertNotNull(resultSet3);
assertTrue(!resultSet3.isEmpty());
assertEquals(NUM_EXTRA_CSS+2, resultSet3.size());
assertTrue(resultSet3.contains(updatedCisMember2));
assertTrue(resultSet3.contains(updated2Cis));
// from the member's side
assertNotNull(updatedCisMember2);
assertFalse(updatedCisMember2.getCommunities().isEmpty());
assertTrue(updatedCisMember2.getCommunities().contains(updatedCis));
// verify association with evidence
assertNotNull(updatedCisMember2.getEvidence());
assertFalse(updatedCisMember2.getEvidence().isEmpty());
assertTrue(updatedCisMember2.getEvidence().contains(evidence3));
// from the community's side
assertFalse(updated2Cis.getMembers().isEmpty());
// contains first member (myself)
assertTrue(updated2Cis.getMembers().contains(cisMember));
// contains other member
assertTrue(updated2Cis.getMembers().contains(updatedCisMember2));
// verify association with evidence
assertNotNull(updated2Cis.getEvidence());
assertTrue(updated2Cis.getEvidence().contains(evidence));
assertTrue(updated2Cis.getEvidence().contains(evidence2));
// verify updated trust
assertNotNull(updated2Cis.getDirectTrust().getLastModified());
assertNotNull(updated2Cis.getDirectTrust().getLastUpdated());
assertEquals(updated2Cis.getDirectTrust().getLastModified().getTime(),
updated2Cis.getDirectTrust().getLastUpdated().getTime());
assertNull(updated2Cis.getDirectTrust().getRating());
assertNotNull(updated2Cis.getDirectTrust().getScore());
assertTrue(updated2Cis.getDirectTrust().getScore() > IDirectTrust.INIT_SCORE);
assertNotNull(updated2Cis.getDirectTrust().getValue());
assertEquals(updatedCisMember2.getDirectTrust().getValue(), updated2Cis.getDirectTrust().getValue(), EPSILON);
// remove last member
// Left Community evidence
final Date timestamp4 = new Date(timestamp3.getTime() + 1000);
final ITrustEvidence evidence4 = this.trustEvidenceRepo.addEvidence(
trusteeCssTeid2, trusteeCisTeid,
TrustEvidenceType.LEFT_COMMUNITY, timestamp4, null, null);
final Set<ITrustedEntity> resultSet4 = this.engine.evaluate(myCssTeid, evidence4);
final ITrustedCss updated2CisMember2 = (ITrustedCss) this.trustRepo.retrieveEntity(myCssTeid, trusteeCssTeid2);
final ITrustedCis updated3Cis = (ITrustedCis) this.trustRepo.retrieveEntity(myCssTeid, trusteeCisTeid);
// verify
assertNotNull(resultSet4);
assertFalse(resultSet4.isEmpty());
assertEquals(1, resultSet4.size());
assertTrue(resultSet4.contains(updated3Cis));
// from the member's side
assertNotNull(updated2CisMember2);
assertTrue(updated2CisMember2.getCommunities().isEmpty());
// from the community's side
assertFalse(updated3Cis.getMembers().isEmpty());
// contains first member (myself)
assertTrue(updated3Cis.getMembers().contains(cisMember));
// should not contain other member
assertFalse(updated3Cis.getMembers().contains(updated2CisMember2));
assertNotNull(updated3Cis.getDirectTrust().getLastModified());
assertNotNull(updated3Cis.getDirectTrust().getLastUpdated());
assertNull(updated3Cis.getDirectTrust().getRating());
assertNotNull(updated3Cis.getDirectTrust().getScore());
assertTrue(updated3Cis.getDirectTrust().getScore() > IDirectTrust.INIT_SCORE);
assertNotNull(updated3Cis.getDirectTrust().getValue());
assertEquals(evaluatedCis.getDirectTrust().getValue(), updated3Cis.getDirectTrust().getValue(), EPSILON);
}
/**
* Test method for {@link org.societies.privacytrust.trust.api.engine.IDirectTrustEngine#evaluate(TrustedEntityId, IDirectTrustEvidence)}.
* @throws Exception
*/
@Test
public void testEvaluateServiceTrustRating() throws Exception {
// trust rating
final TrustedEntityId trusteeSvcTeid = trusteeServiceTeidList.get(0);
final Double rating = new Double(0.8d);
final Date timestamp = new Date();
ITrustEvidence evidence = this.trustEvidenceRepo.addEvidence(
myCssTeid, trusteeSvcTeid,
TrustEvidenceType.RATED, timestamp, rating, null);
Set<ITrustedEntity> resultSet = this.engine.evaluate(myCssTeid, evidence);
// verify this has no effect as there is no direct trust relationship with the Service yet
assertNotNull(resultSet);
assertTrue(resultSet.isEmpty());
// create direct trust relationship with Service
evidence = this.trustEvidenceRepo.addEvidence(
myCssTeid, trusteeSvcTeid,
TrustEvidenceType.USED_SERVICE, timestamp, null, null);
resultSet = this.engine.evaluate(myCssTeid, evidence);
// verify direct trust relationship with Service
assertNotNull(resultSet);
assertFalse(resultSet.isEmpty());
assertTrue(resultSet.size() == 1);
assertTrue(resultSet.iterator().next() instanceof ITrustedService);
ITrustedService evaluatedSvc = (ITrustedService) resultSet.iterator().next();
// verify association with evidence
assertNotNull(evaluatedSvc.getEvidence());
assertTrue(evaluatedSvc.getEvidence().contains(evidence));
// verify updated trust
assertNotNull(evaluatedSvc.getDirectTrust().getLastModified());
assertNotNull(evaluatedSvc.getDirectTrust().getLastUpdated());
assertEquals(evaluatedSvc.getDirectTrust().getLastModified(),
evaluatedSvc.getDirectTrust().getLastUpdated());
assertNull(evaluatedSvc.getDirectTrust().getRating());
assertNotNull(evaluatedSvc.getDirectTrust().getScore());
assertTrue(evaluatedSvc.getDirectTrust().getScore() > IDirectTrust.INIT_SCORE);
assertNotNull(evaluatedSvc.getDirectTrust().getValue());
// trust rating
evidence = this.trustEvidenceRepo.addEvidence(
myCssTeid, trusteeSvcTeid,
TrustEvidenceType.RATED, timestamp, rating, null);
resultSet = this.engine.evaluate(myCssTeid, evidence);
// verify updated direct trust relationship with Service
assertNotNull(resultSet);
assertFalse(resultSet.isEmpty());
assertTrue(resultSet.size() == 1);
assertTrue(resultSet.iterator().next() instanceof ITrustedService);
evaluatedSvc = (ITrustedService) resultSet.iterator().next();
// verify association with evidence
assertNotNull(evaluatedSvc.getEvidence());
assertTrue(evaluatedSvc.getEvidence().contains(evidence));
// verify updated trust
assertNotNull(evaluatedSvc.getDirectTrust().getLastModified());
assertNotNull(evaluatedSvc.getDirectTrust().getLastUpdated());
assertEquals(evaluatedSvc.getDirectTrust().getLastModified(),
evaluatedSvc.getDirectTrust().getLastUpdated());
assertNotNull(evaluatedSvc.getDirectTrust().getRating());
assertEquals(rating, evaluatedSvc.getDirectTrust().getRating());
assertNotNull(evaluatedSvc.getDirectTrust().getScore());
assertTrue(evaluatedSvc.getDirectTrust().getScore() > IDirectTrust.INIT_SCORE);
assertNotNull(evaluatedSvc.getDirectTrust().getValue());
assertTrue(evaluatedSvc.getDirectTrust().getValue() >= 0.6d);
}
}