You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ra...@apache.org on 2015/08/27 14:24:51 UTC
[2/2] camel git commit: CAMEL-9098 camel-hystrix (WIP): Add tests for
Hystrix Endpoints.
CAMEL-9098 camel-hystrix (WIP): Add tests for Hystrix Endpoints.
Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/d8fc17c7
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/d8fc17c7
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/d8fc17c7
Branch: refs/heads/feature/camel-hystrix
Commit: d8fc17c74408ef20ded2704242b28576f49c37e2
Parents: edc0ba8
Author: Raul Kripalani <ra...@apache.org>
Authored: Thu Aug 27 13:24:39 2015 +0100
Committer: Raul Kripalani <ra...@apache.org>
Committed: Thu Aug 27 13:24:39 2015 +0100
----------------------------------------------------------------------
.../component/hystrix/AbstractHystrixTest.java | 18 ++
.../component/hystrix/HystrixEndpointTest.java | 225 +++++++++++++++++++
.../component/hystrix/HystrixProcessorTest.java | 6 -
3 files changed, 243 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/camel/blob/d8fc17c7/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/AbstractHystrixTest.java
----------------------------------------------------------------------
diff --git a/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/AbstractHystrixTest.java b/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/AbstractHystrixTest.java
index 785c764..ae76e71 100644
--- a/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/AbstractHystrixTest.java
+++ b/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/AbstractHystrixTest.java
@@ -19,9 +19,11 @@ package org.apache.camel.component.hystrix;
import com.netflix.hystrix.HystrixCommandGroupKey;
import com.netflix.hystrix.HystrixCommandKey;
import com.netflix.hystrix.HystrixObservableCommand;
+import com.netflix.hystrix.strategy.concurrency.HystrixRequestContext;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.After;
/**
* Abstract Hystrix test.
@@ -54,4 +56,20 @@ public abstract class AbstractHystrixTest extends CamelTestSupport {
hystrix = context.getComponent("hystrix", HystrixComponent.class);
}
+ /**
+ * Remove the HystrixRequestContext from the current thread, if one is present.
+ * @throws Exception
+ */
+ @After
+ public void tearDown() throws Exception {
+ super.tearDown();
+ HystrixRequestContext.setContextOnCurrentThread(null);
+ }
+
+ protected class DummyException extends RuntimeException {
+ public DummyException(String message) {
+ super(message);
+ }
+ }
+
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/camel/blob/d8fc17c7/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/HystrixEndpointTest.java
----------------------------------------------------------------------
diff --git a/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/HystrixEndpointTest.java b/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/HystrixEndpointTest.java
index ddabbb3..cb42762 100644
--- a/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/HystrixEndpointTest.java
+++ b/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/HystrixEndpointTest.java
@@ -16,7 +16,17 @@
*/
package org.apache.camel.component.hystrix;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import com.netflix.hystrix.strategy.concurrency.HystrixRequestContext;
+import org.apache.camel.CamelExecutionException;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.ExpressionBuilder;
+import org.apache.camel.util.ObjectHelper;
import org.junit.Test;
+import rx.functions.Action2;
/**
* Tests for Hystrix endpoints.
@@ -36,7 +46,222 @@ public class HystrixEndpointTest extends AbstractHystrixTest {
assertEquals("Hello World 0", template.requestBody(hystrixE, "Hello World"));
assertMockEndpointsSatisfied();
+ }
+
+ @Test
+ public void testEndpointFallbackExceptionThrown() throws Exception {
+ HystrixDelegateEndpoint hystrixE = hystrix.wrapper()
+ .forStaticEndpoint("mock:test", setter)
+ .withFallbackProcessor(fallback)
+ .build();
+ hystrixE.setCamelContext(context);
+
+ getMockEndpoint("mock:test").whenAnyExchangeReceived(new Processor() {
+ @Override
+ public void process(Exchange exchange) throws Exception {
+ throw new DummyException("Bang!");
+ }
+ });
+ getMockEndpoint("mock:test").message(0).body().isEqualTo("Hello World");
+
+ assertEquals("Hello Fallback", template.requestBody(hystrixE, "Hello World"));
+
+ }
+
+ @Test
+ public void testEndpointFallbackExceptionSet() throws Exception {
+ HystrixDelegateEndpoint hystrixE = hystrix.wrapper()
+ .forStaticEndpoint("mock:test", setter)
+ .withFallbackProcessor(fallback)
+ .build();
+ hystrixE.setCamelContext(context);
+
+ getMockEndpoint("mock:test").whenAnyExchangeReceived(new Processor() {
+ @Override
+ public void process(Exchange exchange) throws Exception {
+ exchange.setException(new DummyException("Bang!"));
+ }
+ });
+ getMockEndpoint("mock:test").message(0).body().isEqualTo("Hello World");
+
+ assertEquals("Hello Fallback", template.requestBody(hystrixE, "Hello World"));
+ }
+
+ @Test
+ public void testEndpointNoFallbackSuppressedExceptionThrown() throws Exception {
+ HystrixDelegateEndpoint hystrixE = hystrix.wrapper()
+ .forStaticEndpoint("mock:test", setter)
+ .withFallbackProcessor(fallback)
+ .suppressFallbackForExceptions(DummyException.class)
+ .build();
+ hystrixE.setCamelContext(context);
+
+ getMockEndpoint("mock:test").whenAnyExchangeReceived(new Processor() {
+ @Override
+ public void process(Exchange exchange) throws Exception {
+ throw new DummyException("Bang!");
+ }
+ });
+ getMockEndpoint("mock:test").message(0).body().isEqualTo("Hello World");
+
+ // producer template will throw the exception, as it's suppressed for fallback
+ try {
+ template.requestBody(hystrixE, "Hello World");
+ } catch (CamelExecutionException e) {
+ assertEquals(DummyException.class, ObjectHelper.getException(DummyException.class, e).getClass());
+ return;
+ }
+
+ fail("Should have thrown the exception, as fallback is suppressed");
+ }
+
+ @Test
+ public void testEndpointNoFallbackSuppressedExceptionSet() throws Exception {
+ HystrixDelegateEndpoint hystrixE = hystrix.wrapper()
+ .forStaticEndpoint("mock:test", setter)
+ .withFallbackProcessor(fallback)
+ .suppressFallbackForExceptions(DummyException.class)
+ .build();
+ hystrixE.setCamelContext(context);
+
+ getMockEndpoint("mock:test").whenAnyExchangeReceived(new Processor() {
+ @Override
+ public void process(Exchange exchange) throws Exception {
+ exchange.setException(new DummyException("Bang!"));
+ }
+ });
+ getMockEndpoint("mock:test").message(0).body().isEqualTo("Hello World");
+
+ // producer template will throw the exception, as it's suppressed for fallback
+ try {
+ template.requestBody(hystrixE, "Hello World");
+ } catch (CamelExecutionException e) {
+ assertEquals(DummyException.class, ObjectHelper.getException(DummyException.class, e).getClass());
+ return;
+ }
+
+ fail("Should have thrown the exception, as fallback is suppressed");
+ }
+
+ @Test
+ public void testEndpointWithAndWithoutCache() throws Exception {
+ HystrixDelegateEndpoint hystrixE = hystrix.wrapper()
+ .forStaticEndpoint("mock:test", setter)
+ .withCacheKey(ExpressionBuilder.bodyExpression())
+ .build();
+ hystrixE.setCamelContext(context);
+
+ getMockEndpoint("mock:test").whenAnyExchangeReceived(target);
+ getMockEndpoint("mock:test").expectedMessageCount(1);
+ getMockEndpoint("mock:test").message(0).body().isEqualTo("Hello World");
+
+ assertEquals("Hello World 0", template.requestBody(hystrixE, "Hello World"));
+ assertEquals("Hello World 0", template.requestBody(hystrixE, "Hello World"));
+
+ assertMockEndpointsSatisfied();
+
+ // now remove the cache from that endpoint, and we should receive different responses now
+ getMockEndpoint("mock:test").expectedMessageCount(3);
+
+ hystrixE = hystrix.wrapper()
+ .forStaticEndpoint("mock:test", setter)
+ .build();
+ hystrixE.setCamelContext(context);
+
+ assertEquals("Hello World 1", template.requestBody(hystrixE, "Hello World"));
+ assertEquals("Hello World 2", template.requestBody(hystrixE, "Hello World"));
+
+ assertMockEndpointsSatisfied();
+
+ }
+
+ @Test
+ public void testEndpointWithCacheAndCustomMergeFunction() throws Exception {
+ HystrixDelegateEndpoint hystrixE = hystrix.wrapper()
+ .forStaticEndpoint("mock:test", setter)
+ .withCacheKey(ExpressionBuilder.bodyExpression())
+ .withCacheMergeStrategy(new Action2<Exchange, Exchange>() {
+ @Override
+ public void call(Exchange incoming, Exchange result) {
+ incoming.getIn().setBody("MERGED: " + result.getIn().getBody(String.class));
+ }
+ })
+ .build();
+
+ hystrixE.setCamelContext(context);
+
+ getMockEndpoint("mock:test").whenAnyExchangeReceived(target);
+ getMockEndpoint("mock:test").expectedMessageCount(1);
+ getMockEndpoint("mock:test").message(0).body().isEqualTo("Hello World");
+
+ assertEquals("Hello World 0", template.requestBody(hystrixE, "Hello World"));
+ assertEquals("MERGED: Hello World 0", template.requestBody(hystrixE, "Hello World"));
+
+ assertMockEndpointsSatisfied();
+ }
+
+ @Test
+ public void testEndpointWithNoRequestPropagation() throws Exception {
+ final HystrixDelegateEndpoint hystrixE = hystrix.wrapper()
+ .forStaticEndpoint("mock:test", setter)
+ .withCacheKey(ExpressionBuilder.bodyExpression())
+ .withPropagateRequestContext(false)
+ .build();
+ hystrixE.setCamelContext(context);
+
+ getMockEndpoint("mock:test").whenAnyExchangeReceived(target);
+ getMockEndpoint("mock:test").message(0).body().isEqualTo("Hello World");
+ getMockEndpoint("mock:test").message(1).body().isEqualTo("Hello World");
+
+ final HystrixRequestContext context = HystrixRequestContext.initializeContext();
+ assertEquals("Hello World 0", template.requestBodyAndHeader(hystrixE, "Hello World",
+ HystrixComponent.HYSTRIX_REQUEST_CONTEXT_HEADER_NAME, context));
+
+ // now run the second request in a different thread with the same request context
+ // ensure that cache is not used, because request context was not propagated
+ final CountDownLatch latch = new CountDownLatch(1);
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ assertEquals("Hello World 1", template.requestBodyAndHeader(hystrixE, "Hello World",
+ HystrixComponent.HYSTRIX_REQUEST_CONTEXT_HEADER_NAME, context));
+ latch.countDown();
+ }
+ }).start();
+
+ latch.await(5, TimeUnit.SECONDS);
+ }
+
+ @Test
+ public void testEndpointWithRequestPropagation() throws Exception {
+ final HystrixDelegateEndpoint hystrixE = hystrix.wrapper()
+ .forStaticEndpoint("mock:test", setter)
+ .withCacheKey(ExpressionBuilder.bodyExpression())
+ .withPropagateRequestContext(true)
+ .build();
+ hystrixE.setCamelContext(context);
+
+ getMockEndpoint("mock:test").whenAnyExchangeReceived(target);
+ getMockEndpoint("mock:test").message(0).body().isEqualTo("Hello World");
+ getMockEndpoint("mock:test").message(1).body().isEqualTo("Hello World");
+
+ final HystrixRequestContext context = HystrixRequestContext.initializeContext();
+ assertEquals("Hello World 0", template.requestBodyAndHeader(hystrixE, "Hello World",
+ HystrixComponent.HYSTRIX_REQUEST_CONTEXT_HEADER_NAME, context));
+
+ // now run the second request in a different thread with the same request context
+ // ensure that cache IS used; response should be the same as the initial one
+ final CountDownLatch latch = new CountDownLatch(1);
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ assertEquals("Hello World 0", template.requestBodyAndHeader(hystrixE, "Hello World",
+ HystrixComponent.HYSTRIX_REQUEST_CONTEXT_HEADER_NAME, context));
+ latch.countDown();
+ }
+ }).start();
+ latch.await(5, TimeUnit.SECONDS);
}
}
http://git-wip-us.apache.org/repos/asf/camel/blob/d8fc17c7/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/HystrixProcessorTest.java
----------------------------------------------------------------------
diff --git a/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/HystrixProcessorTest.java b/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/HystrixProcessorTest.java
index 210fa14..b3d0856 100644
--- a/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/HystrixProcessorTest.java
+++ b/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/HystrixProcessorTest.java
@@ -226,10 +226,4 @@ public class HystrixProcessorTest extends AbstractHystrixTest {
assertEquals("Hello World 0", exchange.getIn().getBody());
}
- private class DummyException extends RuntimeException {
- public DummyException(String message) {
- super(message);
- }
- }
-
}