LUCENE-2390: fix random remote test failures and refactor tests

git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@932795 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Robert Muir 2010-04-10 21:44:06 +00:00
parent b5b5f24167
commit b20f103fd7
5 changed files with 125 additions and 160 deletions

View File

@ -0,0 +1,79 @@
package org.apache.lucene.search;
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.ServerSocket;
import java.net.Socket;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.RMIClientSocketFactory;
import java.rmi.server.RMIServerSocketFactory;
import org.apache.lucene.util.LuceneTestCaseJ4;
import org.junit.AfterClass;
/**
* Base class for remote tests.
* <p>
* Call {@link #startServer(Searchable)} in a {@link #BeforeClass} annotated method
* to start the server.
* Call {@link #lookupRemote} to get a RemoteSearchable.
*/
public abstract class RemoteTestCaseJ4 extends LuceneTestCaseJ4 {
private static int port;
public static void startServer(Searchable searchable) throws Exception {
// publish it
// use our own factories for testing, so we can bind to an ephemeral port.
RMIClientSocketFactory clientFactory = new RMIClientSocketFactory() {
public Socket createSocket(String host, int port) throws IOException {
return new Socket(host, port);
}};
class TestRMIServerSocketFactory implements RMIServerSocketFactory {
ServerSocket socket;
public ServerSocket createServerSocket(int port) throws IOException {
return (socket = new ServerSocket(port));
}
};
TestRMIServerSocketFactory serverFactory = new TestRMIServerSocketFactory();
LocateRegistry.createRegistry(0, clientFactory, serverFactory);
RemoteSearchable impl = new RemoteSearchable(searchable);
port = serverFactory.socket.getLocalPort();
Naming.rebind("//localhost:" + port + "/Searchable", impl);
}
@AfterClass
public static void stopServer() {
try {
Naming.unbind("//localhost:" + port + "/Searchable");
} catch (RemoteException e) {
} catch (MalformedURLException e) {
} catch (NotBoundException e) {
}
}
public static Searchable lookupRemote() throws Exception {
return (Searchable)Naming.lookup("//localhost:" + port + "/Searchable");
}
}

View File

