package org.jooby.metrics; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.expectLastCall; import java.io.IOException; import java.util.Optional; import org.jooby.Request; import org.jooby.Response; import org.jooby.Route; import org.jooby.Status; import org.jooby.test.MockUnit; import org.jooby.test.MockUnit.Block; import org.junit.Test; import com.codahale.metrics.Counter; import com.codahale.metrics.Meter; import com.codahale.metrics.MetricRegistry; import com.codahale.metrics.Timer; import com.codahale.metrics.Timer.Context; public class InstrumentedHandlerTest { private Block registry = unit -> { Request request = unit.get(Request.class); expect(request.require(MetricRegistry.class)) .andReturn(unit.get(MetricRegistry.class)); }; private Block counter = unit -> { Counter counter = unit.mock(Counter.class); counter.inc(); counter.dec(); MetricRegistry registry = unit.get(MetricRegistry.class); expect(registry.counter("request.actives")).andReturn(counter); }; private Block timer = unit -> { Context ctx = unit.mock(Context.class); expect(ctx.stop()).andReturn(1L); Timer timer = unit.mock(Timer.class); expect(timer.time()).andReturn(ctx); MetricRegistry registry = unit.get(MetricRegistry.class); expect(registry.timer("request")).andReturn(timer); }; private Block meter = unit -> { Meter meter = unit.mock(Meter.class); meter.mark(); MetricRegistry registry = unit.get(MetricRegistry.class); expect(registry.meter("responses.200")).andReturn(meter); Response rsp = unit.get(Response.class); expect(rsp.status()).andReturn(Optional.of(Status.OK)); }; private Block next = unit -> { Request req = unit.get(Request.class); Response rsp = unit.get(Response.class); Route.Chain chain = unit.get(Route.Chain.class); chain.next(req, rsp); }; private Block nextErr = unit -> { Request req = unit.get(Request.class); Response rsp = unit.get(Response.class); Route.Chain chain = unit.get(Route.Chain.class); chain.next(req, rsp); expectLastCall().andThrow(new IOException()); }; @Test public void instrument() throws Exception { new MockUnit(Request.class, Response.class, Route.Chain.class, MetricRegistry.class) .expect(registry) .expect(counter) .expect(timer) .expect(meter) .expect(next) .run(unit -> { new InstrumentedHandler().handle(unit.get(Request.class), unit.get(Response.class), unit.get(Route.Chain.class)); }); } @Test(expected = IOException.class) public void instrumentWithErr() throws Exception { new MockUnit(Request.class, Response.class, Route.Chain.class, MetricRegistry.class) .expect(registry) .expect(counter) .expect(timer) .expect(meter) .expect(nextErr) .run(unit -> { new InstrumentedHandler().handle(unit.get(Request.class), unit.get(Response.class), unit.get(Route.Chain.class)); }); } }