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