package org.jooby.internal.camel;
import static org.easymock.EasyMock.expectLastCall;
import java.util.Set;
import org.apache.camel.ConsumerTemplate;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultCamelContext;
import org.jooby.test.MockUnit;
import org.junit.Test;
import com.google.common.collect.Sets;
public class CamelFinalizerTest {
RouteBuilder rb = new RouteBuilder() {
@Override
public void configure() throws Exception {
}
};
MockUnit.Block ctx = unit -> {
DefaultCamelContext ctx = unit.get(DefaultCamelContext.class);
ctx.setInjector(unit.get(GuiceInjector.class));
ctx.addRoutes(rb);
ctx.addRoutes(unit.get(RouteBuilder.class));
};
@Test
public void defaults() throws Exception {
Set<Object> routes = Sets.newHashSet(rb, new Object());
new MockUnit(GuiceInjector.class, DefaultCamelContext.class, RouteBuilder.class,
ProducerTemplate.class, ConsumerTemplate.class)
.expect(ctx)
.run(unit -> {
new CamelFinalizer(unit.get(GuiceInjector.class),
unit.get(DefaultCamelContext.class), routes,
unit.get(RouteBuilder.class), unit.get(ProducerTemplate.class), unit
.get(ConsumerTemplate.class));
});
}
@Test
public void start() throws Exception {
Set<Object> routes = Sets.newHashSet(rb, new Object());
new MockUnit(GuiceInjector.class, DefaultCamelContext.class, RouteBuilder.class,
ProducerTemplate.class, ConsumerTemplate.class)
.expect(ctx)
.expect(unit -> {
DefaultCamelContext ctx = unit.get(DefaultCamelContext.class);
ctx.start();
ProducerTemplate producer = unit.get(ProducerTemplate.class);
producer.start();
ConsumerTemplate consumer = unit.get(ConsumerTemplate.class);
consumer.start();
})
.run(unit -> {
new CamelFinalizer(unit.get(GuiceInjector.class),
unit.get(DefaultCamelContext.class), routes,
unit.get(RouteBuilder.class), unit.get(ProducerTemplate.class), unit
.get(ConsumerTemplate.class)).start();;
});
}
@Test
public void safeStop() throws Exception {
Set<Object> routes = Sets.newHashSet(rb, new Object());
new MockUnit(GuiceInjector.class, DefaultCamelContext.class, RouteBuilder.class,
ProducerTemplate.class, ConsumerTemplate.class)
.expect(ctx)
.expect(unit -> {
DefaultCamelContext ctx = unit.get(DefaultCamelContext.class);
ctx.stop();
ProducerTemplate producer = unit.get(ProducerTemplate.class);
producer.stop();
ConsumerTemplate consumer = unit.get(ConsumerTemplate.class);
consumer.stop();
})
.run(unit -> {
new CamelFinalizer(unit.get(GuiceInjector.class),
unit.get(DefaultCamelContext.class), routes,
unit.get(RouteBuilder.class), unit.get(ProducerTemplate.class), unit
.get(ConsumerTemplate.class)).stop();;
});
}
@Test
public void ctxNoStop() throws Exception {
Set<Object> routes = Sets.newHashSet(rb, new Object());
new MockUnit(GuiceInjector.class, DefaultCamelContext.class, RouteBuilder.class,
ProducerTemplate.class, ConsumerTemplate.class)
.expect(ctx)
.expect(unit -> {
DefaultCamelContext ctx = unit.get(DefaultCamelContext.class);
ctx.stop();
expectLastCall().andThrow(new IllegalStateException("intentional err"));
ProducerTemplate producer = unit.get(ProducerTemplate.class);
producer.stop();
ConsumerTemplate consumer = unit.get(ConsumerTemplate.class);
consumer.stop();
})
.run(unit -> {
new CamelFinalizer(unit.get(GuiceInjector.class),
unit.get(DefaultCamelContext.class), routes,
unit.get(RouteBuilder.class), unit.get(ProducerTemplate.class), unit
.get(ConsumerTemplate.class)).stop();;
});
}
@Test
public void producerNoStop() throws Exception {
Set<Object> routes = Sets.newHashSet(rb, new Object());
new MockUnit(GuiceInjector.class, DefaultCamelContext.class, RouteBuilder.class,
ProducerTemplate.class, ConsumerTemplate.class)
.expect(ctx)
.expect(unit -> {
DefaultCamelContext ctx = unit.get(DefaultCamelContext.class);
ctx.stop();
ProducerTemplate producer = unit.get(ProducerTemplate.class);
producer.stop();
expectLastCall().andThrow(new IllegalStateException("intentional err"));
ConsumerTemplate consumer = unit.get(ConsumerTemplate.class);
consumer.stop();
})
.run(unit -> {
new CamelFinalizer(unit.get(GuiceInjector.class),
unit.get(DefaultCamelContext.class), routes,
unit.get(RouteBuilder.class), unit.get(ProducerTemplate.class), unit
.get(ConsumerTemplate.class)).stop();;
});
}
@Test
public void consumerNoStop() throws Exception {
Set<Object> routes = Sets.newHashSet(rb, new Object());
new MockUnit(GuiceInjector.class, DefaultCamelContext.class, RouteBuilder.class,
ProducerTemplate.class, ConsumerTemplate.class)
.expect(ctx)
.expect(unit -> {
DefaultCamelContext ctx = unit.get(DefaultCamelContext.class);
ctx.stop();
ProducerTemplate producer = unit.get(ProducerTemplate.class);
producer.stop();
ConsumerTemplate consumer = unit.get(ConsumerTemplate.class);
consumer.stop();
expectLastCall().andThrow(new IllegalStateException("intentional err"));
})
.run(unit -> {
new CamelFinalizer(unit.get(GuiceInjector.class),
unit.get(DefaultCamelContext.class), routes,
unit.get(RouteBuilder.class), unit.get(ProducerTemplate.class), unit
.get(ConsumerTemplate.class)).stop();;
});
}
}