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"));