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 2014/04/04 15:54:30 UTC

svn commit: r1584695 - /uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/internal/util/MultiThreadUtils.java

Author: schor
Date: Fri Apr  4 13:54:30 2014
New Revision: 1584695

URL: http://svn.apache.org/r1584695
Log:
[UIMA-3694] support for multi-threaded tests

Added:
    uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/internal/util/MultiThreadUtils.java

Added: uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/internal/util/MultiThreadUtils.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/internal/util/MultiThreadUtils.java?rev=1584695&view=auto
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/internal/util/MultiThreadUtils.java (added)
+++ uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/internal/util/MultiThreadUtils.java Fri Apr  4 13:54:30 2014
@@ -0,0 +1,92 @@
+/*
+ * 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.internal.util;
+
+import java.util.Random;
+
+import junit.framework.TestCase;
+
+/**
+ * Helper class for running multi-core tests.
+ * 
+ * Runs a passed-in "runnable" inside loops for repetition and for multi-threads
+ *   The threads run at the same time, and there's a "join" style wait at the end.
+ *   Any exceptions thrown by the threads are reflected back.
+ *
+ */
+public class MultiThreadUtils extends TestCase {
+
+  public final static int PROCESSORS = Runtime.getRuntime().availableProcessors();
+  
+  public static interface Run2isb {
+    public void call(int i, int r, StringBuilder sb) throws Exception;
+  }
+  
+  // needed because
+  //   this class extends TestCase (in order to have access to assertTrue, etc
+  //   this causes the junit runner to warn if there are no "test"s in this class
+  public void testDummy() {}
+  
+  public static void tstMultiThread(final String name, int numberOfThreads, int repeats, final Run2isb run2isb) throws Exception {
+    Thread[] threads = new Thread[numberOfThreads];
+
+    final Throwable[] thrown = new Throwable[1];
+    thrown[0] = null;
+    for (int r = 0; r < repeats; r++) {
+      final int finalR = r;
+      for (int i = 0; i < numberOfThreads; i++) {
+        final int finalI = i;
+        threads[i] = new Thread(new Runnable() {
+          
+          public void run() {
+            // sb is for debugging; it's passed into the runnable which can choose to print it or not
+            StringBuilder sb = new StringBuilder(80);
+            try {
+              sb.append(name).append(", thread ").append(finalI).append(' ');
+              run2isb.call(finalI, finalR, sb);
+            } catch (Throwable e) {
+              System.err.format("%s: Runnable threw exception %s%n", name, e.getMessage());
+              e.printStackTrace(System.err);
+              thrown[0] = e;
+              throw new RuntimeException(e); // silly, just causes thread to end
+            }
+          }} );
+        threads[i].setName(name + " Thread " + i);
+        threads[i].setPriority(Thread.NORM_PRIORITY - 1);
+        threads[i].start();
+      }
+      
+      for (int i = 0; i < numberOfThreads; i++) {
+        try {
+          if (thrown[0] != null) {
+            assertTrue(false);
+          }
+          threads[i].join();
+          if (thrown[0] != null) {
+            assertTrue(false);
+          }
+        } catch (InterruptedException e) {
+          e.printStackTrace();
+          assertTrue(false);
+        }
+      }
+    }   
+  }
+
+}