package com.buschmais.xo.test.trace.test.bootstrap;
import com.buschmais.xo.api.XOManager;
import com.buschmais.xo.api.XOManagerFactory;
import com.buschmais.xo.api.bootstrap.XO;
import com.buschmais.xo.api.bootstrap.XOUnit;
import com.buschmais.xo.api.bootstrap.XOUnitBuilder;
import com.buschmais.xo.json.api.JsonFileStoreProvider;
import com.buschmais.xo.test.trace.api.TraceDatastoreProvider;
import com.buschmais.xo.test.trace.test.bootstrap.composite.A;
import org.junit.Before;
import org.junit.Test;
import javax.management.JMException;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.management.openmbean.CompositeData;
import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.net.URISyntaxException;
import static org.hamcrest.Matchers.greaterThan;
import static org.hamcrest.Matchers.notNullValue;
import static org.junit.Assert.assertThat;
/**
* Verifies the functionality of {@link com.buschmais.xo.test.trace.impl.TraceMonitorMXBean}.
*/
public class TraceMonitorMXBeanTest {
private MBeanServer mbeanServer;
private ObjectName objectName;
@Before
public void init() throws JMException {
mbeanServer = ManagementFactory.getPlatformMBeanServer();
objectName = new ObjectName("com.buschmais.xo.trace", "xo-unit", "default");
}
@Test
public void methodStatistics() throws URISyntaxException, IOException, JMException {
XOUnit xoUnit = XOUnitBuilder.create("file:target/json/store", TraceDatastoreProvider.class, A.class).property("com.buschmais.xo.test.trace.api.DelegateProvider", JsonFileStoreProvider.class.getName()).create();
XOManagerFactory xoManagerFactory = XO.createXOManagerFactory(xoUnit);
assertThat(mbeanServer.getMBeanInfo(objectName), notNullValue());
XOManager xoManager = xoManagerFactory.createXOManager();
A a = xoManager.create(A.class);
a.setName("Test");
xoManager.close();
CompositeData[] statistics = (CompositeData[]) mbeanServer.getAttribute(objectName, "MethodStatistics");
assertThat(statistics, notNullValue());
assertThat(statistics.length, greaterThan(0));
CompositeData methodStatistic = statistics[0];
assertThat((Long) methodStatistic.get("totalTime"), greaterThan(0l));
assertThat((Long) methodStatistic.get("invocations"), greaterThan(0l));
xoManagerFactory.close();
}
}