You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by or...@apache.org on 2018/01/10 17:38:17 UTC

[1/5] qpid-broker-j git commit: QPID-8038: [Broker-J] [AMQP 0-x/1.0] Add heartbeating/idle tests to protocol suites

Repository: qpid-broker-j
Updated Branches:
  refs/heads/7.0.x 3087443cd -> ed1b9752b


QPID-8038: [Broker-J] [AMQP 0-x/1.0]  Add heartbeating/idle tests to protocol suites

(cherry picked from commit 99fa51f01cbd03e5712821bcdd782e59584c175f)


Project: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/commit/c39cf075
Tree: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/tree/c39cf075
Diff: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/diff/c39cf075

Branch: refs/heads/7.0.x
Commit: c39cf075f6641466b263e7f4a0b06f97d449703e
Parents: 3087443
Author: Keith Wall <kw...@apache.org>
Authored: Thu Jan 4 10:13:29 2018 +0000
Committer: Alex Rudyy <or...@apache.org>
Committed: Wed Jan 10 17:22:23 2018 +0000

----------------------------------------------------------------------
 .../qpid/tests/protocol/v1_0/EmptyResponse.java | 31 +++++++++++
 .../qpid/tests/protocol/v1_0/FrameDecoder.java  |  4 ++
 .../qpid/tests/protocol/v1_0/Interaction.java   | 20 +++++++
 .../v1_0/transport/connection/OpenTest.java     | 55 ++++++++++++++++++++
 4 files changed, 110 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/c39cf075/systests/protocol-tests-amqp-1-0/src/main/java/org/apache/qpid/tests/protocol/v1_0/EmptyResponse.java
