package com.spotify.heroic.aggregation; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.spotify.heroic.common.Duration; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import java.util.Optional; import java.util.concurrent.TimeUnit; import static org.junit.Assert.assertEquals; import static org.mockito.Matchers.any; import static org.mockito.Mockito.doReturn; /** * Tests for a bunch of aggregation archetypes. * * @author udoprog */ @RunWith(MockitoJUnitRunner.class) public class AggregationTest { @Mock private Aggregation a; @Mock private AggregationInstance instance; private AggregationContext context; @Before public void setup() { doReturn(instance).when(a).apply(any(AggregationContext.class)); context = AggregationContext.defaultInstance(Duration.of(1, TimeUnit.MINUTES)); } @Test public void testEmptyInChain() { Aggregations.chain(); } /** * Test that required tags works when elided for a given collection of aggregations. */ @Test public void testTagElision() { final Aggregation g1 = Group.of(Optional.of(ImmutableList.of("foo")), Optional.of(a)); final Aggregation g2 = Group.of(Optional.of(ImmutableList.of("bar")), Optional.of(new Chain(ImmutableList.of( // inner groups should _not_ force tags elision Group.of(Optional.of(ImmutableList.of("baz")), Optional.of(a)))))); final AggregationInstance instance = Aggregations.chain(Optional.of(ImmutableList.of(g1, g2))).apply(context); final ChainInstance chain = (ChainInstance) instance; final GroupInstance g1i = (GroupInstance) chain.getChain().get(0); final GroupInstance g2i = (GroupInstance) chain.getChain().get(1); final GroupInstance g2i1i = (GroupInstance) (((GroupInstance) chain.getChain().get(1)).getEach()); assertEquals(Optional.of(ImmutableSet.of("foo", "bar")), g1i.getOf().map(ImmutableSet::copyOf)); assertEquals(Optional.of(ImmutableSet.of("bar")), g2i.getOf().map(ImmutableSet::copyOf)); assertEquals(Optional.of(ImmutableSet.of("baz")), g2i1i.getOf().map(ImmutableSet::copyOf)); } }