You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ro...@apache.org on 2014/10/27 15:10:37 UTC

[2/3] git commit: create new matchers to allow verifying sub-values within the source and target values of the Attach frame

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 <ro...@apache.org>
Authored: Mon Oct 27 13:56:13 2014 +0000
Committer: Robert Gemmell <ro...@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&lt;Object&gt;
+{
+    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&lt;Object&gt; fields = (List&lt;Object&gt;) 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&lt;?&gt; 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&lt;Enum&lt;?&gt;, Matcher&lt;?&gt;&gt;());
+        }
+
+<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&lt;?&gt; 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&lt;?&gt; 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-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org