You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by no...@apache.org on 2014/03/10 14:02:57 UTC

svn commit: r1575932 - in /lucene/dev/trunk/solr/solrj/src: java/org/apache/solr/common/util/JavaBinCodec.java test-files/solrj/javabin_backcompat.bin test/org/apache/solr/common/util/TestJavaBinCodec.java

Author: noble
Date: Mon Mar 10 13:02:56 2014
New Revision: 1575932

URL: http://svn.apache.org/r1575932
Log:
SOLR-5265 Add backward compatibility tests to JavaBinCodec's format

Added:
    lucene/dev/trunk/solr/solrj/src/test-files/solrj/javabin_backcompat.bin   (with props)
Modified:
    lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/util/JavaBinCodec.java
    lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/common/util/TestJavaBinCodec.java

Modified: lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/util/JavaBinCodec.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/util/JavaBinCodec.java?rev=1575932&r1=1575931&r2=1575932&view=diff
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/util/JavaBinCodec.java (original)
+++ lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/util/JavaBinCodec.java Mon Mar 10 13:02:56 2014
@@ -510,6 +510,7 @@ public class JavaBinCodec {
   public Map.Entry<Object,Object> readMapEntry(DataInputInputStream dis) throws IOException {
     final Object key = readVal(dis);
     final Object value = readVal(dis);
+    //return new AbstractMap.SimpleImmutableEntry(key, value);
     return new Map.Entry<Object,Object>() {
 
       @Override
@@ -521,7 +522,7 @@ public class JavaBinCodec {
       public Object getValue() {
         return value;
       }
-      
+
       @Override
       public String toString() {
         return "MapEntry[" + key.toString() + ":" + value.toString() + "]";
@@ -530,7 +531,28 @@ public class JavaBinCodec {
       @Override
       public Object setValue(Object value) {
         throw new UnsupportedOperationException();
-      }};
+      }
+
+      @Override
+      public int hashCode() {
+        int result = 31;
+        result *=31 + getKey().hashCode();
+        result *=31 + getValue().hashCode();
+        return result;
+      }
+
+      @Override
+      public boolean equals(Object obj) {
+        if(this == obj) {
+          return true;
+        }
+        if(!(obj instanceof Entry)) {
+          return false;
+        }
+        Map.Entry<Object, Object> entry = (Entry<Object, Object>) obj;
+        return (this.getKey().equals(entry.getKey()) && this.getValue().equals(entry.getValue()));
+      }
+    };
   }
 
   /**

Added: lucene/dev/trunk/solr/solrj/src/test-files/solrj/javabin_backcompat.bin
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/test-files/solrj/javabin_backcompat.bin?rev=1575932&view=auto
==============================================================================
Binary file - no diff available.

Modified: lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/common/util/TestJavaBinCodec.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/common/util/TestJavaBinCodec.java?rev=1575932&r1=1575931&r2=1575932&view=diff
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/common/util/TestJavaBinCodec.java (original)
+++ lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/common/util/TestJavaBinCodec.java Mon Mar 10 13:02:56 2014
@@ -17,14 +17,34 @@ package org.apache.solr.common.util;
  * limitations under the License.
  */
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-
+import org.apache.commons.io.IOUtils;
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.TestUtil;
+import org.apache.solr.common.EnumFieldValue;
+import org.apache.solr.common.SolrDocument;
+import org.apache.solr.common.SolrDocumentList;
+import org.apache.solr.common.SolrInputDocument;
+import org.junit.Test;
+
+import java.io.BufferedOutputStream;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
 
 public class TestJavaBinCodec extends LuceneTestCase {
-  
+
+ private final String BIN_FILE_LOCATION = "./solr/solrj/src/test-files/solrj/javabin_backcompat.bin";
+
  public void testStrings() throws Exception {
     JavaBinCodec javabin = new JavaBinCodec();
     for (int i = 0; i < 10000*RANDOM_MULTIPLIER; i++) {
@@ -36,4 +56,160 @@ public class TestJavaBinCodec extends Lu
       assertEquals(s, o);
     }
   }
+
+  private List<Object> generateAllDataTypes() {
+    List<Object> types = new ArrayList<>();
+
+    types.add(null); //NULL
+    types.add(true);
+    types.add(false);
+    types.add((byte) 1);
+    types.add((short) 2);
+    types.add((double) 3);
+
+    types.add(-4);
+    types.add(4);
+    types.add(42);
+
+    types.add((long) -5);
+    types.add((long) 5);
+    types.add((long) 50);
+
+    types.add((float) 6);
+    types.add(new Date(0));
+
+    Map<Integer, Integer> map = new HashMap<>();
+    map.put(1, 2);
+    types.add(map);
+
+    SolrDocument doc = new SolrDocument();
+    doc.addField("foo", "bar");
+    types.add(doc);
+
+    SolrDocumentList solrDocs = new SolrDocumentList();
+    solrDocs.setMaxScore(1.0f);
+    solrDocs.setNumFound(1);
+    solrDocs.setStart(0);
+    solrDocs.add(0, doc);
+    types.add(solrDocs);
+
+    types.add(new byte[] {1,2,3,4,5});
+
+    List<String> list = new ArrayList<String>();
+    list.add("one");
+    //types.add(list.iterator());
+
+    types.add((byte) 15); //END
+
+    SolrInputDocument idoc = new SolrInputDocument();
+    idoc.addField("foo", "bar");
+    types.add(idoc);
+
+    SolrInputDocument parentDoc = new SolrInputDocument();
+    parentDoc.addField("foo", "bar");
+    SolrInputDocument childDoc = new SolrInputDocument();
+    childDoc.addField("foo", "bar");
+    parentDoc.addChildDocument(childDoc);
+    types.add(parentDoc);
+
+    types.add(new EnumFieldValue(1, "foo"));
+
+    types.add(map.entrySet().iterator().next()); //Map.Entry
+
+    types.add((byte) (1 << 5)); //TAG_AND_LEN
+
+    types.add("foo");
+    types.add(1);
+    types.add((long) 2);
+
+    SimpleOrderedMap simpleOrderedMap = new SimpleOrderedMap();
+    simpleOrderedMap.add("bar", "barbar");
+    types.add(simpleOrderedMap);
+
+    NamedList<String> nl = new NamedList<>();
+    nl.add("foo", "barbar");
+    types.add(nl);
+
+    return types;
+  }
+
+  @Test
+  public void testBackCompat() {
+    List iteratorAsList = null;
+    JavaBinCodec javabin = new JavaBinCodec(){
+      @Override
+      public List<Object> readIterator(DataInputInputStream fis) throws IOException {
+        return super.readIterator(fis);
+      }
+    };
+    try {
+      InputStream is = getClass().getResourceAsStream("/solrj/javabin_backcompat.bin");
+      List<Object> unmarshaledObj = (List<Object>) javabin.unmarshal(is);
+      List<Object> matchObj = generateAllDataTypes();
+
+      assertEquals(unmarshaledObj.size(), matchObj.size());
+      for(int i=0; i < unmarshaledObj.size(); i++) {
+
+        if(unmarshaledObj.get(i) instanceof byte[] && matchObj.get(i) instanceof byte[]) {
+          byte[] b1 = (byte[]) unmarshaledObj.get(i);
+          byte[] b2 = (byte[]) matchObj.get(i);
+          assertTrue(Arrays.equals(b1, b2));
+
+        } else {
+          assertEquals(unmarshaledObj.get(i), matchObj.get(i));
+        }
+
+      }
+    } catch (IOException e) {
+      fail(e.getMessage());
+    }
+
+  }
+
+  @Test
+  public void testForwardCompat() {
+    JavaBinCodec javabin = new JavaBinCodec();
+    ByteArrayOutputStream os = new ByteArrayOutputStream();
+
+    Object data = generateAllDataTypes();
+    try {
+      javabin.marshal(data, os);
+      byte[] newFormatBytes = os.toByteArray();
+
+      InputStream is = getClass().getResourceAsStream("/solrj/javabin_backcompat.bin");
+      byte[] currentFormatBytes = IOUtils.toByteArray(is);
+
+      for (int i = 1; i < currentFormatBytes.length; i++) {//ignore the first byte. It is version information
+        assertEquals(currentFormatBytes[i], newFormatBytes[i]);
+      }
+
+    } catch (IOException e) {
+      fail(e.getMessage());
+    }
+
+  }
+
+  public void genBinaryFile() {
+    JavaBinCodec javabin = new JavaBinCodec();
+    ByteArrayOutputStream os = new ByteArrayOutputStream();
+
+    Object data = generateAllDataTypes();
+    try {
+      javabin.marshal(data, os);
+      byte[] out = os.toByteArray();
+      FileOutputStream fs = new FileOutputStream(new File( BIN_FILE_LOCATION ));
+      BufferedOutputStream bos = new BufferedOutputStream(fs);
+      bos.write(out);
+      bos.close();
+    } catch (IOException e) {
+      //TODO fail test?
+    }
+
+  }
+
+  public static void main(String[] args) {
+    TestJavaBinCodec test = new TestJavaBinCodec();
+    test.genBinaryFile();
+  }
+
 }