qpid-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From oru...@apache.org
Subject [4/5] qpid-broker-j git commit: QPID-8038: [Broker-J] [AMQP 0-x] Add tests related to protocol negotiation and oevrsized frames.
Date Wed, 10 Jan 2018 17:38:20 GMT
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 <kwall@apache.org>
Authored: Wed Jan 3 13:31:50 2018 +0000
Committer: Alex Rudyy <orudyy@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


Mime
View raw message