You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mi...@apache.org on 2021/08/19 15:16:01 UTC

[lucene-solr] 01/02: LUCENE-10052: first cut at LTC.newBytesRef methods, and switching a few test cases over (#245)

This is an automated email from the ASF dual-hosted git repository.

mikemccand pushed a commit to branch branch_8x
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git

commit b48f8ad6472fe8d109e00e1f84e654033365c905
Author: Michael McCandless <mi...@apache.org>
AuthorDate: Tue Aug 17 16:18:40 2021 -0400

    LUCENE-10052: first cut at LTC.newBytesRef methods, and switching a few test cases over (#245)
    
    * LUCENE-10052: first cut at LTC.newBytesRef methods, to randomize the offset/length of a BytesRef, and switching a few test cases over
---
 .../java/org/apache/lucene/util/PagedBytes.java    |   3 +-
 .../lucene/index/TestBinaryDocValuesUpdates.java   |  31 +-
 .../org/apache/lucene/index/TestIndexSorting.java  |  85 ++---
 .../org/apache/lucene/index/TestIndexWriter.java   | 103 ++++---
 .../apache/lucene/index/TestIndexableField.java    |   6 +-
 .../lucene/index/BaseDocValuesFormatTestCase.java  | 342 +++++++++++----------
 .../index/BaseTermVectorsFormatTestCase.java       | 133 +++++---
 .../org/apache/lucene/util/LuceneTestCase.java     |  84 +++++
 8 files changed, 468 insertions(+), 319 deletions(-)

diff --git a/lucene/core/src/java/org/apache/lucene/util/PagedBytes.java b/lucene/core/src/java/org/apache/lucene/util/PagedBytes.java
index 8538805..16574dc 100644
--- a/lucene/core/src/java/org/apache/lucene/util/PagedBytes.java
+++ b/lucene/core/src/java/org/apache/lucene/util/PagedBytes.java
@@ -376,7 +376,8 @@ public final class PagedBytes implements Accountable {
 
     @Override
     public void writeBytes(byte[] b, int offset, int length) {
-      assert b.length >= offset + length;
+      assert b.length >= offset + length
+          : "b.length=" + b.length + " offset=" + offset + " length=" + length;
       if (length == 0) {
         return;
       }
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestBinaryDocValuesUpdates.java b/lucene/core/src/test/org/apache/lucene/index/TestBinaryDocValuesUpdates.java
index bd88099..fe83e73 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestBinaryDocValuesUpdates.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestBinaryDocValuesUpdates.java
@@ -70,14 +70,17 @@ public class TestBinaryDocValuesUpdates extends LuceneTestCase {
   
   // encodes a long into a BytesRef as VLong so that we get varying number of bytes when we update
   static BytesRef toBytes(long value) {
-//    long orig = value;
-    BytesRef bytes = new BytesRef(10); // negative longs may take 10 bytes
+    //    long orig = value;
+    BytesRef bytes = newBytesRef(10); // negative longs may take 10 bytes
+    int upto = 0;
     while ((value & ~0x7FL) != 0L) {
-      bytes.bytes[bytes.length++] = (byte) ((value & 0x7FL) | 0x80L);
+      bytes.bytes[bytes.offset + upto++] = (byte) ((value & 0x7FL) | 0x80L);
       value >>>= 7;
     }
-    bytes.bytes[bytes.length++] = (byte) value;
-//    System.err.println("[" + Thread.currentThread().getName() + "] value=" + orig + ", bytes=" + bytes);
+    bytes.bytes[bytes.offset + upto++] = (byte) value;
+    bytes.length = upto;
+    //    System.err.println("[" + Thread.currentThread().getName() + "] value=" + orig + ", bytes="
+    // + bytes);
     return bytes;
   }
   
@@ -330,10 +333,10 @@ public class TestBinaryDocValuesUpdates extends LuceneTestCase {
       Document doc = new Document();
       doc.add(new StringField("dvUpdateKey", "dv", Store.NO));
       doc.add(new NumericDocValuesField("ndv", i));
-      doc.add(new BinaryDocValuesField("bdv", new BytesRef(Integer.toString(i))));
-      doc.add(new SortedDocValuesField("sdv", new BytesRef(Integer.toString(i))));
-      doc.add(new SortedSetDocValuesField("ssdv", new BytesRef(Integer.toString(i))));
-      doc.add(new SortedSetDocValuesField("ssdv", new BytesRef(Integer.toString(i * 2))));
+      doc.add(new BinaryDocValuesField("bdv", newBytesRef(Integer.toString(i))));
+      doc.add(new SortedDocValuesField("sdv", newBytesRef(Integer.toString(i))));
+      doc.add(new SortedSetDocValuesField("ssdv", newBytesRef(Integer.toString(i))));
+      doc.add(new SortedSetDocValuesField("ssdv", newBytesRef(Integer.toString(i * 2))));
       writer.addDocument(doc);
     }
     writer.commit();
@@ -354,8 +357,8 @@ public class TestBinaryDocValuesUpdates extends LuceneTestCase {
       assertEquals(i, bdv.nextDoc());
       assertEquals(17, getValue(bdv));
       assertEquals(i, sdv.nextDoc());
-      BytesRef term = sdv.binaryValue();
-      assertEquals(new BytesRef(Integer.toString(i)), term);
+      BytesRef term = sdv.lookupOrd(sdv.ordValue());
+      assertEquals(newBytesRef(Integer.toString(i)), term);
       assertEquals(i, ssdv.nextDoc());
       long ord = ssdv.nextOrd();
       term = ssdv.lookupOrd(ord);
@@ -481,7 +484,7 @@ public class TestBinaryDocValuesUpdates extends LuceneTestCase {
     Document doc = new Document();
     doc.add(new StringField("key", "doc", Store.NO));
     doc.add(new BinaryDocValuesField("bdv", toBytes(5L)));
-    doc.add(new SortedDocValuesField("sorted", new BytesRef("value")));
+    doc.add(new SortedDocValuesField("sorted", newBytesRef("value")));
     writer.addDocument(doc); // flushed document
     writer.commit();
     writer.addDocument(doc); // in-memory document
@@ -497,8 +500,8 @@ public class TestBinaryDocValuesUpdates extends LuceneTestCase {
       assertEquals(i, bdv.nextDoc());
       assertEquals(17, getValue(bdv));
       assertEquals(i, sdv.nextDoc());
-      BytesRef term = sdv.binaryValue();
-      assertEquals(new BytesRef("value"), term);
+      BytesRef term = sdv.lookupOrd(sdv.ordValue());
+      assertEquals(newBytesRef("value"), term);
     }
     
     reader.close();
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestIndexSorting.java b/lucene/core/src/test/org/apache/lucene/index/TestIndexSorting.java
index 042e2a8..07463bc 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestIndexSorting.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestIndexSorting.java
@@ -78,7 +78,6 @@ import org.apache.lucene.search.TopFieldCollector;
 import org.apache.lucene.search.similarities.Similarity;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.util.Bits;
-import org.apache.lucene.util.BytesRef;
 import org.apache.lucene.util.FixedBitSet;
 import org.apache.lucene.util.IOUtils;
 import org.apache.lucene.util.LuceneTestCase;
@@ -235,8 +234,9 @@ public class TestIndexSorting extends LuceneTestCase {
   }
 
   public void testStringAlreadySorted() throws Exception {
-    assertNeedsIndexSortMerge(new SortField("foo", SortField.Type.STRING),
-        (doc) -> doc.add(new SortedDocValuesField("foo", new BytesRef("default"))),
+    assertNeedsIndexSortMerge(
+        new SortField("foo", SortField.Type.STRING),
+        (doc) -> doc.add(new SortedDocValuesField("foo", newBytesRef("default"))),
         (doc) -> doc.add(new SortedDocValuesField("foo", TestUtil.randomBinaryTerm(random()))));
   }
 
@@ -260,7 +260,7 @@ public class TestIndexSorting extends LuceneTestCase {
   public void testMultiValuedStringAlreadySorted() throws Exception {
     assertNeedsIndexSortMerge(new SortedSetSortField("foo", false),
         (doc) -> {
-          doc.add(new SortedSetDocValuesField("foo", new BytesRef("")));
+          doc.add(new SortedSetDocValuesField("foo", newBytesRef("")));
           int num = random().nextInt(5);
           for (int j = 0; j < num; j++) {
             doc.add(new SortedSetDocValuesField("foo", TestUtil.randomBinaryTerm(random())));
@@ -281,18 +281,18 @@ public class TestIndexSorting extends LuceneTestCase {
     iwc.setIndexSort(indexSort);
     IndexWriter w = new IndexWriter(dir, iwc);
     Document doc = new Document();
-    doc.add(new SortedDocValuesField("foo", new BytesRef("zzz")));
+    doc.add(new SortedDocValuesField("foo", newBytesRef("zzz")));
     w.addDocument(doc);
     // so we get more than one segment, so that forceMerge actually does merge, since we only get a sorted segment by merging:
     w.commit();
 
     doc = new Document();
-    doc.add(new SortedDocValuesField("foo", new BytesRef("aaa")));
+    doc.add(new SortedDocValuesField("foo", newBytesRef("aaa")));
     w.addDocument(doc);
     w.commit();
 
     doc = new Document();
-    doc.add(new SortedDocValuesField("foo", new BytesRef("mmm")));
+    doc.add(new SortedDocValuesField("foo", newBytesRef("mmm")));
     w.addDocument(doc);
     w.forceMerge(1);
 
@@ -319,23 +319,23 @@ public class TestIndexSorting extends LuceneTestCase {
     IndexWriter w = new IndexWriter(dir, iwc);
     Document doc = new Document();
     doc.add(new NumericDocValuesField("id", 3));
-    doc.add(new SortedSetDocValuesField("foo", new BytesRef("zzz")));
+    doc.add(new SortedSetDocValuesField("foo", newBytesRef("zzz")));
     w.addDocument(doc);
     // so we get more than one segment, so that forceMerge actually does merge, since we only get a sorted segment by merging:
     w.commit();
 
     doc = new Document();
     doc.add(new NumericDocValuesField("id", 1));
-    doc.add(new SortedSetDocValuesField("foo", new BytesRef("aaa")));
-    doc.add(new SortedSetDocValuesField("foo", new BytesRef("zzz")));
-    doc.add(new SortedSetDocValuesField("foo", new BytesRef("bcg")));
+    doc.add(new SortedSetDocValuesField("foo", newBytesRef("aaa")));
+    doc.add(new SortedSetDocValuesField("foo", newBytesRef("zzz")));
+    doc.add(new SortedSetDocValuesField("foo", newBytesRef("bcg")));
     w.addDocument(doc);
     w.commit();
 
     doc = new Document();
     doc.add(new NumericDocValuesField("id", 2));
-    doc.add(new SortedSetDocValuesField("foo", new BytesRef("mmm")));
-    doc.add(new SortedSetDocValuesField("foo", new BytesRef("pppp")));
+    doc.add(new SortedSetDocValuesField("foo", newBytesRef("mmm")));
+    doc.add(new SortedSetDocValuesField("foo", newBytesRef("pppp")));
     w.addDocument(doc);
     w.forceMerge(1);
 
@@ -364,7 +364,7 @@ public class TestIndexSorting extends LuceneTestCase {
       iwc.setIndexSort(indexSort);
       IndexWriter w = new IndexWriter(dir, iwc);
       Document doc = new Document();
-      doc.add(new SortedDocValuesField("foo", new BytesRef("zzz")));
+      doc.add(new SortedDocValuesField("foo", newBytesRef("zzz")));
       w.addDocument(doc);
       // so we get more than one segment, so that forceMerge actually does merge, since we only get a sorted segment by merging:
       w.commit();
@@ -374,7 +374,7 @@ public class TestIndexSorting extends LuceneTestCase {
       w.commit();
 
       doc = new Document();
-      doc.add(new SortedDocValuesField("foo", new BytesRef("mmm")));
+      doc.add(new SortedDocValuesField("foo", newBytesRef("mmm")));
       w.addDocument(doc);
       w.forceMerge(1);
 
@@ -411,9 +411,9 @@ public class TestIndexSorting extends LuceneTestCase {
       IndexWriter w = new IndexWriter(dir, iwc);
       Document doc = new Document();
       doc.add(new NumericDocValuesField("id", 3));
-      doc.add(new SortedSetDocValuesField("foo", new BytesRef("zzz")));
-      doc.add(new SortedSetDocValuesField("foo", new BytesRef("zzza")));
-      doc.add(new SortedSetDocValuesField("foo", new BytesRef("zzzd")));
+      doc.add(new SortedSetDocValuesField("foo", newBytesRef("zzz")));
+      doc.add(new SortedSetDocValuesField("foo", newBytesRef("zzza")));
+      doc.add(new SortedSetDocValuesField("foo", newBytesRef("zzzd")));
       w.addDocument(doc);
       // so we get more than one segment, so that forceMerge actually does merge, since we only get a sorted segment by merging:
       w.commit();
@@ -426,8 +426,8 @@ public class TestIndexSorting extends LuceneTestCase {
 
       doc = new Document();
       doc.add(new NumericDocValuesField("id", 2));
-      doc.add(new SortedSetDocValuesField("foo", new BytesRef("mmm")));
-      doc.add(new SortedSetDocValuesField("foo", new BytesRef("nnnn")));
+      doc.add(new SortedSetDocValuesField("foo", newBytesRef("mmm")));
+      doc.add(new SortedSetDocValuesField("foo", newBytesRef("nnnn")));
       w.addDocument(doc);
       w.forceMerge(1);
 
@@ -466,7 +466,7 @@ public class TestIndexSorting extends LuceneTestCase {
       iwc.setIndexSort(indexSort);
       IndexWriter w = new IndexWriter(dir, iwc);
       Document doc = new Document();
-      doc.add(new SortedDocValuesField("foo", new BytesRef("zzz")));
+      doc.add(new SortedDocValuesField("foo", newBytesRef("zzz")));
       w.addDocument(doc);
       // so we get more than one segment, so that forceMerge actually does merge, since we only get a sorted segment by merging:
       w.commit();
@@ -476,7 +476,7 @@ public class TestIndexSorting extends LuceneTestCase {
       w.commit();
 
       doc = new Document();
-      doc.add(new SortedDocValuesField("foo", new BytesRef("mmm")));
+      doc.add(new SortedDocValuesField("foo", newBytesRef("mmm")));
       w.addDocument(doc);
       w.forceMerge(1);
 
@@ -513,8 +513,8 @@ public class TestIndexSorting extends LuceneTestCase {
       IndexWriter w = new IndexWriter(dir, iwc);
       Document doc = new Document();
       doc.add(new NumericDocValuesField("id", 2));
-      doc.add(new SortedSetDocValuesField("foo", new BytesRef("zzz")));
-      doc.add(new SortedSetDocValuesField("foo", new BytesRef("zzzd")));
+      doc.add(new SortedSetDocValuesField("foo", newBytesRef("zzz")));
+      doc.add(new SortedSetDocValuesField("foo", newBytesRef("zzzd")));
       w.addDocument(doc);
       // so we get more than one segment, so that forceMerge actually does merge, since we only get a sorted segment by merging:
       w.commit();
@@ -527,8 +527,8 @@ public class TestIndexSorting extends LuceneTestCase {
 
       doc = new Document();
       doc.add(new NumericDocValuesField("id", 1));
-      doc.add(new SortedSetDocValuesField("foo", new BytesRef("mmm")));
-      doc.add(new SortedSetDocValuesField("foo", new BytesRef("ppp")));
+      doc.add(new SortedSetDocValuesField("foo", newBytesRef("mmm")));
+      doc.add(new SortedSetDocValuesField("foo", newBytesRef("ppp")));
       w.addDocument(doc);
       w.forceMerge(1);
 
@@ -1912,7 +1912,7 @@ public class TestIndexSorting extends LuceneTestCase {
     iwc.setIndexSort(indexSort);
     IndexWriter w = new IndexWriter(dir, iwc);
     Document doc = new Document();
-    doc.add(new StringField("id", new BytesRef("0"), Store.NO));
+    doc.add(new StringField("id", newBytesRef("0"), Store.NO));
     doc.add(new NumericDocValuesField("foo", random().nextInt()));
     w.addDocument(doc);
     w.commit();
@@ -2218,7 +2218,7 @@ public class TestIndexSorting extends LuceneTestCase {
 
       clearAttributes();
       term.append("#all#");
-      payload.setPayload(new BytesRef(Integer.toString(pos)));
+      payload.setPayload(newBytesRef(Integer.toString(pos)));
       offset.setOffset(off, off);
       --pos;
       ++off;
@@ -2263,10 +2263,13 @@ public class TestIndexSorting extends LuceneTestCase {
       String value = IntStream.range(0, id).mapToObj(k -> Integer.toString(id)).collect(Collectors.joining(" "));
       TextField norms = new TextField("norms", value, Store.NO);
       doc.add(norms);
-      doc.add(new BinaryDocValuesField("binary", new BytesRef(Integer.toString(id))));
-      doc.add(new SortedDocValuesField("sorted", new BytesRef(Integer.toString(id))));
-      doc.add(new SortedSetDocValuesField("multi_valued_string", new BytesRef(Integer.toString(id))));
-      doc.add(new SortedSetDocValuesField("multi_valued_string", new BytesRef(Integer.toString(id + 1))));
+      doc.add(new BinaryDocValuesField("binary", newBytesRef(Integer.toString(id))));
+      doc.add(new SortedDocValuesField("sorted", newBytesRef(Integer.toString(id))));
+      doc.add(
+          new SortedSetDocValuesField("multi_valued_string", newBytesRef(Integer.toString(id))));
+      doc.add(
+          new SortedSetDocValuesField(
+              "multi_valued_string", newBytesRef(Integer.toString(id + 1))));
       doc.add(new SortedNumericDocValuesField("multi_valued_numeric", id));
       doc.add(new SortedNumericDocValuesField("multi_valued_numeric", id + 1));
       doc.add(new Field("term_vectors", Integer.toString(id), TERM_VECTORS_TYPE));
@@ -2497,7 +2500,7 @@ public class TestIndexSorting extends LuceneTestCase {
         System.out.println("  long=" + docValues.longValue);
         System.out.println("  float=" + docValues.floatValue);
         System.out.println("  double=" + docValues.doubleValue);
-        System.out.println("  bytes=" + new BytesRef(docValues.bytesValue));
+        System.out.println("  bytes=" + newBytesRef(docValues.bytesValue));
         System.out.println("  mvf=" + Arrays.toString(docValues.floatValues));
       }
 
@@ -2508,7 +2511,7 @@ public class TestIndexSorting extends LuceneTestCase {
       doc.add(new NumericDocValuesField("long", docValues.longValue));
       doc.add(new DoubleDocValuesField("double", docValues.doubleValue));
       doc.add(new FloatDocValuesField("float", docValues.floatValue));
-      doc.add(new SortedDocValuesField("bytes", new BytesRef(docValues.bytesValue)));
+      doc.add(new SortedDocValuesField("bytes", newBytesRef(docValues.bytesValue)));
 
       for (int value : docValues.intValues) {
         doc.add(new SortedNumericDocValuesField("multi_valued_int", value));
@@ -2527,7 +2530,7 @@ public class TestIndexSorting extends LuceneTestCase {
       }
 
       for (byte[] value : docValues.bytesValues) {
-        doc.add(new SortedSetDocValuesField("multi_valued_bytes", new BytesRef(value)));
+        doc.add(new SortedSetDocValuesField("multi_valued_bytes", newBytesRef(value)));
       }
 
       w1.addDocument(doc);
@@ -2615,7 +2618,7 @@ public class TestIndexSorting extends LuceneTestCase {
       } else {
         value = "bar1";
       }
-      doc.add(new SortedDocValuesField("foo", new BytesRef(value)));
+      doc.add(new SortedDocValuesField("foo", newBytesRef(value)));
       w.addDocument(doc);
       if (id == 500) {
         w.commit();
@@ -2648,7 +2651,7 @@ public class TestIndexSorting extends LuceneTestCase {
       doc.add(new NumericDocValuesField("dense_int", i));
       if (i < 64) {
         doc.add(new NumericDocValuesField("sparse_int", i));
-        doc.add(new BinaryDocValuesField("sparse_binary", new BytesRef(Integer.toString(i))));
+        doc.add(new BinaryDocValuesField("sparse_binary", newBytesRef(Integer.toString(i))));
         textField.setStringValue("foo");
         doc.add(textField);
       }
@@ -2673,8 +2676,8 @@ public class TestIndexSorting extends LuceneTestCase {
         assertTrue(sparseBinaryValues.advanceExact(docID));
         assertTrue(normsValues.advanceExact(docID));
         assertEquals(1, normsValues.longValue());
-        assertEquals(127-docID, (int) sparseValues.longValue());
-        assertEquals(new BytesRef(Integer.toString(127-docID)), sparseBinaryValues.binaryValue());
+        assertEquals(127 - docID, (int) sparseValues.longValue());
+        assertEquals(newBytesRef(Integer.toString(127 - docID)), sparseBinaryValues.binaryValue());
       } else {
         assertFalse(sparseBinaryValues.advanceExact(docID));
         assertFalse(sparseValues.advanceExact(docID));
@@ -2719,8 +2722,8 @@ public class TestIndexSorting extends LuceneTestCase {
   public void testWrongSortFieldType() throws Exception {
     Directory dir = newDirectory();
     List<Field> dvs = new ArrayList<>();
-    dvs.add(new SortedDocValuesField("field", new BytesRef("")));
-    dvs.add(new SortedSetDocValuesField("field", new BytesRef("")));
+    dvs.add(new SortedDocValuesField("field", newBytesRef("")));
+    dvs.add(new SortedSetDocValuesField("field", newBytesRef("")));
     dvs.add(new NumericDocValuesField("field", 42));
     dvs.add(new SortedNumericDocValuesField("field", 42));
 
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestIndexWriter.java b/lucene/core/src/test/org/apache/lucene/index/TestIndexWriter.java
index b94411b..20711fb 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestIndexWriter.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestIndexWriter.java
@@ -481,11 +481,8 @@ public class TestIndexWriter extends LuceneTestCase {
     assertEquals(1, reader.numDocs());
     Term t = new Term("field", "a");
     assertEquals(1, reader.docFreq(t));
-    PostingsEnum td = TestUtil.docs(random(), reader,
-                                    "field",
-                                    new BytesRef("a"),
-                                    null,
-                                    PostingsEnum.FREQS);
+    PostingsEnum td =
+        TestUtil.docs(random(), reader, "field", newBytesRef("a"), null, PostingsEnum.FREQS);
     td.nextDoc();
     assertEquals(128*1024, td.freq());
     reader.close();
@@ -675,9 +672,9 @@ public class TestIndexWriter extends LuceneTestCase {
     DirectoryReader reader = DirectoryReader.open(dir);
     LeafReader subreader = getOnlyLeafReader(reader);
     TermsEnum te = subreader.terms("").iterator();
-    assertEquals(new BytesRef("a"), te.next());
-    assertEquals(new BytesRef("b"), te.next());
-    assertEquals(new BytesRef("c"), te.next());
+    assertEquals(newBytesRef("a"), te.next());
+    assertEquals(newBytesRef("b"), te.next());
+    assertEquals(newBytesRef("c"), te.next());
     assertNull(te.next());
     reader.close();
     dir.close();
@@ -696,10 +693,10 @@ public class TestIndexWriter extends LuceneTestCase {
     DirectoryReader reader = DirectoryReader.open(dir);
     LeafReader subreader = getOnlyLeafReader(reader);
     TermsEnum te = subreader.terms("").iterator();
-    assertEquals(new BytesRef(""), te.next());
-    assertEquals(new BytesRef("a"), te.next());
-    assertEquals(new BytesRef("b"), te.next());
-    assertEquals(new BytesRef("c"), te.next());
+    assertEquals(newBytesRef(""), te.next());
+    assertEquals(newBytesRef("a"), te.next());
+    assertEquals(newBytesRef("b"), te.next());
+    assertEquals(newBytesRef("c"), te.next());
     assertNull(te.next());
     reader.close();
     dir.close();
@@ -893,22 +890,22 @@ public class TestIndexWriter extends LuceneTestCase {
       Document doc = new Document();
       doc.add(newStringField(random, "id", "500", Field.Store.NO));
       doc.add(newField(random, "field", "some prepackaged text contents", storedTextType));
-      doc.add(new BinaryDocValuesField("binarydv", new BytesRef("500")));
+      doc.add(new BinaryDocValuesField("binarydv", newBytesRef("500")));
       doc.add(new NumericDocValuesField("numericdv", 500));
-      doc.add(new SortedDocValuesField("sorteddv", new BytesRef("500")));
-      doc.add(new SortedSetDocValuesField("sortedsetdv", new BytesRef("one")));
-      doc.add(new SortedSetDocValuesField("sortedsetdv", new BytesRef("two")));
+      doc.add(new SortedDocValuesField("sorteddv", newBytesRef("500")));
+      doc.add(new SortedSetDocValuesField("sortedsetdv", newBytesRef("one")));
+      doc.add(new SortedSetDocValuesField("sortedsetdv", newBytesRef("two")));
       doc.add(new SortedNumericDocValuesField("sortednumericdv", 4));
       doc.add(new SortedNumericDocValuesField("sortednumericdv", 3));
       w.addDocument(doc);
       doc = new Document();
       doc.add(newStringField(random, "id", "501", Field.Store.NO));
       doc.add(newField(random, "field", "some more contents", storedTextType));
-      doc.add(new BinaryDocValuesField("binarydv", new BytesRef("501")));
+      doc.add(new BinaryDocValuesField("binarydv", newBytesRef("501")));
       doc.add(new NumericDocValuesField("numericdv", 501));
-      doc.add(new SortedDocValuesField("sorteddv", new BytesRef("501")));
-      doc.add(new SortedSetDocValuesField("sortedsetdv", new BytesRef("two")));
-      doc.add(new SortedSetDocValuesField("sortedsetdv", new BytesRef("three")));
+      doc.add(new SortedDocValuesField("sorteddv", newBytesRef("501")));
+      doc.add(new SortedSetDocValuesField("sortedsetdv", newBytesRef("two")));
+      doc.add(new SortedSetDocValuesField("sortedsetdv", newBytesRef("three")));
       doc.add(new SortedNumericDocValuesField("sortednumericdv", 6));
       doc.add(new SortedNumericDocValuesField("sortednumericdv", 1));
       w.addDocument(doc);
@@ -962,10 +959,10 @@ public class TestIndexWriter extends LuceneTestCase {
 
             Document doc = new Document();
             Field idField = newStringField(random, "id", "", Field.Store.NO);
-            Field binaryDVField = new BinaryDocValuesField("binarydv", new BytesRef());
+            Field binaryDVField = new BinaryDocValuesField("binarydv", newBytesRef());
             Field numericDVField = new NumericDocValuesField("numericdv", 0);
-            Field sortedDVField = new SortedDocValuesField("sorteddv", new BytesRef());
-            Field sortedSetDVField = new SortedSetDocValuesField("sortedsetdv", new BytesRef());
+            Field sortedDVField = new SortedDocValuesField("sorteddv", newBytesRef());
+            Field sortedSetDVField = new SortedSetDocValuesField("sortedsetdv", newBytesRef());
             doc.add(idField);
             doc.add(newField(random, "field", "some text contents", storedTextType));
             doc.add(binaryDVField);
@@ -975,10 +972,10 @@ public class TestIndexWriter extends LuceneTestCase {
             for(int i=0;i<100;i++) {
               //log.println("\nTEST: i=" + i);
               idField.setStringValue(Integer.toString(i));
-              binaryDVField.setBytesValue(new BytesRef(idField.stringValue()));
+              binaryDVField.setBytesValue(newBytesRef(idField.stringValue()));
               numericDVField.setLongValue(i);
-              sortedDVField.setBytesValue(new BytesRef(idField.stringValue()));
-              sortedSetDVField.setBytesValue(new BytesRef(idField.stringValue()));
+              sortedDVField.setBytesValue(newBytesRef(idField.stringValue()));
+              sortedSetDVField.setBytesValue(newBytesRef(idField.stringValue()));
               int action = random.nextInt(100);
               if (action == 17) {
                 w.addIndexes(adder);
@@ -1209,12 +1206,30 @@ public class TestIndexWriter extends LuceneTestCase {
 
 
     // test that the terms were indexed.
-    assertTrue(TestUtil.docs(random(), ir, "binary", new BytesRef("doc1field1"), null, PostingsEnum.NONE).nextDoc() != DocIdSetIterator.NO_MORE_DOCS);
-    assertTrue(TestUtil.docs(random(), ir, "binary", new BytesRef("doc2field1"), null, PostingsEnum.NONE).nextDoc() != DocIdSetIterator.NO_MORE_DOCS);
-    assertTrue(TestUtil.docs(random(), ir, "binary", new BytesRef("doc3field1"), null, PostingsEnum.NONE).nextDoc() != DocIdSetIterator.NO_MORE_DOCS);
-    assertTrue(TestUtil.docs(random(), ir, "string", new BytesRef("doc1field2"), null, PostingsEnum.NONE).nextDoc() != DocIdSetIterator.NO_MORE_DOCS);
-    assertTrue(TestUtil.docs(random(), ir, "string", new BytesRef("doc2field2"), null, PostingsEnum.NONE).nextDoc() != DocIdSetIterator.NO_MORE_DOCS);
-    assertTrue(TestUtil.docs(random(), ir, "string", new BytesRef("doc3field2"), null, PostingsEnum.NONE).nextDoc() != DocIdSetIterator.NO_MORE_DOCS);
+    assertTrue(
+        TestUtil.docs(random(), ir, "binary", newBytesRef("doc1field1"), null, PostingsEnum.NONE)
+                .nextDoc()
+            != DocIdSetIterator.NO_MORE_DOCS);
+    assertTrue(
+        TestUtil.docs(random(), ir, "binary", newBytesRef("doc2field1"), null, PostingsEnum.NONE)
+                .nextDoc()
+            != DocIdSetIterator.NO_MORE_DOCS);
+    assertTrue(
+        TestUtil.docs(random(), ir, "binary", newBytesRef("doc3field1"), null, PostingsEnum.NONE)
+                .nextDoc()
+            != DocIdSetIterator.NO_MORE_DOCS);
+    assertTrue(
+        TestUtil.docs(random(), ir, "string", newBytesRef("doc1field2"), null, PostingsEnum.NONE)
+                .nextDoc()
+            != DocIdSetIterator.NO_MORE_DOCS);
+    assertTrue(
+        TestUtil.docs(random(), ir, "string", newBytesRef("doc2field2"), null, PostingsEnum.NONE)
+                .nextDoc()
+            != DocIdSetIterator.NO_MORE_DOCS);
+    assertTrue(
+        TestUtil.docs(random(), ir, "string", newBytesRef("doc3field2"), null, PostingsEnum.NONE)
+                .nextDoc()
+            != DocIdSetIterator.NO_MORE_DOCS);
 
     ir.close();
     dir.close();
@@ -2322,11 +2337,13 @@ public class TestIndexWriter extends LuceneTestCase {
     iwc.setMergePolicy(newLogMergePolicy());
     IndexWriter iwriter = new IndexWriter(directory, iwc);
     Document doc = new Document();
-    doc.add(new SortedDocValuesField("dv", new BytesRef("foo!")));
-    doc.add(new SortedDocValuesField("dv", new BytesRef("bar!")));
-    expectThrows(IllegalArgumentException.class, () -> {
-      iwriter.addDocument(doc);
-    });
+    doc.add(new SortedDocValuesField("dv", newBytesRef("foo!")));
+    doc.add(new SortedDocValuesField("dv", newBytesRef("bar!")));
+    expectThrows(
+        IllegalArgumentException.class,
+        () -> {
+          iwriter.addDocument(doc);
+        });
 
     iwriter.commit();
     assertFalse(iwriter.hasUncommittedChanges());
@@ -2338,7 +2355,7 @@ public class TestIndexWriter extends LuceneTestCase {
     Directory dir = newDirectory();
     IndexWriter w = new IndexWriter(dir, newIndexWriterConfig(new MockAnalyzer(random())));
     Document doc = new Document();
-    doc.add(new SortedDocValuesField("dv", new BytesRef("foo!")));
+    doc.add(new SortedDocValuesField("dv", newBytesRef("foo!")));
     w.addDocument(doc);
     w.close();
     // Close again should have no effect
@@ -2350,7 +2367,7 @@ public class TestIndexWriter extends LuceneTestCase {
     Directory dir = newDirectory();
     IndexWriter w = new IndexWriter(dir, newIndexWriterConfig(new MockAnalyzer(random())));
     Document doc = new Document();
-    doc.add(new SortedDocValuesField("dv", new BytesRef("foo!")));
+    doc.add(new SortedDocValuesField("dv", newBytesRef("foo!")));
     w.addDocument(doc);
     w.rollback();
     // Close after rollback should have no effect
@@ -2362,7 +2379,7 @@ public class TestIndexWriter extends LuceneTestCase {
     Directory dir = newDirectory();
     IndexWriter w = new IndexWriter(dir, newIndexWriterConfig(new MockAnalyzer(random())));
     Document doc = new Document();
-    doc.add(new SortedDocValuesField("dv", new BytesRef("foo!")));
+    doc.add(new SortedDocValuesField("dv", newBytesRef("foo!")));
     w.addDocument(doc);
     w.close();
     // Rollback after close should have no effect
@@ -2417,7 +2434,7 @@ public class TestIndexWriter extends LuceneTestCase {
       });
     IndexWriter w = new IndexWriter(dir, iwc);
     Document doc = new Document();
-    doc.add(new SortedDocValuesField("dv", new BytesRef("foo!")));
+    doc.add(new SortedDocValuesField("dv", newBytesRef("foo!")));
     w.addDocument(doc);
     w.commit();
     w.addDocument(doc);
@@ -3594,7 +3611,7 @@ public class TestIndexWriter extends LuceneTestCase {
     IndexWriter w = new IndexWriter(d, newIndexWriterConfig(new MockAnalyzer(random())));
     Document doc = new Document();
     Token token = new Token("bar", 0, 3);
-    BytesRef evil = new BytesRef(new byte[1024]);
+    BytesRef evil = newBytesRef(new byte[1024]);
     evil.offset = 1000; // offset + length is now out of bounds.
     token.setPayload(evil);
     doc.add(new TextField("foo", new CannedTokenStream(token)));
@@ -3685,7 +3702,7 @@ public class TestIndexWriter extends LuceneTestCase {
           Bits liveDocs = sr.getLiveDocs();
           for (Integer dId : uniqueDocs) {
             boolean mustBeHardDeleted = dId % 2 == 0;
-            if (iterator.seekExact(new BytesRef(dId.toString()))) {
+            if (iterator.seekExact(newBytesRef(dId.toString()))) {
               PostingsEnum postings = iterator.postings(null);
               while (postings.nextDoc() != DocIdSetIterator.NO_MORE_DOCS) {
                 if (liveDocs.get(postings.docID())) {
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestIndexableField.java b/lucene/core/src/test/org/apache/lucene/index/TestIndexableField.java
index f71d6a2..0c839d8 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestIndexableField.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestIndexableField.java
@@ -128,7 +128,7 @@ public class TestIndexableField extends LuceneTestCase {
         for(int idx=0;idx<bytes.length;idx++) {
           bytes[idx] = (byte) (counter+idx);
         }
-        return new BytesRef(bytes, 0, bytes.length);
+        return newBytesRef(bytes, 0, bytes.length);
       } else {
         return null;
       }
@@ -282,14 +282,14 @@ public class TestIndexableField extends LuceneTestCase {
             final Terms tfv = r.getTermVectors(docID).terms(name);
             assertNotNull(tfv);
             TermsEnum termsEnum = tfv.iterator();
-            assertEquals(new BytesRef(""+counter), termsEnum.next());
+            assertEquals(newBytesRef("" + counter), termsEnum.next());
             assertEquals(1, termsEnum.totalTermFreq());
             PostingsEnum dpEnum = termsEnum.postings(null, PostingsEnum.ALL);
             assertTrue(dpEnum.nextDoc() != DocIdSetIterator.NO_MORE_DOCS);
             assertEquals(1, dpEnum.freq());
             assertEquals(1, dpEnum.nextPosition());
 
-            assertEquals(new BytesRef("text"), termsEnum.next());
+            assertEquals(newBytesRef("text"), termsEnum.next());
             assertEquals(1, termsEnum.totalTermFreq());
             dpEnum = termsEnum.postings(dpEnum, PostingsEnum.ALL);
             assertTrue(dpEnum.nextDoc() != DocIdSetIterator.NO_MORE_DOCS);
diff --git a/lucene/test-framework/src/java/org/apache/lucene/index/BaseDocValuesFormatTestCase.java b/lucene/test-framework/src/java/org/apache/lucene/index/BaseDocValuesFormatTestCase.java
index 5af847d..bbacf41 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/index/BaseDocValuesFormatTestCase.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/index/BaseDocValuesFormatTestCase.java
@@ -87,12 +87,15 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
   protected void addRandomFields(Document doc) {
     if (usually()) {
       doc.add(new NumericDocValuesField("ndv", random().nextInt(1 << 12)));
-      doc.add(new BinaryDocValuesField("bdv", new BytesRef(TestUtil.randomSimpleString(random()))));
-      doc.add(new SortedDocValuesField("sdv", new BytesRef(TestUtil.randomSimpleString(random(), 2))));
+      doc.add(new BinaryDocValuesField("bdv", newBytesRef(TestUtil.randomSimpleString(random()))));
+      doc.add(
+          new SortedDocValuesField("sdv", newBytesRef(TestUtil.randomSimpleString(random(), 2))));
     }
     int numValues = random().nextInt(5);
     for (int i = 0; i < numValues; ++i) {
-      doc.add(new SortedSetDocValuesField("ssdv", new BytesRef(TestUtil.randomSimpleString(random(), 2))));
+      doc.add(
+          new SortedSetDocValuesField(
+              "ssdv", newBytesRef(TestUtil.randomSimpleString(random(), 2))));
     }
     numValues = random().nextInt(5);
     for (int i = 0; i < numValues; ++i) {
@@ -214,8 +217,8 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     String longTerm = "longtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongterm";
     String text = "This is the text to be indexed. " + longTerm;
     doc.add(newTextField("fieldname", text, Field.Store.YES));
-    doc.add(new BinaryDocValuesField("dv1", new BytesRef(longTerm)));
-    doc.add(new BinaryDocValuesField("dv2", new BytesRef(text)));
+    doc.add(new BinaryDocValuesField("dv1", newBytesRef(longTerm)));
+    doc.add(new BinaryDocValuesField("dv2", newBytesRef(text)));
     iwriter.addDocument(doc);
     iwriter.close();
     
@@ -236,11 +239,11 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
       BinaryDocValues dv = ireader.leaves().get(0).reader().getBinaryDocValues("dv1");
       assertEquals(hitDocID, dv.advance(hitDocID));
       BytesRef scratch = dv.binaryValue();
-      assertEquals(new BytesRef(longTerm), scratch);
+      assertEquals(newBytesRef(longTerm), scratch);
       dv = ireader.leaves().get(0).reader().getBinaryDocValues("dv2");
       assertEquals(hitDocID, dv.advance(hitDocID));
       scratch = dv.binaryValue();
-      assertEquals(new BytesRef(text), scratch);
+      assertEquals(newBytesRef(text), scratch);
     }
 
     ireader.close();
@@ -265,7 +268,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
       for (int j = 0; j < value.length; j++) {
         value[j] = (byte) random().nextInt(vocabRange);
       }
-      BytesRef bytesRef = new BytesRef(value);
+      BytesRef bytesRef = newBytesRef(value);
       writtenValues.put(i, bytesRef);
       doc.add(newTextField("id", Integer.toString(i), Field.Store.YES));
       doc.add(new BinaryDocValuesField("dv1", bytesRef));
@@ -306,7 +309,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     String text = "This is the text to be indexed. " + longTerm;
     doc.add(newTextField("fieldname", text, Field.Store.YES));
     doc.add(new NumericDocValuesField("dv1", 5));
-    doc.add(new BinaryDocValuesField("dv2", new BytesRef("hello world")));
+    doc.add(new BinaryDocValuesField("dv2", newBytesRef("hello world")));
     iwriter.addDocument(doc);
     iwriter.close();
     
@@ -329,7 +332,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
       assertEquals(5, dv.longValue());
       BinaryDocValues dv2 = ireader.leaves().get(0).reader().getBinaryDocValues("dv2");
       assertEquals(docID, dv2.advance(docID));
-      assertEquals(new BytesRef("hello world"), dv2.binaryValue());
+      assertEquals(newBytesRef("hello world"), dv2.binaryValue());
     }
 
     ireader.close();
@@ -343,9 +346,9 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     String longTerm = "longtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongterm";
     String text = "This is the text to be indexed. " + longTerm;
     doc.add(newTextField("fieldname", text, Field.Store.YES));
-    doc.add(new SortedDocValuesField("dv1", new BytesRef("hello hello")));
+    doc.add(new SortedDocValuesField("dv1", newBytesRef("hello hello")));
     doc.add(new NumericDocValuesField("dv2", 5));
-    doc.add(new BinaryDocValuesField("dv3", new BytesRef("hello world")));
+    doc.add(new BinaryDocValuesField("dv3", newBytesRef("hello world")));
     iwriter.addDocument(doc);
     iwriter.close();
     
@@ -367,13 +370,13 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
       assertEquals(docID, dv.advance(docID));
       int ord = dv.ordValue();
       BytesRef scratch = dv.lookupOrd(ord);
-      assertEquals(new BytesRef("hello hello"), scratch);
+      assertEquals(newBytesRef("hello hello"), scratch);
       NumericDocValues dv2 = ireader.leaves().get(0).reader().getNumericDocValues("dv2");
       assertEquals(docID, dv2.advance(docID));
       assertEquals(5, dv2.longValue());
       BinaryDocValues dv3 = ireader.leaves().get(0).reader().getBinaryDocValues("dv3");
       assertEquals(docID, dv3.advance(docID));
-      assertEquals(new BytesRef("hello world"), dv3.binaryValue());
+      assertEquals(newBytesRef("hello world"), dv3.binaryValue());
     }
 
     ireader.close();
@@ -387,8 +390,8 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     String longTerm = "longtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongterm";
     String text = "This is the text to be indexed. " + longTerm;
     doc.add(newTextField("fieldname", text, Field.Store.YES));
-    doc.add(new BinaryDocValuesField("dv1", new BytesRef("hello world")));
-    doc.add(new SortedDocValuesField("dv2", new BytesRef("hello hello")));
+    doc.add(new BinaryDocValuesField("dv1", newBytesRef("hello world")));
+    doc.add(new SortedDocValuesField("dv2", newBytesRef("hello hello")));
     doc.add(new NumericDocValuesField("dv3", 5));
     iwriter.addDocument(doc);
     iwriter.close();
@@ -401,7 +404,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     Query query = new TermQuery(new Term("fieldname", "text"));
     TopDocs hits = isearcher.search(query, 1);
     assertEquals(1, hits.totalHits.value);
-    BytesRef scratch = new BytesRef();
+    BytesRef scratch = newBytesRef();
     // Iterate through the results:
     for (int i = 0; i < hits.scoreDocs.length; i++) {
       int docID = hits.scoreDocs[i].doc;
@@ -412,13 +415,13 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
       assertEquals(docID, dv.advance(docID));
       int ord = dv.ordValue();
       scratch = dv.lookupOrd(ord);
-      assertEquals(new BytesRef("hello hello"), scratch);
+      assertEquals(newBytesRef("hello hello"), scratch);
       NumericDocValues dv2 = ireader.leaves().get(0).reader().getNumericDocValues("dv3");
       assertEquals(docID, dv2.advance(docID));
       assertEquals(5, dv2.longValue());
       BinaryDocValues dv3 = ireader.leaves().get(0).reader().getBinaryDocValues("dv1");
       assertEquals(docID, dv3.advance(docID));
-      assertEquals(new BytesRef("hello world"), dv3.binaryValue());
+      assertEquals(newBytesRef("hello world"), dv3.binaryValue());
     }
 
     ireader.close();
@@ -561,7 +564,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     String longTerm = "longtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongterm";
     String text = "This is the text to be indexed. " + longTerm;
     doc.add(newTextField("fieldname", text, Field.Store.YES));
-    doc.add(new BinaryDocValuesField("dv", new BytesRef("hello world")));
+    doc.add(new BinaryDocValuesField("dv", newBytesRef("hello world")));
     iwriter.addDocument(doc);
     iwriter.close();
     
@@ -581,7 +584,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
       assert ireader.leaves().size() == 1;
       BinaryDocValues dv = ireader.leaves().get(0).reader().getBinaryDocValues("dv");
       assertEquals(hitDocID, dv.advance(hitDocID));
-      assertEquals(new BytesRef("hello world"), dv.binaryValue());
+      assertEquals(newBytesRef("hello world"), dv.binaryValue());
     }
 
     ireader.close();
@@ -597,12 +600,12 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     RandomIndexWriter iwriter = new RandomIndexWriter(random(), directory, conf);
     Document doc = new Document();
     doc.add(newField("id", "0", StringField.TYPE_STORED));
-    doc.add(new BinaryDocValuesField("dv", new BytesRef("hello world 1")));
+    doc.add(new BinaryDocValuesField("dv", newBytesRef("hello world 1")));
     iwriter.addDocument(doc);
     iwriter.commit();
     doc = new Document();
     doc.add(newField("id", "1", StringField.TYPE_STORED));
-    doc.add(new BinaryDocValuesField("dv", new BytesRef("hello 2")));
+    doc.add(new BinaryDocValuesField("dv", newBytesRef("hello 2")));
     iwriter.addDocument(doc);
     iwriter.forceMerge(1);
     iwriter.close();
@@ -639,7 +642,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     iwriter.addDocument(doc);    
     doc = new Document();
     doc.add(new StringField("id", "1", Field.Store.NO));
-    doc.add(new BinaryDocValuesField("field", new BytesRef("hi")));
+    doc.add(new BinaryDocValuesField("field", newBytesRef("hi")));
     iwriter.addDocument(doc);
     iwriter.commit();
     iwriter.deleteDocuments(new Term("id", "1"));
@@ -665,7 +668,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     String longTerm = "longtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongtermlongterm";
     String text = "This is the text to be indexed. " + longTerm;
     doc.add(newTextField("fieldname", text, Field.Store.YES));
-    doc.add(new SortedDocValuesField("dv", new BytesRef("hello world")));
+    doc.add(new SortedDocValuesField("dv", newBytesRef("hello world")));
     iwriter.addDocument(doc);
     iwriter.close();
     
@@ -677,7 +680,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     Query query = new TermQuery(new Term("fieldname", "text"));
     TopDocs hits = isearcher.search(query, 1);
     assertEquals(1, hits.totalHits.value);
-    BytesRef scratch = new BytesRef();
+    BytesRef scratch = newBytesRef();
     // Iterate through the results:
     for (int i = 0; i < hits.scoreDocs.length; i++) {
       int docID = hits.scoreDocs[i].doc;
@@ -687,7 +690,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
       SortedDocValues dv = ireader.leaves().get(0).reader().getSortedDocValues("dv");
       assertEquals(docID, dv.advance(docID));
       scratch = dv.lookupOrd(dv.ordValue());
-      assertEquals(new BytesRef("hello world"), scratch);
+      assertEquals(newBytesRef("hello world"), scratch);
     }
 
     ireader.close();
@@ -702,10 +705,10 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     conf.setMergePolicy(newLogMergePolicy());
     RandomIndexWriter iwriter = new RandomIndexWriter(random(), directory, conf);
     Document doc = new Document();
-    doc.add(new SortedDocValuesField("dv", new BytesRef("hello world 1")));
+    doc.add(new SortedDocValuesField("dv", newBytesRef("hello world 1")));
     iwriter.addDocument(doc);
     doc = new Document();
-    doc.add(new SortedDocValuesField("dv", new BytesRef("hello world 2")));
+    doc.add(new SortedDocValuesField("dv", newBytesRef("hello world 2")));
     iwriter.addDocument(doc);
     iwriter.forceMerge(1);
     iwriter.close();
@@ -714,7 +717,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     IndexReader ireader = DirectoryReader.open(directory); // read-only=true
     assert ireader.leaves().size() == 1;
     SortedDocValues dv = ireader.leaves().get(0).reader().getSortedDocValues("dv");
-    BytesRef scratch = new BytesRef();
+    BytesRef scratch = newBytesRef();
     assertEquals(0, dv.nextDoc());
     scratch = dv.lookupOrd(dv.ordValue());
     assertEquals("hello world 1", scratch.utf8ToString());
@@ -734,13 +737,13 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     conf.setMergePolicy(newLogMergePolicy());
     RandomIndexWriter iwriter = new RandomIndexWriter(random(), directory, conf);
     Document doc = new Document();
-    doc.add(new SortedDocValuesField("dv", new BytesRef("hello world 1")));
+    doc.add(new SortedDocValuesField("dv", newBytesRef("hello world 1")));
     iwriter.addDocument(doc);
     doc = new Document();
-    doc.add(new SortedDocValuesField("dv", new BytesRef("hello world 2")));
+    doc.add(new SortedDocValuesField("dv", newBytesRef("hello world 2")));
     iwriter.addDocument(doc);
     doc = new Document();
-    doc.add(new SortedDocValuesField("dv", new BytesRef("hello world 1")));
+    doc.add(new SortedDocValuesField("dv", newBytesRef("hello world 1")));
     iwriter.addDocument(doc);
     iwriter.forceMerge(1);
     iwriter.close();
@@ -774,12 +777,12 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     RandomIndexWriter iwriter = new RandomIndexWriter(random(), directory, conf);
     Document doc = new Document();
     doc.add(newField("id", "0", StringField.TYPE_STORED));
-    doc.add(new SortedDocValuesField("dv", new BytesRef("hello world 1")));
+    doc.add(new SortedDocValuesField("dv", newBytesRef("hello world 1")));
     iwriter.addDocument(doc);
     iwriter.commit();
     doc = new Document();
     doc.add(newField("id", "1", StringField.TYPE_STORED));
-    doc.add(new SortedDocValuesField("dv", new BytesRef("hello world 2")));
+    doc.add(new SortedDocValuesField("dv", newBytesRef("hello world 2")));
     iwriter.addDocument(doc);
     iwriter.forceMerge(1);
     iwriter.close();
@@ -790,11 +793,11 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     SortedDocValues dv = ireader.leaves().get(0).reader().getSortedDocValues("dv");
     assertEquals(2, dv.getValueCount()); // 2 ords
     assertEquals(0, dv.nextDoc());
-    BytesRef scratch = dv.binaryValue();
-    assertEquals(new BytesRef("hello world 1"), scratch);
+    BytesRef scratch = dv.lookupOrd(dv.ordValue());
+    assertEquals(newBytesRef("hello world 1"), scratch);
     scratch = dv.lookupOrd(1);
-    assertEquals(new BytesRef("hello world 2"), scratch);
-    for(int i=0;i<2;i++) {
+    assertEquals(newBytesRef("hello world 2"), scratch);
+    for (int i = 0; i < 2; i++) {
       Document doc2 = ireader.leaves().get(0).reader().document(i);
       String expected;
       if (doc2.get("id").equals("0")) {
@@ -825,7 +828,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     iwriter.addDocument(doc);    
     doc = new Document();
     doc.add(new StringField("id", "1", Field.Store.NO));
-    doc.add(new SortedDocValuesField("field", new BytesRef("hello")));
+    doc.add(new SortedDocValuesField("field", newBytesRef("hello")));
     iwriter.addDocument(doc);
     iwriter.commit();
     iwriter.deleteDocuments(new Term("id", "1"));
@@ -849,7 +852,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     conf.setMergePolicy(newLogMergePolicy());
     RandomIndexWriter iwriter = new RandomIndexWriter(random(), directory, conf);
     Document doc = new Document();
-    doc.add(new BinaryDocValuesField("dv", new BytesRef("hello\nworld\r1")));
+    doc.add(new BinaryDocValuesField("dv", newBytesRef("hello\nworld\r1")));
     iwriter.addDocument(doc);
     iwriter.close();
     
@@ -858,7 +861,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     assert ireader.leaves().size() == 1;
     BinaryDocValues dv = ireader.leaves().get(0).reader().getBinaryDocValues("dv");
     assertEquals(0, dv.nextDoc());
-    assertEquals(new BytesRef("hello\nworld\r1"), dv.binaryValue());
+    assertEquals(newBytesRef("hello\nworld\r1"), dv.binaryValue());
 
     ireader.close();
     directory.close();
@@ -872,7 +875,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     conf.setMergePolicy(newLogMergePolicy());
     RandomIndexWriter iwriter = new RandomIndexWriter(random(), directory, conf);
     Document doc = new Document();
-    doc.add(new SortedDocValuesField("dv", new BytesRef("hello world 2")));
+    doc.add(new SortedDocValuesField("dv", newBytesRef("hello world 2")));
     iwriter.addDocument(doc);
     // 2nd doc missing the DV field
     iwriter.addDocument(new Document());
@@ -884,7 +887,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     SortedDocValues dv = ireader.leaves().get(0).reader().getSortedDocValues("dv");
     assertEquals(0, dv.nextDoc());
     BytesRef scratch = dv.lookupOrd(dv.ordValue());
-    assertEquals(new BytesRef("hello world 2"), scratch);
+    assertEquals(newBytesRef("hello world 2"), scratch);
     assertEquals(NO_MORE_DOCS, dv.nextDoc());
     ireader.close();
     directory.close();
@@ -898,15 +901,15 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     RandomIndexWriter iwriter = new RandomIndexWriter(random(), directory, iwconfig);
     
     Document doc = new Document();
-    doc.add(new SortedDocValuesField("field", new BytesRef("hello")));
+    doc.add(new SortedDocValuesField("field", newBytesRef("hello")));
     iwriter.addDocument(doc);
     
     doc = new Document();
-    doc.add(new SortedDocValuesField("field", new BytesRef("world")));
+    doc.add(new SortedDocValuesField("field", newBytesRef("world")));
     iwriter.addDocument(doc);
 
     doc = new Document();
-    doc.add(new SortedDocValuesField("field", new BytesRef("beer")));
+    doc.add(new SortedDocValuesField("field", newBytesRef("beer")));
     iwriter.addDocument(doc);
     iwriter.forceMerge(1);
     
@@ -927,27 +930,27 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     assertEquals(2, termsEnum.ord());
     
     // seekCeil()
-    assertEquals(SeekStatus.NOT_FOUND, termsEnum.seekCeil(new BytesRef("ha!")));
+    assertEquals(SeekStatus.NOT_FOUND, termsEnum.seekCeil(newBytesRef("ha!")));
     assertEquals("hello", termsEnum.term().utf8ToString());
     assertEquals(1, termsEnum.ord());
-    assertEquals(SeekStatus.FOUND, termsEnum.seekCeil(new BytesRef("beer")));
+    assertEquals(SeekStatus.FOUND, termsEnum.seekCeil(newBytesRef("beer")));
     assertEquals("beer", termsEnum.term().utf8ToString());
     assertEquals(0, termsEnum.ord());
-    assertEquals(SeekStatus.END, termsEnum.seekCeil(new BytesRef("zzz")));
-    assertEquals(SeekStatus.NOT_FOUND, termsEnum.seekCeil(new BytesRef("aba")));
+    assertEquals(SeekStatus.END, termsEnum.seekCeil(newBytesRef("zzz")));
+    assertEquals(SeekStatus.NOT_FOUND, termsEnum.seekCeil(newBytesRef("aba")));
     assertEquals(0, termsEnum.ord());
     
     // seekExact()
-    assertTrue(termsEnum.seekExact(new BytesRef("beer")));
+    assertTrue(termsEnum.seekExact(newBytesRef("beer")));
     assertEquals("beer", termsEnum.term().utf8ToString());
     assertEquals(0, termsEnum.ord());
-    assertTrue(termsEnum.seekExact(new BytesRef("hello")));
+    assertTrue(termsEnum.seekExact(newBytesRef("hello")));
     assertEquals(Codec.getDefault().toString(), "hello", termsEnum.term().utf8ToString());
     assertEquals(1, termsEnum.ord());
-    assertTrue(termsEnum.seekExact(new BytesRef("world")));
+    assertTrue(termsEnum.seekExact(newBytesRef("world")));
     assertEquals("world", termsEnum.term().utf8ToString());
     assertEquals(2, termsEnum.ord());
-    assertFalse(termsEnum.seekExact(new BytesRef("bogus")));
+    assertFalse(termsEnum.seekExact(newBytesRef("bogus")));
 
     // seek(ord)
     termsEnum.seekExact(0);
@@ -986,10 +989,10 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     conf.setMergePolicy(newLogMergePolicy());
     RandomIndexWriter iwriter = new RandomIndexWriter(random(), directory, conf);
     Document doc = new Document();
-    doc.add(new SortedDocValuesField("dv", new BytesRef("")));
+    doc.add(new SortedDocValuesField("dv", newBytesRef("")));
     iwriter.addDocument(doc);
     doc = new Document();
-    doc.add(new SortedDocValuesField("dv", new BytesRef("")));
+    doc.add(new SortedDocValuesField("dv", newBytesRef("")));
     iwriter.addDocument(doc);
     iwriter.forceMerge(1);
     iwriter.close();
@@ -1017,10 +1020,10 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     conf.setMergePolicy(newLogMergePolicy());
     RandomIndexWriter iwriter = new RandomIndexWriter(random(), directory, conf);
     Document doc = new Document();
-    doc.add(new BinaryDocValuesField("dv", new BytesRef("")));
+    doc.add(new BinaryDocValuesField("dv", newBytesRef("")));
     iwriter.addDocument(doc);
     doc = new Document();
-    doc.add(new BinaryDocValuesField("dv", new BytesRef("")));
+    doc.add(new BinaryDocValuesField("dv", newBytesRef("")));
     iwriter.addDocument(doc);
     iwriter.forceMerge(1);
     iwriter.close();
@@ -1047,8 +1050,8 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     RandomIndexWriter iwriter = new RandomIndexWriter(random(), directory, conf);
     Document doc = new Document();
     byte bytes[] = new byte[32766];
-    BytesRef b = new BytesRef(bytes);
     random().nextBytes(bytes);
+    BytesRef b = newBytesRef(bytes);
     doc.add(new BinaryDocValuesField("dv", b));
     iwriter.addDocument(doc);
     iwriter.close();
@@ -1058,7 +1061,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     assert ireader.leaves().size() == 1;
     BinaryDocValues dv = ireader.leaves().get(0).reader().getBinaryDocValues("dv");
     assertEquals(0, dv.nextDoc());
-    assertEquals(new BytesRef(bytes), dv.binaryValue());
+    assertEquals(newBytesRef(bytes), dv.binaryValue());
 
     ireader.close();
     directory.close();
@@ -1073,8 +1076,8 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     RandomIndexWriter iwriter = new RandomIndexWriter(random(), directory, conf);
     Document doc = new Document();
     byte bytes[] = new byte[32766];
-    BytesRef b = new BytesRef(bytes);
     random().nextBytes(bytes);
+    BytesRef b = newBytesRef(bytes);
     doc.add(new SortedDocValuesField("dv", b));
     iwriter.addDocument(doc);
     iwriter.close();
@@ -1084,7 +1087,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     assert ireader.leaves().size() == 1;
     BinaryDocValues dv = DocValues.getBinary(ireader.leaves().get(0).reader(), "dv");
     assertEquals(0, dv.nextDoc());
-    assertEquals(new BytesRef(bytes), dv.binaryValue());
+    assertEquals(newBytesRef(bytes), dv.lookupOrd(dv.ordValue()));
     ireader.close();
     directory.close();
   }
@@ -1097,7 +1100,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     conf.setMergePolicy(newLogMergePolicy());
     RandomIndexWriter iwriter = new RandomIndexWriter(random(), directory, conf);
     Document doc = new Document();
-    doc.add(new BinaryDocValuesField("dv", new BytesRef("boo!")));
+    doc.add(new BinaryDocValuesField("dv", newBytesRef("boo!")));
     iwriter.addDocument(doc);
     iwriter.close();
     
@@ -1120,7 +1123,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     conf.setMergePolicy(newLogMergePolicy());
     RandomIndexWriter iwriter = new RandomIndexWriter(random(), directory, conf);
     Document doc = new Document();
-    doc.add(new SortedDocValuesField("dv", new BytesRef("boo!")));
+    doc.add(new SortedDocValuesField("dv", newBytesRef("boo!")));
     iwriter.addDocument(doc);
     iwriter.close();
     
@@ -1194,7 +1197,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
       Document doc = new Document();
       doc.add(newTextField("id", "" + i, Field.Store.YES));
       String string = TestUtil.randomRealisticUnicodeString(random(), 1, maxLength);
-      BytesRef br = new BytesRef(string);
+      BytesRef br = newBytesRef(string);
       doc.add(new SortedDocValuesField("field", br));
       hash.add(br);
       docToString.put("" + i, string);
@@ -1217,7 +1220,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
       String id = "" + i + numDocs;
       doc.add(newTextField("id", id, Field.Store.YES));
       String string = TestUtil.randomRealisticUnicodeString(random(), 1, maxLength);
-      BytesRef br = new BytesRef(string);
+      BytesRef br = newBytesRef(string);
       hash.add(br);
       docToString.put(id, string);
       doc.add(new SortedDocValuesField("field", br));
@@ -1227,7 +1230,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     IndexReader reader = w.getReader();
     SortedDocValues docValues = MultiDocValues.getSortedValues(reader, "field");
     int[] sort = hash.sort();
-    BytesRef expected = new BytesRef();
+    BytesRef expected = newBytesRef();
     assertEquals(hash.size(), docValues.getValueCount());
     for (int i = 0; i < hash.size(); i++) {
       hash.get(sort[i], expected);
@@ -1240,9 +1243,10 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
 
     for (Entry<String, String> entry : entrySet) {
       // pk lookup
-      PostingsEnum termPostingsEnum = TestUtil.docs(random(), reader, "id", new BytesRef(entry.getKey()), null, 0);
+      PostingsEnum termPostingsEnum =
+          TestUtil.docs(random(), reader, "id", newBytesRef(entry.getKey()), null, 0);
       int docId = termPostingsEnum.nextDoc();
-      expected = new BytesRef(entry.getValue());
+      expected = newBytesRef(entry.getValue());
       docValues = MultiDocValues.getSortedValues(reader, "field");
       assertEquals(docId, docValues.advance(docId));
       final BytesRef actual = docValues.binaryValue();
@@ -1476,7 +1480,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     Document doc = new Document();
     Field idField = new StringField("id", "", Field.Store.NO);
     Field storedField = new StoredField("stored", new byte[0]);
-    Field dvField = new BinaryDocValuesField("dv", new BytesRef());
+    Field dvField = new BinaryDocValuesField("dv", newBytesRef());
     doc.add(idField);
     doc.add(storedField);
     doc.add(dvField);
@@ -1598,7 +1602,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     Document doc = new Document();
     Field idField = new StringField("id", "", Field.Store.NO);
     Field storedField = new StoredField("stored", new byte[0]);
-    Field dvField = new SortedDocValuesField("dv", new BytesRef());
+    Field dvField = new SortedDocValuesField("dv", newBytesRef());
     doc.add(idField);
     doc.add(storedField);
     doc.add(dvField);
@@ -1716,7 +1720,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     RandomIndexWriter iwriter = new RandomIndexWriter(random(), directory);
     
     Document doc = new Document();
-    doc.add(new SortedSetDocValuesField("field", new BytesRef("hello")));
+    doc.add(new SortedSetDocValuesField("field", newBytesRef("hello")));
     iwriter.addDocument(doc);
     
     DirectoryReader ireader = iwriter.getReader();
@@ -1728,7 +1732,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     assertEquals(NO_MORE_ORDS, dv.nextOrd());
     
     BytesRef bytes = dv.lookupOrd(0);
-    assertEquals(new BytesRef("hello"), bytes);
+    assertEquals(newBytesRef("hello"), bytes);
 
     ireader.close();
     directory.close();
@@ -1739,8 +1743,8 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     RandomIndexWriter iwriter = new RandomIndexWriter(random(), directory);
     
     Document doc = new Document();
-    doc.add(new SortedSetDocValuesField("field", new BytesRef("hello")));
-    doc.add(new SortedSetDocValuesField("field2", new BytesRef("world")));
+    doc.add(new SortedSetDocValuesField("field", newBytesRef("hello")));
+    doc.add(new SortedSetDocValuesField("field2", newBytesRef("world")));
     iwriter.addDocument(doc);
     
     DirectoryReader ireader = iwriter.getReader();
@@ -1753,8 +1757,8 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     assertEquals(NO_MORE_ORDS, dv.nextOrd());
     
     BytesRef bytes = dv.lookupOrd(0);
-    assertEquals(new BytesRef("hello"), bytes);
-    
+    assertEquals(newBytesRef("hello"), bytes);
+
     dv = getOnlyLeafReader(ireader).getSortedSetDocValues("field2");
 
     assertEquals(0, dv.nextDoc());
@@ -1762,8 +1766,8 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     assertEquals(NO_MORE_ORDS, dv.nextOrd());
     
     bytes = dv.lookupOrd(0);
-    assertEquals(new BytesRef("world"), bytes);
-    
+    assertEquals(newBytesRef("world"), bytes);
+
     ireader.close();
     directory.close();
   }
@@ -1776,12 +1780,12 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     RandomIndexWriter iwriter = new RandomIndexWriter(random(), directory, iwconfig);
   
     Document doc = new Document();
-    doc.add(new SortedSetDocValuesField("field", new BytesRef("hello")));
+    doc.add(new SortedSetDocValuesField("field", newBytesRef("hello")));
     iwriter.addDocument(doc);
     iwriter.commit();
     
     doc = new Document();
-    doc.add(new SortedSetDocValuesField("field", new BytesRef("world")));
+    doc.add(new SortedSetDocValuesField("field", newBytesRef("world")));
     iwriter.addDocument(doc);
     iwriter.forceMerge(1);
     
@@ -1796,14 +1800,14 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     assertEquals(NO_MORE_ORDS, dv.nextOrd());
     
     BytesRef bytes = dv.lookupOrd(0);
-    assertEquals(new BytesRef("hello"), bytes);
-    
+    assertEquals(newBytesRef("hello"), bytes);
+
     assertEquals(1, dv.nextDoc());
     assertEquals(1, dv.nextOrd());
     assertEquals(NO_MORE_ORDS, dv.nextOrd());
     
     bytes = dv.lookupOrd(1);
-    assertEquals(new BytesRef("world"), bytes);   
+    assertEquals(newBytesRef("world"), bytes);
 
     ireader.close();
     directory.close();
@@ -1814,8 +1818,8 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     RandomIndexWriter iwriter = new RandomIndexWriter(random(), directory);
     
     Document doc = new Document();
-    doc.add(new SortedSetDocValuesField("field", new BytesRef("hello")));
-    doc.add(new SortedSetDocValuesField("field", new BytesRef("world")));
+    doc.add(new SortedSetDocValuesField("field", newBytesRef("hello")));
+    doc.add(new SortedSetDocValuesField("field", newBytesRef("world")));
     iwriter.addDocument(doc);
     
     DirectoryReader ireader = iwriter.getReader();
@@ -1829,10 +1833,10 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     assertEquals(NO_MORE_ORDS, dv.nextOrd());
     
     BytesRef bytes = dv.lookupOrd(0);
-    assertEquals(new BytesRef("hello"), bytes);
-    
+    assertEquals(newBytesRef("hello"), bytes);
+
     bytes = dv.lookupOrd(1);
-    assertEquals(new BytesRef("world"), bytes);
+    assertEquals(newBytesRef("world"), bytes);
 
     ireader.close();
     directory.close();
@@ -1843,8 +1847,8 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     RandomIndexWriter iwriter = new RandomIndexWriter(random(), directory);
     
     Document doc = new Document();
-    doc.add(new SortedSetDocValuesField("field", new BytesRef("world")));
-    doc.add(new SortedSetDocValuesField("field", new BytesRef("hello")));
+    doc.add(new SortedSetDocValuesField("field", newBytesRef("world")));
+    doc.add(new SortedSetDocValuesField("field", newBytesRef("hello")));
     iwriter.addDocument(doc);
     
     DirectoryReader ireader = iwriter.getReader();
@@ -1858,10 +1862,10 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     assertEquals(NO_MORE_ORDS, dv.nextOrd());
     
     BytesRef bytes = dv.lookupOrd(0);
-    assertEquals(new BytesRef("hello"), bytes);
-    
+    assertEquals(newBytesRef("hello"), bytes);
+
     bytes = dv.lookupOrd(1);
-    assertEquals(new BytesRef("world"), bytes);
+    assertEquals(newBytesRef("world"), bytes);
 
     ireader.close();
     directory.close();
@@ -1875,14 +1879,14 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     RandomIndexWriter iwriter = new RandomIndexWriter(random(), directory, iwconfig);
     
     Document doc = new Document();
-    doc.add(new SortedSetDocValuesField("field", new BytesRef("hello")));
-    doc.add(new SortedSetDocValuesField("field", new BytesRef("world")));
+    doc.add(new SortedSetDocValuesField("field", newBytesRef("hello")));
+    doc.add(new SortedSetDocValuesField("field", newBytesRef("world")));
     iwriter.addDocument(doc);
     iwriter.commit();
     
     doc = new Document();
-    doc.add(new SortedSetDocValuesField("field", new BytesRef("hello")));
-    doc.add(new SortedSetDocValuesField("field", new BytesRef("beer")));
+    doc.add(new SortedSetDocValuesField("field", newBytesRef("hello")));
+    doc.add(new SortedSetDocValuesField("field", newBytesRef("beer")));
     iwriter.addDocument(doc);
     iwriter.forceMerge(1);
     
@@ -1903,13 +1907,13 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     assertEquals(NO_MORE_ORDS, dv.nextOrd());
     
     BytesRef bytes = dv.lookupOrd(0);
-    assertEquals(new BytesRef("beer"), bytes);
-    
+    assertEquals(newBytesRef("beer"), bytes);
+
     bytes = dv.lookupOrd(1);
-    assertEquals(new BytesRef("hello"), bytes);
-    
+    assertEquals(newBytesRef("hello"), bytes);
+
     bytes = dv.lookupOrd(2);
-    assertEquals(new BytesRef("world"), bytes);
+    assertEquals(newBytesRef("world"), bytes);
 
     ireader.close();
     directory.close();
@@ -1923,7 +1927,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     RandomIndexWriter iwriter = new RandomIndexWriter(random(), directory, iwconfig);
     
     Document doc = new Document();
-    doc.add(new SortedSetDocValuesField("field", new BytesRef("hello")));
+    doc.add(new SortedSetDocValuesField("field", newBytesRef("hello")));
     iwriter.addDocument(doc);
     
     doc = new Document();
@@ -1940,8 +1944,8 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     assertEquals(NO_MORE_ORDS, dv.nextOrd());
     
     BytesRef bytes = dv.lookupOrd(0);
-    assertEquals(new BytesRef("hello"), bytes);
-    
+    assertEquals(newBytesRef("hello"), bytes);
+
     ireader.close();
     directory.close();
   }
@@ -1954,7 +1958,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     RandomIndexWriter iwriter = new RandomIndexWriter(random(), directory, iwconfig);
     
     Document doc = new Document();
-    doc.add(new SortedSetDocValuesField("field", new BytesRef("hello")));
+    doc.add(new SortedSetDocValuesField("field", newBytesRef("hello")));
     iwriter.addDocument(doc);
     iwriter.commit();
     
@@ -1973,8 +1977,8 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     assertEquals(NO_MORE_ORDS, dv.nextOrd());
     
     BytesRef bytes = dv.lookupOrd(0);
-    assertEquals(new BytesRef("hello"), bytes);
-    
+    assertEquals(newBytesRef("hello"), bytes);
+
     ireader.close();
     directory.close();
   }
@@ -1990,7 +1994,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     iwriter.addDocument(doc);
     
     doc = new Document();
-    doc.add(new SortedSetDocValuesField("field", new BytesRef("hello")));
+    doc.add(new SortedSetDocValuesField("field", newBytesRef("hello")));
     iwriter.addDocument(doc);
     
     iwriter.forceMerge(1);
@@ -2005,8 +2009,8 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     assertEquals(NO_MORE_ORDS, dv.nextOrd());
     
     BytesRef bytes = dv.lookupOrd(0);
-    assertEquals(new BytesRef("hello"), bytes);
-    
+    assertEquals(newBytesRef("hello"), bytes);
+
     ireader.close();
     directory.close();
   }
@@ -2023,7 +2027,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     iwriter.commit();
     
     doc = new Document();
-    doc.add(new SortedSetDocValuesField("field", new BytesRef("hello")));
+    doc.add(new SortedSetDocValuesField("field", newBytesRef("hello")));
     iwriter.addDocument(doc);
     iwriter.forceMerge(1);
     
@@ -2038,8 +2042,8 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     assertEquals(NO_MORE_ORDS, dv.nextOrd());
     
     BytesRef bytes = dv.lookupOrd(0);
-    assertEquals(new BytesRef("hello"), bytes);
-    
+    assertEquals(newBytesRef("hello"), bytes);
+
     ireader.close();
     directory.close();
   }
@@ -2056,7 +2060,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     iwriter.addDocument(doc);    
     doc = new Document();
     doc.add(new StringField("id", "1", Field.Store.NO));
-    doc.add(new SortedSetDocValuesField("field", new BytesRef("hello")));
+    doc.add(new SortedSetDocValuesField("field", newBytesRef("hello")));
     iwriter.addDocument(doc);
     iwriter.commit();
     iwriter.deleteDocuments(new Term("id", "1"));
@@ -2080,9 +2084,9 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     RandomIndexWriter iwriter = new RandomIndexWriter(random(), directory, iwconfig);
     
     Document doc = new Document();
-    doc.add(new SortedSetDocValuesField("field", new BytesRef("hello")));
-    doc.add(new SortedSetDocValuesField("field", new BytesRef("world")));
-    doc.add(new SortedSetDocValuesField("field", new BytesRef("beer")));
+    doc.add(new SortedSetDocValuesField("field", newBytesRef("hello")));
+    doc.add(new SortedSetDocValuesField("field", newBytesRef("world")));
+    doc.add(new SortedSetDocValuesField("field", newBytesRef("beer")));
     iwriter.addDocument(doc);
     
     DirectoryReader ireader = iwriter.getReader();
@@ -2102,25 +2106,25 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     assertEquals(2, termsEnum.ord());
     
     // seekCeil()
-    assertEquals(SeekStatus.NOT_FOUND, termsEnum.seekCeil(new BytesRef("ha!")));
+    assertEquals(SeekStatus.NOT_FOUND, termsEnum.seekCeil(newBytesRef("ha!")));
     assertEquals("hello", termsEnum.term().utf8ToString());
     assertEquals(1, termsEnum.ord());
-    assertEquals(SeekStatus.FOUND, termsEnum.seekCeil(new BytesRef("beer")));
+    assertEquals(SeekStatus.FOUND, termsEnum.seekCeil(newBytesRef("beer")));
     assertEquals("beer", termsEnum.term().utf8ToString());
     assertEquals(0, termsEnum.ord());
-    assertEquals(SeekStatus.END, termsEnum.seekCeil(new BytesRef("zzz")));
-    
+    assertEquals(SeekStatus.END, termsEnum.seekCeil(newBytesRef("zzz")));
+
     // seekExact()
-    assertTrue(termsEnum.seekExact(new BytesRef("beer")));
+    assertTrue(termsEnum.seekExact(newBytesRef("beer")));
     assertEquals("beer", termsEnum.term().utf8ToString());
     assertEquals(0, termsEnum.ord());
-    assertTrue(termsEnum.seekExact(new BytesRef("hello")));
+    assertTrue(termsEnum.seekExact(newBytesRef("hello")));
     assertEquals("hello", termsEnum.term().utf8ToString());
     assertEquals(1, termsEnum.ord());
-    assertTrue(termsEnum.seekExact(new BytesRef("world")));
+    assertTrue(termsEnum.seekExact(newBytesRef("world")));
     assertEquals("world", termsEnum.term().utf8ToString());
     assertEquals(2, termsEnum.ord());
-    assertFalse(termsEnum.seekExact(new BytesRef("bogus")));
+    assertFalse(termsEnum.seekExact(newBytesRef("bogus")));
 
     // seek(ord)
     termsEnum.seekExact(0);
@@ -2187,7 +2191,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
       ArrayList<String> unordered = new ArrayList<>(values);
       Collections.shuffle(unordered, random());
       for (String v : unordered) {
-        doc.add(new SortedSetDocValuesField("dv", new BytesRef(v)));
+        doc.add(new SortedSetDocValuesField("dv", newBytesRef(v)));
       }
 
       writer.addDocument(doc);
@@ -2516,7 +2520,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     RandomIndexWriter iw = new RandomIndexWriter(random(), directory, conf);
     Document doc = new Document();
     doc.add(new StringField("id", "0", Field.Store.YES));
-    doc.add(new BinaryDocValuesField("dv1", new BytesRef()));
+    doc.add(new BinaryDocValuesField("dv1", newBytesRef()));
     iw.addDocument(doc);
     doc = new Document();
     doc.add(new StringField("id", "1", Field.Store.YES));
@@ -2529,7 +2533,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     LeafReader ar = ir.leaves().get(0).reader();
     BinaryDocValues dv = ar.getBinaryDocValues("dv1");
     assertEquals(0, dv.nextDoc());
-    assertEquals(new BytesRef(), dv.binaryValue());
+    assertEquals(newBytesRef(), dv.binaryValue());
     assertEquals(NO_MORE_DOCS, dv.nextDoc());
     ir.close();
     directory.close();
@@ -2542,7 +2546,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     RandomIndexWriter iw = new RandomIndexWriter(random(), directory, conf);
     Document doc = new Document();
     doc.add(new StringField("id", "0", Field.Store.YES));
-    doc.add(new BinaryDocValuesField("dv1", new BytesRef()));
+    doc.add(new BinaryDocValuesField("dv1", newBytesRef()));
     iw.addDocument(doc);
     iw.commit();
     doc = new Document();
@@ -2556,7 +2560,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     LeafReader ar = ir.leaves().get(0).reader();
     BinaryDocValues dv = ar.getBinaryDocValues("dv1");
     assertEquals(0, dv.nextDoc());
-    assertEquals(new BytesRef(), dv.binaryValue());
+    assertEquals(newBytesRef(), dv.binaryValue());
     assertEquals(NO_MORE_DOCS, dv.nextDoc());
     ir.close();
     directory.close();
@@ -2569,7 +2573,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     RandomIndexWriter iw = new RandomIndexWriter(random(), directory, conf);
     Document doc = new Document();
     doc.add(new StringField("id", "0", Field.Store.YES));
-    doc.add(new BinaryDocValuesField("dv1", new BytesRef()));
+    doc.add(new BinaryDocValuesField("dv1", newBytesRef()));
     iw.addDocument(doc);
     doc = new Document();
     doc.add(new StringField("id", "1", Field.Store.YES));
@@ -2577,7 +2581,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     iw.commit();
     doc = new Document();
     doc.add(new StringField("id", "2", Field.Store.YES));
-    doc.add(new BinaryDocValuesField("dv1", new BytesRef("boo")));
+    doc.add(new BinaryDocValuesField("dv1", newBytesRef("boo")));
     iw.addDocument(doc);
     iw.forceMerge(1);
     iw.close();
@@ -2587,9 +2591,9 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     LeafReader ar = ir.leaves().get(0).reader();
     BinaryDocValues dv = ar.getBinaryDocValues("dv1");
     assertEquals(0, dv.nextDoc());
-    assertEquals(new BytesRef(), dv.binaryValue());
+    assertEquals(newBytesRef(), dv.binaryValue());
     assertEquals(2, dv.nextDoc());
-    assertEquals(new BytesRef("boo"), dv.binaryValue());
+    assertEquals(newBytesRef("boo"), dv.binaryValue());
     assertEquals(NO_MORE_DOCS, dv.nextDoc());
     ir.close();
     directory.close();
@@ -2603,8 +2607,8 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     Document doc = new Document();
     Field idField = new StringField("id", "", Field.Store.NO);
     Field storedBinField = new StoredField("storedBin", new byte[0]);
-    Field dvBinField = new BinaryDocValuesField("dvBin", new BytesRef());
-    Field dvSortedField = new SortedDocValuesField("dvSorted", new BytesRef());
+    Field dvBinField = new BinaryDocValuesField("dvBin", newBytesRef());
+    Field dvSortedField = new SortedDocValuesField("dvSorted", newBytesRef());
     Field storedNumericField = new StoredField("storedNum", "");
     Field dvNumericField = new NumericDocValuesField("dvNum", 0);
     doc.add(idField);
@@ -2695,8 +2699,8 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     RandomIndexWriter writer = new RandomIndexWriter(random(), dir, conf);
     Field idField = new StringField("id", "", Field.Store.NO);
     Field storedBinField = new StoredField("storedBin", new byte[0]);
-    Field dvBinField = new BinaryDocValuesField("dvBin", new BytesRef());
-    Field dvSortedField = new SortedDocValuesField("dvSorted", new BytesRef());
+    Field dvBinField = new BinaryDocValuesField("dvBin", newBytesRef());
+    Field dvSortedField = new SortedDocValuesField("dvSorted", newBytesRef());
     Field storedNumericField = new StoredField("storedNum", "");
     Field dvNumericField = new NumericDocValuesField("dvNum", 0);
     
@@ -2730,7 +2734,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
         values.add(TestUtil.randomSimpleString(random()));
       }
       for (String v : values) {
-        doc.add(new SortedSetDocValuesField("dvSortedSet", new BytesRef(v)));
+        doc.add(new SortedSetDocValuesField("dvSortedSet", newBytesRef(v)));
         doc.add(new StoredField("storedSortedSet", v));
       }
       int numSortedNumericFields = random().nextInt(3);
@@ -2852,12 +2856,17 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
       Document doc = new Document();
       
       for (int j = 0; j < numSortedSets; j++) {
-        doc.add(new SortedSetDocValuesField("ss" + j, new BytesRef(TestUtil.randomSimpleString(random()))));
-        doc.add(new SortedSetDocValuesField("ss" + j, new BytesRef(TestUtil.randomSimpleString(random()))));
+        doc.add(
+            new SortedSetDocValuesField(
+                "ss" + j, newBytesRef(TestUtil.randomSimpleString(random()))));
+        doc.add(
+            new SortedSetDocValuesField(
+                "ss" + j, newBytesRef(TestUtil.randomSimpleString(random()))));
       }
       
       for (int j = 0; j < numBinaries; j++) {
-        doc.add(new BinaryDocValuesField("b" + j, new BytesRef(TestUtil.randomSimpleString(random()))));
+        doc.add(
+            new BinaryDocValuesField("b" + j, newBytesRef(TestUtil.randomSimpleString(random()))));
       }
       
       for (int j = 0; j < numSortedNums; j++) {
@@ -2916,17 +2925,15 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
       }
       Directory dir = newDirectory();
       RandomIndexWriter w = new RandomIndexWriter(random(), dir);
-      BytesRef bytes = new BytesRef();
-      bytes.bytes = new byte[1<<i];
-      bytes.length = 1<<i;
-      for(int j=0;j<4;j++) {
+      BytesRef bytes = newBytesRef(new byte[1 << i], 0, 1 << i);
+      for (int j = 0; j < 4; j++) {
         Document doc = new Document();
         doc.add(new BinaryDocValuesField("field", bytes));
         w.addDocument(doc);
       }
       Document doc = new Document();
       doc.add(new StoredField("id", "5"));
-      doc.add(new BinaryDocValuesField("field", new BytesRef()));
+      doc.add(new BinaryDocValuesField("field", newBytesRef()));
       w.addDocument(doc);
       IndexReader r = w.getReader();
       w.close();
@@ -3146,12 +3153,12 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     RandomIndexWriter iwriter = new RandomIndexWriter(random(), directory, iwconfig);
     
     Document doc = new Document();
-    SortedDocValuesField field = new SortedDocValuesField("field", new BytesRef("2"));
+    SortedDocValuesField field = new SortedDocValuesField("field", newBytesRef("2"));
     doc.add(field);
     iwriter.addDocument(doc);
-    field.setBytesValue(new BytesRef("1"));
+    field.setBytesValue(newBytesRef("1"));
     iwriter.addDocument(doc);
-    field.setBytesValue(new BytesRef("3"));
+    field.setBytesValue(newBytesRef("3"));
     iwriter.addDocument(doc);
 
     iwriter.commit();
@@ -3175,14 +3182,14 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
     RandomIndexWriter iwriter = new RandomIndexWriter(random(), directory, iwconfig);
     
     Document doc = new Document();
-    SortedSetDocValuesField field1 = new SortedSetDocValuesField("field", new BytesRef("2"));
-    SortedSetDocValuesField field2 = new SortedSetDocValuesField("field", new BytesRef("3"));
+    SortedSetDocValuesField field1 = new SortedSetDocValuesField("field", newBytesRef("2"));
+    SortedSetDocValuesField field2 = new SortedSetDocValuesField("field", newBytesRef("3"));
     doc.add(field1);
     doc.add(field2);
     iwriter.addDocument(doc);
-    field1.setBytesValue(new BytesRef("1"));
+    field1.setBytesValue(newBytesRef("1"));
     iwriter.addDocument(doc);
-    field2.setBytesValue(new BytesRef("2"));
+    field2.setBytesValue(newBytesRef("2"));
     iwriter.addDocument(doc);
 
     iwriter.commit();
@@ -3284,7 +3291,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
 
     Document doc = new Document();
     doc.add(new StringField("id", "1", Field.Store.NO));
-    doc.add(new SortedDocValuesField("field", new BytesRef("hello")));
+    doc.add(new SortedDocValuesField("field", newBytesRef("hello")));
     iwriter.addDocument(doc);
     final int numEmptyDocs = atLeast(1024);
     for (int i = 0; i < numEmptyDocs; ++i) {
@@ -3314,7 +3321,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
 
     Document doc = new Document();
     doc.add(new StringField("id", "1", Field.Store.NO));
-    doc.add(new SortedSetDocValuesField("field", new BytesRef("hello")));
+    doc.add(new SortedSetDocValuesField("field", newBytesRef("hello")));
     iwriter.addDocument(doc);
     final int numEmptyDocs = atLeast(1024);
     for (int i = 0; i < numEmptyDocs; ++i) {
@@ -3404,7 +3411,7 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
 
     Document doc = new Document();
     doc.add(new StringField("id", "1", Field.Store.NO));
-    doc.add(new BinaryDocValuesField("field", new BytesRef("hello")));
+    doc.add(new BinaryDocValuesField("field", newBytesRef("hello")));
     iwriter.addDocument(doc);
     final int numEmptyDocs = atLeast(1024);
     for (int i = 0; i < numEmptyDocs; ++i) {
@@ -3445,13 +3452,14 @@ public abstract class BaseDocValuesFormatTestCase extends BaseIndexFileFormatTes
   }
 
   public void testRandomAdvanceBinary() throws IOException {
-    doTestRandomAdvance(new FieldCreator() {
-        @Override
-        public Field next() {
-          byte[] bytes = new byte[random().nextInt(10)];
-          random().nextBytes(bytes);
-          return new BinaryDocValuesField("field", new BytesRef(bytes));
-        }
+    doTestRandomAdvance(
+        new FieldCreator() {
+          @Override
+          public Field next() {
+            byte[] bytes = new byte[random().nextInt(10)];
+            random().nextBytes(bytes);
+            return new BinaryDocValuesField("field", newBytesRef(bytes));
+          }
 
         @Override
         public DocIdSetIterator iterator(IndexReader r) throws IOException {
diff --git a/lucene/test-framework/src/java/org/apache/lucene/index/BaseTermVectorsFormatTestCase.java b/lucene/test-framework/src/java/org/apache/lucene/index/BaseTermVectorsFormatTestCase.java
index 0955996..a4c62bf 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/index/BaseTermVectorsFormatTestCase.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/index/BaseTermVectorsFormatTestCase.java
@@ -273,7 +273,8 @@ public abstract class BaseTermVectorsFormatTestCase extends BaseIndexFileFormatT
       final BytesRef payload = new BytesRef(len);
       random().nextBytes(payload.bytes);
       payload.length = len;
-      return payload;
+
+      return newBytesRef(payload);
     }
 
     public boolean hasPayloads() {
@@ -383,7 +384,7 @@ public abstract class BaseTermVectorsFormatTestCase extends BaseIndexFileFormatT
       termBytes = new BytesRef[disctinctTerms];
       for (int i = 0; i < disctinctTerms; ++i) {
         terms[i] = TestUtil.randomRealisticUnicodeString(random());
-        termBytes[i] = new BytesRef(terms[i]);
+        termBytes[i] = newBytesRef(terms[i]);
       }
     }
 
@@ -762,8 +763,8 @@ public abstract class BaseTermVectorsFormatTestCase extends BaseIndexFileFormatT
     Terms terms = getOnlyLeafReader(reader).getTermVector(0, "foo");
     TermsEnum termsEnum = terms.iterator();
     assertNotNull(termsEnum);
-    assertEquals(new BytesRef("bar"), termsEnum.next());
-    
+    assertEquals(newBytesRef("bar"), termsEnum.next());
+
     // simple use (FREQS)
     PostingsEnum postings = termsEnum.postings(null);
     assertEquals(-1, postings.docID());
@@ -843,8 +844,8 @@ public abstract class BaseTermVectorsFormatTestCase extends BaseIndexFileFormatT
     Terms terms = getOnlyLeafReader(reader).getTermVector(0, "foo");
     TermsEnum termsEnum = terms.iterator();
     assertNotNull(termsEnum);
-    assertEquals(new BytesRef("bar"), termsEnum.next());
-    
+    assertEquals(newBytesRef("bar"), termsEnum.next());
+
     // simple use (FREQS)
     PostingsEnum postings = termsEnum.postings(null);
     assertEquals(-1, postings.docID());
@@ -1022,8 +1023,8 @@ public abstract class BaseTermVectorsFormatTestCase extends BaseIndexFileFormatT
     Terms terms = getOnlyLeafReader(reader).getTermVector(0, "foo");
     TermsEnum termsEnum = terms.iterator();
     assertNotNull(termsEnum);
-    assertEquals(new BytesRef("bar"), termsEnum.next());
-    
+    assertEquals(newBytesRef("bar"), termsEnum.next());
+
     // simple usage (FREQS)
     PostingsEnum postings = termsEnum.postings(null);
     assertEquals(-1, postings.docID());
@@ -1208,8 +1209,8 @@ public abstract class BaseTermVectorsFormatTestCase extends BaseIndexFileFormatT
     Terms terms = getOnlyLeafReader(reader).getTermVector(0, "foo");
     TermsEnum termsEnum = terms.iterator();
     assertNotNull(termsEnum);
-    assertEquals(new BytesRef("bar"), termsEnum.next());
-    
+    assertEquals(newBytesRef("bar"), termsEnum.next());
+
     // simple usage (FREQS)
     PostingsEnum postings = termsEnum.postings(null);
     assertEquals(-1, postings.docID());
@@ -1380,9 +1381,9 @@ public abstract class BaseTermVectorsFormatTestCase extends BaseIndexFileFormatT
     IndexWriter iw = new IndexWriter(dir, iwc);
     Document doc = new Document();
     Token token1 = new Token("bar", 0, 3);
-    token1.setPayload(new BytesRef("pay1"));
+    token1.setPayload(newBytesRef("pay1"));
     Token token2 = new Token("bar", 4, 7);
-    token2.setPayload(new BytesRef("pay2"));
+    token2.setPayload(newBytesRef("pay2"));
     FieldType ft = new FieldType(TextField.TYPE_NOT_STORED);
     ft.setStoreTermVectors(true);
     ft.setStoreTermVectorPositions(true);
@@ -1394,8 +1395,8 @@ public abstract class BaseTermVectorsFormatTestCase extends BaseIndexFileFormatT
     Terms terms = getOnlyLeafReader(reader).getTermVector(0, "foo");
     TermsEnum termsEnum = terms.iterator();
     assertNotNull(termsEnum);
-    assertEquals(new BytesRef("bar"), termsEnum.next());
-    
+    assertEquals(newBytesRef("bar"), termsEnum.next());
+
     // sugar method (FREQS)
     PostingsEnum postings = termsEnum.postings(null);
     assertEquals(-1, postings.docID());
@@ -1438,12 +1439,16 @@ public abstract class BaseTermVectorsFormatTestCase extends BaseIndexFileFormatT
     assertEquals(-1, docsAndPositionsEnum.startOffset());
     assertEquals(-1, docsAndPositionsEnum.endOffset());
     // we don't define what it is, but if its something else, we should look into it?
-    assertTrue(docsAndPositionsEnum.getPayload() == null || new BytesRef("pay1").equals(docsAndPositionsEnum.getPayload()));
+    assertTrue(
+        docsAndPositionsEnum.getPayload() == null
+            || newBytesRef("pay1").equals(docsAndPositionsEnum.getPayload()));
     assertEquals(1, docsAndPositionsEnum.nextPosition());
     assertEquals(-1, docsAndPositionsEnum.startOffset());
     assertEquals(-1, docsAndPositionsEnum.endOffset());
     // we don't define what it is, but if its something else, we should look into it?
-    assertTrue(docsAndPositionsEnum.getPayload() == null || new BytesRef("pay2").equals(docsAndPositionsEnum.getPayload()));
+    assertTrue(
+        docsAndPositionsEnum.getPayload() == null
+            || newBytesRef("pay2").equals(docsAndPositionsEnum.getPayload()));
     assertEquals(DocIdSetIterator.NO_MORE_DOCS, docsAndPositionsEnum.nextDoc());
     
     // now reuse the positions
@@ -1455,12 +1460,16 @@ public abstract class BaseTermVectorsFormatTestCase extends BaseIndexFileFormatT
     assertEquals(-1, docsAndPositionsEnum2.startOffset());
     assertEquals(-1, docsAndPositionsEnum2.endOffset());
     // we don't define what it is, but if its something else, we should look into it?
-    assertTrue(docsAndPositionsEnum2.getPayload() == null || new BytesRef("pay1").equals(docsAndPositionsEnum2.getPayload()));
+    assertTrue(
+        docsAndPositionsEnum2.getPayload() == null
+            || newBytesRef("pay1").equals(docsAndPositionsEnum2.getPayload()));
     assertEquals(1, docsAndPositionsEnum2.nextPosition());
     assertEquals(-1, docsAndPositionsEnum2.startOffset());
     assertEquals(-1, docsAndPositionsEnum2.endOffset());
     // we don't define what it is, but if its something else, we should look into it?
-    assertTrue(docsAndPositionsEnum2.getPayload() == null || new BytesRef("pay2").equals(docsAndPositionsEnum2.getPayload()));
+    assertTrue(
+        docsAndPositionsEnum2.getPayload() == null
+            || newBytesRef("pay2").equals(docsAndPositionsEnum2.getPayload()));
     assertEquals(DocIdSetIterator.NO_MORE_DOCS, docsAndPositionsEnum2.nextDoc());
     
     // payloads
@@ -1472,11 +1481,11 @@ public abstract class BaseTermVectorsFormatTestCase extends BaseIndexFileFormatT
     assertEquals(0, docsAndPositionsEnum.nextPosition());
     assertEquals(-1, docsAndPositionsEnum.startOffset());
     assertEquals(-1, docsAndPositionsEnum.endOffset());
-    assertEquals(new BytesRef("pay1"), docsAndPositionsEnum.getPayload());
+    assertEquals(newBytesRef("pay1"), docsAndPositionsEnum.getPayload());
     assertEquals(1, docsAndPositionsEnum.nextPosition());
     assertEquals(-1, docsAndPositionsEnum.startOffset());
     assertEquals(-1, docsAndPositionsEnum.endOffset());
-    assertEquals(new BytesRef("pay2"), docsAndPositionsEnum.getPayload());
+    assertEquals(newBytesRef("pay2"), docsAndPositionsEnum.getPayload());
     assertEquals(DocIdSetIterator.NO_MORE_DOCS, docsAndPositionsEnum.nextDoc());
     // reuse
     docsAndPositionsEnum2 = termsEnum.postings(docsAndPositionsEnum, PostingsEnum.PAYLOADS);
@@ -1486,11 +1495,11 @@ public abstract class BaseTermVectorsFormatTestCase extends BaseIndexFileFormatT
     assertEquals(0, docsAndPositionsEnum2.nextPosition());
     assertEquals(-1, docsAndPositionsEnum2.startOffset());
     assertEquals(-1, docsAndPositionsEnum2.endOffset());
-    assertEquals(new BytesRef("pay1"), docsAndPositionsEnum2.getPayload());
+    assertEquals(newBytesRef("pay1"), docsAndPositionsEnum2.getPayload());
     assertEquals(1, docsAndPositionsEnum2.nextPosition());
     assertEquals(-1, docsAndPositionsEnum2.startOffset());
     assertEquals(-1, docsAndPositionsEnum2.endOffset());
-    assertEquals(new BytesRef("pay2"), docsAndPositionsEnum2.getPayload());
+    assertEquals(newBytesRef("pay2"), docsAndPositionsEnum2.getPayload());
     assertEquals(DocIdSetIterator.NO_MORE_DOCS, docsAndPositionsEnum2.nextDoc());
     
     docsAndPositionsEnum = termsEnum.postings(null, PostingsEnum.OFFSETS);
@@ -1502,12 +1511,16 @@ public abstract class BaseTermVectorsFormatTestCase extends BaseIndexFileFormatT
     assertEquals(-1, docsAndPositionsEnum.startOffset());
     assertEquals(-1, docsAndPositionsEnum.endOffset());
     // we don't define what it is, but if its something else, we should look into it?
-    assertTrue(docsAndPositionsEnum.getPayload() == null || new BytesRef("pay1").equals(docsAndPositionsEnum.getPayload()));
+    assertTrue(
+        docsAndPositionsEnum.getPayload() == null
+            || newBytesRef("pay1").equals(docsAndPositionsEnum.getPayload()));
     assertEquals(1, docsAndPositionsEnum.nextPosition());
     assertEquals(-1, docsAndPositionsEnum.startOffset());
     assertEquals(-1, docsAndPositionsEnum.endOffset());
     // we don't define what it is, but if its something else, we should look into it?
-    assertTrue(docsAndPositionsEnum.getPayload() == null || new BytesRef("pay2").equals(docsAndPositionsEnum.getPayload()));
+    assertTrue(
+        docsAndPositionsEnum.getPayload() == null
+            || newBytesRef("pay2").equals(docsAndPositionsEnum.getPayload()));
     assertEquals(DocIdSetIterator.NO_MORE_DOCS, docsAndPositionsEnum.nextDoc());
     // reuse
     docsAndPositionsEnum2 = termsEnum.postings(docsAndPositionsEnum, PostingsEnum.OFFSETS);
@@ -1518,12 +1531,16 @@ public abstract class BaseTermVectorsFormatTestCase extends BaseIndexFileFormatT
     assertEquals(-1, docsAndPositionsEnum2.startOffset());
     assertEquals(-1, docsAndPositionsEnum2.endOffset());
     // we don't define what it is, but if its something else, we should look into it?
-    assertTrue(docsAndPositionsEnum2.getPayload() == null || new BytesRef("pay1").equals(docsAndPositionsEnum2.getPayload()));
+    assertTrue(
+        docsAndPositionsEnum2.getPayload() == null
+            || newBytesRef("pay1").equals(docsAndPositionsEnum2.getPayload()));
     assertEquals(1, docsAndPositionsEnum2.nextPosition());
     assertEquals(-1, docsAndPositionsEnum2.startOffset());
     assertEquals(-1, docsAndPositionsEnum2.endOffset());
     // we don't define what it is, but if its something else, we should look into it?
-    assertTrue(docsAndPositionsEnum2.getPayload() == null || new BytesRef("pay2").equals(docsAndPositionsEnum2.getPayload()));
+    assertTrue(
+        docsAndPositionsEnum2.getPayload() == null
+            || newBytesRef("pay2").equals(docsAndPositionsEnum2.getPayload()));
     assertEquals(DocIdSetIterator.NO_MORE_DOCS, docsAndPositionsEnum2.nextDoc());
     
     docsAndPositionsEnum = termsEnum.postings(null, PostingsEnum.ALL);
@@ -1534,11 +1551,11 @@ public abstract class BaseTermVectorsFormatTestCase extends BaseIndexFileFormatT
     assertEquals(0, docsAndPositionsEnum.nextPosition());
     assertEquals(-1, docsAndPositionsEnum.startOffset());
     assertEquals(-1, docsAndPositionsEnum.endOffset());
-    assertEquals(new BytesRef("pay1"), docsAndPositionsEnum.getPayload());
+    assertEquals(newBytesRef("pay1"), docsAndPositionsEnum.getPayload());
     assertEquals(1, docsAndPositionsEnum.nextPosition());
     assertEquals(-1, docsAndPositionsEnum.startOffset());
     assertEquals(-1, docsAndPositionsEnum.endOffset());
-    assertEquals(new BytesRef("pay2"), docsAndPositionsEnum.getPayload());
+    assertEquals(newBytesRef("pay2"), docsAndPositionsEnum.getPayload());
     assertEquals(DocIdSetIterator.NO_MORE_DOCS, docsAndPositionsEnum.nextDoc());
     docsAndPositionsEnum2 = termsEnum.postings(docsAndPositionsEnum, PostingsEnum.ALL);
     assertEquals(-1, docsAndPositionsEnum2.docID());
@@ -1547,11 +1564,11 @@ public abstract class BaseTermVectorsFormatTestCase extends BaseIndexFileFormatT
     assertEquals(0, docsAndPositionsEnum2.nextPosition());
     assertEquals(-1, docsAndPositionsEnum2.startOffset());
     assertEquals(-1, docsAndPositionsEnum2.endOffset());
-    assertEquals(new BytesRef("pay1"), docsAndPositionsEnum2.getPayload());
+    assertEquals(newBytesRef("pay1"), docsAndPositionsEnum2.getPayload());
     assertEquals(1, docsAndPositionsEnum2.nextPosition());
     assertEquals(-1, docsAndPositionsEnum2.startOffset());
     assertEquals(-1, docsAndPositionsEnum2.endOffset());
-    assertEquals(new BytesRef("pay2"), docsAndPositionsEnum2.getPayload());
+    assertEquals(newBytesRef("pay2"), docsAndPositionsEnum2.getPayload());
     assertEquals(DocIdSetIterator.NO_MORE_DOCS, docsAndPositionsEnum2.nextDoc());
     
     iw.close();
@@ -1565,9 +1582,9 @@ public abstract class BaseTermVectorsFormatTestCase extends BaseIndexFileFormatT
     IndexWriter iw = new IndexWriter(dir, iwc);
     Document doc = new Document();
     Token token1 = new Token("bar", 0, 3);
-    token1.setPayload(new BytesRef("pay1"));
+    token1.setPayload(newBytesRef("pay1"));
     Token token2 = new Token("bar", 4, 7);
-    token2.setPayload(new BytesRef("pay2"));
+    token2.setPayload(newBytesRef("pay2"));
     FieldType ft = new FieldType(TextField.TYPE_NOT_STORED);
     ft.setStoreTermVectors(true);
     ft.setStoreTermVectorPositions(true);
@@ -1580,8 +1597,8 @@ public abstract class BaseTermVectorsFormatTestCase extends BaseIndexFileFormatT
     Terms terms = getOnlyLeafReader(reader).getTermVector(0, "foo");
     TermsEnum termsEnum = terms.iterator();
     assertNotNull(termsEnum);
-    assertEquals(new BytesRef("bar"), termsEnum.next());
-    
+    assertEquals(newBytesRef("bar"), termsEnum.next());
+
     // sugar method (FREQS)
     PostingsEnum postings = termsEnum.postings(null);
     assertEquals(-1, postings.docID());
@@ -1625,13 +1642,17 @@ public abstract class BaseTermVectorsFormatTestCase extends BaseIndexFileFormatT
     assertTrue(docsAndPositionsEnum.startOffset() == -1 || docsAndPositionsEnum.startOffset() == 0);
     assertTrue(docsAndPositionsEnum.endOffset() == -1 || docsAndPositionsEnum.endOffset() == 3);
     // we don't define what it is, but if its something else, we should look into it?
-    assertTrue(docsAndPositionsEnum.getPayload() == null || new BytesRef("pay1").equals(docsAndPositionsEnum.getPayload()));
+    assertTrue(
+        docsAndPositionsEnum.getPayload() == null
+            || newBytesRef("pay1").equals(docsAndPositionsEnum.getPayload()));
     assertEquals(1, docsAndPositionsEnum.nextPosition());
     // we don't define what it is, but if its something else, we should look into it?
     assertTrue(docsAndPositionsEnum.startOffset() == -1 || docsAndPositionsEnum.startOffset() == 4);
     assertTrue(docsAndPositionsEnum.endOffset() == -1 || docsAndPositionsEnum.endOffset() == 7);
     // we don't define what it is, but if its something else, we should look into it?
-    assertTrue(docsAndPositionsEnum.getPayload() == null || new BytesRef("pay2").equals(docsAndPositionsEnum.getPayload()));
+    assertTrue(
+        docsAndPositionsEnum.getPayload() == null
+            || newBytesRef("pay2").equals(docsAndPositionsEnum.getPayload()));
     assertEquals(DocIdSetIterator.NO_MORE_DOCS, docsAndPositionsEnum.nextDoc());
     
     // now reuse the positions
@@ -1644,13 +1665,17 @@ public abstract class BaseTermVectorsFormatTestCase extends BaseIndexFileFormatT
     assertTrue(docsAndPositionsEnum2.startOffset() == -1 || docsAndPositionsEnum2.startOffset() == 0);
     assertTrue(docsAndPositionsEnum2.endOffset() == -1 || docsAndPositionsEnum2.endOffset() == 3);
     // we don't define what it is, but if its something else, we should look into it?
-    assertTrue(docsAndPositionsEnum2.getPayload() == null || new BytesRef("pay1").equals(docsAndPositionsEnum2.getPayload()));
+    assertTrue(
+        docsAndPositionsEnum2.getPayload() == null
+            || newBytesRef("pay1").equals(docsAndPositionsEnum2.getPayload()));
     assertEquals(1, docsAndPositionsEnum2.nextPosition());
     // we don't define what it is, but if its something else, we should look into it?
     assertTrue(docsAndPositionsEnum2.startOffset() == -1 || docsAndPositionsEnum2.startOffset() == 4);
     assertTrue(docsAndPositionsEnum2.endOffset() == -1 || docsAndPositionsEnum2.endOffset() == 7);
     // we don't define what it is, but if its something else, we should look into it?
-    assertTrue(docsAndPositionsEnum2.getPayload() == null || new BytesRef("pay2").equals(docsAndPositionsEnum2.getPayload()));
+    assertTrue(
+        docsAndPositionsEnum2.getPayload() == null
+            || newBytesRef("pay2").equals(docsAndPositionsEnum2.getPayload()));
     assertEquals(DocIdSetIterator.NO_MORE_DOCS, docsAndPositionsEnum2.nextDoc());
     
     // payloads
@@ -1663,12 +1688,12 @@ public abstract class BaseTermVectorsFormatTestCase extends BaseIndexFileFormatT
     // we don't define what it is, but if its something else, we should look into it?
     assertTrue(docsAndPositionsEnum.startOffset() == -1 || docsAndPositionsEnum.startOffset() == 0);
     assertTrue(docsAndPositionsEnum.endOffset() == -1 || docsAndPositionsEnum.endOffset() == 3);
-    assertEquals(new BytesRef("pay1"), docsAndPositionsEnum.getPayload());
+    assertEquals(newBytesRef("pay1"), docsAndPositionsEnum.getPayload());
     assertEquals(1, docsAndPositionsEnum.nextPosition());
     // we don't define what it is, but if its something else, we should look into it?
     assertTrue(docsAndPositionsEnum.startOffset() == -1 || docsAndPositionsEnum.startOffset() == 4);
     assertTrue(docsAndPositionsEnum.endOffset() == -1 || docsAndPositionsEnum.endOffset() == 7);
-    assertEquals(new BytesRef("pay2"), docsAndPositionsEnum.getPayload());
+    assertEquals(newBytesRef("pay2"), docsAndPositionsEnum.getPayload());
     assertEquals(DocIdSetIterator.NO_MORE_DOCS, docsAndPositionsEnum.nextDoc());
     // reuse
     docsAndPositionsEnum2 = termsEnum.postings(docsAndPositionsEnum, PostingsEnum.PAYLOADS);
@@ -1679,12 +1704,12 @@ public abstract class BaseTermVectorsFormatTestCase extends BaseIndexFileFormatT
     // we don't define what it is, but if its something else, we should look into it?
     assertTrue(docsAndPositionsEnum2.startOffset() == -1 || docsAndPositionsEnum2.startOffset() == 0);
     assertTrue(docsAndPositionsEnum2.endOffset() == -1 || docsAndPositionsEnum2.endOffset() == 3);
-    assertEquals(new BytesRef("pay1"), docsAndPositionsEnum2.getPayload());
+    assertEquals(newBytesRef("pay1"), docsAndPositionsEnum2.getPayload());
     assertEquals(1, docsAndPositionsEnum2.nextPosition());
     // we don't define what it is, but if its something else, we should look into it?
     assertTrue(docsAndPositionsEnum2.startOffset() == -1 || docsAndPositionsEnum2.startOffset() == 4);
     assertTrue(docsAndPositionsEnum2.endOffset() == -1 || docsAndPositionsEnum2.endOffset() == 7);
-    assertEquals(new BytesRef("pay2"), docsAndPositionsEnum2.getPayload());
+    assertEquals(newBytesRef("pay2"), docsAndPositionsEnum2.getPayload());
     assertEquals(DocIdSetIterator.NO_MORE_DOCS, docsAndPositionsEnum2.nextDoc());
     
     docsAndPositionsEnum = termsEnum.postings(null, PostingsEnum.OFFSETS);
@@ -1696,12 +1721,16 @@ public abstract class BaseTermVectorsFormatTestCase extends BaseIndexFileFormatT
     assertEquals(0, docsAndPositionsEnum.startOffset());
     assertEquals(3, docsAndPositionsEnum.endOffset());
     // we don't define what it is, but if its something else, we should look into it?
-    assertTrue(docsAndPositionsEnum.getPayload() == null || new BytesRef("pay1").equals(docsAndPositionsEnum.getPayload()));
+    assertTrue(
+        docsAndPositionsEnum.getPayload() == null
+            || newBytesRef("pay1").equals(docsAndPositionsEnum.getPayload()));
     assertEquals(1, docsAndPositionsEnum.nextPosition());
     assertEquals(4, docsAndPositionsEnum.startOffset());
     assertEquals(7, docsAndPositionsEnum.endOffset());
     // we don't define what it is, but if its something else, we should look into it?
-    assertTrue(docsAndPositionsEnum.getPayload() == null || new BytesRef("pay2").equals(docsAndPositionsEnum.getPayload()));
+    assertTrue(
+        docsAndPositionsEnum.getPayload() == null
+            || newBytesRef("pay2").equals(docsAndPositionsEnum.getPayload()));
     assertEquals(DocIdSetIterator.NO_MORE_DOCS, docsAndPositionsEnum.nextDoc());
     // reuse
     docsAndPositionsEnum2 = termsEnum.postings(docsAndPositionsEnum, PostingsEnum.OFFSETS);
@@ -1712,12 +1741,16 @@ public abstract class BaseTermVectorsFormatTestCase extends BaseIndexFileFormatT
     assertEquals(0, docsAndPositionsEnum2.startOffset());
     assertEquals(3, docsAndPositionsEnum2.endOffset());
     // we don't define what it is, but if its something else, we should look into it?
-    assertTrue(docsAndPositionsEnum2.getPayload() == null || new BytesRef("pay1").equals(docsAndPositionsEnum2.getPayload()));
+    assertTrue(
+        docsAndPositionsEnum2.getPayload() == null
+            || newBytesRef("pay1").equals(docsAndPositionsEnum2.getPayload()));
     assertEquals(1, docsAndPositionsEnum2.nextPosition());
     assertEquals(4, docsAndPositionsEnum2.startOffset());
     assertEquals(7, docsAndPositionsEnum2.endOffset());
     // we don't define what it is, but if its something else, we should look into it?
-    assertTrue(docsAndPositionsEnum2.getPayload() == null || new BytesRef("pay2").equals(docsAndPositionsEnum2.getPayload()));
+    assertTrue(
+        docsAndPositionsEnum2.getPayload() == null
+            || newBytesRef("pay2").equals(docsAndPositionsEnum2.getPayload()));
     assertEquals(DocIdSetIterator.NO_MORE_DOCS, docsAndPositionsEnum2.nextDoc());
     
     docsAndPositionsEnum = termsEnum.postings(null, PostingsEnum.ALL);
@@ -1728,11 +1761,11 @@ public abstract class BaseTermVectorsFormatTestCase extends BaseIndexFileFormatT
     assertEquals(0, docsAndPositionsEnum.nextPosition());
     assertEquals(0, docsAndPositionsEnum.startOffset());
     assertEquals(3, docsAndPositionsEnum.endOffset());
-    assertEquals(new BytesRef("pay1"), docsAndPositionsEnum.getPayload());
+    assertEquals(newBytesRef("pay1"), docsAndPositionsEnum.getPayload());
     assertEquals(1, docsAndPositionsEnum.nextPosition());
     assertEquals(4, docsAndPositionsEnum.startOffset());
     assertEquals(7, docsAndPositionsEnum.endOffset());
-    assertEquals(new BytesRef("pay2"), docsAndPositionsEnum.getPayload());
+    assertEquals(newBytesRef("pay2"), docsAndPositionsEnum.getPayload());
     assertEquals(DocIdSetIterator.NO_MORE_DOCS, docsAndPositionsEnum.nextDoc());
     docsAndPositionsEnum2 = termsEnum.postings(docsAndPositionsEnum, PostingsEnum.ALL);
     assertEquals(-1, docsAndPositionsEnum2.docID());
@@ -1741,11 +1774,11 @@ public abstract class BaseTermVectorsFormatTestCase extends BaseIndexFileFormatT
     assertEquals(0, docsAndPositionsEnum2.nextPosition());
     assertEquals(0, docsAndPositionsEnum2.startOffset());
     assertEquals(3, docsAndPositionsEnum2.endOffset());
-    assertEquals(new BytesRef("pay1"), docsAndPositionsEnum2.getPayload());
+    assertEquals(newBytesRef("pay1"), docsAndPositionsEnum2.getPayload());
     assertEquals(1, docsAndPositionsEnum2.nextPosition());
     assertEquals(4, docsAndPositionsEnum2.startOffset());
     assertEquals(7, docsAndPositionsEnum2.endOffset());
-    assertEquals(new BytesRef("pay2"), docsAndPositionsEnum2.getPayload());
+    assertEquals(newBytesRef("pay2"), docsAndPositionsEnum2.getPayload());
     assertEquals(DocIdSetIterator.NO_MORE_DOCS, docsAndPositionsEnum2.nextDoc());
     
     iw.close();
diff --git a/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java b/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java
index e8940f9..6b6b222 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java
@@ -14,6 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 package org.apache.lucene.util;
 
 import java.io.Closeable;
@@ -30,6 +31,7 @@ import java.lang.annotation.Target;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Method;
 import java.net.URI;
+import java.nio.charset.StandardCharsets;
 import java.nio.file.FileSystem;
 import java.nio.file.NoSuchFileException;
 import java.nio.file.Path;
@@ -3022,4 +3024,86 @@ public abstract class LuceneTestCase extends Assert {
     }
     return conf;
   }
+
+  /**
+   * Creates a {@link BytesRef} holding UTF-8 bytes for the incoming String, that sometimes uses a
+   * non-zero {@code offset}, and non-zero end-padding, to tickle latent bugs that fail to look at
+   * {@code BytesRef.offset}.
+   */
+  public static BytesRef newBytesRef(String s) {
+    return newBytesRef(s.getBytes(StandardCharsets.UTF_8));
+  }
+
+  /**
+   * Creates a copy of the incoming {@link BytesRef} that sometimes uses a non-zero {@code offset},
+   * and non-zero end-padding, to tickle latent bugs that fail to look at {@code BytesRef.offset}.
+   */
+  public static BytesRef newBytesRef(BytesRef b) {
+    assert b.isValid();
+    return newBytesRef(b.bytes, b.offset, b.length);
+  }
+
+  /**
+   * Creates a random BytesRef from the incoming bytes that sometimes uses a non-zero {@code
+   * offset}, and non-zero end-padding, to tickle latent bugs that fail to look at {@code
+   * BytesRef.offset}.
+   */
+  public static BytesRef newBytesRef(byte[] b) {
+    return newBytesRef(b, 0, b.length);
+  }
+
+  /**
+   * Creates a random empty BytesRef that sometimes uses a non-zero {@code offset}, and non-zero
+   * end-padding, to tickle latent bugs that fail to look at {@code BytesRef.offset}.
+   */
+  public static BytesRef newBytesRef() {
+    return newBytesRef(new byte[0], 0, 0);
+  }
+
+  /**
+   * Creates a random empty BytesRef, with at least the requested length of bytes free, that
+   * sometimes uses a non-zero {@code offset}, and non-zero end-padding, to tickle latent bugs that
+   * fail to look at {@code BytesRef.offset}.
+   */
+  public static BytesRef newBytesRef(int byteLength) {
+    return newBytesRef(new byte[byteLength], 0, byteLength);
+  }
+
+  /**
+   * Creates a copy of the incoming bytes slice that sometimes uses a non-zero {@code offset}, and
+   * non-zero end-padding, to tickle latent bugs that fail to look at {@code BytesRef.offset}.
+   */
+  public static BytesRef newBytesRef(byte[] bytesIn, int offset, int length) {
+    // System.out.println("LTC.newBytesRef!  bytesIn.length=" + bytesIn.length + " offset=" + offset
+    // + " length=" + length);
+
+    assert bytesIn.length >= offset + length
+        : "got offset=" + offset + " length=" + length + " bytesIn.length=" + bytesIn.length;
+
+    // randomly set a non-zero offset
+    int startOffset;
+    if (random().nextBoolean()) {
+      startOffset = RandomNumbers.randomIntBetween(random(), 1, 20);
+    } else {
+      startOffset = 0;
+    }
+
+    // also randomly set an end padding:
+    int endPadding;
+    if (random().nextBoolean()) {
+      endPadding = RandomNumbers.randomIntBetween(random(), 1, 20);
+    } else {
+      endPadding = 0;
+    }
+
+    byte[] bytes = new byte[startOffset + length + endPadding];
+
+    System.arraycopy(bytesIn, offset, bytes, startOffset, length);
+    // System.out.println("LTC:  return bytes.length=" + bytes.length + " startOffset=" +
+    // startOffset + " length=" + bytesIn.length);
+
+    BytesRef it = new BytesRef(bytes, startOffset, bytesIn.length);
+    assert it.isValid();
+    return it;
+  }
 }