pylucene 3.5.0-3
[pylucene.git] / lucene-java-3.5.0 / lucene / src / test / org / apache / lucene / index / TestSegmentInfo.java
diff --git a/lucene-java-3.5.0/lucene/src/test/org/apache/lucene/index/TestSegmentInfo.java b/lucene-java-3.5.0/lucene/src/test/org/apache/lucene/index/TestSegmentInfo.java
new file mode 100644 (file)
index 0000000..13cf539
--- /dev/null
@@ -0,0 +1,90 @@
+package org.apache.lucene.index;
+
+import java.io.IOException;
+import java.util.Iterator;
+
+import org.apache.lucene.analysis.MockAnalyzer;
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.Field;
+import org.apache.lucene.document.Field.Index;
+import org.apache.lucene.document.Field.Store;
+import org.apache.lucene.document.Field.TermVector;
+import org.apache.lucene.store.Directory;
+import org.apache.lucene.util.LuceneTestCase;
+import org.apache.lucene.util._TestUtil;
+
+/**
+ * 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.
+ */
+
+public class TestSegmentInfo extends LuceneTestCase {
+
+  public void testSizeInBytesCache() throws Exception {
+    Directory dir = newDirectory();
+    IndexWriterConfig conf = newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random)).setMergePolicy(newLogMergePolicy());
+    IndexWriter writer = new IndexWriter(dir, conf);
+    Document doc = new Document();
+    doc.add(new Field("a", "value", Store.YES, Index.ANALYZED));
+    writer.addDocument(doc);
+    writer.close();
+    
+    SegmentInfos sis = new SegmentInfos();
+    sis.read(dir);
+    SegmentInfo si = sis.info(0);
+    long sizeInBytesNoStore = si.sizeInBytes(false);
+    long sizeInBytesWithStore = si.sizeInBytes(true);
+    assertTrue("sizeInBytesNoStore=" + sizeInBytesNoStore + " sizeInBytesWithStore=" + sizeInBytesWithStore, sizeInBytesWithStore > sizeInBytesNoStore);
+    dir.close();
+  }
+  
+  // LUCENE-2584: calling files() by multiple threads could lead to ConcurrentModificationException
+  public void testFilesConcurrency() throws Exception {
+    Directory dir = newDirectory();
+    // Create many files
+    IndexWriterConfig conf = newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random));
+    IndexWriter writer = new IndexWriter(dir, conf);
+    Document doc = new Document();
+    doc.add(new Field("a", "b", Store.YES, Index.ANALYZED, TermVector.YES));
+    writer.addDocument(doc);
+    writer.close();
+    
+    SegmentInfos sis = new SegmentInfos();
+    sis.read(dir);
+    final SegmentInfo si = sis.info(0);
+    Thread[] threads = new Thread[_TestUtil.nextInt(random, 2, 5)];
+    for (int i = 0; i < threads.length; i++) {
+      threads[i] = new Thread() {
+        @Override
+        public void run() {
+          try {
+            // Verify that files() does not throw an exception and that the
+            // iteration afterwards succeeds.
+            Iterator<String> iter = si.files().iterator();
+            while (iter.hasNext()) iter.next();
+          } catch (IOException e) {
+            throw new RuntimeException(e);
+          }
+        }
+      };
+    }
+    
+    for (Thread t : threads) t.start();
+    for (Thread t : threads) t.join();
+    
+    dir.close();
+  }
+  
+}