package se.pp.gustafson.marten.logback.appender;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.fail;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import org.junit.After;
import org.junit.Before;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.PatternLayout;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.ConnectionParameters;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.QueueingConsumer;
import com.rabbitmq.client.AMQP.BasicProperties;
public abstract class AbstractAmqpAppenderTest
{
static final String VIRTUAL_HOST = "/";
static final String QUEUE = "queue";
static final String KEY = "key";
static final String EXCHANGE = "exchange";
static final String USER = "guest";
static final String PASSWORD = "guest";
static final String HOST = "127.0.0.1";
static final int PORT = 5672;
String message;
Connection conn;
Channel channel;
CountDownLatch latch;
LoggerContext context;
TestAssertion perTestAssertion;
final void setTestAssertion(final TestAssertion perTestAssertion)
{
this.perTestAssertion = perTestAssertion;
}
final AmqpAppender createAppenderWithInlineConfiguration()
{
final AmqpAppender appender = new AmqpAppender();
this.context.reset();
final PatternLayout layout = new PatternLayout();
layout.setPattern("%msg");
layout.setContext(this.context);
layout.start();
appender.setHost(HOST);
appender.setPort(PORT);
appender.setUsername(USER);
appender.setPassword(PASSWORD);
appender.setVirtualHost(VIRTUAL_HOST);
appender.setExchange(EXCHANGE);
appender.setKey(KEY);
appender.setUseLevelAsKey(false);
appender.setUseLevelAsPriority(false);
//appender.setLayout(layout);
appender.start();
appender.setContext(this.context);
return appender;
}
final Logger createLogger(final AmqpAppender appender)
{
final ch.qos.logback.classic.Logger root = this.context.getLogger(Logger.ROOT_LOGGER_NAME);
root.setLevel(Level.ALL);
root.addAppender(appender);
return root;
}
@Before
public final void setUp() throws Exception
{
this.perTestAssertion = null;
this.context = (LoggerContext)LoggerFactory.getILoggerFactory();
this.latch = new CountDownLatch(1);
this.message = " Hello, my world is at " + System.currentTimeMillis();
ConnectionParameters params = new ConnectionParameters();
params.setUsername(USER);
params.setPassword(PASSWORD);
params.setVirtualHost(VIRTUAL_HOST);
params.setRequestedHeartbeat(0);
final ConnectionFactory factory = new ConnectionFactory(params);
this.conn = factory.newConnection(HOST, PORT);
this.channel = this.conn.createChannel();
this.channel.exchangeDeclare(EXCHANGE, "direct", false);
this.channel.queueDelete(QUEUE);
this.channel.queueDeclare(QUEUE, false);
this.channel.queueBind(QUEUE, EXCHANGE, KEY);
this.channel.basicConsume(QUEUE, new QueueingConsumer(this.channel)
{
@Override
public void handleDelivery(final String consumerTag, final Envelope envelope, final BasicProperties properties, final byte[] body)
throws IOException
{
AbstractAmqpAppenderTest.this.channel.basicAck(envelope.getDeliveryTag(), false);
assertEquals(AbstractAmqpAppenderTest.this.message, new String(body));
if(AbstractAmqpAppenderTest.this.perTestAssertion != null)
{
AbstractAmqpAppenderTest.this.perTestAssertion.doAssert(envelope, properties, body);
}
AbstractAmqpAppenderTest.this.latch.countDown();
}
});
}
@After
public final void tearDown() throws IOException
{
try
{
if(!this.latch.await(3000, TimeUnit.MILLISECONDS))
{
fail("Timed out waiting for message, check system err for indications of test failure");
}
}
catch(final InterruptedException e)
{
fail("Interrupted while waiting for message");
}
this.channel.close();
this.conn.close();
this.context.stop();
}
}