package io.pcp.parfait.dxm; import static org.junit.Assert.assertEquals; import java.util.Collections; import java.util.List; import org.junit.Test; import com.google.common.collect.ImmutableList; public class StringParsingIdentifierSourceSetTest { static final int FIXED_FALLBACK = 0xFEEDaBEE; private static final IdentifierSource FALLBACK_SOURCE = new ConstantIdentifierSource( FIXED_FALLBACK); static final IdentifierSourceSet FALLBACK_SOURCES = new IdentifierSourceSet() { @Override public IdentifierSource metricSource() { return FALLBACK_SOURCE; } @Override public IdentifierSource instanceSource(String domain) { return FALLBACK_SOURCE; } @Override public IdentifierSource instanceDomainSource() { return FALLBACK_SOURCE; } }; private static final String METRIC_NAME = "aMetric"; private static final int METRIC_ID = 123; private static final String DOMAIN_NAME = "aDomain"; private static final int DOMAIN_ID = 456; private static final String WHITESPACE = " "; private static final String INSTANCE_DOMAIN_LINE = DOMAIN_NAME + WHITESPACE + DOMAIN_ID; private static final String INSTANCE_NAME = "someInstance"; private static final int INSTANCE_ID = 789; @Test public void metricSourceShouldReturnSpecifiedValue() { assertMetricResultMatches(ImmutableList.of(METRIC_NAME + WHITESPACE + METRIC_ID)); } @Test public void metricParsingShouldSkipCommentLines() { assertMetricResultMatches(ImmutableList.of("# comment", METRIC_NAME + WHITESPACE + METRIC_ID)); } @Test public void metricParsingShouldSkipCommentLinesWithLeadingSpaces() { assertMetricResultMatches(ImmutableList.of(" # comment", METRIC_NAME + WHITESPACE + METRIC_ID)); } @Test public void metricParsingShouldIgnoreLeadingSpaces() { assertMetricResultMatches(ImmutableList.of(WHITESPACE + METRIC_NAME + WHITESPACE + METRIC_ID)); } @Test public void metricParsingShouldIgnoreTrailingSpaces() { assertMetricResultMatches(ImmutableList.of(METRIC_NAME + WHITESPACE + METRIC_ID + WHITESPACE)); } @Test public void metricParsingShouldCollapseIntermediateSpaces() { assertMetricResultMatches(ImmutableList.of(METRIC_NAME + WHITESPACE + WHITESPACE + METRIC_ID)); } @Test(expected = IllegalArgumentException.class) public void metricParsingShouldFailIfOnlyOneColumn() { assertMetricResultMatches(ImmutableList.of(METRIC_NAME)); } @Test(expected = IllegalArgumentException.class) public void metricParsingShouldFailIfValueNotAnInteger() { assertMetricResultMatches(ImmutableList.of(METRIC_NAME + WHITESPACE + "blah")); } @Test(expected = IllegalArgumentException.class) public void metricParsingShouldFailWhenDuplicateIds() { assertMetricResultMatches(ImmutableList.of(METRIC_NAME + WHITESPACE + METRIC_ID, "duplicate" + WHITESPACE + METRIC_ID)); } @Test public void domainSourceShouldReturnSpecifiedValue() { assertDomainResultMatches(ImmutableList.of(DOMAIN_NAME + WHITESPACE + DOMAIN_ID)); } @Test public void domainParsingShouldIgnoreTrailingSpaces() { assertDomainResultMatches(ImmutableList.of(DOMAIN_NAME + WHITESPACE + DOMAIN_ID + WHITESPACE)); } @Test public void domainParsingShouldCollapseIntermediateSpaces() { assertDomainResultMatches(ImmutableList.of(DOMAIN_NAME + WHITESPACE + WHITESPACE + DOMAIN_ID)); } @Test(expected = IllegalArgumentException.class) public void domainParsingShouldFailIfOnlyOneColumn() { assertDomainResultMatches(ImmutableList.of(DOMAIN_NAME + WHITESPACE)); } @Test(expected = IllegalArgumentException.class) public void domainParsingShouldFailIfValueNotAnInteger() { assertDomainResultMatches(ImmutableList.of(DOMAIN_NAME + WHITESPACE + "bloop")); } @Test public void domainSourceShouldSkipCommentLines() { assertDomainResultMatches(ImmutableList.of("# Comment", DOMAIN_NAME + WHITESPACE + DOMAIN_ID)); } @Test public void domainSourceShouldSkipCommentLinesWithLeadingSpaces() { assertDomainResultMatches(ImmutableList.of("\t# Comment", DOMAIN_NAME + WHITESPACE + DOMAIN_ID)); } @Test(expected = IllegalArgumentException.class) public void instanceParsingShouldFailIfNoDomainSpecifiedYet() { assertDomainResultMatches(ImmutableList.of(WHITESPACE + INSTANCE_NAME + WHITESPACE + INSTANCE_ID)); } @Test public void instanceSourceShouldReturnSpecifiedValue() { assertInstanceResultMatches(ImmutableList.of(INSTANCE_DOMAIN_LINE, WHITESPACE + INSTANCE_NAME + WHITESPACE + INSTANCE_ID)); } @Test public void instanceSourceShouldIgnoreTrailingSpaces() { assertInstanceResultMatches(ImmutableList.of(INSTANCE_DOMAIN_LINE, WHITESPACE + INSTANCE_NAME + WHITESPACE + INSTANCE_ID + WHITESPACE)); } @Test public void instanceSourceShouldCollapseIntermediateSpaces() { assertInstanceResultMatches(ImmutableList.of(INSTANCE_DOMAIN_LINE, WHITESPACE + INSTANCE_NAME + WHITESPACE + WHITESPACE + INSTANCE_ID)); } @Test public void instanceSourceShouldSkipCommentLines() { assertInstanceResultMatches(ImmutableList.of(INSTANCE_DOMAIN_LINE, " # Comment ", WHITESPACE + INSTANCE_NAME + WHITESPACE + WHITESPACE + INSTANCE_ID)); } @Test(expected = IllegalArgumentException.class) public void instanceSourceShouldFailIfOnlyOneColumn() { assertInstanceResultMatches(ImmutableList.of(INSTANCE_DOMAIN_LINE, WHITESPACE + INSTANCE_NAME)); } @Test(expected = IllegalArgumentException.class) public void instanceSourceShouldFailIfValueNotAnInteger() { assertInstanceResultMatches(ImmutableList.of(INSTANCE_DOMAIN_LINE, WHITESPACE + INSTANCE_NAME + WHITESPACE + "blah")); } private void assertMetricResultMatches(List<String> input) { IdentifierSourceSet sources = new StringParsingIdentifierSourceSet(Collections .<String> emptyList(), input, FALLBACK_SOURCES); assertEquals(METRIC_ID, sources.metricSource().calculateId(METRIC_NAME, Collections.<Integer> emptySet())); } private void assertDomainResultMatches(List<String> input) { IdentifierSourceSet sources = new StringParsingIdentifierSourceSet(input, Collections .<String> emptyList(), FALLBACK_SOURCES); assertEquals(DOMAIN_ID, sources.instanceDomainSource().calculateId(DOMAIN_NAME, Collections.<Integer> emptySet())); } private void assertInstanceResultMatches(List<String> input) { IdentifierSourceSet sources = new StringParsingIdentifierSourceSet(input, Collections .<String> emptyList(), FALLBACK_SOURCES); assertEquals(INSTANCE_ID, sources.instanceSource(DOMAIN_NAME).calculateId(INSTANCE_NAME, Collections.<Integer> emptySet())); } }