You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2009/06/02 11:56:56 UTC
svn commit: r780990 -
/camel/trunk/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerConcurrentTest.java
Author: davsclaus
Date: Tue Jun 2 09:56:56 2009
New Revision: 780990
URL: http://svn.apache.org/viewvc?rev=780990&view=rev
Log:
Added concurrency test.
Added:
camel/trunk/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerConcurrentTest.java (contents, props changed)
- copied, changed from r780964, camel/trunk/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlRouteTest.java
Copied: camel/trunk/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerConcurrentTest.java (from r780964, camel/trunk/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlRouteTest.java)
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerConcurrentTest.java?p2=camel/trunk/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerConcurrentTest.java&p1=camel/trunk/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlRouteTest.java&r1=780964&r2=780990&rev=780990&view=diff
==============================================================================
--- camel/trunk/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlRouteTest.java (original)
+++ camel/trunk/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerConcurrentTest.java Tue Jun 2 09:56:56 2009
@@ -16,25 +16,24 @@
*/
package org.apache.camel.component.sql;
-import java.util.ArrayList;
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 javax.sql.DataSource;
import org.apache.camel.ContextTestSupport;
-import org.apache.camel.RuntimeCamelException;
import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.mock.MockEndpoint;
-import org.springframework.dao.DataAccessException;
-import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.SingleConnectionDataSource;
/**
* @version $Revision$
*/
-public class SqlRouteTest extends ContextTestSupport {
+public class SqlProducerConcurrentTest extends ContextTestSupport {
protected String driverClass = "org.hsqldb.jdbcDriver";
protected String url = "jdbc:hsqldb:mem:camel_jdbc";
protected String user = "sa";
@@ -42,105 +41,47 @@
private DataSource ds;
private JdbcTemplate jdbcTemplate;
- public void testSimpleBody() throws Exception {
- MockEndpoint mock = getMockEndpoint("mock:result");
- mock.expectedMessageCount(1);
- template.sendBody("direct:simple", "GPL");
- mock.assertIsSatisfied();
- List received = assertIsInstanceOf(List.class, mock.getReceivedExchanges().get(0).getIn().getBody());
- Map row = assertIsInstanceOf(Map.class, received.get(0));
- assertEquals("Linux", row.get("PROJECT"));
- }
-
- public void testListBody() throws Exception {
- MockEndpoint mock = getMockEndpoint("mock:result");
- mock.expectedMessageCount(1);
- List<Object> body = new ArrayList<Object>();
- body.add("ASF");
- body.add("Camel");
- template.sendBody("direct:list", body);
- mock.assertIsSatisfied();
- List received = assertIsInstanceOf(List.class, mock.getReceivedExchanges().get(0).getIn().getBody());
- Map row = assertIsInstanceOf(Map.class, received.get(0));
- assertEquals(1, row.get("ID"));
- }
-
- public void testLowNumberOfParameter() throws Exception {
- try {
- template.sendBody("direct:list", "ASF");
- fail();
- } catch (RuntimeCamelException e) {
- // should have DataAccessException thrown
- assertTrue("Exception thrown is wrong", e.getCause() instanceof DataAccessException);
- }
+ public void testNoConcurrentProducers() throws Exception {
+ doSendMessages(1, 1);
}
- public void testHighNumberOfParameter() throws Exception {
- try {
- template.sendBody("direct:simple", new Object[] {"ASF", "Foo"});
- fail();
- } catch (RuntimeCamelException e) {
- // should have DataAccessException thrown
- assertTrue("Exception thrown is wrong", e.getCause() instanceof DataAccessException);
- }
+ public void testConcurrentProducers() throws Exception {
+ doSendMessages(10, 5);
}
-
- public void testListResult() throws Exception {
- MockEndpoint mock = getMockEndpoint("mock:result");
- mock.expectedHeaderReceived(SqlConstants.SQL_ROW_COUNT, "2");
- mock.expectedMessageCount(1);
- List<Object> body = new ArrayList<Object>();
- body.add("ASF");
- template.sendBody("direct:simple", body);
- mock.assertIsSatisfied();
- List received = assertIsInstanceOf(List.class, mock.getReceivedExchanges().get(0).getIn().getBody());
- assertEquals(2, received.size());
- Map row1 = assertIsInstanceOf(Map.class, received.get(0));
- assertEquals("Camel", row1.get("PROJECT"));
- Map row2 = assertIsInstanceOf(Map.class, received.get(1));
- assertEquals("AMQ", row2.get("PROJECT"));
- }
-
- public void testListLimitedResult() throws Exception {
- MockEndpoint mock = getMockEndpoint("mock:result");
- mock.expectedMessageCount(1);
- List<Object> body = new ArrayList<Object>();
- body.add("ASF");
- template.sendBody("direct:simpleLimited", body);
- mock.assertIsSatisfied();
- List received = assertIsInstanceOf(List.class, mock.getReceivedExchanges().get(0).getIn().getBody());
- assertEquals(1, received.size());
- Map row1 = assertIsInstanceOf(Map.class, received.get(0));
- assertEquals("Camel", row1.get("PROJECT"));
- }
-
- public void testInsert() throws Exception {
- MockEndpoint mock = getMockEndpoint("mock:result");
- mock.expectedMessageCount(1);
-
- template.sendBody("direct:insert", new Object[] {10, "test", "test"});
- mock.assertIsSatisfied();
- try {
- String projectName = (String)jdbcTemplate.queryForObject("select project from projects where id = 10", String.class);
- assertEquals("test", projectName);
- } catch (EmptyResultDataAccessException e) {
- fail("no row inserted");
+
+ private void doSendMessages(int files, int poolSize) throws Exception {
+ getMockEndpoint("mock:result").expectedMessageCount(files);
+
+ 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 {
+ int id = index % 3;
+ return template.requestBody("direct:simple", "" + id);
+ }
+ });
+ responses.put(index, out);
}
- Integer actualUpdateCount = mock.getExchanges().get(0).getIn().getHeader(SqlConstants.SQL_UPDATE_COUNT, Integer.class);
- assertEquals((Integer) 1, actualUpdateCount);
- }
+ assertMockEndpointsSatisfied();
- public void testNoBody() throws Exception {
- MockEndpoint mock = getMockEndpoint("mock:result");
- mock.expectedMessageCount(1);
- template.sendBody("direct:no-param", null);
- mock.assertIsSatisfied();
- List received = assertIsInstanceOf(List.class, mock.getReceivedExchanges().get(0).getIn().getBody());
- Map row = assertIsInstanceOf(Map.class, received.get(0));
- assertEquals("Camel", row.get("PROJECT"));
+ assertEquals(files, responses.size());
+
+ for (int i = 0; i < files; i++) {
+ List rows = (List) responses.get(i).get();
+ Map columns = (Map) rows.get(0);
+ if (i % 3 == 0) {
+ assertEquals("Camel", columns.get("PROJECT"));
+ } else if (i % 3 == 1) {
+ assertEquals("AMQ", columns.get("PROJECT"));
+ } else {
+ assertEquals("Linux", columns.get("PROJECT"));
+ }
+ }
}
-
+
protected void setUp() throws Exception {
Class.forName(driverClass);
super.setUp();
@@ -148,9 +89,9 @@
jdbcTemplate = new JdbcTemplate(ds);
jdbcTemplate.execute("create table projects (id integer primary key,"
+ "project varchar(10), license varchar(5))");
- jdbcTemplate.execute("insert into projects values (1, 'Camel', 'ASF')");
- jdbcTemplate.execute("insert into projects values (2, 'AMQ', 'ASF')");
- jdbcTemplate.execute("insert into projects values (3, 'Linux', 'GPL')");
+ jdbcTemplate.execute("insert into projects values (0, 'Camel', 'ASF')");
+ jdbcTemplate.execute("insert into projects values (1, 'AMQ', 'ASF')");
+ jdbcTemplate.execute("insert into projects values (2, 'Linux', 'GPL')");
}
protected void tearDown() throws Exception {
@@ -164,27 +105,11 @@
return new RouteBuilder() {
public void configure() {
ds = new SingleConnectionDataSource(url, user, password, true);
-
getContext().getComponent("sql", SqlComponent.class).setDataSource(ds);
- errorHandler(noErrorHandler());
-
- from("direct:simple").to("sql:select * from projects where license = # order by id")
- .to("mock:result");
-
- from("direct:list")
- .to("sql:select * from projects where license = # and project = # order by id")
- .to("mock:result");
-
- from("direct:simpleLimited")
- .to("sql:select * from projects where license = # order by id?template.maxRows=1")
- .to("mock:result");
-
- from("direct:insert").to("sql:insert into projects values (#, #, #)").to("mock:result");
-
- from("direct:no-param").to("sql:select * from projects order by id").to("mock:result");
+ from("direct:simple").to("sql:select * from projects where id = # order by id").to("mock:result");
}
};
}
-}
+}
\ No newline at end of file
Propchange: camel/trunk/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerConcurrentTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: camel/trunk/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerConcurrentTest.java
------------------------------------------------------------------------------
svn:executable = *
Propchange: camel/trunk/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerConcurrentTest.java
------------------------------------------------------------------------------
svn:keywords = Rev Date