Index: src/test/org/apache/lucene/util/LuceneTestCase.java =================================================================== --- src/test/org/apache/lucene/util/LuceneTestCase.java (revision 1035418) +++ src/test/org/apache/lucene/util/LuceneTestCase.java (working copy) @@ -35,6 +35,8 @@ import org.apache.lucene.index.codecs.preflex.PreFlexCodec; import org.apache.lucene.index.codecs.preflexrw.PreFlexRWCodec; import org.apache.lucene.index.codecs.pulsing.PulsingCodec; +import org.apache.lucene.index.codecs.simpletext.SimpleTextCodec; +import org.apache.lucene.index.codecs.standard.StandardCodec; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.FieldCache; import org.apache.lucene.search.FieldCache.CacheEntry; @@ -69,6 +71,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.IdentityHashMap; import java.util.Iterator; import java.util.List; @@ -152,6 +155,9 @@ static final int TEST_ITER = Integer.parseInt(System.getProperty("tests.iter", "1")); /** Get the random seed for tests */ static final String TEST_SEED = System.getProperty("tests.seed", "random"); + /** Gets if a random codec per field should be used */ + static final boolean TEST_RAMDOM_PER_FIELD_CODEC = Boolean.parseBoolean(System.getProperty("tests.randomcodec", "false")); + private static final Pattern codecWithParam = Pattern.compile("(.*)\\(\\s*(\\d+)\\s*\\)"); @@ -316,6 +322,7 @@ timeZone = TEST_TIMEZONE.equals("random") ? randomTimeZone(random) : TimeZone.getTimeZone(TEST_TIMEZONE); TimeZone.setDefault(timeZone); testsFailed = false; + randomCodecProvider = new RandomCodecProvider(random); } @AfterClass @@ -636,7 +643,9 @@ logmp.setCalibrateSizeByDeletes(r.nextBoolean()); logmp.setMergeFactor(_TestUtil.nextInt(r, 2, 20)); } - + if (TEST_RAMDOM_PER_FIELD_CODEC) { + c.setCodecProvider(randomCodecProvider); + } c.setReaderPooling(r.nextBoolean()); c.setReaderTermsIndexDivisor(_TestUtil.nextInt(r, 1, 4)); return c; @@ -838,6 +847,8 @@ // seed for individual test methods, changed in @before private long seed; + protected static CodecProvider randomCodecProvider; + private static final Random seedRand = new Random(); protected static final Random random = new Random(); @@ -901,4 +912,40 @@ } } } + + static class RandomCodecProvider extends CodecProvider { + + private final Codec[] codecs; + private final Map perFieldMap = new HashMap(); + private final Random random; + + RandomCodecProvider(Random random) { + this.codecs = new Codec[] { new StandardCodec(), new SimpleTextCodec(), + new MockSepCodec(), new PulsingCodec(1 + random.nextInt(10)), + new MockVariableIntBlockCodec(1 + random.nextInt(10)), + new MockFixedIntBlockCodec(1 + random.nextInt(10)) }; + for (int i = 0; i < codecs.length; i++) { + super.register(codecs[i]); + } + // register preflex to support reading of old indexes + this.register(new PreFlexCodec()); + this.random = random; + } + + @Override + public synchronized String getFieldCodec(String name) { + if (!perFieldMap.containsKey(name)) { // select a codec at random + setFieldCodec(name, codecs[random.nextInt(codecs.length)].name); + } + return super.getFieldCodec(name); + } + + @Override + public synchronized void setFieldCodec(String field, String codec) { + if (!perFieldMap.containsKey(field)) { + perFieldMap.put(field, codec); + } + super.setFieldCodec(field, codec); + } + } }