blob: d9806e9e4877f314f09333e3fc7384dcd8da31cf [file] [log] [blame]
/*
* 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.
*/
using System.Collections.Generic;
using System.IO;
using Apache.Qpid.Proton.Test.Driver.Codec.Transport;
using Apache.Qpid.Proton.Test.Driver.Exceptions;
using NUnit.Framework;
namespace Apache.Qpid.Proton.Test.Driver
{
[TestFixture, Timeout(20000)]
public class ProtonTestConnectorTests : ProtonBaseTestFixture
{
[Test]
public void TestCreateConnectorAndIngestFailsWhenNoExpectationsSet()
{
Stream frame = null; // Unused in this context as connector won't produce output
ProtonTestConnector connector =
new ProtonTestConnector((outputFrame) => frame = outputFrame, loggerFactory);
Assert.IsNotNull(connector.Driver);
connector.Ingest(new MemoryStream(AMQPHeader.Header.ToArray()));
Assert.IsNull(frame);
Assert.Throws<AssertionError>(() => connector.WaitForScriptToComplete());
}
[Test]
public void TestCreateConnectorAndIngestHeaderAsScripted()
{
Stream frame = null;
ProtonTestConnector connector = new ProtonTestConnector((outputFrame) => frame = outputFrame);
connector.ExpectAMQPHeader();
connector.Ingest(new MemoryStream(AMQPHeader.Header.ToArray()));
Assert.IsNull(frame);
Assert.DoesNotThrow(() => connector.WaitForScriptToComplete());
}
[Test]
public void TestConnectTwoTestConnectorsAndExchangeHeaders()
{
ProtonTestConnector server = new ProtonTestConnector();
ProtonTestConnector client = new ProtonTestConnector(server.Ingest);
server.ConnectorFrameSink(client.Ingest);
server.ExpectAMQPHeader().RespondWithAMQPHeader();
client.ExpectAMQPHeader();
client.RemoteHeader(AMQPHeader.Header).Now();
server.WaitForScriptToComplete();
client.WaitForScriptToComplete();
}
[Test]
public void TestServerProcessesHeaderAndEmptyOpenFrame()
{
// Frame data for: Open
// Open{ containerId="", hostname='null', maxFrameSize=4294967295, channelMax=65535,
// idleTimeOut=null, outgoingLocales=null, incomingLocales=null, offeredCapabilities=null,
// desiredCapabilities=null, properties=null}
byte[] emptyOpen = new byte[] { 0, 0, 0, 16, 2, 0, 0, 0, 0, 83, 16, 192, 3, 1, 161, 0 };
ProtonTestConnector server = new ProtonTestConnector();
ProtonTestConnector client = new ProtonTestConnector(server.Ingest);
server.ConnectorFrameSink(client.Ingest);
server.ExpectAMQPHeader().RespondWithAMQPHeader();
server.ExpectOpen().WithContainerId("");
client.ExpectAMQPHeader();
client.RemoteHeader(AMQPHeader.Header).Now();
client.RemoteBytes().WithBytes(emptyOpen).Now();
server.WaitForScriptToComplete();
client.WaitForScriptToComplete();
}
[Test]
public void TestServerProcessHeaderAndSimpleOpenFrame()
{
// Frame data for: Open
// Open{ containerId='container', hostname='localhost', maxFrameSize=16384, channelMax=65535,
// idleTimeOut=30000, outgoingLocales=null, incomingLocales=null, offeredCapabilities=null,
// desiredCapabilities=null, properties=null}
byte[] basicOpen = new byte[] {0, 0, 0, 49, 2, 0, 0, 0, 0, 83, 16, 192, 36, 5, 161, 9, 99, 111,
110, 116, 97, 105, 110, 101, 114, 161, 9, 108, 111, 99, 97, 108,
104, 111, 115, 116, 112, 0, 0, 64, 0, 96, 255, 255, 112, 0, 0, 117, 48};
ProtonTestConnector server = new ProtonTestConnector();
ProtonTestConnector client = new ProtonTestConnector(server.Ingest);
server.ConnectorFrameSink(client.Ingest);
server.ExpectAMQPHeader().RespondWithAMQPHeader();
server.ExpectOpen().WithContainerId("container")
.WithHostname("localhost")
.WithMaxFrameSize(16384u)
.WithChannelMax(65535)
.WithIdleTimeOut(30000u);
client.ExpectAMQPHeader();
client.RemoteHeader(AMQPHeader.Header).Now();
client.RemoteBytes().WithBytes(basicOpen).Now();
server.WaitForScriptToComplete();
client.WaitForScriptToComplete();
}
[Test]
public void TestServerProcessHeaderAnComplexOpenFrame()
{
// Frame data for: Open
// Open{ containerId='container', hostname='localhost', maxFrameSize=16384, channelMax=65535,
// idleTimeOut=36000, outgoingLocales=null, incomingLocales=null, offeredCapabilities=[SOMETHING],
// desiredCapabilities=[ANONYMOUS-RELAY, DELAYED-DELIVERY], properties={queue-prefix=queue://}}
byte[] completeOpen = new byte[] {0, 0, 0, 129, 2, 0, 0, 0, 0, 83, 16, 192, 116, 10, 161, 9, 99, 111,
110, 116, 97, 105, 110, 101, 114, 161, 9, 108, 111, 99, 97, 108, 104,
111, 115, 116, 112, 0, 0, 64, 0, 96, 255, 255, 112, 0, 0, 140, 160,
64, 64, 224, 12, 1, 163, 9, 83, 79, 77, 69, 84, 72, 73, 78, 71, 224,
35, 2, 163, 15, 65, 78, 79, 78, 89, 77, 79, 85, 83, 45, 82, 69, 76,
65, 89, 16, 68, 69, 76, 65, 89, 69, 68, 45, 68, 69, 76, 73, 86, 69,
82, 89, 193, 25, 2, 163, 12, 113, 117, 101, 117, 101, 45, 112, 114,
101, 102, 105, 120, 161, 8, 113, 117, 101, 117, 101, 58, 47, 47};
ProtonTestConnector server = new ProtonTestConnector();
ProtonTestConnector client = new ProtonTestConnector(server.Ingest);
server.ConnectorFrameSink(client.Ingest);
// Expectation should convert this to symbol keyed map expectation along with the
// offered and desired capabilities values passed below which should be converted
// to symbol array expectations.
IDictionary<string, object> expectedProperties = new Dictionary<string, object>();
expectedProperties.Add("queue-prefix", "queue://");
server.ExpectAMQPHeader().RespondWithAMQPHeader();
server.ExpectOpen().WithContainerId("container")
.WithHostname("localhost")
.WithMaxFrameSize(16384u)
.WithChannelMax(65535)
.WithIdleTimeOut(36000u)
.WithOfferedCapabilities("SOMETHING")
.WithDesiredCapabilities("ANONYMOUS-RELAY", "DELAYED-DELIVERY");
// TODO Matchers must be smarter
// .WithProperties(expectedProperties);
client.ExpectAMQPHeader();
client.RemoteHeader(AMQPHeader.Header).Now();
client.RemoteBytes().WithBytes(completeOpen).Now();
server.WaitForScriptToComplete();
client.WaitForScriptToComplete();
}
}
}