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 2017/06/23 13:42:17 UTC
[3/4] camel git commit: CAMEL-11333: Create a new camel-thrift RPC
component
http://git-wip-us.apache.org/repos/asf/camel/blob/2a0a9e66/components/camel-thrift/src/test/java/org/apache/camel/component/thrift/ThriftConsumerSyncTest.java
----------------------------------------------------------------------
diff --git a/components/camel-thrift/src/test/java/org/apache/camel/component/thrift/ThriftConsumerSyncTest.java b/components/camel-thrift/src/test/java/org/apache/camel/component/thrift/ThriftConsumerSyncTest.java
new file mode 100644
index 0000000..7405aa3
--- /dev/null
+++ b/components/camel-thrift/src/test/java/org/apache/camel/component/thrift/ThriftConsumerSyncTest.java
@@ -0,0 +1,118 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.thrift;
+
+import java.io.IOException;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.component.thrift.generated.Calculator;
+import org.apache.camel.component.thrift.generated.Operation;
+import org.apache.camel.component.thrift.generated.Work;
+import org.apache.camel.test.AvailablePortFinder;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.apache.thrift.protocol.TBinaryProtocol;
+import org.apache.thrift.protocol.TProtocol;
+import org.apache.thrift.transport.TFramedTransport;
+import org.apache.thrift.transport.TSocket;
+import org.apache.thrift.transport.TTransport;
+import org.apache.thrift.transport.TTransportException;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ThriftConsumerSyncTest extends CamelTestSupport {
+ private static final Logger LOG = LoggerFactory.getLogger(ThriftConsumerSyncTest.class);
+ private static final int THRIFT_TEST_PORT = AvailablePortFinder.getNextAvailable();
+ private static final int THRIFT_TEST_NUM1 = 12;
+ private static final int THRIFT_TEST_NUM2 = 13;
+ private static Calculator.Client thriftClient;
+
+ private TProtocol protocol;
+ private TTransport transport;
+
+ @Before
+ public void startThriftClient() throws IOException, TTransportException {
+ if (transport == null) {
+ LOG.info("Connecting to the Thrift server on port: {}", THRIFT_TEST_PORT);
+ transport = new TSocket("localhost", THRIFT_TEST_PORT);
+ transport.open();
+ protocol = new TBinaryProtocol(new TFramedTransport(transport));
+ thriftClient = (new Calculator.Client.Factory()).getClient(protocol);
+ }
+ }
+
+ @After
+ public void stopThriftClient() throws Exception {
+ if (transport != null) {
+ transport.close();
+ transport = null;
+ LOG.info("Connection to the Thrift server closed");
+ }
+ }
+
+ @Test
+ public void testCalculateMethodInvocation() throws Exception {
+ Work work = new Work(THRIFT_TEST_NUM1, THRIFT_TEST_NUM2, Operation.MULTIPLY);
+
+ int calculateResult = thriftClient.calculate(1, work);
+
+ MockEndpoint mockEndpoint = getMockEndpoint("mock:thrift-service");
+ mockEndpoint.expectedMessageCount(1);
+ mockEndpoint.expectedHeaderValuesReceivedInAnyOrder(ThriftConstants.THRIFT_METHOD_NAME_HEADER, "calculate");
+ mockEndpoint.assertIsSatisfied();
+
+ assertEquals(THRIFT_TEST_NUM1 * THRIFT_TEST_NUM2, calculateResult);
+ }
+
+ @Test
+ public void testEchoMethodInvocation() throws Exception {
+ Work echoResult = thriftClient.echo(new Work(THRIFT_TEST_NUM1, THRIFT_TEST_NUM2, Operation.MULTIPLY));
+
+ MockEndpoint mockEndpoint = getMockEndpoint("mock:thrift-service");
+ mockEndpoint.expectedMessageCount(1);
+ mockEndpoint.expectedHeaderValuesReceivedInAnyOrder(ThriftConstants.THRIFT_METHOD_NAME_HEADER, "echo");
+ mockEndpoint.assertIsSatisfied();
+
+ assertNotNull(echoResult);
+ assertTrue(echoResult instanceof Work);
+ assertEquals(THRIFT_TEST_NUM1, ((Work)echoResult).num1);
+ assertEquals(Operation.MULTIPLY, ((Work)echoResult).op);
+ }
+
+ @Override
+ protected RouteBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+
+ from("thrift://localhost:" + THRIFT_TEST_PORT + "/org.apache.camel.component.thrift.generated.Calculator?synchronous=true")
+ .to("mock:thrift-service").choice()
+ .when(header(ThriftConstants.THRIFT_METHOD_NAME_HEADER).isEqualTo("calculate")).setBody(simple(new Integer(THRIFT_TEST_NUM1 * THRIFT_TEST_NUM2).toString()))
+ .when(header(ThriftConstants.THRIFT_METHOD_NAME_HEADER).isEqualTo("echo")).setBody(simple("${body[0]}")).bean(new CalculatorMessageBuilder(), "echo");
+ }
+ };
+ }
+
+ public class CalculatorMessageBuilder {
+ public Work echo(Work work) {
+ return work.deepCopy();
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/2a0a9e66/components/camel-thrift/src/test/java/org/apache/camel/component/thrift/ThriftProducerAsyncTest.java
----------------------------------------------------------------------
diff --git a/components/camel-thrift/src/test/java/org/apache/camel/component/thrift/ThriftProducerAsyncTest.java b/components/camel-thrift/src/test/java/org/apache/camel/component/thrift/ThriftProducerAsyncTest.java
new file mode 100644
index 0000000..9b0953f
--- /dev/null
+++ b/components/camel-thrift/src/test/java/org/apache/camel/component/thrift/ThriftProducerAsyncTest.java
@@ -0,0 +1,288 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.thrift;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.thrift.generated.InvalidOperation;
+import org.apache.camel.component.thrift.generated.Operation;
+import org.apache.camel.component.thrift.generated.Work;
+import org.apache.camel.support.SynchronizationAdapter;
+
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ThriftProducerAsyncTest extends ThriftProducerBaseTest {
+ private static final Logger LOG = LoggerFactory.getLogger(ThriftProducerAsyncTest.class);
+
+ private Object responseBody;
+
+ @Test
+ @SuppressWarnings({"rawtypes", "unchecked"})
+ public void testCalculateMethodInvocation() throws Exception {
+ LOG.info("Thrift calculate method async test start");
+
+ List requestBody = new ArrayList();
+ final CountDownLatch latch = new CountDownLatch(1);
+
+ requestBody.add((int)1);
+ requestBody.add(new Work(THRIFT_TEST_NUM1, THRIFT_TEST_NUM2, Operation.MULTIPLY));
+
+ template.asyncCallbackSendBody("direct:thrift-calculate", requestBody, new SynchronizationAdapter() {
+
+ @Override
+ public void onComplete(Exchange exchange) {
+ responseBody = exchange.getOut().getBody();
+ latch.countDown();
+ }
+
+ @Override
+ public void onFailure(Exchange exchange) {
+ responseBody = exchange.getException();
+ latch.countDown();
+ }
+ });
+ latch.await(5, TimeUnit.SECONDS);
+
+ assertNotNull(responseBody);
+ assertTrue(responseBody instanceof Integer);
+ assertEquals(THRIFT_TEST_NUM1 * THRIFT_TEST_NUM2, responseBody);
+ }
+
+ @Test
+ @SuppressWarnings({"rawtypes", "unchecked"})
+ public void testAddMethodInvocation() throws Exception {
+ LOG.info("Thrift add method (primitive parameters only) async test start");
+
+ final CountDownLatch latch = new CountDownLatch(1);
+ List requestBody = new ArrayList();
+ responseBody = null;
+
+ requestBody.add((int)THRIFT_TEST_NUM1);
+ requestBody.add((int)THRIFT_TEST_NUM2);
+
+ template.asyncCallbackSendBody("direct:thrift-add", requestBody, new SynchronizationAdapter() {
+
+ @Override
+ public void onComplete(Exchange exchange) {
+ responseBody = exchange.getOut().getBody();
+ latch.countDown();
+ }
+
+ @Override
+ public void onFailure(Exchange exchange) {
+ responseBody = exchange.getException();
+ latch.countDown();
+ }
+ });
+ latch.await(5, TimeUnit.SECONDS);
+
+ assertNotNull(responseBody);
+ assertTrue(responseBody instanceof Integer);
+ assertEquals(THRIFT_TEST_NUM1 + THRIFT_TEST_NUM2, responseBody);
+ }
+
+ @Test
+ @SuppressWarnings({"rawtypes", "unchecked"})
+ public void testCalculateWithException() throws Exception {
+ LOG.info("Thrift calculate method with business exception async test start");
+
+ final CountDownLatch latch = new CountDownLatch(1);
+ List requestBody = new ArrayList();
+
+ requestBody.add((int)1);
+ requestBody.add(new Work(THRIFT_TEST_NUM1, 0, Operation.DIVIDE));
+
+ template.asyncCallbackSendBody("direct:thrift-calculate", requestBody, new SynchronizationAdapter() {
+
+ @Override
+ public void onComplete(Exchange exchange) {
+ latch.countDown();
+ }
+
+ @Override
+ public void onFailure(Exchange exchange) {
+ responseBody = exchange.getException();
+ latch.countDown();
+ }
+ });
+ latch.await(5, TimeUnit.SECONDS);
+
+ assertTrue("Get an InvalidOperation exception", responseBody instanceof InvalidOperation);
+
+ }
+
+ @Test
+ public void testVoidMethodInvocation() throws Exception {
+ LOG.info("Thrift method with empty parameters and void output async test start");
+
+ final CountDownLatch latch = new CountDownLatch(1);
+ final Object requestBody = null;
+
+ responseBody = new Object();
+ template.asyncCallbackSendBody("direct:thrift-ping", requestBody, new SynchronizationAdapter() {
+
+ @Override
+ public void onComplete(Exchange exchange) {
+ responseBody = exchange.getOut().getBody();
+ latch.countDown();
+ }
+
+ @Override
+ public void onFailure(Exchange exchange) {
+ responseBody = exchange.getException();
+ latch.countDown();
+ }
+ });
+ latch.await(5, TimeUnit.SECONDS);
+
+ assertNull(responseBody);
+ }
+
+ @Test
+ public void testOneWayMethodInvocation() throws Exception {
+ LOG.info("Thrift one-way method async test start");
+
+ final CountDownLatch latch = new CountDownLatch(1);
+ final Object requestBody = null;
+
+ responseBody = new Object();
+ template.asyncCallbackSendBody("direct:thrift-zip", requestBody, new SynchronizationAdapter() {
+
+ @Override
+ public void onComplete(Exchange exchange) {
+ responseBody = exchange.getOut().getBody();
+ latch.countDown();
+ }
+
+ @Override
+ public void onFailure(Exchange exchange) {
+ responseBody = exchange.getException();
+ latch.countDown();
+ }
+ });
+ latch.await(5, TimeUnit.SECONDS);
+
+ assertNull(responseBody);
+ }
+
+ @Test
+ @SuppressWarnings({"rawtypes", "unchecked"})
+ public void testAllTypesMethodInvocation() throws Exception {
+ LOG.info("Thrift method with all possile types async test start");
+
+ final CountDownLatch latch = new CountDownLatch(1);
+ List requestBody = new ArrayList();
+
+ requestBody.add((boolean)true);
+ requestBody.add((byte)THRIFT_TEST_NUM1);
+ requestBody.add((short)THRIFT_TEST_NUM1);
+ requestBody.add((int)THRIFT_TEST_NUM1);
+ requestBody.add((long)THRIFT_TEST_NUM1);
+ requestBody.add((double)THRIFT_TEST_NUM1);
+ requestBody.add("empty");
+ requestBody.add(ByteBuffer.allocate(10));
+ requestBody.add(new Work(THRIFT_TEST_NUM1, THRIFT_TEST_NUM2, Operation.MULTIPLY));
+ requestBody.add(new ArrayList<Integer>());
+ requestBody.add(new HashSet<String>());
+ requestBody.add(new HashMap<String, Long>());
+
+ responseBody = new Object();
+ template.asyncCallbackSendBody("direct:thrift-alltypes", requestBody, new SynchronizationAdapter() {
+
+ @Override
+ public void onComplete(Exchange exchange) {
+ responseBody = exchange.getOut().getBody();
+ latch.countDown();
+ }
+
+ @Override
+ public void onFailure(Exchange exchange) {
+ responseBody = exchange.getException();
+ latch.countDown();
+ }
+ });
+ latch.await(5, TimeUnit.SECONDS);
+
+ assertNotNull(responseBody);
+ assertTrue(responseBody instanceof Integer);
+ assertEquals(1, responseBody);
+ }
+
+ @Test
+ @SuppressWarnings({"rawtypes", "unchecked"})
+ public void testEchoMethodInvocation() throws Exception {
+ LOG.info("Thrift echo method (return output as pass input parameter) async test start");
+
+ final CountDownLatch latch = new CountDownLatch(1);
+ List requestBody = new ArrayList();
+
+ requestBody.add(new Work(THRIFT_TEST_NUM1, THRIFT_TEST_NUM2, Operation.MULTIPLY));
+
+ responseBody = new Object();
+ template.asyncCallbackSendBody("direct:thrift-echo", requestBody, new SynchronizationAdapter() {
+
+ @Override
+ public void onComplete(Exchange exchange) {
+ responseBody = exchange.getOut().getBody();
+ latch.countDown();
+ }
+
+ @Override
+ public void onFailure(Exchange exchange) {
+ responseBody = exchange.getException();
+ latch.countDown();
+ }
+ });
+ latch.await(5, TimeUnit.SECONDS);
+
+ assertNotNull(responseBody);
+ assertTrue(responseBody instanceof Work);
+ assertEquals(THRIFT_TEST_NUM1, ((Work)responseBody).num1);
+ assertEquals(Operation.MULTIPLY, ((Work)responseBody).op);
+ }
+
+ @Override
+ protected RouteBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("direct:thrift-calculate")
+ .to("thrift://localhost:" + THRIFT_TEST_PORT + "/org.apache.camel.component.thrift.generated.Calculator?method=calculate");
+ from("direct:thrift-add")
+ .to("thrift://localhost:" + THRIFT_TEST_PORT + "/org.apache.camel.component.thrift.generated.Calculator?method=add");
+ from("direct:thrift-ping")
+ .to("thrift://localhost:" + THRIFT_TEST_PORT + "/org.apache.camel.component.thrift.generated.Calculator?method=ping");
+ from("direct:thrift-zip")
+ .to("thrift://localhost:" + THRIFT_TEST_PORT + "/org.apache.camel.component.thrift.generated.Calculator?method=zip");
+ from("direct:thrift-alltypes")
+ .to("thrift://localhost:" + THRIFT_TEST_PORT + "/org.apache.camel.component.thrift.generated.Calculator?method=alltypes");
+ from("direct:thrift-echo")
+ .to("thrift://localhost:" + THRIFT_TEST_PORT + "/org.apache.camel.component.thrift.generated.Calculator?method=echo");
+ }
+ };
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/2a0a9e66/components/camel-thrift/src/test/java/org/apache/camel/component/thrift/ThriftProducerBaseTest.java
----------------------------------------------------------------------
diff --git a/components/camel-thrift/src/test/java/org/apache/camel/component/thrift/ThriftProducerBaseTest.java b/components/camel-thrift/src/test/java/org/apache/camel/component/thrift/ThriftProducerBaseTest.java
new file mode 100644
index 0000000..b0e3228
--- /dev/null
+++ b/components/camel-thrift/src/test/java/org/apache/camel/component/thrift/ThriftProducerBaseTest.java
@@ -0,0 +1,204 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.thrift;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.camel.component.thrift.generated.Calculator;
+import org.apache.camel.component.thrift.generated.InvalidOperation;
+import org.apache.camel.component.thrift.generated.Work;
+import org.apache.camel.test.AvailablePortFinder;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.apache.thrift.TException;
+import org.apache.thrift.async.AsyncMethodCallback;
+import org.apache.thrift.server.THsHaServer;
+import org.apache.thrift.server.THsHaServer.Args;
+import org.apache.thrift.server.TServer;
+import org.apache.thrift.transport.TNonblockingServerSocket;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ThriftProducerBaseTest extends CamelTestSupport {
+ protected static final int THRIFT_TEST_PORT = AvailablePortFinder.getNextAvailable();
+ protected static final int THRIFT_TEST_NUM1 = 12;
+ protected static final int THRIFT_TEST_NUM2 = 13;
+
+ private static final Logger LOG = LoggerFactory.getLogger(ThriftProducerBaseTest.class);
+
+ private static TNonblockingServerSocket serverTransport;
+ private static TServer server;
+ @SuppressWarnings({"rawtypes"})
+ private static Calculator.Processor processor;
+
+ @BeforeClass
+ @SuppressWarnings({"unchecked", "rawtypes"})
+ public static void startThriftServer() throws Exception {
+ processor = new Calculator.Processor(new CalculatorSyncServerImpl());
+ serverTransport = new TNonblockingServerSocket(THRIFT_TEST_PORT);
+ server = new THsHaServer(new Args(serverTransport).processor(processor));
+ Runnable simple = new Runnable() {
+ public void run() {
+ LOG.info("Thrift server started on port: {}", THRIFT_TEST_PORT);
+ server.serve();
+ }
+ };
+ new Thread(simple).start();
+ }
+
+ @AfterClass
+ public static void stopThriftServer() throws IOException {
+ if (server != null) {
+ server.stop();
+ serverTransport.close();
+ LOG.info("Thrift server stoped");
+ }
+ }
+
+ /**
+ * Test Thrift Calculator blocking server implementation
+ */
+ public static class CalculatorSyncServerImpl implements Calculator.Iface {
+
+ @Override
+ public void ping() throws TException {
+ }
+
+ @Override
+ public int add(int num1, int num2) throws TException {
+ return num1 + num2;
+ }
+
+ @Override
+ public int calculate(int logId, Work work) throws InvalidOperation, TException {
+ int val = 0;
+ switch (work.op) {
+ case ADD:
+ val = work.num1 + work.num2;
+ break;
+ case SUBTRACT:
+ val = work.num1 - work.num2;
+ break;
+ case MULTIPLY:
+ val = work.num1 * work.num2;
+ break;
+ case DIVIDE:
+ if (work.num2 == 0) {
+ InvalidOperation io = new InvalidOperation();
+ io.whatOp = work.op.getValue();
+ io.why = "Cannot divide by 0";
+ throw io;
+ }
+ val = work.num1 / work.num2;
+ break;
+ default:
+ InvalidOperation io = new InvalidOperation();
+ io.whatOp = work.op.getValue();
+ io.why = "Unknown operation";
+ throw io;
+ }
+
+ return val;
+ }
+
+ @Override
+ public void zip() throws TException {
+ }
+
+ @Override
+ public Work echo(Work w) throws TException {
+ return w.deepCopy();
+ }
+
+ @Override
+ public int alltypes(boolean v1, byte v2, short v3, int v4, long v5, double v6, String v7, ByteBuffer v8, Work v9, List<Integer> v10, Set<String> v11, Map<String, Long> v12)
+ throws TException {
+ return 1;
+ }
+ }
+
+ /**
+ * Test Thrift Calculator nonblocking server implementation
+ */
+ public static class CalculatorAsyncServerImpl implements Calculator.AsyncIface {
+
+ @Override
+ @SuppressWarnings({"rawtypes", "unchecked"})
+ public void ping(AsyncMethodCallback resultHandler) throws TException {
+ resultHandler.onComplete(new Object());
+ }
+
+ @Override
+ public void add(int num1, int num2, AsyncMethodCallback<Integer> resultHandler) throws TException {
+ resultHandler.onComplete(new Integer(num1 + num2));
+ }
+
+ @Override
+ public void calculate(int logid, Work work, AsyncMethodCallback<Integer> resultHandler) throws TException {
+ int val = 0;
+ switch (work.op) {
+ case ADD:
+ val = work.num1 + work.num2;
+ break;
+ case SUBTRACT:
+ val = work.num1 - work.num2;
+ break;
+ case MULTIPLY:
+ val = work.num1 * work.num2;
+ break;
+ case DIVIDE:
+ if (work.num2 == 0) {
+ InvalidOperation io = new InvalidOperation();
+ io.whatOp = work.op.getValue();
+ io.why = "Cannot divide by 0";
+ resultHandler.onError(io);
+ }
+ val = work.num1 / work.num2;
+ break;
+ default:
+ InvalidOperation io = new InvalidOperation();
+ io.whatOp = work.op.getValue();
+ io.why = "Unknown operation";
+ resultHandler.onError(io);
+ }
+ resultHandler.onComplete(val);
+ }
+
+ @Override
+ @SuppressWarnings({"rawtypes", "unchecked"})
+ public void zip(AsyncMethodCallback resultHandler) throws TException {
+ resultHandler.onComplete(new Object());
+ }
+
+ @Override
+ public void echo(Work w, AsyncMethodCallback<Work> resultHandler) throws TException {
+ resultHandler.onComplete(w.deepCopy());
+ }
+
+ @Override
+ public void alltypes(boolean v1, byte v2, short v3, int v4, long v5, double v6, String v7, ByteBuffer v8, Work v9, List<Integer> v10, Set<String> v11,
+ Map<String, Long> v12, AsyncMethodCallback<Integer> resultHandler)
+ throws TException {
+ resultHandler.onComplete(new Integer(1));
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/2a0a9e66/components/camel-thrift/src/test/java/org/apache/camel/component/thrift/ThriftProducerSyncTest.java
----------------------------------------------------------------------
diff --git a/components/camel-thrift/src/test/java/org/apache/camel/component/thrift/ThriftProducerSyncTest.java b/components/camel-thrift/src/test/java/org/apache/camel/component/thrift/ThriftProducerSyncTest.java
new file mode 100644
index 0000000..536f45d
--- /dev/null
+++ b/components/camel-thrift/src/test/java/org/apache/camel/component/thrift/ThriftProducerSyncTest.java
@@ -0,0 +1,173 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.thrift;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+
+import org.apache.camel.CamelExecutionException;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.thrift.generated.InvalidOperation;
+import org.apache.camel.component.thrift.generated.Operation;
+import org.apache.camel.component.thrift.generated.Work;
+
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ThriftProducerSyncTest extends ThriftProducerBaseTest {
+ private static final Logger LOG = LoggerFactory.getLogger(ThriftProducerSyncTest.class);
+
+ @Test
+ @SuppressWarnings({"rawtypes", "unchecked"})
+ public void testCalculateMethodInvocation() throws Exception {
+ LOG.info("Thrift calculate method sync test start");
+
+ List requestBody = new ArrayList();
+
+ requestBody.add((int)1);
+ requestBody.add(new Work(THRIFT_TEST_NUM1, THRIFT_TEST_NUM2, Operation.MULTIPLY));
+
+ Object responseBody = template.requestBody("direct:thrift-calculate", requestBody);
+
+ assertNotNull(responseBody);
+ assertTrue(responseBody instanceof Integer);
+ assertEquals(THRIFT_TEST_NUM1 * THRIFT_TEST_NUM2, responseBody);
+ }
+
+ @Test
+ @SuppressWarnings({"rawtypes", "unchecked"})
+ public void testAddMethodInvocation() throws Exception {
+ LOG.info("Thrift add method (primitive parameters only) sync test start");
+
+ List requestBody = new ArrayList();
+
+ requestBody.add((int)THRIFT_TEST_NUM1);
+ requestBody.add((int)THRIFT_TEST_NUM2);
+
+ Object responseBody = template.requestBody("direct:thrift-add", requestBody);
+
+ assertNotNull(responseBody);
+ assertTrue(responseBody instanceof Integer);
+ assertEquals(THRIFT_TEST_NUM1 + THRIFT_TEST_NUM2, responseBody);
+ }
+
+ @Test
+ @SuppressWarnings({"rawtypes", "unchecked"})
+ public void testCalculateWithException() throws Exception {
+ LOG.info("Thrift calculate method with business exception sync test start");
+
+ List requestBody = new ArrayList();
+
+ requestBody.add((int)1);
+ requestBody.add(new Work(THRIFT_TEST_NUM1, 0, Operation.DIVIDE));
+
+ try {
+ template.requestBody("direct:thrift-calculate", requestBody);
+ fail("Expect the exception here");
+ } catch (Exception ex) {
+ assertTrue("Expect CamelExecutionException", ex instanceof CamelExecutionException);
+ assertTrue("Get an InvalidOperation exception", ex.getCause() instanceof InvalidOperation);
+ }
+ }
+
+ @Test
+ public void testVoidMethodInvocation() throws Exception {
+ LOG.info("Thrift method with empty parameters and void output sync test start");
+
+ Object requestBody = null;
+ Object responseBody = template.requestBody("direct:thrift-ping", requestBody);
+ assertNull(responseBody);
+ }
+
+ @Test
+ public void testOneWayMethodInvocation() throws Exception {
+ LOG.info("Thrift one-way method sync test start");
+
+ Object requestBody = null;
+ Object responseBody = template.requestBody("direct:thrift-zip", requestBody);
+ assertNull(responseBody);
+ }
+
+ @Test
+ @SuppressWarnings({"rawtypes", "unchecked"})
+ public void testAllTypesMethodInvocation() throws Exception {
+ LOG.info("Thrift method with all possile types sync test start");
+
+ List requestBody = new ArrayList();
+
+ requestBody.add((boolean)true);
+ requestBody.add((byte)THRIFT_TEST_NUM1);
+ requestBody.add((short)THRIFT_TEST_NUM1);
+ requestBody.add((int)THRIFT_TEST_NUM1);
+ requestBody.add((long)THRIFT_TEST_NUM1);
+ requestBody.add((double)THRIFT_TEST_NUM1);
+ requestBody.add("empty");
+ requestBody.add(ByteBuffer.allocate(10));
+ requestBody.add(new Work(THRIFT_TEST_NUM1, THRIFT_TEST_NUM2, Operation.MULTIPLY));
+ requestBody.add(new ArrayList<Integer>());
+ requestBody.add(new HashSet<String>());
+ requestBody.add(new HashMap<String, Long>());
+
+ Object responseBody = template.requestBody("direct:thrift-alltypes", requestBody);
+
+ assertNotNull(responseBody);
+ assertTrue(responseBody instanceof Integer);
+ assertEquals(1, responseBody);
+ }
+
+ @Test
+ @SuppressWarnings({"rawtypes", "unchecked"})
+ public void testEchoMethodInvocation() throws Exception {
+ LOG.info("Thrift echo method (return output as pass input parameter) sync test start");
+
+ List requestBody = new ArrayList();
+
+ requestBody.add(new Work(THRIFT_TEST_NUM1, THRIFT_TEST_NUM2, Operation.MULTIPLY));
+
+ Object responseBody = template.requestBody("direct:thrift-echo", requestBody);
+
+ assertNotNull(responseBody);
+ assertTrue(responseBody instanceof Work);
+ assertEquals(THRIFT_TEST_NUM1, ((Work)responseBody).num1);
+ assertEquals(Operation.MULTIPLY, ((Work)responseBody).op);
+ }
+
+ @Override
+ protected RouteBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("direct:thrift-calculate")
+ .to("thrift://localhost:" + THRIFT_TEST_PORT + "/org.apache.camel.component.thrift.generated.Calculator?method=calculate&synchronous=true");
+ from("direct:thrift-add")
+ .to("thrift://localhost:" + THRIFT_TEST_PORT + "/org.apache.camel.component.thrift.generated.Calculator?method=add&synchronous=true");
+ from("direct:thrift-ping")
+ .to("thrift://localhost:" + THRIFT_TEST_PORT + "/org.apache.camel.component.thrift.generated.Calculator?method=ping&synchronous=true");
+ from("direct:thrift-zip")
+ .to("thrift://localhost:" + THRIFT_TEST_PORT + "/org.apache.camel.component.thrift.generated.Calculator?method=zip&synchronous=true");
+ from("direct:thrift-alltypes")
+ .to("thrift://localhost:" + THRIFT_TEST_PORT + "/org.apache.camel.component.thrift.generated.Calculator?method=alltypes&synchronous=true");
+ from("direct:thrift-echo")
+ .to("thrift://localhost:" + THRIFT_TEST_PORT + "/org.apache.camel.component.thrift.generated.Calculator?method=echo&synchronous=true");
+ }
+ };
+ }
+}