blob: 7d8e186b92cc79568bfc6abd5a3138a3359db293 [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;
using System.Collections.Generic;
using System.IO;
using Apache.Qpid.Proton.Buffer;
using Apache.Qpid.Proton.Codec;
using Apache.Qpid.Proton.Test.Driver;
using Apache.Qpid.Proton.Types.Messaging;
using NUnit.Framework;
namespace Apache.Qpid.Proton.Engine.Implementation
{
public abstract class ProtonEngineTestSupport
{
protected IList<IProtonBuffer> engineWrites = new List<IProtonBuffer>();
protected Exception failure;
protected string name;
protected readonly IDecoder decoder = CodecFactory.DefaultDecoder;
protected IDecoderState decoderState;
protected readonly IEncoder encoder = CodecFactory.DefaultEncoder;
protected IEncoderState encoderState;
protected Random rand;
protected int randSeed;
[OneTimeSetUp]
public void OneTimeSetup()
{
decoderState = decoder.NewDecoderState();
encoderState = encoder.NewEncoderState();
}
[SetUp]
public void SetUp()
{
failure = null;
name = TestContext.CurrentContext.Test.Name;
decoderState.Reset();
encoderState.Reset();
randSeed = Environment.TickCount;
rand = new Random(randSeed);
}
[TearDown]
public void TearDown()
{
}
protected ProtonTestConnector CreateTestPeer(IEngine engine)
{
ProtonTestConnector peer = new ProtonTestConnector(stream =>
{
if (stream is MemoryStream mem)
{
engine.Ingest(ProtonByteBufferAllocator.Instance.Wrap(mem.ToArray()));
}
else
{
byte[] bytes = new byte[stream.Length - stream.Position];
stream.Read(bytes, 0, bytes.Length);
engine.Ingest(ProtonByteBufferAllocator.Instance.Wrap(bytes));
}
});
engine.OutputHandler(buffer =>
{
peer.Ingest(new ProtonBufferInputStream(buffer));
});
return peer;
}
protected ProtonTestConnector CreateTestPeer(IEngine engine, Queue<Action> asyncIOCallback)
{
ProtonTestConnector peer = new ProtonTestConnector(stream =>
{
if (stream is MemoryStream mem)
{
engine.Ingest(ProtonByteBufferAllocator.Instance.Wrap(mem.ToArray()));
}
else
{
byte[] bytes = new byte[stream.Length - stream.Position];
stream.Read(bytes, 0, bytes.Length);
engine.Ingest(ProtonByteBufferAllocator.Instance.Wrap(bytes));
}
});
engine.OutputHandler((buffer, asyncCallback) =>
{
if (asyncCallback != null)
{
asyncIOCallback.Enqueue(asyncCallback);
}
peer.Ingest(new ProtonBufferInputStream(buffer));
});
return peer;
}
protected static IProtonBuffer CreateContentBuffer(uint length)
{
Random rand = new Random(Environment.TickCount);
byte[] payload = new byte[length];
for (uint i = 0; i < length; i++)
{
payload[i] = (byte)(64 + 1 + rand.Next(9));
}
return ProtonByteBufferAllocator.Instance.Wrap(payload);
}
protected static byte[] CreateEncodedMessage(ISection body)
{
IEncoder encoder = CodecFactory.Encoder;
IProtonBuffer buffer = ProtonByteBufferAllocator.Instance.Allocate();
encoder.WriteObject(buffer, encoder.NewEncoderState(), body);
byte[] result = new byte[buffer.ReadableBytes];
buffer.CopyInto(0, result, 0, result.Length);
return result;
}
protected uint CountElements<T>(IEnumerable<T> enumerable)
{
uint count = 0;
foreach (T element in enumerable)
{
count++;
}
return count;
}
}
}