blob: 6895eb4c92a7f6b678ef5bfc1941dc669c76b553 [file] [log] [blame]
/**********************************************************************************************************************
* Copyright (c) 2008, 2014 Empolis Information Management GmbH and brox IT Solutions GmbH. All rights reserved. This
* program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which
* accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
**********************************************************************************************************************/
package org.eclipse.smila.scripting.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.eclipse.smila.datamodel.Any;
import org.eclipse.smila.datamodel.AnyMap;
import org.eclipse.smila.datamodel.AnySeq;
import org.eclipse.smila.datamodel.DataFactory;
import org.eclipse.smila.datamodel.Record;
import org.eclipse.smila.scripting.ScriptingEngine;
import org.eclipse.smila.solr.SolrServerService;
import org.eclipse.smila.utils.config.ConfigUtils;
import org.eclipse.smila.utils.service.ServiceUtils;
import org.junit.Before;
import org.junit.Test;
public class TestApplicationScripts {
private ScriptingEngine _engine;
private SolrServer _solrServer;
@Before
public void setup() throws Exception {
_engine = ServiceUtils.getService(ScriptingEngine.class);
_solrServer = ServiceUtils.getService(SolrServerService.class).getServer("collection1");
_solrServer.deleteByQuery("*:*");
commitToIndex();
}
private void commitToIndex() throws SolrServerException, IOException {
_solrServer.commit(true, true);
}
@Test
public void testSmilaScriptCatalog() throws Exception {
final List<String> expectedNames =
new ArrayList<String>(Arrays.asList(new String[] { "add.process", "delete.process", "search.process" }));
final AnySeq catalog = _engine.listScripts();
assertNotNull(catalog);
assertFalse(catalog.isEmpty());
for (final Any entry : catalog) {
assertTrue(entry.asMap().containsKey("name"));
assertTrue(entry.asMap().containsKey("description"));
if (expectedNames.remove(entry.asMap().getStringValue("name"))) {
assertEquals("_SMILA_UNIT_TESTS_", entry.asMap().getStringValue("version"));
}
}
assertTrue("Missing catalog entries for: " + expectedNames, expectedNames.isEmpty());
}
@Test
public void testIndexBuildAndSearch() throws Exception {
final Record addRecord = DataFactory.DEFAULT.createRecord("testIndexBuildAndSearch");
addRecord.getMetadata().put("Filename", "testIndexBuildAndSearch.html");
addRecord.getMetadata().put("MimeType", "text/html");
addRecord.getMetadata().put("Extension", "html");
addRecord.getMetadata().put("Size", "42");
addRecord.getMetadata().put("LastModifiedDate", DataFactory.DEFAULT.createDateTimeValue(new Date()));
addRecord.setAttachment("Content",
"<html><head><title>Hello World</title></head> <body> Indexed by script</body></html>".getBytes());
final Record addResult = _engine.callScript("application/add.process", addRecord);
assertNotNull(addResult);
commitToIndex();
final AnyMap query = DataFactory.DEFAULT.createAnyMap();
query.put("query", "script");
query.put("QueryAttribute", "Content");
query.getSeq("resultAttributes", true).add("_recordid");
query.getSeq("resultAttributes", true).add("Content");
query.getSeq("resultAttributes", true).add("Title");
query.getSeq("resultAttributes", true).add("Filename");
query.getSeq("resultAttributes", true).add("MimeType");
query.getSeq("resultAttributes", true).add("Extension");
query.getSeq("resultAttributes", true).add("Size");
query.getSeq("resultAttributes", true).add("LastModifiedDate");
final AnyMap result = _engine.callScript("application/search.process", query);
assertNotNull(result);
assertEquals(1, result.getLongValue("count").intValue());
final AnyMap foundRecord = result.getSeq("records").getMap(0);
assertEquals(addRecord.getMetadata().get("Filename"), foundRecord.get("Filename"));
assertEquals(addRecord.getMetadata().get("MimeType"), foundRecord.get("MimeType"));
assertEquals(addRecord.getMetadata().get("Extension"), foundRecord.get("Extension"));
assertEquals(addRecord.getMetadata().getLongValue("Size"), foundRecord.getLongValue("Size"));
assertEquals(addRecord.getMetadata().get("LastModifiedDate"), foundRecord.get("LastModifiedDate"));
assertEquals("Hello World", foundRecord.getSeq("Title").getStringValue(0));
assertTrue(foundRecord.getMap("_highlight").getMap("Content").getStringValue("text").contains("<b>script</b>"));
final Record delResult = _engine.callScript("application/delete.process", addRecord);
assertNotNull(delResult);
commitToIndex();
// SolrIndexPipelet does not support deleting records ... when it does we can use this code to check.
final AnyMap result2 = _engine.callScript("application/search.process", query);
assertNotNull(result2);
assertEquals(0, result.getLongValue("count").intValue());
}
@Test
public void testAddWithXmlSplit() throws Exception {
final File xmlFile = ConfigUtils.getConfigFile("data", "split.xml");
final Record addRecord = DataFactory.DEFAULT.createRecord("testAddWithXmlSplit");
addRecord.getMetadata().put("Path", xmlFile.getAbsolutePath().toString());
addRecord.getMetadata().put("Extension", "xml");
addRecord.getMetadata().put("Size", "42");
addRecord.getMetadata().put("LastModifiedDate", DataFactory.DEFAULT.createDateTimeValue(new Date()));
final Record addResult = _engine.callScript("application/addWithXmlSplit.processRecord", addRecord);
assertNotNull(addResult);
commitToIndex();
final AnyMap query = DataFactory.DEFAULT.createAnyMap();
query.put("query", "*:*");
query.getSeq("resultAttributes", true).add("_recordid");
query.getSeq("resultAttributes", true).add("Content");
query.getSeq("resultAttributes", true).add("Title");
final AnyMap result = _engine.callScript("application/search.process", query);
assertNotNull(result);
assertEquals(3, result.getLongValue("count").intValue());
for (final Any record : result.getSeq("records")) {
assertTrue(record.asMap().getSeq("Title").getStringValue(0).startsWith("title"));
assertTrue(record.asMap().getStringValue("Content").startsWith("text"));
}
}
// @Test
public void testManyManyRequests() throws Exception {
final Record addRecord = DataFactory.DEFAULT.createRecord("testIndexBuildAndSearch");
addRecord.getMetadata().put("Filename", "testIndexBuildAndSearch.html");
addRecord.getMetadata().put("MimeType", "text/html");
addRecord.getMetadata().put("Extension", "html");
addRecord.getMetadata().put("Size", "42");
addRecord.getMetadata().put("LastModifiedDate", DataFactory.DEFAULT.createDateTimeValue(new Date()));
addRecord.setAttachment("Content",
"<html><head><title>Hello World</title></head> <body> Indexed by script</body></html>".getBytes());
final Record addResult = _engine.callScript("application/add.process", addRecord);
assertNotNull(addResult);
commitToIndex();
final AnyMap query = DataFactory.DEFAULT.createAnyMap();
query.put("query", "script");
query.put("QueryAttribute", "Content");
query.getSeq("resultAttributes", true).add("Content");
query.getSeq("resultAttributes", true).add("Title");
query.getSeq("resultAttributes", true).add("Filename");
query.getSeq("resultAttributes", true).add("MimeType");
query.getSeq("resultAttributes", true).add("Extension");
query.getSeq("resultAttributes", true).add("Size");
query.getSeq("resultAttributes", true).add("LastModifiedDate");
for (int i = 0; i < Integer.MAX_VALUE; i++) {
final AnyMap result = _engine.callScript("application/search.process", query);
assertNotNull(result);
assertEquals(1, result.getLongValue("count").intValue());
if (i % 1000 == 0) {
final Runtime r = Runtime.getRuntime();
System.out.printf("After %d requests: Memory free %.1f, total %.1f, max %.1f\n", i, r.freeMemory() / 1e6,
r.totalMemory() / 1e6, r.maxMemory() / 1e6);
}
}
}
}