Author: davsclaus
Date: Fri Jul  6 11:46:05 2012
New Revision: 1358142

URL: http://svn.apache.org/viewvc?rev=1358142&view=rev
Log:
CAMEL-4919: Added expectedHeaderValuesReceivedInAnyOrder to mock endpoint to 
make it easier to expect header values in random order.

Modified:
    
camel/trunk/camel-core/src/main/java/org/apache/camel/component/mock/MockEndpoint.java
    
camel/trunk/camel-core/src/test/java/org/apache/camel/component/mock/MockEndpointTest.java

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=1358142&r1=1358141&r2=1358142&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 Jul  6 11:46:05 2012
@@ -28,6 +28,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.CopyOnWriteArraySet;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
@@ -509,6 +510,46 @@ public class MockEndpoint extends Defaul
     }
 
     /**
+     * Adds an expectation that the given header values are received by this
+     * endpoint in any order
+     */
+    public void expectedHeaderValuesReceivedInAnyOrder(final String name, 
final List<?> values) {
+        expectedMessageCount(values.size());
+
+        expects(new Runnable() {
+            public void run() {
+                // these are the expected values to find
+                final Set<Object> actualHeaderValues = new 
CopyOnWriteArraySet<Object>(values);
+
+                for (int i = 0; i < getReceivedExchanges().size(); i++) {
+                    Exchange exchange = getReceivedExchange(i);
+
+                    Object actualValue = exchange.getIn().getHeader(name);
+                    for (Object expectedValue : actualHeaderValues) {
+                        actualValue = extractActualValue(exchange, 
actualValue, expectedValue);
+                        // remove any found values
+                        actualHeaderValues.remove(actualValue);
+                    }
+                }
+
+                // should be empty, as we should find all the values
+                assertTrue("Expected " + values.size() + " headers with key[" 
+ name + "], received " + (values.size() - actualHeaderValues.size())
+                        + " headers. Expected header values: " + 
actualHeaderValues, actualHeaderValues.isEmpty());
+            }
+        });
+    }
+
+    /**
+     * Adds an expectation that the given header values are received by this
+     * endpoint in any order
+     */
+    public void expectedHeaderValuesReceivedInAnyOrder(String name, Object... 
values) {
+        List<Object> valueList = new ArrayList<Object>();
+        valueList.addAll(Arrays.asList(values));
+        expectedHeaderValuesReceivedInAnyOrder(name, valueList);
+    }
+
+    /**
      * Sets an expectation that the given property name & value are received 
by this endpoint
      * <p/>
      * You can set multiple expectations for different property names.

Modified: 
camel/trunk/camel-core/src/test/java/org/apache/camel/component/mock/MockEndpointTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/mock/MockEndpointTest.java?rev=1358142&r1=1358141&r2=1358142&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/test/java/org/apache/camel/component/mock/MockEndpointTest.java
 (original)
+++ 
camel/trunk/camel-core/src/test/java/org/apache/camel/component/mock/MockEndpointTest.java
 Fri Jul  6 11:46:05 2012
@@ -91,6 +91,29 @@ public class MockEndpointTest extends Co
         resultEndpoint.assertIsSatisfied();
     }       
     
+    public void testExpectsHeadersInAnyOrder() throws Exception {
+        MockEndpoint resultEndpoint = getMockEndpoint("mock:result");
+        resultEndpoint.expectedHeaderValuesReceivedInAnyOrder("counter", 11, 
12, 13, 14, 15);
+
+        sendMessages(15, 12, 14, 13, 11);
+
+        resultEndpoint.assertIsSatisfied();
+    }
+
+    public void testExpectsHeadersInAnyOrderFail() throws Exception {
+        MockEndpoint resultEndpoint = getMockEndpoint("mock:result");
+        resultEndpoint.expectedHeaderValuesReceivedInAnyOrder("counter", 11, 
12, 7, 14, 15);
+
+        sendMessages(15, 12, 14, 13, 11);
+
+        try {
+            resultEndpoint.assertIsSatisfied();
+            fail("Should fail");
+        } catch (AssertionError e) {
+            assertEquals("mock://result Expected 5 headers with key[counter], 
received 4 headers. Expected header values: [7]", e.getMessage());
+        }
+    }
+
     public void testNoDuplicateMessagesPass() throws Exception {
         MockEndpoint resultEndpoint = getMockEndpoint("mock:result"); 
         resultEndpoint.expectsNoDuplicates(header("counter"));


Reply via email to