LUCENE-5196: add LuceneTestCase.OLD_FORMAT_IMPERSONATION_IS_ACTIVE

git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1519258 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Shai Erera 2013-09-01 10:35:58 +00:00
parent 2ddb8154f4
commit 1b9c6a24d4
8 changed files with 100 additions and 28 deletions

View File

@ -30,10 +30,14 @@ import org.apache.lucene.codecs.FieldsProducer;
import org.apache.lucene.codecs.PostingsConsumer; import org.apache.lucene.codecs.PostingsConsumer;
import org.apache.lucene.codecs.TermStats; import org.apache.lucene.codecs.TermStats;
import org.apache.lucene.codecs.TermsConsumer; import org.apache.lucene.codecs.TermsConsumer;
import org.apache.lucene.codecs.lucene40.Lucene40RWCodec;
import org.apache.lucene.codecs.lucene41.Lucene41RWCodec;
import org.apache.lucene.codecs.lucene42.Lucene42RWCodec;
import org.apache.lucene.codecs.mocksep.MockSepPostingsFormat; import org.apache.lucene.codecs.mocksep.MockSepPostingsFormat;
import org.apache.lucene.document.Document; import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field.Store; import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.FieldType; import org.apache.lucene.document.FieldType;
import org.apache.lucene.document.NumericDocValuesField;
import org.apache.lucene.document.StringField; import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField; import org.apache.lucene.document.TextField;
import org.apache.lucene.index.FieldInfo.DocValuesType; import org.apache.lucene.index.FieldInfo.DocValuesType;
@ -695,4 +699,30 @@ public class TestCodecs extends LuceneTestCase {
dir.close(); dir.close();
} }
public void testDisableImpersonation() throws Exception {
Codec[] oldCodecs = new Codec[] { new Lucene40RWCodec(), new Lucene41RWCodec(), new Lucene42RWCodec() };
Directory dir = newDirectory();
IndexWriterConfig conf = newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random()));
conf.setCodec(oldCodecs[random().nextInt(oldCodecs.length)]);
IndexWriter writer = new IndexWriter(dir, conf);
Document doc = new Document();
doc.add(new StringField("f", "bar", Store.YES));
doc.add(new NumericDocValuesField("n", 18L));
writer.addDocument(doc);
OLD_FORMAT_IMPERSONATION_IS_ACTIVE = false;
try {
writer.close();
fail("should not have succeeded to impersonate an old format!");
} catch (UnsupportedOperationException e) {
writer.rollback();
} finally {
OLD_FORMAT_IMPERSONATION_IS_ACTIVE = true;
}
dir.close();
}
} }

View File

