//Dstl (c) Crown Copyright 2017 package uk.gov.dstl.baleen.consumers.template; import static org.junit.Assert.assertEquals; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Map; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.uima.UIMAException; import org.apache.uima.analysis_engine.AnalysisEngine; import org.apache.uima.analysis_engine.AnalysisEngineProcessException; import org.apache.uima.fit.factory.ExternalResourceFactory; import org.apache.uima.resource.ExternalResourceDescription; import org.apache.uima.resource.ResourceInitializationException; import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest; import org.elasticsearch.action.admin.indices.refresh.RefreshRequest; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.Client; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.node.Node; import org.elasticsearch.node.NodeBuilder; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import uk.gov.dstl.baleen.resources.SharedElasticsearchRestResource; public class ElasticsearchTemplateRecordConsumerTest extends AbstractTemplateRecordConsumerTest { private static final String ELASTICSEARCH = "elasticsearchRest"; private static final String BALEEN_INDEX = "baleen_record_index"; private static Path tmpDir; private static Client client; private static Node node; private AnalysisEngine analysisEngine; @BeforeClass public static void setupLocalElasticsearch() throws UIMAException { // Initialise a local instance of Elasticsearch try { tmpDir = Files.createTempDirectory("elasticsearch"); } catch (IOException ioe) { throw new ResourceInitializationException(ioe); } // Don't use the default ports for testing purposes Settings settings = Settings.builder().put("path.home", tmpDir.toString()).put("http.port", "29200") .put("transport.tcp.port", "29300").build(); node = NodeBuilder.nodeBuilder().settings(settings).data(true).local(true).clusterName("test_cluster").node(); client = node.client(); } public ElasticsearchTemplateRecordConsumerTest() { super(ElasticsearchTemplateRecordConsumer.class); } @Before public void beforeElasticsearchRecordConsumerTest() throws ResourceInitializationException { ExternalResourceDescription erd = ExternalResourceFactory.createExternalResourceDescription(ELASTICSEARCH, SharedElasticsearchRestResource.class, "elasticsearchrest.url", "http://localhost:29200"); analysisEngine = getAnalysisEngine(ELASTICSEARCH, erd); client.admin().indices().refresh(new RefreshRequest("baleen_record_index")).actionGet(); } @Test public void testSave() throws Exception { assertEquals(new Long(0), getCount()); process(); assertEquals(new Long(3), getCount()); } @Test public void testRecords() throws JsonParseException, JsonMappingException, IOException, AnalysisEngineProcessException { assertEquals(new Long(0), getCount()); process(); SearchHits hits = client.search(new SearchRequest().indices("baleen_record_index")).actionGet().getHits(); assertEquals(3, hits.getTotalHits()); ObjectMapper mapper = new ObjectMapper(); Collection<ExtractedRecord> records = new ArrayList<>(); for (SearchHit hit : hits.getHits()) { String json = hit.getSourceAsString(); ElasticsearchExtractedRecord er = mapper.readValue(json, ElasticsearchExtractedRecord.class); records.add(er); } assertEquals(3, records.size()); Map<String, Collection<ExtractedRecord>> recordsMap = new HashMap<>(); recordsMap.put(annotatorClass.getSimpleName(), records); checkRecords(recordsMap); } private void process() throws AnalysisEngineProcessException { analysisEngine.process(jCas); client.admin().indices().refresh(new RefreshRequest("baleen_record_index")).actionGet(); } private Long getCount() { SearchResponse sr = client.prepareSearch(BALEEN_INDEX).setSize(0).execute().actionGet(); return sr.getHits().getTotalHits(); } @After public void afterElasticsearchRecordConsumerTest() { analysisEngine.destroy(); client.admin().indices().delete(new DeleteIndexRequest("baleen_record_index")).actionGet(); } @AfterClass public static void destroyLocalElasticSearch() { client.close(); node.close(); } }