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 2011/02/11 13:32:32 UTC

svn commit: r1069776 - in /camel/trunk: camel-core/src/main/java/org/apache/camel/component/mock/ camel-core/src/main/java/org/apache/camel/impl/ camel-core/src/main/java/org/apache/camel/util/ components/camel-hawtdb/src/test/java/org/apache/camel/com...

Author: davsclaus
Date: Fri Feb 11 12:32:31 2011
New Revision: 1069776

URL: http://svn.apache.org/viewvc?rev=1069776&view=rev
Log:
CAMEL-3657: Fixed subtle test. Using volatile in mock endpoint for state, to ensure visibilty of state changes between threads.

Modified:
    camel/trunk/camel-core/src/main/java/org/apache/camel/component/mock/MockEndpoint.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultMessage.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/util/PredicateAssertHelper.java
    camel/trunk/components/camel-hawtdb/src/test/java/org/apache/camel/component/hawtdb/HawtDBAggregateRecoverDeadLetterChannelFailedTest.java
    camel/trunk/components/camel-hawtdb/src/test/resources/log4j.properties

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/mock/MockEndpoint.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/mock/MockEndpoint.java?rev=1069776&r1=1069775&r2=1069776&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/component/mock/MockEndpoint.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/mock/MockEndpoint.java Fri Feb 11 12:32:31 2011
@@ -73,28 +73,30 @@ import org.slf4j.LoggerFactory;
  */
 public class MockEndpoint extends DefaultEndpoint implements BrowsableEndpoint {
     private static final transient Logger LOG = LoggerFactory.getLogger(MockEndpoint.class);
-    private int expectedCount;
-    private int counter;
-    private Processor defaultProcessor;
-    private Map<Integer, Processor> processors;
-    private List<Exchange> receivedExchanges;
-    private List<Throwable> failures;
-    private List<Runnable> tests;
-    private CountDownLatch latch;
-    private long sleepForEmptyTest;
-    private long resultWaitTime;
-    private long resultMinimumWaitTime;
-    private long assertPeriod;
-    private int expectedMinimumCount;
-    private List<Object> expectedBodyValues;
-    private List<Object> actualBodyValues;
-    private String headerName;
-    private Object headerValue;
-    private Object actualHeader;
-    private String propertyName;
-    private Object propertyValue;
-    private Object actualProperty;
-    private Processor reporter;
+    // must be volatile so changes is visible between the thread which performs the assertions
+    // and the threads which process the exchanges when routing messages in Camel
+    private volatile int expectedCount;
+    private volatile int counter;
+    private volatile Processor defaultProcessor;
+    private volatile Map<Integer, Processor> processors;
+    private volatile List<Exchange> receivedExchanges;
+    private volatile List<Throwable> failures;
+    private volatile List<Runnable> tests;
+    private volatile CountDownLatch latch;
+    private volatile long sleepForEmptyTest;
+    private volatile long resultWaitTime;
+    private volatile long resultMinimumWaitTime;
+    private volatile long assertPeriod;
+    private volatile int expectedMinimumCount;
+    private volatile List<Object> expectedBodyValues;
+    private volatile List<Object> actualBodyValues;
+    private volatile String headerName;
+    private volatile Object headerValue;
+    private volatile Object actualHeader;
+    private volatile String propertyName;
+    private volatile Object propertyValue;
+    private volatile Object actualProperty;
+    private volatile Processor reporter;
 
     public MockEndpoint(String endpointUri, Component component) {
         super(endpointUri, component);
@@ -1004,10 +1006,15 @@ public class MockEndpoint extends Defaul
             }
         }
 
-        ++counter;
+        // let counter be 0 index-based in the logs
         if (LOG.isDebugEnabled()) {
-            LOG.debug(getEndpointUri() + " >>>> " + counter + " : " + exchange + " with body: " + actualBody);
+            String msg = getEndpointUri() + " >>>> " + counter + " : " + exchange + " with body: " + actualBody;
+            if (exchange.getIn().hasHeaders()) {
+                msg += " and headers:" + exchange.getIn().getHeaders();
+            }
+            LOG.debug(msg);
         }
+        ++counter;
 
         // record timestamp when exchange was received
         exchange.setProperty(Exchange.RECEIVED_TIMESTAMP, new Date());

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultMessage.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultMessage.java?rev=1069776&r1=1069775&r2=1069776&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultMessage.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultMessage.java Fri Feb 11 12:32:31 2011
@@ -62,7 +62,11 @@ public class DefaultMessage extends Mess
     }
 
     public Object getHeader(String name) {
-        return getHeaders().get(name);
+        if (hasHeaders()) {
+            return getHeaders().get(name);
+        } else {
+            return null;
+        }
     }
 
     public Object getHeader(String name, Object defaultValue) {
@@ -151,15 +155,6 @@ public class DefaultMessage extends Mess
         return matches;
     }
 
