// Copyright (c) 2017 Pivotal Software, Inc. All rights reserved.
//
// This software, the RabbitMQ Java client library, is triple-licensed under the
// Mozilla Public License 1.1 ("MPL"), the GNU General Public License version 2
// ("GPL") and the Apache License version 2 ("ASL"). For the MPL, please see
// LICENSE-MPL-RabbitMQ. For the GPL, please see LICENSE-GPL2. For the ASL,
// please see LICENSE-APACHE2.
//
// This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND,
// either express or implied. See the LICENSE file for specific language governing
// rights and limitations of this software.
//
// If you have any questions regarding licensing, please contact us at
// info@rabbitmq.com.
package com.rabbitmq.client.test;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import org.junit.Test;
import java.io.IOException;
import java.util.UUID;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import static org.junit.Assert.assertTrue;
public class LambdaCallbackTest extends BrokerTestCase {
String queue;
@Override
protected void createResources() throws IOException, TimeoutException {
queue = channel.queueDeclare(UUID.randomUUID().toString(), true, false, false, null).getQueue();
}
@Override
protected void releaseResources() throws IOException {
channel.queueDelete(queue);
try {
unblock();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Test public void shutdownListener() throws Exception {
CountDownLatch latch = new CountDownLatch(2);
try(Connection connection = TestUtils.connectionFactory().newConnection()) {
connection.addShutdownListener(cause -> latch.countDown());
Channel channel = connection.createChannel();
channel.addShutdownListener(cause -> latch.countDown());
}
assertTrue("Connection closed, shutdown listeners should have been called", latch.await(1, TimeUnit.SECONDS));
}
@Test public void confirmListener() throws Exception {
channel.confirmSelect();
CountDownLatch latch = new CountDownLatch(1);
channel.addConfirmListener(
(deliveryTag, multiple) -> latch.countDown(),
(deliveryTag, multiple) -> {}
);
channel.basicPublish("", "whatever", null, "dummy".getBytes());
assertTrue("Should have received publisher confirm", latch.await(1, TimeUnit.SECONDS));
}
@Test public void returnListener() throws Exception {
CountDownLatch latch = new CountDownLatch(1);
channel.addReturnListener(returnMessage -> latch.countDown());
channel.basicPublish("", "notlikelytoexist", true, null, "dummy".getBytes());
assertTrue("Should have received returned message", latch.await(1, TimeUnit.SECONDS));
}
@Test public void blockedListener() throws Exception {
final CountDownLatch latch = new CountDownLatch(1);
try(Connection connection = TestUtils.connectionFactory().newConnection()) {
connection.addBlockedListener(
reason -> {
try {
unblock();
} catch (InterruptedException e) {
e.printStackTrace();
}
},
() -> latch.countDown()
);
block();
Channel ch = connection.createChannel();
ch.basicPublish("", "", null, "dummy".getBytes());
assertTrue("Should have been blocked and unblocked", latch.await(10, TimeUnit.SECONDS));
}
}
@Test public void basicConsumeDeliverCancel() throws Exception {
try(Connection connection = TestUtils.connectionFactory().newConnection()) {
final CountDownLatch consumingLatch = new CountDownLatch(1);
final CountDownLatch cancelLatch = new CountDownLatch(1);
Channel consumingChannel = connection.createChannel();
consumingChannel.basicConsume(queue, true,
(consumerTag, delivery) -> consumingLatch.countDown(),
consumerTag -> cancelLatch.countDown()
);
this.channel.basicPublish("", queue, null, "dummy".getBytes());
assertTrue("deliver callback should have been called", consumingLatch.await(1, TimeUnit.SECONDS));
this.channel.queueDelete(queue);
assertTrue("cancel callback should have been called", cancelLatch.await(1, TimeUnit.SECONDS));
}
}
@Test public void basicConsumeDeliverShutdown() throws Exception {
final CountDownLatch shutdownLatch = new CountDownLatch(1);
try(Connection connection = TestUtils.connectionFactory().newConnection()) {
final CountDownLatch consumingLatch = new CountDownLatch(1);
Channel consumingChannel = connection.createChannel();
consumingChannel.basicConsume(queue, true,
(consumerTag, delivery) -> consumingLatch.countDown(),
(consumerTag, sig) -> shutdownLatch.countDown()
);
this.channel.basicPublish("", queue, null, "dummy".getBytes());
assertTrue("deliver callback should have been called", consumingLatch.await(1, TimeUnit.SECONDS));
}
assertTrue("shutdown callback should have been called", shutdownLatch.await(1, TimeUnit.SECONDS));
}
@Test public void basicConsumeCancelDeliverShutdown() throws Exception {
final CountDownLatch shutdownLatch = new CountDownLatch(1);
try(Connection connection = TestUtils.connectionFactory().newConnection()) {
final CountDownLatch consumingLatch = new CountDownLatch(1);
Channel consumingChannel = connection.createChannel();
// not both cancel and shutdown callback can be called on the same consumer
// testing just shutdown
consumingChannel.basicConsume(queue, true,
(consumerTag, delivery) -> consumingLatch.countDown(),
(consumerTag) -> { },
(consumerTag, sig) -> shutdownLatch.countDown()
);
this.channel.basicPublish("", queue, null, "dummy".getBytes());
assertTrue("deliver callback should have been called", consumingLatch.await(1, TimeUnit.SECONDS));
}
assertTrue("shutdown callback should have been called", shutdownLatch.await(1, TimeUnit.SECONDS));
}
}