blob: b4f7958d029dd2e274fa9451e6a6cd0d9ef3ae8d [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.
*/
package org.apache.qpid.protonj2.test.driver.actions;
import org.apache.qpid.protonj2.test.driver.AMQPTestDriver;
import org.apache.qpid.protonj2.test.driver.SessionTracker;
import org.apache.qpid.protonj2.test.driver.codec.messaging.Accepted;
import org.apache.qpid.protonj2.test.driver.codec.messaging.Modified;
import org.apache.qpid.protonj2.test.driver.codec.messaging.Rejected;
import org.apache.qpid.protonj2.test.driver.codec.messaging.Released;
import org.apache.qpid.protonj2.test.driver.codec.primitives.Binary;
import org.apache.qpid.protonj2.test.driver.codec.primitives.Symbol;
import org.apache.qpid.protonj2.test.driver.codec.primitives.UnsignedInteger;
import org.apache.qpid.protonj2.test.driver.codec.primitives.UnsignedShort;
import org.apache.qpid.protonj2.test.driver.codec.transactions.TransactionalState;
import org.apache.qpid.protonj2.test.driver.codec.transport.DeliveryState;
import org.apache.qpid.protonj2.test.driver.codec.transport.Disposition;
import org.apache.qpid.protonj2.test.driver.codec.transport.ErrorCondition;
import org.apache.qpid.protonj2.test.driver.codec.transport.Role;
/**
* AMQP Disposition injection action which can be added to a driver for write at a specific time or
* following on from some other action in the test script.
*/
public class DispositionInjectAction extends AbstractPerformativeInjectAction<Disposition> {
private final Disposition disposition = new Disposition();
private final DeliveryStateBuilder stateBuilder = new DeliveryStateBuilder();
public DispositionInjectAction(AMQPTestDriver driver) {
super(driver);
}
@Override
public Disposition getPerformative() {
return disposition;
}
public DispositionInjectAction withRole(boolean role) {
disposition.setRole(role);
return this;
}
public DispositionInjectAction withRole(Boolean role) {
disposition.setRole(role);
return this;
}
public DispositionInjectAction withRole(Role role) {
disposition.setRole(role.getValue());
return this;
}
public DispositionInjectAction withFirst(int first) {
disposition.setFirst(UnsignedInteger.valueOf(first));
return this;
}
public DispositionInjectAction withFirst(long first) {
disposition.setFirst(UnsignedInteger.valueOf(first));
return this;
}
public DispositionInjectAction withFirst(UnsignedInteger first) {
disposition.setFirst(first);
return this;
}
public DispositionInjectAction withLast(int last) {
disposition.setLast(UnsignedInteger.valueOf(last));
return this;
}
public DispositionInjectAction withLast(long last) {
disposition.setLast(UnsignedInteger.valueOf(last));
return this;
}
public DispositionInjectAction withLast(UnsignedInteger last) {
disposition.setLast(last);
return this;
}
public DispositionInjectAction withSettled(boolean settled) {
disposition.setSettled(settled);
return this;
}
public DeliveryStateBuilder withState() {
return stateBuilder;
}
public DispositionInjectAction withState(DeliveryState state) {
disposition.setState(state);
return this;
}
public DispositionInjectAction withBatchable(boolean batchable) {
disposition.setBatchable(batchable);
return this;
}
@Override
protected void beforeActionPerformed(AMQPTestDriver driver) {
// We fill in a channel using the next available channel id if one isn't set, then
// report the outbound begin to the session so it can track this new session.
final SessionTracker session;
if (onChannel() == CHANNEL_UNSET) {
session = driver.sessions().getLastLocallyOpenedSession();
onChannel(session.getLocalChannel().intValue());
} else {
session = driver.sessions().getSessionFromLocalChannel(UnsignedShort.valueOf(onChannel()));
}
if (session != null) {
session.handleLocalDisposition(disposition);
}
}
public final class DeliveryStateBuilder {
public DispositionInjectAction accepted() {
withState(Accepted.getInstance());
return DispositionInjectAction.this;
}
public DispositionInjectAction released() {
withState(Released.getInstance());
return DispositionInjectAction.this;
}
public DispositionInjectAction rejected() {
withState(new Rejected());
return DispositionInjectAction.this;
}
public DispositionInjectAction rejected(String condition, String description) {
withState(new Rejected().setError(new ErrorCondition(Symbol.valueOf(condition), description)));
return DispositionInjectAction.this;
}
public DispositionInjectAction modified() {
withState(new Modified());
return DispositionInjectAction.this;
}
public DispositionInjectAction modified(boolean failed) {
withState(new Modified().setDeliveryFailed(failed));
return DispositionInjectAction.this;
}
public DispositionInjectAction modified(boolean failed, boolean undeliverableHere) {
withState(new Modified().setDeliveryFailed(failed).setUndeliverableHere(undeliverableHere));
return DispositionInjectAction.this;
}
public TransactionalStateBuilder transactional() {
TransactionalStateBuilder builder = new TransactionalStateBuilder(DispositionInjectAction.this);
withState(builder.getState());
return builder;
}
}
//----- Provide a complex builder for Transactional DeliveryState
public static class TransactionalStateBuilder {
private final DispositionInjectAction action;
private final TransactionalState state = new TransactionalState();
public TransactionalStateBuilder(DispositionInjectAction action) {
this.action = action;
}
public TransactionalState getState() {
return state;
}
public DispositionInjectAction also() {
return action;
}
public DispositionInjectAction and() {
return action;
}
public TransactionalStateBuilder withTxnId(byte[] txnId) {
state.setTxnId(new Binary(txnId));
return this;
}
public TransactionalStateBuilder withTxnId(Binary txnId) {
state.setTxnId(txnId);
return this;
}
public TransactionalStateBuilder withOutcome(DeliveryState outcome) {
state.setOutcome(outcome);
return this;
}
// ----- Add a layer to allow configuring the outcome without specific type dependencies
public TransactionalStateBuilder withAccepted() {
withOutcome(Accepted.getInstance());
return this;
}
public TransactionalStateBuilder withReleased() {
withOutcome(Released.getInstance());
return this;
}
public TransactionalStateBuilder withRejected() {
withOutcome(new Rejected());
return this;
}
public TransactionalStateBuilder withRejected(String condition, String description) {
withOutcome(new Rejected().setError(new ErrorCondition(Symbol.valueOf(condition), description)));
return this;
}
public TransactionalStateBuilder withModified() {
withOutcome(new Modified());
return this;
}
public TransactionalStateBuilder withModified(boolean failed) {
withOutcome(new Modified().setDeliveryFailed(failed));
return this;
}
public TransactionalStateBuilder withModified(boolean failed, boolean undeliverableHere) {
withOutcome(new Modified().setDeliveryFailed(failed).setUndeliverableHere(undeliverableHere));
return this;
}
}
}