You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by oh...@apache.org on 2013/06/01 21:59:29 UTC

svn commit: r1488582 - /commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/combined/TestCombinedConfigurationBuilder.java

Author: oheger
Date: Sat Jun  1 19:59:29 2013
New Revision: 1488582

URL: http://svn.apache.org/r1488582
Log:
Added a test case for concurrent access to CombinedConfiguration without a Synchronizer.

Modified:
    commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/combined/TestCombinedConfigurationBuilder.java

Modified: commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/combined/TestCombinedConfigurationBuilder.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/combined/TestCombinedConfigurationBuilder.java?rev=1488582&r1=1488581&r2=1488582&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/combined/TestCombinedConfigurationBuilder.java (original)
+++ commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/combined/TestCombinedConfigurationBuilder.java Sat Jun  1 19:59:29 2013
@@ -23,6 +23,7 @@ import static org.junit.Assert.assertNot
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import java.io.File;
 import java.io.IOException;
@@ -34,6 +35,7 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.CountDownLatch;
 
 import org.apache.commons.configuration.BaseHierarchicalConfiguration;
 import org.apache.commons.configuration.CombinedConfiguration;
@@ -1250,6 +1252,33 @@ public class TestCombinedConfigurationBu
     }
 
     /**
+     * Tests whether a newly created instance can be read concurrently without a
+     * special synchronizer.
+     */
+    @Test
+    public void testConcurrentReadAccessWithoutSynchronizer()
+            throws ConfigurationException
+    {
+        builder.configure(new FileBasedBuilderParametersImpl()
+                .setFile(TEST_FILE));
+        CombinedConfiguration config = builder.getConfiguration();
+        final int threadCount = 32;
+        CountDownLatch startLatch = new CountDownLatch(1);
+        ReadThread[] threads = new ReadThread[threadCount];
+        for (int i = 0; i < threadCount; i++)
+        {
+            threads[i] = new ReadThread(config, startLatch);
+            threads[i].start();
+        }
+
+        startLatch.countDown();
+        for (ReadThread t : threads)
+        {
+            t.verify();
+        }
+    }
+
+    /**
      * A test builder provider implementation for testing whether providers can
      * be defined in the definition file.
      */
@@ -1423,4 +1452,56 @@ public class TestCombinedConfigurationBu
             return builders;
         }
     }
+
+    /**
+     * A thread class for testing concurrent read access to a newly created
+     * configuration.
+     */
+    private static class ReadThread extends Thread
+    {
+        /** The configuration to access. */
+        private final CombinedConfiguration config;
+
+        /** The start latch. */
+        private final CountDownLatch startLatch;
+
+        /** The value read from the configuration. */
+        private Boolean value;
+
+        public ReadThread(CombinedConfiguration cc, CountDownLatch latch)
+        {
+            config = cc;
+            startLatch = latch;
+        }
+
+        @Override
+        public void run()
+        {
+            try
+            {
+                startLatch.await();
+                value = config.getBoolean("configuration.loaded");
+            }
+            catch (InterruptedException iex)
+            {
+                // ignore
+            }
+        }
+
+        /**
+         * Verifies that the correct value was read.
+         */
+        public void verify()
+        {
+            try
+            {
+                join();
+            }
+            catch (InterruptedException iex)
+            {
+                fail("Waiting was interrupted: " + iex);
+            }
+            assertEquals("Wrong value read", Boolean.TRUE, value);
+        }
+    }
 }