package uk.ac.ebi.fg.myequivalents.provenance.webservices.client;
import static junit.framework.Assert.assertTrue;
import static org.junit.Assert.assertEquals;
import static uk.ac.ebi.fg.myequivalents.provenance.model.ProvenanceRegisterParameter.p;
import static uk.ac.ebi.fg.myequivalents.webservices.server.test.WebTestDataInitializer.editorSecret;
import static uk.ac.ebi.fg.myequivalents.webservices.server.test.WebTestDataInitializer.editorUser;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import org.joda.time.DateTime;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import uk.ac.ebi.fg.myequivalents.managers.interfaces.EntityMappingManager;
import uk.ac.ebi.fg.myequivalents.managers.interfaces.ServiceManager;
import uk.ac.ebi.fg.myequivalents.model.Service;
import uk.ac.ebi.fg.myequivalents.provenance.db.managers.ProvDbEntityMappingManager;
import uk.ac.ebi.fg.myequivalents.provenance.interfaces.ProvManagerFactory;
import uk.ac.ebi.fg.myequivalents.provenance.interfaces.ProvRegistryManager;
import uk.ac.ebi.fg.myequivalents.provenance.model.ProvenanceRegisterEntry;
import uk.ac.ebi.fg.myequivalents.provenance.model.ProvenanceRegisterParameter;
import uk.ac.ebi.fg.myequivalents.resources.Resources;
import uk.ac.ebi.fg.myequivalents.utils.EntityIdResolver;
import uk.ac.ebi.fg.myequivalents.webservices.server.test.WebTestDataInitializer;
/**
* Tests {@link ProvDbEntityMappingManager}, invoked via web services, ie, checks that provenance entry records are
* returned to the {@link ProvRegistryWSClient client}.
*
* <dl><dt>date</dt><dd>31 Oct 2014</dd></dl>
* @author Marco Brandizi
*
*/
public class ProvEntityMappingWSClientIT
{
// Here we get the specific factory, since we want newProvRegistryManager()
private ProvManagerFactory mgrFact = Resources.getInstance ( ).getMyEqManagerFactory (
ProvRegistryWSClientIT.CLI_SPRING_CONFIG_FILE_NAME
);
private DateTime startTime;
private Logger log = LoggerFactory.getLogger ( this.getClass () );
@Before
public void markStartTime ()
{
startTime = new DateTime();
}
@After
public void purgeEntries ()
{
ProvRegistryManager regMgr = mgrFact.newProvRegistryManager (
WebTestDataInitializer.adminUser.getEmail (), WebTestDataInitializer.adminSecret
);
((ProvRegistryWSClient) regMgr)._purgeAll ( startTime.toDate () );
}
@Test
public void testCreation ()
{
// The services we will play with
Reader xmlIn = new InputStreamReader ( this.getClass ().getResourceAsStream ( "/data/foo_services.xml" ) );
ServiceManager smgr = mgrFact.newServiceManager ( editorUser.getEmail (), editorSecret );
smgr.storeServicesFromXML ( xmlIn );
// Test mappings
EntityMappingManager mapMgr = mgrFact.newEntityMappingManager ( editorUser.getEmail (), editorSecret );
log.debug ( "Saving test mappings" );
mapMgr.storeMappings ( "test.provtest.service6:acc1", "test.provtest.service8:acc1" );
mapMgr.storeMappingBundle ( "test.provtest.service6:acc2", "test.provtest.service8:acc1" );
log.debug ( "Test mappings saved" );
// Has the above been tracked?
ProvRegistryManager regMgr = mgrFact.newProvRegistryManager ( editorUser.getEmail (), editorSecret );
List<ProvenanceRegisterEntry> proves = regMgr.find ( editorUser.getEmail (), "mapping.storeMappings", null, null,
Arrays.asList ( p ( "entity", "%.provtest.service6", "acc1" ) )
);
log.info ( "------ MAPPING RECORDS:\n{}", proves );
assertEquals ( "Expected provenance records not saved (service6:acc1)!", 1, proves.size () );
proves = regMgr.find ( editorUser.getEmail (), "mapping.storeMapping%", null, null,
Arrays.asList ( p ( "entity", "%.provtest.service8", "acc1" ) )
);
log.info ( "------ MAPPING RECORDS:\n{}", proves );
assertEquals ( "Expected provenance records not saved (service6:acc1)!", 2, proves.size () );
}
@Test
public void testFindEntityProv ()
{
ServiceManager smgr = mgrFact.newServiceManager ( editorUser.getEmail (), editorSecret );
String sname = "prov.test.service1";
Service serv = new Service ( sname );
smgr.storeServices ( serv );
EntityMappingManager mmgr = mgrFact.newEntityMappingManager ( editorUser.getEmail (), editorSecret );
mmgr.storeMappings ( sname + ":a", sname + ":b" );
mmgr.storeMappingBundle ( sname + ":b", sname + ":c", sname + ":d" );
ProvRegistryManager regMgr = mgrFact.newProvRegistryManager ( editorUser.getEmail (), editorSecret );
// First, return all the entries, no matter the users
List<ProvenanceRegisterEntry> provs = regMgr.findEntityMappingProv ( sname + ":b", null );
log.info ( "Provenance entries returned for :a:\n{}", provs );
mmgr.deleteMappings ( sname + ":b" );
smgr.deleteServices ( sname );
boolean founda = false, foundc = false, foundd = false;
int foundOps = 0, foundEntities = 0;
for ( ProvenanceRegisterEntry prove: provs )
{
foundOps++;
for ( ProvenanceRegisterParameter param: prove.getParameters () )
{
if ( !"entity".equals ( param.getValueType () ) ) continue;
foundEntities++;
founda |= sname.equals ( param.getValue () ) && "a".equals ( param.getExtraValue () );
foundc |= sname.equals ( param.getValue () ) && "c".equals ( param.getExtraValue () );
foundd |= sname.equals ( param.getValue () ) && "d".equals ( param.getExtraValue () );
}
}
assertEquals ( "Wrong count of found operations!", 2, foundOps );
assertEquals ( "Wrong count of found entities!", 5, foundEntities );
assertTrue ( ":a not found!", founda );
assertTrue ( ":c not found!", foundc );
assertTrue ( ":d not found!", foundd );
provs = regMgr.findEntityMappingProv ( sname + ":b", Arrays.asList ( editorUser.getEmail () ) );
assertEquals ( "user filter didn't work!", 2, provs.size () );
provs = regMgr.findEntityMappingProv ( sname + ":b", Arrays.asList ( "foo.user" ) );
assertEquals ( "user filter didn't work!", 0, provs.size () );
String provsXml = regMgr.findEntityMappingProvAs ( "xml", sname + ":b", null );
log.info ( "Provenance-XML:\n{}", provsXml );
assertTrue ( "Wrong provenance XML!", provsXml.contains ( "<provenance>" ) );
assertTrue ( "Wrong provenance XML!", provsXml.contains ( "<entry operation=\"mapping.storeMappingBundle\"" ) );
assertTrue ( "Wrong provenance XML!", provsXml.contains ( "<parameter extra-value=\"c\"" ) );
}
@Test
public void testFindMappingProv ()
{
ServiceManager smgr = mgrFact.newServiceManager ( editorUser.getEmail (), editorSecret );
EntityIdResolver entityIdResolver = new EntityIdResolver ();
String sname = "prov.test.service2";
Service serv = new Service ( sname );
smgr.storeServices ( serv );
EntityMappingManager mmgr = mgrFact.newEntityMappingManager ( editorUser.getEmail (), editorSecret );
mmgr.storeMappings ( sname + ":a", sname + ":b" );
mmgr.storeMappings ( sname + ":b", sname + ":c" );
//mmgr.storeMappings ( sname + ":c", sname + ":d" );
mmgr.storeMappingBundle ( sname + ":c", sname + ":e", sname + ":d" );
mmgr.storeMappings ( sname + ":d", sname + ":a" );
ProvRegistryManager regMgr = mgrFact.newProvRegistryManager ( editorUser.getEmail (), editorSecret );
// First, return all the entries, no matter the users
Set<List<ProvenanceRegisterEntry>> provs = regMgr.findMappingProv ( sname + ":a", sname + ":d", null );
// Check
for ( List<ProvenanceRegisterEntry> provsl: provs )
log.info ( "Provenance chain returned for a-d:\n{}", provsl );
mmgr.deleteMappings ( sname + ":a" );
smgr.deleteServices ( sname );
boolean foundab = false, foundbc = false, foundcd = false, foundad = false;
int foundChains = provs.size (), foundOps = 0, foundEntities = 0;
for ( List<ProvenanceRegisterEntry> chain: provs )
{
for ( ProvenanceRegisterEntry prove: chain )
{
foundOps++;
foundab = foundab || prove.containsParameters (
ProvenanceRegisterParameter.pent ( entityIdResolver, Arrays.asList ( sname + ":a", sname + ":b" ) )
).size () == 2;
foundbc = foundbc || prove.containsParameters (
ProvenanceRegisterParameter.pent ( entityIdResolver, Arrays.asList ( sname + ":b", sname + ":c" ) )
).size () == 2;
foundcd = foundcd || prove.containsParameters (
ProvenanceRegisterParameter.pent ( entityIdResolver, Arrays.asList ( sname + ":c", sname + ":d" ) )
).size () == 2;
foundad = foundad || prove.containsParameters (
ProvenanceRegisterParameter.pent ( entityIdResolver, Arrays.asList ( sname + ":a", sname + ":d" ) )
).size () == 2;
for ( ProvenanceRegisterParameter param: prove.getParameters () )
if ( "entity".equals ( param.getValueType () ) ) foundEntities++;
}
}
assertEquals ( "Wrong count of found chains!", 2, foundChains );
assertEquals ( "Wrong count of found operations!", 4, foundOps );
assertEquals ( "Wrong count of found entities!", 9, foundEntities );
assertTrue ( "a-b not found!", foundab );
assertTrue ( "b-c not found!", foundbc );
assertTrue ( "c-d not found!", foundcd );
assertTrue ( "a-d not found!", foundad );
provs = regMgr.findMappingProv ( sname + ":a", sname + ":d", Arrays.asList ( editorUser.getEmail () ) );
assertEquals ( "user filter didn't work!", 2, provs.size () );
provs = regMgr.findMappingProv ( sname + ":a", sname + ":d", Arrays.asList ( "foo-user" ) );
assertEquals ( "user filter didn't work!", 0, provs.size () );
String provsXml = regMgr.findMappingProvAs ( "xml", sname + ":a", sname + ":d", null );
log.info ( "Provenance-XML:\n{}", provsXml );
assertTrue ( "Wrong provenance XML!", provsXml.contains ( "<provenance-entry-lists>" ) );
assertTrue ( "Wrong provenance XML!", provsXml.contains ( "<entries>" ) );
assertTrue ( "Wrong provenance XML!", provsXml.contains ( "<entry operation=\"mapping.storeMappingBundle\"" ) );
assertTrue ( "Wrong provenance XML!", provsXml.contains ( "<parameter extra-value=\"c\"" ) );
}
}