use of com.swiftmq.amqp.v100.client.Session in project qpid-protonj2 by apache.
the class ReceiverTest method tryReadDynamicReceiverAddress.
private void tryReadDynamicReceiverAddress(boolean attachResponse) throws Exception {
try (ProtonTestServer peer = new ProtonTestServer()) {
peer.expectSASLAnonymousConnect();
peer.expectOpen().respond();
peer.expectBegin().respond();
peer.expectAttach().withRole(Role.RECEIVER.getValue()).withSource().withDynamic(true).withAddress((String) null);
peer.expectFlow();
peer.start();
URI remoteURI = peer.getServerURI();
LOG.info("Test started, peer listening on: {}", remoteURI);
Client container = Client.create();
ConnectionOptions options = new ConnectionOptions().openTimeout(100);
Connection connection = container.connect(remoteURI.getHost(), remoteURI.getPort(), options);
connection.openFuture().get();
Session session = connection.openSession();
session.openFuture().get();
Receiver receiver = session.openDynamicReceiver();
peer.waitForScriptToComplete(5, TimeUnit.SECONDS);
if (attachResponse) {
peer.expectDetach().respond();
peer.respondToLastAttach().withSource().withAddress("test-dynamic-node").and().later(10);
} else {
peer.expectDetach();
}
if (attachResponse) {
assertNotNull(receiver.address(), "Remote should have assigned the address for the dynamic receiver");
assertEquals("test-dynamic-node", receiver.address());
} else {
try {
receiver.address();
fail("Should failed to get address due to no attach response");
} catch (ClientException ex) {
LOG.debug("Caught expected exception from address call", ex);
}
}
try {
receiver.closeAsync().get();
} catch (ExecutionException ex) {
LOG.debug("Caught unexpected exception from close call", ex);
fail("Should not fail to close when connection not closed and detach sent");
}
peer.expectClose().respond();
connection.closeAsync().get();
peer.waitForScriptToComplete(5, TimeUnit.SECONDS);
}
}
use of com.swiftmq.amqp.v100.client.Session in project qpid-protonj2 by apache.
the class ReceiverTest method testReceiverAddCreditOnAbortedTransferWhenNeeded.
@Test
public void testReceiverAddCreditOnAbortedTransferWhenNeeded() throws Exception {
try (ProtonTestServer peer = new ProtonTestServer()) {
peer.expectSASLAnonymousConnect();
peer.expectOpen().respond();
peer.expectBegin().respond();
peer.expectAttach().withRole(Role.RECEIVER.getValue()).respond();
peer.expectFlow();
peer.start();
URI remoteURI = peer.getServerURI();
LOG.info("Test started, peer listening on: {}", remoteURI);
Client container = Client.create();
Connection connection = container.connect(remoteURI.getHost(), remoteURI.getPort());
Session session = connection.openSession();
ReceiverOptions options = new ReceiverOptions();
options.creditWindow(1);
final Receiver receiver = session.openReceiver("test-queue", options);
receiver.openFuture().get();
final byte[] payload = createEncodedMessage(new AmqpValue<>("Hello World"));
peer.remoteTransfer().withHandle(0).withDeliveryId(0).withDeliveryTag(new byte[] { 1 }).withMore(true).withMessageFormat(0).withPayload(payload).now();
assertNull(receiver.tryReceive());
peer.expectFlow();
peer.remoteTransfer().withHandle(0).withDeliveryId(1).withMessageFormat(0).withMore(false).withPayload(payload).queue();
peer.expectDisposition().withSettled(true).withState().accepted();
peer.expectFlow();
peer.expectDetach().respond();
peer.expectClose().respond();
// Send final aborted transfer to complete first transfer and allow next to commence.
peer.remoteTransfer().withHandle(0).withDeliveryId(0).withMore(false).withAborted(true).withMessageFormat(0).withPayload(payload).now();
Delivery delivery = receiver.receive();
assertNotNull(delivery);
Message<?> received = delivery.message();
assertNotNull(received);
assertTrue(received.body() instanceof String);
String value = (String) received.body();
assertEquals("Hello World", value);
receiver.closeAsync();
connection.closeAsync().get();
peer.waitForScriptToComplete(5, TimeUnit.SECONDS);
}
}
use of com.swiftmq.amqp.v100.client.Session in project qpid-protonj2 by apache.
the class ReceiverTest method testDrainFutureSignalsFailureWhenDrainTimeoutExceeded.
@Test
public void testDrainFutureSignalsFailureWhenDrainTimeoutExceeded() throws Exception {
try (ProtonTestServer peer = new ProtonTestServer()) {
peer.expectSASLAnonymousConnect();
peer.expectOpen().respond();
peer.expectBegin().respond();
peer.expectAttach().ofReceiver().respond();
peer.expectFlow();
peer.expectFlow().withDrain(true);
peer.expectClose().respond();
peer.start();
URI remoteURI = peer.getServerURI();
LOG.info("Test started, peer listening on: {}", remoteURI);
Client container = Client.create();
Connection connection = container.connect(remoteURI.getHost(), remoteURI.getPort());
Session session = connection.openSession();
ReceiverOptions receiverOptions = new ReceiverOptions().drainTimeout(15);
Receiver receiver = session.openReceiver("test-queue", receiverOptions).openFuture().get();
try {
receiver.drain().get();
fail("Drain call should fail timeout exceeded.");
} catch (ExecutionException cliEx) {
LOG.debug("Receiver threw error on drain call", cliEx);
assertTrue(cliEx.getCause() instanceof ClientOperationTimedOutException);
}
connection.closeAsync().get();
peer.waitForScriptToComplete(5, TimeUnit.SECONDS);
}
}
use of com.swiftmq.amqp.v100.client.Session in project qpid-protonj2 by apache.
the class ReceiverTest method testReceiverOpenRejectedByRemote.
@Test
public void testReceiverOpenRejectedByRemote() throws Exception {
try (ProtonTestServer peer = new ProtonTestServer()) {
peer.expectSASLAnonymousConnect();
peer.expectOpen().respond();
peer.expectBegin().respond();
peer.expectAttach().respond().withNullSource();
peer.expectFlow();
peer.remoteDetach().withErrorCondition(AmqpError.UNAUTHORIZED_ACCESS.toString(), "Cannot read from this address").queue();
peer.expectDetach();
peer.start();
URI remoteURI = peer.getServerURI();
LOG.info("Test started, peer listening on: {}", remoteURI);
Client container = Client.create();
Connection connection = container.connect(remoteURI.getHost(), remoteURI.getPort());
connection.openFuture().get();
Session session = connection.openSession();
session.openFuture().get();
Receiver receiver = session.openReceiver("test-queue");
try {
receiver.openFuture().get();
fail("Open of receiver should fail due to remote indicating pending close.");
} catch (ExecutionException exe) {
assertNotNull(exe.getCause());
assertTrue(exe.getCause() instanceof ClientLinkRemotelyClosedException);
ClientLinkRemotelyClosedException linkClosed = (ClientLinkRemotelyClosedException) exe.getCause();
assertNotNull(linkClosed.getErrorCondition());
assertEquals(AmqpError.UNAUTHORIZED_ACCESS.toString(), linkClosed.getErrorCondition().condition());
}
peer.waitForScriptToComplete(5, TimeUnit.SECONDS);
// Should not result in any close being sent now, already closed.
receiver.closeAsync().get();
peer.expectClose().respond();
connection.closeAsync().get();
peer.waitForScriptToComplete(1, TimeUnit.SECONDS);
}
}
use of com.swiftmq.amqp.v100.client.Session in project qpid-protonj2 by apache.
the class ReceiverTest method testDrainCompletesWhenReceiverHasNoCredit.
@Test
public void testDrainCompletesWhenReceiverHasNoCredit() throws Exception {
try (ProtonTestServer peer = new ProtonTestServer()) {
peer.expectSASLAnonymousConnect();
peer.expectOpen().respond();
peer.expectBegin().respond();
peer.expectAttach().withRole(Role.RECEIVER.getValue()).respond();
peer.start();
URI remoteURI = peer.getServerURI();
LOG.info("Test started, peer listening on: {}", remoteURI);
Client container = Client.create();
Connection connection = container.connect(remoteURI.getHost(), remoteURI.getPort());
Session session = connection.openSession();
Receiver receiver = session.openReceiver("test-queue", new ReceiverOptions().creditWindow(0));
receiver.openFuture().get(5, TimeUnit.SECONDS);
peer.waitForScriptToComplete(5, TimeUnit.SECONDS);
Future<? extends Receiver> draining = receiver.drain();
draining.get(5, TimeUnit.SECONDS);
// Close things down
peer.expectClose().respond();
connection.closeAsync().get(5, TimeUnit.SECONDS);
peer.waitForScriptToComplete(1, TimeUnit.SECONDS);
}
}
Aggregations