/*
* 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.jms.consumer;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
import java.util.Map;
import javax.jms.IllegalStateException;
import javax.jms.IllegalStateRuntimeException;
import javax.jms.JMSException;
import org.apache.qpid.jms.JmsConsumer;
import org.apache.qpid.jms.JmsMessageConsumer;
import org.apache.qpid.jms.JmsSession;
import org.junit.Test;
import org.mockito.Matchers;
import org.mockito.Mockito;
/**
* Test for basic behavior of the JMSConsumer implementation.
*/
public class JmsConsumerTest {
@Test
public void testGetMessageSelector() throws JMSException {
JmsSession session = Mockito.mock(JmsSession.class);
JmsMessageConsumer messageConsumer = Mockito.mock(JmsMessageConsumer.class);
JmsConsumer consumer = new JmsConsumer(session, messageConsumer);
try {
assertNull(consumer.getMessageSelector());
} finally {
consumer.close();
}
Mockito.verify(messageConsumer, Mockito.times(1)).getMessageSelector();
}
@Test
public void testGetMessageListener() throws JMSException {
JmsSession session = Mockito.mock(JmsSession.class);
JmsMessageConsumer messageConsumer = Mockito.mock(JmsMessageConsumer.class);
JmsConsumer consumer = new JmsConsumer(session, messageConsumer);
try {
assertNull(consumer.getMessageListener());
} finally {
consumer.close();
}
Mockito.verify(messageConsumer, Mockito.times(1)).getMessageListener();
}
@Test
public void testReceivePassthrough() throws JMSException {
JmsSession session = Mockito.mock(JmsSession.class);
JmsMessageConsumer messageConsumer = Mockito.mock(JmsMessageConsumer.class);
JmsConsumer consumer = new JmsConsumer(session, messageConsumer);
try {
assertNull(consumer.receive());
} finally {
consumer.close();
}
Mockito.verify(messageConsumer, Mockito.times(1)).receive();
}
@Test
public void testTimedReceivePassthrough() throws JMSException {
JmsSession session = Mockito.mock(JmsSession.class);
JmsMessageConsumer messageConsumer = Mockito.mock(JmsMessageConsumer.class);
JmsConsumer consumer = new JmsConsumer(session, messageConsumer);
try {
assertNull(consumer.receive(100));
} finally {
consumer.close();
}
Mockito.verify(messageConsumer, Mockito.times(1)).receive(Matchers.anyInt());
}
@Test
public void testReceiveNoWaitPassthrough() throws JMSException {
JmsSession session = Mockito.mock(JmsSession.class);
JmsMessageConsumer messageConsumer = Mockito.mock(JmsMessageConsumer.class);
JmsConsumer consumer = new JmsConsumer(session, messageConsumer);
try {
assertNull(consumer.receiveNoWait());
} finally {
consumer.close();
}
Mockito.verify(messageConsumer, Mockito.times(1)).receiveNoWait();
}
@Test
public void testReceiveBodyPassthrough() throws JMSException {
JmsSession session = Mockito.mock(JmsSession.class);
JmsMessageConsumer messageConsumer = Mockito.mock(JmsMessageConsumer.class);
JmsConsumer consumer = new JmsConsumer(session, messageConsumer);
try {
assertNull(consumer.receiveBody(Map.class));
} finally {
consumer.close();
}
Mockito.verify(messageConsumer, Mockito.times(1)).receiveBody(Map.class, -1);
}
@Test
public void testTimedReceiveBodyPassthrough() throws JMSException {
JmsSession session = Mockito.mock(JmsSession.class);
JmsMessageConsumer messageConsumer = Mockito.mock(JmsMessageConsumer.class);
JmsConsumer consumer = new JmsConsumer(session, messageConsumer);
try {
assertNull(consumer.receiveBody(Map.class, 100));
} finally {
consumer.close();
}
Mockito.verify(messageConsumer, Mockito.times(1)).receiveBody(Map.class, 100);
}
@Test
public void testNoWaitReceiveBodyPassthrough() throws JMSException {
JmsSession session = Mockito.mock(JmsSession.class);
JmsMessageConsumer messageConsumer = Mockito.mock(JmsMessageConsumer.class);
JmsConsumer consumer = new JmsConsumer(session, messageConsumer);
try {
assertNull(consumer.receiveBodyNoWait(Map.class));
} finally {
consumer.close();
}
Mockito.verify(messageConsumer, Mockito.times(1)).receiveBody(Map.class, 0);
}
//----- Test Receive calls map zero to infinite wait ---------------------//
@Test
public void testReceiveBodyWithTimeoutZeroWaitsForever() throws JMSException {
JmsSession session = Mockito.mock(JmsSession.class);
JmsMessageConsumer messageConsumer = Mockito.mock(JmsMessageConsumer.class);
JmsConsumer consumer = new JmsConsumer(session, messageConsumer);
consumer.receiveBody(Map.class, 0);
consumer.close();
Mockito.verify(messageConsumer).receiveBody(Map.class, -1);
}
//----- Test that the JMSRuntimeException retains error context ----------//
@Test
public void testRuntimeExceptionOnClose() throws JMSException {
JmsSession session = Mockito.mock(JmsSession.class);
JmsMessageConsumer messageConsumer = Mockito.mock(JmsMessageConsumer.class);
JmsConsumer consumer = new JmsConsumer(session, messageConsumer);
Mockito.doThrow(IllegalStateException.class).when(messageConsumer).close();
try {
consumer.close();
fail("Should throw ISRE");
} catch (IllegalStateRuntimeException isre) {
}
}
@Test
public void testRuntimeExceptionOnGetMessageListener() throws JMSException {
JmsSession session = Mockito.mock(JmsSession.class);
JmsMessageConsumer messageConsumer = Mockito.mock(JmsMessageConsumer.class);
JmsConsumer consumer = new JmsConsumer(session, messageConsumer);
Mockito.doThrow(IllegalStateException.class).when(messageConsumer).getMessageListener();
try {
consumer.getMessageListener();
fail("Should throw ISRE");
} catch (IllegalStateRuntimeException isre) {
} finally {
consumer.close();
}
}
@Test
public void testRuntimeExceptionOnSetMessageListener() throws JMSException {
JmsSession session = Mockito.mock(JmsSession.class);
JmsMessageConsumer messageConsumer = Mockito.mock(JmsMessageConsumer.class);
JmsConsumer consumer = new JmsConsumer(session, messageConsumer);
Mockito.doThrow(IllegalStateException.class).when(messageConsumer).setMessageListener(null);
try {
consumer.setMessageListener(null);
fail("Should throw ISRE");
} catch (IllegalStateRuntimeException isre) {
} finally {
consumer.close();
}
}
@Test
public void testRuntimeExceptionOnGetMessageSelector() throws JMSException {
JmsSession session = Mockito.mock(JmsSession.class);
JmsMessageConsumer messageConsumer = Mockito.mock(JmsMessageConsumer.class);
JmsConsumer consumer = new JmsConsumer(session, messageConsumer);
Mockito.doThrow(IllegalStateException.class).when(messageConsumer).getMessageSelector();
try {
consumer.getMessageSelector();
fail("Should throw ISRE");
} catch (IllegalStateRuntimeException isre) {
} finally {
consumer.close();
}
}
@Test
public void testRuntimeExceptionOnReceive() throws JMSException {
JmsSession session = Mockito.mock(JmsSession.class);
JmsMessageConsumer messageConsumer = Mockito.mock(JmsMessageConsumer.class);
JmsConsumer consumer = new JmsConsumer(session, messageConsumer);
Mockito.doThrow(IllegalStateException.class).when(messageConsumer).receive();
try {
consumer.receive();
fail("Should throw ISRE");
} catch (IllegalStateRuntimeException isre) {
} finally {
consumer.close();
}
}
@Test
public void testRuntimeExceptionOnReceiveNoWait() throws JMSException {
JmsSession session = Mockito.mock(JmsSession.class);
JmsMessageConsumer messageConsumer = Mockito.mock(JmsMessageConsumer.class);
JmsConsumer consumer = new JmsConsumer(session, messageConsumer);
Mockito.doThrow(IllegalStateException.class).when(messageConsumer).receiveNoWait();
try {
consumer.receiveNoWait();
fail("Should throw ISRE");
} catch (IllegalStateRuntimeException isre) {
} finally {
consumer.close();
}
}
@Test
public void testRuntimeExceptionOnTimedReceive() throws JMSException {
JmsSession session = Mockito.mock(JmsSession.class);
JmsMessageConsumer messageConsumer = Mockito.mock(JmsMessageConsumer.class);
JmsConsumer consumer = new JmsConsumer(session, messageConsumer);
Mockito.doThrow(IllegalStateException.class).when(messageConsumer).receive(Matchers.anyInt());
try {
consumer.receive(100);
fail("Should throw ISRE");
} catch (IllegalStateRuntimeException isre) {
} finally {
consumer.close();
}
}
@Test
public void testRuntimeExceptionOnReceiveBody() throws JMSException {
JmsSession session = Mockito.mock(JmsSession.class);
JmsMessageConsumer messageConsumer = Mockito.mock(JmsMessageConsumer.class);
JmsConsumer consumer = new JmsConsumer(session, messageConsumer);
Mockito.doThrow(IllegalStateException.class).when(messageConsumer).receiveBody(Map.class, -1);
try {
consumer.receiveBody(Map.class);
fail("Should throw ISRE");
} catch (IllegalStateRuntimeException isre) {
} finally {
consumer.close();
}
}
@Test
public void testRuntimeExceptionOnTimedReceiveBody() throws JMSException {
JmsSession session = Mockito.mock(JmsSession.class);
JmsMessageConsumer messageConsumer = Mockito.mock(JmsMessageConsumer.class);
JmsConsumer consumer = new JmsConsumer(session, messageConsumer);
Mockito.doThrow(IllegalStateException.class).when(messageConsumer).receiveBody(Map.class, 100);
try {
consumer.receiveBody(Map.class, 100);
fail("Should throw ISRE");
} catch (IllegalStateRuntimeException isre) {
} finally {
consumer.close();
}
}
@Test
public void testRuntimeExceptionOnReceiveBodyNoWait() throws JMSException {
JmsSession session = Mockito.mock(JmsSession.class);
JmsMessageConsumer messageConsumer = Mockito.mock(JmsMessageConsumer.class);
JmsConsumer consumer = new JmsConsumer(session, messageConsumer);
Mockito.doThrow(IllegalStateException.class).when(messageConsumer).receiveBody(Map.class, 0);
try {
consumer.receiveBodyNoWait(Map.class);
fail("Should throw ISRE");
} catch (IllegalStateRuntimeException isre) {
} finally {
consumer.close();
}
}
}