create new matchers to allow verifying sub-values within the source and target values of the Attach frame
Project: http://git-wip-us.apache.org/repos/asf/qpid-jms/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-jms/commit/a40f0276 Tree: http://git-wip-us.apache.org/repos/asf/qpid-jms/tree/a40f0276 Diff: http://git-wip-us.apache.org/repos/asf/qpid-jms/diff/a40f0276 Branch: refs/heads/master Commit: a40f027657c88b3ef5f77a021a6aa37e9b2a3da6 Parents: 3aa6ff7 Author: Robert Gemmell <rob...@apache.org> Authored: Mon Oct 27 13:56:13 2014 +0000 Committer: Robert Gemmell <rob...@apache.org> Committed: Mon Oct 27 13:56:13 2014 +0000 ---------------------------------------------------------------------- .../AbstractFieldAndDescriptorMatcher.java | 15 +- .../testpeer/matchers/CoordinatorMatcher.java | 151 ++++++++ .../test/testpeer/matchers/SourceMatcher.java | 381 +++++++++++++++++++ .../test/testpeer/matchers/TargetMatcher.java | 289 ++++++++++++++ .../testpeer/matchers/generate-matchers.xsl | 168 +++++++- 5 files changed, 992 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/a40f0276/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/AbstractFieldAndDescriptorMatcher.java ---------------------------------------------------------------------- diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/AbstractFieldAndDescriptorMatcher.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/AbstractFieldAndDescriptorMatcher.java index 4f9dbb7..cf88ddd 100644 --- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/AbstractFieldAndDescriptorMatcher.java +++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/AbstractFieldAndDescriptorMatcher.java @@ -27,19 +27,19 @@ public abstract class AbstractFieldAndDescriptorMatcher { this.fieldMatchers = fieldMatchers; } - protected UnsignedLong getNumericDescriptor() { + public UnsignedLong getNumericDescriptor() { return numericDescriptor; } - protected Symbol getSymbolicDescriptor() { + public Symbol getSymbolicDescriptor() { return symbolicDescriptor; } - protected boolean descriptorMatches(Object descriptor) { + public boolean descriptorMatches(Object descriptor) { return numericDescriptor.equals(descriptor) || symbolicDescriptor.equals(descriptor); } - protected Map<Enum<?>, Matcher<?>> getMatchers() { + public Map<Enum<?>, Matcher<?>> getMatchers() { return fieldMatchers; } @@ -52,7 +52,12 @@ public abstract class AbstractFieldAndDescriptorMatcher { return receivedFields; } - protected void verifyFields(List<Object> described) { + /** + * Verifies the fields of the provided list against any matchers registered. + * @param described the list of fields from the described type. + * @throws AssertionError if a registered matcher assertion is not met. + */ + public void verifyFields(List<Object> described) throws AssertionError { int fieldNumber = 0; HashMap<Enum<?>, Object> valueMap = new HashMap<>(); for (Object value : described) { http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/a40f0276/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/matchers/CoordinatorMatcher.java ---------------------------------------------------------------------- diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/matchers/CoordinatorMatcher.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/matchers/CoordinatorMatcher.java new file mode 100644 index 0000000..029442d --- /dev/null +++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/matchers/CoordinatorMatcher.java @@ -0,0 +1,151 @@ +/* + * 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.qpid.jms.test.testpeer.matchers; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.instanceOf; + +import java.util.HashMap; +import java.util.List; +import org.apache.qpid.proton.amqp.DescribedType; +import org.apache.qpid.proton.amqp.Symbol; +import org.apache.qpid.proton.amqp.UnsignedLong; +import org.apache.qpid.jms.test.testpeer.AbstractFieldAndDescriptorMatcher; +import org.hamcrest.Matcher; +import org.hamcrest.Description; +import org.hamcrest.TypeSafeMatcher; + +/** + * Generated by generate-matchers.xsl, which resides in this package. + */ +public class CoordinatorMatcher extends TypeSafeMatcher<Object> +{ + private CoordinatorMatcherCore coreMatcher = new CoordinatorMatcherCore(); + private String mismatchTextAddition; + private Object described; + private Object descriptor; + + public CoordinatorMatcher() + { + } + + @Override + protected boolean matchesSafely(Object received) + { + try + { + assertThat(received, instanceOf(DescribedType.class)); + descriptor = ((DescribedType)received).getDescriptor(); + if(!coreMatcher.descriptorMatches(descriptor)) + { + mismatchTextAddition = "Descriptor mismatch"; + return false; + } + + described = ((DescribedType)received).getDescribed(); + assertThat(described, instanceOf(List.class)); + @SuppressWarnings("unchecked") + List<Object> fields = (List<Object>) described; + + coreMatcher.verifyFields(fields); + } + catch (AssertionError ae) + { + mismatchTextAddition = "AssertionFailure: " + ae.getMessage(); + return false; + } + + return true; + } + + @Override + protected void describeMismatchSafely(Object item, Description mismatchDescription) + { + mismatchDescription.appendText("\nActual form: ").appendValue(item); + + mismatchDescription.appendText("\nExpected descriptor: ") + .appendValue(coreMatcher.getSymbolicDescriptor()) + .appendText(" / ") + .appendValue(coreMatcher.getNumericDescriptor()); + + if(mismatchTextAddition != null) + { + mismatchDescription.appendText("\nAdditional info: ").appendValue(mismatchTextAddition); + } + } + + public void describeTo(Description description) + { + description + .appendText("Coordinator which matches: ") + .appendValue(coreMatcher.getMatchers()); + } + + + public CoordinatorMatcher withCapabilities(Matcher<?> m) + { + coreMatcher.withCapabilities(m); + return this; + } + + public Object getReceivedCapabilities() + { + return coreMatcher.getReceivedCapabilities(); + } + + + + //Inner core matching class + public static class CoordinatorMatcherCore extends AbstractFieldAndDescriptorMatcher + { + /** Note that the ordinals of the Field enums match the order specified in the AMQP spec */ + public enum Field + { + CAPABILITIES, + } + + public CoordinatorMatcherCore() + { + super(UnsignedLong.valueOf(0x0000000000000030L), + Symbol.valueOf("amqp:coordinator:list"), + new HashMap<Enum<?>, Matcher<?>>()); + } + + + public CoordinatorMatcherCore withCapabilities(Matcher<?> m) + { + getMatchers().put(Field.CAPABILITIES, m); + return this; + } + + public Object getReceivedCapabilities() + { + return getReceivedFields().get(Field.CAPABILITIES); + } + + @Override + protected Enum<?> getField(int fieldIndex) + { + return Field.values()[fieldIndex]; + } + } +} + http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/a40f0276/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/matchers/SourceMatcher.java ---------------------------------------------------------------------- diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/matchers/SourceMatcher.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/matchers/SourceMatcher.java new file mode 100644 index 0000000..03f5e79 --- /dev/null +++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/matchers/SourceMatcher.java @@ -0,0 +1,381 @@ +/* + * 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.qpid.jms.test.testpeer.matchers; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.instanceOf; + +import java.util.HashMap; +import java.util.List; +import org.apache.qpid.proton.amqp.DescribedType; +import org.apache.qpid.proton.amqp.Symbol; +import org.apache.qpid.proton.amqp.UnsignedLong; +import org.apache.qpid.jms.test.testpeer.AbstractFieldAndDescriptorMatcher; +import org.hamcrest.Matcher; +import org.hamcrest.Description; +import org.hamcrest.TypeSafeMatcher; + +/** + * Generated by generate-matchers.xsl, which resides in this package. + */ +public class SourceMatcher extends TypeSafeMatcher<Object> +{ + private SourceMatcherCore coreMatcher = new SourceMatcherCore(); + private String mismatchTextAddition; + private Object described; + private Object descriptor; + + public SourceMatcher() + { + } + + @Override + protected boolean matchesSafely(Object received) + { + try + { + assertThat(received, instanceOf(DescribedType.class)); + descriptor = ((DescribedType)received).getDescriptor(); + if(!coreMatcher.descriptorMatches(descriptor)) + { + mismatchTextAddition = "Descriptor mismatch"; + return false; + } + + described = ((DescribedType)received).getDescribed(); + assertThat(described, instanceOf(List.class)); + @SuppressWarnings("unchecked") + List<Object> fields = (List<Object>) described; + + coreMatcher.verifyFields(fields); + } + catch (AssertionError ae) + { + mismatchTextAddition = "AssertionFailure: " + ae.getMessage(); + return false; + } + + return true; + } + + @Override + protected void describeMismatchSafely(Object item, Description mismatchDescription) + { + mismatchDescription.appendText("\nActual form: ").appendValue(item); + + mismatchDescription.appendText("\nExpected descriptor: ") + .appendValue(coreMatcher.getSymbolicDescriptor()) + .appendText(" / ") + .appendValue(coreMatcher.getNumericDescriptor()); + + if(mismatchTextAddition != null) + { + mismatchDescription.appendText("\nAdditional info: ").appendValue(mismatchTextAddition); + } + } + + public void describeTo(Description description) + { + description + .appendText("Source which matches: ") + .appendValue(coreMatcher.getMatchers()); + } + + + public SourceMatcher withAddress(Matcher<?> m) + { + coreMatcher.withAddress(m); + return this; + } + + public SourceMatcher withDurable(Matcher<?> m) + { + coreMatcher.withDurable(m); + return this; + } + + public SourceMatcher withExpiryPolicy(Matcher<?> m) + { + coreMatcher.withExpiryPolicy(m); + return this; + } + + public SourceMatcher withTimeout(Matcher<?> m) + { + coreMatcher.withTimeout(m); + return this; + } + + public SourceMatcher withDynamic(Matcher<?> m) + { + coreMatcher.withDynamic(m); + return this; + } + + public SourceMatcher withDynamicNodeProperties(Matcher<?> m) + { + coreMatcher.withDynamicNodeProperties(m); + return this; + } + + public SourceMatcher withDistributionMode(Matcher<?> m) + { + coreMatcher.withDistributionMode(m); + return this; + } + + public SourceMatcher withFilter(Matcher<?> m) + { + coreMatcher.withFilter(m); + return this; + } + + public SourceMatcher withDefaultOutcome(Matcher<?> m) + { + coreMatcher.withDefaultOutcome(m); + return this; + } + + public SourceMatcher withOutcomes(Matcher<?> m) + { + coreMatcher.withOutcomes(m); + return this; + } + + public SourceMatcher withCapabilities(Matcher<?> m) + { + coreMatcher.withCapabilities(m); + return this; + } + + public Object getReceivedAddress() + { + return coreMatcher.getReceivedAddress(); + } + + public Object getReceivedDurable() + { + return coreMatcher.getReceivedDurable(); + } + + public Object getReceivedExpiryPolicy() + { + return coreMatcher.getReceivedExpiryPolicy(); + } + + public Object getReceivedTimeout() + { + return coreMatcher.getReceivedTimeout(); + } + + public Object getReceivedDynamic() + { + return coreMatcher.getReceivedDynamic(); + } + + public Object getReceivedDynamicNodeProperties() + { + return coreMatcher.getReceivedDynamicNodeProperties(); + } + + public Object getReceivedDistributionMode() + { + return coreMatcher.getReceivedDistributionMode(); + } + + public Object getReceivedFilter() + { + return coreMatcher.getReceivedFilter(); + } + + public Object getReceivedDefaultOutcome() + { + return coreMatcher.getReceivedDefaultOutcome(); + } + + public Object getReceivedOutcomes() + { + return coreMatcher.getReceivedOutcomes(); + } + + public Object getReceivedCapabilities() + { + return coreMatcher.getReceivedCapabilities(); + } + + + + //Inner core matching class + public static class SourceMatcherCore extends AbstractFieldAndDescriptorMatcher + { + /** Note that the ordinals of the Field enums match the order specified in the AMQP spec */ + public enum Field + { + ADDRESS, + DURABLE, + EXPIRY_POLICY, + TIMEOUT, + DYNAMIC, + DYNAMIC_NODE_PROPERTIES, + DISTRIBUTION_MODE, + FILTER, + DEFAULT_OUTCOME, + OUTCOMES, + CAPABILITIES, + } + + public SourceMatcherCore() + { + super(UnsignedLong.valueOf(0x0000000000000028L), + Symbol.valueOf("amqp:source:list"), + new HashMap<Enum<?>, Matcher<?>>()); + } + + + public SourceMatcherCore withAddress(Matcher<?> m) + { + getMatchers().put(Field.ADDRESS, m); + return this; + } + + public SourceMatcherCore withDurable(Matcher<?> m) + { + getMatchers().put(Field.DURABLE, m); + return this; + } + + public SourceMatcherCore withExpiryPolicy(Matcher<?> m) + { + getMatchers().put(Field.EXPIRY_POLICY, m); + return this; + } + + public SourceMatcherCore withTimeout(Matcher<?> m) + { + getMatchers().put(Field.TIMEOUT, m); + return this; + } + + public SourceMatcherCore withDynamic(Matcher<?> m) + { + getMatchers().put(Field.DYNAMIC, m); + return this; + } + + public SourceMatcherCore withDynamicNodeProperties(Matcher<?> m) + { + getMatchers().put(Field.DYNAMIC_NODE_PROPERTIES, m); + return this; + } + + public SourceMatcherCore withDistributionMode(Matcher<?> m) + { + getMatchers().put(Field.DISTRIBUTION_MODE, m); + return this; + } + + public SourceMatcherCore withFilter(Matcher<?> m) + { + getMatchers().put(Field.FILTER, m); + return this; + } + + public SourceMatcherCore withDefaultOutcome(Matcher<?> m) + { + getMatchers().put(Field.DEFAULT_OUTCOME, m); + return this; + } + + public SourceMatcherCore withOutcomes(Matcher<?> m) + { + getMatchers().put(Field.OUTCOMES, m); + return this; + } + + public SourceMatcherCore withCapabilities(Matcher<?> m) + { + getMatchers().put(Field.CAPABILITIES, m); + return this; + } + + public Object getReceivedAddress() + { + return getReceivedFields().get(Field.ADDRESS); + } + + public Object getReceivedDurable() + { + return getReceivedFields().get(Field.DURABLE); + } + + public Object getReceivedExpiryPolicy() + { + return getReceivedFields().get(Field.EXPIRY_POLICY); + } + + public Object getReceivedTimeout() + { + return getReceivedFields().get(Field.TIMEOUT); + } + + public Object getReceivedDynamic() + { + return getReceivedFields().get(Field.DYNAMIC); + } + + public Object getReceivedDynamicNodeProperties() + { + return getReceivedFields().get(Field.DYNAMIC_NODE_PROPERTIES); + } + + public Object getReceivedDistributionMode() + { + return getReceivedFields().get(Field.DISTRIBUTION_MODE); + } + + public Object getReceivedFilter() + { + return getReceivedFields().get(Field.FILTER); + } + + public Object getReceivedDefaultOutcome() + { + return getReceivedFields().get(Field.DEFAULT_OUTCOME); + } + + public Object getReceivedOutcomes() + { + return getReceivedFields().get(Field.OUTCOMES); + } + + public Object getReceivedCapabilities() + { + return getReceivedFields().get(Field.CAPABILITIES); + } + + @Override + protected Enum<?> getField(int fieldIndex) + { + return Field.values()[fieldIndex]; + } + } +} + http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/a40f0276/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/matchers/TargetMatcher.java ---------------------------------------------------------------------- diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/matchers/TargetMatcher.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/matchers/TargetMatcher.java new file mode 100644 index 0000000..3c141ed --- /dev/null +++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/matchers/TargetMatcher.java @@ -0,0 +1,289 @@ +/* + * 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.qpid.jms.test.testpeer.matchers; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.instanceOf; + +import java.util.HashMap; +import java.util.List; +import org.apache.qpid.proton.amqp.DescribedType; +import org.apache.qpid.proton.amqp.Symbol; +import org.apache.qpid.proton.amqp.UnsignedLong; +import org.apache.qpid.jms.test.testpeer.AbstractFieldAndDescriptorMatcher; +import org.hamcrest.Matcher; +import org.hamcrest.Description; +import org.hamcrest.TypeSafeMatcher; + +/** + * Generated by generate-matchers.xsl, which resides in this package. + */ +public class TargetMatcher extends TypeSafeMatcher<Object> +{ + private TargetMatcherCore coreMatcher = new TargetMatcherCore(); + private String mismatchTextAddition; + private Object described; + private Object descriptor; + + public TargetMatcher() + { + } + + @Override + protected boolean matchesSafely(Object received) + { + try + { + assertThat(received, instanceOf(DescribedType.class)); + descriptor = ((DescribedType)received).getDescriptor(); + if(!coreMatcher.descriptorMatches(descriptor)) + { + mismatchTextAddition = "Descriptor mismatch"; + return false; + } + + described = ((DescribedType)received).getDescribed(); + assertThat(described, instanceOf(List.class)); + @SuppressWarnings("unchecked") + List<Object> fields = (List<Object>) described; + + coreMatcher.verifyFields(fields); + } + catch (AssertionError ae) + { + mismatchTextAddition = "AssertionFailure: " + ae.getMessage(); + return false; + } + + return true; + } + + @Override + protected void describeMismatchSafely(Object item, Description mismatchDescription) + { + mismatchDescription.appendText("\nActual form: ").appendValue(item); + + mismatchDescription.appendText("\nExpected descriptor: ") + .appendValue(coreMatcher.getSymbolicDescriptor()) + .appendText(" / ") + .appendValue(coreMatcher.getNumericDescriptor()); + + if(mismatchTextAddition != null) + { + mismatchDescription.appendText("\nAdditional info: ").appendValue(mismatchTextAddition); + } + } + + public void describeTo(Description description) + { + description + .appendText("Target which matches: ") + .appendValue(coreMatcher.getMatchers()); + } + + + public TargetMatcher withAddress(Matcher<?> m) + { + coreMatcher.withAddress(m); + return this; + } + + public TargetMatcher withDurable(Matcher<?> m) + { + coreMatcher.withDurable(m); + return this; + } + + public TargetMatcher withExpiryPolicy(Matcher<?> m) + { + coreMatcher.withExpiryPolicy(m); + return this; + } + + public TargetMatcher withTimeout(Matcher<?> m) + { + coreMatcher.withTimeout(m); + return this; + } + + public TargetMatcher withDynamic(Matcher<?> m) + { + coreMatcher.withDynamic(m); + return this; + } + + public TargetMatcher withDynamicNodeProperties(Matcher<?> m) + { + coreMatcher.withDynamicNodeProperties(m); + return this; + } + + public TargetMatcher withCapabilities(Matcher<?> m) + { + coreMatcher.withCapabilities(m); + return this; + } + + public Object getReceivedAddress() + { + return coreMatcher.getReceivedAddress(); + } + + public Object getReceivedDurable() + { + return coreMatcher.getReceivedDurable(); + } + + public Object getReceivedExpiryPolicy() + { + return coreMatcher.getReceivedExpiryPolicy(); + } + + public Object getReceivedTimeout() + { + return coreMatcher.getReceivedTimeout(); + } + + public Object getReceivedDynamic() + { + return coreMatcher.getReceivedDynamic(); + } + + public Object getReceivedDynamicNodeProperties() + { + return coreMatcher.getReceivedDynamicNodeProperties(); + } + + public Object getReceivedCapabilities() + { + return coreMatcher.getReceivedCapabilities(); + } + + + + //Inner core matching class + public static class TargetMatcherCore extends AbstractFieldAndDescriptorMatcher + { + /** Note that the ordinals of the Field enums match the order specified in the AMQP spec */ + public enum Field + { + ADDRESS, + DURABLE, + EXPIRY_POLICY, + TIMEOUT, + DYNAMIC, + DYNAMIC_NODE_PROPERTIES, + CAPABILITIES, + } + + public TargetMatcherCore() + { + super(UnsignedLong.valueOf(0x0000000000000029L), + Symbol.valueOf("amqp:target:list"), + new HashMap<Enum<?>, Matcher<?>>()); + } + + + public TargetMatcherCore withAddress(Matcher<?> m) + { + getMatchers().put(Field.ADDRESS, m); + return this; + } + + public TargetMatcherCore withDurable(Matcher<?> m) + { + getMatchers().put(Field.DURABLE, m); + return this; + } + + public TargetMatcherCore withExpiryPolicy(Matcher<?> m) + { + getMatchers().put(Field.EXPIRY_POLICY, m); + return this; + } + + public TargetMatcherCore withTimeout(Matcher<?> m) + { + getMatchers().put(Field.TIMEOUT, m); + return this; + } + + public TargetMatcherCore withDynamic(Matcher<?> m) + { + getMatchers().put(Field.DYNAMIC, m); + return this; + } + + public TargetMatcherCore withDynamicNodeProperties(Matcher<?> m) + { + getMatchers().put(Field.DYNAMIC_NODE_PROPERTIES, m); + return this; + } + + public TargetMatcherCore withCapabilities(Matcher<?> m) + { + getMatchers().put(Field.CAPABILITIES, m); + return this; + } + + public Object getReceivedAddress() + { + return getReceivedFields().get(Field.ADDRESS); + } + + public Object getReceivedDurable() + { + return getReceivedFields().get(Field.DURABLE); + } + + public Object getReceivedExpiryPolicy() + { + return getReceivedFields().get(Field.EXPIRY_POLICY); + } + + public Object getReceivedTimeout() + { + return getReceivedFields().get(Field.TIMEOUT); + } + + public Object getReceivedDynamic() + { + return getReceivedFields().get(Field.DYNAMIC); + } + + public Object getReceivedDynamicNodeProperties() + { + return getReceivedFields().get(Field.DYNAMIC_NODE_PROPERTIES); + } + + public Object getReceivedCapabilities() + { + return getReceivedFields().get(Field.CAPABILITIES); + } + + @Override + protected Enum<?> getField(int fieldIndex) + { + return Field.values()[fieldIndex]; + } + } +} + http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/a40f0276/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/matchers/generate-matchers.xsl ---------------------------------------------------------------------- diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/matchers/generate-matchers.xsl b/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/matchers/generate-matchers.xsl index 263c87f..7bcdf74 100644 --- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/matchers/generate-matchers.xsl +++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/matchers/generate-matchers.xsl @@ -31,28 +31,36 @@ <xsl:for-each select="descendant-or-self::node()[name()='type']"> <xsl:variable name="classname"><xsl:call-template name="dashToCamel"><xsl:with-param name="input" select="@name"/></xsl:call-template>Matcher</xsl:variable> - <xsl:variable name="superclass"> + + <xsl:if test="@provides = 'frame' or @provides = 'sasl-frame'"> + <xsl:variable name="frameSuperclass"> <xsl:choose> <xsl:when test="@name = 'transfer'">FrameWithPayloadMatchingHandler</xsl:when> <xsl:otherwise>FrameWithNoPayloadMatchingHandler</xsl:otherwise> </xsl:choose> - </xsl:variable> - - <xsl:if test="@provides = 'frame' or @provides = 'sasl-frame'"> - <xsl:call-template name="typeClass"> + </xsl:variable> + <xsl:call-template name="frameClass"> <xsl:with-param name="license" select="$license"/> <xsl:with-param name="classname" select="$classname"/> - <xsl:with-param name="superclass" select="$superclass"/> + <xsl:with-param name="superclass" select="$frameSuperclass"/> </xsl:call-template> </xsl:if> + <xsl:if test="@provides = 'source' or @provides = 'target'"> + <xsl:variable name="typename"><xsl:call-template name="dashToCamel"><xsl:with-param name="input" select="@name"/></xsl:call-template></xsl:variable> + <xsl:call-template name="sourceOrTargetClass"> + <xsl:with-param name="license" select="$license"/> + <xsl:with-param name="classname" select="$classname"/> + <xsl:with-param name="typename" select="$typename"/> + </xsl:call-template> + </xsl:if> </xsl:for-each> </xsl:template> <!-- *************************************************************************************************************** --> -<xsl:template name="typeClass"> +<xsl:template name="frameClass"> <xsl:param name="license"/> <xsl:param name="classname"/> <xsl:param name="superclass"/> @@ -121,6 +129,152 @@ public class <xsl:value-of select="$classname"/> extends <xsl:value-of select="$ <!-- *************************************************************************************************************** --> +<xsl:template name="sourceOrTargetClass"> + <xsl:param name="license"/> + <xsl:param name="classname"/> + <xsl:param name="typename"/> + <exsl:document href="{$classname}.java" method="text"> + <xsl:value-of select="$license"/> +package org.apache.qpid.jms.test.testpeer.matchers; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.instanceOf; + +import java.util.HashMap; +import java.util.List; +import org.apache.qpid.proton.amqp.DescribedType; +import org.apache.qpid.proton.amqp.Symbol; +import org.apache.qpid.proton.amqp.UnsignedLong; +import org.apache.qpid.jms.test.testpeer.AbstractFieldAndDescriptorMatcher; +import org.hamcrest.Matcher; +import org.hamcrest.Description; +import org.hamcrest.TypeSafeMatcher; + +/** + * Generated by generate-matchers.xsl, which resides in this package. + */ +public class <xsl:value-of select="$classname"/> extends TypeSafeMatcher<Object> +{ + private <xsl:value-of select="$classname"/>Core coreMatcher = new <xsl:value-of select="$classname"/>Core(); + private String mismatchTextAddition; + private Object described; + private Object descriptor; + + public <xsl:value-of select="$classname"/>() + { + } + + @Override + protected boolean matchesSafely(Object received) + { + try + { + assertThat(received, instanceOf(DescribedType.class)); + descriptor = ((DescribedType)received).getDescriptor(); + if(!coreMatcher.descriptorMatches(descriptor)) + { + mismatchTextAddition = "Descriptor mismatch"; + return false; + } + + described = ((DescribedType)received).getDescribed(); + assertThat(described, instanceOf(List.class)); + @SuppressWarnings("unchecked") + List<Object> fields = (List<Object>) described; + + coreMatcher.verifyFields(fields); + } + catch (AssertionError ae) + { + mismatchTextAddition = "AssertionFailure: " + ae.getMessage(); + return false; + } + + return true; + } + + @Override + protected void describeMismatchSafely(Object item, Description mismatchDescription) + { + mismatchDescription.appendText("\nActual form: ").appendValue(item); + + mismatchDescription.appendText("\nExpected descriptor: ") + .appendValue(coreMatcher.getSymbolicDescriptor()) + .appendText(" / ") + .appendValue(coreMatcher.getNumericDescriptor()); + + if(mismatchTextAddition != null) + { + mismatchDescription.appendText("\nAdditional info: ").appendValue(mismatchTextAddition); + } + } + + public void describeTo(Description description) + { + description + .appendText("<xsl:value-of select="$typename"/> which matches: ") + .appendValue(coreMatcher.getMatchers()); + } + +<xsl:for-each select="descendant::node()[name()='field']"> + public <xsl:value-of select="$classname"/> with<xsl:call-template name="dashToCamel"><xsl:with-param name="input" select="@name"/></xsl:call-template>(Matcher<?> m) + { + coreMatcher.with<xsl:call-template name="dashToCamel"><xsl:with-param name="input" select="@name"/></xsl:call-template>(m); + return this; + } +</xsl:for-each> +<xsl:for-each select="descendant::node()[name()='field']"> + public Object getReceived<xsl:call-template name="dashToCamel"><xsl:with-param name="input" select="@name"/></xsl:call-template>() + { + return coreMatcher.getReceived<xsl:call-template name="dashToCamel"><xsl:with-param name="input" select="@name"/></xsl:call-template>(); + } +</xsl:for-each> + + + //Inner core matching class + public static class <xsl:value-of select="$classname"/>Core extends AbstractFieldAndDescriptorMatcher + { + /** Note that the ordinals of the Field enums match the order specified in the AMQP spec */ + public enum Field + { + <xsl:for-each select="descendant::node()[name()='field']"> + <xsl:text> </xsl:text><xsl:call-template name="toUpperDashToUnderscore"><xsl:with-param name="input" select="@name"/></xsl:call-template>, + </xsl:for-each> } + + public <xsl:value-of select="$classname"/>Core() + { + super(UnsignedLong.valueOf(<xsl:value-of select="concat(substring(descendant::node()[name()='descriptor']/@code,1,10),substring(descendant::node()[name()='descriptor']/@code,14))"/>L), + Symbol.valueOf("<xsl:value-of select="descendant::node()[name()='descriptor']/@name"/>"), + new HashMap<Enum<?>, Matcher<?>>()); + } + +<xsl:for-each select="descendant::node()[name()='field']"> + public <xsl:value-of select="$classname"/>Core with<xsl:call-template name="dashToCamel"><xsl:with-param name="input" select="@name"/></xsl:call-template>(Matcher<?> m) + { + getMatchers().put(Field.<xsl:call-template name="toUpperDashToUnderscore"><xsl:with-param name="input" select="@name"/></xsl:call-template>, m); + return this; + } +</xsl:for-each> +<xsl:for-each select="descendant::node()[name()='field']"> + public Object getReceived<xsl:call-template name="dashToCamel"><xsl:with-param name="input" select="@name"/></xsl:call-template>() + { + return getReceivedFields().get(Field.<xsl:call-template name="toUpperDashToUnderscore"><xsl:with-param name="input" select="@name"/></xsl:call-template>); + } +</xsl:for-each> + @Override + protected Enum<?> getField(int fieldIndex) + { + return Field.values()[fieldIndex]; + } + } +} + +</exsl:document> + +</xsl:template> + +<!-- *************************************************************************************************************** --> + <xsl:template name="constructFromLiteral"> <xsl:param name="type"/> <xsl:param name="value"/> --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org