blob: ca9465ba09cfe46831be69403ca9c4796f266e1b [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 Apache.Qpid.Proton.Test.Driver.Codec.Messaging;
using Apache.Qpid.Proton.Test.Driver.Codec.Primitives;
using Apache.Qpid.Proton.Test.Driver.Codec.Transactions;
using Apache.Qpid.Proton.Test.Driver.Codec.Transport;
namespace Apache.Qpid.Proton.Test.Driver.Actions
{
/// <summary>
/// Action type used to inject the AMQP Performative into a test script to
/// drive the AMQP connection lifecycle.
/// </summary>
public class DispositionInjectAction : AbstractPerformativeInjectAction<Disposition>
{
private readonly Disposition disposition = new();
private readonly DeliveryStateBuilder stateBuilder;
public DispositionInjectAction(AMQPTestDriver driver) : base(driver)
{
this.stateBuilder = new DeliveryStateBuilder(this);
}
public override Disposition Performative => disposition;
public DispositionInjectAction FromSender()
{
disposition.Role = Role.Sender;
return this;
}
public DispositionInjectAction FromReceiver()
{
disposition.Role = Role.Receiver;
return this;
}
public DispositionInjectAction WithRole(bool role)
{
disposition.Role = RoleExtension.Lookup(role);
return this;
}
public DispositionInjectAction WithRole(Role role)
{
disposition.Role = role;
return this;
}
public DispositionInjectAction WithFirst(uint first)
{
disposition.First = first;
return this;
}
public DispositionInjectAction WithLast(uint last)
{
disposition.Last = last;
return this;
}
public DispositionInjectAction WithSettled(bool settled)
{
disposition.Settled = settled;
return this;
}
public DeliveryStateBuilder WithState()
{
return stateBuilder;
}
public DispositionInjectAction WithState(IDeliveryState state)
{
disposition.State = state;
return this;
}
public DispositionInjectAction WithBatchable(bool batchable)
{
disposition.Batchable = batchable;
return this;
}
#region Builders for Delivery State types
public sealed class DeliveryStateBuilder
{
private readonly DispositionInjectAction action;
public DeliveryStateBuilder(DispositionInjectAction action)
{
this.action = action;
}
public DispositionInjectAction Accepted()
{
return action.WithState(new Accepted());
}
public DispositionInjectAction Released()
{
return action.WithState(new Released());
}
public DispositionInjectAction Rejected()
{
return action.WithState(new Rejected());
}
public DispositionInjectAction Rejected(string condition, string description)
{
Rejected rejected = new()
{
Error = new ErrorCondition(new Symbol(condition), description)
};
return action.WithState(rejected);
}
public DispositionInjectAction Modified()
{
return action.WithState(new Modified());
}
public DispositionInjectAction Modified(bool failed)
{
Modified modified = new()
{
DeliveryFailed = failed
};
return action.WithState(modified);
}
public DispositionInjectAction Modified(bool failed, bool undeliverableHere)
{
Modified modified = new()
{
DeliveryFailed = failed,
UndeliverableHere = undeliverableHere
};
return action.WithState(modified);
}
public TransactionalStateBuilder Transactional()
{
TransactionalStateBuilder builder = new(action);
action.WithState(builder.State());
return builder;
}
}
public sealed class TransactionalStateBuilder
{
private readonly DispositionInjectAction action;
private readonly TransactionalState state = new();
public TransactionalStateBuilder(DispositionInjectAction action)
{
this.action = action;
}
public TransactionalState State()
{
return state;
}
public DispositionInjectAction Also()
{
return action;
}
public DispositionInjectAction And()
{
return action;
}
public TransactionalStateBuilder WithTxnId(byte[] txnId)
{
state.TxnId = new Binary(txnId);
return this;
}
public TransactionalStateBuilder WithTxnId(Binary txnId)
{
state.TxnId = txnId;
return this;
}
public TransactionalStateBuilder WithOutcome(IOutcome outcome)
{
state.Outcome = outcome;
return this;
}
public TransactionalStateBuilder WithAccepted()
{
return WithOutcome(new Accepted());
}
public TransactionalStateBuilder WithReleased()
{
return WithOutcome(new Released());
}
public TransactionalStateBuilder WithRejected()
{
return WithOutcome(new Rejected());
}
public TransactionalStateBuilder WithRejected(string condition, string description)
{
Rejected rejected = new()
{
Error = new ErrorCondition(new Symbol(condition), description)
};
return WithOutcome(rejected);
}
public TransactionalStateBuilder WithModified()
{
return WithOutcome(new Modified());
}
public TransactionalStateBuilder WithModified(bool failed)
{
Modified modified = new()
{
DeliveryFailed = failed
};
return WithOutcome(modified);
}
public TransactionalStateBuilder WithModified(bool failed, bool undeliverableHere)
{
Modified modified = new()
{
DeliveryFailed = failed,
UndeliverableHere = undeliverableHere
};
return WithOutcome(modified);
}
}
#endregion
}
}