package lux.solr;
import static org.junit.Assert.*;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import lux.xml.tinybin.TinyBinary;
import net.sf.saxon.s9api.Processor;
import net.sf.saxon.s9api.XdmNode;
import net.sf.saxon.tree.tiny.TinyDocumentImpl;
import org.apache.commons.io.FileUtils;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.core.CoreContainer;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
public class TLogTest extends BaseSolrTest {
private TinyBinary schemaXml;
private Processor processor;
private static final Charset UTF8 = Charset.forName("utf-8");
@Before
public void init () throws IOException {
processor = new Processor(false);
}
/*
* Make sure we can replay transactions from the log by
* write
* shut down
* restart
* commit
* What made this test go south all of a sudden?
*/
@Test @Ignore
public void testTransactionLog () throws Exception {
solrCore = null;
// add some documents
Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument> ();
BaseSolrTest.addSolrDocFromFile("src/test/resources/conf/schema.xml", docs);
BaseSolrTest.addSolrDocFromFile("src/test/resources/conf/solrconfig.xml", docs);
solr.add(docs);
QueryResponse response = search ("lux_uri:src/test/resources/conf/schema.xml");
assertEquals (0, response.getResults().getNumFound());
// soft commit -- note must waitSearcher in order to see commit
// we want it in the tlog, but not saved out to the index yet
solr.commit(true, true, true);
response = search ("lux_uri:src/test/resources/conf/schema.xml");
assertEquals (1, response.getResults().getNumFound());
assertEquals ("src/test/resources/conf/schema.xml", response.getResults().get(0).get("lux_uri"));
List<?> xml = (List<?>) response.getResults().get(0).get("lux_xml");
schemaXml = new TinyBinary ((byte[]) xml.get(0), UTF8);
// copy contents of solr data folder to temporary area to simulate hard shutdown
copyDirectory ("solr/collection1/data/tlog", "solr/tlog-backup");
System.out.println ("shut down solr");
// shut down
coreContainer.getCore("collection1").close();
//solr.shutdown();
coreContainer.shutdown();
solr.shutdown();
File lock = new File("solr/collection1/data/index/write.lock");
if (lock.exists()) {
System.err.println ("solr did not shut down cleanly");
assertTrue (lock.delete());
}
// restore contents of data directory to before we shutdown
removeDirectory ("solr/collection1/data/tlog");
copyDirectory ("solr/tlog-backup", "solr/collection1/data/tlog");
removeDirectory ("solr/tlog-backup");
System.out.println ("start solr up again");
// start up again
coreContainer = new CoreContainer();
coreContainer.load();
solr = new EmbeddedSolrServer(coreContainer, "collection1");
// retrieve the documents (from the replayed transaction log):
validateContent ();
// commit
solr.commit();
validateContent ();
coreContainer.getCore("collection1").close();
}
private void removeDirectory(String directory) throws IOException {
FileUtils.deleteDirectory(new File(directory));
}
/*
private void cleanDirectory(String directory) throws IOException {
FileUtils.cleanDirectory(new File(directory));
}
*/
private void copyDirectory(String srcDir, String destDir) throws IOException {
FileUtils.copyDirectory(new File(srcDir), new File(destDir));
}
private void validateContent () throws SolrServerException {
QueryResponse response = search ("*:*");
assertEquals (2, response.getResults().getNumFound());
assertEquals ("src/test/resources/conf/schema.xml", response.getResults().get(0).get("lux_uri"));
List<?> xml = (List<?>) response.getResults().get(0).get("lux_xml");
TinyDocumentImpl schema = schemaXml.getTinyDocument(processor.getUnderlyingConfiguration());
assertNotNull ("no xml stored for schema.xml", xml);
TinyBinary retrieved = new TinyBinary ((byte[]) xml.get(0), UTF8);
TinyDocumentImpl result = retrieved.getTinyDocument(processor.getUnderlyingConfiguration());
assertEquals (new XdmNode(schema).toString(), new XdmNode(result).toString());
}
private QueryResponse search (String q) throws SolrServerException {
SolrQuery query = new SolrQuery();
query.setQuery (q);
query.addField("lux_uri");
query.addField("lux_xml");
return solr.query(query);
}
}
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */