package com.linkedin.thirdeye.anomaly.alert.grouping;
import com.linkedin.thirdeye.api.DimensionMap;
import com.linkedin.thirdeye.datalayer.dto.GroupedAnomalyResultsDTO;
import com.linkedin.thirdeye.datalayer.dto.MergedAnomalyResultDTO;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class HorizontalDimensionalAlertGrouperTest {
private final static String GROUP_BY_DIMENSION_NAME_1 = "G";
private final static String GROUP_BY_DIMENSION_NAME_2 = "H";
private final static String GROUP_BY_DIMENSION_NAME = GROUP_BY_DIMENSION_NAME_1 + "," + GROUP_BY_DIMENSION_NAME_2;
private HorizontalDimensionalAlertGrouper alertGrouper;
@Test
public void testCreate() {
Map<String, String> props = new HashMap<>();
props.put(HorizontalDimensionalAlertGrouper.GROUP_BY_KEY, GROUP_BY_DIMENSION_NAME);
try {
alertGrouper = new HorizontalDimensionalAlertGrouper();
alertGrouper.setParameters(props);
} catch (Exception e) {
e.printStackTrace();
Assert.fail();
}
}
@Test(dataProvider = "prepareAnomalyGroups", dependsOnMethods = { "testCreate" })
public void testGroup(List<MergedAnomalyResultDTO> anomalies, Set<MergedAnomalyResultDTO> expectedGroupG1,
Set<MergedAnomalyResultDTO> expectedGroupG2, Set<MergedAnomalyResultDTO> expectedGroupH1,
Set<MergedAnomalyResultDTO> expectedGroupH2) {
Map<DimensionMap, GroupedAnomalyResultsDTO> groupedAnomalies = alertGrouper.group(anomalies);
Assert.assertEquals(groupedAnomalies.size(), 4);
// Test group G1
{
DimensionMap alertGroupG1 = new DimensionMap();
alertGroupG1.put(GROUP_BY_DIMENSION_NAME_1, "G1");
GroupedAnomalyResultsDTO groupedAnomaly = groupedAnomalies.get(alertGroupG1);
List<MergedAnomalyResultDTO> anomalyGroup = groupedAnomaly.getAnomalyResults();
Assert.assertEquals(anomalyGroup.size(), 2);
Set<MergedAnomalyResultDTO> actualGroupAnomaly = new HashSet<>();
actualGroupAnomaly.addAll(anomalyGroup);
Assert.assertEquals(actualGroupAnomaly, expectedGroupG1);
}
// Test group G2
{
DimensionMap alertGroupG2 = new DimensionMap();
alertGroupG2.put(GROUP_BY_DIMENSION_NAME_1, "G2");
GroupedAnomalyResultsDTO groupedAnomaly = groupedAnomalies.get(alertGroupG2);
List<MergedAnomalyResultDTO> anomalyGroup = groupedAnomaly.getAnomalyResults();
Assert.assertEquals(anomalyGroup.size(), 2);
Set<MergedAnomalyResultDTO> actualGroupAnomaly = new HashSet<>();
actualGroupAnomaly.addAll(anomalyGroup);
Assert.assertEquals(actualGroupAnomaly, expectedGroupG2);
}
// Test group H1
{
DimensionMap alertGroupH1 = new DimensionMap();
alertGroupH1.put(GROUP_BY_DIMENSION_NAME_2, "H1");
GroupedAnomalyResultsDTO groupedAnomaly = groupedAnomalies.get(alertGroupH1);
List<MergedAnomalyResultDTO> anomalyGroup = groupedAnomaly.getAnomalyResults();
Assert.assertEquals(anomalyGroup.size(), 2);
Set<MergedAnomalyResultDTO> actualGroupAnomaly = new HashSet<>();
actualGroupAnomaly.addAll(anomalyGroup);
Assert.assertEquals(actualGroupAnomaly, expectedGroupH1);
}
// Test group H2
{
DimensionMap alertGroupH2 = new DimensionMap();
alertGroupH2.put(GROUP_BY_DIMENSION_NAME_2, "H2");
GroupedAnomalyResultsDTO groupedAnomaly = groupedAnomalies.get(alertGroupH2);
List<MergedAnomalyResultDTO> anomalyGroup = groupedAnomaly.getAnomalyResults();
Assert.assertEquals(anomalyGroup.size(), 2);
Set<MergedAnomalyResultDTO> actualGroupAnomaly = new HashSet<>();
actualGroupAnomaly.addAll(anomalyGroup);
Assert.assertEquals(actualGroupAnomaly, expectedGroupH2);
}
}
@DataProvider(name = "prepareAnomalyGroups")
public static Object[][] prepareAnomalyGroups() {
List<MergedAnomalyResultDTO> anomalies = new ArrayList<>();
Set<MergedAnomalyResultDTO> expectedGroupG1 = new HashSet<>();
Set<MergedAnomalyResultDTO> expectedGroupG2 = new HashSet<>();
Set<MergedAnomalyResultDTO> expectedGroupH1 = new HashSet<>();
Set<MergedAnomalyResultDTO> expectedGroupH2 = new HashSet<>();
// Member of group G2 and H1
{
DimensionMap dimensionGroup2Member1 = new DimensionMap();
dimensionGroup2Member1.put(GROUP_BY_DIMENSION_NAME_1, "G2");
dimensionGroup2Member1.put(GROUP_BY_DIMENSION_NAME_2, "H1");
MergedAnomalyResultDTO anomalyG2H1 = new MergedAnomalyResultDTO();
anomalyG2H1.setDimensions(dimensionGroup2Member1);
anomalies.add(anomalyG2H1);
expectedGroupG2.add(anomalyG2H1);
expectedGroupH1.add(anomalyG2H1);
}
// Member of group G2 and H2
{
DimensionMap dimensionGroup2Member2 = new DimensionMap();
dimensionGroup2Member2.put(GROUP_BY_DIMENSION_NAME_1, "G2");
dimensionGroup2Member2.put(GROUP_BY_DIMENSION_NAME_2, "H2");
MergedAnomalyResultDTO anomalyG2H2 = new MergedAnomalyResultDTO();
anomalyG2H2.setDimensions(dimensionGroup2Member2);
anomalies.add(anomalyG2H2);
expectedGroupG2.add(anomalyG2H2);
expectedGroupH2.add(anomalyG2H2);
}
// Member of group G1 and H2
{
DimensionMap dimensionGroup1Member2 = new DimensionMap();
dimensionGroup1Member2.put(GROUP_BY_DIMENSION_NAME_1, "G1");
dimensionGroup1Member2.put(GROUP_BY_DIMENSION_NAME_2, "H2");
MergedAnomalyResultDTO anomalyG1H2 = new MergedAnomalyResultDTO();
anomalyG1H2.setDimensions(dimensionGroup1Member2);
anomalies.add(anomalyG1H2);
expectedGroupG1.add(anomalyG1H2);
expectedGroupH2.add(anomalyG1H2);
}
// Member of group G1 and H1
{
DimensionMap dimensionGroup1Member1 = new DimensionMap();
dimensionGroup1Member1.put(GROUP_BY_DIMENSION_NAME_1, "G1");
dimensionGroup1Member1.put(GROUP_BY_DIMENSION_NAME_2, "H1");
MergedAnomalyResultDTO anomalyG1H1 = new MergedAnomalyResultDTO();
anomalyG1H1.setDimensions(dimensionGroup1Member1);
anomalies.add(anomalyG1H1);
expectedGroupG1.add(anomalyG1H1);
expectedGroupH1.add(anomalyG1H1);
}
List<Object[]> entries = new ArrayList<>();
entries.add(
new Object[] { anomalies, expectedGroupG1, expectedGroupG2, expectedGroupH1,
expectedGroupH2
});
return entries.toArray(new Object[entries.size()][]);
}
}