Author: davsclaus Date: Tue Jun 2 10:26:21 2009 New Revision: 780999 URL: http://svn.apache.org/viewvc?rev=780999&view=rev Log: Added concurrency test.
Added: camel/trunk/components/camel-jpa/src/test/java/org/apache/camel/processor/jpa/JpaProducerConcurrentTest.java - copied, changed from r780964, camel/trunk/components/camel-jpa/src/test/java/org/apache/camel/processor/jpa/JpaRouteTest.java Copied: camel/trunk/components/camel-jpa/src/test/java/org/apache/camel/processor/jpa/JpaProducerConcurrentTest.java (from r780964, camel/trunk/components/camel-jpa/src/test/java/org/apache/camel/processor/jpa/JpaRouteTest.java) URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jpa/src/test/java/org/apache/camel/processor/jpa/JpaProducerConcurrentTest.java?p2=camel/trunk/components/camel-jpa/src/test/java/org/apache/camel/processor/jpa/JpaProducerConcurrentTest.java&p1=camel/trunk/components/camel-jpa/src/test/java/org/apache/camel/processor/jpa/JpaRouteTest.java&r1=780964&r2=780999&rev=780999&view=diff ============================================================================== --- camel/trunk/components/camel-jpa/src/test/java/org/apache/camel/processor/jpa/JpaRouteTest.java (original) +++ camel/trunk/components/camel-jpa/src/test/java/org/apache/camel/processor/jpa/JpaProducerConcurrentTest.java Tue Jun 2 10:26:21 2009 @@ -17,11 +17,16 @@ package org.apache.camel.processor.jpa; import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; import org.apache.camel.CamelContext; import org.apache.camel.ContextTestSupport; import org.apache.camel.builder.RouteBuilder; -import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.examples.SendEmail; import org.apache.camel.spring.SpringCamelContext; import org.apache.camel.spring.SpringRouteBuilder; @@ -37,20 +42,48 @@ /** * @version $Revision$ */ -public class JpaRouteTest extends ContextTestSupport { +public class JpaProducerConcurrentTest extends ContextTestSupport { protected static final String SELECT_ALL_STRING = "select x from " + SendEmail.class.getName() + " x"; protected ApplicationContext applicationContext; protected JpaTemplate jpaTemplate; - public void testRouteJpa() throws Exception { - MockEndpoint mock = getMockEndpoint("mock:result"); - mock.expectedMessageCount(1); + public void testNoConcurrentProducers() throws Exception { + doSendMessages(1, 1); + } + + public void testConcurrentProducers() throws Exception { + doSendMessages(10, 5); + } - template.sendBody("direct:start", new SendEmail("some...@somewhere.org")); + private void doSendMessages(int files, int poolSize) throws Exception { + getMockEndpoint("mock:result").expectedMessageCount(files); + getMockEndpoint("mock:result").assertNoDuplicates(body()); + + ExecutorService executor = Executors.newFixedThreadPool(poolSize); + Map<Integer, Future> responses = new ConcurrentHashMap(); + for (int i = 0; i < files; i++) { + final int index = i; + Future out = executor.submit(new Callable<Object>() { + public Object call() throws Exception { + template.sendBody("direct:start", new SendEmail("user" + index + "@somewhere.org")); + return null; + } + }); + responses.put(index, out); + } assertMockEndpointsSatisfied(); - assertEntityInDB(); + + assertEquals(files, responses.size()); + + // get them so they are complete + for (Future future : responses.values()) { + future.get(); + } + + // assert in the database + assertEntityInDB(files); } @Override @@ -69,12 +102,12 @@ }; } - private void assertEntityInDB() throws Exception { + private void assertEntityInDB(int number) throws Exception { jpaTemplate = (JpaTemplate)applicationContext.getBean("jpaTemplate", JpaTemplate.class); List list = jpaTemplate.find(SELECT_ALL_STRING); - assertEquals(1, list.size()); - + assertEquals(number, list.size()); + assertIsInstanceOf(SendEmail.class, list.get(0)); }