package com.opengamma.sesame.proxy; import static com.opengamma.sesame.config.ConfigBuilder.config; import static com.opengamma.sesame.config.ConfigBuilder.implementations; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.collection.IsIterableContainingInOrder.contains; import static org.hamcrest.core.Is.is; import java.util.Random; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import com.codahale.metrics.MetricRegistry; import com.codahale.metrics.Timer; import com.opengamma.sesame.config.FunctionModelConfig; import com.opengamma.sesame.engine.ComponentMap; import com.opengamma.sesame.function.Output; import com.opengamma.sesame.graph.FunctionModel; import com.opengamma.util.result.Result; import com.opengamma.util.test.TestGroup; /** * Tests the metrics proxy records data in a Metrics repository. */ @Test(groups = TestGroup.UNIT) public class MetricsProxyTest { private MetricRegistry _registry; @BeforeMethod public void setUp() { _registry = new MetricRegistry(); } @Test public void metricsShouldGetRecordedForInterfaceMethods() { MockFn fn = createMockFn(SimpleMockFn.class); for (int i = 0; i < 10; i++) { fn.doSomething(); fn.doSomethingElse(); } assertThat(_registry.getTimers().size(), is(2)); String[] expectedKeys = { "com.opengamma.sesame.proxy.MetricsProxyTest.SimpleMockFn.doSomething", "com.opengamma.sesame.proxy.MetricsProxyTest.SimpleMockFn.doSomethingElse"}; assertThat(_registry.getTimers().keySet(), contains(expectedKeys)); for (Timer timer : _registry.getTimers().values()) { assertThat(timer.getCount(), is(10L)); } } @Test public void noMetricsForStandardObjectMethods() { MockFn fn = createMockFn(SimpleMockFn.class); for (int i = 0; i < 10; i++) { fn.hashCode(); fn.toString(); } assertThat(_registry.getTimers().isEmpty(), is(true)); } private MockFn createMockFn(Class<? extends MockFn> implementationClass) { FunctionModelConfig config = config(implementations(MockFn.class, implementationClass)); return FunctionModel.build(MockFn.class, config, ComponentMap.EMPTY, ExceptionWrappingProxy.INSTANCE, new MetricsProxy(_registry)); } private interface MockFn { @Output("this") Result<Boolean> doSomething(); @Output("that") Result<Boolean> doSomethingElse(); } // Class needs to be public so that its default // constructor is visible to the FunctionModelConfig public static class SimpleMockFn implements MockFn { public Result<Boolean> doSomething() { randomWait(); return Result.success(true); } @Override public Result<Boolean> doSomethingElse() { randomWait(); return Result.success(true); } private void randomWait() { try { Thread.sleep((new Random()).nextInt(100)); } catch (InterruptedException e) { // Ignored } } } }