-    private boolean isExcludePatternMatch(String key, String... excludePatterns) {
-        for (String pattern : excludePatterns) {
-            if (EndpointHelper.matchPattern(key, pattern)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
     public Map<String, Object> getHeaders() {
         if (headers == null) {
             headers = createHeaders();
@@ -287,4 +282,14 @@ public class DefaultMessage extends Mess
     public String createExchangeId() {
         return null;
     }
+
+    private static boolean isExcludePatternMatch(String key, String... excludePatterns) {
+        for (String pattern : excludePatterns) {
+            if (EndpointHelper.matchPattern(key, pattern)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
 }

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/util/PredicateAssertHelper.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/util/PredicateAssertHelper.java?rev=1069776&r1=1069775&r2=1069776&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/util/PredicateAssertHelper.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/util/PredicateAssertHelper.java Fri Feb 11 12:32:31 2011
@@ -32,6 +32,9 @@ public final class PredicateAssertHelper
     }
 
     public static void assertMatches(Predicate predicate, String text, Exchange exchange) {
+        ObjectHelper.notNull(predicate, "predicate");
+        ObjectHelper.notNull(exchange, "exchange");
+
         if (predicate instanceof BinaryPredicate) {
             // special for binary evaluable as we can get more detailed information
             BinaryPredicate eval = (BinaryPredicate) predicate;

Modified: camel/trunk/components/camel-hawtdb/src/test/java/org/apache/camel/component/hawtdb/HawtDBAggregateRecoverDeadLetterChannelFailedTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-hawtdb/src/test/java/org/apache/camel/component/hawtdb/HawtDBAggregateRecoverDeadLetterChannelFailedTest.java?rev=1069776&r1=1069775&r2=1069776&view=diff
==============================================================================
--- camel/trunk/components/camel-hawtdb/src/test/java/org/apache/camel/component/hawtdb/HawtDBAggregateRecoverDeadLetterChannelFailedTest.java (original)
+++ camel/trunk/components/camel-hawtdb/src/test/java/org/apache/camel/component/hawtdb/HawtDBAggregateRecoverDeadLetterChannelFailedTest.java Fri Feb 11 12:32:31 2011
@@ -51,6 +51,11 @@ public class HawtDBAggregateRecoverDeadL
         getMockEndpoint("mock:aggregated").expectedMessageCount(3);
         // it should keep sending to DLC if it failed, so test for min 2 attempts
         getMockEndpoint("mock:dead").expectedMinimumMessageCount(2);
+        // all the details should be the same about redelivered and redelivered 2 times
+        getMockEndpoint("mock:dead").message(0).header(Exchange.REDELIVERED).isEqualTo(Boolean.TRUE);
+        getMockEndpoint("mock:dead").message(0).header(Exchange.REDELIVERY_COUNTER).isEqualTo(2);
+        getMockEndpoint("mock:dead").message(1).header(Exchange.REDELIVERY_COUNTER).isEqualTo(2);
+        getMockEndpoint("mock:dead").message(1).header(Exchange.REDELIVERED).isEqualTo(Boolean.TRUE);
 
         template.sendBodyAndHeader("direct:start", "A", "id", 123);
         template.sendBodyAndHeader("direct:start", "B", "id", 123);

Modified: camel/trunk/components/camel-hawtdb/src/test/resources/log4j.properties
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-hawtdb/src/test/resources/log4j.properties?rev=1069776&r1=1069775&r2=1069776&view=diff
==============================================================================
--- camel/trunk/components/camel-hawtdb/src/test/resources/log4j.properties (original)
+++ camel/trunk/components/camel-hawtdb/src/test/resources/log4j.properties Fri Feb 11 12:32:31 2011
@@ -23,6 +23,7 @@ log4j.rootLogger=INFO, file
 # uncomment the following to enable camel debugging
 #log4j.logger.org.apache.camel=DEBUG
 #log4j.logger.org.apache.camel.component.hawtdb=DEBUG
+#log4j.logger.org.apache.camel.component.mock=DEBUG
 #log4j.logger.org.apache.camel.component.hawtdb.HawtDBFile=TRACE
 
 # CONSOLE appender not used by default