diff options
author | Jon Bratseth <bratseth@yahoo-inc.com> | 2016-06-15 23:09:44 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@yahoo-inc.com> | 2016-06-15 23:09:44 +0200 |
commit | 72231250ed81e10d66bfe70701e64fa5fe50f712 (patch) | |
tree | 2728bba1131a6f6e5bdf95afec7d7ff9358dac50 /container-disc/src/test/java |
Publish
Diffstat (limited to 'container-disc/src/test/java')
11 files changed, 663 insertions, 0 deletions
diff --git a/container-disc/src/test/java/com/yahoo/container/jdisc/ContainerThreadFactoryTest.java b/container-disc/src/test/java/com/yahoo/container/jdisc/ContainerThreadFactoryTest.java new file mode 100644 index 00000000000..408eb813eb3 --- /dev/null +++ b/container-disc/src/test/java/com/yahoo/container/jdisc/ContainerThreadFactoryTest.java @@ -0,0 +1,46 @@ +// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.container.jdisc; + +import com.yahoo.container.jdisc.metric.MetricConsumerProvider; +import com.yahoo.jdisc.application.ContainerThread; +import org.junit.Test; +import org.mockito.Mockito; + +import java.util.concurrent.ThreadFactory; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +/** + * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen Hult</a> + */ +public class ContainerThreadFactoryTest { + + @Test + public void requireThatMetricConsumerProviderCanNotBeNull() { + try { + new ContainerThreadFactory(null); + fail(); + } catch (NullPointerException e) { + + } + } + + @Test + public void requireThatThreadsCreatedAreJDiscContainerThreads() { + assertEquals(ContainerThread.class, + new ContainerThreadFactory(Mockito.mock(MetricConsumerProvider.class)) + .newThread(Mockito.mock(Runnable.class)) + .getClass()); + } + + @Test + public void requireThatThreadFactoryCallsProvider() { + MetricConsumerProvider provider = Mockito.mock(MetricConsumerProvider.class); + ThreadFactory factory = new ContainerThreadFactory(provider); + factory.newThread(Mockito.mock(Runnable.class)); + Mockito.verify(provider, Mockito.times(1)).newInstance(); + factory.newThread(Mockito.mock(Runnable.class)); + Mockito.verify(provider, Mockito.times(2)).newInstance(); + } +} diff --git a/container-disc/src/test/java/com/yahoo/container/jdisc/DisableOsgiFrameworkTest.java b/container-disc/src/test/java/com/yahoo/container/jdisc/DisableOsgiFrameworkTest.java new file mode 100644 index 00000000000..7b05b3cbd65 --- /dev/null +++ b/container-disc/src/test/java/com/yahoo/container/jdisc/DisableOsgiFrameworkTest.java @@ -0,0 +1,46 @@ +// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.container.jdisc; + +import org.junit.Test; +import org.osgi.framework.BundleException; + +/** + * @author lulf + * @since 5.1 + */ +public class DisableOsgiFrameworkTest { + @Test(expected = RuntimeException.class) + public void require_that_installBundle_throws_exception() throws BundleException { + new DisableOsgiFramework().installBundle("foo"); + } + + @Test(expected = RuntimeException.class) + public void require_that_startBundles_throws_exception() throws BundleException { + new DisableOsgiFramework().startBundles(null, true); + } + + @Test(expected = RuntimeException.class) + public void require_that_bundleContext_throws_exception() throws BundleException { + new DisableOsgiFramework().bundleContext(); + } + + @Test(expected = RuntimeException.class) + public void require_that_refreshPackages_throws_exception() { + new DisableOsgiFramework().refreshPackages(); + } + + @Test(expected = RuntimeException.class) + public void require_that_bundles_throws_exception() { + new DisableOsgiFramework().bundles(); + } + + @Test(expected = RuntimeException.class) + public void require_that_start_throws_exception() throws BundleException { + new DisableOsgiFramework().start(); + } + + @Test(expected = RuntimeException.class) + public void require_that_stop_throws_exception() throws BundleException { + new DisableOsgiFramework().stop(); + } +} diff --git a/container-disc/src/test/java/com/yahoo/container/jdisc/FilterBindingsProviderTest.java b/container-disc/src/test/java/com/yahoo/container/jdisc/FilterBindingsProviderTest.java new file mode 100644 index 00000000000..061d357310f --- /dev/null +++ b/container-disc/src/test/java/com/yahoo/container/jdisc/FilterBindingsProviderTest.java @@ -0,0 +1,202 @@ +// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.container.jdisc; + +import com.yahoo.component.ComponentId; +import com.yahoo.component.provider.ComponentRegistry; +import com.yahoo.container.core.ChainsConfig; +import com.yahoo.container.http.filter.FilterChainRepository; +import com.yahoo.jdisc.application.BindingRepository; +import com.yahoo.jdisc.application.UriPattern; +import com.yahoo.jdisc.http.ServerConfig; +import com.yahoo.jdisc.http.filter.RequestFilter; +import com.yahoo.jdisc.http.filter.ResponseFilter; +import com.yahoo.jdisc.http.filter.SecurityRequestFilter; +import com.yahoo.jdisc.http.filter.SecurityResponseFilter; +import com.yahoo.jdisc.http.server.FilterBindings; +import org.hamcrest.Description; +import org.hamcrest.Matcher; +import org.hamcrest.TypeSafeMatcher; +import org.junit.Test; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.fail; +import static org.mockito.Mockito.mock; + +/** + * @author <a href="mailto:bakksjo@yahoo-inc.com">Oyvind Bakksjo</a> + */ +public class FilterBindingsProviderTest { + final ServerConfig.Builder configBuilder = new ServerConfig.Builder(); + + @Test + public void requireThatEmptyInputGivesEmptyOutput() { + final FilterChainRepository filterChainRepository = new FilterChainRepository( + new ChainsConfig(new ChainsConfig.Builder()), + new ComponentRegistry<>(), + new ComponentRegistry<>(), + new ComponentRegistry<>(), + new ComponentRegistry<>()); + + final FilterBindingsProvider provider = new FilterBindingsProvider( + new ComponentId("foo"), + new ServerConfig(configBuilder), + filterChainRepository, + new ComponentRegistry<>()); + + final FilterBindings filterBindings = provider.get(); + + assertThat(filterBindings, is(not(nullValue()))); + assertThat(filterBindings.getRequestFilters().iterator().hasNext(), is(false)); + assertThat(filterBindings.getResponseFilters().iterator().hasNext(), is(false)); + } + + @Test + public void requireThatCorrectlyConfiguredFiltersAreIncluded() { + final String requestFilter1Id = "requestFilter1"; + final String requestFilter2Id = "requestFilter2"; + final String requestFilter3Id = "requestFilter3"; + final String responseFilter1Id = "responseFilter1"; + final String responseFilter2Id = "responseFilter2"; + final String responseFilter3Id = "responseFilter3"; + + // Set up config. + configBuilder.filter(new ServerConfig.Filter.Builder().id(requestFilter1Id).binding("http://*/a")); + configBuilder.filter(new ServerConfig.Filter.Builder().id(requestFilter2Id).binding("http://*/b")); + configBuilder.filter(new ServerConfig.Filter.Builder().id(responseFilter1Id).binding("http://*/c")); + configBuilder.filter(new ServerConfig.Filter.Builder().id(responseFilter3Id).binding("http://*/d")); + + // Set up registry. + final ComponentRegistry<RequestFilter> availableRequestFilters = new ComponentRegistry<>(); + final RequestFilter requestFilter1Instance = mock(RequestFilter.class); + final RequestFilter requestFilter2Instance = mock(RequestFilter.class); + final RequestFilter requestFilter3Instance = mock(RequestFilter.class); + availableRequestFilters.register(ComponentId.fromString(requestFilter1Id), requestFilter1Instance); + availableRequestFilters.register(ComponentId.fromString(requestFilter2Id), requestFilter2Instance); + availableRequestFilters.register(ComponentId.fromString(requestFilter3Id), requestFilter3Instance); + final ComponentRegistry<ResponseFilter> availableResponseFilters = new ComponentRegistry<>(); + final ResponseFilter responseFilter1Instance = mock(ResponseFilter.class); + final ResponseFilter responseFilter2Instance = mock(ResponseFilter.class); + final ResponseFilter responseFilter3Instance = mock(ResponseFilter.class); + availableResponseFilters.register(ComponentId.fromString(responseFilter1Id), responseFilter1Instance); + availableResponseFilters.register(ComponentId.fromString(responseFilter2Id), responseFilter2Instance); + availableResponseFilters.register(ComponentId.fromString(responseFilter3Id), responseFilter3Instance); + final FilterChainRepository filterChainRepository = new FilterChainRepository( + new ChainsConfig(new ChainsConfig.Builder()), + availableRequestFilters, + availableResponseFilters, + new ComponentRegistry<SecurityRequestFilter>(), + new ComponentRegistry<SecurityResponseFilter>()); + + // Set up the provider that we aim to test. + final FilterBindingsProvider provider = new FilterBindingsProvider( + new ComponentId("foo"), + new ServerConfig(configBuilder), + filterChainRepository, + new ComponentRegistry<SecurityRequestFilter>()); + + // Execute. + final FilterBindings filterBindings = provider.get(); + + // Verify. + assertThat(filterBindings, is(not(nullValue()))); + assertThat( + filterBindings.getRequestFilters(), + containsFilters(requestFilter1Instance, requestFilter2Instance)); + assertThat( + filterBindings.getRequestFilters(), + not(containsFilters(requestFilter3Instance))); + assertThat( + filterBindings.getResponseFilters(), + containsFilters(responseFilter1Instance, responseFilter3Instance)); + assertThat( + filterBindings.getResponseFilters(), + not(containsFilters(responseFilter2Instance))); + } + + private interface DualRoleFilter extends RequestFilter, ResponseFilter {} + + @Test + public void requireThatInstanceCanNotBeBothRequestAndResponseFilter() { + final String filterId = "filter"; + + // Set up config. + configBuilder.filter(new ServerConfig.Filter.Builder().id(filterId).binding("http://*/*")); + + // Set up registry. + final DualRoleFilter filterInstance = mock(DualRoleFilter.class); + final ComponentRegistry<RequestFilter> availableRequestFilters = new ComponentRegistry<>(); + availableRequestFilters.register(ComponentId.fromString(filterId), filterInstance); + final FilterChainRepository filterChainRepository = new FilterChainRepository( + new ChainsConfig(new ChainsConfig.Builder()), + availableRequestFilters, + new ComponentRegistry<>(), + new ComponentRegistry<>(), + new ComponentRegistry<>()); + + try { + new FilterBindingsProvider( + new ComponentId("foo"), + new ServerConfig(configBuilder), + filterChainRepository, + new ComponentRegistry<>()); + fail("Dual-role filter should not be accepted"); + } catch (RuntimeException e) { + assertThat(e.getMessage(), containsString("Invalid config")); + } + } + + @Test + public void requireThatConfigWithUnknownReferenceFails() { + // Set up config. + configBuilder.filter(new ServerConfig.Filter.Builder().id("someFilter").binding("http://*/*")); + + // Set up registry. + final FilterChainRepository filterChainRepository = new FilterChainRepository( + new ChainsConfig(new ChainsConfig.Builder()), + new ComponentRegistry<>(), + new ComponentRegistry<>(), + new ComponentRegistry<>(), + new ComponentRegistry<>()); + + try { + new FilterBindingsProvider( + new ComponentId("foo"), + new ServerConfig(configBuilder), + filterChainRepository, + new ComponentRegistry<>()); + fail("Config with unknown filter reference should not be accepted"); + } catch (RuntimeException e) { + assertThat(e.getMessage(), containsString("Invalid config")); + } + } + + private static <T> Matcher<? super BindingRepository<T>> containsFilters( + final T... requiredInstances) { + return new TypeSafeMatcher<BindingRepository<T>>() { + private final Set<T> requiredFilterSet = new HashSet<>(Arrays.asList(requiredInstances)); + + @Override + protected boolean matchesSafely(final BindingRepository<T> actualInstances) { + final Set<T> notFoundFilterSet = new HashSet<>(requiredFilterSet); + for (final Map.Entry<UriPattern, T> actualEntry : actualInstances) { + notFoundFilterSet.remove(actualEntry.getValue()); + } + return notFoundFilterSet.isEmpty(); + } + + @Override + public void describeTo(final Description description) { + description.appendText("BindingRepository containing " + requiredFilterSet); + } + }; + } +} diff --git a/container-disc/src/test/java/com/yahoo/container/jdisc/component/DeconstructorTest.java b/container-disc/src/test/java/com/yahoo/container/jdisc/component/DeconstructorTest.java new file mode 100644 index 00000000000..b6bc1359406 --- /dev/null +++ b/container-disc/src/test/java/com/yahoo/container/jdisc/component/DeconstructorTest.java @@ -0,0 +1,68 @@ +// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.container.jdisc.component; + +import com.yahoo.component.AbstractComponent; +import com.yahoo.container.di.componentgraph.Provider; +import com.yahoo.jdisc.ResourceReference; +import com.yahoo.jdisc.SharedResource; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.assertTrue; + +/** + * @author gjoranv + */ +public class DeconstructorTest { + public static Deconstructor deconstructor; + + @Before + public void init() { + deconstructor = new Deconstructor(false); + } + + @Test + public void require_abstract_component_destructed() throws InterruptedException { + TestAbstractComponent abstractComponent = new TestAbstractComponent(); + // Done by executor, so it takes some time even with a 0 delay. + deconstructor.deconstruct(abstractComponent); + int cnt = 0; + while (! abstractComponent.destructed && (cnt++ < 10)) { + Thread.sleep(10); + } + assertTrue(abstractComponent.destructed); + } + + @Test + public void require_provider_destructed() { + TestProvider provider = new TestProvider(); + deconstructor.deconstruct(provider); + assertTrue(provider.destructed); + } + + @Test + public void require_shared_resource_released() { + TestSharedResource sharedResource = new TestSharedResource(); + deconstructor.deconstruct(sharedResource); + assertTrue(sharedResource.released); + } + + private static class TestAbstractComponent extends AbstractComponent { + boolean destructed = false; + @Override public void deconstruct() { destructed = true; } + } + + private static class TestProvider implements Provider<Void> { + boolean destructed = false; + + @Override public Void get() { return null; } + @Override public void deconstruct() { destructed = true; } + } + + private static class TestSharedResource implements SharedResource { + boolean released = false; + + @Override public ResourceReference refer() { return null; } + @Override public void release() { released = true; } + } +} diff --git a/container-disc/src/test/java/com/yahoo/container/jdisc/metric/ForwardingMetricConsumerTest.java b/container-disc/src/test/java/com/yahoo/container/jdisc/metric/ForwardingMetricConsumerTest.java new file mode 100644 index 00000000000..4a2714541be --- /dev/null +++ b/container-disc/src/test/java/com/yahoo/container/jdisc/metric/ForwardingMetricConsumerTest.java @@ -0,0 +1,45 @@ +// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.container.jdisc.metric; + +import com.yahoo.jdisc.Metric; +import com.yahoo.jdisc.application.MetricConsumer; +import org.junit.Test; +import org.mockito.Mockito; + +import java.util.HashMap; +import java.util.Map; + +import static org.junit.Assert.assertNotNull; + +/** + * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen Hult</a> + */ +public class ForwardingMetricConsumerTest { + + @Test + public void requireThatAllMethodsAreForwarded() { + MetricConsumer fooConsumer = Mockito.mock(MetricConsumer.class); + Metric.Context fooCtx = Mockito.mock(Metric.Context.class); + Mockito.when(fooConsumer.createContext(Mockito.<Map<String, ?>>any())).thenReturn(fooCtx); + + MetricConsumer barConsumer = Mockito.mock(MetricConsumer.class); + Metric.Context barCtx = Mockito.mock(Metric.Context.class); + Mockito.when(barConsumer.createContext(Mockito.<Map<String, ?>>any())).thenReturn(barCtx); + + MetricConsumer fwdConsumer = new ForwardingMetricConsumer(new MetricConsumer[] { fooConsumer, barConsumer }); + + Map<String, ?> properties = new HashMap<>(); + Metric.Context ctx = fwdConsumer.createContext(properties); + assertNotNull(ctx); + Mockito.verify(fooConsumer, Mockito.times(1)).createContext(properties); + Mockito.verify(barConsumer, Mockito.times(1)).createContext(properties); + + fwdConsumer.add("a", 69, ctx); + Mockito.verify(fooConsumer, Mockito.times(1)).add("a", 69, fooCtx); + Mockito.verify(barConsumer, Mockito.times(1)).add("a", 69, barCtx); + + fwdConsumer.set("b", 96, ctx); + Mockito.verify(fooConsumer, Mockito.times(1)).set("b", 96, fooCtx); + Mockito.verify(barConsumer, Mockito.times(1)).set("b", 96, barCtx); + } +} diff --git a/container-disc/src/test/java/com/yahoo/container/jdisc/metric/MetricConsumerFactories.java b/container-disc/src/test/java/com/yahoo/container/jdisc/metric/MetricConsumerFactories.java new file mode 100644 index 00000000000..b1173ba2bca --- /dev/null +++ b/container-disc/src/test/java/com/yahoo/container/jdisc/metric/MetricConsumerFactories.java @@ -0,0 +1,35 @@ +// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.container.jdisc.metric; + +import com.yahoo.container.jdisc.MetricConsumerFactory; +import com.yahoo.jdisc.application.MetricConsumer; +import org.mockito.Mockito; + +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen Hult</a> + */ +class MetricConsumerFactories { + + public static MetricConsumerFactory newSingleton(final MetricConsumer consumer) { + return new MetricConsumerFactory() { + + @Override + public MetricConsumer newInstance() { + return consumer; + } + }; + } + + public static MetricConsumerFactory newCounter(final AtomicInteger counter) { + return new MetricConsumerFactory() { + + @Override + public MetricConsumer newInstance() { + counter.incrementAndGet(); + return Mockito.mock(MetricConsumer.class); + } + }; + } +} diff --git a/container-disc/src/test/java/com/yahoo/container/jdisc/metric/MetricConsumerProviderTest.java b/container-disc/src/test/java/com/yahoo/container/jdisc/metric/MetricConsumerProviderTest.java new file mode 100644 index 00000000000..2cbd6a839ed --- /dev/null +++ b/container-disc/src/test/java/com/yahoo/container/jdisc/metric/MetricConsumerProviderTest.java @@ -0,0 +1,45 @@ +// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.container.jdisc.metric; + +import com.yahoo.jdisc.application.MetricConsumer; +import org.junit.Ignore; +import org.junit.Test; +import org.mockito.Mockito; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertSame; +import static org.junit.Assume.assumeTrue; + +/** + * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen Hult</a> + */ +public class MetricConsumerProviderTest { + + @Test + public void requireThatSingleConsumerIsNotDelegated() { + MetricConsumer consumer = Mockito.mock(MetricConsumer.class); + MetricConsumerProvider provider = MetricConsumerProviders.newSingletonFactories(consumer); + assertSame(consumer, provider.newInstance()); + } + + @Test + public void requireThatMultipleConsumersAreDelegated() { + MetricConsumer foo = Mockito.mock(MetricConsumer.class); + MetricConsumer bar = Mockito.mock(MetricConsumer.class); + MetricConsumerProvider provider = MetricConsumerProviders.newSingletonFactories(foo, bar); + MetricConsumer consumer = provider.newInstance(); + assertNotSame(foo, consumer); + assertNotSame(bar, consumer); + consumer.add("foo", 6, null); + Mockito.verify(foo, Mockito.times(1)).add("foo", 6, null); + Mockito.verify(bar, Mockito.times(1)).add("foo", 6, null); + } + + @Test + public void requireThatDefaultConsumerFactoryIsStateMetric() { + MetricConsumer consumer = MetricConsumerProviders.newDefaultInstance().newInstance(); + assertEquals("StateMetricConsumer", consumer.getClass().getSimpleName()); + } + +} diff --git a/container-disc/src/test/java/com/yahoo/container/jdisc/metric/MetricConsumerProviders.java b/container-disc/src/test/java/com/yahoo/container/jdisc/metric/MetricConsumerProviders.java new file mode 100644 index 00000000000..d094f43519f --- /dev/null +++ b/container-disc/src/test/java/com/yahoo/container/jdisc/metric/MetricConsumerProviders.java @@ -0,0 +1,51 @@ +// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.container.jdisc.metric; + +import com.yahoo.component.ComponentId; +import com.yahoo.component.provider.ComponentRegistry; +import com.yahoo.container.jdisc.MetricConsumerFactory; +import com.yahoo.container.jdisc.config.HealthMonitorConfig; +import com.yahoo.metrics.MetricsPresentationConfig; +import com.yahoo.container.jdisc.state.StateMonitor; +import com.yahoo.jdisc.application.MetricConsumer; +import com.yahoo.jdisc.core.SystemTimer; + +/** + * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen Hult</a> + */ +class MetricConsumerProviders { + + public static MetricConsumerProvider newSingletonFactories(MetricConsumer... consumers) { + MetricConsumerFactory[] factories = new MetricConsumerFactory[consumers.length]; + for (int i = 0; i < consumers.length; ++i) { + factories[i] = MetricConsumerFactories.newSingleton(consumers[i]); + } + return newInstance(factories); + } + + public static MetricConsumerProvider newInstance(MetricConsumerFactory... factories) { + return new MetricConsumerProvider(newComponentRegistry(factories), + new MetricsPresentationConfig(new MetricsPresentationConfig.Builder()), + newStateMonitor()); + } + + public static MetricConsumerProvider newDefaultInstance() { + return new MetricConsumerProvider(newComponentRegistry(), + new MetricsPresentationConfig(new MetricsPresentationConfig.Builder()), + newStateMonitor()); + } + + public static ComponentRegistry<MetricConsumerFactory> newComponentRegistry(MetricConsumerFactory... factories) { + ComponentRegistry<MetricConsumerFactory> registry = new ComponentRegistry<>(); + for (MetricConsumerFactory factory : factories) { + registry.register(new ComponentId(String.valueOf(factory.hashCode())), factory); + } + return registry; + } + + public static StateMonitor newStateMonitor() { + return new StateMonitor(new HealthMonitorConfig(new HealthMonitorConfig.Builder()), + new SystemTimer()); + } + +} diff --git a/container-disc/src/test/java/com/yahoo/container/jdisc/metric/MetricProviderTest.java b/container-disc/src/test/java/com/yahoo/container/jdisc/metric/MetricProviderTest.java new file mode 100644 index 00000000000..a5cb1730089 --- /dev/null +++ b/container-disc/src/test/java/com/yahoo/container/jdisc/metric/MetricProviderTest.java @@ -0,0 +1,71 @@ +// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.container.jdisc.metric; + +import com.yahoo.container.di.componentgraph.Provider; +import com.yahoo.jdisc.Metric; +import com.yahoo.jdisc.application.MetricConsumer; +import org.junit.Test; +import org.mockito.Mockito; + +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +import static junit.framework.Assert.assertNotNull; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +/** + * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen Hult</a> + */ +public class MetricProviderTest { + + @Test + public void requireThatMetricProviderDelegatesToConsumerFactory() { + MetricConsumer consumer = Mockito.mock(MetricConsumer.class); + MetricProvider provider = MetricProviders.newInstance(consumer); + + Metric metric = provider.get(); + assertNotNull(metric); + + Metric.Context fooCtx = Mockito.mock(Metric.Context.class); + metric.add("foo", 6, fooCtx); + metric.set("foo", 9, fooCtx); + Mockito.verify(consumer, Mockito.times(1)).add("foo", 6, fooCtx); + Mockito.verify(consumer, Mockito.times(1)).set("foo", 9, fooCtx); + } + + @Test + public void requireThatThreadLocalConsumersAreProvided() throws Exception { + AtomicInteger cnt = new AtomicInteger(0); + final MetricProvider metricProvider = MetricProviders.newInstance(MetricConsumerFactories.newCounter(cnt)); + assertEquals(0, cnt.get()); + metricProvider.get().add("foo", 6, null); // need to call on Metric to instantiate MetricConsumer + assertEquals(1, cnt.get()); + metricProvider.get().add("bar", 9, null); + assertEquals(1, cnt.get()); + + ExecutorService executor = Executors.newSingleThreadExecutor(); + assertTrue(executor.submit(new MetricTask(metricProvider)).get(60, TimeUnit.SECONDS)); + assertEquals(2, cnt.get()); + assertTrue(executor.submit(new MetricTask(metricProvider)).get(60, TimeUnit.SECONDS)); + assertEquals(2, cnt.get()); + } + + private static class MetricTask implements Callable<Boolean> { + + final Provider<Metric> provider; + + MetricTask(Provider<Metric> provider) { + this.provider = provider; + } + + @Override + public Boolean call() throws Exception { + provider.get().add("foo", 69, null); + return true; + } + } +} diff --git a/container-disc/src/test/java/com/yahoo/container/jdisc/metric/MetricProviders.java b/container-disc/src/test/java/com/yahoo/container/jdisc/metric/MetricProviders.java new file mode 100644 index 00000000000..620fb613f47 --- /dev/null +++ b/container-disc/src/test/java/com/yahoo/container/jdisc/metric/MetricProviders.java @@ -0,0 +1,19 @@ +// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.container.jdisc.metric; + +import com.yahoo.container.jdisc.MetricConsumerFactory; +import com.yahoo.jdisc.application.MetricConsumer; + +/** + * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen Hult</a> + */ +class MetricProviders { + + public static MetricProvider newInstance(MetricConsumer... consumers) { + return new MetricProvider(MetricConsumerProviders.newSingletonFactories(consumers)); + } + + public static MetricProvider newInstance(MetricConsumerFactory... factories) { + return new MetricProvider(MetricConsumerProviders.newInstance(factories)); + } +} diff --git a/container-disc/src/test/java/com/yahoo/container/jdisc/metric/MetricUpdaterTest.java b/container-disc/src/test/java/com/yahoo/container/jdisc/metric/MetricUpdaterTest.java new file mode 100644 index 00000000000..1067b572644 --- /dev/null +++ b/container-disc/src/test/java/com/yahoo/container/jdisc/metric/MetricUpdaterTest.java @@ -0,0 +1,35 @@ +// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.container.jdisc.metric; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.mockito.Mockito; + +import com.yahoo.jdisc.Metric; +import com.yahoo.jdisc.application.MetricConsumer; + +public class MetricUpdaterTest { + + @Test + public void testFreeMemory() throws InterruptedException { + MetricConsumer consumer = Mockito.mock(MetricConsumer.class); + MetricProvider provider = MetricProviders.newInstance(consumer); + + Metric metric = provider.get(); + MetricUpdater updater = new MetricUpdater(metric, 10); + long start = System.currentTimeMillis(); + boolean updated = false; + while (System.currentTimeMillis() - start < 60000 && !updated) { + Thread.sleep(10); + if (memoryMetricsUpdated(updater)) { + updated = true; + } + } + assertTrue(memoryMetricsUpdated(updater)); + } + + private boolean memoryMetricsUpdated(MetricUpdater updater) { + return updater.getFreeMemory()>0 && updater.getTotalMemory()>0; + } +} |