Hi Gary,

Gary Gregory wrote:

> For now, I've @Ignore'd
> ReflectionToStringBuilderConcurrencyTest.testCopyOnWriteArrayList()
> 
> FYI: If I reduce the DATA_SIZE from 100000 to 10000 the test
> ReflectionToStringBuilderConcurrencyTest.testLinkedList() does not always
> fail for me.

For me it seems to do (I modified the other tests to drop the @Ignore) if I 
take an object that has to do a bit more in toString:

============ %< =============
$ svn diff
Index: 
src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderConcurrencyTest.java
===================================================================
--- 
src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderConcurrencyTest.java
        
(revision 1200195)                                                              
                                                        
+++ 
src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderConcurrencyTest.java
        
(working copy)
@@ -18,7 +18,9 @@
 package org.apache.commons.lang3.builder;
 
 import java.util.ArrayList;
+import java.util.Calendar;
 import java.util.Collection;
+import java.util.ConcurrentModificationException;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.concurrent.Callable;
@@ -30,7 +32,6 @@
 
 import junit.framework.Assert;
 
-import org.junit.Ignore;
 import org.junit.Test;
 
 /**
@@ -58,33 +59,48 @@
         }
     }
 
-    private static final int DATA_SIZE = 100000;
+    private static final int DATA_SIZE = 10000;
     private static final int REPEAT = 100;
 
     @Test
-    @Ignore
-    public void testLinkedList() throws InterruptedException, 
ExecutionException {
-        this.testConcurrency(new CollectionHolder<List<Integer>>(new 
LinkedList<Integer>()));
+    public void testLinkedList() throws InterruptedException {
+        try {
+            this.testConcurrency(new CollectionHolder<List<Calendar>>(new 
LinkedList<Calendar>()));
+            Assert.fail("Thrown " + ExecutionException.class.getName() + " 
expected");
+        } catch (final ExecutionException e) {
+            Assert.assertTrue(
+                ConcurrentModificationException.class.getName() + " 
expected as cause",
+                e.getCause() instanceof ConcurrentModificationException);
+        }
     }
 
     @Test
-    @Ignore
-    public void testArrayList() throws InterruptedException, 
ExecutionException {
-        this.testConcurrency(new CollectionHolder<List<Integer>>(new 
ArrayList<Integer>()));
+    public void testArrayList() throws InterruptedException {
+        try {
+               this.testConcurrency(new 
CollectionHolder<List<Calendar>>(new ArrayList<Calendar>()));
+            Assert.fail("Thrown " + ExecutionException.class.getName() + " 
expected");
+        } catch (final ExecutionException e) {
+            Assert.assertTrue(
+                ConcurrentModificationException.class.getName() + " 
expected as cause",
+                e.getCause() instanceof ConcurrentModificationException);
+        }
     }
 
     @Test
-    @Ignore
     public void testCopyOnWriteArrayList() throws InterruptedException, 
ExecutionException {
-        this.testConcurrency(new CollectionHolder<List<Integer>>(new 
CopyOnWriteArrayList<Integer>()));
+        this.testConcurrency(new CollectionHolder<List<Calendar>>(new 
CopyOnWriteArrayList<Calendar>()));
     }
 
-    private void testConcurrency(final CollectionHolder<List<Integer>> 
holder) throws InterruptedException,
+    private void testConcurrency(final CollectionHolder<List<Calendar>> 
holder) throws InterruptedException,
             ExecutionException {
-        final List<Integer> list = holder.collection;
+        final List<Calendar> list = holder.collection;
+        final Calendar cal = Calendar.getInstance();
+        cal.clear(Calendar.MILLISECOND);
+        cal.set(2000, Calendar.JANUARY, 1, 0, 0, 0);
         // make a big array that takes a long time to toString()
         for (int i = 0; i < DATA_SIZE; i++) {
-            list.add(Integer.valueOf(i));
+            list.add((Calendar)cal.clone());
+            cal.add(Calendar.HOUR_OF_DAY, 1);
         }
         // Create a thread pool with two threads to cause the most 
contention on the underlying resource.
         final ExecutorService threadPool = Executors.newFixedThreadPool(2);
============ %< =============

I'll have to retry on a faster machine though. Drills down CopyOnWrite test 
to ~1s.

Cheers,
Jörg


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org

Reply via email to