You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by sc...@apache.org on 2016/12/05 20:13:20 UTC

svn commit: r1772782 [2/2] - in /uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/test/java/org/apache/uima/cas/impl: SerDesTest4.java SerDesTest6.java SerDesTstCommon.java

Added: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/test/java/org/apache/uima/cas/impl/SerDesTstCommon.java
URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/test/java/org/apache/uima/cas/impl/SerDesTstCommon.java?rev=1772782&view=auto
==============================================================================
--- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/test/java/org/apache/uima/cas/impl/SerDesTstCommon.java (added)
+++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/test/java/org/apache/uima/cas/impl/SerDesTstCommon.java Mon Dec  5 20:13:20 2016
@@ -0,0 +1,236 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.uima.cas.impl;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.util.Random;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.DoubleStream;
+import java.util.stream.IntStream;
+import java.util.stream.LongStream;
+
+import junit.framework.TestCase;
+
+/**
+ * Serializer and Deserializer testing
+ * Common code for testing
+ * 
+ * Has main method for creating resources to use in testing
+ *   will update resources in SerDes4 or 6.  If you do this by mistake, just revert those resources.
+ *   
+ * Multi-threading:  
+ * Create one instance of this class per instance of using class
+ *   ** Not one instance per "setup" call **
+ */
+public abstract class SerDesTstCommon extends TestCase {
+
+  // FIXME need to understand why includeUid is false, seems to be disabling some testing Nov 2016
+  private static final boolean includeUid = false;
+  private static final AtomicInteger aint = includeUid? new AtomicInteger(0) : null;
+  
+  /**
+   * A version of Random that can pull numbers from a stream instead
+   *   - useful for reproducing a previously generated set of random numbers
+   *   - used when running against previously generated serialized data
+   *
+   */
+  class MyRandom extends Random {
+
+    @Override
+    public int nextInt(int n) {
+      int r = usePrevData ? readNextSavedInt() : super.nextInt(n);
+      if (capture) writeSavedInt(r);
+      if (r >= n) {
+        throw new RuntimeException("Internal error - using prev value, max is " + n + ", val read was " + r);
+      }
+      return r;
+    }
+
+    @Override
+    public int nextInt() {
+      int r = usePrevData ? readNextSavedInt() : super.nextInt();
+      if (capture) writeSavedInt(r);
+      return r;
+    }
+
+    @Override
+    public long nextLong() {
+      int r = usePrevData ? readNextSavedInt() : super.nextInt();
+      if (capture) writeSavedInt(r);      
+      return r;
+    }
+
+    @Override
+    public boolean nextBoolean() {
+      int r = usePrevData ? readNextSavedInt() : super.nextInt(2);
+      if (capture) writeSavedInt(r);      
+      return r == 0;
+    }
+
+    @Override
+    public float nextFloat() {
+      int r = usePrevData ? readNextSavedInt() : super.nextInt(0x7ffff);
+      if (capture) writeSavedInt(r);
+      return Float.intBitsToFloat(r);
+    }
+
+    @Override
+    public double nextDouble() {
+      int r = usePrevData ? readNextSavedInt() : super.nextInt(0x7ffff);
+      if (capture) writeSavedInt(r);
+      return CASImpl.long2double((long) r);
+    }
+
+    @Override
+    protected int next(int bits) {
+      if (usePrevData) {
+        throw new RuntimeException("invalid - never called");
+      }
+      return super.next(bits);
+    }
+    
+  }
+  
+  // Create a random number generator to use for random seeds
+  // one per thread (one per class instance)
+  private final Random randomseed = new Random();
+  
+  { long seed = randomseed.nextLong();
+    // long seed = 1_449_257_605_347_913_923L;   // to set a specific seed
+    randomseed.setSeed(seed);  
+    System.out.format("SerDesTstCommon Initial RandomSeed: %,d%n", seed);
+  }
+  
+  /**
+   * The random number generator - used throughout.
+   * Can return a pre-computed stream of random numbers if usePrevData is true
+   * Can save the stream of random numbers if capture is true
+   * 
+   */
+  protected final Random           random      = new MyRandom();
+  { random.setSeed(randomseed.nextLong()); }
+
+  /** set to true to change FS creation to keep references to all created FS
+   * needed for testing backward compatibility with delta cas
+   * Done by adding to indexes FSs which otherwise would be lost
+   */
+  protected boolean isKeep = false;
+  
+  // saving random numbers 
+  protected BufferedReader         savedIntsStream;
+  protected OutputStreamWriter     savedIntsOutStream;
+  private int                    savedIntSeq = 0;  // useful in debug mode
+  protected boolean capture = false; // capture the serialized output
+  protected boolean                usePrevData = false;
+
+  protected boolean                doPlain     = false;
+
+  protected void writeout(ByteArrayOutputStream baos, String fname) throws IOException {
+    if (null == fname) {
+      return;
+    }
+    BufferedOutputStream fos = setupFileOut(fname);
+    fos.write(baos.toByteArray());
+    fos.close();
+  }
+
+  // read and create byte array to use as 
+  // test data for checking previously serialized
+  protected byte[] readIn(String fname) throws IOException {
+    File f = new File("src/test/resources/" + getTestRootName() + "/" + fname + ".binary");
+    int len = (int) f.length();
+    byte[] buffer = new byte[len];
+    BufferedInputStream inStream = 
+      new BufferedInputStream(
+          new FileInputStream(f));
+    int br = inStream.read(buffer);
+    if (br != len) {
+      throw new RuntimeException("Corrupted test saved ints stream");
+    }
+    inStream.close();
+    return buffer;
+  }
+
+  protected abstract String getTestRootName();
+  
+  private BufferedOutputStream setupFileOut(String fname) throws IOException {
+    if (null == fname) {
+      return null;
+    }
+    File dir = new File("src/test/resources/" + getTestRootName() + "/");
+    if (!dir.exists()) {
+      dir.mkdirs();
+    }
+    
+    System.out.println("debug out file name is " + fname);  
+    
+
+    return
+      new BufferedOutputStream(
+        new FileOutputStream(
+          new File("src/test/resources/" + getTestRootName() + "/" + fname + ".binary")));
+
+  }
+
+  protected void initWriteSavedInts() {
+    try {
+      savedIntsOutStream = new OutputStreamWriter(setupFileOut("SavedInts"));
+    } catch (IOException e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+  protected void initReadSavedInts() {
+    try {
+      savedIntsStream = new BufferedReader(new FileReader("src/test/resources/" + getTestRootName() + "/SavedInts.binary"));
+      savedIntSeq = 0;
+    } catch (IOException e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+  private void writeSavedInt(int i) {
+    try {
+      savedIntsOutStream.write(Integer.toString(i) + '\n');
+    } catch (IOException e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+   
+  private int readNextSavedInt() {
+    try {
+      String s = savedIntsStream.readLine();
+//      System.out.println("debug savedInt " + savedIntSeq++ + ", value " + s);
+      return Integer.parseInt(s);
+    } catch (IOException e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+}
\ No newline at end of file