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