summaryrefslogtreecommitdiffstats
path: root/container-disc/src/test/java
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
committerJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
commit72231250ed81e10d66bfe70701e64fa5fe50f712 (patch)
tree2728bba1131a6f6e5bdf95afec7d7ff9358dac50 /container-disc/src/test/java
Publish
Diffstat (limited to 'container-disc/src/test/java')
-rw-r--r--container-disc/src/test/java/com/yahoo/container/jdisc/ContainerThreadFactoryTest.java46
-rw-r--r--container-disc/src/test/java/com/yahoo/container/jdisc/DisableOsgiFrameworkTest.java46
-rw-r--r--container-disc/src/test/java/com/yahoo/container/jdisc/FilterBindingsProviderTest.java202
-rw-r--r--container-disc/src/test/java/com/yahoo/container/jdisc/component/DeconstructorTest.java68
-rw-r--r--container-disc/src/test/java/com/yahoo/container/jdisc/metric/ForwardingMetricConsumerTest.java45
-rw-r--r--container-disc/src/test/java/com/yahoo/container/jdisc/metric/MetricConsumerFactories.java35
-rw-r--r--container-disc/src/test/java/com/yahoo/container/jdisc/metric/MetricConsumerProviderTest.java45
-rw-r--r--container-disc/src/test/java/com/yahoo/container/jdisc/metric/MetricConsumerProviders.java51
-rw-r--r--container-disc/src/test/java/com/yahoo/container/jdisc/metric/MetricProviderTest.java71
-rw-r--r--container-disc/src/test/java/com/yahoo/container/jdisc/metric/MetricProviders.java19
-rw-r--r--container-disc/src/test/java/com/yahoo/container/jdisc/metric/MetricUpdaterTest.java35
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;
+ }
+}