package rocks.inspectit.server.diagnosis.engine.rule.store;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.hamcrest.Matchers.empty;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.hasSize;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import org.mockito.InjectMocks;
import org.testng.annotations.Test;
import com.google.common.collect.Multimap;
import rocks.inspectit.server.diagnosis.engine.rule.ConditionFailure;
import rocks.inspectit.server.diagnosis.engine.rule.RuleOutput;
import rocks.inspectit.server.diagnosis.engine.tag.Tag;
import rocks.inspectit.server.diagnosis.engine.tag.TagState;
import rocks.inspectit.server.diagnosis.engine.tag.Tags;
import rocks.inspectit.shared.all.testbase.TestBase;
/**
* Tests the {@link DefaultRuleOutputStorage} class.
*
* @author Alexander Wert
*
*/
public class DefaultRuleOutputStorageTest extends TestBase {
@InjectMocks
DefaultRuleOutputStorage storage;
/**
* Tests the {@link DefaultRuleOutputStorage#store(java.util.Collection)} and
* {@link DefaultRuleOutputStorage#store(rocks.inspectit.server.diagnosis.engine.rule.RuleOutput)}
* methods.
*
* @author Alexander Wert
*
*/
public class Store extends DefaultRuleOutputStorageTest {
@Test
public void storeWithoutConditionFailures() {
Tag rootTag = Tags.tag(Tags.ROOT_TAG, "root");
Tag tagA = Tags.tag("A", "inputA", rootTag);
RuleOutput output = new RuleOutput("RuleA", "A", Collections.<ConditionFailure> emptySet(), Collections.singleton(tagA));
storage.store(output);
assertThat(storage.getAvailableTagTypes(), containsInAnyOrder("A"));
assertThat(storage.getAllOutputs().keySet(), hasSize(1));
assertThat(storage.getAllOutputs().keySet(), containsInAnyOrder("A"));
assertThat(storage.getAllOutputs().get("A"), containsInAnyOrder(output));
assertThat(storage.getAllOutputsWithConditionFailures().keySet(), hasSize(0));
}
@Test
public void storeMultipleWithoutConditionFailures() {
Tag rootTag = Tags.tag(Tags.ROOT_TAG, "root");
Tag tagA = Tags.tag("A", "inputA", rootTag);
Tag tagB = Tags.tag("B", "inputB", rootTag);
RuleOutput outputA = new RuleOutput("RuleA", "A", Collections.<ConditionFailure> emptySet(), Collections.singleton(tagA));
RuleOutput outputB = new RuleOutput("RuleB", "B", Collections.<ConditionFailure> emptySet(), Collections.singleton(tagB));
storage.store(Arrays.asList(outputA, outputB));
assertThat(storage.getAvailableTagTypes(), containsInAnyOrder("A", "B"));
assertThat(storage.getAllOutputs().keySet(), hasSize(2));
assertThat(storage.getAllOutputs().keySet(), containsInAnyOrder("A", "B"));
assertThat(storage.getAllOutputs().get("A"), containsInAnyOrder(outputA));
assertThat(storage.getAllOutputs().get("B"), containsInAnyOrder(outputB));
assertThat(storage.getAllOutputsWithConditionFailures().keySet(), hasSize(0));
}
@Test
public void storeWithConditionFailures() {
ConditionFailure failure = new ConditionFailure("ConditionX", "SomeHint");
RuleOutput output = new RuleOutput("RuleA", "A", Collections.singleton(failure), Collections.<Tag> emptySet());
storage.store(output);
assertThat(storage.getAvailableTagTypes(), empty());
assertThat(storage.getAllOutputs().keySet(), empty());
assertThat(storage.getAllOutputsWithConditionFailures().keySet(), hasSize(1));
assertThat(storage.getAllOutputsWithConditionFailures().get("A"), containsInAnyOrder(output));
}
@Test
public void storeMultipleWithConditionFailures() {
ConditionFailure failure1 = new ConditionFailure("ConditionX", "SomeHint");
ConditionFailure failure2 = new ConditionFailure("ConditionY", "SomeHint");
RuleOutput outputA = new RuleOutput("RuleA", "A", Collections.singleton(failure1), Collections.<Tag> emptySet());
RuleOutput outputB = new RuleOutput("RuleB", "B", Collections.singleton(failure2), Collections.<Tag> emptySet());
storage.store(Arrays.asList(outputA, outputB));
assertThat(storage.getAvailableTagTypes(), empty());
assertThat(storage.getAllOutputs().keySet(), empty());
assertThat(storage.getAllOutputsWithConditionFailures().keySet(), hasSize(2));
assertThat(storage.getAllOutputsWithConditionFailures().get("A"), containsInAnyOrder(outputA));
assertThat(storage.getAllOutputsWithConditionFailures().get("B"), containsInAnyOrder(outputB));
}
@Test
public void storeWithAndWithoutConditionFailure() {
ConditionFailure failure = new ConditionFailure("ConditionX", "SomeHint");
RuleOutput outputA = new RuleOutput("RuleA", "A", Collections.singleton(failure), Collections.<Tag> emptySet());
Tag rootTag = Tags.tag(Tags.ROOT_TAG, "root");
Tag tagB = Tags.tag("B", "inputB", rootTag);
RuleOutput outputB = new RuleOutput("RuleB", "B", Collections.<ConditionFailure> emptySet(), Collections.singleton(tagB));
storage.store(Arrays.asList(outputA, outputB));
assertThat(storage.getAvailableTagTypes(), containsInAnyOrder("B"));
assertThat(storage.getAllOutputs().keySet(), hasSize(1));
assertThat(storage.getAllOutputs().keySet(), containsInAnyOrder("B"));
assertThat(storage.getAllOutputs().get("A"), empty());
assertThat(storage.getAllOutputs().get("B"), containsInAnyOrder(outputB));
assertThat(storage.getAllOutputsWithConditionFailures().keySet(), hasSize(1));
assertThat(storage.getAllOutputsWithConditionFailures().get("A"), containsInAnyOrder(outputA));
}
}
/**
* Tests the
* {@link DefaultRuleOutputStorage#mapTags(rocks.inspectit.server.diagnosis.engine.tag.TagState)}
* method.
*
* @author Alexander Wert
*
*/
public class MapTags extends DefaultRuleOutputStorageTest {
@Test
public void mapSimpleLeafs() {
Tag rootTag = Tags.tag(Tags.ROOT_TAG, "root");
Tag tagA = Tags.tag("A", "inputA", rootTag);
Tag tagB = Tags.tag("B", "inputB", rootTag);
Tag tagC = Tags.tag("C", "inputC", tagB);
Tag tagD = Tags.tag("D", "inputD", tagA);
RuleOutput outputA = new RuleOutput("RuleA", "A", Collections.<ConditionFailure> emptySet(), Collections.singleton(tagA));
RuleOutput outputB = new RuleOutput("RuleB", "B", Collections.<ConditionFailure> emptySet(), Collections.singleton(tagB));
RuleOutput outputC = new RuleOutput("RuleC", "C", Collections.<ConditionFailure> emptySet(), Collections.singleton(tagC));
RuleOutput outputD = new RuleOutput("RuleD", "D", Collections.<ConditionFailure> emptySet(), Collections.singleton(tagD));
storage.store(Arrays.asList(outputA, outputB, outputC, outputD));
Multimap<String, Tag> tags = storage.mapTags(TagState.LEAF);
assertThat(tags.size(), equalTo(2));
assertThat(tags.keySet(), hasSize(2));
assertThat(tags.get("A"), empty());
assertThat(tags.get("B"), empty());
assertThat(tags.get("C"), containsInAnyOrder(tagC));
assertThat(tags.get("D"), containsInAnyOrder(tagD));
}
@Test
public void mapMultiTagLeafs() {
Tag rootTag = Tags.tag(Tags.ROOT_TAG, "root");
Tag tagA = Tags.tag("A", "inputA", rootTag);
Tag tagB = Tags.tag("B", "inputB", rootTag);
Tag tagC1 = Tags.tag("C", "inputC1", tagB);
Tag tagC2 = Tags.tag("C", "inputC2", tagB);
Tag tagD1 = Tags.tag("D", "inputD1", tagA);
Tag tagD2 = Tags.tag("D", "inputD2", tagA);
RuleOutput outputA = new RuleOutput("RuleA", "A", Collections.<ConditionFailure> emptySet(), Collections.singleton(tagA));
RuleOutput outputB = new RuleOutput("RuleB", "B", Collections.<ConditionFailure> emptySet(), Collections.singleton(tagB));
RuleOutput outputC = new RuleOutput("RuleC", "C", Collections.<ConditionFailure> emptySet(), Arrays.asList(tagC1, tagC2));
RuleOutput outputD1 = new RuleOutput("RuleD", "D", Collections.<ConditionFailure> emptySet(), Collections.singleton(tagD1));
RuleOutput outputD2 = new RuleOutput("RuleD", "D", Collections.<ConditionFailure> emptySet(), Collections.singleton(tagD2));
storage.store(Arrays.asList(outputA, outputB, outputC, outputD1, outputD2));
Multimap<String, Tag> tags = storage.mapTags(TagState.LEAF);
assertThat(tags.size(), equalTo(4));
assertThat(tags.keySet(), hasSize(2));
assertThat(tags.get("A"), empty());
assertThat(tags.get("B"), empty());
assertThat(tags.get("C"), containsInAnyOrder(tagC1, tagC2));
assertThat(tags.get("D"), containsInAnyOrder(tagD1, tagD2));
}
@Test
public void mapWithConditionFailuresLeafs() {
Tag rootTag = Tags.tag(Tags.ROOT_TAG, "root");
Tag tagA = Tags.tag("A", "inputA", rootTag);
Tag tagB = Tags.tag("B", "inputB", rootTag);
Tags.tag("C", "inputC", tagB);
ConditionFailure failure = new ConditionFailure("ConditionX", "SomeHint");
Tag tagD = Tags.tag("D", "inputD", tagA);
RuleOutput outputA = new RuleOutput("RuleA", "A", Collections.<ConditionFailure> emptySet(), Collections.singleton(tagA));
RuleOutput outputB = new RuleOutput("RuleB", "B", Collections.<ConditionFailure> emptySet(), Collections.singleton(tagB));
RuleOutput outputC = new RuleOutput("RuleC", "C", Collections.singleton(failure), Collections.<Tag> emptySet());
RuleOutput outputD = new RuleOutput("RuleD", "D", Collections.<ConditionFailure> emptySet(), Collections.singleton(tagD));
storage.store(Arrays.asList(outputA, outputB, outputC, outputD));
Multimap<String, Tag> tags = storage.mapTags(TagState.LEAF);
assertThat(tags.size(), equalTo(1));
assertThat(tags.get("A"), empty());
assertThat(tags.get("B"), empty());
assertThat(tags.get("C"), empty());
assertThat(tags.get("D"), containsInAnyOrder(tagD));
}
}
/**
* Tests the {@link DefaultRuleOutputStorage#findLatestResultsByTagType(java.util.Set)} method.
*
* @author Alexander Wert
*
*/
public class FindLatestResultsByTagType extends DefaultRuleOutputStorageTest {
@Test
public void findWithSingleTagType() {
Tag rootTag = Tags.tag(Tags.ROOT_TAG, "root");
Tag tagA = Tags.tag("A", "inputA", rootTag);
Tag tagB = Tags.tag("B", "inputB", rootTag);
Tag tagC1 = Tags.tag("C", "inputC1", tagB);
Tag tagC2 = Tags.tag("C", "inputC2", tagB);
Tag tagD1 = Tags.tag("D", "inputD1", tagA);
Tag tagD2 = Tags.tag("D", "inputD2", tagA);
RuleOutput outputA = new RuleOutput("RuleA", "A", Collections.<ConditionFailure> emptySet(), Collections.singleton(tagA));
RuleOutput outputB = new RuleOutput("RuleB", "B", Collections.<ConditionFailure> emptySet(), Collections.singleton(tagB));
RuleOutput outputC = new RuleOutput("RuleC", "C", Collections.<ConditionFailure> emptySet(), Arrays.asList(tagC1, tagC2));
RuleOutput outputD1 = new RuleOutput("RuleD", "D", Collections.<ConditionFailure> emptySet(), Collections.singleton(tagD1));
RuleOutput outputD2 = new RuleOutput("RuleD", "D", Collections.<ConditionFailure> emptySet(), Collections.singleton(tagD2));
storage.store(Arrays.asList(outputA, outputB, outputC, outputD1, outputD2));
Collection<RuleOutput> outputs = storage.findLatestResultsByTagType(new HashSet<>(Arrays.asList("D")));
assertThat(outputs, hasSize(2));
assertThat(outputs, containsInAnyOrder(outputD1, outputD2));
}
@Test
public void findWithMultipleTagTypes() {
Tag rootTag = Tags.tag(Tags.ROOT_TAG, "root");
Tag tagA = Tags.tag("A", "inputA", rootTag);
Tag tagB = Tags.tag("B", "inputB", rootTag);
Tag tagC1 = Tags.tag("C", "inputC1", tagB);
Tag tagC2 = Tags.tag("C", "inputC2", tagB);
Tag tagD1 = Tags.tag("D", "inputD1", tagA);
Tag tagD2 = Tags.tag("D", "inputD2", tagA);
RuleOutput outputA = new RuleOutput("RuleA", "A", Collections.<ConditionFailure> emptySet(), Collections.singleton(tagA));
RuleOutput outputB = new RuleOutput("RuleB", "B", Collections.<ConditionFailure> emptySet(), Collections.singleton(tagB));
RuleOutput outputC = new RuleOutput("RuleC", "C", Collections.<ConditionFailure> emptySet(), Arrays.asList(tagC1, tagC2));
RuleOutput outputD1 = new RuleOutput("RuleD", "D", Collections.<ConditionFailure> emptySet(), Collections.singleton(tagD1));
RuleOutput outputD2 = new RuleOutput("RuleD", "D", Collections.<ConditionFailure> emptySet(), Collections.singleton(tagD2));
storage.store(Arrays.asList(outputA, outputB, outputC, outputD1, outputD2));
Collection<RuleOutput> outputs = storage.findLatestResultsByTagType(new HashSet<>(Arrays.asList("D", "C")));
assertThat(outputs, hasSize(3));
assertThat(outputs, containsInAnyOrder(outputD1, outputD2, outputC));
}
}
}