@ -17,12 +17,6 @@ package org.apache.lucene.search;
* limitations under the License.
*/
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
import org.apache.lucene.util.LuceneTestCase;
import org.apache.lucene.util._TestUtil;
import org.apache.lucene.analysis.SimpleAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
@ -30,32 +24,17 @@ import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.store.RAMDirectory;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Tests that the index is cached on the searcher side of things.
* NOTE: This is copied from TestRemoteSearchable since it already had a remote index set up.
*/
public class TestRemoteCachingWrapperFilter extends LuceneTestCase {
public TestRemoteCachingWrapperFilter(String name) {
super(name);
}
private static Searchable getRemote() throws Exception {
try {
return lookupRemote();
} catch (Throwable e) {
startServer();
return lookupRemote();
}
}
private static Searchable lookupRemote() throws Exception {
return (Searchable)Naming.lookup("//localhost:" + port + "/Searchable");
}
private static int port;
private static void startServer() throws Exception {
public class TestRemoteCachingWrapperFilter extends RemoteTestCaseJ4 {
@BeforeClass
public static void beforeClass() throws Exception {
// construct an index
RAMDirectory indexStore = new RAMDirectory();
IndexWriter writer = new IndexWriter(indexStore, new IndexWriterConfig(
@ -74,17 +53,12 @@ public class TestRemoteCachingWrapperFilter extends LuceneTestCase {
writer.addDocument(doc);
writer.optimize();
writer.close();
// publish it
port = _TestUtil.getRandomSocketPort();
LocateRegistry.createRegistry(port);
Searchable local = new IndexSearcher(indexStore, true);
RemoteSearchable impl = new RemoteSearchable(local);
Naming.rebind("//localhost:" + port + "/Searchable", impl);
startServer(local);
}
private static void search(Query query, Filter filter, int hitNumber, String typeValue) throws Exception {
Searchable[] searchables = { getRemote() };
Searchable[] searchables = { lookupRemote() };
Searcher searcher = new MultiSearcher(searchables);
ScoreDoc[] result = searcher.search(query,filter, 1000).scoreDocs;
assertEquals(1, result.length);
@ -94,7 +68,7 @@ public class TestRemoteCachingWrapperFilter extends LuceneTestCase {
assertTrue("document.getFields() Size: " + document.getFields().size() + " is not: " + 3, document.getFields().size() == 3);
}
@Test
public void testTermRemoteFilter() throws Exception {
CachingWrapperFilterHelper cwfh = new CachingWrapperFilterHelper(new QueryWrapperFilter(new TermQuery(new Term("type", "a"))));

View File

@ -17,46 +17,25 @@ package org.apache.lucene.search;
* limitations under the License.
*/
import org.apache.lucene.util.LuceneTestCase;
import org.apache.lucene.util._TestUtil;
import org.apache.lucene.analysis.SimpleAnalyzer;
import org.apache.lucene.document.*;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.store.RAMDirectory;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
import java.util.Collections;
import java.util.Set;
import java.util.HashSet;
public class TestRemoteSearchable extends LuceneTestCase {
public TestRemoteSearchable(String name) {
super(name);
}
public class TestRemoteSearchable extends RemoteTestCaseJ4 {
private static int port = -1;
private static Searchable getRemote() throws Exception {
if (port == -1) {
startServer();
}
try {
return lookupRemote();
} catch (Throwable e) {
startServer();
return lookupRemote();
}
}
private static Searchable lookupRemote() throws Exception {
return (Searchable)Naming.lookup("//localhost:" + port + "/Searchable");
}
private static void startServer() throws Exception {
@BeforeClass
public static void beforeClass() throws Exception {
// construct an index
RAMDirectory indexStore = new RAMDirectory();
IndexWriter writer = new IndexWriter(indexStore, new IndexWriterConfig(
@ -67,18 +46,13 @@ public class TestRemoteSearchable extends LuceneTestCase {
writer.addDocument(doc);
writer.optimize();
writer.close();
// publish it
port = _TestUtil.getRandomSocketPort();
LocateRegistry.createRegistry(port);
Searchable local = new IndexSearcher(indexStore, true);
RemoteSearchable impl = new RemoteSearchable(local);
Naming.rebind("//localhost:" + port + "/Searchable", impl);
startServer(local);
}
private static void search(Query query) throws Exception {
// try to search the published index
Searchable[] searchables = { getRemote() };
Searchable[] searchables = { lookupRemote() };
Searcher searcher = new MultiSearcher(searchables);
ScoreDoc[] result = searcher.search(query, null, 1000).scoreDocs;
@ -99,16 +73,19 @@ public class TestRemoteSearchable extends LuceneTestCase {
assertTrue("document.getFields() Size: " + document.getFields().size() + " is not: " + 1, document.getFields().size() == 1);
}
@Test
public void testTermQuery() throws Exception {
search(new TermQuery(new Term("test", "test")));
}
@Test
public void testBooleanQuery() throws Exception {
BooleanQuery query = new BooleanQuery();
query.add(new TermQuery(new Term("test", "test")), BooleanClause.Occur.MUST);
search(query);
}
@Test
public void testPhraseQuery() throws Exception {
PhraseQuery query = new PhraseQuery();
query.add(new Term("test", "test"));
@ -117,9 +94,10 @@ public class TestRemoteSearchable extends LuceneTestCase {
}
// Tests bug fix at http://nagoya.apache.org/bugzilla/show_bug.cgi?id=20290
@Test
public void testQueryFilter() throws Exception {
// try to search the published index
Searchable[] searchables = { getRemote() };
Searchable[] searchables = { lookupRemote() };
Searcher searcher = new MultiSearcher(searchables);
ScoreDoc[] hits = searcher.search(
new TermQuery(new Term("test", "text")),
@ -131,9 +109,10 @@ public class TestRemoteSearchable extends LuceneTestCase {
assertEquals(0, nohits.length);
}
@Test
public void testConstantScoreQuery() throws Exception {
// try to search the published index
Searchable[] searchables = { getRemote() };
Searchable[] searchables = { lookupRemote() };
Searcher searcher = new MultiSearcher(searchables);
ScoreDoc[] hits = searcher.search(
new ConstantScoreQuery(new QueryWrapperFilter(

View File

@ -17,19 +17,14 @@ package org.apache.lucene.search;
* limitations under the License.
*/
import static org.junit.Assert.assertEquals;
import java.io.IOException;
import java.io.Serializable;
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Locale;
import java.util.Random;
import junit.framework.Test;
import junit.framework.TestSuite;
import junit.textui.TestRunner;
import org.apache.lucene.analysis.SimpleAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
@ -38,10 +33,11 @@ import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.LogMergePolicy;
import org.apache.lucene.index.Term;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.LuceneTestCase;
import org.apache.lucene.util._TestUtil;
import org.apache.lucene.util.BytesRef;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* Unit tests for remote sorting code.
@ -49,40 +45,15 @@ import org.apache.lucene.util._TestUtil;
* methods and therefore unused members and methodes.
*/
public class TestRemoteSort extends LuceneTestCase implements Serializable {
public class TestRemoteSort extends RemoteTestCaseJ4 {
private Searcher full;
private static IndexSearcher full;
private Query queryX;
private Query queryY;
private Query queryA;
private Query queryF;
private Sort sort;
public TestRemoteSort (String name) {
super (name);
}
public static void main (String[] argv) {
if (argv == null || argv.length < 1)
TestRunner.run (suite());
else if ("server".equals (argv[0])) {
TestRemoteSort test = new TestRemoteSort (null);
try {
test.startServer();
Thread.sleep (500000);
} catch (Exception e) {
System.out.println (e);
e.printStackTrace();
}
}
}
public static Test suite() {
return new TestSuite (TestRemoteSort.class);
}
// document data:
// the tracer field is used to determine which document was hit
// the contents field is used to search and sort by relevance
@ -90,7 +61,7 @@ public class TestRemoteSort extends LuceneTestCase implements Serializable {
// the float field to sort by float
// the string field to sort by string
// the i18n field includes accented characters for testing locale-specific sorting
private String[][] data = new String[][] {
private static final String[][] data = new String[][] {
// tracer contents int float string custom i18n long double, 'short', byte, 'custom parser encoding'
{ "A", "x a", "5", "4f", "c", "A-3", "p\u00EAche", "10", "-4.0", "3", "126", "J"},//A, x
{ "B", "y a", "5", "3.4028235E38", "i", "B-10", "HAT", "1000000000", "40.0", "24", "1", "I"},//B, y
@ -109,15 +80,14 @@ public class TestRemoteSort extends LuceneTestCase implements Serializable {
};
// create an index of all the documents, or just the x, or just the y documents
private Searcher getIndex (boolean even, boolean odd)
throws IOException {
@BeforeClass
public static void beforeClass() throws Exception {
RAMDirectory indexStore = new RAMDirectory ();
IndexWriter writer = new IndexWriter(indexStore, new IndexWriterConfig(
TEST_VERSION_CURRENT, new SimpleAnalyzer(TEST_VERSION_CURRENT))
.setMaxBufferedDocs(2));
((LogMergePolicy) writer.getConfig().getMergePolicy()).setMergeFactor(1000);
for (int i=0; i<data.length; ++i) {
if (((i%2)==0 && even) || ((i%2)==1 && odd)) {
Document doc = new Document();
doc.add (new Field ("tracer", data[i][0], Field.Store.YES, Field.Index.NO));
doc.add (new Field ("contents", data[i][1], Field.Store.NO, Field.Index.ANALYZED));
@ -133,18 +103,12 @@ public class TestRemoteSort extends LuceneTestCase implements Serializable {
if (data[i][11] != null) doc.add (new Field ("parser", data[i][11], Field.Store.NO, Field.Index.NOT_ANALYZED));
doc.setBoost(2); // produce some scores above 1.0
writer.addDocument (doc);
}
}
//writer.optimize ();
writer.close ();
IndexSearcher s = new IndexSearcher (indexStore, false);
s.setDefaultFieldSortScoring(true, true);
return s;
}
private Searcher getFullIndex()
throws IOException {
return getIndex (true, true);
full = new IndexSearcher (indexStore, false);
full.setDefaultFieldSortScoring(true, true);
startServer(full);
}
public String getRandomNumberString(int num, int low, int high) {
@ -177,9 +141,9 @@ public class TestRemoteSort extends LuceneTestCase implements Serializable {
}
@Override
protected void setUp() throws Exception {
@Before
public void setUp() throws Exception {
super.setUp();
full = getFullIndex();
queryX = new TermQuery (new Term ("contents", "x"));
queryY = new TermQuery (new Term ("contents", "y"));
queryA = new TermQuery (new Term ("contents", "a"));
@ -240,8 +204,9 @@ public class TestRemoteSort extends LuceneTestCase implements Serializable {
}
// test a variety of sorts using a remote searcher
@Test
public void testRemoteSort() throws Exception {
Searchable searcher = getRemote();
Searchable searcher = lookupRemote();
MultiSearcher multi = new MultiSearcher (new Searchable[] { searcher });
runMultiSorts(multi, true); // this runs on the full index
}
@ -271,6 +236,7 @@ public class TestRemoteSort extends LuceneTestCase implements Serializable {
// test that the relevancy scores are the same even if
// hits are sorted
@Test
public void testNormalizedScores() throws Exception {
// capture relevancy scores
@ -279,7 +245,7 @@ public class TestRemoteSort extends LuceneTestCase implements Serializable {
HashMap<String,Float> scoresA = getScores (full.search (queryA, null, 1000).scoreDocs, full);
// we'll test searching locally, remote and multi
MultiSearcher remote = new MultiSearcher (new Searchable[] { getRemote() });
MultiSearcher remote = new MultiSearcher (new Searchable[] { lookupRemote() });
// change sorting and make sure relevancy stays the same
@ -447,32 +413,4 @@ public class TestRemoteSort extends LuceneTestCase implements Serializable {
}
}
}
private Searchable getRemote () throws Exception {
try {
return lookupRemote ();
} catch (Throwable e) {
startServer ();
return lookupRemote ();
}
}
private Searchable lookupRemote () throws Exception {
return (Searchable) Naming.lookup ("//localhost:" + port + "/SortedSearchable");
}
private int port = -1;
private void startServer () throws Exception {
// construct an index
port = _TestUtil.getRandomSocketPort();
Searcher local = getFullIndex();
// local.search (queryA, new Sort());
// publish it
LocateRegistry.createRegistry (port);
RemoteSearchable impl = new RemoteSearchable (local);
Naming.rebind ("//localhost:" + port + "/SortedSearchable", impl);
}
}

View File

@ -111,9 +111,4 @@ public class _TestUtil {
buf.append("]");
return buf.toString();
}
public static int getRandomSocketPort() {
return 1024 + new Random().nextInt(64512);
}
}