package com.google.refine.test.org.deri.reconcile;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.StringWriter;
import org.json.JSONException;
import org.json.JSONWriter;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.google.refine.org.deri.reconcile.GRefineServiceManager;
import com.google.refine.org.deri.reconcile.ServiceRegistry;
import com.google.refine.org.deri.reconcile.model.ReconciliationRequest;
import com.google.refine.org.deri.reconcile.model.ReconciliationService;
import com.google.refine.org.deri.reconcile.rdf.RdfReconciliationService;
import com.google.refine.org.deri.reconcile.rdf.endpoints.QueryEndpointImpl;
import com.google.refine.org.deri.reconcile.rdf.executors.DumpQueryExecutor;
import com.google.refine.org.deri.reconcile.rdf.executors.RemoteQueryExecutor;
import com.google.refine.org.deri.reconcile.rdf.factories.LarqSparqlQueryFactory;
import com.google.refine.org.deri.reconcile.util.GRefineJsonUtilitiesImpl;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
public class GRefineServiceManagerTest {
String url = "http://example.org/endpoint";
File dir = new File("tmp");
@BeforeClass
public void setUp() throws IOException{
//empty dir if it exists
if(dir.exists()){
String[] children = dir.list();
for (int i=0; i<children.length; i++) {
boolean success = new File(dir, children[i]).delete();
if (!success) {
throw new IOException("unable to delete " + children[i]);
}
}
boolean success = dir.delete();
if(!success){
throw new IOException("unable to delete " + dir);
}
}
boolean res = dir.mkdir();
if(!res){
throw new IOException("unable to create " + dir);
}
File file = new File(dir,"services");
file.createNewFile();
}
@Test
public void saveServiceTest() throws JSONException, IOException{
String id = "sparql-test";
ServiceRegistry registry = new ServiceRegistry(new GRefineJsonUtilitiesImpl(),null);
GRefineServiceManager manager = new GRefineServiceManager(registry, dir);
ReconciliationService service = new RdfReconciliationService(id, id, new QueryEndpointImpl(new LarqSparqlQueryFactory(), new RemoteQueryExecutor(url, null)), 0);
manager.addService(service);
assertTrue(registry.hasService(id));
//verify service is saved
registry = new ServiceRegistry(new GRefineJsonUtilitiesImpl(),null);
//verify no service
assertFalse(registry.hasService(id));
File file = new File(dir,"services");
//verify saved
assertTrue(file.exists());
FileInputStream in = new FileInputStream(file);
registry.loadFromFile(in);
//verify service is loaded
verifyCorrectService(registry.getService(id, null), service);
}
@Test
public void saveRdfServiceTest() throws JSONException, IOException{
String id = "rdf-test";
ServiceRegistry registry = new ServiceRegistry(new GRefineJsonUtilitiesImpl(),null);
GRefineServiceManager manager = new GRefineServiceManager(registry, dir);
Model m = ModelFactory.createDefaultModel();
ReconciliationService service = new RdfReconciliationService(id,id, new QueryEndpointImpl(new LarqSparqlQueryFactory(),
new DumpQueryExecutor(m)), 0);
manager.addAndSaveService(service);
assertTrue(registry.hasService(id));
//verify service is saved
registry = new ServiceRegistry(new GRefineJsonUtilitiesImpl(),null);
//verify no service
assertFalse(registry.hasService(id));
File file = new File(dir,"services");
//verify saved
assertTrue(file.exists());
FileInputStream in = new FileInputStream(file);
registry.loadFromFile(in);
//verify service is loaded
ReconciliationService service2 = registry.getService(id, null);
verifyCorrectService(service2, service);
//verify service is not initialized
ReconciliationRequest request = new ReconciliationRequest("query", 10);
String msg = "";
try{
service2.reconcile(request);
}catch(RuntimeException e){
msg = e.getMessage();
}
assertTrue(msg.equals("Model is not loaded"));
FileInputStream modelIn = new FileInputStream(new File(dir,id + ".ttl"));
ReconciliationService service3 = registry.getService(id, modelIn);
assertTrue(service3.reconcile(request).getResults().isEmpty());
}
private void verifyCorrectService(ReconciliationService service,ReconciliationService expected) throws JSONException {
StringWriter w1 = new StringWriter();
JSONWriter j1 = new JSONWriter(w1);
StringWriter w2 = new StringWriter();
JSONWriter j2 = new JSONWriter(w2);
service.writeAsJson(j1);
expected.writeAsJson(j2);
w1.flush(); w2.flush();
assertEquals(w1.toString(), w2.toString());
}
}