/**
* Copyright (c) Codice Foundation
* <p/>
* This is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser
* General Public License as published by the Free Software Foundation, either version 3 of the
* License, or any later version.
* <p/>
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details. A copy of the GNU Lesser General Public License
* is distributed along with this program and can be found at
* <http://www.gnu.org/licenses/lgpl.html>.
*/
package ddf.catalog.metrics.source;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.nullValue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.Collections;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.codahale.metrics.Histogram;
import com.codahale.metrics.Meter;
import ddf.catalog.metrics.source.SourceMetricsImpl.SourceMetric;
import ddf.catalog.source.CatalogProvider;
import ddf.catalog.source.FederatedSource;
import ddf.catalog.source.SourceMetrics;
public class SourceMetricsImplTest {
private static final Logger LOGGER = LoggerFactory.getLogger(SourceMetricsImplTest.class);
private SourceMetricsImpl sourceMetrics;
private CatalogProvider catalogProvider;
private FederatedSource fedSource;
@Test
public void testAddDeleteSource() throws Exception {
String sourceId = "cp-1";
String metricName = SourceMetrics.QUERIES_SCOPE;
sourceMetrics = configureSourceMetrics(sourceId);
addSource();
String key = sourceId + "." + metricName;
SourceMetric sourceMetric = sourceMetrics.metrics.get(key);
assertThat(sourceMetric, not(nullValue()));
sourceMetrics.deletingSource(catalogProvider, null);
sourceMetric = sourceMetrics.metrics.get(key);
assertThat(sourceMetric, is(nullValue()));
}
@Test
public void testNewSource() throws Exception {
String sourceId = "cp-1";
String metricName = SourceMetrics.QUERIES_SCOPE;
sourceMetrics = configureSourceMetrics(sourceId);
sourceMetrics.updateMetric(sourceId, metricName, 1);
assertMetricCount(sourceId, metricName, 1);
}
@Test
public void testSourceIdChanged() throws Exception {
String sourceId = "cp-1";
String metricName = SourceMetrics.QUERIES_SCOPE;
sourceMetrics = configureSourceMetrics(sourceId);
// Simulate initial creation of Source
addSource();
// Simulate changing Source's name
String newSourceId = "cp-new";
when(catalogProvider.getId()).thenReturn(newSourceId);
sourceMetrics.updateMetric(newSourceId, metricName, 1);
assertMetricCount(newSourceId, metricName, 1);
}
@Test
public void testSourceCreatedWithNullId() throws Exception {
String sourceId = null;
String metricName = SourceMetrics.QUERIES_TOTAL_RESULTS_SCOPE;
sourceMetrics = configureSourceMetrics(sourceId);
// Simulate initial creation of Source
addSource();
// Simulate changing Source's name
String newSourceId = "cp-1";
when(catalogProvider.getId()).thenReturn(newSourceId);
sourceMetrics.updateMetric(newSourceId, metricName, 1);
assertMetricCount(newSourceId, metricName, 1);
}
@Test
public void testUpdateNonExistingSourceMetric() throws Exception {
String sourceId = "existing-source";
String metricName = SourceMetrics.QUERIES_SCOPE;
sourceMetrics = configureSourceMetrics(sourceId);
String nonExistingSourceId = "non-existing-source-id";
sourceMetrics.updateMetric(nonExistingSourceId, metricName, 1);
String key = nonExistingSourceId + "." + metricName;
SourceMetric sourceMetric = sourceMetrics.metrics.get(key);
assertThat(sourceMetric, is(nullValue()));
}
@Test
public void testUpdateMetricForEmptySourceId() throws Exception {
String sourceId = "existing-source";
String metricName = SourceMetrics.QUERIES_SCOPE;
sourceMetrics = configureSourceMetrics(sourceId);
sourceMetrics.updateMetric("", metricName, 1);
assertThat(sourceMetrics.metrics.size(), is(0));
}
@Test
public void testUpdateEmptyMetricForSourceId() throws Exception {
String sourceId = "existing-source";
sourceMetrics = configureSourceMetrics(sourceId);
sourceMetrics.updateMetric(sourceId, "", 1);
assertThat(sourceMetrics.metrics.size(), is(0));
}
@Test
public void testUpdateNonExistentMetricForExistingSourceId() throws Exception {
String sourceId = "existing-source";
sourceMetrics = configureSourceMetrics(sourceId);
addSource();
sourceMetrics.updateMetric(sourceId, "invalid-metric", 1);
// Verify none of the valid metrics were updated (but they were
// created since this is first time this sourceId was detected by
// the SourceMetricsImpl)
assertMetricCount(sourceId, SourceMetrics.QUERIES_TOTAL_RESULTS_SCOPE, 0);
assertMetricCount(sourceId, SourceMetrics.QUERIES_SCOPE, 0);
assertMetricCount(sourceId, SourceMetrics.EXCEPTIONS_SCOPE, 0);
}
@Test
public void testUpdateNonExistentMetricForNewSourceId() throws Exception {
String sourceId = "new-source";
String metricName = "invalid-metric";
SourceMetricsImpl sourceMetrics = configureSourceMetrics(sourceId);
sourceMetrics.updateMetric(sourceId, metricName, 1);
// Verify none of the valid metrics were updated (but they were
// created since this is first time this sourceId was detected by
// the SourceMetricsImpl)
assertMetricCount(sourceId, SourceMetrics.QUERIES_TOTAL_RESULTS_SCOPE, 0);
assertMetricCount(sourceId, SourceMetrics.QUERIES_SCOPE, 0);
assertMetricCount(sourceId, SourceMetrics.EXCEPTIONS_SCOPE, 0);
}
@Test
public void testDeleteSourceBlankSourceId() throws Exception {
String sourceId = "cp-1";
String metricName = SourceMetrics.QUERIES_SCOPE;
sourceMetrics = configureSourceMetrics(sourceId);
addSource();
// Simulate Source returning empty sourceId
when(catalogProvider.getId()).thenReturn("");
sourceMetrics.deletingSource(catalogProvider, null);
String key = sourceId + "." + metricName;
SourceMetric sourceMetric = sourceMetrics.metrics.get(key);
assertThat(sourceMetric, not(nullValue()));
sourceMetrics.deletingSource(null, null);
key = sourceId + "." + metricName;
sourceMetric = sourceMetrics.metrics.get(key);
assertThat(sourceMetric, not(nullValue()));
}
@Test
public void testGetRrdFilename() throws Exception {
String sourceId = "cp1";
String collectorName = SourceMetrics.QUERIES_TOTAL_RESULTS_SCOPE;
sourceMetrics = configureSourceMetrics(sourceId);
String rrdFilename = sourceMetrics.getRrdFilename(sourceId, collectorName);
assertThat(rrdFilename, equalTo("sourceCp1QueriesTotalResults"));
}
@Test
public void testGetRrdFilenameDashesNumbers() throws Exception {
String sourceId = "dib30rhel-58";
String collectorName = SourceMetrics.QUERIES_TOTAL_RESULTS_SCOPE;
sourceMetrics = configureSourceMetrics(sourceId);
String rrdFilename = sourceMetrics.getRrdFilename(sourceId, collectorName);
assertThat(rrdFilename, equalTo("sourceDib30rhel58QueriesTotalResults"));
}
@Test
public void testGetRrdFilenameNonAlphanumerics() throws Exception {
String sourceId = "dib30rh%^&*()$e#@!l-58";
String collectorName = SourceMetrics.QUERIES_TOTAL_RESULTS_SCOPE;
sourceMetrics = configureSourceMetrics(sourceId);
String rrdFilename = sourceMetrics.getRrdFilename(sourceId, collectorName);
assertThat(rrdFilename, equalTo("sourceDib30rhEL58QueriesTotalResults"));
}
/************************************************************************************/
private SourceMetricsImpl configureSourceMetrics(String sourceId) throws Exception {
catalogProvider = mock(CatalogProvider.class);
when(catalogProvider.getId()).thenReturn(sourceId);
fedSource = mock(FederatedSource.class);
when(fedSource.getId()).thenReturn("fs-1");
sourceMetrics = new SourceMetricsImpl();
sourceMetrics.setCatalogProviders(Collections.singletonList(catalogProvider));
sourceMetrics.setFederatedSources(Collections.singletonList(fedSource));
assertThat(sourceMetrics, not(nullValue()));
return sourceMetrics;
}
private void addSource() throws Exception {
// Do not call addingSource() because it starts createSourceMetrics()
// in a separate thread hence predictable results are not assured
// sourceMetrics.addingSource(catalogProvider, null);
sourceMetrics.createSourceMetrics(catalogProvider);
}
private void assertMetricCount(String sourceId, String metricName, int expectedCount) {
String key = sourceId + "." + metricName;
SourceMetric sourceMetric = sourceMetrics.metrics.get(key);
if (sourceMetric.isHistogram()) {
Histogram histogram = (Histogram) sourceMetric.getMetric();
assertThat(histogram.getCount(), is((long) expectedCount));
} else {
Meter meter = (Meter) sourceMetric.getMetric();
assertThat(meter.getCount(), is((long) expectedCount));
}
}
}