@ -6,6 +6,7 @@ import org.apache.lucene.codecs.DocValuesFormat;
import org.apache.lucene.codecs.FieldInfosFormat; import org.apache.lucene.codecs.FieldInfosFormat;
import org.apache.lucene.codecs.FieldInfosWriter; import org.apache.lucene.codecs.FieldInfosWriter;
import org.apache.lucene.codecs.NormsFormat; import org.apache.lucene.codecs.NormsFormat;
import org.apache.lucene.util.LuceneTestCase;
/* /*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
@ -25,11 +26,17 @@ import org.apache.lucene.codecs.NormsFormat;
*/ */
/** Read-write version of Lucene40Codec for testing */ /** Read-write version of Lucene40Codec for testing */
@SuppressWarnings("deprecation")
public final class Lucene40RWCodec extends Lucene40Codec { public final class Lucene40RWCodec extends Lucene40Codec {
private final FieldInfosFormat fieldInfos = new Lucene40FieldInfosFormat() { private final FieldInfosFormat fieldInfos = new Lucene40FieldInfosFormat() {
@Override @Override
public FieldInfosWriter getFieldInfosWriter() throws IOException { public FieldInfosWriter getFieldInfosWriter() throws IOException {
return new Lucene40FieldInfosWriter(); if (!LuceneTestCase.OLD_FORMAT_IMPERSONATION_IS_ACTIVE) {
return super.getFieldInfosWriter();
} else {
return new Lucene40FieldInfosWriter();
}
} }
}; };

View File

@ -22,15 +22,21 @@ import java.io.IOException;
import org.apache.lucene.codecs.DocValuesConsumer; import org.apache.lucene.codecs.DocValuesConsumer;
import org.apache.lucene.index.IndexFileNames; import org.apache.lucene.index.IndexFileNames;
import org.apache.lucene.index.SegmentWriteState; import org.apache.lucene.index.SegmentWriteState;
import org.apache.lucene.util.LuceneTestCase;
/** Read-write version of {@link Lucene40DocValuesFormat} for testing */ /** Read-write version of {@link Lucene40DocValuesFormat} for testing */
@SuppressWarnings("deprecation")
public class Lucene40RWDocValuesFormat extends Lucene40DocValuesFormat { public class Lucene40RWDocValuesFormat extends Lucene40DocValuesFormat {
@Override @Override
public DocValuesConsumer fieldsConsumer(SegmentWriteState state) throws IOException { public DocValuesConsumer fieldsConsumer(SegmentWriteState state) throws IOException {
String filename = IndexFileNames.segmentFileName(state.segmentInfo.name, if (!LuceneTestCase.OLD_FORMAT_IMPERSONATION_IS_ACTIVE) {
"dv", return super.fieldsConsumer(state);
IndexFileNames.COMPOUND_FILE_EXTENSION); } else {
return new Lucene40DocValuesWriter(state, filename, Lucene40FieldInfosReader.LEGACY_DV_TYPE_KEY); String filename = IndexFileNames.segmentFileName(state.segmentInfo.name,
"dv",
IndexFileNames.COMPOUND_FILE_EXTENSION);
return new Lucene40DocValuesWriter(state, filename, Lucene40FieldInfosReader.LEGACY_DV_TYPE_KEY);
}
} }
} }

View File

@ -22,15 +22,21 @@ import java.io.IOException;
import org.apache.lucene.codecs.DocValuesConsumer; import org.apache.lucene.codecs.DocValuesConsumer;
import org.apache.lucene.index.IndexFileNames; import org.apache.lucene.index.IndexFileNames;
import org.apache.lucene.index.SegmentWriteState; import org.apache.lucene.index.SegmentWriteState;
import org.apache.lucene.util.LuceneTestCase;
/** Read-write version of {@link Lucene40NormsFormat} for testing */ /** Read-write version of {@link Lucene40NormsFormat} for testing */
@SuppressWarnings("deprecation")
public class Lucene40RWNormsFormat extends Lucene40NormsFormat { public class Lucene40RWNormsFormat extends Lucene40NormsFormat {
@Override @Override
public DocValuesConsumer normsConsumer(SegmentWriteState state) throws IOException { public DocValuesConsumer normsConsumer(SegmentWriteState state) throws IOException {
String filename = IndexFileNames.segmentFileName(state.segmentInfo.name, if (!LuceneTestCase.OLD_FORMAT_IMPERSONATION_IS_ACTIVE) {
"nrm", return super.normsConsumer(state);
IndexFileNames.COMPOUND_FILE_EXTENSION); } else {
return new Lucene40DocValuesWriter(state, filename, Lucene40FieldInfosReader.LEGACY_NORM_TYPE_KEY); String filename = IndexFileNames.segmentFileName(state.segmentInfo.name,
"nrm",
IndexFileNames.COMPOUND_FILE_EXTENSION);
return new Lucene40DocValuesWriter(state, filename, Lucene40FieldInfosReader.LEGACY_NORM_TYPE_KEY);
}
} }
} }

View File

@ -6,6 +6,7 @@ import org.apache.lucene.codecs.BlockTreeTermsWriter;
import org.apache.lucene.codecs.FieldsConsumer; import org.apache.lucene.codecs.FieldsConsumer;
import org.apache.lucene.codecs.PostingsWriterBase; import org.apache.lucene.codecs.PostingsWriterBase;
import org.apache.lucene.index.SegmentWriteState; import org.apache.lucene.index.SegmentWriteState;
import org.apache.lucene.util.LuceneTestCase;
/* /*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
@ -27,23 +28,29 @@ import org.apache.lucene.index.SegmentWriteState;
/** /**
* Read-write version of {@link Lucene40PostingsFormat} for testing. * Read-write version of {@link Lucene40PostingsFormat} for testing.
*/ */
@SuppressWarnings("deprecation")
public class Lucene40RWPostingsFormat extends Lucene40PostingsFormat { public class Lucene40RWPostingsFormat extends Lucene40PostingsFormat {
@Override @Override
public FieldsConsumer fieldsConsumer(SegmentWriteState state) throws IOException { public FieldsConsumer fieldsConsumer(SegmentWriteState state) throws IOException {
PostingsWriterBase docs = new Lucene40PostingsWriter(state); if (!LuceneTestCase.OLD_FORMAT_IMPERSONATION_IS_ACTIVE) {
return super.fieldsConsumer(state);
// TODO: should we make the terms index more easily } else {
// pluggable? Ie so that this codec would record which PostingsWriterBase docs = new Lucene40PostingsWriter(state);
// index impl was used, and switch on loading?
// Or... you must make a new Codec for this? // TODO: should we make the terms index more easily
boolean success = false; // pluggable? Ie so that this codec would record which
try { // index impl was used, and switch on loading?
FieldsConsumer ret = new BlockTreeTermsWriter(state, docs, minBlockSize, maxBlockSize); // Or... you must make a new Codec for this?
success = true; boolean success = false;
return ret; try {
} finally { FieldsConsumer ret = new BlockTreeTermsWriter(state, docs, minBlockSize, maxBlockSize);
if (!success) { success = true;
docs.close(); return ret;
} finally {
if (!success) {
docs.close();
}
} }
} }
} }

View File

@ -11,6 +11,7 @@ import org.apache.lucene.codecs.lucene40.Lucene40FieldInfosFormat;
import org.apache.lucene.codecs.lucene40.Lucene40FieldInfosWriter; import org.apache.lucene.codecs.lucene40.Lucene40FieldInfosWriter;
import org.apache.lucene.codecs.lucene40.Lucene40RWDocValuesFormat; import org.apache.lucene.codecs.lucene40.Lucene40RWDocValuesFormat;
import org.apache.lucene.codecs.lucene40.Lucene40RWNormsFormat; import org.apache.lucene.codecs.lucene40.Lucene40RWNormsFormat;
import org.apache.lucene.util.LuceneTestCase;
/* /*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
@ -32,12 +33,17 @@ import org.apache.lucene.codecs.lucene40.Lucene40RWNormsFormat;
/** /**
* Read-write version of {@link Lucene41Codec} for testing. * Read-write version of {@link Lucene41Codec} for testing.
*/ */
@SuppressWarnings("deprecation")
public class Lucene41RWCodec extends Lucene41Codec { public class Lucene41RWCodec extends Lucene41Codec {
private final StoredFieldsFormat fieldsFormat = new Lucene41StoredFieldsFormat(); private final StoredFieldsFormat fieldsFormat = new Lucene41StoredFieldsFormat();
private final FieldInfosFormat fieldInfos = new Lucene40FieldInfosFormat() { private final FieldInfosFormat fieldInfos = new Lucene40FieldInfosFormat() {
@Override @Override
public FieldInfosWriter getFieldInfosWriter() throws IOException { public FieldInfosWriter getFieldInfosWriter() throws IOException {
return new Lucene40FieldInfosWriter(); if (!LuceneTestCase.OLD_FORMAT_IMPERSONATION_IS_ACTIVE) {
return super.getFieldInfosWriter();
} else {
return new Lucene40FieldInfosWriter();
}
} }
}; };

View File

@ -21,15 +21,21 @@ import java.io.IOException;
import org.apache.lucene.codecs.DocValuesConsumer; import org.apache.lucene.codecs.DocValuesConsumer;
import org.apache.lucene.index.SegmentWriteState; import org.apache.lucene.index.SegmentWriteState;
import org.apache.lucene.util.LuceneTestCase;
/** /**
* Read-write version of {@link Lucene42DocValuesFormat} for testing. * Read-write version of {@link Lucene42DocValuesFormat} for testing.
*/ */
@SuppressWarnings("deprecation")
public class Lucene42RWDocValuesFormat extends Lucene42DocValuesFormat { public class Lucene42RWDocValuesFormat extends Lucene42DocValuesFormat {
@Override @Override
public DocValuesConsumer fieldsConsumer(SegmentWriteState state) throws IOException { public DocValuesConsumer fieldsConsumer(SegmentWriteState state) throws IOException {
// note: we choose DEFAULT here (its reasonably fast, and for small bpv has tiny waste) if (!LuceneTestCase.OLD_FORMAT_IMPERSONATION_IS_ACTIVE) {
return new Lucene42DocValuesConsumer(state, DATA_CODEC, DATA_EXTENSION, METADATA_CODEC, METADATA_EXTENSION, acceptableOverheadRatio); return super.fieldsConsumer(state);
} else {
// note: we choose DEFAULT here (its reasonably fast, and for small bpv has tiny waste)
return new Lucene42DocValuesConsumer(state, DATA_CODEC, DATA_EXTENSION, METADATA_CODEC, METADATA_EXTENSION, acceptableOverheadRatio);
}
} }
} }

View File

@ -332,9 +332,13 @@ public abstract class LuceneTestCase extends Assert {
// ----------------------------------------------------------------- // -----------------------------------------------------------------
/** /**
* @lucene.internal * When {@code true}, Codecs for old Lucene version will support writing
* indexes in that format. Defaults to {@code true}, can be disabled by
* spdecific tests on demand.
*
* @lucene.internal
*/ */
public static boolean PREFLEX_IMPERSONATION_IS_ACTIVE; public static boolean OLD_FORMAT_IMPERSONATION_IS_ACTIVE = true;
// ----------------------------------------------------------------- // -----------------------------------------------------------------