You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by se...@apache.org on 2013/08/03 22:21:12 UTC

svn commit: r1510064 - in /directory/buildtools/junit-addons/trunk/src: main/java/org/apache/directory/junit/tools/ test/ test/java/ test/java/org/ test/java/org/apache/ test/java/org/apache/directory/ test/java/org/apache/directory/junit/ test/java/or...

Author: seelmann
Date: Sat Aug  3 20:21:11 2013
New Revision: 1510064

URL: http://svn.apache.org/r1510064
Log:
Use Callable/Future.get() instead of Runnable/Thread.sleep()

Added:
    directory/buildtools/junit-addons/trunk/src/test/
    directory/buildtools/junit-addons/trunk/src/test/java/
    directory/buildtools/junit-addons/trunk/src/test/java/org/
    directory/buildtools/junit-addons/trunk/src/test/java/org/apache/
    directory/buildtools/junit-addons/trunk/src/test/java/org/apache/directory/
    directory/buildtools/junit-addons/trunk/src/test/java/org/apache/directory/junit/
    directory/buildtools/junit-addons/trunk/src/test/java/org/apache/directory/junit/tools/
    directory/buildtools/junit-addons/trunk/src/test/java/org/apache/directory/junit/tools/MultiThreadedMultiInvokerNotThreadsafeTest.java
    directory/buildtools/junit-addons/trunk/src/test/java/org/apache/directory/junit/tools/MultiThreadedMultiInvokerThreadsafeTest.java
Modified:
    directory/buildtools/junit-addons/trunk/src/main/java/org/apache/directory/junit/tools/MultiThreadedMultiInvoker.java

Modified: directory/buildtools/junit-addons/trunk/src/main/java/org/apache/directory/junit/tools/MultiThreadedMultiInvoker.java
URL: http://svn.apache.org/viewvc/directory/buildtools/junit-addons/trunk/src/main/java/org/apache/directory/junit/tools/MultiThreadedMultiInvoker.java?rev=1510064&r1=1510063&r2=1510064&view=diff
==============================================================================
--- directory/buildtools/junit-addons/trunk/src/main/java/org/apache/directory/junit/tools/MultiThreadedMultiInvoker.java (original)
+++ directory/buildtools/junit-addons/trunk/src/main/java/org/apache/directory/junit/tools/MultiThreadedMultiInvoker.java Sat Aug  3 20:21:11 2013
@@ -23,10 +23,10 @@ package org.apache.directory.junit.tools
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.Future;
 
 import org.junit.rules.MethodRule;
 import org.junit.runners.model.FrameworkMethod;
@@ -123,9 +123,6 @@ public class MultiThreadedMultiInvoker i
      */
     public Statement apply( final Statement base, final FrameworkMethod method, final Object target )
     {
-        final List<Throwable> throwables = Collections.synchronizedList( new ArrayList<Throwable>() );
-        final List<Runnable> runnables = new ArrayList<Runnable>();
-
         return new Statement()
         {
             @Override
@@ -138,12 +135,14 @@ public class MultiThreadedMultiInvoker i
                 }
 
                 final long start = System.currentTimeMillis();
-                final AtomicInteger counter = new AtomicInteger();
+                final List<Throwable> throwables = Collections.synchronizedList( new ArrayList<Throwable>() );
+
+                final List<Future<Void>> futures = new ArrayList<Future<Void>>();
                 for ( int threadNum = 0; threadNum < count; threadNum++ )
                 {
-                    Runnable r = new Runnable()
+                    Callable<Void> c = new Callable<Void>()
                     {
-                        public void run()
+                        public Void call() throws Exception
                         {
                             try
                             {
@@ -168,27 +167,18 @@ public class MultiThreadedMultiInvoker i
                                 }
                                 throwables.add( t );
                             }
-                            finally
-                            {
-                                counter.decrementAndGet();
-                            }
+                            return null;
                         }
                     };
 
-                    runnables.add( r );
-                    counter.incrementAndGet();
+                    Future<Void> future = pool.submit( c );
+                    futures.add( future );
                 }
 
-                for ( Runnable r : runnables )
+                for ( Future<Void> future : futures )
                 {
-                    pool.execute( r );
+                    future.get();
                 }
