// This file is part of OpenTSDB.
// Copyright (C) 2016 The OpenTSDB Authors.
//
// This program 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 2.1 of the License, or (at your
// option) any later version. 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. You should have received a copy
// of the GNU Lesser General Public License along with this program. If not,
// see <http://www.gnu.org/licenses/>.
package net.opentsdb.uid;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.when;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import net.opentsdb.core.TSDB;
import net.opentsdb.uid.UniqueId.UniqueIdType;
import net.opentsdb.utils.Config;
@RunWith(PowerMockRunner.class)
//"Classloader hell"... It's real. Tell PowerMock to ignore these classes
//because they fiddle with the class loader. We don't test them anyway.
@PowerMockIgnore({"javax.management.*", "javax.xml.*",
"ch.qos.*", "org.slf4j.*", "com.sum.*", "org.xml.*"})
@PrepareForTest({ TSDB.class, Config.class })
public class TestUniqueIdWhitelistFilter {
private TSDB tsdb;
private Config config;
private UniqueIdWhitelistFilter filter;
@Before
public void before() throws Exception {
tsdb = PowerMockito.mock(TSDB.class);
config = new Config(false);
when(tsdb.getConfig()).thenReturn(config);
filter = new UniqueIdWhitelistFilter();
config.overrideConfig("tsd.uidfilter.whitelist.metric_patterns", ".*");
config.overrideConfig("tsd.uidfilter.whitelist.tagk_patterns", ".*");
config.overrideConfig("tsd.uidfilter.whitelist.tagv_patterns", ".*");
}
@Test
public void ctor() throws Exception {
assertNull(filter.metricPatterns());
assertNull(filter.tagkPatterns());
assertNull(filter.tagvPatterns());
}
@Test
public void initalize() throws Exception {
filter.initialize(tsdb);
assertEquals(1, filter.metricPatterns().size());
assertEquals(".*", filter.metricPatterns().get(0).pattern());
assertEquals(1, filter.tagkPatterns().size());
assertEquals(".*", filter.tagkPatterns().get(0).pattern());
assertEquals(1, filter.tagvPatterns().size());
assertEquals(".*", filter.tagvPatterns().get(0).pattern());
}
@Test
public void initalizeMultiplePatterns() throws Exception {
config.overrideConfig("tsd.uidfilter.whitelist.metric_patterns", ".*,^test.*");
config.overrideConfig("tsd.uidfilter.whitelist.tagk_patterns", ".*,^test.*");
config.overrideConfig("tsd.uidfilter.whitelist.tagv_patterns", ".*,^test.*");
filter.initialize(tsdb);
assertEquals(2, filter.metricPatterns().size());
assertEquals(".*", filter.metricPatterns().get(0).pattern());
assertEquals("^test.*", filter.metricPatterns().get(1).pattern());
assertEquals(2, filter.tagkPatterns().size());
assertEquals(".*", filter.tagkPatterns().get(0).pattern());
assertEquals("^test.*", filter.tagkPatterns().get(1).pattern());
assertEquals(2, filter.tagvPatterns().size());
assertEquals(".*", filter.tagvPatterns().get(0).pattern());
assertEquals("^test.*", filter.tagvPatterns().get(1).pattern());
}
@Test
public void initalizeMultiplePatternsAlternateDelimiter() throws Exception {
config.overrideConfig("tsd.uidfilter.whitelist.delimiter", "\\|");
config.overrideConfig("tsd.uidfilter.whitelist.metric_patterns", ".*|^test.*");
config.overrideConfig("tsd.uidfilter.whitelist.tagk_patterns", ".*|^test.*");
config.overrideConfig("tsd.uidfilter.whitelist.tagv_patterns", ".*|^test.*");
filter.initialize(tsdb);
assertEquals(2, filter.metricPatterns().size());
assertEquals(".*", filter.metricPatterns().get(0).pattern());
assertEquals("^test.*", filter.metricPatterns().get(1).pattern());
assertEquals(2, filter.tagkPatterns().size());
assertEquals(".*", filter.tagkPatterns().get(0).pattern());
assertEquals("^test.*", filter.tagkPatterns().get(1).pattern());
assertEquals(2, filter.tagvPatterns().size());
assertEquals(".*", filter.tagvPatterns().get(0).pattern());
assertEquals("^test.*", filter.tagvPatterns().get(1).pattern());
}
@Test (expected = IllegalArgumentException.class)
public void initalizeBadRegex() throws Exception {
config.overrideConfig("tsd.uidfilter.whitelist.metric_patterns", "grp[start");
filter.initialize(tsdb);
}
@Test
public void shutdown() throws Exception {
assertNull(filter.shutdown().join());
}
@Test
public void allowUIDAssignment() throws Exception {
config.overrideConfig("tsd.uidfilter.whitelist.metric_patterns", "^test.*");
config.overrideConfig("tsd.uidfilter.whitelist.tagk_patterns", "^test.*");
config.overrideConfig("tsd.uidfilter.whitelist.tagv_patterns", "^test.*");
filter.initialize(tsdb);
assertTrue(filter.allowUIDAssignment(UniqueIdType.METRIC, "test_metric",
null, null).join());
assertFalse(filter.allowUIDAssignment(UniqueIdType.METRIC, "metric",
null, null).join());
assertTrue(filter.allowUIDAssignment(UniqueIdType.TAGK, "test_tagk",
null, null).join());
assertFalse(filter.allowUIDAssignment(UniqueIdType.TAGK, "tagk",
null, null).join());
assertTrue(filter.allowUIDAssignment(UniqueIdType.TAGV, "test_tagv",
null, null).join());
assertFalse(filter.allowUIDAssignment(UniqueIdType.TAGV, "tagv",
null, null).join());
}
@Test
public void allowUIDAssignmentMultiplePaterns() throws Exception {
config.overrideConfig("tsd.uidfilter.whitelist.metric_patterns", ".*,^test.*");
config.overrideConfig("tsd.uidfilter.whitelist.tagk_patterns", ".*,^test.*");
config.overrideConfig("tsd.uidfilter.whitelist.tagv_patterns", ".*,^test.*");
filter.initialize(tsdb);
assertTrue(filter.allowUIDAssignment(UniqueIdType.METRIC, "test_metric",
null, null).join());
assertFalse(filter.allowUIDAssignment(UniqueIdType.METRIC, "metric",
null, null).join());
assertTrue(filter.allowUIDAssignment(UniqueIdType.TAGK, "test_tagk",
null, null).join());
assertFalse(filter.allowUIDAssignment(UniqueIdType.TAGK, "tagk",
null, null).join());
assertTrue(filter.allowUIDAssignment(UniqueIdType.TAGV, "test_tagv",
null, null).join());
assertFalse(filter.allowUIDAssignment(UniqueIdType.TAGV, "tagv",
null, null).join());
}
@Test
public void fillterUIDAssignments() throws Exception {
assertTrue(filter.fillterUIDAssignments());
}
}