package org.jooby.metrics;
import static org.easymock.EasyMock.expect;
import java.io.ByteArrayOutputStream;
import java.lang.management.ManagementFactory;
import java.lang.management.ThreadMXBean;
import org.jooby.MediaType;
import org.jooby.Request;
import org.jooby.Response;
import org.jooby.Status;
import org.jooby.test.MockUnit;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import com.codahale.metrics.jvm.ThreadDump;
@RunWith(PowerMockRunner.class)
@PrepareForTest({ThreadDumpHandler.class, ThreadDump.class, ManagementFactory.class,
ByteArrayOutputStream.class })
public class ThreadDumpHandlerTest {
@Test
public void dump() throws Exception {
byte[] bytes = new byte[0];
new MockUnit(Request.class, Response.class, ByteArrayOutputStream.class)
.expect(unit -> {
ThreadMXBean tmxb = unit.mock(ThreadMXBean.class);
unit.mockStatic(ManagementFactory.class);
expect(ManagementFactory.getThreadMXBean()).andReturn(tmxb);
ByteArrayOutputStream stream = unit.constructor(ByteArrayOutputStream.class).build();
expect(stream.toByteArray()).andReturn(bytes);
ThreadDump td = unit.constructor(ThreadDump.class)
.args(ThreadMXBean.class)
.build(tmxb);
td.dump(stream);
unit.registerMock(ThreadDump.class, td);
})
.expect(unit -> {
Response rsp = unit.get(Response.class);
expect(rsp.type(MediaType.plain)).andReturn(rsp);
expect(rsp.status(Status.OK)).andReturn(rsp);
expect(rsp.header("Cache-Control", "must-revalidate,no-cache,no-store")).andReturn(rsp);
rsp.send(bytes);
})
.run(unit -> {
new ThreadDumpHandler().handle(unit.get(Request.class), unit.get(Response.class));
});
}
@Test
public void nodump() throws Exception {
Object data = "Sorry your runtime environment does not allow to dump threads.";
new MockUnit(Request.class, Response.class)
.expect(unit -> {
unit.mockStatic(ManagementFactory.class);
expect(ManagementFactory.getThreadMXBean())
.andThrow(new IllegalStateException("intentional err"));
})
.expect(unit -> {
Response rsp = unit.get(Response.class);
expect(rsp.type(MediaType.plain)).andReturn(rsp);
expect(rsp.status(Status.NOT_IMPLEMENTED)).andReturn(rsp);
expect(rsp.header("Cache-Control", "must-revalidate,no-cache,no-store")).andReturn(rsp);
rsp.send(data);
})
.run(unit -> {
new ThreadDumpHandler().handle(unit.get(Request.class), unit.get(Response.class));
});
}
}