-                
-                while(counter.get() > 0)
-                {
-                    Thread.sleep( 1000 );
-                }
-
                 if ( !throwables.isEmpty() )
                 {
                     throw throwables.get( 0 );

Added: directory/buildtools/junit-addons/trunk/src/test/java/org/apache/directory/junit/tools/MultiThreadedMultiInvokerNotThreadsafeTest.java
URL: http://svn.apache.org/viewvc/directory/buildtools/junit-addons/trunk/src/test/java/org/apache/directory/junit/tools/MultiThreadedMultiInvokerNotThreadsafeTest.java?rev=1510064&view=auto
==============================================================================
--- directory/buildtools/junit-addons/trunk/src/test/java/org/apache/directory/junit/tools/MultiThreadedMultiInvokerNotThreadsafeTest.java (added)
+++ directory/buildtools/junit-addons/trunk/src/test/java/org/apache/directory/junit/tools/MultiThreadedMultiInvokerNotThreadsafeTest.java Sat Aug  3 20:21:11 2013
@@ -0,0 +1,128 @@
+package org.apache.directory.junit.tools;
+
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Rule;
+import org.junit.Test;
+
+
+public class MultiThreadedMultiInvokerNotThreadsafeTest
+{
+    private static final int NUM_THREADS = 1;
+    private static final int NUM_INVOCATIONS = 1000000;
+    private static final int NUM_METHODS = 10;
+
+    @Rule
+    public MultiThreadedMultiInvoker i = new MultiThreadedMultiInvoker( NUM_THREADS, NUM_INVOCATIONS );
+
+    private static long counter;
+    private static long startTime;
+
+
+    @BeforeClass
+    public static void initCounter()
+    {
+        counter = 0l;
+    }
+
+
+    @BeforeClass
+    public static void initStartTime()
+    {
+        startTime = System.currentTimeMillis();
+    }
+
+
+    @AfterClass
+    public static void checkCounter()
+    {
+        assertEquals( 1L * NUM_THREADS * NUM_INVOCATIONS * NUM_METHODS, counter );
+    }
+
+
+    @AfterClass
+    public static void checkRuntime()
+    {
+        long endTime = System.currentTimeMillis();
+        long runTime = endTime - startTime;
+        if ( runTime > 10000 )
+        {
+            fail( "Test shut run in less than 10 seconds." );
+        }
+    }
+
+
+    @Test
+    public void test0()
+    {
+        counter++;
+    }
+
+
+    @Test
+    public void test1()
+    {
+        counter++;
+    }
+
+
+    @Test
+    public void test2()
+    {
+        counter++;
+    }
+
+
+    @Test
+    public void test3()
+    {
+        counter++;
+    }
+
+
+    @Test
+    public void test4()
+    {
+        counter++;
+    }
+
+
+    @Test
+    public void test5()
+    {
+        counter++;
+    }
+
+
+    @Test
+    public void test6()
+    {
+        counter++;
+    }
+
+
+    @Test
+    public void test7()
+    {
+        counter++;
+    }
+
+
+    @Test
+    public void test8()
+    {
+        counter++;
+    }
+
+
+    @Test
+    public void test9()
+    {
+        counter++;
+    }
+
+}

Added: directory/buildtools/junit-addons/trunk/src/test/java/org/apache/directory/junit/tools/MultiThreadedMultiInvokerThreadsafeTest.java
URL: http://svn.apache.org/viewvc/directory/buildtools/junit-addons/trunk/src/test/java/org/apache/directory/junit/tools/MultiThreadedMultiInvokerThreadsafeTest.java?rev=1510064&view=auto
==============================================================================
--- directory/buildtools/junit-addons/trunk/src/test/java/org/apache/directory/junit/tools/MultiThreadedMultiInvokerThreadsafeTest.java (added)
+++ directory/buildtools/junit-addons/trunk/src/test/java/org/apache/directory/junit/tools/MultiThreadedMultiInvokerThreadsafeTest.java Sat Aug  3 20:21:11 2013
@@ -0,0 +1,130 @@
+package org.apache.directory.junit.tools;
+
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Rule;
+import org.junit.Test;
+
+
+public class MultiThreadedMultiInvokerThreadsafeTest
+{
+    private static final int NUM_THREADS = 100;
+    private static final int NUM_INVOCATIONS = 10000;
+    private static final int NUM_METHODS = 10;
+
+    @Rule
+    public MultiThreadedMultiInvoker i = new MultiThreadedMultiInvoker( NUM_THREADS, NUM_INVOCATIONS );
+
+    private static AtomicLong counter;
+    private static long startTime;
+
+
+    @BeforeClass
+    public static void initCounter()
+    {
+        counter = new AtomicLong( 0L );
+    }
+
+
+    @BeforeClass
+    public static void initStartTime()
+    {
+        startTime = System.currentTimeMillis();
+    }
+
+
+    @AfterClass
+    public static void checkCounter()
+    {
+        assertEquals( 1L * NUM_THREADS * NUM_INVOCATIONS * NUM_METHODS, counter.get() );
+    }
+
+
+    @AfterClass
+    public static void checkRuntime()
+    {
+        long endTime = System.currentTimeMillis();
+        long runTime = endTime - startTime;
+        if ( runTime > 10000 )
+        {
+            fail( "Test shut run in less than 10 seconds." );
+        }
+    }
+
+
+    @Test
+    public void test0()
+    {
+        counter.incrementAndGet();
+    }
+
+
+    @Test
+    public void test1()
+    {
+        counter.incrementAndGet();
+    }
+
+
+    @Test
+    public void test2()
+    {
+        counter.incrementAndGet();
+    }
+
+
+    @Test
+    public void test3()
+    {
+        counter.incrementAndGet();
+    }
+
+
+    @Test
+    public void test4()
+    {
+        counter.incrementAndGet();
+    }
+
+
+    @Test
+    public void test5()
+    {
+        counter.incrementAndGet();
+    }
+
+
+    @Test
+    public void test6()
+    {
+        counter.incrementAndGet();
+    }
+
+
+    @Test
+    public void test7()
+    {
+        counter.incrementAndGet();
+    }
+
+
+    @Test
+    public void test8()
+    {
+        counter.incrementAndGet();
+    }
+
+
+    @Test
+    public void test9()
+    {
+        counter.incrementAndGet();
+    }
+
+}