----------------------------------------------------------------------
diff --git a/systests/protocol-tests-amqp-1-0/src/main/java/org/apache/qpid/tests/protocol/v1_0/EmptyResponse.java b/systests/protocol-tests-amqp-1-0/src/main/java/org/apache/qpid/tests/protocol/v1_0/EmptyResponse.java
new file mode 100644
index 0000000..c233e28
--- /dev/null
+++ b/systests/protocol-tests-amqp-1-0/src/main/java/org/apache/qpid/tests/protocol/v1_0/EmptyResponse.java
@@ -0,0 +1,31 @@
+/*
+ * 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.tests.protocol.v1_0;
+
+import org.apache.qpid.tests.protocol.Response;
+
+public class EmptyResponse implements Response<EmptyResponse>
+{
+    @Override
+    public EmptyResponse getBody()
+    {
+        return this;
+    }
+}

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/c39cf075/systests/protocol-tests-amqp-1-0/src/main/java/org/apache/qpid/tests/protocol/v1_0/FrameDecoder.java
----------------------------------------------------------------------
diff --git a/systests/protocol-tests-amqp-1-0/src/main/java/org/apache/qpid/tests/protocol/v1_0/FrameDecoder.java b/systests/protocol-tests-amqp-1-0/src/main/java/org/apache/qpid/tests/protocol/v1_0/FrameDecoder.java
index 0c94ad7..a8ab32e 100644
--- a/systests/protocol-tests-amqp-1-0/src/main/java/org/apache/qpid/tests/protocol/v1_0/FrameDecoder.java
+++ b/systests/protocol-tests-amqp-1-0/src/main/java/org/apache/qpid/tests/protocol/v1_0/FrameDecoder.java
@@ -241,6 +241,10 @@ public class FrameDecoder implements InputDecoder
                         resetInputHandlerAfterSaslOutcome();
                     }
                 }
+                else if (val == null)
+                {
+                    response = new EmptyResponse();
+                }
                 else
                 {
                     throw new UnsupportedOperationException("Unexpected frame type : " + val.getClass());

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/c39cf075/systests/protocol-tests-amqp-1-0/src/main/java/org/apache/qpid/tests/protocol/v1_0/Interaction.java
----------------------------------------------------------------------
diff --git a/systests/protocol-tests-amqp-1-0/src/main/java/org/apache/qpid/tests/protocol/v1_0/Interaction.java b/systests/protocol-tests-amqp-1-0/src/main/java/org/apache/qpid/tests/protocol/v1_0/Interaction.java
index b2f8147..832ad4d 100644
--- a/systests/protocol-tests-amqp-1-0/src/main/java/org/apache/qpid/tests/protocol/v1_0/Interaction.java
+++ b/systests/protocol-tests-amqp-1-0/src/main/java/org/apache/qpid/tests/protocol/v1_0/Interaction.java
@@ -82,6 +82,10 @@ import org.apache.qpid.tests.protocol.Response;
 
 public class Interaction extends AbstractInteraction<Interaction>
 {
+    private static final FrameBody EMPTY_FRAME = (channel, conn) -> {
+        throw new UnsupportedOperationException();
+    };
+
     private static final Set<String> CONTAINER_IDS = Collections.newSetFromMap(new ConcurrentHashMap<>());
     private final Begin _begin;
     private final End _end;
@@ -268,6 +272,12 @@ public class Interaction extends AbstractInteraction<Interaction>
         return this;
     }
 
+    public Interaction openIdleTimeOut(final int idleTimeOut)
+    {
+        _open.setIdleTimeOut(UnsignedInteger.valueOf(idleTimeOut));
+        return this;
+    }
+
     public Interaction openProperties(final Map<Symbol, Object> properties)
     {
         _open.setProperties(properties);
@@ -1070,4 +1080,14 @@ public class Interaction extends AbstractInteraction<Interaction>
         return new InteractionTransactionalState(handle);
     }
 
+    ///////////
+    // Empty //
+    ///////////
+
+    public Interaction emptyFrame() throws Exception
+    {
+        sendPerformative(EMPTY_FRAME, UnsignedShort.ZERO);
+        return this;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/c39cf075/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/transport/connection/OpenTest.java
----------------------------------------------------------------------
diff --git a/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/transport/connection/OpenTest.java b/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/transport/connection/OpenTest.java
index ab570da..a744cb1 100644
--- a/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/transport/connection/OpenTest.java
+++ b/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/transport/connection/OpenTest.java
@@ -21,11 +21,13 @@
 package org.apache.qpid.tests.protocol.v1_0.transport.connection;
 
 import static org.hamcrest.CoreMatchers.both;
+import static org.hamcrest.CoreMatchers.either;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.greaterThanOrEqualTo;
 import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.lessThan;
+import static org.hamcrest.Matchers.lessThanOrEqualTo;
 import static org.hamcrest.Matchers.notNullValue;
 
 import java.net.InetSocketAddress;
@@ -41,6 +43,7 @@ import org.apache.qpid.server.protocol.v1_0.type.transport.Open;
 import org.apache.qpid.tests.utils.BrokerAdmin;
 import org.apache.qpid.tests.protocol.v1_0.FrameTransport;
 import org.apache.qpid.tests.protocol.v1_0.Interaction;
+import org.apache.qpid.tests.protocol.v1_0.EmptyResponse;
 import org.apache.qpid.tests.utils.BrokerAdminUsingTestBase;
 import org.apache.qpid.tests.protocol.SpecificationTest;
 
@@ -94,6 +97,58 @@ public class OpenTest extends BrokerAdminUsingTestBase
     }
 
     @Test
+    @SpecificationTest(section = "2.4.5",
+            description = "Implementations MUST be prepared to handle empty frames arriving on any valid channel")
+    public void emptyFrame() throws Exception
+    {
+        final InetSocketAddress addr = getBrokerAdmin().getBrokerAddress(BrokerAdmin.PortType.ANONYMOUS_AMQP);
+        try (FrameTransport transport = new FrameTransport(addr).connect())
+        {
+            Interaction interaction = transport.newInteraction();
+            interaction.negotiateProtocol().consumeResponse()
+                       .openContainerId("testContainerId")
+                       .open().consumeResponse(Open.class)
+                       .emptyFrame()
+                       .doCloseConnection();
+        }
+    }
+
+    @Test
+    @SpecificationTest(section = "2.4.5",
+            description = "Connections are subject to an idle timeout threshold.")
+    public void idleTimeout() throws Exception
+    {
+        final InetSocketAddress addr = getBrokerAdmin().getBrokerAddress(BrokerAdmin.PortType.ANONYMOUS_AMQP);
+        try (FrameTransport transport = new FrameTransport(addr).connect())
+        {
+            Interaction interaction = transport.newInteraction();
+            final int idleTimeOut = 1000;
+            Open responseOpen = interaction.negotiateProtocol().consumeResponse()
+                                           .openContainerId("testContainerId")
+                                           .openIdleTimeOut(idleTimeOut)
+                                           .open().consumeResponse()
+                                           .getLatestResponse(Open.class);
+
+            final int peerIdleTimeOut = responseOpen.getIdleTimeOut().intValue();
+            assertThat(peerIdleTimeOut, is(either(equalTo(0)).or(greaterThanOrEqualTo(idleTimeOut))));
+
+            final long startTime = System.currentTimeMillis();
+            interaction.consumeResponse(EmptyResponse.class);
+            final long actualHeartbeatDelay = System.currentTimeMillis() - startTime;
+            assertThat("Empty frame not received within expected time frame",
+                       ((int)actualHeartbeatDelay / 1000),
+                       is(both(greaterThanOrEqualTo(peerIdleTimeOut)).and(lessThanOrEqualTo(peerIdleTimeOut * 2))));
+
+            if (peerIdleTimeOut > 0)
+            {
+                interaction.emptyFrame();
+            }
+
+            interaction.doCloseConnection();
+        }
+    }
+
+    @Test
     @SpecificationTest(section = "2.4.1",
             description = "The open frame can only be sent on channel 0. ยง2.7.1: A peer that receives a channel number outside the supported range MUST close the connection with the framing-error error-code.")
     public void failOpenOnChannelNotZero() throws Exception


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[5/5] qpid-broker-j git commit: NO-JIRA: [System Tests] Fix test TransferTest failing on IBM JDK

Posted by or...@apache.org.
NO-JIRA: [System Tests] Fix test TransferTest failing on IBM JDK

(cherry picked from commit ebe2fcae10120be258b186bff9c29a6987377f50)


Project: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/commit/ed1b9752
Tree: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/tree/ed1b9752
Diff: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/diff/ed1b9752

Branch: refs/heads/7.0.x
Commit: ed1b9752bc7404338e6e92b99ab5f1612f97b971
Parents: da92ba9
Author: Alex Rudyy <or...@apache.org>
Authored: Thu Nov 23 10:28:20 2017 +0000
Committer: Alex Rudyy <or...@apache.org>
Committed: Wed Jan 10 17:36:55 2018 +0000

----------------------------------------------------------------------
 .../apache/qpid/tests/protocol/v1_0/messaging/TransferTest.java    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/ed1b9752/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/messaging/TransferTest.java
----------------------------------------------------------------------
diff --git a/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/messaging/TransferTest.java b/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/messaging/TransferTest.java
index 245c624..3d99408 100644
--- a/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/messaging/TransferTest.java
+++ b/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/messaging/TransferTest.java
@@ -847,7 +847,7 @@ public class TransferTest extends BrokerAdminUsingTestBase
             while (payloadSize < maxMessageSizeLimit.longValue())
             {
                 payloadSize += chunkSize;
-                interaction.transfer();
+                interaction.transfer().sync();
             }
 
             while (true)


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[4/5] qpid-broker-j git commit: QPID-8038: [Broker-J] [AMQP 0-x] Add tests related to protocol negotiation and oevrsized frames.

Posted by or...@apache.org.
QPID-8038: [Broker-J] [AMQP 0-x] Add tests related to protocol negotiation and oevrsized frames.

(cherry picked from commit a9e61c16b742d266a9b75d54c18c76fcd9341c8a)


Project: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/commit/da92ba96
Tree: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/tree/da92ba96
Diff: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/diff/da92ba96

Branch: refs/heads/7.0.x
Commit: da92ba96d4fd0b048623ed3e1a28f67222bbad46
Parents: 041674d
Author: Keith Wall <kw...@apache.org>
Authored: Wed Jan 3 13:31:50 2018 +0000
Committer: Alex Rudyy <or...@apache.org>
Committed: Wed Jan 10 17:32:31 2018 +0000

----------------------------------------------------------------------
 .../qpid/tests/protocol/v0_10/ProtocolTest.java | 154 +++++++++++++++++++
 .../qpid/tests/protocol/v0_8/ProtocolTest.java  | 154 +++++++++++++++++++
 .../qpid/tests/protocol/v1_0/Interaction.java   |   1 +
 .../tests/protocol/AbstractFrameTransport.java  |   5 +
 .../tests/protocol/AbstractInteraction.java     |   2 +
 5 files changed, 316 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/da92ba96/systests/protocol-tests-amqp-0-10/src/test/java/org/apache/qpid/tests/protocol/v0_10/ProtocolTest.java
----------------------------------------------------------------------
diff --git a/systests/protocol-tests-amqp-0-10/src/test/java/org/apache/qpid/tests/protocol/v0_10/ProtocolTest.java b/systests/protocol-tests-amqp-0-10/src/test/java/org/apache/qpid/tests/protocol/v0_10/ProtocolTest.java
new file mode 100644
index 0000000..35675e1
--- /dev/null
+++ b/systests/protocol-tests-amqp-0-10/src/test/java/org/apache/qpid/tests/protocol/v0_10/ProtocolTest.java
@@ -0,0 +1,154 @@
+/*
+ *
+ * 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.tests.protocol.v0_10;
+
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.contains;
+import static org.junit.Assert.assertArrayEquals;
+
+import java.io.ByteArrayOutputStream;
+import java.io.DataOutputStream;
+import java.net.InetSocketAddress;
+import java.nio.charset.StandardCharsets;
+
+import org.hamcrest.core.IsEqual;
+import org.junit.Before;
+import org.junit.Test;
+
+import org.apache.qpid.server.protocol.v0_10.transport.ConnectionStart;
+import org.apache.qpid.tests.protocol.HeaderResponse;
+import org.apache.qpid.tests.protocol.Response;
+import org.apache.qpid.tests.protocol.SpecificationTest;
+import org.apache.qpid.tests.utils.BrokerAdmin;
+import org.apache.qpid.tests.utils.BrokerAdminUsingTestBase;
+
+public class ProtocolTest extends BrokerAdminUsingTestBase
+{
+    private static final String DEFAULT_LOCALE = "en_US";
+    private InetSocketAddress _brokerAddress;
+
+    @Before
+    public void setUp()
+    {
+        _brokerAddress = getBrokerAdmin().getBrokerAddress(BrokerAdmin.PortType.ANONYMOUS_AMQP);
+    }
+
+    @Test
+    @SpecificationTest(section = "4.3. Version Negotiation",
+            description = "When the client opens a new socket connection to an AMQP server,"
+                          + " it MUST send a protocol header with the client's preferred protocol version."
+                          + "If the requested protocol version is supported, the server MUST send its own protocol"
+                          + " header with the requested version to the socket, and then implement the protocol accordingly")
+    public void versionNegotiation() throws Exception
+    {
+        try(FrameTransport transport = new FrameTransport(_brokerAddress).connect())
+        {
+            final Interaction interaction = transport.newInteraction();
+            Response<?> response = interaction.negotiateProtocol().consumeResponse().getLatestResponse();
+            assertThat(response, is(instanceOf(HeaderResponse.class)));
+            assertThat(response.getBody(), is(IsEqual.equalTo(transport.getProtocolHeader())));
+
+            ConnectionStart connectionStart = interaction.consumeResponse().getLatestResponse(ConnectionStart.class);
+            assertThat(connectionStart.getMechanisms(), is(notNullValue()));
+            assertThat(connectionStart.getMechanisms(), contains(ConnectionInteraction.SASL_MECHANISM_ANONYMOUS));
+            assertThat(connectionStart.getLocales(), is(notNullValue()));
+            assertThat(connectionStart.getLocales(), contains(DEFAULT_LOCALE));
+        }
+    }
+
+    @Test
+    @SpecificationTest(section = "4.3. Version Negotiation",
+            description = "If the server can't parse the protocol header, the server MUST send a valid protocol "
+                          + "header with a supported protocol version and then close the socket.")
+    public void unrecognisedProtocolHeader() throws Exception
+    {
+        try(FrameTransport transport = new FrameTransport(_brokerAddress).connect())
+        {
+
+            final Interaction interaction = transport.newInteraction();
+
+            byte[] unknownHeader = "NOTANAMQPHEADER".getBytes(StandardCharsets.UTF_8);
+            byte[] expectedResponse = "AMQP\001\001\000\012".getBytes(StandardCharsets.UTF_8);
+            final byte[] response = interaction.protocolHeader(unknownHeader)
+                                               .negotiateProtocol()
+                                               .consumeResponse().getLatestResponse(byte[].class);
+            assertArrayEquals("Unexpected protocol header response", expectedResponse, response);
+            transport.assertNoMoreResponsesAndChannelClosed();
+        }
+    }
+
+    @Test
+    @SpecificationTest(section = "4.3. Version Negotiation",
+            description = "If the requested protocol version is not supported, the server MUST send a protocol "
+                          + "header with a supported protocol version and then close the socket.")
+    public void unrecognisedProtocolVersion() throws Exception
+    {
+        try(FrameTransport transport = new FrameTransport(_brokerAddress).connect())
+        {
+
+
+            final Interaction interaction = transport.newInteraction();
+
+            byte[] unknownAmqpVersion = "AMQP\001\001\000\013".getBytes(StandardCharsets.UTF_8);
+            byte[] expectedResponse = "AMQP\001\001\000\012".getBytes(StandardCharsets.UTF_8);
+            final byte[] response = interaction.protocolHeader(unknownAmqpVersion)
+                                               .negotiateProtocol()
+                                               .consumeResponse().getLatestResponse(byte[].class);
+            assertArrayEquals("Unexpected protocol header response", expectedResponse, response);
+            transport.assertNoMoreResponsesAndChannelClosed();
+        }
+    }
+
+    @Test
+    @SpecificationTest(section = "8. Domains", description = "valid values for the frame type indicator.")
+    public void invalidSegmentType() throws Exception
+    {
+        try(FrameTransport transport = new FrameTransport(_brokerAddress).connect())
+        {
+            final Interaction interaction = transport.newInteraction();
+
+            interaction.negotiateProtocol().consumeResponse()
+                       .consumeResponse(ConnectionStart.class);
+
+            try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
+                 DataOutputStream dos = new DataOutputStream(bos))
+            {
+                dos.writeByte(0);   /* flags */
+                dos.writeByte(4);   /* segment type - undefined value in 0-10 */
+                dos.writeShort(12); /* size */
+                dos.writeByte(0);
+                dos.writeByte(0);   /* track */
+                dos.writeShort(0);  /* channel */
+                dos.writeByte(0);
+                dos.writeByte(0);
+                dos.writeByte(0);
+                dos.writeByte(0);
+
+                transport.sendBytes(bos.toByteArray());
+            }
+            transport.flush();
+            transport.assertNoMoreResponsesAndChannelClosed();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/da92ba96/systests/protocol-tests-amqp-0-8/src/test/java/org/apache/qpid/tests/protocol/v0_8/ProtocolTest.java
----------------------------------------------------------------------
diff --git a/systests/protocol-tests-amqp-0-8/src/test/java/org/apache/qpid/tests/protocol/v0_8/ProtocolTest.java b/systests/protocol-tests-amqp-0-8/src/test/java/org/apache/qpid/tests/protocol/v0_8/ProtocolTest.java
new file mode 100644
index 0000000..8475bb9
--- /dev/null
+++ b/systests/protocol-tests-amqp-0-8/src/test/java/org/apache/qpid/tests/protocol/v0_8/ProtocolTest.java
@@ -0,0 +1,154 @@
+/*
+ *
+ * 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.tests.protocol.v0_8;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assume.assumeThat;
+
+import java.net.InetSocketAddress;
+import java.nio.charset.StandardCharsets;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import org.apache.qpid.server.protocol.ProtocolVersion;
+import org.apache.qpid.server.protocol.v0_8.transport.AMQBody;
+import org.apache.qpid.server.protocol.v0_8.transport.AMQVersionAwareProtocolSession;
+import org.apache.qpid.server.protocol.v0_8.transport.ConnectionStartBody;
+import org.apache.qpid.server.transport.ByteBufferSender;
+import org.apache.qpid.tests.protocol.SpecificationTest;
+import org.apache.qpid.tests.utils.BrokerAdmin;
+import org.apache.qpid.tests.utils.BrokerAdminUsingTestBase;
+
+public class ProtocolTest extends BrokerAdminUsingTestBase
+{
+    private InetSocketAddress _brokerAddress;
+
+    @Before
+    public void setUp()
+    {
+        _brokerAddress = getBrokerAdmin().getBrokerAddress(BrokerAdmin.PortType.ANONYMOUS_AMQP);
+    }
+
+    @Test
+    @SpecificationTest(section = "4.2.2",
+            description = "If the server does not recognise the first 5 octets of data on the socket [...], it MUST "
+                          + "write a valid protocol header to the socket, [...] and then close the socket connection.")
+    public void unrecognisedProtocolHeader() throws Exception
+    {
+        try(FrameTransport transport = new FrameTransport(_brokerAddress).connect())
+        {
+            assumeThat(transport.getProtocolVersion(), is(equalTo(ProtocolVersion.v0_91)));
+
+            final Interaction interaction = transport.newInteraction();
+
+            byte[] unknownHeader = "NOTANAMQPHEADER".getBytes(StandardCharsets.UTF_8);
+            byte[] expectedResponse = "AMQP\000\000\011\001".getBytes(StandardCharsets.UTF_8);
+            final byte[] response = interaction.protocolHeader(unknownHeader)
+                                               .negotiateProtocol()
+                                               .consumeResponse().getLatestResponse(byte[].class);
+            assertArrayEquals("Unexpected protocol header response", expectedResponse, response);
+            transport.assertNoMoreResponsesAndChannelClosed();
+        }
+    }
+
+    @Test
+    @SpecificationTest(section = "4.2.2",
+            description = "If the server [...] does not support the specific protocol version that the client "
+                          + "requests, it MUST write a valid protocol header to the socket, [...] and then close "
+                          + "the socket connection.")
+    public void unrecognisedProtocolVersion() throws Exception
+    {
+        try(FrameTransport transport = new FrameTransport(_brokerAddress).connect())
+        {
+            assumeThat(transport.getProtocolVersion(), is(equalTo(ProtocolVersion.v0_91)));
+
+            final Interaction interaction = transport.newInteraction();
+
+            byte[] unknownAmqpVersion = "AMQP\000\000\010\002".getBytes(StandardCharsets.UTF_8);
+            byte[] expectedResponse = "AMQP\000\000\011\001".getBytes(StandardCharsets.UTF_8);
+            final byte[] response = interaction.protocolHeader(unknownAmqpVersion)
+                                               .negotiateProtocol()
+                                               .consumeResponse().getLatestResponse(byte[].class);
+            assertArrayEquals("Unexpected protocol header response", expectedResponse, response);
+            transport.assertNoMoreResponsesAndChannelClosed();
+        }
+    }
+
+    @Test
+    @SpecificationTest(section = "4.2.2", description = "The server either accepts [...] the protocol header")
+    public void validProtocolVersion() throws Exception
+    {
+        try(FrameTransport transport = new FrameTransport(_brokerAddress).connect())
+        {
+            final Interaction interaction = transport.newInteraction();
+
+            interaction.negotiateProtocol()
+                       .consumeResponse().getLatestResponse(ConnectionStartBody.class);
+
+        }
+    }
+
+    @Test
+    @SpecificationTest(section = "4.2.2",
+            description = "If a peer receives a frame with a type that is not one of these defined types, it MUST "
+                          + "treat this as a fatal protocol error and close the connection without sending any "
+                          + "further data on it")
+    public void unrecognisedFrameType() throws Exception
+    {
+        try(FrameTransport transport = new FrameTransport(_brokerAddress).connect())
+        {
+            final Interaction interaction = transport.newInteraction();
+
+            interaction.negotiateProtocol()
+                       .consumeResponse(ConnectionStartBody.class)
+                       .sendPerformative(new AMQBody()
+                       {
+                           @Override
+                           public byte getFrameType()
+                           {
+                               return (byte)5;  // Spec defines 1 - 4 only.
+                           }
+
+                           @Override
+                           public int getSize()
+                           {
+                               return 0;
+                           }
+
+                           @Override
+                           public long writePayload(final ByteBufferSender sender)
+                           {
+                               return 0;
+                           }
+
+                           @Override
+                           public void handle(final int channelId, final AMQVersionAwareProtocolSession session)
+                           {
+                               throw new UnsupportedOperationException();
+                           }
+                       }).sync();
+            transport.assertNoMoreResponsesAndChannelClosed();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/da92ba96/systests/protocol-tests-amqp-1-0/src/main/java/org/apache/qpid/tests/protocol/v1_0/Interaction.java
----------------------------------------------------------------------
diff --git a/systests/protocol-tests-amqp-1-0/src/main/java/org/apache/qpid/tests/protocol/v1_0/Interaction.java b/systests/protocol-tests-amqp-1-0/src/main/java/org/apache/qpid/tests/protocol/v1_0/Interaction.java
index fc84389..5898cf6 100644
--- a/systests/protocol-tests-amqp-1-0/src/main/java/org/apache/qpid/tests/protocol/v1_0/Interaction.java
+++ b/systests/protocol-tests-amqp-1-0/src/main/java/org/apache/qpid/tests/protocol/v1_0/Interaction.java
@@ -174,6 +174,7 @@ public class Interaction extends AbstractInteraction<Interaction>
     // Protocol Negotiation //
     /////////////////////////
 
+    @Override
     public Interaction protocolHeader(byte[] header)
     {
         _protocolHeader = header;

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/da92ba96/systests/protocol-tests-core/src/main/java/org/apache/qpid/tests/protocol/AbstractFrameTransport.java
----------------------------------------------------------------------
diff --git a/systests/protocol-tests-core/src/main/java/org/apache/qpid/tests/protocol/AbstractFrameTransport.java b/systests/protocol-tests-core/src/main/java/org/apache/qpid/tests/protocol/AbstractFrameTransport.java
index cad8415..91b0454 100644
--- a/systests/protocol-tests-core/src/main/java/org/apache/qpid/tests/protocol/AbstractFrameTransport.java
+++ b/systests/protocol-tests-core/src/main/java/org/apache/qpid/tests/protocol/AbstractFrameTransport.java
@@ -131,6 +131,11 @@ public abstract class AbstractFrameTransport<I extends AbstractInteraction<I>> i
 
     ListenableFuture<Void> sendProtocolHeader(final byte[] bytes) throws Exception
     {
+        return sendBytes(bytes);
+    }
+
+    public ListenableFuture<Void> sendBytes(final byte[] bytes)
+    {
         Preconditions.checkState(_channel != null, "Not connected");
         ChannelPromise promise = _channel.newPromise();
         ByteBuf buffer = ByteBufAllocator.DEFAULT.buffer();

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/da92ba96/systests/protocol-tests-core/src/main/java/org/apache/qpid/tests/protocol/AbstractInteraction.java
----------------------------------------------------------------------
diff --git a/systests/protocol-tests-core/src/main/java/org/apache/qpid/tests/protocol/AbstractInteraction.java b/systests/protocol-tests-core/src/main/java/org/apache/qpid/tests/protocol/AbstractInteraction.java
index 4b41ca9..2c977f3 100644
--- a/systests/protocol-tests-core/src/main/java/org/apache/qpid/tests/protocol/AbstractInteraction.java
+++ b/systests/protocol-tests-core/src/main/java/org/apache/qpid/tests/protocol/AbstractInteraction.java
@@ -141,6 +141,8 @@ public abstract class AbstractInteraction<I extends AbstractInteraction<I>>
         return _transport;
     }
 
+    public abstract I protocolHeader(final byte[] header);
+
     protected abstract byte[] getProtocolHeader();
 
     private I getInteraction()


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[2/5] qpid-broker-j git commit: QPID-8038: [Broker-J] [AMQP 0-x] Add connection protocol tests related to SASL.

Posted by or...@apache.org.
QPID-8038: [Broker-J] [AMQP 0-x] Add connection protocol tests related to SASL.

(cherry picked from commit cd13129adff47932b2e26e4a33a9bcba27c661ce)


Project: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/commit/8f680024
Tree: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/tree/8f680024
Diff: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/diff/8f680024

Branch: refs/heads/7.0.x
Commit: 8f6800248d8949bf353ac4787492f4404db519ca
Parents: c39cf07
Author: Keith Wall <kw...@apache.org>
Authored: Sat Jan 6 22:34:15 2018 +0000
Committer: Alex Rudyy <or...@apache.org>
Committed: Wed Jan 10 17:30:11 2018 +0000

----------------------------------------------------------------------
 .../v1_0/transport/security/sasl/SaslTest.java  | 19 +--------
 .../apache/qpid/tests/protocol/SaslUtils.java   | 41 ++++++++++++++++++++
 2 files changed, 43 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/8f680024/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/transport/security/sasl/SaslTest.java
----------------------------------------------------------------------
diff --git a/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/transport/security/sasl/SaslTest.java b/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/transport/security/sasl/SaslTest.java
index ee657f3..0eac112 100644
--- a/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/transport/security/sasl/SaslTest.java
+++ b/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/transport/security/sasl/SaslTest.java
@@ -20,6 +20,7 @@
 
 package org.apache.qpid.tests.protocol.v1_0.transport.security.sasl;
 
+import static org.apache.qpid.tests.protocol.SaslUtils.generateCramMD5ClientResponse;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.hasItem;
@@ -32,10 +33,6 @@ import java.net.InetSocketAddress;
 import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 
-import javax.crypto.Mac;
-import javax.crypto.spec.SecretKeySpec;
-import javax.xml.bind.DatatypeConverter;
-
 import org.junit.Before;
 import org.junit.Test;
 
@@ -169,7 +166,7 @@ public class SaslTest extends BrokerAdminUsingTestBase
             assertThat(saslChallenge.getChallenge(), is(notNullValue()));
 
             byte[] response = generateCramMD5ClientResponse(_username, _password,
-                                                            saslChallenge.getChallenge().getArray());
+                                                                      saslChallenge.getChallenge().getArray());
 
             final SaslOutcome saslOutcome = interaction.saslResponseResponse(new Binary(response))
                                                        .saslResponse()
@@ -324,16 +321,4 @@ public class SaslTest extends BrokerAdminUsingTestBase
             transport.assertNoMoreResponsesAndChannelClosed();
         }
     }
-
-    private static byte[] generateCramMD5ClientResponse(String userName, String userPassword, byte[] challengeBytes)
-            throws Exception
-    {
-        String macAlgorithm = "HmacMD5";
-        Mac mac = Mac.getInstance(macAlgorithm);
-        mac.init(new SecretKeySpec(userPassword.getBytes(StandardCharsets.UTF_8), macAlgorithm));
-        final byte[] messageAuthenticationCode = mac.doFinal(challengeBytes);
-        String responseAsString = userName + " " + DatatypeConverter.printHexBinary(messageAuthenticationCode)
-                                                                    .toLowerCase();
-        return responseAsString.getBytes();
-    }
 }

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/8f680024/systests/protocol-tests-core/src/main/java/org/apache/qpid/tests/protocol/SaslUtils.java
----------------------------------------------------------------------
diff --git a/systests/protocol-tests-core/src/main/java/org/apache/qpid/tests/protocol/SaslUtils.java b/systests/protocol-tests-core/src/main/java/org/apache/qpid/tests/protocol/SaslUtils.java
new file mode 100644
index 0000000..5833599
--- /dev/null
+++ b/systests/protocol-tests-core/src/main/java/org/apache/qpid/tests/protocol/SaslUtils.java
@@ -0,0 +1,41 @@
+/*
+ * 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.tests.protocol;
+
+import java.nio.charset.StandardCharsets;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+import javax.xml.bind.DatatypeConverter;
+
+public class SaslUtils
+{
+    public static byte[] generateCramMD5ClientResponse(String userName, String userPassword, byte[] challengeBytes)
+            throws Exception
+    {
+        String macAlgorithm = "HmacMD5";
+        Mac mac = Mac.getInstance(macAlgorithm);
+        mac.init(new SecretKeySpec(userPassword.getBytes(StandardCharsets.UTF_8), macAlgorithm));
+        final byte[] messageAuthenticationCode = mac.doFinal(challengeBytes);
+        String responseAsString = userName + " " + DatatypeConverter.printHexBinary(messageAuthenticationCode)
+                                                                    .toLowerCase();
+        return responseAsString.getBytes();
+    }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[3/5] qpid-broker-j git commit: QPID-8038: [Broker-J] [AMQP 1.0] Add SASL protocol test ensuring that empty SASL frames are rejected

Posted by or...@apache.org.
QPID-8038: [Broker-J] [AMQP 1.0]  Add SASL protocol test ensuring that empty SASL frames are rejected

(cherry picked from commit 7d5a86962837103a7a75f92dca5e35220cb89668)


Project: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/commit/041674dd
Tree: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/tree/041674dd
Diff: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/diff/041674dd

Branch: refs/heads/7.0.x
Commit: 041674ddbf2b1ae693f51d7e2cd9f9025a268632
Parents: 8f68002
Author: Keith Wall <kw...@apache.org>
Authored: Wed Jan 10 11:55:51 2018 +0000
Committer: Alex Rudyy <or...@apache.org>
Committed: Wed Jan 10 17:30:34 2018 +0000

----------------------------------------------------------------------
 .../qpid/tests/protocol/v1_0/Interaction.java    | 11 ++++++++++-
 .../v1_0/transport/security/sasl/SaslTest.java   | 19 +++++++++++++++++++
 2 files changed, 29 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/041674dd/systests/protocol-tests-amqp-1-0/src/main/java/org/apache/qpid/tests/protocol/v1_0/Interaction.java
----------------------------------------------------------------------
diff --git a/systests/protocol-tests-amqp-1-0/src/main/java/org/apache/qpid/tests/protocol/v1_0/Interaction.java b/systests/protocol-tests-amqp-1-0/src/main/java/org/apache/qpid/tests/protocol/v1_0/Interaction.java
index 832ad4d..fc84389 100644
--- a/systests/protocol-tests-amqp-1-0/src/main/java/org/apache/qpid/tests/protocol/v1_0/Interaction.java
+++ b/systests/protocol-tests-amqp-1-0/src/main/java/org/apache/qpid/tests/protocol/v1_0/Interaction.java
@@ -86,6 +86,10 @@ public class Interaction extends AbstractInteraction<Interaction>
         throw new UnsupportedOperationException();
     };
 
+    private static final SaslFrameBody SASL_EMPTY_FRAME = (channel, conn) -> {
+        throw new UnsupportedOperationException();
+    };
+
     private static final Set<String> CONTAINER_IDS = Collections.newSetFromMap(new ConcurrentHashMap<>());
     private final Begin _begin;
     private final End _end;
@@ -204,6 +208,12 @@ public class Interaction extends AbstractInteraction<Interaction>
         return this;
     }
 
+    public Interaction saslEmptyFrame() throws Exception
+    {
+        sendPerformative(SASL_EMPTY_FRAME);
+        return this;
+    }
+
     private SaslInit copySaslInit(final SaslInit saslInit)
     {
         final SaslInit saslInitCopy = new SaslInit();
@@ -1089,5 +1099,4 @@ public class Interaction extends AbstractInteraction<Interaction>
         sendPerformative(EMPTY_FRAME, UnsignedShort.ZERO);
         return this;
     }
-
 }

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/041674dd/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/transport/security/sasl/SaslTest.java
----------------------------------------------------------------------
diff --git a/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/transport/security/sasl/SaslTest.java b/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/transport/security/sasl/SaslTest.java
index 0eac112..0931b1b 100644
--- a/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/transport/security/sasl/SaslTest.java
+++ b/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/transport/security/sasl/SaslTest.java
@@ -321,4 +321,23 @@ public class SaslTest extends BrokerAdminUsingTestBase
             transport.assertNoMoreResponsesAndChannelClosed();
         }
     }
+
+    @Test
+    @SpecificationTest(section = "5.3.1", description = "Receipt of an empty frame is an irrecoverable error.")
+    public void emptyFramesDisallowed() throws Exception
+    {
+        final InetSocketAddress addr = getBrokerAdmin().getBrokerAddress(BrokerAdmin.PortType.AMQP);
+        try (FrameTransport transport = new FrameTransport(addr, true).connect())
+        {
+            transport.newInteraction()
+                     .protocolHeader(SASL_AMQP_HEADER_BYTES)
+                     .negotiateProtocol()
+                     .saslEmptyFrame()
+                     .consumeResponse(byte[].class)
+                     .consumeResponse(SaslMechanisms.class)
+                     .sync();
+
+            transport.assertNoMoreResponsesAndChannelClosed();
+        }
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org