Index: lucene/analysis/common/src/test/org/apache/lucene/analysis/core/TestRandomChains.java
===================================================================
--- lucene/analysis/common/src/test/org/apache/lucene/analysis/core/TestRandomChains.java	(révision 1427703)
+++ lucene/analysis/common/src/test/org/apache/lucene/analysis/core/TestRandomChains.java	(copie de travail)
@@ -83,6 +83,8 @@
 import org.apache.lucene.analysis.standard.StandardTokenizer;
 import org.apache.lucene.analysis.synonym.SynonymMap;
 import org.apache.lucene.analysis.th.ThaiWordFilter;
+import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
+import org.apache.lucene.analysis.tokenattributes.TermToBytesRefAttribute;
 import org.apache.lucene.analysis.util.CharArrayMap;
 import org.apache.lucene.analysis.util.CharArraySet;
 import org.apache.lucene.util.AttributeSource.AttributeFactory;
@@ -110,8 +112,6 @@
     // TODO: can we promote some of these to be only
     // offsets offenders?
     Collections.<Class<?>>addAll(brokenComponents,
-      // TODO: fix basetokenstreamtestcase not to trip because this one has no CharTermAtt
-      EmptyTokenizer.class,
       // doesn't actual reset itself!
       CachingTokenFilter.class,
       // doesn't consume whole stream!
@@ -617,6 +617,10 @@
       //System.out.println("seed=" + seed + ",create tokenizer=" + tokenizerSpec.toString);
       TokenFilterSpec filterSpec = newFilterChain(random, tokenizerSpec.tokenizer, tokenizerSpec.offsetsAreCorrect);
       //System.out.println("seed=" + seed + ",create filter=" + filterSpec.toString);
+      // So that this analyzer can be used for indexing, it needs a TermToBytesRefAttribute
+      if (!filterSpec.stream.hasAttribute(TermToBytesRefAttribute.class)) {
+        filterSpec.stream.addAttribute(CharTermAttribute.class);
+      }
       return new TokenStreamComponents(tokenizerSpec.tokenizer, filterSpec.stream);
     }
 
Index: lucene/test-framework/src/java/org/apache/lucene/analysis/EmptyTokenizer.java
===================================================================
--- lucene/test-framework/src/java/org/apache/lucene/analysis/EmptyTokenizer.java	(révision 1427703)
+++ lucene/test-framework/src/java/org/apache/lucene/analysis/EmptyTokenizer.java	(copie de travail)
@@ -17,19 +17,44 @@
  * limitations under the License.
  */
 
+import java.io.IOException;
 import java.io.Reader;
 
+import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;
+import org.apache.lucene.analysis.tokenattributes.TermToBytesRefAttribute;
+
 /**
  * Emits no tokens
  */
 public final class EmptyTokenizer extends Tokenizer {
 
+  int endOffset;
+  final OffsetAttribute offsetAttribute;
+
   public EmptyTokenizer(Reader input) {
     super(input);
+    endOffset = 0;
+    offsetAttribute = addAttribute(OffsetAttribute.class);
   }
 
   @Override
   public boolean incrementToken() {
     return false;
   }
+
+  @Override
+  public void end() throws IOException {
+    while (input.read() != -1) {
+      endOffset += 1L + input.skip(Long.MAX_VALUE);
+    }
+    final int endOffset = correctOffset(this.endOffset);
+    offsetAttribute.setOffset(endOffset, endOffset);
+  }
+
+  @Override
+  public void reset() throws IOException {
+    super.reset();
+    endOffset = 0;
+  }
+
 }
Index: lucene/test-framework/src/java/org/apache/lucene/analysis/BaseTokenStreamTestCase.java
===================================================================
--- lucene/test-framework/src/java/org/apache/lucene/analysis/BaseTokenStreamTestCase.java	(révision 1427703)
+++ lucene/test-framework/src/java/org/apache/lucene/analysis/BaseTokenStreamTestCase.java	(copie de travail)
@@ -115,10 +115,9 @@
                                                boolean offsetsAreCorrect) throws IOException {
     assertNotNull(output);
     CheckClearAttributesAttribute checkClearAtt = ts.addAttribute(CheckClearAttributesAttribute.class);
+
+    CharTermAttribute termAtt = ts.hasAttribute(CharTermAttribute.class) ? ts.getAttribute(CharTermAttribute.class) : null;
     
-    assertTrue("has no CharTermAttribute", ts.hasAttribute(CharTermAttribute.class));
-    CharTermAttribute termAtt = ts.getAttribute(CharTermAttribute.class);
-    
     OffsetAttribute offsetAtt = null;
     if (startOffsets != null || endOffsets != null || finalOffset != null) {
       assertTrue("has no OffsetAttribute", ts.hasAttribute(OffsetAttribute.class));
@@ -615,8 +614,7 @@
     int remainder = random.nextInt(10);
     Reader reader = new StringReader(text);
     TokenStream ts = a.tokenStream("dummy", useCharFilter ? new MockCharFilter(reader, remainder) : reader);
-    assertTrue("has no CharTermAttribute", ts.hasAttribute(CharTermAttribute.class));
-    CharTermAttribute termAtt = ts.getAttribute(CharTermAttribute.class);
+    CharTermAttribute termAtt = ts.hasAttribute(CharTermAttribute.class) ? ts.getAttribute(CharTermAttribute.class) : null;
     OffsetAttribute offsetAtt = ts.hasAttribute(OffsetAttribute.class) ? ts.getAttribute(OffsetAttribute.class) : null;
     PositionIncrementAttribute posIncAtt = ts.hasAttribute(PositionIncrementAttribute.class) ? ts.getAttribute(PositionIncrementAttribute.class) : null;
     PositionLengthAttribute posLengthAtt = ts.hasAttribute(PositionLengthAttribute.class) ? ts.getAttribute(PositionLengthAttribute.class) : null;
